<?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>AceEditor</name>
	<version>0.2.2</version>
  <mincmsversion>1.9</mincmsversion>
	<help><![CDATA[PGRpdiBzdHlsZT0iZmxvYXQ6cmlnaHQ7Ij48Zm9ybSBhY3Rpb249Imh0dHBzOi8vd3d3LnBheXBhbC5jb20vY2dpLWJpbi93ZWJzY3IiIG1ldGhvZD0icG9zdCI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY21kIiB2YWx1ZT0iX3MteGNsaWNrIiAvPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Imhvc3RlZF9idXR0b25faWQiIHZhbHVlPSJGTEgyQU44OVVQUEFHIiAvPjxpbnB1dCB0eXBlPSJpbWFnZSIgc3JjPSJodHRwczovL3d3dy5wYXlwYWxvYmplY3RzLmNvbS9lbl9HQi9pL2J0bi9idG5fZG9uYXRlX0xHLmdpZiIgYm9yZGVyPSIwIiBuYW1lPSJzdWJtaXQiIGFsdD0iUGF5UGFsIOKAlCBUaGUgc2FmZXIsIGVhc2llciB3YXkgdG8gcGF5IG9ubGluZS4iIHN0eWxlPSJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7IiAvPjxpbWcgYWx0PSIiIGJvcmRlcj0iMCIgc3JjPSJodHRwczovL3d3dy5wYXlwYWxvYmplY3RzLmNvbS9kZV9ERS9pL3Njci9waXhlbC5naWYiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC9mb3JtPjwvZGl2PjxkaXYgaWQ9InBhZ2VfdGFicyI+PGRpdiBpZD0iZ2VuZXJhbCI+QWxsZ2VtZWluPC9kaXY+PGRpdiBpZD0ic2hvcnRjdXRzIj5UYXN0YXR1cmsmdXVtbDtyemVsPC9kaXY+PGRpdiBpZD0iZnJvbnRlbmQiPkZyb250ZW5kPC9kaXY+PGRpdiBpZD0iYWJvdXQiPiZVdW1sO2JlcjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImNsZWFyYiI+PC9kaXY+PGRpdiBpZD0icGFnZV9jb250ZW50Ij48ZGl2IGlkPSJnZW5lcmFsX2MiPjxpbWcgc3R5bGU9ImZsb2F0OnJpZ2h0O21hcmdpbjowIDEwcHggMTBweCAxMHB4OyBib3JkZXI6IDVweCBzb2xpZCAjZjBmMGYwOyIgc3JjPSJodHRwOi8vbG9jYWxob3N0L21vZHVsZXMvQWNlRWRpdG9yL2ltYWdlcy9lZGl0b3IuanBnIiBhbHQ9IkVkaXRvciIgd2lkdGg9IjMxNiIgaGVpZ2h0PSIyNTkiIC8+PGgzPldoYXQgZG9lcyB0aGlzIG1vZHVsZSBkbz88L2gzPg0KPHA+QWNlRWRpdG9yIGlzIGEgU3ludGF4aGlnaGxpZ2h0ZXIgbW9kdWxlIHVzaW5nIDxzdHJvbmc+QWNlPC9zdHJvbmc+IGEgc3RhbmRhbG9uZSBjb2RlIGVkaXRvciB3cml0dGVuIGluIEphdmFTY3JpcHQuPGJyIC8+IA0KR29hbCBvZiBBY2UgY29kZSBlZGl0b3IgZ3JvdXAgaXMgdG8gY3JlYXRlIGEgd2ViIGJhc2VkIGNvZGUgZWRpdG9yIHRoYXQgbWF0Y2hlcyBhbmQgZXh0ZW5kcyB0aGUgZmVhdHVyZXMsIHVzYWJpbGl0eSBhbmQgcGVyZm9ybWFuY2Ugb2YgZXhpc3RpbmcgbmF0aXZlIGVkaXRvcnMgc3VjaCBhcyBUZXh0TWF0ZSwgVmltIG9yIEVjbGlwc2UuPGJyIC8+DQpJdCBjYW4gYmUgZWFzaWx5IGVtYmVkZGVkIGluIGFueSB3ZWIgcGFnZSBhbmQgSmF2YVNjcmlwdCBhcHBsaWNhdGlvbi48YnIgLz4gDQpBY2UgaXMgZGV2ZWxvcGVkIGFzIHRoZSBwcmltYXJ5IGVkaXRvciBmb3IgPGEgaHJlZj0iaHR0cDovL3d3dy5jbG91ZDlpZGUuY29tIj5DbG91ZDkgSURFPC9hPiBhbmQgdGhlIHN1Y2Nlc3NvciBvZiB0aGUgTW96aWxsYSBTa3l3cml0ZXIgKEJlc3BpbikgUHJvamVjdC48L3A+DQo8aDM+QWNlIGlzIGhvc3RlZCBvbiBHaXRIdWI8L2gzPg0KPHA+VGhlIEFjZSBzb3VyY2UgY29kZSBpcyBob3N0ZWQgb24gR2l0SHViLiBJdCBpcyByZWxlYXNlZCB1bmRlciB0aGUgTW96aWxsYSB0cmktbGljZW5zZSAoTVBML0dQTC9MR1BMKS48YnIgLz4NClRoaXMgaXMgdGhlIHNhbWUgbGljZW5zZSB1c2VkIGJ5IEZpcmVmb3guIFRoaXMgbGljZW5zZSBpcyBmcmllbmRseSB0byBhbGwga2luZHMgb2YgcHJvamVjdHMsIHdoZXRoZXIgb3BlbiBzb3VyY2Ugb3Igbm90LjxiciAvPg0KIFRha2UgY2hhcmdlIG9mIHlvdXIgZWRpdG9yIGFuZCBhZGQgeW91ciBmYXZvcml0ZSBsYW5ndWFnZSBoaWdobGlnaHRpbmcgYW5kIGtleWJpbmRpbmdzITwvcD4NCjxoMz5Vc2luZyBBY2VFZGl0b3IgTW9kdWxlPC9oMz4NCjxwPlVzaW5nIEFjZUVkaXRvciBNb2R1bGUgaXMgc2ltcGxlLjxiciAvPg0KQWZ0ZXIgQWNlRWRpdG9yIHdhcyBpbnN0YWxsZWQgZ28gdG8gJnF1b3Q7TXkgUHJlZmVyZW5jZXMgJnJhcXVvOyBVc2VyIFByZWZlcmVuY2VzJnF1b3Q7IGFuZCBjaG9vc2UgQWNlRWRpdG9yIGFzIHlvdXIgU3ludGF4aGlnaGxpZ2h0ZXIgb2YgY2hvaWNlIGZyb20gJnF1b3Q7U2VsZWN0IHN5bnRheCBoaWdobGlnaHRlciB0byB1c2U6JnF1b3Q7IERyb3Bkb3duLjxiciAvPg0KTWFrZSBzdXJlIHlvdSBoYXZlICYjMDM5O01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJiMwMzk7IFBlcm1zaXNzaW9uLjwvcD4NCjxoMz5TZXR0aW5nczwvaDM+DQo8cD5Zb3UgY2FuIGNoYW5nZSBkZWZhdWx0IFNldHRpbmdzIGFuZCBUaGVtZXMgaW4gJnF1b3Q7RXh0ZW5zaW9ucyAmcmFxdW87IEFjZUVkaXRvciZxdW90OzwvcD48YnIgc3R5bGUgPSJjbGVhcjpib3RoOyIgLz48L2Rpdj48ZGl2IGlkPSJzaG9ydGN1dHNfYyI+PGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4gICAgICA8aDM+RGVmYXVsdCBLZXlib2FyZCBTaG9ydGN1dHM8L2gzPg0KDQo8dGFibGUgY2xhc3M9JnF1b3Q7cGFnZXRhYmxlJnF1b3Q7IGNlbGxzcGFjaW5nPSZxdW90OzAmcXVvdDsgc3VtbWFyeT0mcXVvdDtEZWZhdWx0IEtleWJvYXJkIFNob3J0Y3V0cyZxdW90Oz4NCjx0aGVhZD48dHI+DQo8dGg+UEMgKFdpbmRvd3MvTGludXgpPC90ZD4NCjx0aD5NYWM8L3RkPg0KPHRoPmFjdGlvbjwvdGQ+DQo8L3RyPjwvdGhlYWQ+DQo8dGJvZHk+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUw8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Y2VudGVyIHNlbGVjdGlvbjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUFsdC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtT3B0aW9uLURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Y29weSBsaW5lcyBkb3duPC90ZD4NCjwvdHI+DQo8dHIgbGNhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtQWx0LVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtT3B0aW9uLVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmNvcHkgbGluZXMgdXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1GPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtRjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5maW5kPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtSzwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLUc8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+ZmluZCBuZXh0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtU2hpZnQtSzwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLVNoaWZ0LUc8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+ZmluZCBwcmV2aW91czwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkRvd24sQ3RybC1OPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIGxpbmUgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5VcDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5VcCxDdHJsLVA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gbGluZSB1cDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUVuZCxDdHJsLURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1FbmQsQ29tbWFuZC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIHRvIGVuZDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkxlZnQsQ3RybC1CPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIHRvIGxlZnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1MPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtTDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5nbyB0byBsaW5lPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkFsdC1SaWdodCxFbmQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1SaWdodCxFbmQsQ3RybC1FPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIHRvIGxpbmUgZW5kPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkFsdC1MZWZ0LEhvbWU8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1MZWZ0LEhvbWUsQ3RybC1BPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIHRvIGxpbmUgc3RhcnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+UGFnZURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+T3B0aW9uLVBhZ2VEb3duLEN0cmwtVjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5nbyB0byBwYWdlIGRvd248L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+UGFnZVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pk9wdGlvbi1QYWdlVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gdG8gcGFnZSB1cDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5SaWdodDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5SaWdodCxDdHJsLUY8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gdG8gcmlnaHQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1Ib21lLEN0cmwtVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1Ib21lLENvbW1hbmQtVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gdG8gc3RhcnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pk9wdGlvbi1MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIHRvIHdvcmQgbGVmdDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pk9wdGlvbi1SaWdodDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5nbyB0byB3b3JkIHJpZ2h0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlRhYjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5UYWI8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+aW5kZW50PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkFsdC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pk9wdGlvbi1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pm1vdmUgbGluZXMgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5BbHQtVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+T3B0aW9uLVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pm1vdmUgbGluZXMgdXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtVGFiPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LVRhYjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5vdXRkZW50PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pkluc2VydDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5JbnNlcnQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+b3ZlcndyaXRlPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5QYWdlRG93bjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5wYWdlZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz48L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+UGFnZVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnBhZ2V1cDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVNoaWZ0LVosQ3RybC1ZPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtU2hpZnQtWixDb21tYW5kLVk8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+cmVkbzwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1EPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnJlbW92ZSBsaW5lPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUs8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+cmVtb3ZlIHRvIGxpbmUgZW5kPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5PcHRpb24tQmFja3NwYWNlPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnJlbW92ZSB0byBsaW5lc3RhcnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkFsdC1CYWNrc3BhY2UsQ3RybC1BbHQtQmFja3NwYWNlPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnJlbW92ZSB3b3JkIGxlZnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkFsdC1EZWxldGU8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+cmVtb3ZlIHdvcmQgcmlnaHQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1SPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtT3B0aW9uLUY8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+cmVwbGFjZTwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVNoaWZ0LVI8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1TaGlmdC1PcHRpb24tRjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5yZXBsYWNlIGFsbDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUE8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1BPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCBhbGw8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtRG93bjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCBkb3duPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LUxlZnQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtTGVmdDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3QgbGVmdDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1FbmQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtRW5kPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCBsaW5lIGVuZDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1Ib21lPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LUhvbWU8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IGxpbmUgc3RhcnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtUGFnZURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtUGFnZURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IHBhZ2UgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1QYWdlVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtUGFnZVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCBwYWdlIHVwPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LVJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LVJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCByaWdodDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVNoaWZ0LUVuZCxBbHQtU2hpZnQtRG93bjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLVNoaWZ0LURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IHRvIGVuZDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5BbHQtU2hpZnQtUmlnaHQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1TaGlmdC1SaWdodDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3QgdG8gbGluZSBlbmQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+QWx0LVNoaWZ0LUxlZnQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1TaGlmdC1MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCB0byBsaW5lIHN0YXJ0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtU2hpZnQtSG9tZSxBbHQtU2hpZnQtVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1TaGlmdC1VcDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3QgdG8gc3RhcnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IHVwPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtU2hpZnQtTGVmdDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5PcHRpb24tU2hpZnQtTGVmdDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3Qgd29yZCBsZWZ0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtU2hpZnQtUmlnaHQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+T3B0aW9uLVNoaWZ0LVJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCB3b3JkIHJpZ2h0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLU88L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c3BsaXQgbGluZTwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLTc8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC03PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnRvZ2dsZSBjb21tZW50PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtVDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+dHJhbnNwb3NlIGxldHRlcnM8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1aPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtWjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz51bmRvPC90ZD4NCjwvdHI+DQo8L3Rib2R5Pg0KPC90YWJsZT48L2Rpdj48L2Rpdj48ZGl2IGlkPSJmcm9udGVuZF9jIj48ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPjxwPlRoaXMgTW9kdWxlIGFuZCBBY2UgU2NyaXB0IGNhbiBhbHNvIGJlIHVzZWQgYXMgYSBGcm9udGVuZCBTeW50YXhoaWdobGlnaHRlci48YnIgLz4NClRvIG1ha2UgaXQgd29yayB5b3UgaGF2ZSB0byBpbmNsdWRlIGpRdWVyeSBGcmFtZXdvcmssIGZvciBleGFtcGxlIHVzaW5nIENNU01TIHtjbXNfanF1ZXJ5fSB0YWcgYW5kIGFzIHdlbGwgaW5jbHVkZSB7QWNlRWRpdG9yfSBpbiB5b3VyIHBhZ2UgdHdpY2UuIEZpcnN0IGFkZCB0aGUgbW9kdWxlIHRhZyBpbiB5b3VyIDxoZWFkPiBzZWN0aW9uIG9mIFRlbXBsYXRlIG9yIGluICZxdW90O1BhZ2UgU3BlY2lmaWMgTWV0ZGF0YSZxdW90OyBmaWVsZCBvZiB5b3VyIENvbnRlbnQgcGFnZSwgbGlrZSB7QWNlRWRpdG9yIGFjdGlvbj0mIzAzOTtoZWFkJiMwMzk7fSBhbmQgYW5vdGhlciBjYWxsIHRvIHNwZWNpZnkgd2hpY2ggYXJlYSBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQsIGZvciBleGFtcGxlIHtBY2VFZGl0b3IgZGl2aWQ9JiMwMzk7Zm9vJiMwMzk7fSwgd2hpY2ggd291bGQgdGFyZ2V0IGEgcGFnZSBlbGVtZW50IHdpdGggaWQgPGVtPmZvbzwvZW0+LjwvcD4NCjxoMz5TbyBob3cgZG8geW91IHVzZSBpdD88L2gzPg0KPHA+Rmlyc3QgaW5jbHVkZSBqUXVlcnkgYW5kIE1vZHVsZSB0YWcgaW4geW91ciBQYWdlIDxoZWFkPiBhcmVhLCBmb3IgZXhhbXBsZSBpbiAmcXVvdDtQYWdlIFNwZWNpZmljIE1ldGRhdGEmcXVvdDs6PC9wPg0KCTxwcmU+DQoJe2Ntc19qcXVlcnl9DQoJe0FjZUVkaXRvciBhY3Rpb249JiMwMzk7aGVhZCYjMDM5O30NCgk8L3ByZT4NCjxwPlRoaXMgaW5jbHVkZXMgbmVlZGVkIHNjcmlwdHMgZm9yIEFjZSBTeW50YXhoaWdobGlnaHRlciB0byB3b3JrLjxiciAvPg0KSW4gTW9kdWxlcyBBZG1pbiBpbnRlcmZhY2UgeW91IGNhbiBzZWxlY3QgZGVmYXVsdCBzZXR0aW5ncyBmb3IgeW91ciAmIzAzOTtoZWFkJiMwMzk7IGFjdGlvbiBvciB1c2UgcGFyYW1ldGVyIG1vZGVzPSYjMDM5O2h0bWwsamF2YXNjcmlwdCYjMDM5OyBhbmQgdGhlbWVzPSYjMDM5O3RleHRtYXRlJiMwMzk7IHdoaWNoIHdvdWxkIG92ZXJyaWRlIHNlbGVjdGVkIFByZWZlcmVuY2VzLjwvcD4NCjxwPk5vdyB3aGVuIHlvdSBoYXZlIG5lZWRlZCBzY3JpcHRzIGluY2x1ZGVkLCBvbmUgbW9yZSBNb2R1bGUgdGFnIGNhbGwgaXMgbmVlZGVkIChmb3IgZXhhbXBsZSBpbiB5b3VyIENvbnRlbnQgRWRpdG9yIGFyZWEpIHRvIHNwZWNpZnkgd2hpY2ggYXJlYSBvZiB5b3VyIFBhZ2Ugc2hvdWxkIGJlIGhpZ2hsaWdodGVkLjwvcD4NCgk8cHJlPg0KCXtBY2VFZGl0b3IgZGl2aWQ9JiMwMzk7c29tZS1pZCYjMDM5O30NCgk8L3ByZT4NCjxwPlRoaXMgdGFnIGluY2x1ZGVzIG5lZWRlZCBTY3JpcHQgYW5kIFN0eWxlIHRoYXQgaXMgdXNlZCB0byBIaWdobGlnaHQgc2VsZWN0ZWQgZWxlbWVudCB3aXRoIHNwZWNpZmllZCBpZC48YnIgLz4NCkFsbCB5b3UgbmVlZCB0aGVuIGlzIHdyaXRlIHlvdXIgQ29kZSB0aGF0IHlvdSB3YW50IHRvIEhpZ2hsaWdodCBhbmQgd3JhcCBpdCBpbnNpZGUgYW4gZWxlbWVuIGxpa2UgPGRpdj4gd2l0aCBzcGVjaWZpZWQgaWQuPC9wPjxwcmU+Jmx0O3ByZSBpZD0mYW1wO3F1b3Q7c29tZS1pZCZhbXA7cXVvdDsmZ3Q7DQombHQ7aHRtbCZndDsNCiAmYW1wO25ic3A7ICZhbXA7bmJzcDsgJmx0O2hlYWQmZ3Q7DQogJmFtcDtuYnNwOyAmYW1wO25ic3A7ICZsdDtzdHlsZSB0eXBlPSZhbXA7cXVvdDt0ZXh0L2NzcyZhbXA7cXVvdDsmZ3Q7DQogJmFtcDtuYnNwOyAmYW1wO25ic3A7ICZhbXA7bmJzcDsgJmFtcDtuYnNwOyAudGV4dC1sYXllciB7DQogJmFtcDtuYnNwOyAmYW1wO25ic3A7ICZhbXA7bmJzcDsgJmFtcDtuYnNwOyAmYW1wO25ic3A7ICZhbXA7bmJzcDsgZm9udC1mYW1pbHk6IE1vbmFjbywgJmFtcDtxdW90O0NvdXJpZXIgTmV3JmFtcDtxdW90OywgbW9ub3NwYWNlOw0KICZhbXA7bmJzcDsgJmFtcDtuYnNwOyAmYW1wO25ic3A7ICZhbXA7bmJzcDsgJmFtcDtuYnNwOyAmYW1wO25ic3A7IGZvbnQtc2l6ZTogMTJweDsNCiAmYW1wO25ic3A7ICZhbXA7bmJzcDsgJmFtcDtuYnNwOyAmYW1wO25ic3A7ICZhbXA7bmJzcDsgJmFtcDtuYnNwOyBjdXJzb3I6IHRleHQ7DQogJmFtcDtuYnNwOyAmYW1wO25ic3A7ICZhbXA7bmJzcDsgJmFtcDtuYnNwOyB9DQogJmFtcDtuYnNwOyAmYW1wO25ic3A7ICZsdDsvc3R5bGUmZ3Q7DQogJmFtcDtuYnNwOyAmYW1wO25ic3A7ICZsdDsvaGVhZCZndDsNCiAmYW1wO25ic3A7ICZhbXA7bmJzcDsgJmx0O2JvZHkmZ3Q7DQogJmFtcDtuYnNwOyAmYW1wO25ic3A7ICZhbXA7bmJzcDsgJmFtcDtuYnNwOyAmbHQ7aDEgc3R5bGU9JmFtcDtxdW90O2NvbG9yOnJlZCZhbXA7cXVvdDsmZ3Q7SnVodSBLaW5uZXJzJmx0Oy9oMSZndDsNCiAmYW1wO25ic3A7ICZhbXA7bmJzcDsgJmx0Oy9ib2R5Jmd0OyAmbHQ7L2h0bWwmZ3Q7DQombHQ7L3ByZSZndDsNCiZsdDsvcHJlJmd0OzwvcHJlPjwvZGl2PjwvZGl2PjxkaXYgaWQ9ImFib3V0X2MiPjxoMz5TdXBwb3J0PC9oMz4NCjxwPkFzIHBlciB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGFzLWlzLiBQbGVhc2UgcmVhZCB0aGUgdGV4dCBvZiB0aGUgbGljZW5zZSBmb3IgdGhlIGZ1bGwgZGlzY2xhaW1lci48L3A+DQo8aDM+Q29weXJpZ2h0IGFuZCBMaWNlbnNlPC9oMz4NCjxwPkNvcHlyaWdodCAmY29weTsgMjAxMiwgR29yYW4gSWxpYyA8YSBocmVmPSJtYWlsdG86dW5pcXUzZUBnbWFpbC5jb20iPjx1bmlxdTNlQGdtYWlsLmNvbT48L2E+IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNoLW1hY2gtZGFzLmF0IiByZWw9ImV4dGVybmFsIj53d3cuaWNoLW1hY2gtZGFzLmF0PC9hPi4gQWxsIFJpZ2h0cyBBcmUgUmVzZXJ2ZWQuPC9wPg0KPHA+VGhpcyBtb2R1bGUgaGFzIGJlZW4gcmVsZWFzZWQgdW5kZXIgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCI+R05VIFB1YmxpYyBMaWNlbnNlPC9hPi4gWW91IG11c3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlIGJlZm9yZSB1c2luZyB0aGUgbW9kdWxlLjwvcD4NCgk8aDM+VGVhbTwvaDM+DQoJPHVsPg0KCQk8bGk+R29yYW4gSWxpYyAodW5pcXUzKSBnLmlsaWNAaS1hcnRzLmV1IDxiciAvPnd3dy5pY2gtbWFjaC1kYXMuYXQ8L2xpPgkNCgkJPGxpPlJvYmVydCBDYW1wYmVsbCAoY2FsZ3V5MTAwMCkgY2FsZ3V5MTAwMEBjbXNtYWRlc2ltcGxlLm9yZyAgPGJyIC8+d3d3LmNhbGd1eTEwMDAuY29tPC9saT4JCQ0KCQk8bGk+Sm9uYXRoYW4gU2NobWlkIChGb2FseSopIGhpQGpvbmF0aGFuc2NobWlkLmRlIDxiciAvPnd3dy5qb25hdGhhbnNjaG1pZC5kZTwvbGk+DQoJPC91bD4NCjwvZGl2PjwvZGl2PjxoMz5QYXJhbWV0ZXI8L2gzPjx1bD48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBsYW5nPSJlbl9VUyIgLSBEaWVzZXIgUGFyYW1ldGVyIGxlZ3QgZGllIFNwcmFjaGUgZmVzdCwgZGllIHZvbSBNb2R1bCBmJnV1bWw7ciBkaWUgQXVzZ2FiZSBhdWYgZGVyIFdlYnNlaXRlIHZlcndlbmRldCB3aXJkLiBEaWVzIHdpcmQgamVkb2NoIG5pY2h0IHZvbiBhbGxlbiBNb2R1bGVuIHVudGVyc3QmdXVtbDt0enQgYnp3LiBiZW4mb3VtbDt0aWd0LjwvbGk+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gYWN0aW9uPSJkZWZhdWx0IiAtIHdpcmQgdmVyd2VuZGV0LCB1bSBkaWUgQWt0aW9uIGRlcyBNb2R1bCB0YWdzIHp1IGJlc3RpbW1lbi4gTSZvdW1sO2dsaWNoZSB3ZXJ0ZSBzaW5kICYjMDM5O2RlZmF1bHQmIzAzOTsgdW5kICYjMDM5O2hlYWQmIzAzOTsuIEYmdXVtbDtyIGRpZSBrb3JyZWt0ZSBGcm9udGVuZCBTeW50YXhoaWdobGlnaHRpbmcgRnVua3Rpb24gc2luZCBiZWlkZSBha3Rpb25lbiBub3R3ZW5kaWdiZW4mb3VtbDt0aWd0LiA8YnIgLz5NJm91bWw7Z2xpY2hlIHdlcnRlIHNpbmQ6DQo8dWw+DQoJPGxpPmhlYWQ8L2xpPg0KCTxsaT5kZWZhdWx0PC9saT4NCjwvdWw+PC9saT48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBtb2Rlcz0iaHRtbCIgLSB3aXJkIG1pdCA8Y29kZT57QWNlRWRpdG9yIGFjdGlvbj0mIzAzOTtoZWFkJiMwMzk7fTwvY29kZT4gdmVyd2VuZGV0LiBTaWUgayZvdW1sO25uZW4gbWVocmVyZSBkdXJjaCBLb21tYSBnZXRyZW5udGUgJiMwMzk7bW9kZXMmIzAzOTssIGRpZSBTaWUgYXVmIElocmVyIFdlYnNpdGUgdmVyd2VuZGVuIHdlcmRlbiwgYW5nZWJlbi4gRGllcyBzb2xsdGUgaW0gJmFtcDtndDtoZWFkJmFtcDtsdDsgYmVyZWljaCBkZXMgVGVtcGxhdGVzIG9kZXIgdW50ZXIgU2VpdGVuc3BlemlmaXNjaGUtTWV0YWRhdGVuIGVpbmdlZ2ViZW4gd2VyZGVuLiBEaWVzICZ1dW1sO2JlcnNjaHJlaWJ0IElocmUgRWluc3RlbGx1bmdlbiBkaWUgaW0gTW9kdWwgQWRtaW4tQmVyZWljaCBhdXNnZXcmYXVtbDtobHQgd3VyZGVuLiA8YnIgLz5NJm91bWw7Z2xpY2hlIHdlcnRlIHNpbmQ6DQo8dWw+DQoJPGxpPmphdmFzY3JpcHQ8L2xpPiANCgk8bGk+cGxhaW48L2xpPiANCgk8bGk+c3ZnPC9saT4gDQoJPGxpPmh0bWw8L2xpPg0KCTxsaT5jc3M8L2xpPg0KCTxsaT5zY3NzPC9saT4NCgk8bGk+Y29mZmVlPC9saT4NCgk8bGk+anNvbjwvbGk+DQoJPGxpPnB5dGhvbjwvbGk+DQoJPGxpPnJ1Ynk8L2xpPg0KCTxsaT5wZXJsPC9saT4NCgk8bGk+cGhwPC9saT4NCgk8bGk+amF2YTwvbGk+DQoJPGxpPmNzaGFycDwvbGk+DQoJPGxpPmNfY3BwPC9saT4NCgk8bGk+Y2xvanVyZTwvbGk+DQoJPGxpPm9jYW1sPC9saT4NCgk8bGk+dGV4dGlsZTwvbGk+DQoJPGxpPmdyb292eTwvbGk+DQoJPGxpPnNjYWxhPC9saT4NCjwvdWw+PC9saT48bGk+PGVtPihvcHRpb25hbCk8L2VtPiB0aGVtZXM9InRleHRtYXRlIiAtIHdpcmQgbWl0IDxjb2RlPntBY2VFZGl0b3IgYWN0aW9uPSYjMDM5O2hlYWQmIzAzOTt9PC9jb2RlPiB2ZXJ3ZW5kZXQuIFNpZSBrJm91bWw7bm5lbiBtZWhyZXJlIGR1cmNoIEtvbW1hIGdldHJlbm50ZSAmIzAzOTt0aGVtZXMmIzAzOTsgKFRlbXBsYXRlcyksIGRpZSBTaWUgYXVmIElocmVyIFdlYnNpdGUgdmVyd2VuZGVuIHdlcmRlbiwgYW5nZWJlbi4gRGllcyBzb2xsdGUgaW0gJmFtcDtndDtoZWFkJmFtcDtsdDsgYmVyZWljaCBkZXMgVGVtcGxhdGVzIG9kZXIgdW50ZXIgU2VpdGVuc3BlemlmaXNjaGUtTWV0YWRhdGVuIGVpbmdlZ2ViZW4gd2VyZGVuLiBEaWVzICZ1dW1sO2JlcnNjaHJlaWJ0IElocmUgRWluc3RlbGx1bmdlbiBkaWUgaW0gTW9kdWwgQWRtaW4tQmVyZWljaCBhdXNnZXcmYXVtbDtobHQgd3VyZGVuLiA8YnIgLz5NJm91bWw7Z2xpY2hlIHdlcnRlIHNpbmQ6DQo8dWw+DQoJPGxpPmNsb3VkczwvbGk+IA0KCTxsaT5jbG91ZHNfbWlkbmlnaHQ8L2xpPiANCgk8bGk+Y29iYWx0PC9saT4gDQoJPGxpPmNyaW1zb25fZWRpdG9yPC9saT4NCgk8bGk+ZGF3bjwvbGk+DQoJPGxpPmVjbGlwc2U8L2xpPg0KCTxsaT5pZGxlX2ZpbmdlcnM8L2xpPg0KCTxsaT5rcl90aGVtZTwvbGk+DQoJPGxpPm1lcmJpdm9yZTwvbGk+DQoJPGxpPm1lcmJpdm9yZV9zb2Z0PC9saT4NCgk8bGk+bW9ub19pbmR1c3RyaWFsPC9saT4NCgk8bGk+bW9ub2thaTwvbGk+DQoJPGxpPnBhc3RlbF9vbl9kYXJrPC9saT4NCgk8bGk+c29sYXJpemVkX2Rhcms8L2xpPg0KCTxsaT5zb2xhcml6ZWRfbGlnaHQ8L2xpPg0KCTxsaT50ZXh0bWF0ZTwvbGk+DQoJPGxpPnR3aWxpZ2h0PC9saT4NCgk8bGk+dmlicmFudF9pbms8L2xpPg0KPC91bD48L2xpPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IG1vZGU9Imh0bWwiIC0gd2lyZCBpbm5lcmhhbGIgZWluZXIgU2VpdGUgbWl0IDxjb2RlPntBY2VFZGl0b3IgYWN0aW9uID0gJiMwMzk7ZGVmYXVsdCYjMDM5O308LyBjb2RlPiBNb2R1bC1UYWcgdmVyd2VuZGV0LiBEYW1pdCB3aXJkIFN5bnRheEhpZ2hsaWdodGVyIE1vZHVzIGYmdXVtbDtyIGFrdHVlbGxlbiBDb2RlLUJlcmVpY2ggZmVzdGdlbGVndC4gPGJyIC8+IE0mb3VtbDtnbGljaGUgV2VydGUgc2luZDoNCjx1bD4NCgk8bGk+amF2YXNjcmlwdDwvbGk+IA0KCTxsaT5wbGFpbjwvbGk+IA0KCTxsaT5zdmc8L2xpPiANCgk8bGk+aHRtbDwvbGk+DQoJPGxpPmNzczwvbGk+DQoJPGxpPnNjc3M8L2xpPg0KCTxsaT5jb2ZmZWU8L2xpPg0KCTxsaT5qc29uPC9saT4NCgk8bGk+cHl0aG9uPC9saT4NCgk8bGk+cnVieTwvbGk+DQoJPGxpPnBlcmw8L2xpPg0KCTxsaT5waHA8L2xpPg0KCTxsaT5qYXZhPC9saT4NCgk8bGk+Y3NoYXJwPC9saT4NCgk8bGk+Y19jcHA8L2xpPg0KCTxsaT5jbG9qdXJlPC9saT4NCgk8bGk+b2NhbWw8L2xpPg0KCTxsaT50ZXh0aWxlPC9saT4NCgk8bGk+Z3Jvb3Z5PC9saT4NCgk8bGk+c2NhbGE8L2xpPg0KPC91bD48L2xpPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IHRoZW1lPSJ0ZXh0bWF0ZSIgLSB3aXJkIGlubmVyaGFsYiBlaW5lciBTZWl0ZSBtaXQgPGNvZGU+e0FjZUVkaXRvciBhY3Rpb24gPSAmIzAzOTtkZWZhdWx0JiMwMzk7fTwvIGNvZGU+IE1vZHVsLVRhZyB2ZXJ3ZW5kZXQuIERhbWl0IHdpcmQgU3ludGF4SGlnaGxpZ2h0ZXIgVGVtcGxhdGUgZiZ1dW1sO3IgYWt0dWVsbGVuIENvZGUtQmVyZWljaCBmZXN0Z2VsZWd0LiA8YnIgLz4gTSZvdW1sO2dsaWNoZSBXZXJ0ZSBzaW5kOg0KPHVsPg0KCTxsaT5jbG91ZHM8L2xpPiANCgk8bGk+Y2xvdWRzX21pZG5pZ2h0PC9saT4gDQoJPGxpPmNvYmFsdDwvbGk+IA0KCTxsaT5jcmltc29uX2VkaXRvcjwvbGk+DQoJPGxpPmRhd248L2xpPg0KCTxsaT5lY2xpcHNlPC9saT4NCgk8bGk+aWRsZV9maW5nZXJzPC9saT4NCgk8bGk+a3JfdGhlbWU8L2xpPg0KCTxsaT5tZXJiaXZvcmU8L2xpPg0KCTxsaT5tZXJiaXZvcmVfc29mdDwvbGk+DQoJPGxpPm1vbm9faW5kdXN0cmlhbDwvbGk+DQoJPGxpPm1vbm9rYWk8L2xpPg0KCTxsaT5wYXN0ZWxfb25fZGFyazwvbGk+DQoJPGxpPnNvbGFyaXplZF9kYXJrPC9saT4NCgk8bGk+c29sYXJpemVkX2xpZ2h0PC9saT4NCgk8bGk+dGV4dG1hdGU8L2xpPg0KCTxsaT50d2lsaWdodDwvbGk+DQoJPGxpPnZpYnJhbnRfaW5rPC9saT4NCjwvdWw+PC9saT48bGk+PGVtPihvcHRpb25hbCk8L2VtPiB3aWR0aD0iNDAwIiAtIGJlc3RpbW10IGRpZSBCcmVpdGUgZGVzIFN5bnRheGhpZ2hsaWdodGVyIEJlcmVpY2hzIGluIFBpeGVsLjwvbGk+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gaGVpZ2h0PSI0MDAiIC0gYmVzdGltbXQgZGllIEgmb3VtbDtoZSBkZXMgU3ludGF4aGlnaGxpZ2h0ZXIgQmVyZWljaHMgaW4gUGl4ZWwuPC9saT48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBkaXZpZD0iZWRpdG9yIiAtIGlkIGRlcyBFbGVtZW50cyBtaXQgSWhyZW0gQ29kZS4gVmVyd2VuZGVuIFNpZSBlaW5kZXV0aWdlIElEIGYmdXVtbDtyIGplZGVuIENvZGUgc25pcHBldC48L2xpPjwvdWw+]]></help>
	<about><![CDATA[PGJyIC8+QXV0b3I6IEdvcmFuIElsaWMgJmx0O3VuaXF1M2VAZ21haWwuY29tJmd0OzxiciAvPjxiciAvPlZlcnNpb24gOiAwLjIuMjxiciAvPjxiciAvPiZBdW1sO25kZXJ1bmdzdmVybGF1Zjo8YnIgLz48aDM+VmVyc2lvbiAwLjE8L2gzPg0KPHVsPg0KCTxsaT5JdCYjMDM5O3MgZnJlc2ghIE5vdGhpbmcgY2hhbmdlZCB5ZXQhPC9saT4NCgk8bGk+VXNpbmcgQWNlIFZlcnNpb24gMC4yLjA8L2xpPg0KPC91bD4NCjxoMz5WZXJzaW9uIDAuMjwvaDM+DQo8dWw+DQoJPGxpPkFkZGVkIENUUkwtUyBLZXliaW5kaW5nPC9saT4NCgk8bGk+QWRkZWQgRnVsbHNjcmVlbm1vZGU8L2xpPg0KCTxsaT5BZGRlZCBGcm9udGVuZCBIaWdobGlnaHRpbmc8L2xpPg0KCTxsaT5VcGRhdGVkIEFjZTwvbGk+DQo8L3VsPg0KPGgzPlZlcnNpb24gMC4yLjE8L2gzPg0KPHVsPg0KCTxsaT5BZGRlZCBJbnRlcm5ldCBFeHBsb3JlciBwcmVmZXJlbmNlPC9saT4NCgk8bGk+VXBkYXRlZCBBQ0Ugd2l0aCB0aGVtZXM8L2xpPg0KPC91bD4NCjxoMz5Sb2FkbWFwPC9oMz4NCjx1bD4NCgk8bGk+PGRlbD5BZGQgRnJvbnRlbmQgU3ludGF4aGlnaGxpZ2h0aW5nPC9kZWw+PC9saT4NCgk8bGk+PGRlbD5BZGQgRnVsbHNjcmVlbm1vZGU8L2RlbD48L2xpPg0KCTxsaT48ZGVsPkFkZCBLZXliaW5kaW5nIChDVFJMK1MpPC9kZWw+PC9saT4NCgk8bGk+QWRkIEVkaXRvciBiZWhhdmlvciAoVmltLCBFTWFjcyk8L2xpPg0KCTxsaT5NYXliZSBhZGQgVG9vbGJhcjwvbGk+DQo8L3VsPjxiciAvPg==]]></about>
	<description><![CDATA[AceEditor ist ein Syntaxhighlighter Modul das <strong>Ace</strong>,  einen eigenst&auml;ndigen Code-Editor geschrieben mit JavaScript  verwendet.<br /><strong>Hinweis:</strong> Internet Explorer wird zurzeit nicht unterst&uuml;zt!]]></description>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/.DS_Store</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[AAAAAUJ1ZDEAABAAAAAIAAAAEAAAAAAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAgLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAACAAAAABAAAAQAAAAAEAAACAAAAAAQAAAQAAAAABAAACAAAAAAEAAAQAAAAAAAAAAAEAABAAAAAAAQAAIAAAAAABAABAAAAAAAEAAIAAAAAAAQABAAAAAAABAAIAAAAAAAEABAAAAAAAAQAIAAAAAAABABAAAAAAAAEAIAAAAAAAAQBAAAAAAAABAIAAAAAAAAEBAAAAAAAAAQIAAAAAAAABBAAAAAAAAAEIAAAAAAAAARAAAAAAAAABIAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAEAsAAABFAAAAJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBERTREIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAYAAAAAAAAAABAAAAgAAAAAEAAAEAAAAAAQAAAgAAAAABAAAEAAAAAAIAAAgAAAAYAAAAAAAAAAABAAAgAAAAAAEAAEAAAAAAAQAAgAAAAAABAAEAAAAAAAEAAgAAAAAAAQAEAAAAAAABAAgAAAAAAAEAEAAAAAAAAQAgAAAAAAABAEAAAAAAAAEAgAAAAAAAAQEAAAAAAAABAgAAAAAAAAEEAAAAAAAAAQgAAAAAAAABEAAAAAAAAAEgAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==]]></data>
	</file>
	<file>
	  <filename>/ace/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/ace/ChangeLog.txt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[MjAxMS4wOC4wMiwgVmVyc2lvbiAwLjIuMAoKKiBTcGxpdCB2aWV3IChKdWxpYW4gVmllcmVjaykKICAtIHNwbGl0IGVkaXRvciBhcmVhIGhvcml6b250YWxseSBvciB2ZXJ0aXZhbGx5IHRvIHNob3cgdHdvIGZpbGVzIGF0IHRoZSBzYW1lCiAgICB0aW1lCgoqIENvZGUgRm9sZGluZyAoSnVsaWFuIFZpZXJlY2spCiAgLSBVbnN0cnVjdHVyZWQgY29kZSBmb2xkaW5nCiAgLSBXaWxsIGJlIHRoZSBiYXNpcyBmb3IgbGFuZ3VhZ2UgYXdhcmUgZm9sZGluZwoKKiBNb2RlIGJlaGF2aW91cnMgKENocmlzIFNwZW5jZXIpCiAgLSBBZGRzIG1vZGUgc3BlY2lmaWMgaG9va3Mgd2hpY2ggYWxsb3cgdHJhbnNmb3JtYXRpb25zIG9mIGVudGVyZWQgdGV4dAogIC0gQXV0b2Nsb3Npbmcgb2YgYnJhY2VzLCBwYXJhbnRoZXNpcyBhbmQgcXVvdGF0aW9uIG1hcmtzIGluIEMgc3R5bGUgbW9kZXMKICAtIEF1dG9jbG9zaW5nIG9mIGFuZ3VsYXIgYnJhY2tldHMgaW4gWE1MIHN0eWxlIG1vZGVzCgoqIE5ldyBsYW5ndWFnZSBtb2RlcwogIC0gQ2xvanVyZSAoQ2FyaW4gTWVpZXIpCiAgLSBDIyAoUm9iIENvbmVyeSkKICAtIEdyb292eSAoQmVuIFRpbGZvcmQpCiAgLSBTY2FsYSAoQmVuIFRpbGZvcmQpCiAgLSBKU09OCiAgLSBPQ2FtbCAoU2VyZ2kgTWFuc2lsbGEpCiAgLSBQZXJsIChQYW5hZ2lvdGlzIEFzdGl0aGFzKQogIC0gU0NTUy9TQVNTIChBbmRyZWFzIE1hZHNlbikKICAtIFNWRwogIC0gVGV4dGlsZSAoS2VsbGV5IHZhbiBFdmVydCkKICAtIFNDQUQgKEphY29iIEhhbnNzb24pCiAgCiogTGl2ZSBzeW50YXggY2hlY2tzCiAgLSBMaW50IGZvciBDc3MgdXNpbmcgQ1NTIExpbnQgPGh0dHA6Ly9jc3NsaW50Lm5ldC8+CiAgLSBDb2ZmZWVTY3JpcHQKCiogTmV3IFRoZW1lcwogIC0gQ3JpbXNvbiBFZGl0b3IgKGllYnVnZ3kpCiAgLSBNZXJiaXZvcmUgKE1pY2hhZWwgU2Nod2FydHopCiAgLSBNZXJiaXZvcmUgc29mdCAoTWljaGFlbCBTY2h3YXJ0eikKICAtIFNvbGFyaXplZCBkYXJrL2xpZ2h0IDxodHRwOi8vZXRoYW5zY2hvb25vdmVyLmNvbS9zb2xhcml6ZWQ+IChEYXZpZCBBbGFuCiAgICBIamVsbGUpCiAgLSBWaWJyYW50IEluayAoTWljaGFlbCBTY2h3YXJ0eikKCiogU21hbGwgRmVhdHVyZXMvRW5oYW5jZW1lbnRzCiAgLSBMb3RzIG9mIHJlbmRlciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zIChIYXJ1dHl1biBBbWlyamFueWFuKQogIC0gSW1wcm92ZWQgUnVieSBoaWdobGlnaHRpbmcgKENocmlzIFdhbnN0cmF0aCwgVHJlbnQgT2dyZW4pCiAgLSBJbXByb3ZlZCBQSFAgaGlnaGxpZ2h0aW5nIChUaG9tYXMgSHJ1c2thKQogIC0gSW1wcm92ZWQgQ1NTIGhpZ2hsaWdodGluZyAoU2VhbiBLZWxsb2dnKQogIC0gQ2xpY2tzIHdoaWNoIGNhdXNlIHRoZSBlZGl0b3IgdG8gYmUgZm9jdXNlZCBkb24ndCByZXNldCB0aGUgc2VsZWN0aW9uCiAgLSBNYWtlIHBhZGRpbmcgdGV4dCBsYXllciBzcGVjaWZpYyBzbyB0aGF0IHByaW50IG1hcmdpbiBhbmQgYWN0aXZlIGxpbmUKICAgIGhpZ2hsaWdodCBhcmUgbm90IGFmZmVjdGVkIChJcmFrbGkgR296YWxpc2h2aWxpKQogIC0gQWRkZWQgc2V0Rm9udFNpemUgbWV0aG9kCiAgLSBJbXByb3ZlZCB2aSBrZXliaW5kaW5ncyAoVHJlbnQgT2dyZW4pCiAgLSBXaGVuIHVuZm9jdXNlZCBtYWtlIGN1cnNvciB0cmFuc3BhcmVudCBpbnN0ZWFkIG9mIHJlbW92aW5nIGl0IChIYXJ1dHl1bgogICAgQW1pcmphbnlhbikKICAtIFN1cHBvcnQgZm9yIG1hdGNoaW5nIGdyb3VwcyBpbiB0b2tlbml6ZXIgd2l0aCBhcnJheXMgb2YgdG9rZW5zIChDaHJpcwogICAgU3BlbmNlcikKCiogQnVnIGZpeGVzCiAgLSBBZGQgc3VwcG9ydCBmb3IgdGhlIG5ldyBPU1ggc2Nyb2xsIGJhcnMKICAtIFByb3Blcmx5IGhpZ2hsaWdodCBKYXZhU2NyaXB0IHJlZ2V4cCBsaXRlcmFscwogIC0gUHJvcGVyIGhhbmRsaW5nIG9mIHVuaWNvZGUgY2hhcmFjdGVycyBpbiBKYXZhU2NyaXB0IGlkZW50aWZpZXJzCiAgLSBGaXggcmVtb3ZlIGxpbmVzIGNvbW1hbmQgb24gbGFzdCBsaW5lIChIYXJ1dHl1biBBbWlyamFueWFuKQogIC0gRml4IHNjcm9sbCB3aGVlbCBzbHVnZ2lzaG5lc3MgaW4gU2FmYXJpCiAgLSBNYWtlIGtleWJvYXJkIGluZnJhc3RydWN0dXJlIHJvdXRlIGtleXMgbGlrZSBbXV4kIHRoZSByaWdodCB3YXkgKEp1bGlhbgogICAgVmllcmVjaykKCjIwMTEuMDIuMTQsIFZlcnNpb24gMC4xLjYKCiogRmxvYXRpbmcgQW5jaG9ycwogIC0gQW4gQW5jaG9yIGlzIGEgZmxvYXRpbmcgcG9pbnRlciBpbiB0aGUgZG9jdW1lbnQuIAogIC0gV2hlbmV2ZXIgdGV4dCBpcyBpbnNlcnRlZCBvciBkZWxldGVkIGJlZm9yZSB0aGUgY3Vyc29yLCB0aGUgcG9zaXRpb24gb2YKICAgIHRoZSBjdXJzb3IgaXMgdXBkYXRlZAogIC0gVXNlc2QgZm9yIHRoZSBjdXJzb3IgYW5kIHNlbGVjdGlvbgogIC0gQmFzaXMgZm9yIGJvb2ttYXJrcywgbXVsdGlwbGUgY3Vyc29ycyBhbmQgc25pcHBldHMgaW4gdGhlIGZ1dHVyZQoqIEV4dGVuc2l2ZSBzdXBwb3J0IGZvciBDb2NvYSBzdHlsZSBrZXliaW5kaW5ncyBvbiB0aGUgTWFjIDxodHRwczovL2dpdGh1Yi5jb20vYWpheG9yZy9hY2UvaXNzdWVzL2Nsb3NlZCNpc3N1ZS8xMTYvY29tbWVudC83Njc4MDM+CiogTmV3IGNvbW1hbmRzOgogIC0gY2VudGVyIHNlbGVjdGlvbiBpbiB2aWV3cG9ydAogIC0gcmVtb3ZlIHRvIGVuZC9zdGFydCBvZiBsaW5lCiAgLSBzcGxpdCBsaW5lCiAgLSB0cmFuc3Bvc2UgbGV0dGVycwoqIFJlZmF0b3IgbWFya2VycyAgCiAgLSBDdXN0b20gY29kZSBjYW4gYmUgdXNlZCB0byByZW5kZXIgbWFya2VycwogIC0gTWFya2VycyBjYW4gYmUgaW4gZnJvbnQgb3IgYmVoaW5kIHRoZSB0ZXh0CiAgLSBNYXJrZXJzIGFyZSBub3cgc3RvcmVkIGluIHRoZSBzZXNzaW9uICh3YXMgaW4gdGhlIHJlbmRlcmVyKQoqIExvdHMgb2YgSUU4IGZpeGVzIGluY2x1ZGluZyBjb3B5LCBjdXQgYW5kIHNlbGVjdGlvbnMKKiBVbml0IHRlc3RzIGNhbiBhbHNvIGJlIHJ1biBpbiB0aGUgYnJvd3NlcgogIDxodHRwczovL2dpdGh1Yi5jb20vYWpheG9yZy9hY2UvYmxvYi9tYXN0ZXIvbGliL2FjZS90ZXN0L3Rlc3RzLmh0bWw+CiogU29mdCB3cmFwIGNhbiBhZGFwdCB0byB0aGUgd2lkdGggb2YgdGhlIGVkaXRvciAoTWlrZSBSYXRjbGlmZmUsIEpvZSBDaGVuZykKKiBBZGQgbWluaW1hbCBub2RlIHNlcnZlciBzZXJ2ZXIuanMgdG8gcnVuIHRoZSBBY2UgZGVtbyBpbiBDaHJvbWUKKiBUaGUgdG9wIGxldmVsIGVkaXRvci5odG1sIGRlbW8gaGFzIGJlZW4gcmVuYW1lZCB0byBpbmRleC5odG1sCiogQnVnIGZpeGVzCiAgLSBGaXhlZCBnb3RvTGluZSB0byBjb25zaWRlciB3cmFwcGVkIGxpbmVzIHdoZW4gY2FsY3VsYXRpbmcgd2hlcmUgdG8gc2Nyb2xsIHRvIChKYW1lcyBBbGxlbikKICAtIEZpeGVkIGlzdWVzIHdoZW4gdGhlIGVkaXRvciB3YXMgc2Nyb2xsZWQgaW4gdGhlIHdlYiBwYWdlIChFcmljIEFsbGFtKQogIC0gSGlnaGxpZ2h0aW5nIG9mIFB5dGhvbiBzdHJpbmcgbGl0ZXJhbHMKICAtIFN5bnRheCBydWxlIGZvciBQSFAgY29tbWVudHMKCjIwMTEuMDIuMDgsIFZlcnNpb24gMC4xLjUKCiogQWRkIENvZmZlZXNjcmlwdCBNb2RlIChTYXRvc2hpIE11cmFrYW1pKQoqIEZpeCB3b3JkIHdyYXAgYnVnIChKdWxpYW4gVmllcmVjaykKKiBGaXggcGFja2FnZWQgdmVyc2lvbiBvZiB0aGUgRWNsaXBzZSBtb2RlCiogTG9hZGluZyBvZiB3b3JrZXJzIGlzIG1vcmUgcm9idXN0CiogRml4ICJjbGljayBzZWxlY3Rpb24iCiogQWxsb3cgdG9raXppbmcgZW1wdHkgbGluZXMgKERhbmllbCBLcmVjaCkKKiBNYWtlIFBhZ2VVcC9Eb3duIGJlaGF2aW9yIG1vcmUgY29uc2lzdGVudCB3aXRoIG5hdGl2ZSBPUyAoSm9lIENoZW5nKQoKMjAxMS4wMi4wNCwgVmVyc2lvbiAwLjEuNAoKKiBBZGQgQy9DKysgbW9kZSBjb250cmlidXRlZCBieSBHYXN0w7NuIEtsZWltYW4KKiBGaXggZXhjZXB0aW9uIGluIGtleSBpbnB1dAoKMjAxMS4wMi4wNCwgVmVyc2lvbiAwLjEuMwoKKiBMZXQgdGhlIHBhY2thZ2VkIHZlcnNpb24gcGxheSBuaWNlIHdpdGggcmVxdWlyZUpTCiogQWRkIFJ1YnkgbW9kZSBjb250cmlidXRlZCBieSBTaGxvbW8gWmFsbWFuIEhlaWdoCiogQWRkIEphdmEgbW9kZSBjb250cmlidXRlZCBieSBUb20gVGFzY2hlCiogRml4IGFubm90YXRpb24gYnVnCiogQ2hhbmdpbmcgYSBkb2N1bWVudCBhZGRlZCBhIG5ldyBlbXB0eSBsaW5lIGF0IHRoZSBlbmQ=]]></data>
	</file>
	<file>
	  <filename>/ace/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[TGljZW5zZWQgdW5kZXIgdGhlIHRyaS1saWNlbnNlIE1QTC9MR1BML0dQTC4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgTU9aSUxMQSBQVUJMSUMgTElDRU5TRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMS4xCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0KCjEuIERlZmluaXRpb25zLgoKICAgICAxLjAuMS4gIkNvbW1lcmNpYWwgVXNlIiBtZWFucyBkaXN0cmlidXRpb24gb3Igb3RoZXJ3aXNlIG1ha2luZyB0aGUKICAgICBDb3ZlcmVkIENvZGUgYXZhaWxhYmxlIHRvIGEgdGhpcmQgcGFydHkuCgogICAgIDEuMS4gIkNvbnRyaWJ1dG9yIiBtZWFucyBlYWNoIGVudGl0eSB0aGF0IGNyZWF0ZXMgb3IgY29udHJpYnV0ZXMgdG8KICAgICB0aGUgY3JlYXRpb24gb2YgTW9kaWZpY2F0aW9ucy4KCiAgICAgMS4yLiAiQ29udHJpYnV0b3IgVmVyc2lvbiIgbWVhbnMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbAogICAgIENvZGUsIHByaW9yIE1vZGlmaWNhdGlvbnMgdXNlZCBieSBhIENvbnRyaWJ1dG9yLCBhbmQgdGhlIE1vZGlmaWNhdGlvbnMKICAgICBtYWRlIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4KCiAgICAgMS4zLiAiQ292ZXJlZCBDb2RlIiBtZWFucyB0aGUgT3JpZ2luYWwgQ29kZSBvciBNb2RpZmljYXRpb25zIG9yIHRoZQogICAgIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGFuZCBNb2RpZmljYXRpb25zLCBpbiBlYWNoIGNhc2UKICAgICBpbmNsdWRpbmcgcG9ydGlvbnMgdGhlcmVvZi4KCiAgICAgMS40LiAiRWxlY3Ryb25pYyBEaXN0cmlidXRpb24gTWVjaGFuaXNtIiBtZWFucyBhIG1lY2hhbmlzbSBnZW5lcmFsbHkKICAgICBhY2NlcHRlZCBpbiB0aGUgc29mdHdhcmUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5IGZvciB0aGUgZWxlY3Ryb25pYwogICAgIHRyYW5zZmVyIG9mIGRhdGEuCgogICAgIDEuNS4gIkV4ZWN1dGFibGUiIG1lYW5zIENvdmVyZWQgQ29kZSBpbiBhbnkgZm9ybSBvdGhlciB0aGFuIFNvdXJjZQogICAgIENvZGUuCgogICAgIDEuNi4gIkluaXRpYWwgRGV2ZWxvcGVyIiBtZWFucyB0aGUgaW5kaXZpZHVhbCBvciBlbnRpdHkgaWRlbnRpZmllZAogICAgIGFzIHRoZSBJbml0aWFsIERldmVsb3BlciBpbiB0aGUgU291cmNlIENvZGUgbm90aWNlIHJlcXVpcmVkIGJ5IEV4aGliaXQKICAgICBBLgoKICAgICAxLjcuICJMYXJnZXIgV29yayIgbWVhbnMgYSB3b3JrIHdoaWNoIGNvbWJpbmVzIENvdmVyZWQgQ29kZSBvcgogICAgIHBvcnRpb25zIHRoZXJlb2Ygd2l0aCBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgoKICAgICAxLjguICJMaWNlbnNlIiBtZWFucyB0aGlzIGRvY3VtZW50LgoKICAgICAxLjguMS4gIkxpY2Vuc2FibGUiIG1lYW5zIGhhdmluZyB0aGUgcmlnaHQgdG8gZ3JhbnQsIHRvIHRoZSBtYXhpbXVtCiAgICAgZXh0ZW50IHBvc3NpYmxlLCB3aGV0aGVyIGF0IHRoZSB0aW1lIG9mIHRoZSBpbml0aWFsIGdyYW50IG9yCiAgICAgc3Vic2VxdWVudGx5IGFjcXVpcmVkLCBhbnkgYW5kIGFsbCBvZiB0aGUgcmlnaHRzIGNvbnZleWVkIGhlcmVpbi4KCiAgICAgMS45LiAiTW9kaWZpY2F0aW9ucyIgbWVhbnMgYW55IGFkZGl0aW9uIHRvIG9yIGRlbGV0aW9uIGZyb20gdGhlCiAgICAgc3Vic3RhbmNlIG9yIHN0cnVjdHVyZSBvZiBlaXRoZXIgdGhlIE9yaWdpbmFsIENvZGUgb3IgYW55IHByZXZpb3VzCiAgICAgTW9kaWZpY2F0aW9ucy4gV2hlbiBDb3ZlcmVkIENvZGUgaXMgcmVsZWFzZWQgYXMgYSBzZXJpZXMgb2YgZmlsZXMsIGEKICAgICBNb2RpZmljYXRpb24gaXM6CiAgICAgICAgICBBLiBBbnkgYWRkaXRpb24gdG8gb3IgZGVsZXRpb24gZnJvbSB0aGUgY29udGVudHMgb2YgYSBmaWxlCiAgICAgICAgICBjb250YWluaW5nIE9yaWdpbmFsIENvZGUgb3IgcHJldmlvdXMgTW9kaWZpY2F0aW9ucy4KCiAgICAgICAgICBCLiBBbnkgbmV3IGZpbGUgdGhhdCBjb250YWlucyBhbnkgcGFydCBvZiB0aGUgT3JpZ2luYWwgQ29kZSBvcgogICAgICAgICAgcHJldmlvdXMgTW9kaWZpY2F0aW9ucy4KCiAgICAgMS4xMC4gIk9yaWdpbmFsIENvZGUiIG1lYW5zIFNvdXJjZSBDb2RlIG9mIGNvbXB1dGVyIHNvZnR3YXJlIGNvZGUKICAgICB3aGljaCBpcyBkZXNjcmliZWQgaW4gdGhlIFNvdXJjZSBDb2RlIG5vdGljZSByZXF1aXJlZCBieSBFeGhpYml0IEEgYXMKICAgICBPcmlnaW5hbCBDb2RlLCBhbmQgd2hpY2gsIGF0IHRoZSB0aW1lIG9mIGl0cyByZWxlYXNlIHVuZGVyIHRoaXMKICAgICBMaWNlbnNlIGlzIG5vdCBhbHJlYWR5IENvdmVyZWQgQ29kZSBnb3Zlcm5lZCBieSB0aGlzIExpY2Vuc2UuCgogICAgIDEuMTAuMS4gIlBhdGVudCBDbGFpbXMiIG1lYW5zIGFueSBwYXRlbnQgY2xhaW0ocyksIG5vdyBvd25lZCBvcgogICAgIGhlcmVhZnRlciBhY3F1aXJlZCwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiwgIG1ldGhvZCwgcHJvY2VzcywKICAgICBhbmQgYXBwYXJhdHVzIGNsYWltcywgaW4gYW55IHBhdGVudCBMaWNlbnNhYmxlIGJ5IGdyYW50b3IuCgogICAgIDEuMTEuICJTb3VyY2UgQ29kZSIgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSBDb3ZlcmVkIENvZGUgZm9yCiAgICAgbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQsIGluY2x1ZGluZyBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cwogICAgIGFueSBhc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBzY3JpcHRzIHVzZWQgdG8gY29udHJvbAogICAgIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgYW4gRXhlY3V0YWJsZSwgb3Igc291cmNlIGNvZGUKICAgICBkaWZmZXJlbnRpYWwgY29tcGFyaXNvbnMgYWdhaW5zdCBlaXRoZXIgdGhlIE9yaWdpbmFsIENvZGUgb3IgYW5vdGhlcgogICAgIHdlbGwga25vd24sIGF2YWlsYWJsZSBDb3ZlcmVkIENvZGUgb2YgdGhlIENvbnRyaWJ1dG9yJ3MgY2hvaWNlLiBUaGUKICAgICBTb3VyY2UgQ29kZSBjYW4gYmUgaW4gYSBjb21wcmVzc2VkIG9yIGFyY2hpdmFsIGZvcm0sIHByb3ZpZGVkIHRoZQogICAgIGFwcHJvcHJpYXRlIGRlY29tcHJlc3Npb24gb3IgZGUtYXJjaGl2aW5nIHNvZnR3YXJlIGlzIHdpZGVseSBhdmFpbGFibGUKICAgICBmb3Igbm8gY2hhcmdlLgoKICAgICAxLjEyLiAiWW91IiAob3IgIllvdXIiKSAgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBhIGxlZ2FsIGVudGl0eQogICAgIGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyLCBhbmQgY29tcGx5aW5nIHdpdGggYWxsIG9mIHRoZSB0ZXJtcyBvZiwgdGhpcwogICAgIExpY2Vuc2Ugb3IgYSBmdXR1cmUgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXNzdWVkIHVuZGVyIFNlY3Rpb24gNi4xLgogICAgIEZvciBsZWdhbCBlbnRpdGllcywgIllvdSIgaW5jbHVkZXMgYW55IGVudGl0eSB3aGljaCBjb250cm9scywgaXMKICAgICBjb250cm9sbGVkIGJ5LCBvciBpcyB1bmRlciBjb21tb24gY29udHJvbCB3aXRoIFlvdS4gRm9yIHB1cnBvc2VzIG9mCiAgICAgdGhpcyBkZWZpbml0aW9uLCAiY29udHJvbCIgbWVhbnMgKGEpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LAogICAgIHRvIGNhdXNlIHRoZSBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieQogICAgIGNvbnRyYWN0IG9yIG90aGVyd2lzZSwgb3IgKGIpIG93bmVyc2hpcCBvZiBtb3JlIHRoYW4gZmlmdHkgcGVyY2VudAogICAgICg1MCUpIG9mIHRoZSBvdXRzdGFuZGluZyBzaGFyZXMgb3IgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaAogICAgIGVudGl0eS4KCjIuIFNvdXJjZSBDb2RlIExpY2Vuc2UuCgogICAgIDIuMS4gVGhlIEluaXRpYWwgRGV2ZWxvcGVyIEdyYW50LgogICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwKICAgICBub24tZXhjbHVzaXZlIGxpY2Vuc2UsIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5CiAgICAgY2xhaW1zOgogICAgICAgICAgKGEpICB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuIHBhdGVudCBvcgogICAgICAgICAgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IEluaXRpYWwgRGV2ZWxvcGVyIHRvIHVzZSwgcmVwcm9kdWNlLAogICAgICAgICAgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLCBzdWJsaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBPcmlnaW5hbAogICAgICAgICAgQ29kZSAob3IgcG9ydGlvbnMgdGhlcmVvZikgd2l0aCBvciB3aXRob3V0IE1vZGlmaWNhdGlvbnMsIGFuZC9vcgogICAgICAgICAgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQKCiAgICAgICAgICAoYikgdW5kZXIgUGF0ZW50cyBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsIHVzaW5nIG9yCiAgICAgICAgICBzZWxsaW5nIG9mIE9yaWdpbmFsIENvZGUsIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBwcmFjdGljZSwKICAgICAgICAgIHNlbGwsIGFuZCBvZmZlciBmb3Igc2FsZSwgYW5kL29yIG90aGVyd2lzZSBkaXNwb3NlIG9mIHRoZQogICAgICAgICAgT3JpZ2luYWwgQ29kZSAob3IgcG9ydGlvbnMgdGhlcmVvZikuCgogICAgICAgICAgKGMpIHRoZSBsaWNlbnNlcyBncmFudGVkIGluIHRoaXMgU2VjdGlvbiAyLjEoYSkgYW5kIChiKSBhcmUKICAgICAgICAgIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBJbml0aWFsIERldmVsb3BlciBmaXJzdCBkaXN0cmlidXRlcwogICAgICAgICAgT3JpZ2luYWwgQ29kZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgoKICAgICAgICAgIChkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjEoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzCiAgICAgICAgICBncmFudGVkOiAxKSBmb3IgY29kZSB0aGF0IFlvdSBkZWxldGUgZnJvbSB0aGUgT3JpZ2luYWwgQ29kZTsgMikKICAgICAgICAgIHNlcGFyYXRlIGZyb20gdGhlIE9yaWdpbmFsIENvZGU7ICBvciAzKSBmb3IgaW5mcmluZ2VtZW50cyBjYXVzZWQKICAgICAgICAgIGJ5OiBpKSB0aGUgbW9kaWZpY2F0aW9uIG9mIHRoZSBPcmlnaW5hbCBDb2RlIG9yIGlpKSB0aGUKICAgICAgICAgIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbCBDb2RlIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgZGV2aWNlcy4KCiAgICAgMi4yLiBDb250cmlidXRvciBHcmFudC4KICAgICBTdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBjbGFpbXMsIGVhY2ggQ29udHJpYnV0b3IKICAgICBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlCgogICAgICAgICAgKGEpICB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuIHBhdGVudCBvcgogICAgICAgICAgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IENvbnRyaWJ1dG9yLCB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LAogICAgICAgICAgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgTW9kaWZpY2F0aW9ucwogICAgICAgICAgY3JlYXRlZCBieSBzdWNoIENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucyB0aGVyZW9mKSBlaXRoZXIgb24gYW4KICAgICAgICAgIHVubW9kaWZpZWQgYmFzaXMsIHdpdGggb3RoZXIgTW9kaWZpY2F0aW9ucywgYXMgQ292ZXJlZCBDb2RlCiAgICAgICAgICBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQKCiAgICAgICAgICAoYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywgdXNpbmcsIG9yCiAgICAgICAgICBzZWxsaW5nIG9mICBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciBlaXRoZXIgYWxvbmUKICAgICAgICAgIGFuZC9vciBpbiBjb21iaW5hdGlvbiB3aXRoIGl0cyBDb250cmlidXRvciBWZXJzaW9uIChvciBwb3J0aW9ucwogICAgICAgICAgb2Ygc3VjaCBjb21iaW5hdGlvbiksIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgZm9yIHNhbGUsIGhhdmUKICAgICAgICAgIG1hZGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZjogMSkgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQKICAgICAgICAgIENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucyB0aGVyZW9mKTsgYW5kIDIpIHRoZSBjb21iaW5hdGlvbiBvZgogICAgICAgICAgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3Igd2l0aCBpdHMgQ29udHJpYnV0b3IKICAgICAgICAgIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2ggY29tYmluYXRpb24pLgoKICAgICAgICAgIChjKSB0aGUgbGljZW5zZXMgZ3JhbnRlZCBpbiBTZWN0aW9ucyAyLjIoYSkgYW5kIDIuMihiKSBhcmUKICAgICAgICAgIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBDb250cmlidXRvciBmaXJzdCBtYWtlcyBDb21tZXJjaWFsIFVzZSBvZgogICAgICAgICAgdGhlIENvdmVyZWQgQ29kZS4KCiAgICAgICAgICAoZCkgICAgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb24gMi4yKGIpIGFib3ZlLCBubyBwYXRlbnQgbGljZW5zZSBpcwogICAgICAgICAgZ3JhbnRlZDogMSkgZm9yIGFueSBjb2RlIHRoYXQgQ29udHJpYnV0b3IgaGFzIGRlbGV0ZWQgZnJvbSB0aGUKICAgICAgICAgIENvbnRyaWJ1dG9yIFZlcnNpb247IDIpICBzZXBhcmF0ZSBmcm9tIHRoZSBDb250cmlidXRvciBWZXJzaW9uOwogICAgICAgICAgMykgIGZvciBpbmZyaW5nZW1lbnRzIGNhdXNlZCBieTogaSkgdGhpcmQgcGFydHkgbW9kaWZpY2F0aW9ucyBvZgogICAgICAgICAgQ29udHJpYnV0b3IgVmVyc2lvbiBvciBpaSkgIHRoZSBjb21iaW5hdGlvbiBvZiBNb2RpZmljYXRpb25zIG1hZGUKICAgICAgICAgIGJ5IHRoYXQgQ29udHJpYnV0b3Igd2l0aCBvdGhlciBzb2Z0d2FyZSAgKGV4Y2VwdCBhcyBwYXJ0IG9mIHRoZQogICAgICAgICAgQ29udHJpYnV0b3IgVmVyc2lvbikgb3Igb3RoZXIgZGV2aWNlczsgb3IgNCkgdW5kZXIgUGF0ZW50IENsYWltcwogICAgICAgICAgaW5mcmluZ2VkIGJ5IENvdmVyZWQgQ29kZSBpbiB0aGUgYWJzZW5jZSBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkKICAgICAgICAgIHRoYXQgQ29udHJpYnV0b3IuCgozLiBEaXN0cmlidXRpb24gT2JsaWdhdGlvbnMuCgogICAgIDMuMS4gQXBwbGljYXRpb24gb2YgTGljZW5zZS4KICAgICBUaGUgTW9kaWZpY2F0aW9ucyB3aGljaCBZb3UgY3JlYXRlIG9yIHRvIHdoaWNoIFlvdSBjb250cmlidXRlIGFyZQogICAgIGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KICAgICBTZWN0aW9uIDIuMi4gVGhlIFNvdXJjZSBDb2RlIHZlcnNpb24gb2YgQ292ZXJlZCBDb2RlIG1heSBiZQogICAgIGRpc3RyaWJ1dGVkIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBvciBhIGZ1dHVyZSB2ZXJzaW9uCiAgICAgb2YgdGhpcyBMaWNlbnNlIHJlbGVhc2VkIHVuZGVyIFNlY3Rpb24gNi4xLCBhbmQgWW91IG11c3QgaW5jbHVkZSBhCiAgICAgY29weSBvZiB0aGlzIExpY2Vuc2Ugd2l0aCBldmVyeSBjb3B5IG9mIHRoZSBTb3VyY2UgQ29kZSBZb3UKICAgICBkaXN0cmlidXRlLiBZb3UgbWF5IG5vdCBvZmZlciBvciBpbXBvc2UgYW55IHRlcm1zIG9uIGFueSBTb3VyY2UgQ29kZQogICAgIHZlcnNpb24gdGhhdCBhbHRlcnMgb3IgcmVzdHJpY3RzIHRoZSBhcHBsaWNhYmxlIHZlcnNpb24gb2YgdGhpcwogICAgIExpY2Vuc2Ugb3IgdGhlIHJlY2lwaWVudHMnIHJpZ2h0cyBoZXJldW5kZXIuIEhvd2V2ZXIsIFlvdSBtYXkgaW5jbHVkZQogICAgIGFuIGFkZGl0aW9uYWwgZG9jdW1lbnQgb2ZmZXJpbmcgdGhlIGFkZGl0aW9uYWwgcmlnaHRzIGRlc2NyaWJlZCBpbgogICAgIFNlY3Rpb24gMy41LgoKICAgICAzLjIuIEF2YWlsYWJpbGl0eSBvZiBTb3VyY2UgQ29kZS4KICAgICBBbnkgTW9kaWZpY2F0aW9uIHdoaWNoIFlvdSBjcmVhdGUgb3IgdG8gd2hpY2ggWW91IGNvbnRyaWJ1dGUgbXVzdCBiZQogICAgIG1hZGUgYXZhaWxhYmxlIGluIFNvdXJjZSBDb2RlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZQogICAgIGVpdGhlciBvbiB0aGUgc2FtZSBtZWRpYSBhcyBhbiBFeGVjdXRhYmxlIHZlcnNpb24gb3IgdmlhIGFuIGFjY2VwdGVkCiAgICAgRWxlY3Ryb25pYyBEaXN0cmlidXRpb24gTWVjaGFuaXNtIHRvIGFueW9uZSB0byB3aG9tIHlvdSBtYWRlIGFuCiAgICAgRXhlY3V0YWJsZSB2ZXJzaW9uIGF2YWlsYWJsZTsgYW5kIGlmIG1hZGUgYXZhaWxhYmxlIHZpYSBFbGVjdHJvbmljCiAgICAgRGlzdHJpYnV0aW9uIE1lY2hhbmlzbSwgbXVzdCByZW1haW4gYXZhaWxhYmxlIGZvciBhdCBsZWFzdCB0d2VsdmUgKDEyKQogICAgIG1vbnRocyBhZnRlciB0aGUgZGF0ZSBpdCBpbml0aWFsbHkgYmVjYW1lIGF2YWlsYWJsZSwgb3IgYXQgbGVhc3Qgc2l4CiAgICAgKDYpIG1vbnRocyBhZnRlciBhIHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGF0IHBhcnRpY3VsYXIgTW9kaWZpY2F0aW9uCiAgICAgaGFzIGJlZW4gbWFkZSBhdmFpbGFibGUgdG8gc3VjaCByZWNpcGllbnRzLiBZb3UgYXJlIHJlc3BvbnNpYmxlIGZvcgogICAgIGVuc3VyaW5nIHRoYXQgdGhlIFNvdXJjZSBDb2RlIHZlcnNpb24gcmVtYWlucyBhdmFpbGFibGUgZXZlbiBpZiB0aGUKICAgICBFbGVjdHJvbmljIERpc3RyaWJ1dGlvbiBNZWNoYW5pc20gaXMgbWFpbnRhaW5lZCBieSBhIHRoaXJkIHBhcnR5LgoKICAgICAzLjMuIERlc2NyaXB0aW9uIG9mIE1vZGlmaWNhdGlvbnMuCiAgICAgWW91IG11c3QgY2F1c2UgYWxsIENvdmVyZWQgQ29kZSB0byB3aGljaCBZb3UgY29udHJpYnV0ZSB0byBjb250YWluIGEKICAgICBmaWxlIGRvY3VtZW50aW5nIHRoZSBjaGFuZ2VzIFlvdSBtYWRlIHRvIGNyZWF0ZSB0aGF0IENvdmVyZWQgQ29kZSBhbmQKICAgICB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBZb3UgbXVzdCBpbmNsdWRlIGEgcHJvbWluZW50IHN0YXRlbWVudCB0aGF0CiAgICAgdGhlIE1vZGlmaWNhdGlvbiBpcyBkZXJpdmVkLCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LCBmcm9tIE9yaWdpbmFsCiAgICAgQ29kZSBwcm92aWRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGluY2x1ZGluZyB0aGUgbmFtZSBvZiB0aGUKICAgICBJbml0aWFsIERldmVsb3BlciBpbiAoYSkgdGhlIFNvdXJjZSBDb2RlLCBhbmQgKGIpIGluIGFueSBub3RpY2UgaW4gYW4KICAgICBFeGVjdXRhYmxlIHZlcnNpb24gb3IgcmVsYXRlZCBkb2N1bWVudGF0aW9uIGluIHdoaWNoIFlvdSBkZXNjcmliZSB0aGUKICAgICBvcmlnaW4gb3Igb3duZXJzaGlwIG9mIHRoZSBDb3ZlcmVkIENvZGUuCgogICAgIDMuNC4gSW50ZWxsZWN0dWFsIFByb3BlcnR5IE1hdHRlcnMKICAgICAgICAgIChhKSBUaGlyZCBQYXJ0eSBDbGFpbXMuCiAgICAgICAgICBJZiBDb250cmlidXRvciBoYXMga25vd2xlZGdlIHRoYXQgYSBsaWNlbnNlIHVuZGVyIGEgdGhpcmQgcGFydHkncwogICAgICAgICAgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBpcyByZXF1aXJlZCB0byBleGVyY2lzZSB0aGUgcmlnaHRzCiAgICAgICAgICBncmFudGVkIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdW5kZXIgU2VjdGlvbnMgMi4xIG9yIDIuMiwKICAgICAgICAgIENvbnRyaWJ1dG9yIG11c3QgaW5jbHVkZSBhIHRleHQgZmlsZSB3aXRoIHRoZSBTb3VyY2UgQ29kZQogICAgICAgICAgZGlzdHJpYnV0aW9uIHRpdGxlZCAiTEVHQUwiIHdoaWNoIGRlc2NyaWJlcyB0aGUgY2xhaW0gYW5kIHRoZQogICAgICAgICAgcGFydHkgbWFraW5nIHRoZSBjbGFpbSBpbiBzdWZmaWNpZW50IGRldGFpbCB0aGF0IGEgcmVjaXBpZW50IHdpbGwKICAgICAgICAgIGtub3cgd2hvbSB0byBjb250YWN0LiBJZiBDb250cmlidXRvciBvYnRhaW5zIHN1Y2gga25vd2xlZGdlIGFmdGVyCiAgICAgICAgICB0aGUgTW9kaWZpY2F0aW9uIGlzIG1hZGUgYXZhaWxhYmxlIGFzIGRlc2NyaWJlZCBpbiBTZWN0aW9uIDMuMiwKICAgICAgICAgIENvbnRyaWJ1dG9yIHNoYWxsIHByb21wdGx5IG1vZGlmeSB0aGUgTEVHQUwgZmlsZSBpbiBhbGwgY29waWVzCiAgICAgICAgICBDb250cmlidXRvciBtYWtlcyBhdmFpbGFibGUgdGhlcmVhZnRlciBhbmQgc2hhbGwgdGFrZSBvdGhlciBzdGVwcwogICAgICAgICAgKHN1Y2ggYXMgbm90aWZ5aW5nIGFwcHJvcHJpYXRlIG1haWxpbmcgbGlzdHMgb3IgbmV3c2dyb3VwcykKICAgICAgICAgIHJlYXNvbmFibHkgY2FsY3VsYXRlZCB0byBpbmZvcm0gdGhvc2Ugd2hvIHJlY2VpdmVkIHRoZSBDb3ZlcmVkCiAgICAgICAgICBDb2RlIHRoYXQgbmV3IGtub3dsZWRnZSBoYXMgYmVlbiBvYnRhaW5lZC4KCiAgICAgICAgICAoYikgQ29udHJpYnV0b3IgQVBJcy4KICAgICAgICAgIElmIENvbnRyaWJ1dG9yJ3MgTW9kaWZpY2F0aW9ucyBpbmNsdWRlIGFuIGFwcGxpY2F0aW9uIHByb2dyYW1taW5nCiAgICAgICAgICBpbnRlcmZhY2UgYW5kIENvbnRyaWJ1dG9yIGhhcyBrbm93bGVkZ2Ugb2YgcGF0ZW50IGxpY2Vuc2VzIHdoaWNoCiAgICAgICAgICBhcmUgcmVhc29uYWJseSBuZWNlc3NhcnkgdG8gaW1wbGVtZW50IHRoYXQgQVBJLCBDb250cmlidXRvciBtdXN0CiAgICAgICAgICBhbHNvIGluY2x1ZGUgdGhpcyBpbmZvcm1hdGlvbiBpbiB0aGUgTEVHQUwgZmlsZS4KCiAgICAgICAgICAgICAgIChjKSAgICBSZXByZXNlbnRhdGlvbnMuCiAgICAgICAgICBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQsIGV4Y2VwdCBhcyBkaXNjbG9zZWQgcHVyc3VhbnQgdG8KICAgICAgICAgIFNlY3Rpb24gMy40KGEpIGFib3ZlLCBDb250cmlidXRvciBiZWxpZXZlcyB0aGF0IENvbnRyaWJ1dG9yJ3MKICAgICAgICAgIE1vZGlmaWNhdGlvbnMgYXJlIENvbnRyaWJ1dG9yJ3Mgb3JpZ2luYWwgY3JlYXRpb24ocykgYW5kL29yCiAgICAgICAgICBDb250cmlidXRvciBoYXMgc3VmZmljaWVudCByaWdodHMgdG8gZ3JhbnQgdGhlIHJpZ2h0cyBjb252ZXllZCBieQogICAgICAgICAgdGhpcyBMaWNlbnNlLgoKICAgICAzLjUuIFJlcXVpcmVkIE5vdGljZXMuCiAgICAgWW91IG11c3QgZHVwbGljYXRlIHRoZSBub3RpY2UgaW4gRXhoaWJpdCBBIGluIGVhY2ggZmlsZSBvZiB0aGUgU291cmNlCiAgICAgQ29kZS4gIElmIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBwdXQgc3VjaCBub3RpY2UgaW4gYSBwYXJ0aWN1bGFyIFNvdXJjZQogICAgIENvZGUgZmlsZSBkdWUgdG8gaXRzIHN0cnVjdHVyZSwgdGhlbiBZb3UgbXVzdCBpbmNsdWRlIHN1Y2ggbm90aWNlIGluIGEKICAgICBsb2NhdGlvbiAoc3VjaCBhcyBhIHJlbGV2YW50IGRpcmVjdG9yeSkgd2hlcmUgYSB1c2VyIHdvdWxkIGJlIGxpa2VseQogICAgIHRvIGxvb2sgZm9yIHN1Y2ggYSBub3RpY2UuICBJZiBZb3UgY3JlYXRlZCBvbmUgb3IgbW9yZSBNb2RpZmljYXRpb24ocykKICAgICBZb3UgbWF5IGFkZCB5b3VyIG5hbWUgYXMgYSBDb250cmlidXRvciB0byB0aGUgbm90aWNlIGRlc2NyaWJlZCBpbgogICAgIEV4aGliaXQgQS4gIFlvdSBtdXN0IGFsc28gZHVwbGljYXRlIHRoaXMgTGljZW5zZSBpbiBhbnkgZG9jdW1lbnRhdGlvbgogICAgIGZvciB0aGUgU291cmNlIENvZGUgd2hlcmUgWW91IGRlc2NyaWJlIHJlY2lwaWVudHMnIHJpZ2h0cyBvciBvd25lcnNoaXAKICAgICByaWdodHMgcmVsYXRpbmcgdG8gQ292ZXJlZCBDb2RlLiAgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsIGFuZCB0bwogICAgIGNoYXJnZSBhIGZlZSBmb3IsIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5CiAgICAgb2JsaWdhdGlvbnMgdG8gb25lIG9yIG1vcmUgcmVjaXBpZW50cyBvZiBDb3ZlcmVkIENvZGUuIEhvd2V2ZXIsIFlvdQogICAgIG1heSBkbyBzbyBvbmx5IG9uIFlvdXIgb3duIGJlaGFsZiwgYW5kIG5vdCBvbiBiZWhhbGYgb2YgdGhlIEluaXRpYWwKICAgICBEZXZlbG9wZXIgb3IgYW55IENvbnRyaWJ1dG9yLiBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhbgogICAgIGFueSBzdWNoIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IG9ibGlnYXRpb24gaXMKICAgICBvZmZlcmVkIGJ5IFlvdSBhbG9uZSwgYW5kIFlvdSBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZSBJbml0aWFsCiAgICAgRGV2ZWxvcGVyIGFuZCBldmVyeSBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZCBieSB0aGUKICAgICBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mIHdhcnJhbnR5LAogICAgIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgdGVybXMgWW91IG9mZmVyLgoKICAgICAzLjYuIERpc3RyaWJ1dGlvbiBvZiBFeGVjdXRhYmxlIFZlcnNpb25zLgogICAgIFlvdSBtYXkgZGlzdHJpYnV0ZSBDb3ZlcmVkIENvZGUgaW4gRXhlY3V0YWJsZSBmb3JtIG9ubHkgaWYgdGhlCiAgICAgcmVxdWlyZW1lbnRzIG9mIFNlY3Rpb24gMy4xLTMuNSBoYXZlIGJlZW4gbWV0IGZvciB0aGF0IENvdmVyZWQgQ29kZSwKICAgICBhbmQgaWYgWW91IGluY2x1ZGUgYSBub3RpY2Ugc3RhdGluZyB0aGF0IHRoZSBTb3VyY2UgQ29kZSB2ZXJzaW9uIG9mCiAgICAgdGhlIENvdmVyZWQgQ29kZSBpcyBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwKICAgICBpbmNsdWRpbmcgYSBkZXNjcmlwdGlvbiBvZiBob3cgYW5kIHdoZXJlIFlvdSBoYXZlIGZ1bGZpbGxlZCB0aGUKICAgICBvYmxpZ2F0aW9ucyBvZiBTZWN0aW9uIDMuMi4gVGhlIG5vdGljZSBtdXN0IGJlIGNvbnNwaWN1b3VzbHkgaW5jbHVkZWQKICAgICBpbiBhbnkgbm90aWNlIGluIGFuIEV4ZWN1dGFibGUgdmVyc2lvbiwgcmVsYXRlZCBkb2N1bWVudGF0aW9uIG9yCiAgICAgY29sbGF0ZXJhbCBpbiB3aGljaCBZb3UgZGVzY3JpYmUgcmVjaXBpZW50cycgcmlnaHRzIHJlbGF0aW5nIHRvIHRoZQogICAgIENvdmVyZWQgQ29kZS4gWW91IG1heSBkaXN0cmlidXRlIHRoZSBFeGVjdXRhYmxlIHZlcnNpb24gb2YgQ292ZXJlZAogICAgIENvZGUgb3Igb3duZXJzaGlwIHJpZ2h0cyB1bmRlciBhIGxpY2Vuc2Ugb2YgWW91ciBjaG9pY2UsIHdoaWNoIG1heQogICAgIGNvbnRhaW4gdGVybXMgZGlmZmVyZW50IGZyb20gdGhpcyBMaWNlbnNlLCBwcm92aWRlZCB0aGF0IFlvdSBhcmUgaW4KICAgICBjb21wbGlhbmNlIHdpdGggdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBhbmQgdGhhdCB0aGUgbGljZW5zZSBmb3IgdGhlCiAgICAgRXhlY3V0YWJsZSB2ZXJzaW9uIGRvZXMgbm90IGF0dGVtcHQgdG8gbGltaXQgb3IgYWx0ZXIgdGhlIHJlY2lwaWVudCdzCiAgICAgcmlnaHRzIGluIHRoZSBTb3VyY2UgQ29kZSB2ZXJzaW9uIGZyb20gdGhlIHJpZ2h0cyBzZXQgZm9ydGggaW4gdGhpcwogICAgIExpY2Vuc2UuIElmIFlvdSBkaXN0cmlidXRlIHRoZSBFeGVjdXRhYmxlIHZlcnNpb24gdW5kZXIgYSBkaWZmZXJlbnQKICAgICBsaWNlbnNlIFlvdSBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGF0IGFueSB0ZXJtcyB3aGljaCBkaWZmZXIKICAgICBmcm9tIHRoaXMgTGljZW5zZSBhcmUgb2ZmZXJlZCBieSBZb3UgYWxvbmUsIG5vdCBieSB0aGUgSW5pdGlhbAogICAgIERldmVsb3BlciBvciBhbnkgQ29udHJpYnV0b3IuIFlvdSBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZQogICAgIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBldmVyeSBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZCBieQogICAgIHRoZSBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mIGFueSBzdWNoCiAgICAgdGVybXMgWW91IG9mZmVyLgoKICAgICAzLjcuIExhcmdlciBXb3Jrcy4KICAgICBZb3UgbWF5IGNyZWF0ZSBhIExhcmdlciBXb3JrIGJ5IGNvbWJpbmluZyBDb3ZlcmVkIENvZGUgd2l0aCBvdGhlciBjb2RlCiAgICAgbm90IGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIExhcmdlcgogICAgIFdvcmsgYXMgYSBzaW5nbGUgcHJvZHVjdC4gSW4gc3VjaCBhIGNhc2UsIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGUKICAgICByZXF1aXJlbWVudHMgb2YgdGhpcyBMaWNlbnNlIGFyZSBmdWxmaWxsZWQgZm9yIHRoZSBDb3ZlcmVkIENvZGUuCgo0LiBJbmFiaWxpdHkgdG8gQ29tcGx5IER1ZSB0byBTdGF0dXRlIG9yIFJlZ3VsYXRpb24uCgogICAgIElmIGl0IGlzIGltcG9zc2libGUgZm9yIFlvdSB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIHRlcm1zIG9mIHRoaXMKICAgICBMaWNlbnNlIHdpdGggcmVzcGVjdCB0byBzb21lIG9yIGFsbCBvZiB0aGUgQ292ZXJlZCBDb2RlIGR1ZSB0bwogICAgIHN0YXR1dGUsIGp1ZGljaWFsIG9yZGVyLCBvciByZWd1bGF0aW9uIHRoZW4gWW91IG11c3Q6IChhKSBjb21wbHkgd2l0aAogICAgIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgdG8gdGhlIG1heGltdW0gZXh0ZW50IHBvc3NpYmxlOyBhbmQgKGIpCiAgICAgZGVzY3JpYmUgdGhlIGxpbWl0YXRpb25zIGFuZCB0aGUgY29kZSB0aGV5IGFmZmVjdC4gU3VjaCBkZXNjcmlwdGlvbgogICAgIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIExFR0FMIGZpbGUgZGVzY3JpYmVkIGluIFNlY3Rpb24gMy40IGFuZCBtdXN0CiAgICAgYmUgaW5jbHVkZWQgd2l0aCBhbGwgZGlzdHJpYnV0aW9ucyBvZiB0aGUgU291cmNlIENvZGUuIEV4Y2VwdCB0byB0aGUKICAgICBleHRlbnQgcHJvaGliaXRlZCBieSBzdGF0dXRlIG9yIHJlZ3VsYXRpb24sIHN1Y2ggZGVzY3JpcHRpb24gbXVzdCBiZQogICAgIHN1ZmZpY2llbnRseSBkZXRhaWxlZCBmb3IgYSByZWNpcGllbnQgb2Ygb3JkaW5hcnkgc2tpbGwgdG8gYmUgYWJsZSB0bwogICAgIHVuZGVyc3RhbmQgaXQuCgo1LiBBcHBsaWNhdGlvbiBvZiB0aGlzIExpY2Vuc2UuCgogICAgIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGNvZGUgdG8gd2hpY2ggdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGhhcwogICAgIGF0dGFjaGVkIHRoZSBub3RpY2UgaW4gRXhoaWJpdCBBIGFuZCB0byByZWxhdGVkIENvdmVyZWQgQ29kZS4KCjYuIFZlcnNpb25zIG9mIHRoZSBMaWNlbnNlLgoKICAgICA2LjEuIE5ldyBWZXJzaW9ucy4KICAgICBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbiAoIk5ldHNjYXBlIikgbWF5IHB1Ymxpc2ggcmV2aXNlZAogICAgIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YgdGhlIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuIEVhY2ggdmVyc2lvbgogICAgIHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4KCiAgICAgNi4yLiBFZmZlY3Qgb2YgTmV3IFZlcnNpb25zLgogICAgIE9uY2UgQ292ZXJlZCBDb2RlIGhhcyBiZWVuIHB1Ymxpc2hlZCB1bmRlciBhIHBhcnRpY3VsYXIgdmVyc2lvbiBvZiB0aGUKICAgICBMaWNlbnNlLCBZb3UgbWF5IGFsd2F5cyBjb250aW51ZSB0byB1c2UgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoYXQKICAgICB2ZXJzaW9uLiBZb3UgbWF5IGFsc28gY2hvb3NlIHRvIHVzZSBzdWNoIENvdmVyZWQgQ29kZSB1bmRlciB0aGUgdGVybXMKICAgICBvZiBhbnkgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHB1Ymxpc2hlZCBieSBOZXRzY2FwZS4gTm8gb25lCiAgICAgb3RoZXIgdGhhbiBOZXRzY2FwZSBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGUgdGVybXMgYXBwbGljYWJsZSB0bwogICAgIENvdmVyZWQgQ29kZSBjcmVhdGVkIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgICAgNi4zLiBEZXJpdmF0aXZlIFdvcmtzLgogICAgIElmIFlvdSBjcmVhdGUgb3IgdXNlIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2UgKHdoaWNoIHlvdSBtYXkKICAgICBvbmx5IGRvIGluIG9yZGVyIHRvIGFwcGx5IGl0IHRvIGNvZGUgd2hpY2ggaXMgbm90IGFscmVhZHkgQ292ZXJlZCBDb2RlCiAgICAgZ292ZXJuZWQgYnkgdGhpcyBMaWNlbnNlKSwgWW91IG11c3QgKGEpIHJlbmFtZSBZb3VyIGxpY2Vuc2Ugc28gdGhhdAogICAgIHRoZSBwaHJhc2VzICJNb3ppbGxhIiwgIk1PWklMTEFQTCIsICJNT1pQTCIsICJOZXRzY2FwZSIsCiAgICAgIk1QTCIsICJOUEwiIG9yIGFueSBjb25mdXNpbmdseSBzaW1pbGFyIHBocmFzZSBkbyBub3QgYXBwZWFyIGluIHlvdXIKICAgICBsaWNlbnNlIChleGNlcHQgdG8gbm90ZSB0aGF0IHlvdXIgbGljZW5zZSBkaWZmZXJzIGZyb20gdGhpcyBMaWNlbnNlKQogICAgIGFuZCAoYikgb3RoZXJ3aXNlIG1ha2UgaXQgY2xlYXIgdGhhdCBZb3VyIHZlcnNpb24gb2YgdGhlIGxpY2Vuc2UKICAgICBjb250YWlucyB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBhbmQKICAgICBOZXRzY2FwZSBQdWJsaWMgTGljZW5zZS4gKEZpbGxpbmcgaW4gdGhlIG5hbWUgb2YgdGhlIEluaXRpYWwKICAgICBEZXZlbG9wZXIsIE9yaWdpbmFsIENvZGUgb3IgQ29udHJpYnV0b3IgaW4gdGhlIG5vdGljZSBkZXNjcmliZWQgaW4KICAgICBFeGhpYml0IEEgc2hhbGwgbm90IG9mIHRoZW1zZWx2ZXMgYmUgZGVlbWVkIHRvIGJlIG1vZGlmaWNhdGlvbnMgb2YKICAgICB0aGlzIExpY2Vuc2UuKQoKNy4gRElTQ0xBSU1FUiBPRiBXQVJSQU5UWS4KCiAgICAgQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLAogICAgIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLAogICAgIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRgogICAgIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBOT04tSU5GUklOR0lORy4KICAgICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVEIENPREUKICAgICBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULAogICAgIFlPVSAoTk9UIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUKICAgICBDT1NUIE9GIEFOWSBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSCiAgICAgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YKICAgICBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUiBUSElTIERJU0NMQUlNRVIuCgo4LiBURVJNSU5BVElPTi4KCiAgICAgOC4xLiAgVGhpcyBMaWNlbnNlIGFuZCB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZXVuZGVyIHdpbGwgdGVybWluYXRlCiAgICAgYXV0b21hdGljYWxseSBpZiBZb3UgZmFpbCB0byBjb21wbHkgd2l0aCB0ZXJtcyBoZXJlaW4gYW5kIGZhaWwgdG8gY3VyZQogICAgIHN1Y2ggYnJlYWNoIHdpdGhpbiAzMCBkYXlzIG9mIGJlY29taW5nIGF3YXJlIG9mIHRoZSBicmVhY2guIEFsbAogICAgIHN1YmxpY2Vuc2VzIHRvIHRoZSBDb3ZlcmVkIENvZGUgd2hpY2ggYXJlIHByb3Blcmx5IGdyYW50ZWQgc2hhbGwKICAgICBzdXJ2aXZlIGFueSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UuIFByb3Zpc2lvbnMgd2hpY2gsIGJ5IHRoZWlyCiAgICAgbmF0dXJlLCBtdXN0IHJlbWFpbiBpbiBlZmZlY3QgYmV5b25kIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UKICAgICBzaGFsbCBzdXJ2aXZlLgoKICAgICA4LjIuICBJZiBZb3UgaW5pdGlhdGUgbGl0aWdhdGlvbiBieSBhc3NlcnRpbmcgYSBwYXRlbnQgaW5mcmluZ2VtZW50CiAgICAgY2xhaW0gKGV4Y2x1ZGluZyBkZWNsYXRvcnkganVkZ21lbnQgYWN0aW9ucykgYWdhaW5zdCBJbml0aWFsIERldmVsb3BlcgogICAgIG9yIGEgQ29udHJpYnV0b3IgKHRoZSBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvciBhZ2FpbnN0IHdob20KICAgICBZb3UgZmlsZSBzdWNoIGFjdGlvbiBpcyByZWZlcnJlZCB0byBhcyAiUGFydGljaXBhbnQiKSAgYWxsZWdpbmcgdGhhdDoKCiAgICAgKGEpICBzdWNoIFBhcnRpY2lwYW50J3MgQ29udHJpYnV0b3IgVmVyc2lvbiBkaXJlY3RseSBvciBpbmRpcmVjdGx5CiAgICAgaW5mcmluZ2VzIGFueSBwYXRlbnQsIHRoZW4gYW55IGFuZCBhbGwgcmlnaHRzIGdyYW50ZWQgYnkgc3VjaAogICAgIFBhcnRpY2lwYW50IHRvIFlvdSB1bmRlciBTZWN0aW9ucyAyLjEgYW5kL29yIDIuMiBvZiB0aGlzIExpY2Vuc2UKICAgICBzaGFsbCwgdXBvbiA2MCBkYXlzIG5vdGljZSBmcm9tIFBhcnRpY2lwYW50IHRlcm1pbmF0ZSBwcm9zcGVjdGl2ZWx5LAogICAgIHVubGVzcyBpZiB3aXRoaW4gNjAgZGF5cyBhZnRlciByZWNlaXB0IG9mIG5vdGljZSBZb3UgZWl0aGVyOiAoaSkKICAgICBhZ3JlZSBpbiB3cml0aW5nIHRvIHBheSBQYXJ0aWNpcGFudCBhIG11dHVhbGx5IGFncmVlYWJsZSByZWFzb25hYmxlCiAgICAgcm95YWx0eSBmb3IgWW91ciBwYXN0IGFuZCBmdXR1cmUgdXNlIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSBzdWNoCiAgICAgUGFydGljaXBhbnQsIG9yIChpaSkgd2l0aGRyYXcgWW91ciBsaXRpZ2F0aW9uIGNsYWltIHdpdGggcmVzcGVjdCB0bwogICAgIHRoZSBDb250cmlidXRvciBWZXJzaW9uIGFnYWluc3Qgc3VjaCBQYXJ0aWNpcGFudC4gIElmIHdpdGhpbiA2MCBkYXlzCiAgICAgb2Ygbm90aWNlLCBhIHJlYXNvbmFibGUgcm95YWx0eSBhbmQgcGF5bWVudCBhcnJhbmdlbWVudCBhcmUgbm90CiAgICAgbXV0dWFsbHkgYWdyZWVkIHVwb24gaW4gd3JpdGluZyBieSB0aGUgcGFydGllcyBvciB0aGUgbGl0aWdhdGlvbiBjbGFpbQogICAgIGlzIG5vdCB3aXRoZHJhd24sIHRoZSByaWdodHMgZ3JhbnRlZCBieSBQYXJ0aWNpcGFudCB0byBZb3UgdW5kZXIKICAgICBTZWN0aW9ucyAyLjEgYW5kL29yIDIuMiBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSBhdCB0aGUgZXhwaXJhdGlvbiBvZgogICAgIHRoZSA2MCBkYXkgbm90aWNlIHBlcmlvZCBzcGVjaWZpZWQgYWJvdmUuCgogICAgIChiKSAgYW55IHNvZnR3YXJlLCBoYXJkd2FyZSwgb3IgZGV2aWNlLCBvdGhlciB0aGFuIHN1Y2ggUGFydGljaXBhbnQncwogICAgIENvbnRyaWJ1dG9yIFZlcnNpb24sIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5mcmluZ2VzIGFueSBwYXRlbnQsIHRoZW4KICAgICBhbnkgcmlnaHRzIGdyYW50ZWQgdG8gWW91IGJ5IHN1Y2ggUGFydGljaXBhbnQgdW5kZXIgU2VjdGlvbnMgMi4xKGIpCiAgICAgYW5kIDIuMihiKSBhcmUgcmV2b2tlZCBlZmZlY3RpdmUgYXMgb2YgdGhlIGRhdGUgWW91IGZpcnN0IG1hZGUsIHVzZWQsCiAgICAgc29sZCwgZGlzdHJpYnV0ZWQsIG9yIGhhZCBtYWRlLCBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdAogICAgIFBhcnRpY2lwYW50LgoKICAgICA4LjMuICBJZiBZb3UgYXNzZXJ0IGEgcGF0ZW50IGluZnJpbmdlbWVudCBjbGFpbSBhZ2FpbnN0IFBhcnRpY2lwYW50CiAgICAgYWxsZWdpbmcgdGhhdCBzdWNoIFBhcnRpY2lwYW50J3MgQ29udHJpYnV0b3IgVmVyc2lvbiBkaXJlY3RseSBvcgogICAgIGluZGlyZWN0bHkgaW5mcmluZ2VzIGFueSBwYXRlbnQgd2hlcmUgc3VjaCBjbGFpbSBpcyByZXNvbHZlZCAoc3VjaCBhcwogICAgIGJ5IGxpY2Vuc2Ugb3Igc2V0dGxlbWVudCkgcHJpb3IgdG8gdGhlIGluaXRpYXRpb24gb2YgcGF0ZW50CiAgICAgaW5mcmluZ2VtZW50IGxpdGlnYXRpb24sIHRoZW4gdGhlIHJlYXNvbmFibGUgdmFsdWUgb2YgdGhlIGxpY2Vuc2VzCiAgICAgZ3JhbnRlZCBieSBzdWNoIFBhcnRpY2lwYW50IHVuZGVyIFNlY3Rpb25zIDIuMSBvciAyLjIgc2hhbGwgYmUgdGFrZW4KICAgICBpbnRvIGFjY291bnQgaW4gZGV0ZXJtaW5pbmcgdGhlIGFtb3VudCBvciB2YWx1ZSBvZiBhbnkgcGF5bWVudCBvcgogICAgIGxpY2Vuc2UuCgogICAgIDguNC4gIEluIHRoZSBldmVudCBvZiB0ZXJtaW5hdGlvbiB1bmRlciBTZWN0aW9ucyA4LjEgb3IgOC4yIGFib3ZlLAogICAgIGFsbCBlbmQgdXNlciBsaWNlbnNlIGFncmVlbWVudHMgKGV4Y2x1ZGluZyBkaXN0cmlidXRvcnMgYW5kIHJlc2VsbGVycykKICAgICB3aGljaCBoYXZlIGJlZW4gdmFsaWRseSBncmFudGVkIGJ5IFlvdSBvciBhbnkgZGlzdHJpYnV0b3IgaGVyZXVuZGVyCiAgICAgcHJpb3IgdG8gdGVybWluYXRpb24gc2hhbGwgc3Vydml2ZSB0ZXJtaW5hdGlvbi4KCjkuIExJTUlUQVRJT04gT0YgTElBQklMSVRZLgoKICAgICBVTkRFUiBOTyBDSVJDVU1TVEFOQ0VTIEFORCBVTkRFUiBOTyBMRUdBTCBUSEVPUlksIFdIRVRIRVIgVE9SVAogICAgIChJTkNMVURJTkcgTkVHTElHRU5DRSksIENPTlRSQUNULCBPUiBPVEhFUldJU0UsIFNIQUxMIFlPVSwgVEhFIElOSVRJQUwKICAgICBERVZFTE9QRVIsIEFOWSBPVEhFUiBDT05UUklCVVRPUiwgT1IgQU5ZIERJU1RSSUJVVE9SIE9GIENPVkVSRUQgQ09ERSwKICAgICBPUiBBTlkgU1VQUExJRVIgT0YgQU5ZIE9GIFNVQ0ggUEFSVElFUywgQkUgTElBQkxFIFRPIEFOWSBQRVJTT04gRk9SCiAgICAgQU5ZIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZCiAgICAgQ0hBUkFDVEVSIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBEQU1BR0VTIEZPUiBMT1NTIE9GIEdPT0RXSUxMLAogICAgIFdPUksgU1RPUFBBR0UsIENPTVBVVEVSIEZBSUxVUkUgT1IgTUFMRlVOQ1RJT04sIE9SIEFOWSBBTkQgQUxMIE9USEVSCiAgICAgQ09NTUVSQ0lBTCBEQU1BR0VTIE9SIExPU1NFUywgRVZFTiBJRiBTVUNIIFBBUlRZIFNIQUxMIEhBVkUgQkVFTgogICAgIElORk9STUVEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuIFRISVMgTElNSVRBVElPTiBPRgogICAgIExJQUJJTElUWSBTSEFMTCBOT1QgQVBQTFkgVE8gTElBQklMSVRZIEZPUiBERUFUSCBPUiBQRVJTT05BTCBJTkpVUlkKICAgICBSRVNVTFRJTkcgRlJPTSBTVUNIIFBBUlRZJ1MgTkVHTElHRU5DRSBUTyBUSEUgRVhURU5UIEFQUExJQ0FCTEUgTEFXCiAgICAgUFJPSElCSVRTIFNVQ0ggTElNSVRBVElPTi4gU09NRSBKVVJJU0RJQ1RJT05TIERPIE5PVCBBTExPVyBUSEUKICAgICBFWENMVVNJT04gT1IgTElNSVRBVElPTiBPRiBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgU08KICAgICBUSElTIEVYQ0xVU0lPTiBBTkQgTElNSVRBVElPTiBNQVkgTk9UIEFQUExZIFRPIFlPVS4KCjEwLiBVLlMuIEdPVkVSTk1FTlQgRU5EIFVTRVJTLgoKICAgICBUaGUgQ292ZXJlZCBDb2RlIGlzIGEgImNvbW1lcmNpYWwgaXRlbSwiIGFzIHRoYXQgdGVybSBpcyBkZWZpbmVkIGluCiAgICAgNDggQy5GLlIuIDIuMTAxIChPY3QuIDE5OTUpLCBjb25zaXN0aW5nIG9mICJjb21tZXJjaWFsIGNvbXB1dGVyCiAgICAgc29mdHdhcmUiIGFuZCAiY29tbWVyY2lhbCBjb21wdXRlciBzb2Z0d2FyZSBkb2N1bWVudGF0aW9uLCIgYXMgc3VjaAogICAgIHRlcm1zIGFyZSB1c2VkIGluIDQ4IEMuRi5SLiAxMi4yMTIgKFNlcHQuIDE5OTUpLiBDb25zaXN0ZW50IHdpdGggNDgKICAgICBDLkYuUi4gMTIuMjEyIGFuZCA0OCBDLkYuUi4gMjI3LjcyMDItMSB0aHJvdWdoIDIyNy43MjAyLTQgKEp1bmUgMTk5NSksCiAgICAgYWxsIFUuUy4gR292ZXJubWVudCBFbmQgVXNlcnMgYWNxdWlyZSBDb3ZlcmVkIENvZGUgd2l0aCBvbmx5IHRob3NlCiAgICAgcmlnaHRzIHNldCBmb3J0aCBoZXJlaW4uCgoxMS4gTUlTQ0VMTEFORU9VUy4KCiAgICAgVGhpcyBMaWNlbnNlIHJlcHJlc2VudHMgdGhlIGNvbXBsZXRlIGFncmVlbWVudCBjb25jZXJuaW5nIHN1YmplY3QKICAgICBtYXR0ZXIgaGVyZW9mLiBJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBoZWxkIHRvIGJlCiAgICAgdW5lbmZvcmNlYWJsZSwgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgb25seSB0byB0aGUgZXh0ZW50CiAgICAgbmVjZXNzYXJ5IHRvIG1ha2UgaXQgZW5mb3JjZWFibGUuIFRoaXMgTGljZW5zZSBzaGFsbCBiZSBnb3Zlcm5lZCBieQogICAgIENhbGlmb3JuaWEgbGF3IHByb3Zpc2lvbnMgKGV4Y2VwdCB0byB0aGUgZXh0ZW50IGFwcGxpY2FibGUgbGF3LCBpZgogICAgIGFueSwgcHJvdmlkZXMgb3RoZXJ3aXNlKSwgZXhjbHVkaW5nIGl0cyBjb25mbGljdC1vZi1sYXcgcHJvdmlzaW9ucy4KICAgICBXaXRoIHJlc3BlY3QgdG8gZGlzcHV0ZXMgaW4gd2hpY2ggYXQgbGVhc3Qgb25lIHBhcnR5IGlzIGEgY2l0aXplbiBvZiwKICAgICBvciBhbiBlbnRpdHkgY2hhcnRlcmVkIG9yIHJlZ2lzdGVyZWQgdG8gZG8gYnVzaW5lc3MgaW4gdGhlIFVuaXRlZAogICAgIFN0YXRlcyBvZiBBbWVyaWNhLCBhbnkgbGl0aWdhdGlvbiByZWxhdGluZyB0byB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUKICAgICBzdWJqZWN0IHRvIHRoZSBqdXJpc2RpY3Rpb24gb2YgdGhlIEZlZGVyYWwgQ291cnRzIG9mIHRoZSBOb3J0aGVybgogICAgIERpc3RyaWN0IG9mIENhbGlmb3JuaWEsIHdpdGggdmVudWUgbHlpbmcgaW4gU2FudGEgQ2xhcmEgQ291bnR5LAogICAgIENhbGlmb3JuaWEsIHdpdGggdGhlIGxvc2luZyBwYXJ0eSByZXNwb25zaWJsZSBmb3IgY29zdHMsIGluY2x1ZGluZwogICAgIHdpdGhvdXQgbGltaXRhdGlvbiwgY291cnQgY29zdHMgYW5kIHJlYXNvbmFibGUgYXR0b3JuZXlzJyBmZWVzIGFuZAogICAgIGV4cGVuc2VzLiBUaGUgYXBwbGljYXRpb24gb2YgdGhlIFVuaXRlZCBOYXRpb25zIENvbnZlbnRpb24gb24KICAgICBDb250cmFjdHMgZm9yIHRoZSBJbnRlcm5hdGlvbmFsIFNhbGUgb2YgR29vZHMgaXMgZXhwcmVzc2x5IGV4Y2x1ZGVkLgogICAgIEFueSBsYXcgb3IgcmVndWxhdGlvbiB3aGljaCBwcm92aWRlcyB0aGF0IHRoZSBsYW5ndWFnZSBvZiBhIGNvbnRyYWN0CiAgICAgc2hhbGwgYmUgY29uc3RydWVkIGFnYWluc3QgdGhlIGRyYWZ0ZXIgc2hhbGwgbm90IGFwcGx5IHRvIHRoaXMKICAgICBMaWNlbnNlLgoKMTIuIFJFU1BPTlNJQklMSVRZIEZPUiBDTEFJTVMuCgogICAgIEFzIGJldHdlZW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIHRoZSBDb250cmlidXRvcnMsIGVhY2ggcGFydHkgaXMKICAgICByZXNwb25zaWJsZSBmb3IgY2xhaW1zIGFuZCBkYW1hZ2VzIGFyaXNpbmcsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksCiAgICAgb3V0IG9mIGl0cyB1dGlsaXphdGlvbiBvZiByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlIGFuZCBZb3UgYWdyZWUgdG8KICAgICB3b3JrIHdpdGggSW5pdGlhbCBEZXZlbG9wZXIgYW5kIENvbnRyaWJ1dG9ycyB0byBkaXN0cmlidXRlIHN1Y2gKICAgICByZXNwb25zaWJpbGl0eSBvbiBhbiBlcXVpdGFibGUgYmFzaXMuIE5vdGhpbmcgaGVyZWluIGlzIGludGVuZGVkIG9yCiAgICAgc2hhbGwgYmUgZGVlbWVkIHRvIGNvbnN0aXR1dGUgYW55IGFkbWlzc2lvbiBvZiBsaWFiaWxpdHkuCgoxMy4gTVVMVElQTEUtTElDRU5TRUQgQ09ERS4KCiAgICAgSW5pdGlhbCBEZXZlbG9wZXIgbWF5IGRlc2lnbmF0ZSBwb3J0aW9ucyBvZiB0aGUgQ292ZXJlZCBDb2RlIGFzCiAgICAgIk11bHRpcGxlLUxpY2Vuc2VkIi4gICJNdWx0aXBsZS1MaWNlbnNlZCIgbWVhbnMgdGhhdCB0aGUgSW5pdGlhbAogICAgIERldmVsb3BlciBwZXJtaXRzIHlvdSB0byB1dGlsaXplIHBvcnRpb25zIG9mIHRoZSBDb3ZlcmVkIENvZGUgdW5kZXIKICAgICBZb3VyIGNob2ljZSBvZiB0aGUgTlBMIG9yIHRoZSBhbHRlcm5hdGl2ZSBsaWNlbnNlcywgaWYgYW55LCBzcGVjaWZpZWQKICAgICBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaW4gdGhlIGZpbGUgZGVzY3JpYmVkIGluIEV4aGliaXQgQS4KCkVYSElCSVQgQSAtTW96aWxsYSBQdWJsaWMgTGljZW5zZS4KCiAgICAgYGBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlCiAgICAgVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbgogICAgIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgICAgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCgogICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIKICAgICBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQogICAgIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucwogICAgIHVuZGVyIHRoZSBMaWNlbnNlLgoKICAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy4KCiAgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIF9fX19fX19fX19fX19fX19fX19fX19fXy4KICAgICBQb3J0aW9ucyBjcmVhdGVkIGJ5IF9fX19fX19fX19fX19fX19fX19fX18gYXJlIENvcHlyaWdodCAoQykgX19fX19fCiAgICAgX19fX19fX19fX19fX19fX19fX19fX18uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgIENvbnRyaWJ1dG9yKHMpOiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy4KCiAgICAgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMKICAgICBvZiB0aGUgX19fX18gbGljZW5zZSAodGhlICAiW19fX10gTGljZW5zZSIpLCBpbiB3aGljaCBjYXNlIHRoZQogICAgIHByb3Zpc2lvbnMgb2YgW19fX19fX10gTGljZW5zZSBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRob3NlCiAgICAgYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAgICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBbX19fX10gTGljZW5zZSBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UKICAgICB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSBNUEwsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkKICAgICBkZWxldGluZyAgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZAogICAgIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIFtfX19dIExpY2Vuc2UuICBJZiB5b3UgZG8gbm90IGRlbGV0ZQogICAgIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKICAgICB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUgW19fX10gTGljZW5zZS4iCgogICAgIFtOT1RFOiBUaGUgdGV4dCBvZiB0aGlzIEV4aGliaXQgQSBtYXkgZGlmZmVyIHNsaWdodGx5IGZyb20gdGhlIHRleHQgb2YKICAgICB0aGUgbm90aWNlcyBpbiB0aGUgU291cmNlIENvZGUgZmlsZXMgb2YgdGhlIE9yaWdpbmFsIENvZGUuIFlvdSBzaG91bGQKICAgICB1c2UgdGhlIHRleHQgb2YgdGhpcyBFeGhpYml0IEEgcmF0aGVyIHRoYW4gdGhlIHRleHQgZm91bmQgaW4gdGhlCiAgICAgT3JpZ2luYWwgQ29kZSBTb3VyY2UgQ29kZSBmb3IgWW91ciBNb2RpZmljYXRpb25zLl0KCgoKICAgICAgICAgICAgICAgICAgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQogICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMywgMjkgSnVuZSAyMDA3]]></data>
	</file>
	<file>
	  <filename>/ace/Readme.md</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[QWNlIChBamF4Lm9yZyBDbG91ZDkgRWRpdG9yKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpBY2UgaXMgYSBzdGFuZGFsb25lIGNvZGUgZWRpdG9yIHdyaXR0ZW4gaW4gSmF2YVNjcmlwdC4gT3VyIGdvYWwgaXMgdG8gY3JlYXRlIGEgYnJvd3NlciBiYXNlZCBlZGl0b3IgdGhhdCBtYXRjaGVzIGFuZCBleHRlbmRzIHRoZSBmZWF0dXJlcywgdXNhYmlsaXR5IGFuZCBwZXJmb3JtYW5jZSBvZiBleGlzdGluZyBuYXRpdmUgZWRpdG9ycyBzdWNoIGFzIFRleHRNYXRlLCBWaW0gb3IgRWNsaXBzZS4gSXQgY2FuIGJlIGVhc2lseSBlbWJlZGRlZCBpbiBhbnkgd2ViIHBhZ2Ugb3IgSmF2YVNjcmlwdCBhcHBsaWNhdGlvbi4gQWNlIGlzIGRldmVsb3BlZCBhcyB0aGUgcHJpbWFyeSBlZGl0b3IgZm9yIFtDbG91ZDkgSURFXShodHRwOi8vd3d3LmNsb3VkOWlkZS5jb20vKSBhbmQgdGhlIHN1Y2Nlc3NvciBvZiB0aGUgTW96aWxsYSBTa3l3cml0ZXIgKEJlc3BpbikgUHJvamVjdC4KCkZlYXR1cmVzCi0tLS0tLS0tCgoqIFN5bnRheCBoaWdobGlnaHRpbmcKKiBBdXRvbWF0aWMgaW5kZW50IGFuZCBvdXRkZW50CiogQW4gb3B0aW9uYWwgY29tbWFuZCBsaW5lCiogSGFuZGxlcyBodWdlIGRvY3VtZW50cyAoMTAwLDAwMCBsaW5lcyBhbmQgbW9yZSBhcmUgbm8gcHJvYmxlbSkKKiBGdWxseSBjdXN0b21pemFibGUga2V5IGJpbmRpbmdzIGluY2x1ZGluZyBWSSBhbmQgRW1hY3MgbW9kZXMKKiBUaGVtZXMgKFRleHRNYXRlIHRoZW1lcyBjYW4gYmUgaW1wb3J0ZWQpCiogU2VhcmNoIGFuZCByZXBsYWNlIHdpdGggcmVndWxhciBleHByZXNzaW9ucwoqIEhpZ2hsaWdodCBtYXRjaGluZyBwYXJlbnRoZXNlcwoqIFRvZ2dsZSBiZXR3ZWVuIHNvZnQgdGFicyBhbmQgcmVhbCB0YWJzCiogRGlzcGxheXMgaGlkZGVuIGNoYXJhY3RlcnMKKiBEcmFnIGFuZCBkcm9wIHRleHQgdXNpbmcgdGhlIG1vdXNlCiogTGluZSB3cmFwcGluZwoqIFVuc3RydWN0dXJlZCAvIHVzZXIgY29kZSBmb2xkaW5nCiogTGl2ZSBzeW50YXggY2hlY2tlciAoY3VycmVudGx5IEphdmFTY3JpcHQvQ29mZmVlU2NyaXB0KQoKVGFrZSBBY2UgZm9yIGEgc3BpbiEKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkNoZWNrIG91dCB0aGUgQWNlIGxpdmUgW2RlbW9dKGh0dHA6Ly9hamF4b3JnLmdpdGh1Yi5jb20vYWNlLykgb3IgZ2V0IGEgW0Nsb3VkOSBJREUgYWNjb3VudF0oaHR0cDovL3J1bi5jbG91ZDlpZGUuY29tKSB0byBleHBlcmllbmNlIEFjZSB3aGlsZSBlZGl0aW5nIG9uZSBvZiB5b3VyIG93biBHaXRIdWIgcHJvamVjdHMuCgpJZiB5b3Ugd2FudCwgeW91IGNhbiB1c2UgQWNlIGFzIGEgdGV4dGFyZWEgcmVwbGFjZW1lbnQgdGhhbmtzIHRvIHRoZSBbQWNlIEJvb2ttYXJrbGV0XShodHRwOi8vYWpheG9yZy5naXRodWIuY29tL2FjZS9idWlsZC90ZXh0YXJlYS9lZGl0b3IuaHRtbCkuCgpIaXN0b3J5Ci0tLS0tLS0KClByZXZpb3VzbHkga25vd24gYXMg4oCcQmVzcGlu4oCdIGFuZCDigJxTa3l3cml0ZXLigJ0gaXTigJlzIG5vdyBrbm93biBhcyBBY2UgKEFqYXgub3JnIENsb3VkOSBFZGl0b3IpISBCZXNwaW4gYW5kIEFjZSBzdGFydGVkIGFzIHR3byBpbmRlcGVuZGVudCBwcm9qZWN0cywgYm90aCBhaW1pbmcgdG8gYnVpbGQgYSBuby1jb21wcm9taXNlIGNvZGUgZWRpdG9yIGNvbXBvbmVudCBmb3IgdGhlIHdlYi4gQmVzcGluIHN0YXJ0ZWQgYXMgcGFydCBvZiBNb3ppbGxhIExhYnMgYW5kIHdhcyBiYXNlZCBvbiB0aGUgY2FudmFzIHRhZywgd2hpbGUgQWNlIGlzIHRoZSBFZGl0b3IgY29tcG9uZW50IG9mIHRoZSBDbG91ZDkgSURFIGFuZCBpcyB1c2luZyB0aGUgRE9NIGZvciByZW5kZXJpbmcuIEFmdGVyIHRoZSByZWxlYXNlIG9mIEFjZSBhdCBKU0NvbmYuZXUgMjAxMCBpbiBCZXJsaW4gdGhlIFNreXdyaXRlciB0ZWFtIGRlY2lkZWQgdG8gbWVyZ2UgQWNlIHdpdGggYSBzaW1wbGlmaWVkIHZlcnNpb24gb2YgU2t5d3JpdGVyJ3MgcGx1Z2luIHN5c3RlbSBhbmQgc29tZSBvZiBTa3l3cml0ZXIncyBleHRlbnNpYmlsaXR5IHBvaW50cy4gQWxsIHRoZXNlIGNoYW5nZXMgaGF2ZSBiZWVuIG1lcmdlZCBiYWNrIHRvIEFjZS4gQm90aCBBamF4Lm9yZyBhbmQgTW96aWxsYSBhcmUgYWN0aXZlbHkgZGV2ZWxvcGluZyBhbmQgbWFpbnRhaW5pbmcgQWNlLgoKR2V0dGluZyB0aGUgY29kZQotLS0tLS0tLS0tLS0tLS0tCgpBY2UgaXMgYSBjb21tdW5pdHkgcHJvamVjdC4gV2UgYWN0aXZlbHkgZW5jb3VyYWdlIGFuZCBzdXBwb3J0IGNvbnRyaWJ1dGlvbnMuIFRoZSBBY2Ugc291cmNlIGNvZGUgaXMgaG9zdGVkIG9uIEdpdEh1Yi4gSXQgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIE1vemlsbGEgdHJpLWxpY2Vuc2UgKE1QTC9HUEwvTEdQTCksIHRoZSBzYW1lIGxpY2Vuc2UgdXNlZCBieSBGaXJlZm94LiBUaGlzIGxpY2Vuc2UgaXMgZnJpZW5kbHkgdG8gYWxsIGtpbmRzIG9mIHByb2plY3RzLCB3aGV0aGVyIG9wZW4gc291cmNlIG9yIG5vdC4gVGFrZSBjaGFyZ2Ugb2YgeW91ciBlZGl0b3IgYW5kIGFkZCB5b3VyIGZhdm9yaXRlIGxhbmd1YWdlIGhpZ2hsaWdodGluZyBhbmQga2V5YmluZGluZ3MhCgpgYGBiYXNoCiAgICBnaXQgY2xvbmUgZ2l0Oi8vZ2l0aHViLmNvbS9hamF4b3JnL2FjZS5naXQKICAgIGNkIGFjZQogICAgZ2l0IHN1Ym1vZHVsZSB1cGRhdGUgLS1pbml0IC0tcmVjdXJzaXZlCmBgYAoKRW1iZWRkaW5nIEFjZQotLS0tLS0tLS0tLS0tCgpBY2UgY2FuIGJlIGVhc2lseSBlbWJlZGRlZCBpbnRvIGFueSBleGlzdGluZyB3ZWIgcGFnZS4gVGhlIEFjZSBnaXQgcmVwb3NpdG9yeSBzaGlwcyB3aXRoIGEgcHJlLXBhY2thZ2VkIHZlcnNpb24gb2YgQWNlIGluc2lkZSBvZiB0aGUgYGJ1aWxkYCBkaXJlY3RvcnkuIFRoZSBzYW1lIHBhY2thZ2VkIGZpbGVzIGFyZSBhbHNvIGF2YWlsYWJsZSBhcyBhIHNlcGFyYXRlIFtkb3dubG9hZF0oaHR0cHM6Ly9naXRodWIuY29tL2FqYXhvcmcvYWNlL2Rvd25sb2FkcykuIFNpbXBseSBjb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgYHNyY2Agc3ViZGlyZWN0b3J5IHNvbWV3aGVyZSBpbnRvIHlvdXIgcHJvamVjdCBhbmQgdGFrZSBhIGxvb2sgYXQgdGhlIGluY2x1ZGVkIGRlbW9zIG9mIGhvdyB0byB1c2UgQWNlLgoKVGhlIGVhc2llc3QgdmVyc2lvbiBpcyBzaW1wbHk6CgpgYGBodG1sCiAgICA8ZGl2IGlkPSJlZGl0b3IiPnNvbWUgdGV4dDwvZGl2PgogICAgPHNjcmlwdCBzcmM9InNyYy9hY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgogICAgPHNjcmlwdD4KICAgIHdpbmRvdy5vbmxvYWQgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgZWRpdG9yID0gYWNlLmVkaXQoImVkaXRvciIpOwogICAgfTsKICAgIDwvc2NyaXB0PgpgYGAKCldpdGggImVkaXRvciIgYmVpbmcgdGhlIGlkIG9mIHRoZSBET00gZWxlbWVudCwgd2hpY2ggc2hvdWxkIGJlIGNvbnZlcnRlZCB0byBhbiBlZGl0b3IuIE5vdGUgdGhhdCB0aGlzIGVsZW1lbnQgbXVzdCBiZSBleHBsaWNpdGx5IHNpemVkIGFuZCBwb3NpdGlvbmVkIGBhYnNvbHV0ZWAgb3IgYHJlbGF0aXZlYCBmb3IgQWNlIHRvIHdvcmsuIGUuZy4KCmBgYGNzcwogICAgI2VkaXRvciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdpZHRoOiA1MDBweDsKICAgICAgICBoZWlnaHQ6IDQwMHB4OwogICAgfQpgYGAKClRvIGNoYW5nZSB0aGUgdGhlbWUgc2ltcGx5IGluY2x1ZGUgdGhlIFRoZW1lJ3MgSmF2YVNjcmlwdCBmaWxlCgpgYGBodG1sCiAgICA8c2NyaXB0IHNyYz0ic3JjL3RoZW1lLXR3aWxpZ2h0LmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KYGBgCgphbmQgY29uZmlndXJlIHRoZSBlZGl0b3IgdG8gdXNlIHRoZSB0aGVtZToKCmBgYGphdmFzY3JpcHQKICAgIGVkaXRvci5zZXRUaGVtZSgiYWNlL3RoZW1lL3R3aWxpZ2h0Iik7CmBgYAoKQnkgZGVmYXVsdCB0aGUgZWRpdG9yIG9ubHkgc3VwcG9ydHMgcGxhaW4gdGV4dCBtb2RlOyBtYW55IG90aGVyIGxhbmd1YWdlcyBhcmUgYXZhaWxhYmxlIGFzIHNlcGFyYXRlIG1vZHVsZXMuIEFmdGVyIGluY2x1ZGluZyB0aGUgbW9kZSdzIEphdmFTY3JpcHQgZmlsZToKCmBgYGh0bWwKICAgIDxzY3JpcHQgc3JjPSJzcmMvbW9kZS1qYXZhc2NyaXB0LmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KYGBgCgpUaGVuIHRoZSBtb2RlIGNhbiBiZSB1c2VkIGxpa2UgdGhpczoKCmBgYGphdmFzY3JpcHQKICAgIHZhciBKYXZhU2NyaXB0TW9kZSA9IHJlcXVpcmUoImFjZS9tb2RlL2phdmFzY3JpcHQiKS5Nb2RlOwogICAgZWRpdG9yLmdldFNlc3Npb24oKS5zZXRNb2RlKG5ldyBKYXZhU2NyaXB0TW9kZSgpKTsKYGBgCgpEb2N1bWVudGF0aW9uCi0tLS0tLS0tLS0tLS0KCllvdSBmaW5kIGEgbG90IG1vcmUgc2FtcGxlIGNvZGUgaW4gdGhlIFtkZW1vIGFwcF0oaHR0cHM6Ly9naXRodWIuY29tL2FqYXhvcmcvYWNlL2Jsb2IvbWFzdGVyL2RlbW8vZGVtby5qcykuCgpUaGVyZSBpcyBhbHNvIHNvbWUgZG9jdW1lbnRhdGlvbiBvbiB0aGUgW3dpa2kgcGFnZV0oaHR0cHM6Ly9naXRodWIuY29tL2FqYXhvcmcvYWNlL3dpa2kpLgoKSWYgeW91IHN0aWxsIG5lZWQgaGVscCwgZmVlbCBmcmVlIHRvIGRyb3AgYSBtYWlsIG9uIHRoZSBbYWNlIG1haWxpbmcgbGlzdF0oaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2FjZS1kaXNjdXNzKS4KClJ1bm5pbmcgQWNlCi0tLS0tLS0tLS0tCgpBZnRlciB0aGUgY2hlY2tvdXQgQWNlIHdvcmtzIG91dCBvZiB0aGUgYm94LiBObyBidWlsZCBzdGVwIGlzIHJlcXVpcmVkLiBPcGVuICdlZGl0b3IuaHRtbCcgaW4gYW55IGJyb3dzZXIgZXhjZXB0IEdvb2dsZSBDaHJvbWUuIEdvb2dsZSBDaHJvbWUgZG9lc24ndCBhbGxvdyBYTUxIVFRQUmVxdWVzdHMgZnJvbSBmaWxlcyBsb2FkZWQgZnJvbSBkaXNjIChpLmUuIHdpdGggYSBmaWxlOi8vLyBVUkwpLiBUbyBvcGVuIEFjZSBpbiBDaHJvbWUgc2ltcGx5IHN0YXJ0IHRoZSBidW5kbGVkIG1pbmkgSFRUUCBzZXJ2ZXI6CgpgYGBiYXNoCiAgICAuL3N0YXRpYy5weQpgYGAKCk9yIHVzaW5nIE5vZGUuSlMKCmBgYGJhc2gKICAgIC4vc3RhdGljLmpzCmBgYAoKVGhlIGVkaXRvciBjYW4gdGhlbiBiZSBvcGVuZWQgYXQgaHR0cDovL2xvY2FsaG9zdDo4ODg4L2luZGV4Lmh0bWwuCgpQYWNrYWdlIEFjZQotLS0tLS0tLS0tLQoKVG8gcGFja2FnZSBBY2Ugd2UgdXNlIHRoZSBkcnlpY2UgYnVpbGQgdG9vbCBkZXZlbG9wZWQgYnkgdGhlIE1vemlsbGEgU2t5d3JpdGVyIHRlYW0uIEJlZm9yZSB5b3UgY2FuIGJ1aWxkIHlvdSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzdWJtb2R1bGVzIGFyZSB1cCB0byBkYXRlLgoKYGBgYmFzaAogICAgZ2l0IHN1Ym1vZHVsZSB1cGRhdGUgLS1pbml0IC0tcmVjdXJzaXZlCmBgYAoKTWFrZSBzdXJlIHlvdSBhdCBsZWFzdCB2ZXJzaW9uIDAuMy4wIG9mIGRyeWljZQoKYGBgYmFzaAogICAgbnBtIGluc3RhbGwgZHJ5aWNlCmBgYAoKQWZ0ZXJ3YXJkcyBBY2UgY2FuIGJlIGJ1aWx0IGJ5IGNhbGxpbmcKCmBgYGJhc2gKICAgIC4vTWFrZWZpbGUuZHJ5aWNlLmpzIG5vcm1hbApgYGAKClRoZSBwYWNrYWdlZCBBY2Ugd2lsbCBiZSBwdXQgaW4gdGhlICdidWlsZCcgZm9sZGVyLgoKVG8gYnVpbGQgdGhlIGJvb2ttYXJrbGV0IHZlcnNpb24gZXhlY3V0ZQoKYGBgYmFzaAogICAgLi9NYWtlZmlsZS5kcnlpY2UuanMgYm0KYGBgCgpSdW5uaW5nIHRoZSBVbml0IFRlc3RzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClRoZSBBY2UgdW5pdCB0ZXN0cyBydW4gb24gbm9kZS5qcy4gQmVmb3JlIHRoZSBmaXJzdCBydW4gYSBjb3VwbGUgb2Ygbm9kZSBtb2R1bGVzIGhhdmUgdG8gYmUgaW5zdGFsbGVkLiBUaGUgZWFzaWVzdCB3YXkgdG8gZG8gdGhpcyBpcyBieSB1c2luZyB0aGUgbm9kZSBwYWNrYWdlIG1hbmFnZXIgKG5wbSkuIEluIHRoZSBBY2UgYmFzZSBkaXJlY3Rvcnkgc2ltcGx5IGNhbGwKCmBgYGJhc2gKICAgIG5wbSBsaW5rIC4KYGBgCgpUbyBydW4gdGhlIHRlc3RzIGNhbGw6CgpgYGBiYXNoCiAgICBub2RlIGxpYi9hY2UvdGVzdC9hbGwuanMKYGBgCgpZb3UgY2FuIGFsc28gcnVuIHRoZSB0ZXN0cyBpbiB5b3VyIGJyb3dzZXIgYnkgc2VydmluZzoKCiAgICBodHRwOi8vbG9jYWxob3N0Ojg4ODgvbGliL2FjZS90ZXN0L3Rlc3RzLmh0bWwKClRoaXMgbWFrZXMgZGVidWdnaW5nIGZhaWxpbmcgdGVzdHMgd2F5IG1vcmUgZWFzaWVyLgoKQ29udGludW91cyBJbnRlZ3JhdGlvbiBzdGF0dXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClRoaXMgcHJvamVjdCBpcyB0ZXN0ZWQgd2l0aCBbVHJhdmlzIENJXShodHRwOi8vdHJhdmlzLWNpLm9yZykKWyFbQnVpbGQgU3RhdHVzXShodHRwczovL3NlY3VyZS50cmF2aXMtY2kub3JnL2FqYXhvcmcvYWNlLnBuZyldKGh0dHA6Ly90cmF2aXMtY2kub3JnL2FqYXhvcmcvYWNlKQoKQ29udHJpYnV0aW5nCi0tLS0tLS0tLS0tLQoKQWNlIHdvdWxkbid0IGJlIHdoYXQgaXQgaXMgd2l0aG91dCBjb250cmlidXRpb25zISBGZWVsIGZyZWUgdG8gZm9yayBhbmQgaW1wcm92ZS9lbmhhbmNlIEFjZSBhbnkgd2F5IHlvdSB3YW50LiBJZiB5b3UgZmVlbCB0aGF0IHRoZSBlZGl0b3Igb3IgdGhlIEFjZSBjb21tdW5pdHkgd2lsbCBiZW5lZml0IGZyb20geW91ciBjaGFuZ2VzLCBwbGVhc2Ugb3BlbiBhIHB1bGwgcmVxdWVzdC4gVG8gcHJvdGVjdCB0aGUgaW50ZXJlc3RzIG9mIHRoZSBBY2UgY29udHJpYnV0b3JzIGFuZCB1c2VycyB3ZSByZXF1aXJlIGNvbnRyaWJ1dG9ycyB0byBzaWduIGEgQ29udHJpYnV0b3JzIExpY2Vuc2UgQWdyZWVtZW50IChDTEEpIGJlZm9yZSB3ZSBwdWxsIHRoZSBjaGFuZ2VzIGludG8gdGhlIG1haW4gcmVwb3NpdG9yeS4gT3VyIENMQSBpcyB0aGUgc2ltcGxlc3Qgb2YgYWdyZWVtZW50cywgcmVxdWlyaW5nIHRoYXQgdGhlIGNvbnRyaWJ1dGlvbnMgeW91IG1ha2UgdG8gYW4gYWpheC5vcmcgcHJvamVjdCBhcmUgb25seSB0aG9zZSB5b3UncmUgYWxsb3dlZCB0byBtYWtlLiBUaGlzIGhlbHBzIHVzIHNpZ25pZmljYW50bHkgcmVkdWNlIGZ1dHVyZSBsZWdhbCByaXNrIGZvciBldmVyeW9uZSBpbnZvbHZlZC4gSXQgaXMgZWFzeSwgaGVscHMgZXZlcnlvbmUsIHRha2VzIHRlbiBtaW51dGVzLCBhbmQgb25seSBuZWVkcyB0byBiZSBjb21wbGV0ZWQgb25jZS4gIFRoZXJlIGFyZSB0d28gdmVyc2lvbnMgb2YgdGhlIGFncmVlbWVudDoKCjEuIFtUaGUgSW5kaXZpZHVhbCBDTEFdKGh0dHBzOi8vZ2l0aHViLmNvbS9hamF4b3JnL2FjZS9yYXcvbWFzdGVyL2RvYy9Db250cmlidXRvcl9MaWNlbnNlX0FncmVlbWVudC12Mi5wZGYpOiB1c2UgdGhpcyB2ZXJzaW9uIGlmIHlvdSdyZSB3b3JraW5nIG9uIGFuIGFqYXgub3JnIGluIHlvdXIgc3BhcmUgdGltZSwgb3IgY2FuIGNsZWFybHkgY2xhaW0gb3duZXJzaGlwIG9mIGNvcHlyaWdodCBpbiB3aGF0IHlvdSdsbCBiZSBzdWJtaXR0aW5nLgoyLiBbVGhlIENvcnBvcmF0ZSBDTEFdKGh0dHBzOi8vZ2l0aHViLmNvbS9hamF4b3JnL2FjZS9yYXcvbWFzdGVyL2RvYy9Db3Jwb3JhdGVfQ29udHJpYnV0b3JfTGljZW5zZV9BZ3JlZW1lbnQtdjIucGRmKTogaGF2ZSB5b3VyIGNvcnBvcmF0ZSBsYXd5ZXIgcmV2aWV3IGFuZCBzdWJtaXQgdGhpcyBpZiB5b3VyIGNvbXBhbnkgaXMgZ29pbmcgdG8gYmUgY29udHJpYnV0aW5nIHRvIGFqYXgub3JnICBwcm9qZWN0cwoKSWYgeW91IHdhbnQgdG8gY29udHJpYnV0ZSB0byBhbiBhamF4Lm9yZyBwcm9qZWN0IHBsZWFzZSBwcmludCB0aGUgQ0xBIGFuZCBmaWxsIGl0IG91dCBhbmQgc2lnbiBpdC4gVGhlbiBlaXRoZXIgc2VuZCBpdCBieSBzbmFpbCBtYWlsIG9yIGZheCB0byB1cyBvciBzZW5kIGl0IGJhY2sgc2Nhbm5lZCAob3IgYXMgYSBwaG90bykgYnkgZW1haWwuCgpFbWFpbDogZmFiaWFuLmpha29ic0B3ZWIuZGUKCkZheDogKzMxICgwKSAyMDYzODg5NTMKCkFkZHJlc3M6IEFqYXgub3JnIEIuVi4KICBLZWl6ZXJzZ3JhY2h0IDI0MQogIDEwMTYgRUEsIEFtc3RlcmRhbQogIHRoZSBOZXRoZXJsYW5kcw==]]></data>
	</file>
	<file>
	  <filename>/ace/src/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/ace/src/ace-compat-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoKICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdwaWxvdC9pbmRleCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAncGlsb3QvYnJvd3Nlcl9mb2N1cycsICdwaWxvdC9kb20nLCAncGlsb3QvZXZlbnQnLCAncGlsb3QvZXZlbnRfZW1pdHRlcicsICdwaWxvdC9maXhvbGRicm93c2VycycsICdwaWxvdC9rZXlzJywgJ3BpbG90L2xhbmcnLCAncGlsb3Qvb29wJywgJ3BpbG90L3VzZXJhZ2VudCcsICdwaWxvdC9jYW5vbiddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKICAgIHJlcXVpcmUoInBpbG90L2Jyb3dzZXJfZm9jdXMiKTsKICAgIHJlcXVpcmUoInBpbG90L2RvbSIpOwogICAgcmVxdWlyZSgicGlsb3QvZXZlbnQiKTsKICAgIHJlcXVpcmUoInBpbG90L2V2ZW50X2VtaXR0ZXIiKTsKICAgIHJlcXVpcmUoInBpbG90L2ZpeG9sZGJyb3dzZXJzIik7CiAgICByZXF1aXJlKCJwaWxvdC9rZXlzIik7CiAgICByZXF1aXJlKCJwaWxvdC9sYW5nIik7CiAgICByZXF1aXJlKCJwaWxvdC9vb3AiKTsKICAgIHJlcXVpcmUoInBpbG90L3VzZXJhZ2VudCIpOwogICAgcmVxdWlyZSgicGlsb3QvY2Fub24iKTsKfSk7Ci8qIHZpbTp0cz00OnN0cz00OnN3PTQ6CiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgncGlsb3QvYnJvd3Nlcl9mb2N1cycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9icm93c2VyX2ZvY3VzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewogICAgY29uc29sZS53YXJuKCJERVBSRUNBVEVEOiAncGlsb3QvYnJvd3Nlcl9mb2N1cycgaXMgZGVwcmVjYXRlZC4gVXNlICdhY2UvbGliL2Jyb3dzZXJfZm9jdXMnIGluc3RlYWQiKTsKICAgIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgiYWNlL2xpYi9icm93c2VyX2ZvY3VzIik7Cn0pOwovKiB2aW06dHM9NDpzdHM9NDpzdz00OgogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ3BpbG90L2RvbScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9kb20nXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiAgICBjb25zb2xlLndhcm4oIkRFUFJFQ0FURUQ6ICdwaWxvdC9kb20nIGlzIGRlcHJlY2F0ZWQuIFVzZSAnYWNlL2xpYi9kb20nIGluc3RlYWQiKTsKICAgIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgiYWNlL2xpYi9kb20iKTsKfSk7Ci8qIHZpbTp0cz00OnN0cz00OnN3PTQ6CiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgncGlsb3QvZXZlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvZXZlbnQnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiAgICBjb25zb2xlLndhcm4oIkRFUFJFQ0FURUQ6ICdwaWxvdC9ldmVudCcgaXMgZGVwcmVjYXRlZC4gVXNlICdhY2UvbGliL2V2ZW50JyBpbnN0ZWFkIik7CiAgICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoImFjZS9saWIvZXZlbnQiKTsKfSk7Ci8qIHZpbTp0cz00OnN0cz00OnN3PTQ6CiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgncGlsb3QvZXZlbnRfZW1pdHRlcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9ldmVudF9lbWl0dGVyJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewogICAgY29uc29sZS53YXJuKCJERVBSRUNBVEVEOiAncGlsb3QvZXZlbnRfZW1pdHRlcicgaXMgZGVwcmVjYXRlZC4gVXNlICdhY2UvbGliL2V2ZW50X2VtaXR0ZXInIGluc3RlYWQiKTsKICAgIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgiYWNlL2xpYi9ldmVudF9lbWl0dGVyIik7Cn0pOwovKiB2aW06dHM9NDpzdHM9NDpzdz00OgogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ3BpbG90L2ZpeG9sZGJyb3dzZXJzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2ZpeG9sZGJyb3dzZXJzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewogICAgY29uc29sZS53YXJuKCJERVBSRUNBVEVEOiAncGlsb3QvZml4b2xkYnJvd3NlcnMnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnYWNlL2xpYi9maXhvbGRicm93c2VycycgaW5zdGVhZCIpOwogICAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCJhY2UvbGliL2ZpeG9sZGJyb3dzZXJzIik7Cn0pOwovKiB2aW06dHM9NDpzdHM9NDpzdz00OgogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ3BpbG90L2tleXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIva2V5cyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKICAgIGNvbnNvbGUud2FybigiREVQUkVDQVRFRDogJ3BpbG90L2tleXMnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnYWNlL2xpYi9rZXlzJyBpbnN0ZWFkIik7CiAgICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoImFjZS9saWIva2V5cyIpOwp9KTsKLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoKICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdwaWxvdC9sYW5nJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2xhbmcnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiAgICBjb25zb2xlLndhcm4oIkRFUFJFQ0FURUQ6ICdwaWxvdC9sYW5nJyBpcyBkZXByZWNhdGVkLiBVc2UgJ2FjZS9saWIvbGFuZycgaW5zdGVhZCIpOwogICAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCJhY2UvbGliL2xhbmciKTsKfSk7Ci8qIHZpbTp0cz00OnN0cz00OnN3PTQ6CiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgncGlsb3Qvb29wJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKICAgIGNvbnNvbGUud2FybigiREVQUkVDQVRFRDogJ3BpbG90L29vcCcgaXMgZGVwcmVjYXRlZC4gVXNlICdhY2UvbGliL29vcCcgaW5zdGVhZCIpOwogICAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCJhY2UvbGliL29vcCIpOwp9KTsKLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoKICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdwaWxvdC91c2VyYWdlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvdXNlcmFnZW50J10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewogICAgY29uc29sZS53YXJuKCJERVBSRUNBVEVEOiAncGlsb3QvdXNlcmFnZW50JyBpcyBkZXByZWNhdGVkLiBVc2UgJ2FjZS9saWIvdXNlcmFnZW50JyBpbnN0ZWFkIik7CiAgICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoImFjZS9saWIvdXNlcmFnZW50Iik7Cn0pOwovKiB2aW06dHM9NDpzdHM9NDpzdz00OgogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ3BpbG90L2Nhbm9uJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKICAgIGNvbnNvbGUud2FybigiREVQUkVDQVRFRDogJ3BpbG90L2Nhbm9uJyBpcyBkZXByZWNhdGVkLiIpOwogICAgLy9yZXR1cm4gcmVxdWlyZSgiYWNlL2xpYi9kb20iKTsKICAgIAogICAgZXhwb3J0cy5hZGRDb21tYW5kID0gZnVuY3Rpb24oKSB7CiAgICAgICAgY29uc29sZS53YXJuKCJERVBSRUNBVEVEOiAnY2Fub24uYWRkQ29tbWFuZCgpJyBpcyBkZXByZWNhdGVkLiBVc2UgJ2VkaXRvci5jb21tYW5kcy5hZGRDb21tYW5kKGNvbW1hbmQpJyBpbnN0ZWFkLiIpOwogICAgICAgIGNvbnNvbGUudHJhY2UoKTsKICAgIH0KICAgIAogICAgZXhwb3J0cy5yZW1vdmVDb21tYW5kID0gZnVuY3Rpb24oKSB7CiAgICAgICAgY29uc29sZS53YXJuKCJERVBSRUNBVEVEOiAnY2Fub24ucmVtb3ZlQ29tbWFuZCgpJyBpcyBkZXByZWNhdGVkLiBVc2UgJ2VkaXRvci5jb21tYW5kcy5yZW1vdmVDb21tYW5kKGNvbW1hbmQpJyBpbnN0ZWFkLiIpOwogICAgICAgIGNvbnNvbGUudHJhY2UoKTsKICAgIH0KfSk7CjsKICAgICAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkKICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkoKTsKICAgICAgICA=]]></data>
	</file>
	<file>
	  <filename>/ace/src/ace-compat.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJwaWxvdC9pbmRleCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsInBpbG90L2Jyb3dzZXJfZm9jdXMiLCJwaWxvdC9kb20iLCJwaWxvdC9ldmVudCIsInBpbG90L2V2ZW50X2VtaXR0ZXIiLCJwaWxvdC9maXhvbGRicm93c2VycyIsInBpbG90L2tleXMiLCJwaWxvdC9sYW5nIiwicGlsb3Qvb29wIiwicGlsb3QvdXNlcmFnZW50IiwicGlsb3QvY2Fub24iXSxmdW5jdGlvbihhLGIsYyl7YSgicGlsb3QvYnJvd3Nlcl9mb2N1cyIpLGEoInBpbG90L2RvbSIpLGEoInBpbG90L2V2ZW50IiksYSgicGlsb3QvZXZlbnRfZW1pdHRlciIpLGEoInBpbG90L2ZpeG9sZGJyb3dzZXJzIiksYSgicGlsb3Qva2V5cyIpLGEoInBpbG90L2xhbmciKSxhKCJwaWxvdC9vb3AiKSxhKCJwaWxvdC91c2VyYWdlbnQiKSxhKCJwaWxvdC9jYW5vbiIpfSksZGVmaW5lKCJwaWxvdC9icm93c2VyX2ZvY3VzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9icm93c2VyX2ZvY3VzIl0sZnVuY3Rpb24oYSxiLGMpe2NvbnNvbGUud2FybigiREVQUkVDQVRFRDogJ3BpbG90L2Jyb3dzZXJfZm9jdXMnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnYWNlL2xpYi9icm93c2VyX2ZvY3VzJyBpbnN0ZWFkIiksYy5leHBvcnRzPWEoImFjZS9saWIvYnJvd3Nlcl9mb2N1cyIpfSksZGVmaW5lKCJwaWxvdC9kb20iLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGEsYixjKXtjb25zb2xlLndhcm4oIkRFUFJFQ0FURUQ6ICdwaWxvdC9kb20nIGlzIGRlcHJlY2F0ZWQuIFVzZSAnYWNlL2xpYi9kb20nIGluc3RlYWQiKSxjLmV4cG9ydHM9YSgiYWNlL2xpYi9kb20iKX0pLGRlZmluZSgicGlsb3QvZXZlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2V2ZW50Il0sZnVuY3Rpb24oYSxiLGMpe2NvbnNvbGUud2FybigiREVQUkVDQVRFRDogJ3BpbG90L2V2ZW50JyBpcyBkZXByZWNhdGVkLiBVc2UgJ2FjZS9saWIvZXZlbnQnIGluc3RlYWQiKSxjLmV4cG9ydHM9YSgiYWNlL2xpYi9ldmVudCIpfSksZGVmaW5lKCJwaWxvdC9ldmVudF9lbWl0dGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIl0sZnVuY3Rpb24oYSxiLGMpe2NvbnNvbGUud2FybigiREVQUkVDQVRFRDogJ3BpbG90L2V2ZW50X2VtaXR0ZXInIGlzIGRlcHJlY2F0ZWQuIFVzZSAnYWNlL2xpYi9ldmVudF9lbWl0dGVyJyBpbnN0ZWFkIiksYy5leHBvcnRzPWEoImFjZS9saWIvZXZlbnRfZW1pdHRlciIpfSksZGVmaW5lKCJwaWxvdC9maXhvbGRicm93c2VycyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZml4b2xkYnJvd3NlcnMiXSxmdW5jdGlvbihhLGIsYyl7Y29uc29sZS53YXJuKCJERVBSRUNBVEVEOiAncGlsb3QvZml4b2xkYnJvd3NlcnMnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnYWNlL2xpYi9maXhvbGRicm93c2VycycgaW5zdGVhZCIpLGMuZXhwb3J0cz1hKCJhY2UvbGliL2ZpeG9sZGJyb3dzZXJzIil9KSxkZWZpbmUoInBpbG90L2tleXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2tleXMiXSxmdW5jdGlvbihhLGIsYyl7Y29uc29sZS53YXJuKCJERVBSRUNBVEVEOiAncGlsb3Qva2V5cycgaXMgZGVwcmVjYXRlZC4gVXNlICdhY2UvbGliL2tleXMnIGluc3RlYWQiKSxjLmV4cG9ydHM9YSgiYWNlL2xpYi9rZXlzIil9KSxkZWZpbmUoInBpbG90L2xhbmciLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2xhbmciXSxmdW5jdGlvbihhLGIsYyl7Y29uc29sZS53YXJuKCJERVBSRUNBVEVEOiAncGlsb3QvbGFuZycgaXMgZGVwcmVjYXRlZC4gVXNlICdhY2UvbGliL2xhbmcnIGluc3RlYWQiKSxjLmV4cG9ydHM9YSgiYWNlL2xpYi9sYW5nIil9KSxkZWZpbmUoInBpbG90L29vcCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIl0sZnVuY3Rpb24oYSxiLGMpe2NvbnNvbGUud2FybigiREVQUkVDQVRFRDogJ3BpbG90L29vcCcgaXMgZGVwcmVjYXRlZC4gVXNlICdhY2UvbGliL29vcCcgaW5zdGVhZCIpLGMuZXhwb3J0cz1hKCJhY2UvbGliL29vcCIpfSksZGVmaW5lKCJwaWxvdC91c2VyYWdlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL3VzZXJhZ2VudCJdLGZ1bmN0aW9uKGEsYixjKXtjb25zb2xlLndhcm4oIkRFUFJFQ0FURUQ6ICdwaWxvdC91c2VyYWdlbnQnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnYWNlL2xpYi91c2VyYWdlbnQnIGluc3RlYWQiKSxjLmV4cG9ydHM9YSgiYWNlL2xpYi91c2VyYWdlbnQiKX0pLGRlZmluZSgicGlsb3QvY2Fub24iLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7Y29uc29sZS53YXJuKCJERVBSRUNBVEVEOiAncGlsb3QvY2Fub24nIGlzIGRlcHJlY2F0ZWQuIiksYi5hZGRDb21tYW5kPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJERVBSRUNBVEVEOiAnY2Fub24uYWRkQ29tbWFuZCgpJyBpcyBkZXByZWNhdGVkLiBVc2UgJ2VkaXRvci5jb21tYW5kcy5hZGRDb21tYW5kKGNvbW1hbmQpJyBpbnN0ZWFkLiIpLGNvbnNvbGUudHJhY2UoKX0sYi5yZW1vdmVDb21tYW5kPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJERVBSRUNBVEVEOiAnY2Fub24ucmVtb3ZlQ29tbWFuZCgpJyBpcyBkZXByZWNhdGVkLiBVc2UgJ2VkaXRvci5jb21tYW5kcy5yZW1vdmVDb21tYW5kKGNvbW1hbmQpJyBpbnN0ZWFkLiIpLGNvbnNvbGUudHJhY2UoKX19KSxmdW5jdGlvbigpe3dpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLGZ1bmN0aW9uKGEpe3dpbmRvdy5hY2V8fCh3aW5kb3cuYWNlPXt9KTtmb3IodmFyIGIgaW4gYSlhLmhhc093blByb3BlcnR5KGIpJiYoYWNlW2JdPWFbYl0pfSl9KCk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/ace-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKLyoqCiAqIERlZmluZSBhIG1vZHVsZSBhbG9uZyB3aXRoIGEgcGF5bG9hZAogKiBAcGFyYW0gbW9kdWxlIGEgbmFtZSBmb3IgdGhlIHBheWxvYWQKICogQHBhcmFtIHBheWxvYWQgYSBmdW5jdGlvbiB0byBjYWxsIHdpdGggKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgcGFyYW1zCiAqLwogCihmdW5jdGlvbigpIHsKCnZhciBBQ0VfTkFNRVNQQUNFID0gIiI7Cgp2YXIgZ2xvYmFsID0gKGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXM7Cn0pKCk7CgppZiAodHlwZW9mIHJlcXVpcmVqcyAhPT0gInVuZGVmaW5lZCIpCiAgICByZXR1cm47Cgp2YXIgX2RlZmluZSA9IGZ1bmN0aW9uKG1vZHVsZSwgZGVwcywgcGF5bG9hZCkgewogICAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICdzdHJpbmcnKSB7CiAgICAgICAgaWYgKF9kZWZpbmUub3JpZ2luYWwpCiAgICAgICAgICAgIF9kZWZpbmUub3JpZ2luYWwuYXBwbHkod2luZG93LCBhcmd1bWVudHMpOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCdkcm9wcGluZyBtb2R1bGUgYmVjYXVzZSBkZWZpbmUgd2FzblwndCBhIHN0cmluZy4nKTsKICAgICAgICAgICAgY29uc29sZS50cmFjZSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikKICAgICAgICBwYXlsb2FkID0gZGVwczsKCiAgICBpZiAoIV9kZWZpbmUubW9kdWxlcykKICAgICAgICBfZGVmaW5lLm1vZHVsZXMgPSB7fTsKICAgICAgICAKICAgIF9kZWZpbmUubW9kdWxlc1ttb2R1bGVdID0gcGF5bG9hZDsKfTsKCi8qKgogKiBHZXQgYXQgZnVuY3Rpb25hbGl0eSBkZWZpbmUoKWVkIHVzaW5nIHRoZSBmdW5jdGlvbiBhYm92ZQogKi8KdmFyIF9yZXF1aXJlID0gZnVuY3Rpb24ocGFyZW50SWQsIG1vZHVsZSwgY2FsbGJhY2spIHsKICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobW9kdWxlKSA9PT0gIltvYmplY3QgQXJyYXldIikgewogICAgICAgIHZhciBwYXJhbXMgPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG1vZHVsZS5sZW5ndGg7IGkgPCBsOyArK2kpIHsKICAgICAgICAgICAgdmFyIGRlcCA9IGxvb2t1cChwYXJlbnRJZCwgbW9kdWxlW2ldKTsKICAgICAgICAgICAgaWYgKCFkZXAgJiYgX3JlcXVpcmUub3JpZ2luYWwpCiAgICAgICAgICAgICAgICByZXR1cm4gX3JlcXVpcmUub3JpZ2luYWwuYXBwbHkod2luZG93LCBhcmd1bWVudHMpOwogICAgICAgICAgICBwYXJhbXMucHVzaChkZXApOwogICAgICAgIH0KICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgcGFyYW1zKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmICh0eXBlb2YgbW9kdWxlID09PSAnc3RyaW5nJykgewogICAgICAgIHZhciBwYXlsb2FkID0gbG9va3VwKHBhcmVudElkLCBtb2R1bGUpOwogICAgICAgIGlmICghcGF5bG9hZCAmJiBfcmVxdWlyZS5vcmlnaW5hbCkKICAgICAgICAgICAgcmV0dXJuIF9yZXF1aXJlLm9yaWdpbmFsLmFwcGx5KHdpbmRvdywgYXJndW1lbnRzKTsKICAgICAgICAKICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9CiAgICAKICAgICAgICByZXR1cm4gcGF5bG9hZDsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGlmIChfcmVxdWlyZS5vcmlnaW5hbCkKICAgICAgICAgICAgcmV0dXJuIF9yZXF1aXJlLm9yaWdpbmFsLmFwcGx5KHdpbmRvdywgYXJndW1lbnRzKTsKICAgIH0KfTsKCnZhciBub3JtYWxpemVNb2R1bGUgPSBmdW5jdGlvbihwYXJlbnRJZCwgbW9kdWxlTmFtZSkgewogICAgLy8gbm9ybWFsaXplIHBsdWdpbiByZXF1aXJlcwogICAgaWYgKG1vZHVsZU5hbWUuaW5kZXhPZigiISIpICE9PSAtMSkgewogICAgICAgIHZhciBjaHVua3MgPSBtb2R1bGVOYW1lLnNwbGl0KCIhIik7CiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZU1vZHVsZShwYXJlbnRJZCwgY2h1bmtzWzBdKSArICIhIiArIG5vcm1hbGl6ZU1vZHVsZShwYXJlbnRJZCwgY2h1bmtzWzFdKTsKICAgIH0KICAgIC8vIG5vcm1hbGl6ZSByZWxhdGl2ZSByZXF1aXJlcwogICAgaWYgKG1vZHVsZU5hbWUuY2hhckF0KDApID09ICIuIikgewogICAgICAgIHZhciBiYXNlID0gcGFyZW50SWQuc3BsaXQoIi8iKS5zbGljZSgwLCAtMSkuam9pbigiLyIpOwogICAgICAgIG1vZHVsZU5hbWUgPSBiYXNlICsgIi8iICsgbW9kdWxlTmFtZTsKICAgICAgICAKICAgICAgICB3aGlsZShtb2R1bGVOYW1lLmluZGV4T2YoIi4iKSAhPT0gLTEgJiYgcHJldmlvdXMgIT0gbW9kdWxlTmFtZSkgewogICAgICAgICAgICB2YXIgcHJldmlvdXMgPSBtb2R1bGVOYW1lOwogICAgICAgICAgICBtb2R1bGVOYW1lID0gbW9kdWxlTmFtZS5yZXBsYWNlKC9cL1wuXC8vLCAiLyIpLnJlcGxhY2UoL1teXC9dK1wvXC5cLlwvLywgIiIpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgcmV0dXJuIG1vZHVsZU5hbWU7Cn07CgovKioKICogSW50ZXJuYWwgZnVuY3Rpb24gdG8gbG9va3VwIG1vZHVsZU5hbWVzIGFuZCByZXNvbHZlIHRoZW0gYnkgY2FsbGluZyB0aGUKICogZGVmaW5pdGlvbiBmdW5jdGlvbiBpZiBuZWVkZWQuCiAqLwp2YXIgbG9va3VwID0gZnVuY3Rpb24ocGFyZW50SWQsIG1vZHVsZU5hbWUpIHsKCiAgICBtb2R1bGVOYW1lID0gbm9ybWFsaXplTW9kdWxlKHBhcmVudElkLCBtb2R1bGVOYW1lKTsKCiAgICB2YXIgbW9kdWxlID0gX2RlZmluZS5tb2R1bGVzW21vZHVsZU5hbWVdOwogICAgaWYgKCFtb2R1bGUpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBpZiAodHlwZW9mIG1vZHVsZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIHZhciBleHBvcnRzID0ge307CiAgICAgICAgdmFyIG1vZCA9IHsKICAgICAgICAgICAgaWQ6IG1vZHVsZU5hbWUsIAogICAgICAgICAgICB1cmk6ICcnLAogICAgICAgICAgICBleHBvcnRzOiBleHBvcnRzLAogICAgICAgICAgICBwYWNrYWdlZDogdHJ1ZQogICAgICAgIH07CiAgICAgICAgCiAgICAgICAgdmFyIHJlcSA9IGZ1bmN0aW9uKG1vZHVsZSwgY2FsbGJhY2spIHsKICAgICAgICAgICAgcmV0dXJuIF9yZXF1aXJlKG1vZHVsZU5hbWUsIG1vZHVsZSwgY2FsbGJhY2spOwogICAgICAgIH07CiAgICAgICAgCiAgICAgICAgdmFyIHJldHVyblZhbHVlID0gbW9kdWxlKHJlcSwgZXhwb3J0cywgbW9kKTsKICAgICAgICBleHBvcnRzID0gcmV0dXJuVmFsdWUgfHwgbW9kLmV4cG9ydHM7CiAgICAgICAgICAgIAogICAgICAgIC8vIGNhY2hlIHRoZSByZXN1bHRpbmcgbW9kdWxlIG9iamVjdCBmb3IgbmV4dCB0aW1lCiAgICAgICAgX2RlZmluZS5tb2R1bGVzW21vZHVsZU5hbWVdID0gZXhwb3J0czsKICAgICAgICByZXR1cm4gZXhwb3J0czsKICAgIH0KCiAgICByZXR1cm4gbW9kdWxlOwp9OwoKZnVuY3Rpb24gZXhwb3J0QWNlKG5zKSB7CiAgICB2YXIgcmVxdWlyZSA9IGZ1bmN0aW9uKG1vZHVsZSwgY2FsbGJhY2spIHsKICAgICAgICByZXR1cm4gX3JlcXVpcmUoIiIsIG1vZHVsZSwgY2FsbGJhY2spOwogICAgfTsKICAgIHJlcXVpcmUucGFja2FnZWQgPSB0cnVlOwogICAgCiAgICB2YXIgcm9vdCA9IGdsb2JhbDsKICAgIGlmIChucykgewogICAgICAgIGlmICghZ2xvYmFsW25zXSkKICAgICAgICAgICAgZ2xvYmFsW25zXSA9IHt9OwogICAgICAgIHJvb3QgPSBnbG9iYWxbbnNdOwogICAgfQogICAgICAgIAogICAgaWYgKHJvb3QuZGVmaW5lKQogICAgICAgIF9kZWZpbmUub3JpZ2luYWwgPSByb290LmRlZmluZTsKICAgIAogICAgcm9vdC5kZWZpbmUgPSBfZGVmaW5lOwoKICAgIGlmIChyb290LnJlcXVpcmUpCiAgICAgICAgX3JlcXVpcmUub3JpZ2luYWwgPSByb290LnJlcXVpcmU7CiAgICAKICAgIHJvb3QucmVxdWlyZSA9IHJlcXVpcmU7Cn0KCmV4cG9ydEFjZShBQ0VfTkFNRVNQQUNFKTsKCn0pKCk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBTa3l3cml0ZXIuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBNb3ppbGxhLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDA5CiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgS2V2aW4gRGFuZ29vciAoa2Rhbmdvb3JAbW96aWxsYS5jb20pCiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9hY2UnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvZml4b2xkYnJvd3NlcnMnLCAnYWNlL2xpYi9kb20nLCAnYWNlL2xpYi9ldmVudCcsICdhY2UvZWRpdG9yJywgJ2FjZS9lZGl0X3Nlc3Npb24nLCAnYWNlL3VuZG9tYW5hZ2VyJywgJ2FjZS92aXJ0dWFsX3JlbmRlcmVyJywgJ2FjZS90aGVtZS90ZXh0bWF0ZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKcmVxdWlyZSgiLi9saWIvZml4b2xkYnJvd3NlcnMiKTsKCnZhciBEb20gPSByZXF1aXJlKCIuL2xpYi9kb20iKTsKdmFyIEV2ZW50ID0gcmVxdWlyZSgiLi9saWIvZXZlbnQiKTsKCnZhciBFZGl0b3IgPSByZXF1aXJlKCIuL2VkaXRvciIpLkVkaXRvcjsKdmFyIEVkaXRTZXNzaW9uID0gcmVxdWlyZSgiLi9lZGl0X3Nlc3Npb24iKS5FZGl0U2Vzc2lvbjsKdmFyIFVuZG9NYW5hZ2VyID0gcmVxdWlyZSgiLi91bmRvbWFuYWdlciIpLlVuZG9NYW5hZ2VyOwp2YXIgUmVuZGVyZXIgPSByZXF1aXJlKCIuL3ZpcnR1YWxfcmVuZGVyZXIiKS5WaXJ0dWFsUmVuZGVyZXI7CgpleHBvcnRzLmVkaXQgPSBmdW5jdGlvbihlbCkgewogICAgaWYgKHR5cGVvZihlbCkgPT0gInN0cmluZyIpIHsKICAgICAgICBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsKTsKICAgIH0KCiAgICB2YXIgZG9jID0gbmV3IEVkaXRTZXNzaW9uKERvbS5nZXRJbm5lclRleHQoZWwpKTsKICAgIGRvYy5zZXRVbmRvTWFuYWdlcihuZXcgVW5kb01hbmFnZXIoKSk7CiAgICBlbC5pbm5lckhUTUwgPSAnJzsKCiAgICB2YXIgZWRpdG9yID0gbmV3IEVkaXRvcihuZXcgUmVuZGVyZXIoZWwsIHJlcXVpcmUoIi4vdGhlbWUvdGV4dG1hdGUiKSkpOwogICAgZWRpdG9yLnNldFNlc3Npb24oZG9jKTsKCiAgICB2YXIgZW52ID0ge307CiAgICBlbnYuZG9jdW1lbnQgPSBkb2M7CiAgICBlbnYuZWRpdG9yID0gZWRpdG9yOwogICAgZWRpdG9yLnJlc2l6ZSgpOwogICAgRXZlbnQuYWRkTGlzdGVuZXIod2luZG93LCAicmVzaXplIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgZWRpdG9yLnJlc2l6ZSgpOwogICAgfSk7CiAgICBlbC5lbnYgPSBlbnY7CiAgICAvLyBTdG9yZSBlbnYgb24gZWRpdG9yIHN1Y2ggdGhhdCBpdCBjYW4gYmUgYWNjZXNzZWQgbGF0ZXIgb24gZnJvbQogICAgLy8gdGhlIHJldHVybmVkIG9iamVjdC4KICAgIGVkaXRvci5lbnYgPSBlbnY7CiAgICByZXR1cm4gZWRpdG9yOwp9OwoKfSk7Ly8gdmltOnNldCB0cz00IHN0cz00IHN3PTQgc3Q6Ci8vIC0tIGtyaXNrb3dhbCBLcmlzIEtvd2FsIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1JVCBMaWNlbnNlCi8vIC0tIHRscm9iaW5zb24gVG9tIFJvYmluc29uIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1JVCBMaWNlbnNlIChOYXJ3aGFsIFByb2plY3QpCi8vIC0tIGRhbnRtYW4gRGFuaWVsIEZyaWVzZW4gQ29weXJpZ2h0KEMpIDIwMTAgWFhYIE5vIExpY2Vuc2UgU3BlY2lmaWVkCi8vIC0tIGZzY2hhZWZlciBGbG9yaWFuIFNjaMOkZmVyIENvcHlyaWdodCAoQykgMjAxMCBNSVQgTGljZW5zZQovLyAtLSBJcmFrbGkgR296YWxpc2h2aWxpIENvcHlyaWdodCAoQykgMjAxMCBNSVQgTGljZW5zZQoKLyohCiAgICBDb3B5cmlnaHQgKGMpIDIwMDksIDI4MCBOb3J0aCBJbmMuIGh0dHA6Ly8yODBub3J0aC5jb20vCiAgICBNSVQgTGljZW5zZS4gaHR0cDovL2dpdGh1Yi5jb20vMjgwbm9ydGgvbmFyd2hhbC9ibG9iL21hc3Rlci9SRUFETUUubWQKKi8KCmRlZmluZSgnYWNlL2xpYi9maXhvbGRicm93c2VycycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9yZWdleHAnLCAnYWNlL2xpYi9lczUtc2hpbSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKcmVxdWlyZSgiLi9yZWdleHAiKTsKcmVxdWlyZSgiLi9lczUtc2hpbSIpOwoKfSk7LyoqCiAqICBCYXNlZCBvbiBjb2RlIGZyb206CiAqCiAqIFhSZWdFeHAgMS41LjAKICogKGMpIDIwMDctMjAxMCBTdGV2ZW4gTGV2aXRoYW4KICogTUlUIExpY2Vuc2UKICogPGh0dHA6Ly94cmVnZXhwLmNvbT4KICogUHJvdmlkZXMgYW4gYXVnbWVudGVkLCBleHRlbnNpYmxlLCBjcm9zcy1icm93c2VyIGltcGxlbWVudGF0aW9uIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMsCiAqIGluY2x1ZGluZyBzdXBwb3J0IGZvciBhZGRpdGlvbmFsIHN5bnRheCwgZmxhZ3MsIGFuZCBtZXRob2RzCiAqLwogCmRlZmluZSgnYWNlL2xpYi9yZWdleHAnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7CgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vICBQcml2YXRlIHZhcmlhYmxlcwogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICB2YXIgcmVhbCA9IHsKICAgICAgICAgICAgZXhlYzogUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICAgICB0ZXN0OiBSZWdFeHAucHJvdG90eXBlLnRlc3QsCiAgICAgICAgICAgIG1hdGNoOiBTdHJpbmcucHJvdG90eXBlLm1hdGNoLAogICAgICAgICAgICByZXBsYWNlOiBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2UsCiAgICAgICAgICAgIHNwbGl0OiBTdHJpbmcucHJvdG90eXBlLnNwbGl0CiAgICAgICAgfSwKICAgICAgICBjb21wbGlhbnRFeGVjTnBjZyA9IHJlYWwuZXhlYy5jYWxsKC8oKT8/LywgIiIpWzFdID09PSB1bmRlZmluZWQsIC8vIGNoZWNrIGBleGVjYCBoYW5kbGluZyBvZiBub25wYXJ0aWNpcGF0aW5nIGNhcHR1cmluZyBncm91cHMKICAgICAgICBjb21wbGlhbnRMYXN0SW5kZXhJbmNyZW1lbnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciB4ID0gL14vZzsKICAgICAgICAgICAgcmVhbC50ZXN0LmNhbGwoeCwgIiIpOwogICAgICAgICAgICByZXR1cm4gIXgubGFzdEluZGV4OwogICAgICAgIH0oKTsKCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gIE92ZXJyaWRlbiBuYXRpdmUgbWV0aG9kcwogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAvLyBBZGRzIG5hbWVkIGNhcHR1cmUgc3VwcG9ydCAod2l0aCBiYWNrcmVmZXJlbmNlcyByZXR1cm5lZCBhcyBgcmVzdWx0Lm5hbWVgKSwgYW5kIGZpeGVzIHR3bwogICAgLy8gY3Jvc3MtYnJvd3NlciBpc3N1ZXMgcGVyIEVTMzoKICAgIC8vIC0gQ2FwdHVyZWQgdmFsdWVzIGZvciBub25wYXJ0aWNpcGF0aW5nIGNhcHR1cmluZyBncm91cHMgc2hvdWxkIGJlIHJldHVybmVkIGFzIGB1bmRlZmluZWRgLAogICAgLy8gICByYXRoZXIgdGhhbiB0aGUgZW1wdHkgc3RyaW5nLgogICAgLy8gLSBgbGFzdEluZGV4YCBzaG91bGQgbm90IGJlIGluY3JlbWVudGVkIGFmdGVyIHplcm8tbGVuZ3RoIG1hdGNoZXMuCiAgICBSZWdFeHAucHJvdG90eXBlLmV4ZWMgPSBmdW5jdGlvbiAoc3RyKSB7CiAgICAgICAgdmFyIG1hdGNoID0gcmVhbC5leGVjLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksCiAgICAgICAgICAgIG5hbWUsIHIyOwogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICAvLyBGaXggYnJvd3NlcnMgd2hvc2UgYGV4ZWNgIG1ldGhvZHMgZG9uJ3QgY29uc2lzdGVudGx5IHJldHVybiBgdW5kZWZpbmVkYCBmb3IKICAgICAgICAgICAgLy8gbm9ucGFydGljaXBhdGluZyBjYXB0dXJpbmcgZ3JvdXBzCiAgICAgICAgICAgIGlmICghY29tcGxpYW50RXhlY05wY2cgJiYgbWF0Y2gubGVuZ3RoID4gMSAmJiBpbmRleE9mKG1hdGNoLCAiIikgPiAtMSkgewogICAgICAgICAgICAgICAgcjIgPSBSZWdFeHAodGhpcy5zb3VyY2UsIHJlYWwucmVwbGFjZS5jYWxsKGdldE5hdGl2ZUZsYWdzKHRoaXMpLCAiZyIsICIiKSk7CiAgICAgICAgICAgICAgICAvLyBVc2luZyBgc3RyLnNsaWNlKG1hdGNoLmluZGV4KWAgcmF0aGVyIHRoYW4gYG1hdGNoWzBdYCBpbiBjYXNlIGxvb2thaGVhZCBhbGxvd2VkCiAgICAgICAgICAgICAgICAvLyBtYXRjaGluZyBkdWUgdG8gY2hhcmFjdGVycyBvdXRzaWRlIHRoZSBtYXRjaAogICAgICAgICAgICAgICAgcmVhbC5yZXBsYWNlLmNhbGwoc3RyLnNsaWNlKG1hdGNoLmluZGV4KSwgcjIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAyOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50c1tpXSA9PT0gdW5kZWZpbmVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbaV0gPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQXR0YWNoIG5hbWVkIGNhcHR1cmUgcHJvcGVydGllcwogICAgICAgICAgICBpZiAodGhpcy5feHJlZ2V4cCAmJiB0aGlzLl94cmVnZXhwLmNhcHR1cmVOYW1lcykgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBtYXRjaC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIG5hbWUgPSB0aGlzLl94cmVnZXhwLmNhcHR1cmVOYW1lc1tpIC0gMV07CiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbbmFtZV0gPSBtYXRjaFtpXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBGaXggYnJvd3NlcnMgdGhhdCBpbmNyZW1lbnQgYGxhc3RJbmRleGAgYWZ0ZXIgemVyby1sZW5ndGggbWF0Y2hlcwogICAgICAgICAgICBpZiAoIWNvbXBsaWFudExhc3RJbmRleEluY3JlbWVudCAmJiB0aGlzLmdsb2JhbCAmJiAhbWF0Y2hbMF0ubGVuZ3RoICYmICh0aGlzLmxhc3RJbmRleCA+IG1hdGNoLmluZGV4KSkKICAgICAgICAgICAgICAgIHRoaXMubGFzdEluZGV4LS07CiAgICAgICAgfQogICAgICAgIHJldHVybiBtYXRjaDsKICAgIH07CgogICAgLy8gRG9uJ3Qgb3ZlcnJpZGUgYHRlc3RgIGlmIGl0IHdvbid0IGNoYW5nZSBhbnl0aGluZwogICAgaWYgKCFjb21wbGlhbnRMYXN0SW5kZXhJbmNyZW1lbnQpIHsKICAgICAgICAvLyBGaXggYnJvd3NlciBidWcgaW4gbmF0aXZlIG1ldGhvZAogICAgICAgIFJlZ0V4cC5wcm90b3R5cGUudGVzdCA9IGZ1bmN0aW9uIChzdHIpIHsKICAgICAgICAgICAgLy8gVXNlIHRoZSBuYXRpdmUgYGV4ZWNgIHRvIHNraXAgc29tZSBwcm9jZXNzaW5nIG92ZXJoZWFkLCBldmVuIHRob3VnaCB0aGUgb3ZlcnJpZGVuCiAgICAgICAgICAgIC8vIGBleGVjYCB3b3VsZCB0YWtlIGNhcmUgb2YgdGhlIGBsYXN0SW5kZXhgIGZpeAogICAgICAgICAgICB2YXIgbWF0Y2ggPSByZWFsLmV4ZWMuY2FsbCh0aGlzLCBzdHIpOwogICAgICAgICAgICAvLyBGaXggYnJvd3NlcnMgdGhhdCBpbmNyZW1lbnQgYGxhc3RJbmRleGAgYWZ0ZXIgemVyby1sZW5ndGggbWF0Y2hlcwogICAgICAgICAgICBpZiAobWF0Y2ggJiYgdGhpcy5nbG9iYWwgJiYgIW1hdGNoWzBdLmxlbmd0aCAmJiAodGhpcy5sYXN0SW5kZXggPiBtYXRjaC5pbmRleCkpCiAgICAgICAgICAgICAgICB0aGlzLmxhc3RJbmRleC0tOwogICAgICAgICAgICByZXR1cm4gISFtYXRjaDsKICAgICAgICB9OwogICAgfQoKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyAgUHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb25zCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIGZ1bmN0aW9uIGdldE5hdGl2ZUZsYWdzIChyZWdleCkgewogICAgICAgIHJldHVybiAocmVnZXguZ2xvYmFsICAgICA/ICJnIiA6ICIiKSArCiAgICAgICAgICAgICAgIChyZWdleC5pZ25vcmVDYXNlID8gImkiIDogIiIpICsKICAgICAgICAgICAgICAgKHJlZ2V4Lm11bHRpbGluZSAgPyAibSIgOiAiIikgKwogICAgICAgICAgICAgICAocmVnZXguZXh0ZW5kZWQgICA/ICJ4IiA6ICIiKSArIC8vIFByb3Bvc2VkIGZvciBFUzQ7IGluY2x1ZGVkIGluIEFTMwogICAgICAgICAgICAgICAocmVnZXguc3RpY2t5ICAgICA/ICJ5IiA6ICIiKTsKICAgIH07CgogICAgZnVuY3Rpb24gaW5kZXhPZiAoYXJyYXksIGl0ZW0sIGZyb20pIHsKICAgICAgICBpZiAoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpIC8vIFVzZSB0aGUgbmF0aXZlIGFycmF5IG1ldGhvZCBpZiBhdmFpbGFibGUKICAgICAgICAgICAgcmV0dXJuIGFycmF5LmluZGV4T2YoaXRlbSwgZnJvbSk7CiAgICAgICAgZm9yICh2YXIgaSA9IGZyb20gfHwgMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChhcnJheVtpXSA9PT0gaXRlbSkKICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gLTE7CiAgICB9OwoKfSk7Ly8gdmltOiB0cz00IHN0cz00IHN3PTQgZXhwYW5kdGFiCi8vIC0tIGtyaXNrb3dhbCBLcmlzIEtvd2FsIENvcHlyaWdodCAoQykgMjAwOS0yMDExIE1JVCBMaWNlbnNlCi8vIC0tIHRscm9iaW5zb24gVG9tIFJvYmluc29uIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1JVCBMaWNlbnNlIChOYXJ3aGFsIFByb2plY3QpCi8vIC0tIGRhbnRtYW4gRGFuaWVsIEZyaWVzZW4gQ29weXJpZ2h0IChDKSAyMDEwIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBCi8vIC0tIGZzY2hhZWZlciBGbG9yaWFuIFNjaMOkZmVyIENvcHlyaWdodCAoQykgMjAxMCBNSVQgTGljZW5zZQovLyAtLSBHb3phbGEgSXJha2xpIEdvemFsaXNodmlsaSBDb3B5cmlnaHQgKEMpIDIwMTAgTUlUIExpY2Vuc2UKLy8gLS0ga2l0Y2FtYnJpZGdlIEtpdCBDYW1icmlkZ2UgQ29weXJpZ2h0IChDKSAyMDExIE1JVCBMaWNlbnNlCi8vIC0tIGtvc3Nub2NvcnAgU2FzaGEgS29zcyBYWFggVE9ETyBMaWNlbnNlIG9yIENMQQovLyAtLSBicnlhbmZvcmJlcyBCcnlhbiBGb3JiZXMgWFhYIFRPRE8gTGljZW5zZSBvciBDTEEKLy8gLS0ga2lsbGRyZWFtIFF1aWxkcmVlbiBNb3R0YSBDb3B5cmlnaHQgKEMpIDIwMTEgTUlUIExpY2VuY2UKLy8gLS0gbWljaGFlbGZpY2FycmEgTWljaGFlbCBGaWNhcnJhIENvcHlyaWdodCAoQykgMjAxMSAzLWNsYXVzZSBCU0QgTGljZW5zZQovLyAtLSBzaGFya2JyYWluZ3V5IEdlcmFyZCBQYWFwdSBDb3B5cmlnaHQgKEMpIDIwMTEgTUlUIExpY2Vuc2UKLy8gLS0gYmJxc3JjIEJyZW5kYW4gTW9sbG95IChDKSAyMDExIENyZWF0aXZlIENvbW1vbnMgWmVybyAocHVibGljIGRvbWFpbikKLy8gLS0gaXd5ZyBYWFggVE9ETyBMaWNlbnNlIG9yIENMQQovLyAtLSBEb21lbmljRGVuaWNvbGEgRG9tZW5pYyBEZW5pY29sYSBDb3B5cmlnaHQgKEMpIDIwMTEgTUlUIExpY2Vuc2UKLy8gLS0geGF2aWVybTAyIE1vbnRpbGxldCBYYXZpZXIgWFhYIFRPRE8gTGljZW5zZSBvciBDTEEKLy8gLS0gUmF5bm9zIFJheW5vcyBYWFggVE9ETyBMaWNlbnNlIG9yIENMQQovLyAtLSBzYW1zb25qcyBTYW1pIFNhbWh1cmkgQ29weXJpZ2h0IChDKSAyMDEwIE1JVCBMaWNlbnNlCi8vIC0tIHJ3bGRybiBSaWNrIFdhbGRyb24gQ29weXJpZ2h0IChDKSAyMDExIE1JVCBMaWNlbnNlCi8vIC0tIGxleGVyIEFsZXhleSBaYWtoYXJvdiBYWFggVE9ETyBMaWNlbnNlIG9yIENMQQoKLyohCiAgICBDb3B5cmlnaHQgKGMpIDIwMDksIDI4MCBOb3J0aCBJbmMuIGh0dHA6Ly8yODBub3J0aC5jb20vCiAgICBNSVQgTGljZW5zZS4gaHR0cDovL2dpdGh1Yi5jb20vMjgwbm9ydGgvbmFyd2hhbC9ibG9iL21hc3Rlci9SRUFETUUubWQKKi8KCmRlZmluZSgnYWNlL2xpYi9lczUtc2hpbScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CgovKioKICogQnJpbmdzIGFuIGVudmlyb25tZW50IGFzIGNsb3NlIHRvIEVDTUFTY3JpcHQgNSBjb21wbGlhbmNlCiAqIGFzIGlzIHBvc3NpYmxlIHdpdGggdGhlIGZhY2lsaXRpZXMgb2YgZXJzdHdoaWxlIGVuZ2luZXMuCiAqCiAqIEFubm90YXRlZCBFUzU6IGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8gKHNwZWNpZmljIGxpbmtzIGJlbG93KQogKiBFUzUgU3BlYzogaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL3B1YmxpY2F0aW9ucy9maWxlcy9FQ01BLVNUL0VjbWEtMjYyLnBkZgogKgogKiBAbW9kdWxlCiAqLwoKLyp3aGF0c3VwZG9jKi8KCi8vCi8vIEZ1bmN0aW9uCi8vID09PT09PT09Ci8vCgovLyBFUy01IDE1LjMuNC41Ci8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjMuNC41CgppZiAoIUZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kKSB7CiAgICBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uIGJpbmQodGhhdCkgeyAvLyAubGVuZ3RoIGlzIDEKICAgICAgICAvLyAxLiBMZXQgVGFyZ2V0IGJlIHRoZSB0aGlzIHZhbHVlLgogICAgICAgIHZhciB0YXJnZXQgPSB0aGlzOwogICAgICAgIC8vIDIuIElmIElzQ2FsbGFibGUoVGFyZ2V0KSBpcyBmYWxzZSwgdGhyb3cgYSBUeXBlRXJyb3IgZXhjZXB0aW9uLgogICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9ICJmdW5jdGlvbiIpCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlCiAgICAgICAgLy8gMy4gTGV0IEEgYmUgYSBuZXcgKHBvc3NpYmx5IGVtcHR5KSBpbnRlcm5hbCBsaXN0IG9mIGFsbCBvZiB0aGUKICAgICAgICAvLyAgIGFyZ3VtZW50IHZhbHVlcyBwcm92aWRlZCBhZnRlciB0aGlzQXJnIChhcmcxLCBhcmcyIGV0YyksIGluIG9yZGVyLgogICAgICAgIC8vIFhYWCBzbGljZWRBcmdzIHdpbGwgc3RhbmQgaW4gZm9yICJBIiBpZiB1c2VkCiAgICAgICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7IC8vIGZvciBub3JtYWwgY2FsbAogICAgICAgIC8vIDQuIExldCBGIGJlIGEgbmV3IG5hdGl2ZSBFQ01BU2NyaXB0IG9iamVjdC4KICAgICAgICAvLyAxMS4gU2V0IHRoZSBbW1Byb3RvdHlwZV1dIGludGVybmFsIHByb3BlcnR5IG9mIEYgdG8gdGhlIHN0YW5kYXJkCiAgICAgICAgLy8gICBidWlsdC1pbiBGdW5jdGlvbiBwcm90b3R5cGUgb2JqZWN0IGFzIHNwZWNpZmllZCBpbiAxNS4zLjMuMS4KICAgICAgICAvLyAxMi4gU2V0IHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIGFzIGRlc2NyaWJlZCBpbgogICAgICAgIC8vICAgMTUuMy40LjUuMS4KICAgICAgICAvLyAxMy4gU2V0IHRoZSBbW0NvbnN0cnVjdF1dIGludGVybmFsIHByb3BlcnR5IG9mIEYgYXMgZGVzY3JpYmVkIGluCiAgICAgICAgLy8gICAxNS4zLjQuNS4yLgogICAgICAgIC8vIDE0LiBTZXQgdGhlIFtbSGFzSW5zdGFuY2VdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIGFzIGRlc2NyaWJlZCBpbgogICAgICAgIC8vICAgMTUuMy40LjUuMy4KICAgICAgICB2YXIgYm91bmQgPSBmdW5jdGlvbiAoKSB7CgogICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIGJvdW5kKSB7CiAgICAgICAgICAgICAgICAvLyAxNS4zLjQuNS4yIFtbQ29uc3RydWN0XV0KICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgbWV0aG9kIG9mIGEgZnVuY3Rpb24gb2JqZWN0LAogICAgICAgICAgICAgICAgLy8gRiB0aGF0IHdhcyBjcmVhdGVkIHVzaW5nIHRoZSBiaW5kIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGEKICAgICAgICAgICAgICAgIC8vIGxpc3Qgb2YgYXJndW1lbnRzIEV4dHJhQXJncywgdGhlIGZvbGxvd2luZyBzdGVwcyBhcmUgdGFrZW46CiAgICAgICAgICAgICAgICAvLyAxLiBMZXQgdGFyZ2V0IGJlIHRoZSB2YWx1ZSBvZiBGJ3MgW1tUYXJnZXRGdW5jdGlvbl1dCiAgICAgICAgICAgICAgICAvLyAgIGludGVybmFsIHByb3BlcnR5LgogICAgICAgICAgICAgICAgLy8gMi4gSWYgdGFyZ2V0IGhhcyBubyBbW0NvbnN0cnVjdF1dIGludGVybmFsIG1ldGhvZCwgYQogICAgICAgICAgICAgICAgLy8gICBUeXBlRXJyb3IgZXhjZXB0aW9uIGlzIHRocm93bi4KICAgICAgICAgICAgICAgIC8vIDMuIExldCBib3VuZEFyZ3MgYmUgdGhlIHZhbHVlIG9mIEYncyBbW0JvdW5kQXJnc11dIGludGVybmFsCiAgICAgICAgICAgICAgICAvLyAgIHByb3BlcnR5LgogICAgICAgICAgICAgICAgLy8gNC4gTGV0IGFyZ3MgYmUgYSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGUKICAgICAgICAgICAgICAgIC8vICAgbGlzdCBib3VuZEFyZ3MgaW4gdGhlIHNhbWUgb3JkZXIgZm9sbG93ZWQgYnkgdGhlIHNhbWUKICAgICAgICAgICAgICAgIC8vICAgdmFsdWVzIGFzIHRoZSBsaXN0IEV4dHJhQXJncyBpbiB0aGUgc2FtZSBvcmRlci4KICAgICAgICAgICAgICAgIC8vIDUuIFJldHVybiB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgCiAgICAgICAgICAgICAgICAvLyAgIG1ldGhvZCBvZiB0YXJnZXQgcHJvdmlkaW5nIGFyZ3MgYXMgdGhlIGFyZ3VtZW50cy4KCiAgICAgICAgICAgICAgICB2YXIgRiA9IGZ1bmN0aW9uKCl7fTsKICAgICAgICAgICAgICAgIEYucHJvdG90eXBlID0gdGFyZ2V0LnByb3RvdHlwZTsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gbmV3IEY7CgogICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRhcmdldC5hcHBseSgKICAgICAgICAgICAgICAgICAgICBzZWxmLAogICAgICAgICAgICAgICAgICAgIGFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIE9iamVjdChyZXN1bHQpID09PSByZXN1bHQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOwoKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIDE1LjMuNC41LjEgW1tDYWxsXV0KICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZCBvZiBhIGZ1bmN0aW9uIG9iamVjdCwgRiwKICAgICAgICAgICAgICAgIC8vIHdoaWNoIHdhcyBjcmVhdGVkIHVzaW5nIHRoZSBiaW5kIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGEKICAgICAgICAgICAgICAgIC8vIHRoaXMgdmFsdWUgYW5kIGEgbGlzdCBvZiBhcmd1bWVudHMgRXh0cmFBcmdzLCB0aGUgZm9sbG93aW5nCiAgICAgICAgICAgICAgICAvLyBzdGVwcyBhcmUgdGFrZW46CiAgICAgICAgICAgICAgICAvLyAxLiBMZXQgYm91bmRBcmdzIGJlIHRoZSB2YWx1ZSBvZiBGJ3MgW1tCb3VuZEFyZ3NdXSBpbnRlcm5hbAogICAgICAgICAgICAgICAgLy8gICBwcm9wZXJ0eS4KICAgICAgICAgICAgICAgIC8vIDIuIExldCBib3VuZFRoaXMgYmUgdGhlIHZhbHVlIG9mIEYncyBbW0JvdW5kVGhpc11dIGludGVybmFsCiAgICAgICAgICAgICAgICAvLyAgIHByb3BlcnR5LgogICAgICAgICAgICAgICAgLy8gMy4gTGV0IHRhcmdldCBiZSB0aGUgdmFsdWUgb2YgRidzIFtbVGFyZ2V0RnVuY3Rpb25dXSBpbnRlcm5hbAogICAgICAgICAgICAgICAgLy8gICBwcm9wZXJ0eS4KICAgICAgICAgICAgICAgIC8vIDQuIExldCBhcmdzIGJlIGEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgc2FtZSB2YWx1ZXMgYXMgdGhlIAogICAgICAgICAgICAgICAgLy8gICBsaXN0IGJvdW5kQXJncyBpbiB0aGUgc2FtZSBvcmRlciBmb2xsb3dlZCBieSB0aGUgc2FtZSAKICAgICAgICAgICAgICAgIC8vICAgdmFsdWVzIGFzIHRoZSBsaXN0IEV4dHJhQXJncyBpbiB0aGUgc2FtZSBvcmRlci4KICAgICAgICAgICAgICAgIC8vIDUuIFJldHVybiB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZCAKICAgICAgICAgICAgICAgIC8vICAgb2YgdGFyZ2V0IHByb3ZpZGluZyBib3VuZFRoaXMgYXMgdGhlIHRoaXMgdmFsdWUgYW5kIAogICAgICAgICAgICAgICAgLy8gICBwcm92aWRpbmcgYXJncyBhcyB0aGUgYXJndW1lbnRzLgoKICAgICAgICAgICAgICAgIC8vIGVxdWl2OiB0YXJnZXQuY2FsbCh0aGlzLCAuLi5ib3VuZEFyZ3MsIC4uLmFyZ3MpCiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmFwcGx5KAogICAgICAgICAgICAgICAgICAgIHRoYXQsCiAgICAgICAgICAgICAgICAgICAgYXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgfTsKICAgICAgICAvLyBYWFggYm91bmQubGVuZ3RoIGlzIG5ldmVyIHdyaXRhYmxlLCBzbyBkb24ndCBldmVuIHRyeQogICAgICAgIC8vCiAgICAgICAgLy8gMTUuIElmIHRoZSBbW0NsYXNzXV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgVGFyZ2V0IGlzICJGdW5jdGlvbiIsIHRoZW4KICAgICAgICAvLyAgICAgYS4gTGV0IEwgYmUgdGhlIGxlbmd0aCBwcm9wZXJ0eSBvZiBUYXJnZXQgbWludXMgdGhlIGxlbmd0aCBvZiBBLgogICAgICAgIC8vICAgICBiLiBTZXQgdGhlIGxlbmd0aCBvd24gcHJvcGVydHkgb2YgRiB0byBlaXRoZXIgMCBvciBMLCB3aGljaGV2ZXIgaXMgCiAgICAgICAgLy8gICAgICAgbGFyZ2VyLgogICAgICAgIC8vIDE2LiBFbHNlIHNldCB0aGUgbGVuZ3RoIG93biBwcm9wZXJ0eSBvZiBGIHRvIDAuCiAgICAgICAgLy8gMTcuIFNldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbGVuZ3RoIG93biBwcm9wZXJ0eSBvZiBGIHRvIHRoZSB2YWx1ZXMKICAgICAgICAvLyAgIHNwZWNpZmllZCBpbiAxNS4zLjUuMS4KCiAgICAgICAgLy8gVE9ETwogICAgICAgIC8vIDE4LiBTZXQgdGhlIFtbRXh0ZW5zaWJsZV1dIGludGVybmFsIHByb3BlcnR5IG9mIEYgdG8gdHJ1ZS4KICAgICAgICAKICAgICAgICAvLyBUT0RPCiAgICAgICAgLy8gMTkuIExldCB0aHJvd2VyIGJlIHRoZSBbW1Rocm93VHlwZUVycm9yXV0gZnVuY3Rpb24gT2JqZWN0ICgxMy4yLjMpLgogICAgICAgIC8vIDIwLiBDYWxsIHRoZSBbW0RlZmluZU93blByb3BlcnR5XV0gaW50ZXJuYWwgbWV0aG9kIG9mIEYgd2l0aCAKICAgICAgICAvLyAgIGFyZ3VtZW50cyAiY2FsbGVyIiwgUHJvcGVydHlEZXNjcmlwdG9yIHtbW0dldF1dOiB0aHJvd2VyLCBbW1NldF1dOgogICAgICAgIC8vICAgdGhyb3dlciwgW1tFbnVtZXJhYmxlXV06IGZhbHNlLCBbW0NvbmZpZ3VyYWJsZV1dOiBmYWxzZX0sIGFuZCAKICAgICAgICAvLyAgIGZhbHNlLgogICAgICAgIC8vIDIxLiBDYWxsIHRoZSBbW0RlZmluZU93blByb3BlcnR5XV0gaW50ZXJuYWwgbWV0aG9kIG9mIEYgd2l0aCAKICAgICAgICAvLyAgIGFyZ3VtZW50cyAiYXJndW1lbnRzIiwgUHJvcGVydHlEZXNjcmlwdG9yIHtbW0dldF1dOiB0aHJvd2VyLCAKICAgICAgICAvLyAgIFtbU2V0XV06IHRocm93ZXIsIFtbRW51bWVyYWJsZV1dOiBmYWxzZSwgW1tDb25maWd1cmFibGVdXTogZmFsc2V9LAogICAgICAgIC8vICAgYW5kIGZhbHNlLgoKICAgICAgICAvLyBUT0RPCiAgICAgICAgLy8gTk9URSBGdW5jdGlvbiBvYmplY3RzIGNyZWF0ZWQgdXNpbmcgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgZG8gbm90IAogICAgICAgIC8vIGhhdmUgYSBwcm90b3R5cGUgcHJvcGVydHkgb3IgdGhlIFtbQ29kZV1dLCBbW0Zvcm1hbFBhcmFtZXRlcnNdXSwgYW5kCiAgICAgICAgLy8gW1tTY29wZV1dIGludGVybmFsIHByb3BlcnRpZXMuCiAgICAgICAgLy8gWFhYIGNhbid0IGRlbGV0ZSBwcm90b3R5cGUgaW4gcHVyZS1qcy4KCiAgICAgICAgLy8gMjIuIFJldHVybiBGLgogICAgICAgIHJldHVybiBib3VuZDsKICAgIH07Cn0KCi8vIFNob3J0Y3V0IHRvIGFuIG9mdGVuIGFjY2Vzc2VkIHByb3BlcnRpZXMsIGluIG9yZGVyIHRvIGF2b2lkIG11bHRpcGxlCi8vIGRlcmVmZXJlbmNlIHRoYXQgY29zdHMgdW5pdmVyc2FsbHkuCi8vIF9QbGVhc2Ugbm90ZTogU2hvcnRjdXRzIGFyZSBkZWZpbmVkIGFmdGVyIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAgYXMgd2UKLy8gdXMgaXQgaW4gZGVmaW5pbmcgc2hvcnRjdXRzLgp2YXIgY2FsbCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsOwp2YXIgcHJvdG90eXBlT2ZBcnJheSA9IEFycmF5LnByb3RvdHlwZTsKdmFyIHByb3RvdHlwZU9mT2JqZWN0ID0gT2JqZWN0LnByb3RvdHlwZTsKdmFyIHNsaWNlID0gcHJvdG90eXBlT2ZBcnJheS5zbGljZTsKdmFyIHRvU3RyaW5nID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0LnRvU3RyaW5nKTsKdmFyIG93bnMgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuaGFzT3duUHJvcGVydHkpOwoKLy8gSWYgSlMgZW5naW5lIHN1cHBvcnRzIGFjY2Vzc29ycyBjcmVhdGluZyBzaG9ydGN1dHMuCnZhciBkZWZpbmVHZXR0ZXI7CnZhciBkZWZpbmVTZXR0ZXI7CnZhciBsb29rdXBHZXR0ZXI7CnZhciBsb29rdXBTZXR0ZXI7CnZhciBzdXBwb3J0c0FjY2Vzc29yczsKaWYgKChzdXBwb3J0c0FjY2Vzc29ycyA9IG93bnMocHJvdG90eXBlT2ZPYmplY3QsICJfX2RlZmluZUdldHRlcl9fIikpKSB7CiAgICBkZWZpbmVHZXR0ZXIgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuX19kZWZpbmVHZXR0ZXJfXyk7CiAgICBkZWZpbmVTZXR0ZXIgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuX19kZWZpbmVTZXR0ZXJfXyk7CiAgICBsb29rdXBHZXR0ZXIgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuX19sb29rdXBHZXR0ZXJfXyk7CiAgICBsb29rdXBTZXR0ZXIgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuX19sb29rdXBTZXR0ZXJfXyk7Cn0KCi8vCi8vIEFycmF5Ci8vID09PT09Ci8vCgovLyBFUzUgMTUuNC4zLjIKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC4zLjIKLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvaXNBcnJheQppZiAoIUFycmF5LmlzQXJyYXkpIHsKICAgIEFycmF5LmlzQXJyYXkgPSBmdW5jdGlvbiBpc0FycmF5KG9iaikgewogICAgICAgIHJldHVybiB0b1N0cmluZyhvYmopID09ICJbb2JqZWN0IEFycmF5XSI7CiAgICB9Owp9CgovLyBUaGUgSXNDYWxsYWJsZSgpIGNoZWNrIGluIHRoZSBBcnJheSBmdW5jdGlvbnMKLy8gaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCBhIHN0cmljdCBjaGVjayBvbiB0aGUKLy8gaW50ZXJuYWwgY2xhc3Mgb2YgdGhlIG9iamVjdCB0byB0cmFwIGNhc2VzIHdoZXJlCi8vIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB3YXMgYWN0dWFsbHkgYSByZWd1bGFyCi8vIGV4cHJlc3Npb24gbGl0ZXJhbCwgd2hpY2ggaW4gVjggYW5kCi8vIEphdmFTY3JpcHRDb3JlIGlzIGEgdHlwZW9mICJmdW5jdGlvbiIuICBPbmx5IGluCi8vIFY4IGFyZSByZWd1bGFyIGV4cHJlc3Npb24gbGl0ZXJhbHMgcGVybWl0dGVkIGFzCi8vIHJlZHVjZSBwYXJhbWV0ZXJzLCBzbyBpdCBpcyBkZXNpcmFibGUgaW4gdGhlCi8vIGdlbmVyYWwgY2FzZSBmb3IgdGhlIHNoaW0gdG8gbWF0Y2ggdGhlIG1vcmUKLy8gc3RyaWN0IGFuZCBjb21tb24gYmVoYXZpb3Igb2YgcmVqZWN0aW5nIHJlZ3VsYXIKLy8gZXhwcmVzc2lvbnMuCgovLyBFUzUgMTUuNC40LjE4Ci8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuNC4xOAovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9hcnJheS9mb3JFYWNoCmlmICghQXJyYXkucHJvdG90eXBlLmZvckVhY2gpIHsKICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gZm9yRWFjaChmdW4gLyosIHRoaXNwKi8pIHsKICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLAogICAgICAgICAgICB0aGlzcCA9IGFyZ3VtZW50c1sxXSwKICAgICAgICAgICAgaSA9IDAsCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwOwoKICAgICAgICAvLyBJZiBubyBjYWxsYmFjayBmdW5jdGlvbiBvciBpZiBjYWxsYmFjayBpcyBub3QgYSBjYWxsYWJsZSBmdW5jdGlvbgogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UKICAgICAgICB9CgogICAgICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7CiAgICAgICAgICAgIGlmIChpIGluIHNlbGYpIHsKICAgICAgICAgICAgICAgIC8vIEludm9rZSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBjYWxsLCBwYXNzaW5nIGFyZ3VtZW50czoKICAgICAgICAgICAgICAgIC8vIGNvbnRleHQsIHByb3BlcnR5IHZhbHVlLCBwcm9wZXJ0eSBrZXksIHRoaXNBcmcgb2JqZWN0IGNvbnRleHQKICAgICAgICAgICAgICAgIGZ1bi5jYWxsKHRoaXNwLCBzZWxmW2ldLCBpLCBzZWxmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpKys7CiAgICAgICAgfQogICAgfTsKfQoKLy8gRVM1IDE1LjQuNC4xOQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTkKLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vQ29yZV9KYXZhU2NyaXB0XzEuNV9SZWZlcmVuY2UvT2JqZWN0cy9BcnJheS9tYXAKaWYgKCFBcnJheS5wcm90b3R5cGUubWFwKSB7CiAgICBBcnJheS5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24gbWFwKGZ1biAvKiwgdGhpc3AqLykgewogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwLAogICAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpLAogICAgICAgICAgICB0aGlzcCA9IGFyZ3VtZW50c1sxXTsKCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24KICAgICAgICBpZiAodG9TdHJpbmcoZnVuKSAhPSAiW29iamVjdCBGdW5jdGlvbl0iKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlCiAgICAgICAgfQoKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChpIGluIHNlbGYpCiAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBmdW4uY2FsbCh0aGlzcCwgc2VsZltpXSwgaSwgc2VsZik7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9Owp9CgovLyBFUzUgMTUuNC40LjIwCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuNC4yMAovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9PYmplY3RzL0FycmF5L2ZpbHRlcgppZiAoIUFycmF5LnByb3RvdHlwZS5maWx0ZXIpIHsKICAgIEFycmF5LnByb3RvdHlwZS5maWx0ZXIgPSBmdW5jdGlvbiBmaWx0ZXIoZnVuIC8qLCB0aGlzcCAqLykgewogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwLAogICAgICAgICAgICByZXN1bHQgPSBbXSwKICAgICAgICAgICAgdGhpc3AgPSBhcmd1bWVudHNbMV07CgogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQogICAgICAgIH0KCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmIGZ1bi5jYWxsKHRoaXNwLCBzZWxmW2ldLCBpLCBzZWxmKSkKICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNlbGZbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfTsKfQoKLy8gRVM1IDE1LjQuNC4xNgovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTYKLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZXZlcnkKaWYgKCFBcnJheS5wcm90b3R5cGUuZXZlcnkpIHsKICAgIEFycmF5LnByb3RvdHlwZS5ldmVyeSA9IGZ1bmN0aW9uIGV2ZXJ5KGZ1biAvKiwgdGhpc3AgKi8pIHsKICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLAogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMCwKICAgICAgICAgICAgdGhpc3AgPSBhcmd1bWVudHNbMV07CgogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQogICAgICAgIH0KCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmICFmdW4uY2FsbCh0aGlzcCwgc2VsZltpXSwgaSwgc2VsZikpCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfTsKfQoKLy8gRVM1IDE1LjQuNC4xNwovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTcKLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvc29tZQppZiAoIUFycmF5LnByb3RvdHlwZS5zb21lKSB7CiAgICBBcnJheS5wcm90b3R5cGUuc29tZSA9IGZ1bmN0aW9uIHNvbWUoZnVuIC8qLCB0aGlzcCAqLykgewogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwLAogICAgICAgICAgICB0aGlzcCA9IGFyZ3VtZW50c1sxXTsKCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24KICAgICAgICBpZiAodG9TdHJpbmcoZnVuKSAhPSAiW29iamVjdCBGdW5jdGlvbl0iKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlCiAgICAgICAgfQoKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChpIGluIHNlbGYgJiYgZnVuLmNhbGwodGhpc3AsIHNlbGZbaV0sIGksIHNlbGYpKQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH07Cn0KCi8vIEVTNSAxNS40LjQuMjEKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjIxCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlL09iamVjdHMvQXJyYXkvcmVkdWNlCmlmICghQXJyYXkucHJvdG90eXBlLnJlZHVjZSkgewogICAgQXJyYXkucHJvdG90eXBlLnJlZHVjZSA9IGZ1bmN0aW9uIHJlZHVjZShmdW4gLyosIGluaXRpYWwqLykgewogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwOwoKICAgICAgICAvLyBJZiBubyBjYWxsYmFjayBmdW5jdGlvbiBvciBpZiBjYWxsYmFjayBpcyBub3QgYSBjYWxsYWJsZSBmdW5jdGlvbgogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UKICAgICAgICB9CgogICAgICAgIC8vIG5vIHZhbHVlIHRvIHJldHVybiBpZiBubyBpbml0aWFsIHZhbHVlIGFuZCBhbiBlbXB0eSBhcnJheQogICAgICAgIGlmICghbGVuZ3RoICYmIGFyZ3VtZW50cy5sZW5ndGggPT0gMSkKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UKCiAgICAgICAgdmFyIGkgPSAwOwogICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikgewogICAgICAgICAgICByZXN1bHQgPSBhcmd1bWVudHNbMV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgaWYgKGkgaW4gc2VsZikgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGZbaSsrXTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiBhcnJheSBjb250YWlucyBubyB2YWx1ZXMsIG5vIGluaXRpYWwgdmFsdWUgdG8gcmV0dXJuCiAgICAgICAgICAgICAgICBpZiAoKytpID49IGxlbmd0aCkKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQogICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKICAgICAgICB9CgogICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKGkgaW4gc2VsZikKICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZ1bi5jYWxsKHZvaWQgMCwgcmVzdWx0LCBzZWxmW2ldLCBpLCBzZWxmKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9Owp9CgovLyBFUzUgMTUuNC40LjIyCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuNC4yMgovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9PYmplY3RzL0FycmF5L3JlZHVjZVJpZ2h0CmlmICghQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0KSB7CiAgICBBcnJheS5wcm90b3R5cGUucmVkdWNlUmlnaHQgPSBmdW5jdGlvbiByZWR1Y2VSaWdodChmdW4gLyosIGluaXRpYWwqLykgewogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwOwoKICAgICAgICAvLyBJZiBubyBjYWxsYmFjayBmdW5jdGlvbiBvciBpZiBjYWxsYmFjayBpcyBub3QgYSBjYWxsYWJsZSBmdW5jdGlvbgogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UKICAgICAgICB9CgogICAgICAgIC8vIG5vIHZhbHVlIHRvIHJldHVybiBpZiBubyBpbml0aWFsIHZhbHVlLCBlbXB0eSBhcnJheQogICAgICAgIGlmICghbGVuZ3RoICYmIGFyZ3VtZW50cy5sZW5ndGggPT0gMSkKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UKCiAgICAgICAgdmFyIHJlc3VsdCwgaSA9IGxlbmd0aCAtIDE7CiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikgewogICAgICAgICAgICByZXN1bHQgPSBhcmd1bWVudHNbMV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgaWYgKGkgaW4gc2VsZikgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGZbaS0tXTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiBhcnJheSBjb250YWlucyBubyB2YWx1ZXMsIG5vIGluaXRpYWwgdmFsdWUgdG8gcmV0dXJuCiAgICAgICAgICAgICAgICBpZiAoLS1pIDwgMCkKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQogICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKICAgICAgICB9CgogICAgICAgIGRvIHsKICAgICAgICAgICAgaWYgKGkgaW4gdGhpcykKICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZ1bi5jYWxsKHZvaWQgMCwgcmVzdWx0LCBzZWxmW2ldLCBpLCBzZWxmKTsKICAgICAgICB9IHdoaWxlIChpLS0pOwoKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfTsKfQoKLy8gRVM1IDE1LjQuNC4xNAovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTQKLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvaW5kZXhPZgppZiAoIUFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7CiAgICBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2Yoc291Z2h0IC8qLCBmcm9tSW5kZXggKi8gKSB7CiAgICAgICAgdmFyIHNlbGYgPSB0b09iamVjdCh0aGlzKSwKICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7CgogICAgICAgIGlmICghbGVuZ3RoKQogICAgICAgICAgICByZXR1cm4gLTE7CgogICAgICAgIHZhciBpID0gMDsKICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpCiAgICAgICAgICAgIGkgPSB0b0ludGVnZXIoYXJndW1lbnRzWzFdKTsKCiAgICAgICAgLy8gaGFuZGxlIG5lZ2F0aXZlIGluZGljZXMKICAgICAgICBpID0gaSA+PSAwID8gaSA6IE1hdGgubWF4KDAsIGxlbmd0aCArIGkpOwogICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKGkgaW4gc2VsZiAmJiBzZWxmW2ldID09PSBzb3VnaHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAtMTsKICAgIH07Cn0KCi8vIEVTNSAxNS40LjQuMTUKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE1Ci8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2xhc3RJbmRleE9mCmlmICghQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mKSB7CiAgICBBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZihzb3VnaHQgLyosIGZyb21JbmRleCAqLykgewogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwOwoKICAgICAgICBpZiAoIWxlbmd0aCkKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIHZhciBpID0gbGVuZ3RoIC0gMTsKICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpCiAgICAgICAgICAgIGkgPSBNYXRoLm1pbihpLCB0b0ludGVnZXIoYXJndW1lbnRzWzFdKSk7CiAgICAgICAgLy8gaGFuZGxlIG5lZ2F0aXZlIGluZGljZXMKICAgICAgICBpID0gaSA+PSAwID8gaSA6IGxlbmd0aCAtIE1hdGguYWJzKGkpOwogICAgICAgIGZvciAoOyBpID49IDA7IGktLSkgewogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmIHNvdWdodCA9PT0gc2VsZltpXSkKICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gLTE7CiAgICB9Owp9CgovLwovLyBPYmplY3QKLy8gPT09PT09Ci8vCgovLyBFUzUgMTUuMi4zLjIKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjIKaWYgKCFPYmplY3QuZ2V0UHJvdG90eXBlT2YpIHsKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9rcmlza293YWwvZXM1LXNoaW0vaXNzdWVzI2lzc3VlLzIKICAgIC8vIGh0dHA6Ly9lam9obi5vcmcvYmxvZy9vYmplY3RnZXRwcm90b3R5cGVvZi8KICAgIC8vIHJlY29tbWVuZGVkIGJ5IGZzY2hhZWZlciBvbiBnaXRodWIKICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZiA9IGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKG9iamVjdCkgewogICAgICAgIHJldHVybiBvYmplY3QuX19wcm90b19fIHx8ICgKICAgICAgICAgICAgb2JqZWN0LmNvbnN0cnVjdG9yID8KICAgICAgICAgICAgb2JqZWN0LmNvbnN0cnVjdG9yLnByb3RvdHlwZSA6CiAgICAgICAgICAgIHByb3RvdHlwZU9mT2JqZWN0CiAgICAgICAgKTsKICAgIH07Cn0KCi8vIEVTNSAxNS4yLjMuMwovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuMwppZiAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IpIHsKICAgIHZhciBFUlJfTk9OX09CSkVDVCA9ICJPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIGNhbGxlZCBvbiBhICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgIm5vbi1vYmplY3Q6ICI7CiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpIHsKICAgICAgICBpZiAoKHR5cGVvZiBvYmplY3QgIT0gIm9iamVjdCIgJiYgdHlwZW9mIG9iamVjdCAhPSAiZnVuY3Rpb24iKSB8fCBvYmplY3QgPT09IG51bGwpCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJSX05PTl9PQkpFQ1QgKyBvYmplY3QpOwogICAgICAgIC8vIElmIG9iamVjdCBkb2VzIG5vdCBvd25zIHByb3BlcnR5IHJldHVybiB1bmRlZmluZWQgaW1tZWRpYXRlbHkuCiAgICAgICAgaWYgKCFvd25zKG9iamVjdCwgcHJvcGVydHkpKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIHZhciBkZXNjcmlwdG9yLCBnZXR0ZXIsIHNldHRlcjsKCiAgICAgICAgLy8gSWYgb2JqZWN0IGhhcyBhIHByb3BlcnR5IHRoZW4gaXQncyBmb3Igc3VyZSBib3RoIGBlbnVtZXJhYmxlYCBhbmQKICAgICAgICAvLyBgY29uZmlndXJhYmxlYC4KICAgICAgICBkZXNjcmlwdG9yID0gIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH07CgogICAgICAgIC8vIElmIEpTIGVuZ2luZSBzdXBwb3J0cyBhY2Nlc3NvciBwcm9wZXJ0aWVzIHRoZW4gcHJvcGVydHkgbWF5IGJlIGEKICAgICAgICAvLyBnZXR0ZXIgb3Igc2V0dGVyLgogICAgICAgIGlmIChzdXBwb3J0c0FjY2Vzc29ycykgewogICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5IGBfX2xvb2t1cEdldHRlcl9fYCB3aWxsIHJldHVybiBhIGdldHRlciBldmVuCiAgICAgICAgICAgIC8vIGlmIG9iamVjdCBoYXMgb3duIG5vbiBnZXR0ZXIgcHJvcGVydHkgYWxvbmcgd2l0aCBhIHNhbWUgbmFtZWQKICAgICAgICAgICAgLy8gaW5oZXJpdGVkIGdldHRlci4gVG8gYXZvaWQgbWlzYmVoYXZpb3Igd2UgdGVtcG9yYXJ5IHJlbW92ZQogICAgICAgICAgICAvLyBgX19wcm90b19fYCBzbyB0aGF0IGBfX2xvb2t1cEdldHRlcl9fYCB3aWxsIHJldHVybiBnZXR0ZXIgb25seQogICAgICAgICAgICAvLyBpZiBpdCdzIG93bmVkIGJ5IGFuIG9iamVjdC4KICAgICAgICAgICAgdmFyIHByb3RvdHlwZSA9IG9iamVjdC5fX3Byb3RvX187CiAgICAgICAgICAgIG9iamVjdC5fX3Byb3RvX18gPSBwcm90b3R5cGVPZk9iamVjdDsKCiAgICAgICAgICAgIHZhciBnZXR0ZXIgPSBsb29rdXBHZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSk7CiAgICAgICAgICAgIHZhciBzZXR0ZXIgPSBsb29rdXBTZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSk7CgogICAgICAgICAgICAvLyBPbmNlIHdlIGhhdmUgZ2V0dGVyIGFuZCBzZXR0ZXIgd2UgY2FuIHB1dCB2YWx1ZXMgYmFjay4KICAgICAgICAgICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZTsKCiAgICAgICAgICAgIGlmIChnZXR0ZXIgfHwgc2V0dGVyKSB7CiAgICAgICAgICAgICAgICBpZiAoZ2V0dGVyKSBkZXNjcmlwdG9yLmdldCA9IGdldHRlcjsKICAgICAgICAgICAgICAgIGlmIChzZXR0ZXIpIGRlc2NyaXB0b3Iuc2V0ID0gc2V0dGVyOwoKICAgICAgICAgICAgICAgIC8vIElmIGl0IHdhcyBhY2Nlc3NvciBwcm9wZXJ0eSB3ZSdyZSBkb25lIGFuZCByZXR1cm4gaGVyZQogICAgICAgICAgICAgICAgLy8gaW4gb3JkZXIgdG8gYXZvaWQgYWRkaW5nIGB2YWx1ZWAgdG8gdGhlIGRlc2NyaXB0b3IuCiAgICAgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gSWYgd2UgZ290IHRoaXMgZmFyIHdlIGtub3cgdGhhdCBvYmplY3QgaGFzIGFuIG93biBwcm9wZXJ0eSB0aGF0IGlzCiAgICAgICAgLy8gbm90IGFuIGFjY2Vzc29yIHNvIHdlIHNldCBpdCBhcyBhIHZhbHVlIGFuZCByZXR1cm4gZGVzY3JpcHRvci4KICAgICAgICBkZXNjcmlwdG9yLnZhbHVlID0gb2JqZWN0W3Byb3BlcnR5XTsKICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsKICAgIH07Cn0KCi8vIEVTNSAxNS4yLjMuNAovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuNAppZiAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKSB7CiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMob2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdCk7CiAgICB9Owp9CgovLyBFUzUgMTUuMi4zLjUKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjUKaWYgKCFPYmplY3QuY3JlYXRlKSB7CiAgICBPYmplY3QuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKHByb3RvdHlwZSwgcHJvcGVydGllcykgewogICAgICAgIHZhciBvYmplY3Q7CiAgICAgICAgaWYgKHByb3RvdHlwZSA9PT0gbnVsbCkgewogICAgICAgICAgICBvYmplY3QgPSB7ICJfX3Byb3RvX18iOiBudWxsIH07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm90b3R5cGUgIT0gIm9iamVjdCIpCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJ0eXBlb2YgcHJvdG90eXBlWyIrKHR5cGVvZiBwcm90b3R5cGUpKyJdICE9ICdvYmplY3QnIik7CiAgICAgICAgICAgIHZhciBUeXBlID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgIFR5cGUucHJvdG90eXBlID0gcHJvdG90eXBlOwogICAgICAgICAgICBvYmplY3QgPSBuZXcgVHlwZSgpOwogICAgICAgICAgICAvLyBJRSBoYXMgbm8gYnVpbHQtaW4gaW1wbGVtZW50YXRpb24gb2YgYE9iamVjdC5nZXRQcm90b3R5cGVPZmAKICAgICAgICAgICAgLy8gbmVpdGhlciBgX19wcm90b19fYCwgYnV0IHRoaXMgbWFudWFsbHkgc2V0dGluZyBgX19wcm90b19fYCB3aWxsCiAgICAgICAgICAgIC8vIGd1YXJhbnRlZSB0aGF0IGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgIHdpbGwgd29yayBhcyBleHBlY3RlZCB3aXRoCiAgICAgICAgICAgIC8vIG9iamVjdHMgY3JlYXRlZCB1c2luZyBgT2JqZWN0LmNyZWF0ZWAKICAgICAgICAgICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZTsKICAgICAgICB9CiAgICAgICAgaWYgKHByb3BlcnRpZXMgIT09IHZvaWQgMCkKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMob2JqZWN0LCBwcm9wZXJ0aWVzKTsKICAgICAgICByZXR1cm4gb2JqZWN0OwogICAgfTsKfQoKLy8gRVM1IDE1LjIuMy42Ci8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy42CgovLyBQYXRjaCBmb3IgV2ViS2l0IGFuZCBJRTggc3RhbmRhcmQgbW9kZQovLyBEZXNpZ25lZCBieSBoYXggPGhheC5naXRodWIuY29tPgovLyByZWxhdGVkIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20va3Jpc2tvd2FsL2VzNS1zaGltL2lzc3VlcyNpc3N1ZS81Ci8vIElFOCBSZWZlcmVuY2U6Ci8vICAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZGQyODI5MDAuYXNweAovLyAgICAgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2RkMjI5OTE2LmFzcHgKLy8gV2ViS2l0IEJ1Z3M6Ci8vICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzY0MjMKCmZ1bmN0aW9uIGRvZXNEZWZpbmVQcm9wZXJ0eVdvcmsob2JqZWN0KSB7CiAgICB0cnkgewogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsICJzZW50aW5lbCIsIHt9KTsKICAgICAgICByZXR1cm4gInNlbnRpbmVsIiBpbiBvYmplY3Q7CiAgICB9IGNhdGNoIChleGNlcHRpb24pIHsKICAgICAgICAvLyByZXR1cm5zIGZhbHN5CiAgICB9Cn0KCi8vIGNoZWNrIHdoZXRoZXIgZGVmaW5lUHJvcGVydHkgd29ya3MgaWYgaXQncyBnaXZlbi4gT3RoZXJ3aXNlLAovLyBzaGltIHBhcnRpYWxseS4KaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgewogICAgdmFyIGRlZmluZVByb3BlcnR5V29ya3NPbk9iamVjdCA9IGRvZXNEZWZpbmVQcm9wZXJ0eVdvcmsoe30pOwogICAgdmFyIGRlZmluZVByb3BlcnR5V29ya3NPbkRvbSA9IHR5cGVvZiBkb2N1bWVudCA9PSAidW5kZWZpbmVkIiB8fAogICAgICAgIGRvZXNEZWZpbmVQcm9wZXJ0eVdvcmsoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpOwogICAgaWYgKCFkZWZpbmVQcm9wZXJ0eVdvcmtzT25PYmplY3QgfHwgIWRlZmluZVByb3BlcnR5V29ya3NPbkRvbSkgewogICAgICAgIHZhciBkZWZpbmVQcm9wZXJ0eUZhbGxiYWNrID0gT2JqZWN0LmRlZmluZVByb3BlcnR5OwogICAgfQp9CgppZiAoIU9iamVjdC5kZWZpbmVQcm9wZXJ0eSB8fCBkZWZpbmVQcm9wZXJ0eUZhbGxiYWNrKSB7CiAgICB2YXIgRVJSX05PTl9PQkpFQ1RfREVTQ1JJUFRPUiA9ICJQcm9wZXJ0eSBkZXNjcmlwdGlvbiBtdXN0IGJlIGFuIG9iamVjdDogIjsKICAgIHZhciBFUlJfTk9OX09CSkVDVF9UQVJHRVQgPSAiT2JqZWN0LmRlZmluZVByb3BlcnR5IGNhbGxlZCBvbiBub24tb2JqZWN0OiAiCiAgICB2YXIgRVJSX0FDQ0VTU09SU19OT1RfU1VQUE9SVEVEID0gImdldHRlcnMgJiBzZXR0ZXJzIGNhbiBub3QgYmUgZGVmaW5lZCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib24gdGhpcyBqYXZhc2NyaXB0IGVuZ2luZSI7CgogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvcikgewogICAgICAgIGlmICgodHlwZW9mIG9iamVjdCAhPSAib2JqZWN0IiAmJiB0eXBlb2Ygb2JqZWN0ICE9ICJmdW5jdGlvbiIpIHx8IG9iamVjdCA9PT0gbnVsbCkKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihFUlJfTk9OX09CSkVDVF9UQVJHRVQgKyBvYmplY3QpOwogICAgICAgIGlmICgodHlwZW9mIGRlc2NyaXB0b3IgIT0gIm9iamVjdCIgJiYgdHlwZW9mIGRlc2NyaXB0b3IgIT0gImZ1bmN0aW9uIikgfHwgZGVzY3JpcHRvciA9PT0gbnVsbCkKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihFUlJfTk9OX09CSkVDVF9ERVNDUklQVE9SICsgZGVzY3JpcHRvcik7CgogICAgICAgIC8vIG1ha2UgYSB2YWxpYW50IGF0dGVtcHQgdG8gdXNlIHRoZSByZWFsIGRlZmluZVByb3BlcnR5CiAgICAgICAgLy8gZm9yIEk4J3MgRE9NIGVsZW1lbnRzLgogICAgICAgIGlmIChkZWZpbmVQcm9wZXJ0eUZhbGxiYWNrKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lUHJvcGVydHlGYWxsYmFjay5jYWxsKE9iamVjdCwgb2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvcik7CiAgICAgICAgICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgLy8gdHJ5IHRoZSBzaGltIGlmIHRoZSByZWFsIG9uZSBkb2Vzbid0IHdvcmsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gSWYgaXQncyBhIGRhdGEgcHJvcGVydHkuCiAgICAgICAgaWYgKG93bnMoZGVzY3JpcHRvciwgInZhbHVlIikpIHsKICAgICAgICAgICAgLy8gZmFpbCBzaWxlbnRseSBpZiAid3JpdGFibGUiLCAiZW51bWVyYWJsZSIsIG9yICJjb25maWd1cmFibGUiCiAgICAgICAgICAgIC8vIGFyZSByZXF1ZXN0ZWQgYnV0IG5vdCBzdXBwb3J0ZWQKICAgICAgICAgICAgLyoKICAgICAgICAgICAgLy8gYWx0ZXJuYXRlIGFwcHJvYWNoOgogICAgICAgICAgICBpZiAoIC8vIGNhbid0IGltcGxlbWVudCB0aGVzZSBmZWF0dXJlczsgYWxsb3cgZmFsc2UgYnV0IG5vdCB0cnVlCiAgICAgICAgICAgICAgICAhKG93bnMoZGVzY3JpcHRvciwgIndyaXRhYmxlIikgPyBkZXNjcmlwdG9yLndyaXRhYmxlIDogdHJ1ZSkgfHwKICAgICAgICAgICAgICAgICEob3ducyhkZXNjcmlwdG9yLCAiZW51bWVyYWJsZSIpID8gZGVzY3JpcHRvci5lbnVtZXJhYmxlIDogdHJ1ZSkgfHwKICAgICAgICAgICAgICAgICEob3ducyhkZXNjcmlwdG9yLCAiY29uZmlndXJhYmxlIikgPyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA6IHRydWUpCiAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKAogICAgICAgICAgICAgICAgICAgICJUaGlzIGltcGxlbWVudGF0aW9uIG9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBkb2VzIG5vdCAiICsKICAgICAgICAgICAgICAgICAgICAic3VwcG9ydCBjb25maWd1cmFibGUsIGVudW1lcmFibGUsIG9yIHdyaXRhYmxlLiIKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICovCgogICAgICAgICAgICBpZiAoc3VwcG9ydHNBY2Nlc3NvcnMgJiYgKGxvb2t1cEdldHRlcihvYmplY3QsIHByb3BlcnR5KSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cFNldHRlcihvYmplY3QsIHByb3BlcnR5KSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIEFzIGFjY2Vzc29ycyBhcmUgc3VwcG9ydGVkIG9ubHkgb24gZW5naW5lcyBpbXBsZW1lbnRpbmcKICAgICAgICAgICAgICAgIC8vIGBfX3Byb3RvX19gIHdlIGNhbiBzYWZlbHkgb3ZlcnJpZGUgYF9fcHJvdG9fX2Agd2hpbGUgZGVmaW5pbmcKICAgICAgICAgICAgICAgIC8vIGEgcHJvcGVydHkgdG8gbWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3QgaGl0IGFuIGluaGVyaXRlZAogICAgICAgICAgICAgICAgLy8gYWNjZXNzb3IuCiAgICAgICAgICAgICAgICB2YXIgcHJvdG90eXBlID0gb2JqZWN0Ll9fcHJvdG9fXzsKICAgICAgICAgICAgICAgIG9iamVjdC5fX3Byb3RvX18gPSBwcm90b3R5cGVPZk9iamVjdDsKICAgICAgICAgICAgICAgIC8vIERlbGV0aW5nIGEgcHJvcGVydHkgYW55d2F5IHNpbmNlIGdldHRlciAvIHNldHRlciBtYXkgYmUKICAgICAgICAgICAgICAgIC8vIGRlZmluZWQgb24gb2JqZWN0IGl0c2VsZi4KICAgICAgICAgICAgICAgIGRlbGV0ZSBvYmplY3RbcHJvcGVydHldOwogICAgICAgICAgICAgICAgb2JqZWN0W3Byb3BlcnR5XSA9IGRlc2NyaXB0b3IudmFsdWU7CiAgICAgICAgICAgICAgICAvLyBTZXR0aW5nIG9yaWdpbmFsIGBfX3Byb3RvX19gIGJhY2sgbm93LgogICAgICAgICAgICAgICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG9iamVjdFtwcm9wZXJ0eV0gPSBkZXNjcmlwdG9yLnZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCFzdXBwb3J0c0FjY2Vzc29ycykKICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJSX0FDQ0VTU09SU19OT1RfU1VQUE9SVEVEKTsKICAgICAgICAgICAgLy8gSWYgd2UgZ290IHRoYXQgZmFyIHRoZW4gZ2V0dGVycyBhbmQgc2V0dGVycyBjYW4gYmUgZGVmaW5lZCAhIQogICAgICAgICAgICBpZiAob3ducyhkZXNjcmlwdG9yLCAiZ2V0IikpCiAgICAgICAgICAgICAgICBkZWZpbmVHZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvci5nZXQpOwogICAgICAgICAgICBpZiAob3ducyhkZXNjcmlwdG9yLCAic2V0IikpCiAgICAgICAgICAgICAgICBkZWZpbmVTZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvci5zZXQpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG9iamVjdDsKICAgIH07Cn0KCi8vIEVTNSAxNS4yLjMuNwovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuNwppZiAoIU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKSB7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMob2JqZWN0LCBwcm9wZXJ0aWVzKSB7CiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gcHJvcGVydGllcykgewogICAgICAgICAgICBpZiAob3ducyhwcm9wZXJ0aWVzLCBwcm9wZXJ0eSkpCiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgcHJvcGVydGllc1twcm9wZXJ0eV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gb2JqZWN0OwogICAgfTsKfQoKLy8gRVM1IDE1LjIuMy44Ci8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy44CmlmICghT2JqZWN0LnNlYWwpIHsKICAgIE9iamVjdC5zZWFsID0gZnVuY3Rpb24gc2VhbChvYmplY3QpIHsKICAgICAgICAvLyB0aGlzIGlzIG1pc2xlYWRpbmcgYW5kIGJyZWFrcyBmZWF0dXJlLWRldGVjdGlvbiwgYnV0CiAgICAgICAgLy8gYWxsb3dzICJzZWN1cmFibGUiIGNvZGUgdG8gImdyYWNlZnVsbHkiIGRlZ3JhZGUgdG8gd29ya2luZwogICAgICAgIC8vIGJ1dCBpbnNlY3VyZSBjb2RlLgogICAgICAgIHJldHVybiBvYmplY3Q7CiAgICB9Owp9CgovLyBFUzUgMTUuMi4zLjkKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjkKaWYgKCFPYmplY3QuZnJlZXplKSB7CiAgICBPYmplY3QuZnJlZXplID0gZnVuY3Rpb24gZnJlZXplKG9iamVjdCkgewogICAgICAgIC8vIHRoaXMgaXMgbWlzbGVhZGluZyBhbmQgYnJlYWtzIGZlYXR1cmUtZGV0ZWN0aW9uLCBidXQKICAgICAgICAvLyBhbGxvd3MgInNlY3VyYWJsZSIgY29kZSB0byAiZ3JhY2VmdWxseSIgZGVncmFkZSB0byB3b3JraW5nCiAgICAgICAgLy8gYnV0IGluc2VjdXJlIGNvZGUuCiAgICAgICAgcmV0dXJuIG9iamVjdDsKICAgIH07Cn0KCi8vIGRldGVjdCBhIFJoaW5vIGJ1ZyBhbmQgcGF0Y2ggaXQKdHJ5IHsKICAgIE9iamVjdC5mcmVlemUoZnVuY3Rpb24gKCkge30pOwp9IGNhdGNoIChleGNlcHRpb24pIHsKICAgIE9iamVjdC5mcmVlemUgPSAoZnVuY3Rpb24gZnJlZXplKGZyZWV6ZU9iamVjdCkgewogICAgICAgIHJldHVybiBmdW5jdGlvbiBmcmVlemUob2JqZWN0KSB7CiAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0ID09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3Q7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnJlZXplT2JqZWN0KG9iamVjdCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfSkoT2JqZWN0LmZyZWV6ZSk7Cn0KCi8vIEVTNSAxNS4yLjMuMTAKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjEwCmlmICghT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKSB7CiAgICBPYmplY3QucHJldmVudEV4dGVuc2lvbnMgPSBmdW5jdGlvbiBwcmV2ZW50RXh0ZW5zaW9ucyhvYmplY3QpIHsKICAgICAgICAvLyB0aGlzIGlzIG1pc2xlYWRpbmcgYW5kIGJyZWFrcyBmZWF0dXJlLWRldGVjdGlvbiwgYnV0CiAgICAgICAgLy8gYWxsb3dzICJzZWN1cmFibGUiIGNvZGUgdG8gImdyYWNlZnVsbHkiIGRlZ3JhZGUgdG8gd29ya2luZwogICAgICAgIC8vIGJ1dCBpbnNlY3VyZSBjb2RlLgogICAgICAgIHJldHVybiBvYmplY3Q7CiAgICB9Owp9CgovLyBFUzUgMTUuMi4zLjExCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMQppZiAoIU9iamVjdC5pc1NlYWxlZCkgewogICAgT2JqZWN0LmlzU2VhbGVkID0gZnVuY3Rpb24gaXNTZWFsZWQob2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfTsKfQoKLy8gRVM1IDE1LjIuMy4xMgovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuMTIKaWYgKCFPYmplY3QuaXNGcm96ZW4pIHsKICAgIE9iamVjdC5pc0Zyb3plbiA9IGZ1bmN0aW9uIGlzRnJvemVuKG9iamVjdCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH07Cn0KCi8vIEVTNSAxNS4yLjMuMTMKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjEzCmlmICghT2JqZWN0LmlzRXh0ZW5zaWJsZSkgewogICAgT2JqZWN0LmlzRXh0ZW5zaWJsZSA9IGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZShvYmplY3QpIHsKICAgICAgICAvLyAxLiBJZiBUeXBlKE8pIGlzIG5vdCBPYmplY3QgdGhyb3cgYSBUeXBlRXJyb3IgZXhjZXB0aW9uLgogICAgICAgIGlmIChPYmplY3Qob2JqZWN0KSA9PT0gb2JqZWN0KSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlCiAgICAgICAgfQogICAgICAgIC8vIDIuIFJldHVybiB0aGUgQm9vbGVhbiB2YWx1ZSBvZiB0aGUgW1tFeHRlbnNpYmxlXV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgTy4KICAgICAgICB2YXIgbmFtZSA9ICcnOwogICAgICAgIHdoaWxlIChvd25zKG9iamVjdCwgbmFtZSkpIHsKICAgICAgICAgICAgbmFtZSArPSAnPyc7CiAgICAgICAgfQogICAgICAgIG9iamVjdFtuYW1lXSA9IHRydWU7CiAgICAgICAgdmFyIHJldHVyblZhbHVlID0gb3ducyhvYmplY3QsIG5hbWUpOwogICAgICAgIGRlbGV0ZSBvYmplY3RbbmFtZV07CiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwogICAgfTsKfQoKLy8gRVM1IDE1LjIuMy4xNAovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuMTQKaWYgKCFPYmplY3Qua2V5cykgewogICAgLy8gaHR0cDovL3doYXR0aGVoZWFkc2FpZC5jb20vMjAxMC8xMC9hLXNhZmVyLW9iamVjdC1rZXlzLWNvbXBhdGliaWxpdHktaW1wbGVtZW50YXRpb24KICAgIHZhciBoYXNEb250RW51bUJ1ZyA9IHRydWUsCiAgICAgICAgZG9udEVudW1zID0gWwogICAgICAgICAgICAidG9TdHJpbmciLAogICAgICAgICAgICAidG9Mb2NhbGVTdHJpbmciLAogICAgICAgICAgICAidmFsdWVPZiIsCiAgICAgICAgICAgICJoYXNPd25Qcm9wZXJ0eSIsCiAgICAgICAgICAgICJpc1Byb3RvdHlwZU9mIiwKICAgICAgICAgICAgInByb3BlcnR5SXNFbnVtZXJhYmxlIiwKICAgICAgICAgICAgImNvbnN0cnVjdG9yIgogICAgICAgIF0sCiAgICAgICAgZG9udEVudW1zTGVuZ3RoID0gZG9udEVudW1zLmxlbmd0aDsKCiAgICBmb3IgKHZhciBrZXkgaW4geyJ0b1N0cmluZyI6IG51bGx9KQogICAgICAgIGhhc0RvbnRFbnVtQnVnID0gZmFsc2U7CgogICAgT2JqZWN0LmtleXMgPSBmdW5jdGlvbiBrZXlzKG9iamVjdCkgewoKICAgICAgICBpZiAoKHR5cGVvZiBvYmplY3QgIT0gIm9iamVjdCIgJiYgdHlwZW9mIG9iamVjdCAhPSAiZnVuY3Rpb24iKSB8fCBvYmplY3QgPT09IG51bGwpCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdC5rZXlzIGNhbGxlZCBvbiBhIG5vbi1vYmplY3QiKTsKCiAgICAgICAgdmFyIGtleXMgPSBbXTsKICAgICAgICBmb3IgKHZhciBuYW1lIGluIG9iamVjdCkgewogICAgICAgICAgICBpZiAob3ducyhvYmplY3QsIG5hbWUpKSB7CiAgICAgICAgICAgICAgICBrZXlzLnB1c2gobmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChoYXNEb250RW51bUJ1ZykgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBkb250RW51bXNMZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgZG9udEVudW0gPSBkb250RW51bXNbaV07CiAgICAgICAgICAgICAgICBpZiAob3ducyhvYmplY3QsIGRvbnRFbnVtKSkgewogICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChkb250RW51bSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBrZXlzOwogICAgfTsKCn0KCi8vCi8vIERhdGUKLy8gPT09PQovLwoKLy8gRVM1IDE1LjkuNS40MwovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS45LjUuNDMKLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgU3RyaW5nIHZhbHVlIHJlcHJlc2VudCB0aGUgaW5zdGFuY2UgaW4gdGltZSAKLy8gcmVwcmVzZW50ZWQgYnkgdGhpcyBEYXRlIG9iamVjdC4gVGhlIGZvcm1hdCBvZiB0aGUgU3RyaW5nIGlzIHRoZSBEYXRlIFRpbWUgCi8vIHN0cmluZyBmb3JtYXQgZGVmaW5lZCBpbiAxNS45LjEuMTUuIEFsbCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIFN0cmluZy4gCi8vIFRoZSB0aW1lIHpvbmUgaXMgYWx3YXlzIFVUQywgZGVub3RlZCBieSB0aGUgc3VmZml4IFouIElmIHRoZSB0aW1lIHZhbHVlIG9mIAovLyB0aGlzIG9iamVjdCBpcyBub3QgYSBmaW5pdGUgTnVtYmVyIGEgUmFuZ2VFcnJvciBleGNlcHRpb24gaXMgdGhyb3duLgppZiAoIURhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nIHx8IChuZXcgRGF0ZSgtNjIxOTg3NTUyMDAwMDApLnRvSVNPU3RyaW5nKCkuaW5kZXhPZignLTAwMDAwMScpID09PSAtMSkpIHsKICAgIERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nID0gZnVuY3Rpb24gdG9JU09TdHJpbmcoKSB7CiAgICAgICAgdmFyIHJlc3VsdCwgbGVuZ3RoLCB2YWx1ZSwgeWVhcjsKICAgICAgICBpZiAoIWlzRmluaXRlKHRoaXMpKQogICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcjsKCiAgICAgICAgLy8gdGhlIGRhdGUgdGltZSBzdHJpbmcgZm9ybWF0IGlzIHNwZWNpZmllZCBpbiAxNS45LjEuMTUuCiAgICAgICAgcmVzdWx0ID0gW3RoaXMuZ2V0VVRDTW9udGgoKSArIDEsIHRoaXMuZ2V0VVRDRGF0ZSgpLAogICAgICAgICAgICB0aGlzLmdldFVUQ0hvdXJzKCksIHRoaXMuZ2V0VVRDTWludXRlcygpLCB0aGlzLmdldFVUQ1NlY29uZHMoKV07CiAgICAgICAgeWVhciA9IHRoaXMuZ2V0VVRDRnVsbFllYXIoKTsKICAgICAgICB5ZWFyID0gKHllYXIgPCAwID8gJy0nIDogKHllYXIgPiA5OTk5ID8gJysnIDogJycpKSArICgnMDAwMDAnICsgTWF0aC5hYnMoeWVhcikpLnNsaWNlKDAgPD0geWVhciAmJiB5ZWFyIDw9IDk5OTkgPyAtNCA6IC02KTsKCiAgICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDsKICAgICAgICB3aGlsZSAobGVuZ3RoLS0pIHsKICAgICAgICAgICAgdmFsdWUgPSByZXN1bHRbbGVuZ3RoXTsKICAgICAgICAgICAgLy8gcGFkIG1vbnRocywgZGF5cywgaG91cnMsIG1pbnV0ZXMsIGFuZCBzZWNvbmRzIHRvIGhhdmUgdHdvIGRpZ2l0cy4KICAgICAgICAgICAgaWYgKHZhbHVlIDwgMTApCiAgICAgICAgICAgICAgICByZXN1bHRbbGVuZ3RoXSA9ICIwIiArIHZhbHVlOwogICAgICAgIH0KICAgICAgICAvLyBwYWQgbWlsbGlzZWNvbmRzIHRvIGhhdmUgdGhyZWUgZGlnaXRzLgogICAgICAgIHJldHVybiB5ZWFyICsgIi0iICsgcmVzdWx0LnNsaWNlKDAsIDIpLmpvaW4oIi0iKSArICJUIiArIHJlc3VsdC5zbGljZSgyKS5qb2luKCI6IikgKyAiLiIgKwogICAgICAgICAgICAoIjAwMCIgKyB0aGlzLmdldFVUQ01pbGxpc2Vjb25kcygpKS5zbGljZSgtMykgKyAiWiI7CiAgICB9Cn0KCi8vIEVTNSAxNS45LjQuNAovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS45LjQuNAppZiAoIURhdGUubm93KSB7CiAgICBEYXRlLm5vdyA9IGZ1bmN0aW9uIG5vdygpIHsKICAgICAgICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICB9Owp9CgovLyBFUzUgMTUuOS41LjQ0Ci8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjkuNS40NAovLyBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgRGF0ZSBvYmplY3QgZm9yIHVzZSBieSAKLy8gSlNPTi5zdHJpbmdpZnkgKDE1LjEyLjMpLgppZiAoIURhdGUucHJvdG90eXBlLnRvSlNPTikgewogICAgRGF0ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OKGtleSkgewogICAgICAgIC8vIFdoZW4gdGhlIHRvSlNPTiBtZXRob2QgaXMgY2FsbGVkIHdpdGggYXJndW1lbnQga2V5LCB0aGUgZm9sbG93aW5nIAogICAgICAgIC8vIHN0ZXBzIGFyZSB0YWtlbjoKCiAgICAgICAgLy8gMS4gIExldCBPIGJlIHRoZSByZXN1bHQgb2YgY2FsbGluZyBUb09iamVjdCwgZ2l2aW5nIGl0IHRoZSB0aGlzCiAgICAgICAgLy8gdmFsdWUgYXMgaXRzIGFyZ3VtZW50LgogICAgICAgIC8vIDIuIExldCB0diBiZSBUb1ByaW1pdGl2ZShPLCBoaW50IE51bWJlcikuCiAgICAgICAgLy8gMy4gSWYgdHYgaXMgYSBOdW1iZXIgYW5kIGlzIG5vdCBmaW5pdGUsIHJldHVybiBudWxsLgogICAgICAgIC8vIFhYWAogICAgICAgIC8vIDQuIExldCB0b0lTTyBiZSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIFtbR2V0XV0gaW50ZXJuYWwgbWV0aG9kIG9mCiAgICAgICAgLy8gTyB3aXRoIGFyZ3VtZW50ICJ0b0lTT1N0cmluZyIuCiAgICAgICAgLy8gNS4gSWYgSXNDYWxsYWJsZSh0b0lTTykgaXMgZmFsc2UsIHRocm93IGEgVHlwZUVycm9yIGV4Y2VwdGlvbi4KICAgICAgICBpZiAodHlwZW9mIHRoaXMudG9JU09TdHJpbmcgIT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UKICAgICAgICAvLyA2LiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBtZXRob2Qgb2YKICAgICAgICAvLyAgdG9JU08gd2l0aCBPIGFzIHRoZSB0aGlzIHZhbHVlIGFuZCBhbiBlbXB0eSBhcmd1bWVudCBsaXN0LgogICAgICAgIHJldHVybiB0aGlzLnRvSVNPU3RyaW5nKCk7CgogICAgICAgIC8vIE5PVEUgMSBUaGUgYXJndW1lbnQgaXMgaWdub3JlZC4KCiAgICAgICAgLy8gTk9URSAyIFRoZSB0b0pTT04gZnVuY3Rpb24gaXMgaW50ZW50aW9uYWxseSBnZW5lcmljOyBpdCBkb2VzIG5vdAogICAgICAgIC8vIHJlcXVpcmUgdGhhdCBpdHMgdGhpcyB2YWx1ZSBiZSBhIERhdGUgb2JqZWN0LiBUaGVyZWZvcmUsIGl0IGNhbiBiZQogICAgICAgIC8vIHRyYW5zZmVycmVkIHRvIG90aGVyIGtpbmRzIG9mIG9iamVjdHMgZm9yIHVzZSBhcyBhIG1ldGhvZC4gSG93ZXZlciwKICAgICAgICAvLyBpdCBkb2VzIHJlcXVpcmUgdGhhdCBhbnkgc3VjaCBvYmplY3QgaGF2ZSBhIHRvSVNPU3RyaW5nIG1ldGhvZC4gQW4KICAgICAgICAvLyBvYmplY3QgaXMgZnJlZSB0byB1c2UgdGhlIGFyZ3VtZW50IGtleSB0byBmaWx0ZXIgaXRzCiAgICAgICAgLy8gc3RyaW5naWZpY2F0aW9uLgogICAgfTsKfQoKLy8gRVM1IDE1LjkuNC4yCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjkuNC4yCi8vIGJhc2VkIG9uIHdvcmsgc2hhcmVkIGJ5IERhbmllbCBGcmllc2VuIChkYW50bWFuKQovLyBodHRwOi8vZ2lzdC5naXRodWIuY29tLzMwMzI0OQppZiAoRGF0ZS5wYXJzZSgiKzI3NTc2MC0wOS0xM1QwMDowMDowMC4wMDBaIikgIT09IDguNjRlMTUpIHsKICAgIC8vIFhYWCBnbG9iYWwgYXNzaWdubWVudCB3b24ndCB3b3JrIGluIGVtYmVkZGluZ3MgdGhhdCB1c2UKICAgIC8vIGFuIGFsdGVybmF0ZSBvYmplY3QgZm9yIHRoZSBjb250ZXh0LgogICAgRGF0ZSA9IChmdW5jdGlvbihOYXRpdmVEYXRlKSB7CgogICAgICAgIC8vIERhdGUubGVuZ3RoID09PSA3CiAgICAgICAgdmFyIERhdGUgPSBmdW5jdGlvbiBEYXRlKFksIE0sIEQsIGgsIG0sIHMsIG1zKSB7CiAgICAgICAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOwogICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIE5hdGl2ZURhdGUpIHsKICAgICAgICAgICAgICAgIHZhciBkYXRlID0gbGVuZ3RoID09IDEgJiYgU3RyaW5nKFkpID09PSBZID8gLy8gaXNTdHJpbmcoWSkKICAgICAgICAgICAgICAgICAgICAvLyBXZSBleHBsaWNpdGx5IHBhc3MgaXQgdGhyb3VnaCBwYXJzZToKICAgICAgICAgICAgICAgICAgICBuZXcgTmF0aXZlRGF0ZShEYXRlLnBhcnNlKFkpKSA6CiAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byBtYW51YWxseSBtYWtlIGNhbGxzIGRlcGVuZGluZyBvbiBhcmd1bWVudAogICAgICAgICAgICAgICAgICAgIC8vIGxlbmd0aCBoZXJlCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDcgPyBuZXcgTmF0aXZlRGF0ZShZLCBNLCBELCBoLCBtLCBzLCBtcykgOgogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSA2ID8gbmV3IE5hdGl2ZURhdGUoWSwgTSwgRCwgaCwgbSwgcykgOgogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSA1ID8gbmV3IE5hdGl2ZURhdGUoWSwgTSwgRCwgaCwgbSkgOgogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSA0ID8gbmV3IE5hdGl2ZURhdGUoWSwgTSwgRCwgaCkgOgogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSAzID8gbmV3IE5hdGl2ZURhdGUoWSwgTSwgRCkgOgogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSAyID8gbmV3IE5hdGl2ZURhdGUoWSwgTSkgOgogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSAxID8gbmV3IE5hdGl2ZURhdGUoWSkgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5hdGl2ZURhdGUoKTsKICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgbWl4dXBzIHdpdGggdW5maXhlZCBEYXRlIG9iamVjdAogICAgICAgICAgICAgICAgZGF0ZS5jb25zdHJ1Y3RvciA9IERhdGU7CiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH07CgogICAgICAgIC8vIDE1LjkuMS4xNSBEYXRlIFRpbWUgU3RyaW5nIEZvcm1hdC4KICAgICAgICB2YXIgaXNvRGF0ZUV4cHJlc3Npb24gPSBuZXcgUmVnRXhwKCJeIiArCiAgICAgICAgICAgICIoXFxkezR9fFtcK1wtXVxcZHs2fSkiICsgLy8gZm91ci1kaWdpdCB5ZWFyIGNhcHR1cmUgb3Igc2lnbiArIDYtZGlnaXQgZXh0ZW5kZWQgeWVhcgogICAgICAgICAgICAiKD86LShcXGR7Mn0pIiArIC8vIG9wdGlvbmFsIG1vbnRoIGNhcHR1cmUKICAgICAgICAgICAgIig/Oi0oXFxkezJ9KSIgKyAvLyBvcHRpb25hbCBkYXkgY2FwdHVyZQogICAgICAgICAgICAiKD86IiArIC8vIGNhcHR1cmUgaG91cnM6bWludXRlczpzZWNvbmRzLm1pbGxpc2Vjb25kcwogICAgICAgICAgICAgICAgIlQoXFxkezJ9KSIgKyAvLyBob3VycyBjYXB0dXJlCiAgICAgICAgICAgICAgICAiOihcXGR7Mn0pIiArIC8vIG1pbnV0ZXMgY2FwdHVyZQogICAgICAgICAgICAgICAgIig/OiIgKyAvLyBvcHRpb25hbCA6c2Vjb25kcy5taWxsaXNlY29uZHMKICAgICAgICAgICAgICAgICAgICAiOihcXGR7Mn0pIiArIC8vIHNlY29uZHMgY2FwdHVyZQogICAgICAgICAgICAgICAgICAgICIoPzpcXC4oXFxkezN9KSk/IiArIC8vIG1pbGxpc2Vjb25kcyBjYXB0dXJlCiAgICAgICAgICAgICAgICAiKT8iICsKICAgICAgICAgICAgIig/OiIgKyAvLyBjYXB0dXJlIFVUQyBvZmZzZXQgY29tcG9uZW50CiAgICAgICAgICAgICAgICAiWnwiICsgLy8gVVRDIGNhcHR1cmUKICAgICAgICAgICAgICAgICIoPzoiICsgLy8gb2Zmc2V0IHNwZWNpZmllciArLy1ob3VyczptaW51dGVzCiAgICAgICAgICAgICAgICAgICAgIihbLStdKSIgKyAvLyBzaWduIGNhcHR1cmUKICAgICAgICAgICAgICAgICAgICAiKFxcZHsyfSkiICsgLy8gaG91cnMgb2Zmc2V0IGNhcHR1cmUKICAgICAgICAgICAgICAgICAgICAiOihcXGR7Mn0pIiArIC8vIG1pbnV0ZXMgb2Zmc2V0IGNhcHR1cmUKICAgICAgICAgICAgICAgICIpIiArCiAgICAgICAgICAgICIpPyk/KT8pPyIgKwogICAgICAgICIkIik7CgogICAgICAgIC8vIENvcHkgYW55IGN1c3RvbSBtZXRob2RzIGEgM3JkIHBhcnR5IGxpYnJhcnkgbWF5IGhhdmUgYWRkZWQKICAgICAgICBmb3IgKHZhciBrZXkgaW4gTmF0aXZlRGF0ZSkKICAgICAgICAgICAgRGF0ZVtrZXldID0gTmF0aXZlRGF0ZVtrZXldOwoKICAgICAgICAvLyBDb3B5ICJuYXRpdmUiIG1ldGhvZHMgZXhwbGljaXRseTsgdGhleSBtYXkgYmUgbm9uLWVudW1lcmFibGUKICAgICAgICBEYXRlLm5vdyA9IE5hdGl2ZURhdGUubm93OwogICAgICAgIERhdGUuVVRDID0gTmF0aXZlRGF0ZS5VVEM7CiAgICAgICAgRGF0ZS5wcm90b3R5cGUgPSBOYXRpdmVEYXRlLnByb3RvdHlwZTsKICAgICAgICBEYXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERhdGU7CgogICAgICAgIC8vIFVwZ3JhZGUgRGF0ZS5wYXJzZSB0byBoYW5kbGUgc2ltcGxpZmllZCBJU08gODYwMSBzdHJpbmdzCiAgICAgICAgRGF0ZS5wYXJzZSA9IGZ1bmN0aW9uIHBhcnNlKHN0cmluZykgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBpc29EYXRlRXhwcmVzc2lvbi5leGVjKHN0cmluZyk7CiAgICAgICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICAgICAgbWF0Y2guc2hpZnQoKTsgLy8ga2lsbCBtYXRjaFswXSwgdGhlIGZ1bGwgbWF0Y2gKICAgICAgICAgICAgICAgIC8vIHBhcnNlIG1vbnRocywgZGF5cywgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGFuZCBtaWxsaXNlY29uZHMKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgNzsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gcHJvdmlkZSBkZWZhdWx0IHZhbHVlcyBpZiBuZWNlc3NhcnkKICAgICAgICAgICAgICAgICAgICBtYXRjaFtpXSA9ICsobWF0Y2hbaV0gfHwgKGkgPCAzID8gMSA6IDApKTsKICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaFsxXSBpcyB0aGUgbW9udGguIE1vbnRocyBhcmUgMC0xMSBpbiBKYXZhU2NyaXB0CiAgICAgICAgICAgICAgICAgICAgLy8gYERhdGVgIG9iamVjdHMsIGJ1dCAxLTEyIGluIElTTyBub3RhdGlvbiwgc28gd2UKICAgICAgICAgICAgICAgICAgICAvLyBkZWNyZW1lbnQuCiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbaV0tLTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBwYXJzZSB0aGUgVVRDIG9mZnNldCBjb21wb25lbnQKICAgICAgICAgICAgICAgIHZhciBtaW51dGVPZmZzZXQgPSArbWF0Y2gucG9wKCksIGhvdXJPZmZzZXQgPSArbWF0Y2gucG9wKCksIHNpZ24gPSBtYXRjaC5wb3AoKTsKCiAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHRoZSBleHBsaWNpdCB0aW1lIHpvbmUgb2Zmc2V0IGlmIHNwZWNpZmllZAogICAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IDA7CiAgICAgICAgICAgICAgICBpZiAoc2lnbikgewogICAgICAgICAgICAgICAgICAgIC8vIGRldGVjdCBpbnZhbGlkIG9mZnNldHMgYW5kIHJldHVybiBlYXJseQogICAgICAgICAgICAgICAgICAgIGlmIChob3VyT2Zmc2V0ID4gMjMgfHwgbWludXRlT2Zmc2V0ID4gNTkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOYU47CgogICAgICAgICAgICAgICAgICAgIC8vIGV4cHJlc3MgdGhlIHByb3ZpZGVkIHRpbWUgem9uZSBvZmZzZXQgaW4gbWludXRlcy4gVGhlIG9mZnNldCBpcwogICAgICAgICAgICAgICAgICAgIC8vIG5lZ2F0aXZlIGZvciB0aW1lIHpvbmVzIHdlc3Qgb2YgVVRDOyBwb3NpdGl2ZSBvdGhlcndpc2UuCiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKGhvdXJPZmZzZXQgKiA2MCArIG1pbnV0ZU9mZnNldCkgKiA2ZTQgKiAoc2lnbiA9PSAiKyIgPyAtMSA6IDEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIERhdGUuVVRDIGZvciB5ZWFycyBiZXR3ZWVuIDAgYW5kIDk5IGNvbnZlcnRzIHllYXIgdG8gMTkwMCArIHllYXIKICAgICAgICAgICAgICAgIC8vIFRoZSBHcmVnb3JpYW4gY2FsZW5kYXIgaGFzIGEgNDAwLXllYXIgY3ljbGUsIHNvIAogICAgICAgICAgICAgICAgLy8gdG8gRGF0ZS5VVEMoeWVhciArIDQwMCwgLi4uLiApIC0gMTI2MjI3ODA4MDAwMDAgPT0gRGF0ZS5VVEMoeWVhciwgLi4uKSwKICAgICAgICAgICAgICAgIC8vIHdoZXJlIDEyNjIyNzgwODAwMDAwIC0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBHcmVnb3JpYW4gY2FsZW5kYXIgNDAwIHllYXJzCiAgICAgICAgICAgICAgICB2YXIgeWVhciA9ICttYXRjaFswXTsKICAgICAgICAgICAgICAgIGlmICgwIDw9IHllYXIgJiYgeWVhciA8PSA5OSkgewogICAgICAgICAgICAgICAgICAgIG1hdGNoWzBdID0geWVhciArIDQwMDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5VVEMuYXBwbHkodGhpcywgbWF0Y2gpICsgb2Zmc2V0IC0gMTI2MjI3ODA4MDAwMDA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gY29tcHV0ZSBhIG5ldyBVVEMgZGF0ZSB2YWx1ZSwgYWNjb3VudGluZyBmb3IgdGhlIG9wdGlvbmFsIG9mZnNldAogICAgICAgICAgICAgICAgcmV0dXJuIE5hdGl2ZURhdGUuVVRDLmFwcGx5KHRoaXMsIG1hdGNoKSArIG9mZnNldDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5wYXJzZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH07CgogICAgICAgIHJldHVybiBEYXRlOwogICAgfSkoRGF0ZSk7Cn0KCi8vCi8vIFN0cmluZwovLyA9PT09PT0KLy8KCi8vIEVTNSAxNS41LjQuMjAKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNS40LjIwCnZhciB3cyA9ICJceDA5XHgwQVx4MEJceDBDXHgwRFx4MjBceEEwXHUxNjgwXHUxODBFXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzIiArCiAgICAiXHUyMDA0XHUyMDA1XHUyMDA2XHUyMDA3XHUyMDA4XHUyMDA5XHUyMDBBXHUyMDJGXHUyMDVGXHUzMDAwXHUyMDI4IiArCiAgICAiXHUyMDI5XHVGRUZGIjsKaWYgKCFTdHJpbmcucHJvdG90eXBlLnRyaW0gfHwgd3MudHJpbSgpKSB7CiAgICAvLyBodHRwOi8vYmxvZy5zdGV2ZW5sZXZpdGhhbi5jb20vYXJjaGl2ZXMvZmFzdGVyLXRyaW0tamF2YXNjcmlwdAogICAgLy8gaHR0cDovL3BlcmZlY3Rpb25raWxscy5jb20vd2hpdGVzcGFjZS1kZXZpYXRpb25zLwogICAgd3MgPSAiWyIgKyB3cyArICJdIjsKICAgIHZhciB0cmltQmVnaW5SZWdleHAgPSBuZXcgUmVnRXhwKCJeIiArIHdzICsgd3MgKyAiKiIpLAogICAgICAgIHRyaW1FbmRSZWdleHAgPSBuZXcgUmVnRXhwKHdzICsgd3MgKyAiKiQiKTsKICAgIFN0cmluZy5wcm90b3R5cGUudHJpbSA9IGZ1bmN0aW9uIHRyaW0oKSB7CiAgICAgICAgcmV0dXJuIFN0cmluZyh0aGlzKS5yZXBsYWNlKHRyaW1CZWdpblJlZ2V4cCwgIiIpLnJlcGxhY2UodHJpbUVuZFJlZ2V4cCwgIiIpOwogICAgfTsKfQoKLy8KLy8gVXRpbAovLyA9PT09PT0KLy8KCi8vIEVTNSA5LjQKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4OS40Ci8vIGh0dHA6Ly9qc3BlcmYuY29tL3RvLWludGVnZXIKdmFyIHRvSW50ZWdlciA9IGZ1bmN0aW9uIChuKSB7CiAgICBuID0gK247CiAgICBpZiAobiAhPT0gbikgLy8gaXNOYU4KICAgICAgICBuID0gMDsKICAgIGVsc2UgaWYgKG4gIT09IDAgJiYgbiAhPT0gKDEvMCkgJiYgbiAhPT0gLSgxLzApKQogICAgICAgIG4gPSAobiA+IDAgfHwgLTEpICogTWF0aC5mbG9vcihNYXRoLmFicyhuKSk7CiAgICByZXR1cm4gbjsKfTsKCnZhciBwcmVwYXJlU3RyaW5nID0gImEiWzBdICE9ICJhIiwKICAgIC8vIEVTNSA5LjkKICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDkuOQogICAgdG9PYmplY3QgPSBmdW5jdGlvbiAobykgewogICAgICAgIGlmIChvID09IG51bGwpIHsgLy8gdGhpcyBtYXRjaGVzIGJvdGggbnVsbCBhbmQgdW5kZWZpbmVkCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlCiAgICAgICAgfQogICAgICAgIC8vIElmIHRoZSBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHN1cHBvcnQgYnktaW5kZXggYWNjZXNzIG9mCiAgICAgICAgLy8gc3RyaW5nIGNoYXJhY3RlcnMgKGV4LiBJRSA8IDcpLCBzcGxpdCB0aGUgc3RyaW5nCiAgICAgICAgaWYgKHByZXBhcmVTdHJpbmcgJiYgdHlwZW9mIG8gPT0gInN0cmluZyIgJiYgbykgewogICAgICAgICAgICByZXR1cm4gby5zcGxpdCgiIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBPYmplY3Qobyk7CiAgICB9Owp9KTsvKiB2aW06dHM9NDpzdHM9NDpzdz00OgogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqICAgICAgTWloYWkgU3VjYW4gPG1paGFpIEFUIHN1Y2FuIEFUIGdtYWlsIE9EVCBjb20+CiAqICAgICAgSXJha2xpIEdvemFsaXNodmlsaSA8cmZvYmljQGdtYWlsLmNvbT4gKGh0dHA6Ly9qZWRpdG9vbGtpdC5jb20pCiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9saWIvZG9tJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIFhIVE1MX05TID0gImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOwoKZXhwb3J0cy5jcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24odGFnLCBucykgewogICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyA/CiAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG5zIHx8IFhIVE1MX05TLCB0YWcpIDoKICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7Cn07CgpleHBvcnRzLnNldFRleHQgPSBmdW5jdGlvbihlbGVtLCB0ZXh0KSB7CiAgICBpZiAoZWxlbS5pbm5lclRleHQgIT09IHVuZGVmaW5lZCkgewogICAgICAgIGVsZW0uaW5uZXJUZXh0ID0gdGV4dDsKICAgIH0KICAgIGlmIChlbGVtLnRleHRDb250ZW50ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBlbGVtLnRleHRDb250ZW50ID0gdGV4dDsKICAgIH0KfTsKCmV4cG9ydHMuaGFzQ3NzQ2xhc3MgPSBmdW5jdGlvbihlbCwgbmFtZSkgewogICAgdmFyIGNsYXNzZXMgPSBlbC5jbGFzc05hbWUuc3BsaXQoL1xzKy9nKTsKICAgIHJldHVybiBjbGFzc2VzLmluZGV4T2YobmFtZSkgIT09IC0xOwp9OwoKLyoqCiogQWRkIGEgQ1NTIGNsYXNzIHRvIHRoZSBsaXN0IG9mIGNsYXNzZXMgb24gdGhlIGdpdmVuIG5vZGUKKi8KZXhwb3J0cy5hZGRDc3NDbGFzcyA9IGZ1bmN0aW9uKGVsLCBuYW1lKSB7CiAgICBpZiAoIWV4cG9ydHMuaGFzQ3NzQ2xhc3MoZWwsIG5hbWUpKSB7CiAgICAgICAgZWwuY2xhc3NOYW1lICs9ICIgIiArIG5hbWU7CiAgICB9Cn07CgovKioKKiBSZW1vdmUgYSBDU1MgY2xhc3MgZnJvbSB0aGUgbGlzdCBvZiBjbGFzc2VzIG9uIHRoZSBnaXZlbiBub2RlCiovCmV4cG9ydHMucmVtb3ZlQ3NzQ2xhc3MgPSBmdW5jdGlvbihlbCwgbmFtZSkgewogICAgdmFyIGNsYXNzZXMgPSBlbC5jbGFzc05hbWUuc3BsaXQoL1xzKy9nKTsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgdmFyIGluZGV4ID0gY2xhc3Nlcy5pbmRleE9mKG5hbWUpOwogICAgICAgIGlmIChpbmRleCA9PSAtMSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2xhc3Nlcy5zcGxpY2UoaW5kZXgsIDEpOwogICAgfQogICAgZWwuY2xhc3NOYW1lID0gY2xhc3Nlcy5qb2luKCIgIik7Cn07CgpleHBvcnRzLnRvZ2dsZUNzc0NsYXNzID0gZnVuY3Rpb24oZWwsIG5hbWUpIHsKICAgIHZhciBjbGFzc2VzID0gZWwuY2xhc3NOYW1lLnNwbGl0KC9ccysvZyksIGFkZCA9IHRydWU7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIHZhciBpbmRleCA9IGNsYXNzZXMuaW5kZXhPZihuYW1lKTsKICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGFkZCA9IGZhbHNlOwogICAgICAgIGNsYXNzZXMuc3BsaWNlKGluZGV4LCAxKTsKICAgIH0KICAgIGlmKGFkZCkKICAgICAgICBjbGFzc2VzLnB1c2gobmFtZSk7CgogICAgZWwuY2xhc3NOYW1lID0gY2xhc3Nlcy5qb2luKCIgIik7CiAgICByZXR1cm4gYWRkOwp9OwoKLyoqCiAqIEFkZCBvciByZW1vdmUgYSBDU1MgY2xhc3MgZnJvbSB0aGUgbGlzdCBvZiBjbGFzc2VzIG9uIHRoZSBnaXZlbiBub2RlCiAqIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgPHR0PmluY2x1ZGU8L3R0PgogKi8KZXhwb3J0cy5zZXRDc3NDbGFzcyA9IGZ1bmN0aW9uKG5vZGUsIGNsYXNzTmFtZSwgaW5jbHVkZSkgewogICAgaWYgKGluY2x1ZGUpIHsKICAgICAgICBleHBvcnRzLmFkZENzc0NsYXNzKG5vZGUsIGNsYXNzTmFtZSk7CiAgICB9IGVsc2UgewogICAgICAgIGV4cG9ydHMucmVtb3ZlQ3NzQ2xhc3Mobm9kZSwgY2xhc3NOYW1lKTsKICAgIH0KfTsKCmV4cG9ydHMuaGFzQ3NzU3RyaW5nID0gZnVuY3Rpb24oaWQsIGRvYykgewogICAgdmFyIGluZGV4ID0gMCwgc2hlZXRzOwogICAgZG9jID0gZG9jIHx8IGRvY3VtZW50OwoKICAgIGlmIChkb2MuY3JlYXRlU3R5bGVTaGVldCAmJiAoc2hlZXRzID0gZG9jLnN0eWxlU2hlZXRzKSkgewogICAgICAgIHdoaWxlIChpbmRleCA8IHNoZWV0cy5sZW5ndGgpCiAgICAgICAgICAgIGlmIChzaGVldHNbaW5kZXgrK10udGl0bGUgPT09IGlkKSByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSBpZiAoKHNoZWV0cyA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3R5bGUiKSkpIHsKICAgICAgICB3aGlsZSAoaW5kZXggPCBzaGVldHMubGVuZ3RoKQogICAgICAgICAgICBpZiAoc2hlZXRzW2luZGV4KytdLmlkID09PSBpZCkgcmV0dXJuIHRydWU7CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwp9OwoKZXhwb3J0cy5pbXBvcnRDc3NTdHJpbmcgPSBmdW5jdGlvbiBpbXBvcnRDc3NTdHJpbmcoY3NzVGV4dCwgaWQsIGRvYykgewogICAgZG9jID0gZG9jIHx8IGRvY3VtZW50OwogICAgLy8gSWYgc3R5bGUgaXMgYWxyZWFkeSBpbXBvcnRlZCByZXR1cm4gaW1tZWRpYXRlbHkuCiAgICBpZiAoaWQgJiYgZXhwb3J0cy5oYXNDc3NTdHJpbmcoaWQsIGRvYykpCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAKICAgIHZhciBzdHlsZTsKICAgIAogICAgaWYgKGRvYy5jcmVhdGVTdHlsZVNoZWV0KSB7CiAgICAgICAgc3R5bGUgPSBkb2MuY3JlYXRlU3R5bGVTaGVldCgpOwogICAgICAgIHN0eWxlLmNzc1RleHQgPSBjc3NUZXh0OwogICAgICAgIGlmIChpZCkKICAgICAgICAgICAgc3R5bGUudGl0bGUgPSBpZDsKICAgIH0gZWxzZSB7CiAgICAgICAgc3R5bGUgPSBkb2MuY3JlYXRlRWxlbWVudE5TCiAgICAgICAgICAgID8gZG9jLmNyZWF0ZUVsZW1lbnROUyhYSFRNTF9OUywgInN0eWxlIikKICAgICAgICAgICAgOiBkb2MuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKCiAgICAgICAgc3R5bGUuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKGNzc1RleHQpKTsKICAgICAgICBpZiAoaWQpCiAgICAgICAgICAgIHN0eWxlLmlkID0gaWQ7CgogICAgICAgIHZhciBoZWFkID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0gfHwgZG9jLmRvY3VtZW50RWxlbWVudDsKICAgICAgICBoZWFkLmFwcGVuZENoaWxkKHN0eWxlKTsKICAgIH0KfTsKCmV4cG9ydHMuaW1wb3J0Q3NzU3R5bHNoZWV0ID0gZnVuY3Rpb24odXJpLCBkb2MpIHsKICAgIGlmIChkb2MuY3JlYXRlU3R5bGVTaGVldCkgewogICAgICAgIGRvYy5jcmVhdGVTdHlsZVNoZWV0KHVyaSk7CiAgICB9IGVsc2UgewogICAgICAgIHZhciBsaW5rID0gZXhwb3J0cy5jcmVhdGVFbGVtZW50KCdsaW5rJyk7CiAgICAgICAgbGluay5yZWwgPSAnc3R5bGVzaGVldCc7CiAgICAgICAgbGluay5ocmVmID0gdXJpOwoKICAgICAgICB2YXIgaGVhZCA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdIHx8IGRvYy5kb2N1bWVudEVsZW1lbnQ7CiAgICAgICAgaGVhZC5hcHBlbmRDaGlsZChsaW5rKTsKICAgIH0KfTsKCmV4cG9ydHMuZ2V0SW5uZXJXaWR0aCA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgIHJldHVybiAoCiAgICAgICAgcGFyc2VJbnQoZXhwb3J0cy5jb21wdXRlZFN0eWxlKGVsZW1lbnQsICJwYWRkaW5nTGVmdCIpLCAxMCkgKwogICAgICAgIHBhcnNlSW50KGV4cG9ydHMuY29tcHV0ZWRTdHlsZShlbGVtZW50LCAicGFkZGluZ1JpZ2h0IiksIDEwKSArIAogICAgICAgIGVsZW1lbnQuY2xpZW50V2lkdGgKICAgICk7Cn07CgpleHBvcnRzLmdldElubmVySGVpZ2h0ID0gZnVuY3Rpb24oZWxlbWVudCkgewogICAgcmV0dXJuICgKICAgICAgICBwYXJzZUludChleHBvcnRzLmNvbXB1dGVkU3R5bGUoZWxlbWVudCwgInBhZGRpbmdUb3AiKSwgMTApICsKICAgICAgICBwYXJzZUludChleHBvcnRzLmNvbXB1dGVkU3R5bGUoZWxlbWVudCwgInBhZGRpbmdCb3R0b20iKSwgMTApICsKICAgICAgICBlbGVtZW50LmNsaWVudEhlaWdodAogICAgKTsKfTsKCmlmICh3aW5kb3cucGFnZVlPZmZzZXQgIT09IHVuZGVmaW5lZCkgewogICAgZXhwb3J0cy5nZXRQYWdlU2Nyb2xsVG9wID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5wYWdlWU9mZnNldDsKICAgIH07CgogICAgZXhwb3J0cy5nZXRQYWdlU2Nyb2xsTGVmdCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB3aW5kb3cucGFnZVhPZmZzZXQ7CiAgICB9Owp9CmVsc2UgewogICAgZXhwb3J0cy5nZXRQYWdlU2Nyb2xsVG9wID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wOwogICAgfTsKCiAgICBleHBvcnRzLmdldFBhZ2VTY3JvbGxMZWZ0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdDsKICAgIH07Cn0KCmlmICh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSkKICAgIGV4cG9ydHMuY29tcHV0ZWRTdHlsZSA9IGZ1bmN0aW9uKGVsZW1lbnQsIHN0eWxlKSB7CiAgICAgICAgaWYgKHN0eWxlKQogICAgICAgICAgICByZXR1cm4gKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsICIiKSB8fCB7fSlbc3R5bGVdIHx8ICIiOwogICAgICAgIHJldHVybiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50LCAiIikgfHwge307CiAgICB9OwplbHNlCiAgICBleHBvcnRzLmNvbXB1dGVkU3R5bGUgPSBmdW5jdGlvbihlbGVtZW50LCBzdHlsZSkgewogICAgICAgIGlmIChzdHlsZSkKICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuY3VycmVudFN0eWxlW3N0eWxlXTsKICAgICAgICByZXR1cm4gZWxlbWVudC5jdXJyZW50U3R5bGU7CiAgICB9OwoKZXhwb3J0cy5zY3JvbGxiYXJXaWR0aCA9IGZ1bmN0aW9uKGRvY3VtZW50KSB7CgogICAgdmFyIGlubmVyID0gZXhwb3J0cy5jcmVhdGVFbGVtZW50KCJwIik7CiAgICBpbm5lci5zdHlsZS53aWR0aCA9ICIxMDAlIjsKICAgIGlubmVyLnN0eWxlLm1pbldpZHRoID0gIjBweCI7CiAgICBpbm5lci5zdHlsZS5oZWlnaHQgPSAiMjAwcHgiOwoKICAgIHZhciBvdXRlciA9IGV4cG9ydHMuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICB2YXIgc3R5bGUgPSBvdXRlci5zdHlsZTsKCiAgICBzdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAgICBzdHlsZS5sZWZ0ID0gIi0xMDAwMHB4IjsKICAgIHN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CiAgICBzdHlsZS53aWR0aCA9ICIyMDBweCI7CiAgICBzdHlsZS5taW5XaWR0aCA9ICIwcHgiOwogICAgc3R5bGUuaGVpZ2h0ID0gIjE1MHB4IjsKCiAgICBvdXRlci5hcHBlbmRDaGlsZChpbm5lcik7CgogICAgdmFyIGJvZHkgPSBkb2N1bWVudC5ib2R5IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKICAgIGJvZHkuYXBwZW5kQ2hpbGQob3V0ZXIpOwoKICAgIHZhciBub1Njcm9sbGJhciA9IGlubmVyLm9mZnNldFdpZHRoOwoKICAgIHN0eWxlLm92ZXJmbG93ID0gInNjcm9sbCI7CiAgICB2YXIgd2l0aFNjcm9sbGJhciA9IGlubmVyLm9mZnNldFdpZHRoOwoKICAgIGlmIChub1Njcm9sbGJhciA9PSB3aXRoU2Nyb2xsYmFyKSB7CiAgICAgICAgd2l0aFNjcm9sbGJhciA9IG91dGVyLmNsaWVudFdpZHRoOwogICAgfQoKICAgIGJvZHkucmVtb3ZlQ2hpbGQob3V0ZXIpOwoKICAgIHJldHVybiBub1Njcm9sbGJhci13aXRoU2Nyb2xsYmFyOwp9OwoKLyoqCiAqIE9wdGltaXplZCBzZXQgaW5uZXJIVE1MLiBUaGlzIGlzIGZhc3RlciB0aGFuIHBsYWluIGlubmVySFRNTCBpZiB0aGUgZWxlbWVudAogKiBhbHJlYWR5IGNvbnRhaW5zIGEgbG90IG9mIGNoaWxkIGVsZW1lbnRzLgogKgogKiBTZWUgaHR0cDovL2Jsb2cuc3RldmVubGV2aXRoYW4uY29tL2FyY2hpdmVzL2Zhc3Rlci10aGFuLWlubmVyaHRtbCBmb3IgZGV0YWlscwogKi8KZXhwb3J0cy5zZXRJbm5lckh0bWwgPSBmdW5jdGlvbihlbCwgaW5uZXJIdG1sKSB7CiAgICB2YXIgZWxlbWVudCA9IGVsLmNsb25lTm9kZShmYWxzZSk7Ly9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gaW5uZXJIdG1sOwogICAgZWwucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZWxlbWVudCwgZWwpOwogICAgcmV0dXJuIGVsZW1lbnQ7Cn07CgpleHBvcnRzLnNldElubmVyVGV4dCA9IGZ1bmN0aW9uKGVsLCBpbm5lclRleHQpIHsKICAgIHZhciBkb2N1bWVudCA9IGVsLm93bmVyRG9jdW1lbnQ7CiAgICBpZiAoZG9jdW1lbnQuYm9keSAmJiAidGV4dENvbnRlbnQiIGluIGRvY3VtZW50LmJvZHkpCiAgICAgICAgZWwudGV4dENvbnRlbnQgPSBpbm5lclRleHQ7CiAgICBlbHNlCiAgICAgICAgZWwuaW5uZXJUZXh0ID0gaW5uZXJUZXh0OwoKfTsKCmV4cG9ydHMuZ2V0SW5uZXJUZXh0ID0gZnVuY3Rpb24oZWwpIHsKICAgIHZhciBkb2N1bWVudCA9IGVsLm93bmVyRG9jdW1lbnQ7CiAgICBpZiAoZG9jdW1lbnQuYm9keSAmJiAidGV4dENvbnRlbnQiIGluIGRvY3VtZW50LmJvZHkpCiAgICAgICAgcmV0dXJuIGVsLnRleHRDb250ZW50OwogICAgZWxzZQogICAgICAgICByZXR1cm4gZWwuaW5uZXJUZXh0IHx8IGVsLnRleHRDb250ZW50IHx8ICIiOwp9OwoKZXhwb3J0cy5nZXRQYXJlbnRXaW5kb3cgPSBmdW5jdGlvbihkb2N1bWVudCkgewogICAgcmV0dXJuIGRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IGRvY3VtZW50LnBhcmVudFdpbmRvdzsKfTsKCn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9saWIvZXZlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIva2V5cycsICdhY2UvbGliL3VzZXJhZ2VudCcsICdhY2UvbGliL2RvbSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIGtleXMgPSByZXF1aXJlKCIuL2tleXMiKTsKdmFyIHVzZXJhZ2VudCA9IHJlcXVpcmUoIi4vdXNlcmFnZW50Iik7CnZhciBkb20gPSByZXF1aXJlKCIuL2RvbSIpOwoKZXhwb3J0cy5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uKGVsZW0sIHR5cGUsIGNhbGxiYWNrKSB7CiAgICBpZiAoZWxlbS5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgICAgcmV0dXJuIGVsZW0uYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxsYmFjaywgZmFsc2UpOwogICAgfQogICAgaWYgKGVsZW0uYXR0YWNoRXZlbnQpIHsKICAgICAgICB2YXIgd3JhcHBlciA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjYWxsYmFjayh3aW5kb3cuZXZlbnQpOwogICAgICAgIH07CiAgICAgICAgY2FsbGJhY2suX3dyYXBwZXIgPSB3cmFwcGVyOwogICAgICAgIGVsZW0uYXR0YWNoRXZlbnQoIm9uIiArIHR5cGUsIHdyYXBwZXIpOwogICAgfQp9OwoKZXhwb3J0cy5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uKGVsZW0sIHR5cGUsIGNhbGxiYWNrKSB7CiAgICBpZiAoZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKSB7CiAgICAgICAgcmV0dXJuIGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxsYmFjaywgZmFsc2UpOwogICAgfQogICAgaWYgKGVsZW0uZGV0YWNoRXZlbnQpIHsKICAgICAgICBlbGVtLmRldGFjaEV2ZW50KCJvbiIgKyB0eXBlLCBjYWxsYmFjay5fd3JhcHBlciB8fCBjYWxsYmFjayk7CiAgICB9Cn07CgovKioKKiBQcmV2ZW50cyBwcm9wYWdhdGlvbiBhbmQgY2xvYmJlcnMgdGhlIGRlZmF1bHQgYWN0aW9uIG9mIHRoZSBwYXNzZWQgZXZlbnQKKi8KZXhwb3J0cy5zdG9wRXZlbnQgPSBmdW5jdGlvbihlKSB7CiAgICBleHBvcnRzLnN0b3BQcm9wYWdhdGlvbihlKTsKICAgIGV4cG9ydHMucHJldmVudERlZmF1bHQoZSk7CiAgICByZXR1cm4gZmFsc2U7Cn07CgpleHBvcnRzLnN0b3BQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uKGUpIHsKICAgIGlmIChlLnN0b3BQcm9wYWdhdGlvbikKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgZWxzZQogICAgICAgIGUuY2FuY2VsQnViYmxlID0gdHJ1ZTsKfTsKCmV4cG9ydHMucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbihlKSB7CiAgICBpZiAoZS5wcmV2ZW50RGVmYXVsdCkKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICBlbHNlCiAgICAgICAgZS5yZXR1cm5WYWx1ZSA9IGZhbHNlOwp9OwoKZXhwb3J0cy5nZXREb2N1bWVudFggPSBmdW5jdGlvbihlKSB7CiAgICBpZiAoZS5jbGllbnRYKSB7CiAgICAgICAgcmV0dXJuIGUuY2xpZW50WCArIGRvbS5nZXRQYWdlU2Nyb2xsTGVmdCgpOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZS5wYWdlWDsKICAgIH0KfTsKCmV4cG9ydHMuZ2V0RG9jdW1lbnRZID0gZnVuY3Rpb24oZSkgewogICAgaWYgKGUuY2xpZW50WSkgewogICAgICAgIHJldHVybiBlLmNsaWVudFkgKyBkb20uZ2V0UGFnZVNjcm9sbFRvcCgpOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZS5wYWdlWTsKICAgIH0KfTsKCi8qKgogKiBAcmV0dXJuIHtOdW1iZXJ9IDAgZm9yIGxlZnQgYnV0dG9uLCAxIGZvciBtaWRkbGUgYnV0dG9uLCAyIGZvciByaWdodCBidXR0b24KICovCmV4cG9ydHMuZ2V0QnV0dG9uID0gZnVuY3Rpb24oZSkgewogICAgaWYgKGUudHlwZSA9PSAiZGJsY2xpY2siKQogICAgICAgIHJldHVybiAwOwogICAgZWxzZSBpZiAoZS50eXBlID09ICJjb250ZXh0bWVudSIpCiAgICAgICAgcmV0dXJuIDI7CgogICAgLy8gRE9NIEV2ZW50CiAgICBpZiAoZS5wcmV2ZW50RGVmYXVsdCkgewogICAgICAgIHJldHVybiBlLmJ1dHRvbjsKICAgIH0KICAgIC8vIG9sZCBJRQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIHsxOjAsIDI6MiwgNDoxfVtlLmJ1dHRvbl07CiAgICB9Cn07CgppZiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNldENhcHR1cmUpIHsKICAgIGV4cG9ydHMuY2FwdHVyZSA9IGZ1bmN0aW9uKGVsLCBldmVudEhhbmRsZXIsIHJlbGVhc2VDYXB0dXJlSGFuZGxlcikgewogICAgICAgIGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGUpIHsKICAgICAgICAgICAgZXZlbnRIYW5kbGVyKGUpOwogICAgICAgICAgICByZXR1cm4gZXhwb3J0cy5zdG9wUHJvcGFnYXRpb24oZSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgY2FsbGVkID0gZmFsc2U7CiAgICAgICAgZnVuY3Rpb24gb25SZWxlYXNlQ2FwdHVyZShlKSB7CiAgICAgICAgICAgIGV2ZW50SGFuZGxlcihlKTsKCiAgICAgICAgICAgIGlmICghY2FsbGVkKSB7CiAgICAgICAgICAgICAgICBjYWxsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgcmVsZWFzZUNhcHR1cmVIYW5kbGVyKGUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBleHBvcnRzLnJlbW92ZUxpc3RlbmVyKGVsLCAibW91c2Vtb3ZlIiwgZXZlbnRIYW5kbGVyKTsKICAgICAgICAgICAgZXhwb3J0cy5yZW1vdmVMaXN0ZW5lcihlbCwgIm1vdXNldXAiLCBvblJlbGVhc2VDYXB0dXJlKTsKICAgICAgICAgICAgZXhwb3J0cy5yZW1vdmVMaXN0ZW5lcihlbCwgImxvc2VjYXB0dXJlIiwgb25SZWxlYXNlQ2FwdHVyZSk7CgogICAgICAgICAgICBlbC5yZWxlYXNlQ2FwdHVyZSgpOwogICAgICAgIH0KCiAgICAgICAgZXhwb3J0cy5hZGRMaXN0ZW5lcihlbCwgIm1vdXNlbW92ZSIsIGV2ZW50SGFuZGxlcik7CiAgICAgICAgZXhwb3J0cy5hZGRMaXN0ZW5lcihlbCwgIm1vdXNldXAiLCBvblJlbGVhc2VDYXB0dXJlKTsKICAgICAgICBleHBvcnRzLmFkZExpc3RlbmVyKGVsLCAibG9zZWNhcHR1cmUiLCBvblJlbGVhc2VDYXB0dXJlKTsKICAgICAgICBlbC5zZXRDYXB0dXJlKCk7CiAgICB9Owp9CmVsc2UgewogICAgZXhwb3J0cy5jYXB0dXJlID0gZnVuY3Rpb24oZWwsIGV2ZW50SGFuZGxlciwgcmVsZWFzZUNhcHR1cmVIYW5kbGVyKSB7CiAgICAgICAgZnVuY3Rpb24gb25Nb3VzZU1vdmUoZSkgewogICAgICAgICAgICBldmVudEhhbmRsZXIoZSk7CiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBvbk1vdXNlVXAoZSkgewogICAgICAgICAgICBldmVudEhhbmRsZXIgJiYgZXZlbnRIYW5kbGVyKGUpOwogICAgICAgICAgICByZWxlYXNlQ2FwdHVyZUhhbmRsZXIgJiYgcmVsZWFzZUNhcHR1cmVIYW5kbGVyKGUpOwoKICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgb25Nb3VzZU1vdmUsIHRydWUpOwogICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgb25Nb3VzZVVwLCB0cnVlKTsKCiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgfQoKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCBvbk1vdXNlTW92ZSwgdHJ1ZSk7CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsIG9uTW91c2VVcCwgdHJ1ZSk7CiAgICB9Owp9CgpleHBvcnRzLmFkZE1vdXNlV2hlZWxMaXN0ZW5lciA9IGZ1bmN0aW9uKGVsLCBjYWxsYmFjaykgewogICAgdmFyIG1heCA9IDA7CiAgICB2YXIgbGlzdGVuZXIgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgaWYgKGUud2hlZWxEZWx0YSAhPT0gdW5kZWZpbmVkKSB7CgogICAgICAgICAgICAvLyBzb21lIHZlcnNpb25zIG9mIFNhZmFyaSAoZS5nLiA1LjAuNSkgcmVwb3J0IGluc2FuZWx5IGhpZ2gKICAgICAgICAgICAgLy8gc2Nyb2xsIHZhbHVlcy4gVGhlc2UgYnJvd3NlcnMgcmVxdWlyZSBhIGhpZ2hlciBmYWN0b3IKICAgICAgICAgICAgaWYgKE1hdGguYWJzKGUud2hlZWxEZWx0YVkpID4gbWF4KQogICAgICAgICAgICAgICAgbWF4ID0gTWF0aC5hYnMoZS53aGVlbERlbHRhWSk7CgogICAgICAgICAgICBpZiAobWF4ID4gNTAwMCkKICAgICAgICAgICAgICAgIHZhciBmYWN0b3IgPSA0MDA7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHZhciBmYWN0b3IgPSA4OwoKICAgICAgICAgICAgaWYgKGUud2hlZWxEZWx0YVggIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgZS53aGVlbFggPSAtZS53aGVlbERlbHRhWCAvIGZhY3RvcjsKICAgICAgICAgICAgICAgIGUud2hlZWxZID0gLWUud2hlZWxEZWx0YVkgLyBmYWN0b3I7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBlLndoZWVsWCA9IDA7CiAgICAgICAgICAgICAgICBlLndoZWVsWSA9IC1lLndoZWVsRGVsdGEgLyBmYWN0b3I7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmIChlLmF4aXMgJiYgZS5heGlzID09IGUuSE9SSVpPTlRBTF9BWElTKSB7CiAgICAgICAgICAgICAgICBlLndoZWVsWCA9IChlLmRldGFpbCB8fCAwKSAqIDU7CiAgICAgICAgICAgICAgICBlLndoZWVsWSA9IDA7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBlLndoZWVsWCA9IDA7CiAgICAgICAgICAgICAgICBlLndoZWVsWSA9IChlLmRldGFpbCB8fCAwKSAqIDU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2FsbGJhY2soZSk7CiAgICB9OwogICAgZXhwb3J0cy5hZGRMaXN0ZW5lcihlbCwgIkRPTU1vdXNlU2Nyb2xsIiwgbGlzdGVuZXIpOwogICAgZXhwb3J0cy5hZGRMaXN0ZW5lcihlbCwgIm1vdXNld2hlZWwiLCBsaXN0ZW5lcik7Cn07CgpleHBvcnRzLmFkZE11bHRpTW91c2VEb3duTGlzdGVuZXIgPSBmdW5jdGlvbihlbCwgYnV0dG9uLCBjb3VudCwgdGltZW91dCwgY2FsbGJhY2spIHsKICAgIHZhciBjbGlja3MgPSAwOwogICAgdmFyIHN0YXJ0WCwgc3RhcnRZOwoKICAgIHZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICBjbGlja3MgKz0gMTsKICAgICAgICBpZiAoY2xpY2tzID09IDEpIHsKICAgICAgICAgICAgc3RhcnRYID0gZS5jbGllbnRYOwogICAgICAgICAgICBzdGFydFkgPSBlLmNsaWVudFk7CgogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgY2xpY2tzID0gMDsKICAgICAgICAgICAgfSwgdGltZW91dCB8fCA2MDApOwogICAgICAgIH0KCiAgICAgICAgdmFyIGlzQnV0dG9uID0gZXhwb3J0cy5nZXRCdXR0b24oZSkgPT0gYnV0dG9uOwogICAgICAgIGlmICghaXNCdXR0b24gfHwgTWF0aC5hYnMoZS5jbGllbnRYIC0gc3RhcnRYKSA+IDUgfHwgTWF0aC5hYnMoZS5jbGllbnRZIC0gc3RhcnRZKSA+IDUpCiAgICAgICAgICAgIGNsaWNrcyA9IDA7CgogICAgICAgIGlmIChjbGlja3MgPT0gY291bnQpIHsKICAgICAgICAgICAgY2xpY2tzID0gMDsKICAgICAgICAgICAgY2FsbGJhY2soZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNCdXR0b24pCiAgICAgICAgICAgIHJldHVybiBleHBvcnRzLnByZXZlbnREZWZhdWx0KGUpOwogICAgfTsKCiAgICBleHBvcnRzLmFkZExpc3RlbmVyKGVsLCAibW91c2Vkb3duIiwgbGlzdGVuZXIpOwogICAgdXNlcmFnZW50LmlzT2xkSUUgJiYgZXhwb3J0cy5hZGRMaXN0ZW5lcihlbCwgImRibGNsaWNrIiwgbGlzdGVuZXIpOwp9OwoKZnVuY3Rpb24gbm9ybWFsaXplQ29tbWFuZEtleXMoY2FsbGJhY2ssIGUsIGtleUNvZGUpIHsKICAgIHZhciBoYXNoSWQgPSAwOwogICAgaWYgKHVzZXJhZ2VudC5pc09wZXJhICYmIHVzZXJhZ2VudC5pc01hYykgewogICAgICAgIGhhc2hJZCA9IDAgfCAoZS5tZXRhS2V5ID8gMSA6IDApIHwgKGUuYWx0S2V5ID8gMiA6IDApCiAgICAgICAgICAgIHwgKGUuc2hpZnRLZXkgPyA0IDogMCkgfCAoZS5jdHJsS2V5ID8gOCA6IDApOwogICAgfSBlbHNlIHsKICAgICAgICBoYXNoSWQgPSAwIHwgKGUuY3RybEtleSA/IDEgOiAwKSB8IChlLmFsdEtleSA/IDIgOiAwKQogICAgICAgICAgICB8IChlLnNoaWZ0S2V5ID8gNCA6IDApIHwgKGUubWV0YUtleSA/IDggOiAwKTsKICAgIH0KCiAgICBpZiAoa2V5Q29kZSBpbiBrZXlzLk1PRElGSUVSX0tFWVMpIHsKICAgICAgICBzd2l0Y2ggKGtleXMuTU9ESUZJRVJfS0VZU1trZXlDb2RlXSkgewogICAgICAgICAgICBjYXNlICJBbHQiOgogICAgICAgICAgICAgICAgaGFzaElkID0gMjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJTaGlmdCI6CiAgICAgICAgICAgICAgICBoYXNoSWQgPSA0OwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgIkN0cmwiOgogICAgICAgICAgICAgICAgaGFzaElkID0gMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgaGFzaElkID0gODsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBrZXlDb2RlID0gMDsKICAgIH0KCiAgICBpZiAoaGFzaElkICYgOCAmJiAoa2V5Q29kZSA9PSA5MSB8fCBrZXlDb2RlID09IDkzKSkgewogICAgICAgIGtleUNvZGUgPSAwOwogICAgfQoKICAgIC8vIElmIHRoZXJlIGlzIG5vIGhhc2hJRCBhbmQgdGhlIGtleUNvZGUgaXMgbm90IGEgZnVuY3Rpb24ga2V5LCB0aGVuCiAgICAvLyB3ZSBkb24ndCBjYWxsIHRoZSBjYWxsYmFjayBhcyB3ZSBkb24ndCBoYW5kbGUgYSBjb21tYW5kIGtleSBoZXJlCiAgICAvLyAoaXQncyBhIG5vcm1hbCBrZXkvY2hhcmFjdGVyIGlucHV0KS4KICAgIGlmICghaGFzaElkICYmICEoa2V5Q29kZSBpbiBrZXlzLkZVTkNUSU9OX0tFWVMpICYmICEoa2V5Q29kZSBpbiBrZXlzLlBSSU5UQUJMRV9LRVlTKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiBjYWxsYmFjayhlLCBoYXNoSWQsIGtleUNvZGUpOwp9CgpleHBvcnRzLmFkZENvbW1hbmRLZXlMaXN0ZW5lciA9IGZ1bmN0aW9uKGVsLCBjYWxsYmFjaykgewogICAgdmFyIGFkZExpc3RlbmVyID0gZXhwb3J0cy5hZGRMaXN0ZW5lcjsKICAgIGlmICh1c2VyYWdlbnQuaXNPbGRHZWNrbyB8fCB1c2VyYWdlbnQuaXNPcGVyYSkgewogICAgICAgIC8vIE9sZCB2ZXJzaW9ucyBvZiBHZWNrbyBha2EuIEZpcmVmb3ggPCA0LjAgZGlkbid0IHJlcGVhdCB0aGUga2V5ZG93bgogICAgICAgIC8vIGV2ZW50IGlmIHRoZSB1c2VyIHByZXNzZWQgdGhlIGtleSBmb3IgYSBsb25nZXIgdGltZS4gSW5zdGVhZCwgdGhlCiAgICAgICAgLy8ga2V5ZG93biBldmVudCB3YXMgZmlyZWQgb25jZSBhbmQgbGF0ZXIgb24gb25seSB0aGUga2V5cHJlc3MgZXZlbnQuCiAgICAgICAgLy8gVG8gZW11bGF0ZSB0aGUgJ3JpZ2h0JyBrZXlkb3duIGJlaGF2aW9yLCB0aGUga2V5Q29kZSBvZiB0aGUgaW5pdGlhbAogICAgICAgIC8vIGtleURvd24gZXZlbnQgaXMgc3RvcmVkIGFuZCBpbiB0aGUgZm9sbG93aW5nIGtleXByZXNzIGV2ZW50cyB0aGUKICAgICAgICAvLyBzdG9yZXMga2V5Q29kZSBpcyB1c2VkIHRvIGVtdWxhdGUgYSBrZXlEb3duIGV2ZW50LgogICAgICAgIHZhciBsYXN0S2V5RG93bktleUNvZGUgPSBudWxsOwogICAgICAgIGFkZExpc3RlbmVyKGVsLCAia2V5ZG93biIsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgbGFzdEtleURvd25LZXlDb2RlID0gZS5rZXlDb2RlOwogICAgICAgIH0pOwogICAgICAgIGFkZExpc3RlbmVyKGVsLCAia2V5cHJlc3MiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIHJldHVybiBub3JtYWxpemVDb21tYW5kS2V5cyhjYWxsYmFjaywgZSwgbGFzdEtleURvd25LZXlDb2RlKTsKICAgICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIGxhc3REb3duID0gbnVsbDsKCiAgICAgICAgYWRkTGlzdGVuZXIoZWwsICJrZXlkb3duIiwgZnVuY3Rpb24oZSkgewogICAgICAgICAgICBsYXN0RG93biA9IGUua2V5SWRlbnRpZmllciB8fCBlLmtleUNvZGU7CiAgICAgICAgICAgIHJldHVybiBub3JtYWxpemVDb21tYW5kS2V5cyhjYWxsYmFjaywgZSwgZS5rZXlDb2RlKTsKICAgICAgICB9KTsKICAgIH0KfTsKCmlmICh3aW5kb3cucG9zdE1lc3NhZ2UpIHsKICAgIHZhciBwb3N0TWVzc2FnZUlkID0gMTsKICAgIGV4cG9ydHMubmV4dFRpY2sgPSBmdW5jdGlvbihjYWxsYmFjaywgd2luKSB7CiAgICAgICAgd2luID0gd2luIHx8IHdpbmRvdzsKICAgICAgICB2YXIgbWVzc2FnZU5hbWUgPSAiemVyby10aW1lb3V0LW1lc3NhZ2UtIiArIHBvc3RNZXNzYWdlSWQ7ICAgICAgICAgICAgCiAgICAgICAgZXhwb3J0cy5hZGRMaXN0ZW5lcih3aW4sICJtZXNzYWdlIiwgZnVuY3Rpb24gbGlzdGVuZXIoZSkgewogICAgICAgICAgICBpZiAoZS5kYXRhID09IG1lc3NhZ2VOYW1lKSB7CiAgICAgICAgICAgICAgICBleHBvcnRzLnN0b3BQcm9wYWdhdGlvbihlKTsKICAgICAgICAgICAgICAgIGV4cG9ydHMucmVtb3ZlTGlzdGVuZXIod2luLCAibWVzc2FnZSIsIGxpc3RlbmVyKTsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICB3aW4ucG9zdE1lc3NhZ2UobWVzc2FnZU5hbWUsICIqIik7CiAgICB9Owp9CmVsc2UgewogICAgZXhwb3J0cy5uZXh0VGljayA9IGZ1bmN0aW9uKGNhbGxiYWNrLCB3aW4pIHsKICAgICAgICB3aW4gPSB3aW4gfHwgd2luZG93OwogICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGNhbGxiYWNrLCAwKTsKICAgIH07Cn0KCn0pOwovKiEgQGxpY2Vuc2UKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KU3Byb3V0Q29yZSAtLSBKYXZhU2NyaXB0IEFwcGxpY2F0aW9uIEZyYW1ld29yawpjb3B5cmlnaHQgMjAwNi0yMDA5LCBTcHJvdXQgU3lzdGVtcyBJbmMuLCBBcHBsZSBJbmMuIGFuZCBjb250cmlidXRvcnMuCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQpjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAp0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCnRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAphbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCkZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKU3Byb3V0Q29yZSBhbmQgdGhlIFNwcm91dENvcmUgbG9nbyBhcmUgdHJhZGVtYXJrcyBvZiBTcHJvdXQgU3lzdGVtcywgSW5jLgoKRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgU3Byb3V0Q29yZSwgdmlzaXQgaHR0cDovL3d3dy5zcHJvdXRjb3JlLmNvbQoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBsaWNlbnNlICovCgovLyBNb3N0IG9mIHRoZSBmb2xsb3dpbmcgY29kZSBpcyB0YWtlbiBmcm9tIFNwcm91dENvcmUgd2l0aCBhIGZldyBjaGFuZ2VzLgoKZGVmaW5lKCdhY2UvbGliL2tleXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi9vb3AiKTsKCi8qKgogKiBIZWxwZXIgZnVuY3Rpb25zIGFuZCBoYXNoZXMgZm9yIGtleSBoYW5kbGluZy4KICovCnZhciBLZXlzID0gKGZ1bmN0aW9uKCkgewogICAgdmFyIHJldCA9IHsKICAgICAgICBNT0RJRklFUl9LRVlTOiB7CiAgICAgICAgICAgIDE2OiAnU2hpZnQnLCAxNzogJ0N0cmwnLCAxODogJ0FsdCcsIDIyNDogJ01ldGEnCiAgICAgICAgfSwKCiAgICAgICAgS0VZX01PRFM6IHsKICAgICAgICAgICAgImN0cmwiOiAxLCAiYWx0IjogMiwgIm9wdGlvbiIgOiAyLAogICAgICAgICAgICAic2hpZnQiOiA0LCAibWV0YSI6IDgsICJjb21tYW5kIjogOAogICAgICAgIH0sCgogICAgICAgIEZVTkNUSU9OX0tFWVMgOiB7CiAgICAgICAgICAgIDggIDogIkJhY2tzcGFjZSIsCiAgICAgICAgICAgIDkgIDogIlRhYiIsCiAgICAgICAgICAgIDEzIDogIlJldHVybiIsCiAgICAgICAgICAgIDE5IDogIlBhdXNlIiwKICAgICAgICAgICAgMjcgOiAiRXNjIiwKICAgICAgICAgICAgMzIgOiAiU3BhY2UiLAogICAgICAgICAgICAzMyA6ICJQYWdlVXAiLAogICAgICAgICAgICAzNCA6ICJQYWdlRG93biIsCiAgICAgICAgICAgIDM1IDogIkVuZCIsCiAgICAgICAgICAgIDM2IDogIkhvbWUiLAogICAgICAgICAgICAzNyA6ICJMZWZ0IiwKICAgICAgICAgICAgMzggOiAiVXAiLAogICAgICAgICAgICAzOSA6ICJSaWdodCIsCiAgICAgICAgICAgIDQwIDogIkRvd24iLAogICAgICAgICAgICA0NCA6ICJQcmludCIsCiAgICAgICAgICAgIDQ1IDogIkluc2VydCIsCiAgICAgICAgICAgIDQ2IDogIkRlbGV0ZSIsCiAgICAgICAgICAgIDk2IDogIk51bXBhZDAiLAogICAgICAgICAgICA5NyA6ICJOdW1wYWQxIiwKICAgICAgICAgICAgOTggOiAiTnVtcGFkMiIsCiAgICAgICAgICAgIDk5IDogIk51bXBhZDMiLAogICAgICAgICAgICAxMDA6ICJOdW1wYWQ0IiwKICAgICAgICAgICAgMTAxOiAiTnVtcGFkNSIsCiAgICAgICAgICAgIDEwMjogIk51bXBhZDYiLAogICAgICAgICAgICAxMDM6ICJOdW1wYWQ3IiwKICAgICAgICAgICAgMTA0OiAiTnVtcGFkOCIsCiAgICAgICAgICAgIDEwNTogIk51bXBhZDkiLAogICAgICAgICAgICAxMTI6ICJGMSIsCiAgICAgICAgICAgIDExMzogIkYyIiwKICAgICAgICAgICAgMTE0OiAiRjMiLAogICAgICAgICAgICAxMTU6ICJGNCIsCiAgICAgICAgICAgIDExNjogIkY1IiwKICAgICAgICAgICAgMTE3OiAiRjYiLAogICAgICAgICAgICAxMTg6ICJGNyIsCiAgICAgICAgICAgIDExOTogIkY4IiwKICAgICAgICAgICAgMTIwOiAiRjkiLAogICAgICAgICAgICAxMjE6ICJGMTAiLAogICAgICAgICAgICAxMjI6ICJGMTEiLAogICAgICAgICAgICAxMjM6ICJGMTIiLAogICAgICAgICAgICAxNDQ6ICJOdW1sb2NrIiwKICAgICAgICAgICAgMTQ1OiAiU2Nyb2xsbG9jayIKICAgICAgICB9LAoKICAgICAgICBQUklOVEFCTEVfS0VZUzogewogICAgICAgICAgIDMyOiAnICcsICA0ODogJzAnLCAgNDk6ICcxJywgIDUwOiAnMicsICA1MTogJzMnLCAgNTI6ICc0JywgNTM6ICAnNScsCiAgICAgICAgICAgNTQ6ICc2JywgIDU1OiAnNycsICA1NjogJzgnLCAgNTc6ICc5JywgIDU5OiAnOycsICA2MTogJz0nLCA2NTogICdhJywKICAgICAgICAgICA2NjogJ2InLCAgNjc6ICdjJywgIDY4OiAnZCcsICA2OTogJ2UnLCAgNzA6ICdmJywgIDcxOiAnZycsIDcyOiAgJ2gnLAogICAgICAgICAgIDczOiAnaScsICA3NDogJ2onLCAgNzU6ICdrJywgIDc2OiAnbCcsICA3NzogJ20nLCAgNzg6ICduJywgNzk6ICAnbycsCiAgICAgICAgICAgODA6ICdwJywgIDgxOiAncScsICA4MjogJ3InLCAgODM6ICdzJywgIDg0OiAndCcsICA4NTogJ3UnLCA4NjogICd2JywKICAgICAgICAgICA4NzogJ3cnLCAgODg6ICd4JywgIDg5OiAneScsICA5MDogJ3onLCAxMDc6ICcrJywgMTA5OiAnLScsIDExMDogJy4nLAogICAgICAgICAgMTg4OiAnLCcsIDE5MDogJy4nLCAxOTE6ICcvJywgMTkyOiAnYCcsIDIxOTogJ1snLCAyMjA6ICdcXCcsCiAgICAgICAgICAyMjE6ICddJywgMjIyOiAnXCInCiAgICAgICAgfQogICAgfTsKCiAgICAvLyBBIHJldmVyc2UgbWFwIG9mIEZVTkNUSU9OX0tFWVMKICAgIGZvciAodmFyIGkgaW4gcmV0LkZVTkNUSU9OX0tFWVMpIHsKICAgICAgICB2YXIgbmFtZSA9IHJldC5GVU5DVElPTl9LRVlTW2ldLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgcmV0W25hbWVdID0gcGFyc2VJbnQoaSwgMTApOwogICAgfQoKICAgIC8vIEFkZCB0aGUgTU9ESUZJRVJfS0VZUywgRlVOQ1RJT05fS0VZUyBhbmQgUFJJTlRBQkxFX0tFWVMgdG8gdGhlIEtFWQogICAgLy8gdmFyaWFibGVzIGFzIHdlbGwuCiAgICBvb3AubWl4aW4ocmV0LCByZXQuTU9ESUZJRVJfS0VZUyk7CiAgICBvb3AubWl4aW4ocmV0LCByZXQuUFJJTlRBQkxFX0tFWVMpOwogICAgb29wLm1peGluKHJldCwgcmV0LkZVTkNUSU9OX0tFWVMpOwoKICAgIHJldHVybiByZXQ7Cn0pKCk7Cm9vcC5taXhpbihleHBvcnRzLCBLZXlzKTsKCmV4cG9ydHMua2V5Q29kZVRvU3RyaW5nID0gZnVuY3Rpb24oa2V5Q29kZSkgewogICAgcmV0dXJuIChLZXlzW2tleUNvZGVdIHx8IFN0cmluZy5mcm9tQ2hhckNvZGUoa2V5Q29kZSkpLnRvTG93ZXJDYXNlKCk7Cn0KCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL2xpYi9vb3AnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7CgpleHBvcnRzLmluaGVyaXRzID0gKGZ1bmN0aW9uKCkgewogICAgdmFyIHRlbXBDdG9yID0gZnVuY3Rpb24oKSB7fTsKICAgIHJldHVybiBmdW5jdGlvbihjdG9yLCBzdXBlckN0b3IpIHsKICAgICAgICB0ZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlOwogICAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yLnByb3RvdHlwZTsKICAgICAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyB0ZW1wQ3RvcigpOwogICAgICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvcjsKICAgIH07Cn0oKSk7CgpleHBvcnRzLm1peGluID0gZnVuY3Rpb24ob2JqLCBtaXhpbikgewogICAgZm9yICh2YXIga2V5IGluIG1peGluKSB7CiAgICAgICAgb2JqW2tleV0gPSBtaXhpbltrZXldOwogICAgfQp9OwoKZXhwb3J0cy5pbXBsZW1lbnQgPSBmdW5jdGlvbihwcm90bywgbWl4aW4pIHsKICAgIGV4cG9ydHMubWl4aW4ocHJvdG8sIG1peGluKTsKfTsKCn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9saWIvdXNlcmFnZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9zID0gKG5hdmlnYXRvci5wbGF0Zm9ybS5tYXRjaCgvbWFjfHdpbnxsaW51eC9pKSB8fCBbIm90aGVyIl0pWzBdLnRvTG93ZXJDYXNlKCk7CnZhciB1YSA9IG5hdmlnYXRvci51c2VyQWdlbnQ7CgovKiogSXMgdGhlIHVzZXIgdXNpbmcgYSBicm93c2VyIHRoYXQgaWRlbnRpZmllcyBpdHNlbGYgYXMgV2luZG93cyAqLwpleHBvcnRzLmlzV2luID0gKG9zID09ICJ3aW4iKTsKCi8qKiBJcyB0aGUgdXNlciB1c2luZyBhIGJyb3dzZXIgdGhhdCBpZGVudGlmaWVzIGl0c2VsZiBhcyBNYWMgT1MgKi8KZXhwb3J0cy5pc01hYyA9IChvcyA9PSAibWFjIik7CgovKiogSXMgdGhlIHVzZXIgdXNpbmcgYSBicm93c2VyIHRoYXQgaWRlbnRpZmllcyBpdHNlbGYgYXMgTGludXggKi8KZXhwb3J0cy5pc0xpbnV4ID0gKG9zID09ICJsaW51eCIpOwoKZXhwb3J0cy5pc0lFID0gCiAgICBuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIgogICAgJiYgcGFyc2VGbG9hdChuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9NU0lFIChbMC05XStbXC4wLTldKykvKVsxXSk7CiAgICAKZXhwb3J0cy5pc09sZElFID0gZXhwb3J0cy5pc0lFICYmIGV4cG9ydHMuaXNJRSA8IDk7CgovKiogSXMgdGhpcyBGaXJlZm94IG9yIHJlbGF0ZWQ/ICovCmV4cG9ydHMuaXNHZWNrbyA9IGV4cG9ydHMuaXNNb3ppbGxhID0gd2luZG93LmNvbnRyb2xsZXJzICYmIHdpbmRvdy5uYXZpZ2F0b3IucHJvZHVjdCA9PT0gIkdlY2tvIjsKCi8qKiBvbGRHZWNrbyA9PSByZXYgPCAyLjAgKiovCmV4cG9ydHMuaXNPbGRHZWNrbyA9IGV4cG9ydHMuaXNHZWNrbyAmJiBwYXJzZUludCgobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvcnZcOihcZCspLyl8fFtdKVsxXSwgMTApIDwgNDsKCi8qKiBJcyB0aGlzIE9wZXJhICovCmV4cG9ydHMuaXNPcGVyYSA9IHdpbmRvdy5vcGVyYSAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2luZG93Lm9wZXJhKSA9PSAiW29iamVjdCBPcGVyYV0iOwoKLyoqIElzIHRoZSB1c2VyIHVzaW5nIGEgYnJvd3NlciB0aGF0IGlkZW50aWZpZXMgaXRzZWxmIGFzIFdlYktpdCAqLwpleHBvcnRzLmlzV2ViS2l0ID0gcGFyc2VGbG9hdCh1YS5zcGxpdCgiV2ViS2l0LyIpWzFdKSB8fCB1bmRlZmluZWQ7CgpleHBvcnRzLmlzQ2hyb21lID0gcGFyc2VGbG9hdCh1YS5zcGxpdCgiIENocm9tZS8iKVsxXSkgfHwgdW5kZWZpbmVkOwoKZXhwb3J0cy5pc0FJUiA9IHVhLmluZGV4T2YoIkFkb2JlQUlSIikgPj0gMDsKCmV4cG9ydHMuaXNJUGFkID0gdWEuaW5kZXhPZigiaVBhZCIpID49IDA7CgpleHBvcnRzLmlzVG91Y2hQYWQgPSB1YS5pbmRleE9mKCJUb3VjaFBhZCIpID49IDA7CgovKioKICogSSBoYXRlIGRvaW5nIHRoaXMsIGJ1dCB3ZSBuZWVkIHNvbWUgd2F5IHRvIGRldGVybWluZSBpZiB0aGUgdXNlciBpcyBvbiBhIE1hYwogKiBUaGUgcmVhc29uIGlzIHRoYXQgdXNlcnMgaGF2ZSBkaWZmZXJlbnQgZXhwZWN0YXRpb25zIG9mIHRoZWlyIGtleSBjb21iaW5hdGlvbnMuCiAqCiAqIFRha2UgY29weSBhcyBhbiBleGFtcGxlLCBNYWMgcGVvcGxlIGV4cGVjdCB0byB1c2UgQ01EIG9yIEFQUExFICsgQwogKiBXaW5kb3dzIGZvbGtzIGV4cGVjdCB0byB1c2UgQ1RSTCArIEMKICovCmV4cG9ydHMuT1MgPSB7CiAgICBMSU5VWDogIkxJTlVYIiwKICAgIE1BQzogIk1BQyIsCiAgICBXSU5ET1dTOiAiV0lORE9XUyIKfTsKCi8qKgogKiBSZXR1cm4gYW4gZXhwb3J0cy5PUyBjb25zdGFudAogKi8KZXhwb3J0cy5nZXRPUyA9IGZ1bmN0aW9uKCkgewogICAgaWYgKGV4cG9ydHMuaXNNYWMpIHsKICAgICAgICByZXR1cm4gZXhwb3J0cy5PUy5NQUM7CiAgICB9IGVsc2UgaWYgKGV4cG9ydHMuaXNMaW51eCkgewogICAgICAgIHJldHVybiBleHBvcnRzLk9TLkxJTlVYOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZXhwb3J0cy5PUy5XSU5ET1dTOwogICAgfQp9OwoKfSk7Ci8qIHZpbTp0cz00OnN0cz00OnN3PTQ6CiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICogICAgICBJcmFrbGkgR296YWxpc2h2aWxpIDxyZm9iaWNAZ21haWwuY29tPiAoaHR0cDovL2plZGl0b29sa2l0LmNvbSkKICogICAgICBKdWxpYW4gVmllcmVjayA8anVsaWFuLnZpZXJlY2tAZ21haWwuY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvZWRpdG9yJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2ZpeG9sZGJyb3dzZXJzJywgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbGliL3VzZXJhZ2VudCcsICdhY2Uva2V5Ym9hcmQvdGV4dGlucHV0JywgJ2FjZS9tb3VzZS9tb3VzZV9oYW5kbGVyJywgJ2FjZS9tb3VzZS9mb2xkX2hhbmRsZXInLCAnYWNlL2tleWJvYXJkL2tleWJpbmRpbmcnLCAnYWNlL2VkaXRfc2Vzc2lvbicsICdhY2Uvc2VhcmNoJywgJ2FjZS9yYW5nZScsICdhY2UvbGliL2V2ZW50X2VtaXR0ZXInLCAnYWNlL2NvbW1hbmRzL2NvbW1hbmRfbWFuYWdlcicsICdhY2UvY29tbWFuZHMvZGVmYXVsdF9jb21tYW5kcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKcmVxdWlyZSgiLi9saWIvZml4b2xkYnJvd3NlcnMiKTsKCnZhciBvb3AgPSByZXF1aXJlKCIuL2xpYi9vb3AiKTsKdmFyIGxhbmcgPSByZXF1aXJlKCIuL2xpYi9sYW5nIik7CnZhciB1c2VyYWdlbnQgPSByZXF1aXJlKCIuL2xpYi91c2VyYWdlbnQiKTsKdmFyIFRleHRJbnB1dCA9IHJlcXVpcmUoIi4va2V5Ym9hcmQvdGV4dGlucHV0IikuVGV4dElucHV0Owp2YXIgTW91c2VIYW5kbGVyID0gcmVxdWlyZSgiLi9tb3VzZS9tb3VzZV9oYW5kbGVyIikuTW91c2VIYW5kbGVyOwp2YXIgRm9sZEhhbmRsZXIgPSByZXF1aXJlKCIuL21vdXNlL2ZvbGRfaGFuZGxlciIpLkZvbGRIYW5kbGVyOwovL3ZhciBUb3VjaEhhbmRsZXIgPSByZXF1aXJlKCIuL3RvdWNoX2hhbmRsZXIiKS5Ub3VjaEhhbmRsZXI7CnZhciBLZXlCaW5kaW5nID0gcmVxdWlyZSgiLi9rZXlib2FyZC9rZXliaW5kaW5nIikuS2V5QmluZGluZzsKdmFyIEVkaXRTZXNzaW9uID0gcmVxdWlyZSgiLi9lZGl0X3Nlc3Npb24iKS5FZGl0U2Vzc2lvbjsKdmFyIFNlYXJjaCA9IHJlcXVpcmUoIi4vc2VhcmNoIikuU2VhcmNoOwp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuL3JhbmdlIikuUmFuZ2U7CnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOwp2YXIgQ29tbWFuZE1hbmFnZXIgPSByZXF1aXJlKCIuL2NvbW1hbmRzL2NvbW1hbmRfbWFuYWdlciIpLkNvbW1hbmRNYW5hZ2VyOwp2YXIgZGVmYXVsdENvbW1hbmRzID0gcmVxdWlyZSgiLi9jb21tYW5kcy9kZWZhdWx0X2NvbW1hbmRzIikuY29tbWFuZHM7Cgp2YXIgRWRpdG9yID0gZnVuY3Rpb24ocmVuZGVyZXIsIHNlc3Npb24pIHsKICAgIHZhciBjb250YWluZXIgPSByZW5kZXJlci5nZXRDb250YWluZXJFbGVtZW50KCk7CiAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjsKICAgIAogICAgdGhpcy50ZXh0SW5wdXQgID0gbmV3IFRleHRJbnB1dChyZW5kZXJlci5nZXRUZXh0QXJlYUNvbnRhaW5lcigpLCB0aGlzKTsKICAgIHRoaXMua2V5QmluZGluZyA9IG5ldyBLZXlCaW5kaW5nKHRoaXMpOwoKICAgIC8vIFRPRE8gZGV0ZWN0IHRvdWNoIGV2ZW50IHN1cHBvcnQKICAgIGlmICh1c2VyYWdlbnQuaXNJUGFkKSB7CiAgICAgICAgLy90aGlzLiRtb3VzZUhhbmRsZXIgPSBuZXcgVG91Y2hIYW5kbGVyKHRoaXMpOwogICAgfSBlbHNlIHsKICAgICAgICB0aGlzLiRtb3VzZUhhbmRsZXIgPSBuZXcgTW91c2VIYW5kbGVyKHRoaXMpOwogICAgICAgIG5ldyBGb2xkSGFuZGxlcih0aGlzKTsKICAgIH0KCiAgICB0aGlzLiRibG9ja1Njcm9sbGluZyA9IDA7CiAgICB0aGlzLiRzZWFyY2ggPSBuZXcgU2VhcmNoKCkuc2V0KHsKICAgICAgICB3cmFwOiB0cnVlCiAgICB9KTsKCiAgICB0aGlzLmNvbW1hbmRzID0gbmV3IENvbW1hbmRNYW5hZ2VyKHVzZXJhZ2VudC5pc01hYyA/ICJtYWMiIDogIndpbiIsIGRlZmF1bHRDb21tYW5kcyk7CiAgICB0aGlzLnNldFNlc3Npb24oc2Vzc2lvbiB8fCBuZXcgRWRpdFNlc3Npb24oIiIpKTsKfTsKCihmdW5jdGlvbigpewoKICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsKCiAgICB0aGlzLnNldEtleWJvYXJkSGFuZGxlciA9IGZ1bmN0aW9uKGtleWJvYXJkSGFuZGxlcikgewogICAgICAgIHRoaXMua2V5QmluZGluZy5zZXRLZXlib2FyZEhhbmRsZXIoa2V5Ym9hcmRIYW5kbGVyKTsKICAgIH07CgogICAgdGhpcy5nZXRLZXlib2FyZEhhbmRsZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5rZXlCaW5kaW5nLmdldEtleWJvYXJkSGFuZGxlcigpOwogICAgfTsKCiAgICB0aGlzLnNldFNlc3Npb24gPSBmdW5jdGlvbihzZXNzaW9uKSB7CiAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbiA9PSBzZXNzaW9uKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIGlmICh0aGlzLnNlc3Npb24pIHsKICAgICAgICAgICAgdmFyIG9sZFNlc3Npb24gPSB0aGlzLnNlc3Npb247CiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCB0aGlzLiRvbkRvY3VtZW50Q2hhbmdlKTsKICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZU1vZGUiLCB0aGlzLiRvbkNoYW5nZU1vZGUpOwogICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG9rZW5pemVyVXBkYXRlIiwgdGhpcy4kb25Ub2tlbml6ZXJVcGRhdGUpOwogICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlVGFiU2l6ZSIsIHRoaXMuJG9uQ2hhbmdlVGFiU2l6ZSk7CiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VXcmFwTGltaXQiLCB0aGlzLiRvbkNoYW5nZVdyYXBMaW1pdCk7CiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VXcmFwTW9kZSIsIHRoaXMuJG9uQ2hhbmdlV3JhcE1vZGUpOwogICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigib25DaGFuZ2VGb2xkIiwgdGhpcy4kb25DaGFuZ2VGb2xkKTsKICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZUZyb250TWFya2VyIiwgdGhpcy4kb25DaGFuZ2VGcm9udE1hcmtlcik7CiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VCYWNrTWFya2VyIiwgdGhpcy4kb25DaGFuZ2VCYWNrTWFya2VyKTsKICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZUJyZWFrcG9pbnQiLCB0aGlzLiRvbkNoYW5nZUJyZWFrcG9pbnQpOwogICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlQW5ub3RhdGlvbiIsIHRoaXMuJG9uQ2hhbmdlQW5ub3RhdGlvbik7CiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VPdmVyd3JpdGUiLCB0aGlzLiRvbkN1cnNvckNoYW5nZSk7CiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VTY3JvbGxUb3AiLCB0aGlzLiRvblNjcm9sbFRvcENoYW5nZSk7CiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VMZWZ0VG9wIiwgdGhpcy4kb25TY3JvbGxMZWZ0Q2hhbmdlKTsKCiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSB0aGlzLnNlc3Npb24uZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VDdXJzb3IiLCB0aGlzLiRvbkN1cnNvckNoYW5nZSk7CiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VTZWxlY3Rpb24iLCB0aGlzLiRvblNlbGVjdGlvbkNoYW5nZSk7CiAgICAgICAgfQoKICAgICAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uOwoKICAgICAgICB0aGlzLiRvbkRvY3VtZW50Q2hhbmdlID0gdGhpcy5vbkRvY3VtZW50Q2hhbmdlLmJpbmQodGhpcyk7CiAgICAgICAgc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCB0aGlzLiRvbkRvY3VtZW50Q2hhbmdlKTsKICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFNlc3Npb24oc2Vzc2lvbik7CgogICAgICAgIHRoaXMuJG9uQ2hhbmdlTW9kZSA9IHRoaXMub25DaGFuZ2VNb2RlLmJpbmQodGhpcyk7CiAgICAgICAgc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VNb2RlIiwgdGhpcy4kb25DaGFuZ2VNb2RlKTsKCiAgICAgICAgdGhpcy4kb25Ub2tlbml6ZXJVcGRhdGUgPSB0aGlzLm9uVG9rZW5pemVyVXBkYXRlLmJpbmQodGhpcyk7CiAgICAgICAgc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCJ0b2tlbml6ZXJVcGRhdGUiLCB0aGlzLiRvblRva2VuaXplclVwZGF0ZSk7CgogICAgICAgIHRoaXMuJG9uQ2hhbmdlVGFiU2l6ZSA9IHRoaXMucmVuZGVyZXIudXBkYXRlVGV4dC5iaW5kKHRoaXMucmVuZGVyZXIpOwogICAgICAgIHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlVGFiU2l6ZSIsIHRoaXMuJG9uQ2hhbmdlVGFiU2l6ZSk7CgogICAgICAgIHRoaXMuJG9uQ2hhbmdlV3JhcExpbWl0ID0gdGhpcy5vbkNoYW5nZVdyYXBMaW1pdC5iaW5kKHRoaXMpOwogICAgICAgIHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlV3JhcExpbWl0IiwgdGhpcy4kb25DaGFuZ2VXcmFwTGltaXQpOwoKICAgICAgICB0aGlzLiRvbkNoYW5nZVdyYXBNb2RlID0gdGhpcy5vbkNoYW5nZVdyYXBNb2RlLmJpbmQodGhpcyk7CiAgICAgICAgc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VXcmFwTW9kZSIsIHRoaXMuJG9uQ2hhbmdlV3JhcE1vZGUpOwoKICAgICAgICB0aGlzLiRvbkNoYW5nZUZvbGQgPSB0aGlzLm9uQ2hhbmdlRm9sZC5iaW5kKHRoaXMpOwogICAgICAgIHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlRm9sZCIsIHRoaXMuJG9uQ2hhbmdlRm9sZCk7CgogICAgICAgIHRoaXMuJG9uQ2hhbmdlRnJvbnRNYXJrZXIgPSB0aGlzLm9uQ2hhbmdlRnJvbnRNYXJrZXIuYmluZCh0aGlzKTsKICAgICAgICB0aGlzLnNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlRnJvbnRNYXJrZXIiLCB0aGlzLiRvbkNoYW5nZUZyb250TWFya2VyKTsKCiAgICAgICAgdGhpcy4kb25DaGFuZ2VCYWNrTWFya2VyID0gdGhpcy5vbkNoYW5nZUJhY2tNYXJrZXIuYmluZCh0aGlzKTsKICAgICAgICB0aGlzLnNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlQmFja01hcmtlciIsIHRoaXMuJG9uQ2hhbmdlQmFja01hcmtlcik7CgogICAgICAgIHRoaXMuJG9uQ2hhbmdlQnJlYWtwb2ludCA9IHRoaXMub25DaGFuZ2VCcmVha3BvaW50LmJpbmQodGhpcyk7CiAgICAgICAgdGhpcy5zZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZUJyZWFrcG9pbnQiLCB0aGlzLiRvbkNoYW5nZUJyZWFrcG9pbnQpOwoKICAgICAgICB0aGlzLiRvbkNoYW5nZUFubm90YXRpb24gPSB0aGlzLm9uQ2hhbmdlQW5ub3RhdGlvbi5iaW5kKHRoaXMpOwogICAgICAgIHRoaXMuc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VBbm5vdGF0aW9uIiwgdGhpcy4kb25DaGFuZ2VBbm5vdGF0aW9uKTsKCiAgICAgICAgdGhpcy4kb25DdXJzb3JDaGFuZ2UgPSB0aGlzLm9uQ3Vyc29yQ2hhbmdlLmJpbmQodGhpcyk7CiAgICAgICAgdGhpcy5zZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZU92ZXJ3cml0ZSIsIHRoaXMuJG9uQ3Vyc29yQ2hhbmdlKTsKCiAgICAgICAgdGhpcy4kb25TY3JvbGxUb3BDaGFuZ2UgPSB0aGlzLm9uU2Nyb2xsVG9wQ2hhbmdlLmJpbmQodGhpcyk7CiAgICAgICAgdGhpcy5zZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZVNjcm9sbFRvcCIsIHRoaXMuJG9uU2Nyb2xsVG9wQ2hhbmdlKTsKCiAgICAgICAgdGhpcy4kb25TY3JvbGxMZWZ0Q2hhbmdlID0gdGhpcy5vblNjcm9sbExlZnRDaGFuZ2UuYmluZCh0aGlzKTsKICAgICAgICB0aGlzLnNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlU2Nyb2xsTGVmdCIsIHRoaXMuJG9uU2Nyb2xsTGVmdENoYW5nZSk7CgogICAgICAgIHRoaXMuc2VsZWN0aW9uID0gc2Vzc2lvbi5nZXRTZWxlY3Rpb24oKTsKICAgICAgICB0aGlzLnNlbGVjdGlvbi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VDdXJzb3IiLCB0aGlzLiRvbkN1cnNvckNoYW5nZSk7CgogICAgICAgIHRoaXMuJG9uU2VsZWN0aW9uQ2hhbmdlID0gdGhpcy5vblNlbGVjdGlvbkNoYW5nZS5iaW5kKHRoaXMpOwogICAgICAgIHRoaXMuc2VsZWN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZVNlbGVjdGlvbiIsIHRoaXMuJG9uU2VsZWN0aW9uQ2hhbmdlKTsKCiAgICAgICAgdGhpcy5vbkNoYW5nZU1vZGUoKTsKCiAgICAgICAgdGhpcy4kYmxvY2tTY3JvbGxpbmcgKz0gMTsKICAgICAgICB0aGlzLm9uQ3Vyc29yQ2hhbmdlKCk7CiAgICAgICAgdGhpcy4kYmxvY2tTY3JvbGxpbmcgLT0gMTsKCiAgICAgICAgdGhpcy5vblNjcm9sbFRvcENoYW5nZSgpOwogICAgICAgIHRoaXMub25TY3JvbGxMZWZ0Q2hhbmdlKCk7CiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpOwogICAgICAgIHRoaXMub25DaGFuZ2VGcm9udE1hcmtlcigpOwogICAgICAgIHRoaXMub25DaGFuZ2VCYWNrTWFya2VyKCk7CiAgICAgICAgdGhpcy5vbkNoYW5nZUJyZWFrcG9pbnQoKTsKICAgICAgICB0aGlzLm9uQ2hhbmdlQW5ub3RhdGlvbigpOwogICAgICAgIHRoaXMuc2Vzc2lvbi5nZXRVc2VXcmFwTW9kZSgpICYmIHRoaXMucmVuZGVyZXIuYWRqdXN0V3JhcExpbWl0KCk7CiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVGdWxsKCk7CgogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZVNlc3Npb24iLCB7CiAgICAgICAgICAgIHNlc3Npb246IHNlc3Npb24sCiAgICAgICAgICAgIG9sZFNlc3Npb246IG9sZFNlc3Npb24KICAgICAgICB9KTsKICAgIH07CgogICAgdGhpcy5nZXRTZXNzaW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbjsKICAgIH07CgogICAgdGhpcy5nZXRTZWxlY3Rpb24gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb247CiAgICB9OwoKICAgIHRoaXMucmVzaXplID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5yZW5kZXJlci5vblJlc2l6ZSgpOwogICAgfTsKCiAgICB0aGlzLnNldFRoZW1lID0gZnVuY3Rpb24odGhlbWUpIHsKICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFRoZW1lKHRoZW1lKTsKICAgIH07CgogICAgdGhpcy5nZXRUaGVtZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLmdldFRoZW1lKCk7CiAgICB9OwoKICAgIHRoaXMuc2V0U3R5bGUgPSBmdW5jdGlvbihzdHlsZSkgewogICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoc3R5bGUpOwogICAgfTsKCiAgICB0aGlzLnVuc2V0U3R5bGUgPSBmdW5jdGlvbihzdHlsZSkgewogICAgICAgIHRoaXMucmVuZGVyZXIudW5zZXRTdHlsZShzdHlsZSk7CiAgICB9OwoKICAgIHRoaXMuc2V0Rm9udFNpemUgPSBmdW5jdGlvbihzaXplKSB7CiAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUuZm9udFNpemUgPSBzaXplOwogICAgICAgIHRoaXMucmVuZGVyZXIudXBkYXRlRm9udFNpemUoKTsKICAgIH07CgogICAgdGhpcy4kaGlnaGxpZ2h0QnJhY2tldHMgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5zZXNzaW9uLiRicmFja2V0SGlnaGxpZ2h0KSB7CiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmVNYXJrZXIodGhpcy5zZXNzaW9uLiRicmFja2V0SGlnaGxpZ2h0KTsKICAgICAgICAgICAgdGhpcy5zZXNzaW9uLiRicmFja2V0SGlnaGxpZ2h0ID0gbnVsbDsKICAgICAgICB9CgogICAgICAgIGlmICh0aGlzLiRoaWdobGlnaHRQZW5kaW5nKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIHBlcmZvcm0gaGlnaGxpZ2h0IGFzeW5jIHRvIG5vdCBibG9jayB0aGUgYnJvd3NlciBkdXJpbmcgbmF2aWdhdGlvbgogICAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgICB0aGlzLiRoaWdobGlnaHRQZW5kaW5nID0gdHJ1ZTsKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICBzZWxmLiRoaWdobGlnaHRQZW5kaW5nID0gZmFsc2U7CgogICAgICAgICAgICB2YXIgcG9zID0gc2VsZi5zZXNzaW9uLmZpbmRNYXRjaGluZ0JyYWNrZXQoc2VsZi5nZXRDdXJzb3JQb3NpdGlvbigpKTsKICAgICAgICAgICAgaWYgKHBvcykgewogICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gbmV3IFJhbmdlKHBvcy5yb3csIHBvcy5jb2x1bW4sIHBvcy5yb3csIHBvcy5jb2x1bW4rMSk7CiAgICAgICAgICAgICAgICBzZWxmLnNlc3Npb24uJGJyYWNrZXRIaWdobGlnaHQgPSBzZWxmLnNlc3Npb24uYWRkTWFya2VyKHJhbmdlLCAiYWNlX2JyYWNrZXQiLCAidGV4dCIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwgMTApOwogICAgfTsKCiAgICB0aGlzLmZvY3VzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgLy8gU2FmYXJpIG5lZWRzIHRoZSB0aW1lb3V0CiAgICAgICAgLy8gaU9TIGFuZCBGaXJlZm94IG5lZWQgaXQgY2FsbGVkIGltbWVkaWF0ZWx5CiAgICAgICAgLy8gdG8gYmUgb24gdGhlIHNhdmUgc2lkZSB3ZSBkbyBib3RoCiAgICAgICAgdmFyIF9zZWxmID0gdGhpczsKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICBfc2VsZi50ZXh0SW5wdXQuZm9jdXMoKTsKICAgICAgICB9KTsKICAgICAgICB0aGlzLnRleHRJbnB1dC5mb2N1cygpOwogICAgfTsKCiAgICB0aGlzLmlzRm9jdXNlZCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnRleHRJbnB1dC5pc0ZvY3VzZWQoKTsKICAgIH07CgogICAgdGhpcy5ibHVyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy50ZXh0SW5wdXQuYmx1cigpOwogICAgfTsKCiAgICB0aGlzLm9uRm9jdXMgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnJlbmRlcmVyLnNob3dDdXJzb3IoKTsKICAgICAgICB0aGlzLnJlbmRlcmVyLnZpc3VhbGl6ZUZvY3VzKCk7CiAgICAgICAgdGhpcy5fZW1pdCgiZm9jdXMiKTsKICAgIH07CgogICAgdGhpcy5vbkJsdXIgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnJlbmRlcmVyLmhpZGVDdXJzb3IoKTsKICAgICAgICB0aGlzLnJlbmRlcmVyLnZpc3VhbGl6ZUJsdXIoKTsKICAgICAgICB0aGlzLl9lbWl0KCJibHVyIik7CiAgICB9OwoKICAgIHRoaXMub25Eb2N1bWVudENoYW5nZSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICB2YXIgZGVsdGEgPSBlLmRhdGE7CiAgICAgICAgdmFyIHJhbmdlID0gZGVsdGEucmFuZ2U7CiAgICAgICAgdmFyIGxhc3RSb3c7CgogICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT0gcmFuZ2UuZW5kLnJvdyAmJiBkZWx0YS5hY3Rpb24gIT0gImluc2VydExpbmVzIiAmJiBkZWx0YS5hY3Rpb24gIT0gInJlbW92ZUxpbmVzIikKICAgICAgICAgICAgbGFzdFJvdyA9IHJhbmdlLmVuZC5yb3c7CiAgICAgICAgZWxzZQogICAgICAgICAgICBsYXN0Um93ID0gSW5maW5pdHk7CiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVMaW5lcyhyYW5nZS5zdGFydC5yb3csIGxhc3RSb3cpOwoKICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2UiLCBlKTsKCiAgICAgICAgLy8gdXBkYXRlIGN1cnNvciBiZWNhdXNlIHRhYiBjaGFyYWN0ZXJzIGNhbiBpbmZsdWVuY2UgdGhlIGN1cnNvciBwb3NpdGlvbgogICAgICAgIHRoaXMub25DdXJzb3JDaGFuZ2UoKTsKICAgIH07CgogICAgdGhpcy5vblRva2VuaXplclVwZGF0ZSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICB2YXIgcm93cyA9IGUuZGF0YTsKICAgICAgICB0aGlzLnJlbmRlcmVyLnVwZGF0ZUxpbmVzKHJvd3MuZmlyc3QsIHJvd3MubGFzdCk7CiAgICB9OwoKICAgIHRoaXMub25TY3JvbGxUb3BDaGFuZ2UgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnJlbmRlcmVyLnNjcm9sbFRvWSh0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCkpOwogICAgfTsKCiAgICB0aGlzLm9uU2Nyb2xsTGVmdENoYW5nZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMucmVuZGVyZXIuc2Nyb2xsVG9YKHRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxMZWZ0KCkpOwogICAgfTsKCiAgICB0aGlzLm9uQ3Vyc29yQ2hhbmdlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVDdXJzb3IoKTsKCiAgICAgICAgaWYgKCF0aGlzLiRibG9ja1Njcm9sbGluZykgewogICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBtb3ZlIHRleHQgaW5wdXQgb3ZlciB0aGUgY3Vyc29yCiAgICAgICAgLy8gdGhpcyBpcyByZXF1aXJlZCBmb3IgaU9TIGFuZCBJTUUKICAgICAgICB0aGlzLnJlbmRlcmVyLm1vdmVUZXh0QXJlYVRvQ3Vyc29yKHRoaXMudGV4dElucHV0LmdldEVsZW1lbnQoKSk7CgogICAgICAgIHRoaXMuJGhpZ2hsaWdodEJyYWNrZXRzKCk7CiAgICAgICAgdGhpcy4kdXBkYXRlSGlnaGxpZ2h0QWN0aXZlTGluZSgpOwogICAgfTsKCiAgICB0aGlzLiR1cGRhdGVIaWdobGlnaHRBY3RpdmVMaW5lID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHNlc3Npb24gPSB0aGlzLmdldFNlc3Npb24oKTsKCiAgICAgICAgaWYgKHNlc3Npb24uJGhpZ2hsaWdodExpbmVNYXJrZXIpIHsKICAgICAgICAgICAgc2Vzc2lvbi5yZW1vdmVNYXJrZXIoc2Vzc2lvbi4kaGlnaGxpZ2h0TGluZU1hcmtlcik7CiAgICAgICAgfQogICAgICAgIHNlc3Npb24uJGhpZ2hsaWdodExpbmVNYXJrZXIgPSBudWxsOwoKICAgICAgICBpZiAodGhpcy5nZXRIaWdobGlnaHRBY3RpdmVMaW5lKCkgJiYgKHRoaXMuZ2V0U2VsZWN0aW9uU3R5bGUoKSAhPSAibGluZSIgfHwgIXRoaXMuc2VsZWN0aW9uLmlzTXVsdGlMaW5lKCkpKSB7CiAgICAgICAgICAgIHZhciBjdXJzb3IgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKCksCiAgICAgICAgICAgICAgICBmb2xkTGluZSA9IHRoaXMuc2Vzc2lvbi5nZXRGb2xkTGluZShjdXJzb3Iucm93KTsKICAgICAgICAgICAgdmFyIHJhbmdlOwogICAgICAgICAgICBpZiAoZm9sZExpbmUpIHsKICAgICAgICAgICAgICAgIHJhbmdlID0gbmV3IFJhbmdlKGZvbGRMaW5lLnN0YXJ0LnJvdywgMCwgZm9sZExpbmUuZW5kLnJvdyArIDEsIDApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmFuZ2UgPSBuZXcgUmFuZ2UoY3Vyc29yLnJvdywgMCwgY3Vyc29yLnJvdysxLCAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXNzaW9uLiRoaWdobGlnaHRMaW5lTWFya2VyID0gc2Vzc2lvbi5hZGRNYXJrZXIocmFuZ2UsICJhY2VfYWN0aXZlX2xpbmUiLCAiYmFja2dyb3VuZCIpOwogICAgICAgIH0KICAgIH07CgogICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICB2YXIgc2Vzc2lvbiA9IHRoaXMuZ2V0U2Vzc2lvbigpOwoKICAgICAgICBpZiAoc2Vzc2lvbi4kc2VsZWN0aW9uTWFya2VyKSB7CiAgICAgICAgICAgIHNlc3Npb24ucmVtb3ZlTWFya2VyKHNlc3Npb24uJHNlbGVjdGlvbk1hcmtlcik7CiAgICAgICAgfQogICAgICAgIHNlc3Npb24uJHNlbGVjdGlvbk1hcmtlciA9IG51bGw7CgogICAgICAgIGlmICghdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKSB7CiAgICAgICAgICAgIHZhciByYW5nZSA9IHRoaXMuc2VsZWN0aW9uLmdldFJhbmdlKCk7CiAgICAgICAgICAgIHZhciBzdHlsZSA9IHRoaXMuZ2V0U2VsZWN0aW9uU3R5bGUoKTsKICAgICAgICAgICAgc2Vzc2lvbi4kc2VsZWN0aW9uTWFya2VyID0gc2Vzc2lvbi5hZGRNYXJrZXIocmFuZ2UsICJhY2Vfc2VsZWN0aW9uIiwgc3R5bGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMuJHVwZGF0ZUhpZ2hsaWdodEFjdGl2ZUxpbmUoKTsKICAgICAgICB9CgogICAgICAgIGlmICh0aGlzLiRoaWdobGlnaHRTZWxlY3RlZFdvcmQpCiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5nZXRNb2RlKCkuaGlnaGxpZ2h0U2VsZWN0aW9uKHRoaXMpOwogICAgfTsKCiAgICB0aGlzLm9uQ2hhbmdlRnJvbnRNYXJrZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnJlbmRlcmVyLnVwZGF0ZUZyb250TWFya2VycygpOwogICAgfTsKCiAgICB0aGlzLm9uQ2hhbmdlQmFja01hcmtlciA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMucmVuZGVyZXIudXBkYXRlQmFja01hcmtlcnMoKTsKICAgIH07CgogICAgdGhpcy5vbkNoYW5nZUJyZWFrcG9pbnQgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEJyZWFrcG9pbnRzKHRoaXMuc2Vzc2lvbi5nZXRCcmVha3BvaW50cygpKTsKICAgIH07CgogICAgdGhpcy5vbkNoYW5nZUFubm90YXRpb24gPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEFubm90YXRpb25zKHRoaXMuc2Vzc2lvbi5nZXRBbm5vdGF0aW9ucygpKTsKICAgIH07CgogICAgdGhpcy5vbkNoYW5nZU1vZGUgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnJlbmRlcmVyLnVwZGF0ZVRleHQoKTsKICAgIH07CgogICAgdGhpcy5vbkNoYW5nZVdyYXBMaW1pdCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMucmVuZGVyZXIudXBkYXRlRnVsbCgpOwogICAgfTsKCiAgICB0aGlzLm9uQ2hhbmdlV3JhcE1vZGUgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnJlbmRlcmVyLm9uUmVzaXplKHRydWUpOwogICAgfTsKCiAgICB0aGlzLm9uQ2hhbmdlRm9sZCA9IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIFVwZGF0ZSB0aGUgYWN0aXZlIGxpbmUgbWFya2VyIGFzIGR1ZSB0byBmb2xkaW5nIGNoYW5nZXMgdGhlIGN1cnJlbnQKICAgICAgICAvLyBsaW5lIHJhbmdlIG9uIHRoZSBzY3JlZW4gbWlnaHQgaGF2ZSBjaGFuZ2VkLgogICAgICAgIHRoaXMuJHVwZGF0ZUhpZ2hsaWdodEFjdGl2ZUxpbmUoKTsKICAgICAgICAvLyBUT0RPOiBUaGlzIG1pZ2h0IGJlIHRvbyBtdWNoIHVwZGF0aW5nLiBPa2F5IGZvciBub3cuCiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVGdWxsKCk7CiAgICB9OwoKICAgIHRoaXMuZ2V0Q29weVRleHQgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdGV4dCA9ICIiOwogICAgICAgIGlmICghdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKQogICAgICAgICAgICB0ZXh0ID0gdGhpcy5zZXNzaW9uLmdldFRleHRSYW5nZSh0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkpOwoKICAgICAgICB0aGlzLl9lbWl0KCJjb3B5IiwgdGV4dCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwoKICAgIHRoaXMub25DdXQgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy4kcmVhZE9ubHkpCiAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgdmFyIHJhbmdlID0gdGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpOwogICAgICAgIHRoaXMuX2VtaXQoImN1dCIsIHJhbmdlKTsKCiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZShyYW5nZSk7CiAgICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMuaW5zZXJ0ID0gZnVuY3Rpb24odGV4dCkgewogICAgICAgIHZhciBzZXNzaW9uID0gdGhpcy5zZXNzaW9uOwogICAgICAgIHZhciBtb2RlID0gc2Vzc2lvbi5nZXRNb2RlKCk7CgogICAgICAgIHZhciBjdXJzb3IgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKCk7CgogICAgICAgIGlmICh0aGlzLmdldEJlaGF2aW91cnNFbmFibGVkKCkpIHsKICAgICAgICAgICAgLy8gR2V0IGEgdHJhbnNmb3JtIGlmIHRoZSBjdXJyZW50IG1vZGUgd2FudHMgb25lLgogICAgICAgICAgICB2YXIgdHJhbnNmb3JtID0gbW9kZS50cmFuc2Zvcm1BY3Rpb24oc2Vzc2lvbi5nZXRTdGF0ZShjdXJzb3Iucm93KSwgJ2luc2VydGlvbicsIHRoaXMsIHNlc3Npb24sIHRleHQpOwogICAgICAgICAgICBpZiAodHJhbnNmb3JtKQogICAgICAgICAgICAgICAgdGV4dCA9IHRyYW5zZm9ybS50ZXh0OwogICAgICAgIH0KCiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgiXHQiLCB0aGlzLnNlc3Npb24uZ2V0VGFiU3RyaW5nKCkpOwoKICAgICAgICAvLyByZW1vdmUgc2VsZWN0ZWQgdGV4dAogICAgICAgIGlmICghdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKSB7CiAgICAgICAgICAgIGN1cnNvciA9IHRoaXMuc2Vzc2lvbi5yZW1vdmUodGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpKTsKICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0aGlzLnNlc3Npb24uZ2V0T3ZlcndyaXRlKCkpIHsKICAgICAgICAgICAgdmFyIHJhbmdlID0gbmV3IFJhbmdlLmZyb21Qb2ludHMoY3Vyc29yLCBjdXJzb3IpOwogICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uICs9IHRleHQubGVuZ3RoOwogICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlKHJhbmdlKTsKICAgICAgICB9CgogICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTsKCiAgICAgICAgdmFyIHN0YXJ0ID0gY3Vyc29yLmNvbHVtbjsKICAgICAgICB2YXIgbGluZVN0YXRlID0gc2Vzc2lvbi5nZXRTdGF0ZShjdXJzb3Iucm93KTsKICAgICAgICB2YXIgc2hvdWxkT3V0ZGVudCA9IG1vZGUuY2hlY2tPdXRkZW50KGxpbmVTdGF0ZSwgc2Vzc2lvbi5nZXRMaW5lKGN1cnNvci5yb3cpLCB0ZXh0KTsKICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShjdXJzb3Iucm93KTsKICAgICAgICB2YXIgbGluZUluZGVudCA9IG1vZGUuZ2V0TmV4dExpbmVJbmRlbnQobGluZVN0YXRlLCBsaW5lLnNsaWNlKDAsIGN1cnNvci5jb2x1bW4pLCBzZXNzaW9uLmdldFRhYlN0cmluZygpKTsKICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi5pbnNlcnQoY3Vyc29yLCB0ZXh0KTsKCiAgICAgICAgaWYgKHRyYW5zZm9ybSAmJiB0cmFuc2Zvcm0uc2VsZWN0aW9uKSB7CiAgICAgICAgICAgIGlmICh0cmFuc2Zvcm0uc2VsZWN0aW9uLmxlbmd0aCA9PSAyKSB7IC8vIFRyYW5zZm9ybSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBjb2x1bW4KICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKAogICAgICAgICAgICAgICAgICAgIG5ldyBSYW5nZShjdXJzb3Iucm93LCBzdGFydCArIHRyYW5zZm9ybS5zZWxlY3Rpb25bMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvci5yb3csIHN0YXJ0ICsgdHJhbnNmb3JtLnNlbGVjdGlvblsxXSkpOwogICAgICAgICAgICB9IGVsc2UgeyAvLyBUcmFuc2Zvcm0gcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgcm93LgogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UoCiAgICAgICAgICAgICAgICAgICAgbmV3IFJhbmdlKGN1cnNvci5yb3cgKyB0cmFuc2Zvcm0uc2VsZWN0aW9uWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0uc2VsZWN0aW9uWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3Iucm93ICsgdHJhbnNmb3JtLnNlbGVjdGlvblsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLnNlbGVjdGlvblszXSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgbGluZVN0YXRlID0gc2Vzc2lvbi5nZXRTdGF0ZShjdXJzb3Iucm93KTsKCiAgICAgICAgLy8gVE9ETyBkaXNhYmxlZCBtdWx0aWxpbmUgYXV0byBpbmRlbnQKICAgICAgICAvLyBwb3NzaWJseSBkb2luZyB0aGUgaW5kZW50IGJlZm9yZSBpbnNlcnRpbmcgdGhlIHRleHQKICAgICAgICAvLyBpZiAoY3Vyc29yLnJvdyAhPT0gZW5kLnJvdykgewogICAgICAgIGlmIChzZXNzaW9uLmdldERvY3VtZW50KCkuaXNOZXdMaW5lKHRleHQpKSB7CiAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvclRvKGN1cnNvci5yb3crMSwgMCk7CgogICAgICAgICAgICB2YXIgc2l6ZSA9IHNlc3Npb24uZ2V0VGFiU2l6ZSgpOwogICAgICAgICAgICB2YXIgbWluSW5kZW50ID0gTnVtYmVyLk1BWF9WQUxVRTsKCiAgICAgICAgICAgIGZvciAodmFyIHJvdyA9IGN1cnNvci5yb3cgKyAxOyByb3cgPD0gZW5kLnJvdzsgKytyb3cpIHsKICAgICAgICAgICAgICAgIHZhciBpbmRlbnQgPSAwOwoKICAgICAgICAgICAgICAgIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZS5sZW5ndGg7ICsraSkKICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5jaGFyQXQoaSkgPT0gJ1x0JykKICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50ICs9IHNpemU7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobGluZS5jaGFyQXQoaSkgPT0gJyAnKQogICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gMTsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgaWYgKC9bXlxzXS8udGVzdChsaW5lKSkKICAgICAgICAgICAgICAgICAgICBtaW5JbmRlbnQgPSBNYXRoLm1pbihpbmRlbnQsIG1pbkluZGVudCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAodmFyIHJvdyA9IGN1cnNvci5yb3cgKyAxOyByb3cgPD0gZW5kLnJvdzsgKytyb3cpIHsKICAgICAgICAgICAgICAgIHZhciBvdXRkZW50ID0gbWluSW5kZW50OwoKICAgICAgICAgICAgICAgIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZS5sZW5ndGggJiYgb3V0ZGVudCA+IDA7ICsraSkKICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5jaGFyQXQoaSkgPT0gJ1x0JykKICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZGVudCAtPSBzaXplOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxpbmUuY2hhckF0KGkpID09ICcgJykKICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZGVudCAtPSAxOwogICAgICAgICAgICAgICAgc2Vzc2lvbi5yZW1vdmUobmV3IFJhbmdlKHJvdywgMCwgcm93LCBpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2Vzc2lvbi5pbmRlbnRSb3dzKGN1cnNvci5yb3cgKyAxLCBlbmQucm93LCBsaW5lSW5kZW50KTsKICAgICAgICB9CiAgICAgICAgaWYgKHNob3VsZE91dGRlbnQpCiAgICAgICAgICAgIG1vZGUuYXV0b091dGRlbnQobGluZVN0YXRlLCBzZXNzaW9uLCBjdXJzb3Iucm93KTsKICAgIH07CgogICAgdGhpcy5vblRleHRJbnB1dCA9IGZ1bmN0aW9uKHRleHQsIHBhc3RlZCkgewogICAgICAgIGlmIChwYXN0ZWQpCiAgICAgICAgICAgIHRoaXMuX2VtaXQoInBhc3RlIiwgdGV4dCk7CgogICAgICAgIHRoaXMua2V5QmluZGluZy5vblRleHRJbnB1dCh0ZXh0LCBwYXN0ZWQpOwogICAgfTsKCiAgICB0aGlzLm9uQ29tbWFuZEtleSA9IGZ1bmN0aW9uKGUsIGhhc2hJZCwga2V5Q29kZSkgewogICAgICAgIHRoaXMua2V5QmluZGluZy5vbkNvbW1hbmRLZXkoZSwgaGFzaElkLCBrZXlDb2RlKTsKICAgIH07CgogICAgdGhpcy5zZXRPdmVyd3JpdGUgPSBmdW5jdGlvbihvdmVyd3JpdGUpIHsKICAgICAgICB0aGlzLnNlc3Npb24uc2V0T3ZlcndyaXRlKG92ZXJ3cml0ZSk7CiAgICB9OwoKICAgIHRoaXMuZ2V0T3ZlcndyaXRlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5nZXRPdmVyd3JpdGUoKTsKICAgIH07CgogICAgdGhpcy50b2dnbGVPdmVyd3JpdGUgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnNlc3Npb24udG9nZ2xlT3ZlcndyaXRlKCk7CiAgICB9OwoKICAgIHRoaXMuc2V0U2Nyb2xsU3BlZWQgPSBmdW5jdGlvbihzcGVlZCkgewogICAgICAgIHRoaXMuJG1vdXNlSGFuZGxlci5zZXRTY3JvbGxTcGVlZChzcGVlZCk7CiAgICB9OwoKICAgIHRoaXMuZ2V0U2Nyb2xsU3BlZWQgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy4kbW91c2VIYW5kbGVyLmdldFNjcm9sbFNwZWVkKCk7CiAgICB9OwoKICAgIHRoaXMuc2V0RHJhZ0RlbGF5ID0gZnVuY3Rpb24oZHJhZ0RlbGF5KSB7CiAgICAgICAgdGhpcy4kbW91c2VIYW5kbGVyLnNldERyYWdEZWxheShkcmFnRGVsYXkpOwogICAgfTsKCiAgICB0aGlzLmdldERyYWdEZWxheSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLiRtb3VzZUhhbmRsZXIuZ2V0RHJhZ0RlbGF5KCk7CiAgICB9OwoKICAgIHRoaXMuJHNlbGVjdGlvblN0eWxlID0gImxpbmUiOwogICAgdGhpcy5zZXRTZWxlY3Rpb25TdHlsZSA9IGZ1bmN0aW9uKHN0eWxlKSB7CiAgICAgICAgaWYgKHRoaXMuJHNlbGVjdGlvblN0eWxlID09IHN0eWxlKSByZXR1cm47CgogICAgICAgIHRoaXMuJHNlbGVjdGlvblN0eWxlID0gc3R5bGU7CiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpOwogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZVNlbGVjdGlvblN0eWxlIiwge2RhdGE6IHN0eWxlfSk7CiAgICB9OwoKICAgIHRoaXMuZ2V0U2VsZWN0aW9uU3R5bGUgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy4kc2VsZWN0aW9uU3R5bGU7CiAgICB9OwoKICAgIHRoaXMuJGhpZ2hsaWdodEFjdGl2ZUxpbmUgPSB0cnVlOwogICAgdGhpcy5zZXRIaWdobGlnaHRBY3RpdmVMaW5lID0gZnVuY3Rpb24oc2hvdWxkSGlnaGxpZ2h0KSB7CiAgICAgICAgaWYgKHRoaXMuJGhpZ2hsaWdodEFjdGl2ZUxpbmUgPT0gc2hvdWxkSGlnaGxpZ2h0KSByZXR1cm47CgogICAgICAgIHRoaXMuJGhpZ2hsaWdodEFjdGl2ZUxpbmUgPSBzaG91bGRIaWdobGlnaHQ7CiAgICAgICAgdGhpcy4kdXBkYXRlSGlnaGxpZ2h0QWN0aXZlTGluZSgpOwogICAgfTsKCiAgICB0aGlzLmdldEhpZ2hsaWdodEFjdGl2ZUxpbmUgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy4kaGlnaGxpZ2h0QWN0aXZlTGluZTsKICAgIH07CgogICAgdGhpcy4kaGlnaGxpZ2h0U2VsZWN0ZWRXb3JkID0gdHJ1ZTsKICAgIHRoaXMuc2V0SGlnaGxpZ2h0U2VsZWN0ZWRXb3JkID0gZnVuY3Rpb24oc2hvdWxkSGlnaGxpZ2h0KSB7CiAgICAgICAgaWYgKHRoaXMuJGhpZ2hsaWdodFNlbGVjdGVkV29yZCA9PSBzaG91bGRIaWdobGlnaHQpCiAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgdGhpcy4kaGlnaGxpZ2h0U2VsZWN0ZWRXb3JkID0gc2hvdWxkSGlnaGxpZ2h0OwogICAgICAgIGlmIChzaG91bGRIaWdobGlnaHQpCiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5nZXRNb2RlKCkuaGlnaGxpZ2h0U2VsZWN0aW9uKHRoaXMpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmdldE1vZGUoKS5jbGVhclNlbGVjdGlvbkhpZ2hsaWdodCh0aGlzKTsKICAgIH07CgogICAgdGhpcy5nZXRIaWdobGlnaHRTZWxlY3RlZFdvcmQgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy4kaGlnaGxpZ2h0U2VsZWN0ZWRXb3JkOwogICAgfTsKCiAgICB0aGlzLnNldFNob3dJbnZpc2libGVzID0gZnVuY3Rpb24oc2hvd0ludmlzaWJsZXMpIHsKICAgICAgICBpZiAodGhpcy5nZXRTaG93SW52aXNpYmxlcygpID09IHNob3dJbnZpc2libGVzKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U2hvd0ludmlzaWJsZXMoc2hvd0ludmlzaWJsZXMpOwogICAgfTsKCiAgICB0aGlzLmdldFNob3dJbnZpc2libGVzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0U2hvd0ludmlzaWJsZXMoKTsKICAgIH07CgogICAgdGhpcy5zZXRTaG93UHJpbnRNYXJnaW4gPSBmdW5jdGlvbihzaG93UHJpbnRNYXJnaW4pIHsKICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFNob3dQcmludE1hcmdpbihzaG93UHJpbnRNYXJnaW4pOwogICAgfTsKCiAgICB0aGlzLmdldFNob3dQcmludE1hcmdpbiA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLmdldFNob3dQcmludE1hcmdpbigpOwogICAgfTsKCiAgICB0aGlzLnNldFByaW50TWFyZ2luQ29sdW1uID0gZnVuY3Rpb24oc2hvd1ByaW50TWFyZ2luKSB7CiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcmludE1hcmdpbkNvbHVtbihzaG93UHJpbnRNYXJnaW4pOwogICAgfTsKCiAgICB0aGlzLmdldFByaW50TWFyZ2luQ29sdW1uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0UHJpbnRNYXJnaW5Db2x1bW4oKTsKICAgIH07CgogICAgdGhpcy4kcmVhZE9ubHkgPSBmYWxzZTsKICAgIHRoaXMuc2V0UmVhZE9ubHkgPSBmdW5jdGlvbihyZWFkT25seSkgewogICAgICAgIHRoaXMuJHJlYWRPbmx5ID0gcmVhZE9ubHk7CiAgICB9OwoKICAgIHRoaXMuZ2V0UmVhZE9ubHkgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy4kcmVhZE9ubHk7CiAgICB9OwoKICAgIHRoaXMuJG1vZGVCZWhhdmlvdXJzID0gdHJ1ZTsKICAgIHRoaXMuc2V0QmVoYXZpb3Vyc0VuYWJsZWQgPSBmdW5jdGlvbiAoZW5hYmxlZCkgewogICAgICAgIHRoaXMuJG1vZGVCZWhhdmlvdXJzID0gZW5hYmxlZDsKICAgIH07CgogICAgdGhpcy5nZXRCZWhhdmlvdXJzRW5hYmxlZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gdGhpcy4kbW9kZUJlaGF2aW91cnM7CiAgICB9OwoKICAgIHRoaXMuc2V0U2hvd0ZvbGRXaWRnZXRzID0gZnVuY3Rpb24oc2hvdykgewogICAgICAgIHZhciBndXR0ZXIgPSB0aGlzLnJlbmRlcmVyLiRndXR0ZXJMYXllcjsKICAgICAgICBpZiAoZ3V0dGVyLmdldFNob3dGb2xkV2lkZ2V0cygpID09IHNob3cpCiAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgdGhpcy5yZW5kZXJlci4kZ3V0dGVyTGF5ZXIuc2V0U2hvd0ZvbGRXaWRnZXRzKHNob3cpOwogICAgICAgIHRoaXMuJHNob3dGb2xkV2lkZ2V0cyA9IHNob3c7CiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVGdWxsKCk7CiAgICB9OwogICAgCiAgICB0aGlzLmdldFNob3dGb2xkV2lkZ2V0cyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLiRndXR0ZXJMYXllci5nZXRTaG93Rm9sZFdpZGdldHMoKTsKICAgIH07CgogICAgdGhpcy5yZW1vdmUgPSBmdW5jdGlvbihkaXIpIHsKICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKXsKICAgICAgICAgICAgaWYoZGlyID09ICJsZWZ0IikKICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdExlZnQoKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0UmlnaHQoKTsKICAgICAgICB9CgogICAgICAgIHZhciByYW5nZSA9IHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKICAgICAgICBpZiAodGhpcy5nZXRCZWhhdmlvdXJzRW5hYmxlZCgpKSB7CiAgICAgICAgICAgIHZhciBzZXNzaW9uID0gdGhpcy5zZXNzaW9uOwogICAgICAgICAgICB2YXIgc3RhdGUgPSBzZXNzaW9uLmdldFN0YXRlKHJhbmdlLnN0YXJ0LnJvdyk7CiAgICAgICAgICAgIHZhciBuZXdfcmFuZ2UgPSBzZXNzaW9uLmdldE1vZGUoKS50cmFuc2Zvcm1BY3Rpb24oc3RhdGUsICdkZWxldGlvbicsIHRoaXMsIHNlc3Npb24sIHJhbmdlKTsKICAgICAgICAgICAgaWYgKG5ld19yYW5nZSkKICAgICAgICAgICAgICAgIHJhbmdlID0gbmV3X3JhbmdlOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZShyYW5nZSk7CiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOwogICAgfTsKCiAgICB0aGlzLnJlbW92ZVdvcmRSaWdodCA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpCiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdFdvcmRSaWdodCgpOwoKICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlKHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSk7CiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOwogICAgfTsKCiAgICB0aGlzLnJlbW92ZVdvcmRMZWZ0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSkKICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0V29yZExlZnQoKTsKCiAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZSh0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkpOwogICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTsKICAgIH07CgogICAgdGhpcy5yZW1vdmVUb0xpbmVTdGFydCA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpCiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdExpbmVTdGFydCgpOwoKICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlKHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSk7CiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOwogICAgfTsKCiAgICB0aGlzLnJlbW92ZVRvTGluZUVuZCA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpCiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdExpbmVFbmQoKTsKCiAgICAgICAgdmFyIHJhbmdlID0gdGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpOwogICAgICAgIGlmIChyYW5nZS5zdGFydC5jb2x1bW4gPT0gcmFuZ2UuZW5kLmNvbHVtbiAmJiByYW5nZS5zdGFydC5yb3cgPT0gcmFuZ2UuZW5kLnJvdykgewogICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uID0gMDsKICAgICAgICAgICAgcmFuZ2UuZW5kLnJvdysrOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZShyYW5nZSk7CiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOwogICAgfTsKCiAgICB0aGlzLnNwbGl0TGluZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICghdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKSB7CiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmUodGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpKTsKICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOwogICAgICAgIH0KCiAgICAgICAgdmFyIGN1cnNvciA9IHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICB0aGlzLmluc2VydCgiXG4iKTsKICAgICAgICB0aGlzLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKGN1cnNvcik7CiAgICB9OwoKICAgIHRoaXMudHJhbnNwb3NlTGV0dGVycyA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICghdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHZhciBjdXJzb3IgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKCk7CiAgICAgICAgdmFyIGNvbHVtbiA9IGN1cnNvci5jb2x1bW47CiAgICAgICAgaWYgKGNvbHVtbiA9PT0gMCkKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICB2YXIgbGluZSA9IHRoaXMuc2Vzc2lvbi5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgIHZhciBzd2FwLCByYW5nZTsKICAgICAgICBpZiAoY29sdW1uIDwgbGluZS5sZW5ndGgpIHsKICAgICAgICAgICAgc3dhcCA9IGxpbmUuY2hhckF0KGNvbHVtbikgKyBsaW5lLmNoYXJBdChjb2x1bW4tMSk7CiAgICAgICAgICAgIHJhbmdlID0gbmV3IFJhbmdlKGN1cnNvci5yb3csIGNvbHVtbi0xLCBjdXJzb3Iucm93LCBjb2x1bW4rMSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBzd2FwID0gbGluZS5jaGFyQXQoY29sdW1uLTEpICsgbGluZS5jaGFyQXQoY29sdW1uLTIpOwogICAgICAgICAgICByYW5nZSA9IG5ldyBSYW5nZShjdXJzb3Iucm93LCBjb2x1bW4tMiwgY3Vyc29yLnJvdywgY29sdW1uKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5zZXNzaW9uLnJlcGxhY2UocmFuZ2UsIHN3YXApOwogICAgfTsKCiAgICB0aGlzLnRvTG93ZXJDYXNlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIG9yaWdpbmFsUmFuZ2UgPSB0aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7CiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSkgewogICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RXb3JkKCk7CiAgICAgICAgfQoKICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7CiAgICAgICAgdmFyIHRleHQgPSB0aGlzLnNlc3Npb24uZ2V0VGV4dFJhbmdlKHJhbmdlKTsKICAgICAgICB0aGlzLnNlc3Npb24ucmVwbGFjZShyYW5nZSwgdGV4dC50b0xvd2VyQ2FzZSgpKTsKICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShvcmlnaW5hbFJhbmdlKTsKICAgIH07CgogICAgdGhpcy50b1VwcGVyQ2FzZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBvcmlnaW5hbFJhbmdlID0gdGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpOwogICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0V29yZCgpOwogICAgICAgIH0KCiAgICAgICAgdmFyIHJhbmdlID0gdGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpOwogICAgICAgIHZhciB0ZXh0ID0gdGhpcy5zZXNzaW9uLmdldFRleHRSYW5nZShyYW5nZSk7CiAgICAgICAgdGhpcy5zZXNzaW9uLnJlcGxhY2UocmFuZ2UsIHRleHQudG9VcHBlckNhc2UoKSk7CiAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2Uob3JpZ2luYWxSYW5nZSk7CiAgICB9OwoKICAgIHRoaXMuaW5kZW50ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHNlc3Npb24gPSB0aGlzLnNlc3Npb247CiAgICAgICAgdmFyIHJhbmdlID0gdGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpOwoKICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93IDwgcmFuZ2UuZW5kLnJvdyB8fCByYW5nZS5zdGFydC5jb2x1bW4gPCByYW5nZS5lbmQuY29sdW1uKSB7CiAgICAgICAgICAgIHZhciByb3dzID0gdGhpcy4kZ2V0U2VsZWN0ZWRSb3dzKCk7CiAgICAgICAgICAgIHNlc3Npb24uaW5kZW50Um93cyhyb3dzLmZpcnN0LCByb3dzLmxhc3QsICJcdCIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhciBpbmRlbnRTdHJpbmc7CgogICAgICAgICAgICBpZiAodGhpcy5zZXNzaW9uLmdldFVzZVNvZnRUYWJzKCkpIHsKICAgICAgICAgICAgICAgIHZhciBzaXplICAgICAgICA9IHNlc3Npb24uZ2V0VGFiU2l6ZSgpLAogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uICAgID0gdGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpLAogICAgICAgICAgICAgICAgICAgIGNvbHVtbiAgICAgID0gc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuQ29sdW1uKHBvc2l0aW9uLnJvdywgcG9zaXRpb24uY29sdW1uKSwKICAgICAgICAgICAgICAgICAgICBjb3VudCAgICAgICA9IChzaXplIC0gY29sdW1uICUgc2l6ZSk7CgogICAgICAgICAgICAgICAgaW5kZW50U3RyaW5nID0gbGFuZy5zdHJpbmdSZXBlYXQoIiAiLCBjb3VudCk7CiAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgaW5kZW50U3RyaW5nID0gIlx0IjsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0KGluZGVudFN0cmluZyk7CiAgICAgICAgfQogICAgfTsKCiAgICB0aGlzLmJsb2NrT3V0ZGVudCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzZWxlY3Rpb24gPSB0aGlzLnNlc3Npb24uZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgdGhpcy5zZXNzaW9uLm91dGRlbnRSb3dzKHNlbGVjdGlvbi5nZXRSYW5nZSgpKTsKICAgIH07CgogICAgdGhpcy50b2dnbGVDb21tZW50TGluZXMgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLnNlc3Npb24uZ2V0U3RhdGUodGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpLnJvdyk7CiAgICAgICAgdmFyIHJvd3MgPSB0aGlzLiRnZXRTZWxlY3RlZFJvd3MoKTsKICAgICAgICB0aGlzLnNlc3Npb24uZ2V0TW9kZSgpLnRvZ2dsZUNvbW1lbnRMaW5lcyhzdGF0ZSwgdGhpcy5zZXNzaW9uLCByb3dzLmZpcnN0LCByb3dzLmxhc3QpOwogICAgfTsKCiAgICB0aGlzLnJlbW92ZUxpbmVzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHJvd3MgPSB0aGlzLiRnZXRTZWxlY3RlZFJvd3MoKTsKICAgICAgICB2YXIgcmFuZ2U7CiAgICAgICAgaWYgKHJvd3MuZmlyc3QgPT09IDAgfHwgcm93cy5sYXN0KzEgPCB0aGlzLnNlc3Npb24uZ2V0TGVuZ3RoKCkpCiAgICAgICAgICAgIHJhbmdlID0gbmV3IFJhbmdlKHJvd3MuZmlyc3QsIDAsIHJvd3MubGFzdCsxLCAwKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHJhbmdlID0gbmV3IFJhbmdlKAogICAgICAgICAgICAgICAgcm93cy5maXJzdC0xLCB0aGlzLnNlc3Npb24uZ2V0TGluZShyb3dzLmZpcnN0LTEpLmxlbmd0aCwKICAgICAgICAgICAgICAgIHJvd3MubGFzdCwgdGhpcy5zZXNzaW9uLmdldExpbmUocm93cy5sYXN0KS5sZW5ndGgKICAgICAgICAgICAgKTsKICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlKHJhbmdlKTsKICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7CiAgICB9OwoKICAgIHRoaXMubW92ZUxpbmVzRG93biA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuJG1vdmVMaW5lcyhmdW5jdGlvbihmaXJzdFJvdywgbGFzdFJvdykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLm1vdmVMaW5lc0Rvd24oZmlyc3RSb3csIGxhc3RSb3cpOwogICAgICAgIH0pOwogICAgfTsKCiAgICB0aGlzLm1vdmVMaW5lc1VwID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy4kbW92ZUxpbmVzKGZ1bmN0aW9uKGZpcnN0Um93LCBsYXN0Um93KSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlc3Npb24ubW92ZUxpbmVzVXAoZmlyc3RSb3csIGxhc3RSb3cpOwogICAgICAgIH0pOwogICAgfTsKCiAgICB0aGlzLm1vdmVUZXh0ID0gZnVuY3Rpb24ocmFuZ2UsIHRvUG9zaXRpb24pIHsKICAgICAgICBpZiAodGhpcy4kcmVhZE9ubHkpCiAgICAgICAgICAgIHJldHVybiBudWxsOwoKICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLm1vdmVUZXh0KHJhbmdlLCB0b1Bvc2l0aW9uKTsKICAgIH07CgogICAgdGhpcy5jb3B5TGluZXNVcCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuJG1vdmVMaW5lcyhmdW5jdGlvbihmaXJzdFJvdywgbGFzdFJvdykgewogICAgICAgICAgICB0aGlzLnNlc3Npb24uZHVwbGljYXRlTGluZXMoZmlyc3RSb3csIGxhc3RSb3cpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9KTsKICAgIH07CgogICAgdGhpcy5jb3B5TGluZXNEb3duID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy4kbW92ZUxpbmVzKGZ1bmN0aW9uKGZpcnN0Um93LCBsYXN0Um93KSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlc3Npb24uZHVwbGljYXRlTGluZXMoZmlyc3RSb3csIGxhc3RSb3cpOwogICAgICAgIH0pOwogICAgfTsKCgogICAgdGhpcy4kbW92ZUxpbmVzID0gZnVuY3Rpb24obW92ZXIpIHsKICAgICAgICB2YXIgcm93cyA9IHRoaXMuJGdldFNlbGVjdGVkUm93cygpOwogICAgICAgIHZhciBzZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbjsKICAgICAgICBpZiAoIXNlbGVjdGlvbi5pc011bHRpTGluZSgpKSB7CiAgICAgICAgICAgIHZhciByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZSgpOwogICAgICAgICAgICB2YXIgcmV2ZXJzZSA9IHNlbGVjdGlvbi5pc0JhY2t3YXJkcygpOwogICAgICAgIH0KCiAgICAgICAgdmFyIGxpbmVzTW92ZWQgPSBtb3Zlci5jYWxsKHRoaXMsIHJvd3MuZmlyc3QsIHJvd3MubGFzdCk7CgogICAgICAgIGlmIChyYW5nZSkgewogICAgICAgICAgICByYW5nZS5zdGFydC5yb3cgKz0gbGluZXNNb3ZlZDsKICAgICAgICAgICAgcmFuZ2UuZW5kLnJvdyArPSBsaW5lc01vdmVkOwogICAgICAgICAgICBzZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UocmFuZ2UsIHJldmVyc2UpOwogICAgICAgIH0gCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHNlbGVjdGlvbi5zZXRTZWxlY3Rpb25BbmNob3Iocm93cy5sYXN0K2xpbmVzTW92ZWQrMSwgMCk7CiAgICAgICAgICAgIHNlbGVjdGlvbi4kbW92ZVNlbGVjdGlvbihmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5tb3ZlQ3Vyc29yVG8ocm93cy5maXJzdCtsaW5lc01vdmVkLCAwKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfTsKCiAgICB0aGlzLiRnZXRTZWxlY3RlZFJvd3MgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkuY29sbGFwc2VSb3dzKCk7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGZpcnN0OiByYW5nZS5zdGFydC5yb3csCiAgICAgICAgICAgIGxhc3Q6IHJhbmdlLmVuZC5yb3cKICAgICAgICB9OwogICAgfTsKCiAgICB0aGlzLm9uQ29tcG9zaXRpb25TdGFydCA9IGZ1bmN0aW9uKHRleHQpIHsKICAgICAgICB0aGlzLnJlbmRlcmVyLnNob3dDb21wb3NpdGlvbih0aGlzLmdldEN1cnNvclBvc2l0aW9uKCkpOwogICAgfTsKCiAgICB0aGlzLm9uQ29tcG9zaXRpb25VcGRhdGUgPSBmdW5jdGlvbih0ZXh0KSB7CiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRDb21wb3NpdGlvblRleHQodGV4dCk7CiAgICB9OwoKICAgIHRoaXMub25Db21wb3NpdGlvbkVuZCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMucmVuZGVyZXIuaGlkZUNvbXBvc2l0aW9uKCk7CiAgICB9OwoKICAgIHRoaXMuZ2V0Rmlyc3RWaXNpYmxlUm93ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0Rmlyc3RWaXNpYmxlUm93KCk7CiAgICB9OwoKICAgIHRoaXMuZ2V0TGFzdFZpc2libGVSb3cgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRMYXN0VmlzaWJsZVJvdygpOwogICAgfTsKCiAgICB0aGlzLmlzUm93VmlzaWJsZSA9IGZ1bmN0aW9uKHJvdykgewogICAgICAgIHJldHVybiAocm93ID49IHRoaXMuZ2V0Rmlyc3RWaXNpYmxlUm93KCkgJiYgcm93IDw9IHRoaXMuZ2V0TGFzdFZpc2libGVSb3coKSk7CiAgICB9OwoKICAgIHRoaXMuaXNSb3dGdWxseVZpc2libGUgPSBmdW5jdGlvbihyb3cpIHsKICAgICAgICByZXR1cm4gKHJvdyA+PSB0aGlzLnJlbmRlcmVyLmdldEZpcnN0RnVsbHlWaXNpYmxlUm93KCkgJiYgcm93IDw9IHRoaXMucmVuZGVyZXIuZ2V0TGFzdEZ1bGx5VmlzaWJsZVJvdygpKTsKICAgIH07CgogICAgdGhpcy4kZ2V0VmlzaWJsZVJvd0NvdW50ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0U2Nyb2xsQm90dG9tUm93KCkgLSB0aGlzLnJlbmRlcmVyLmdldFNjcm9sbFRvcFJvdygpICsgMTsKICAgIH07CgogICAgdGhpcy4kZ2V0UGFnZURvd25Sb3cgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRTY3JvbGxCb3R0b21Sb3coKTsKICAgIH07CgogICAgdGhpcy4kZ2V0UGFnZVVwUm93ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGZpcnN0Um93ID0gdGhpcy5yZW5kZXJlci5nZXRTY3JvbGxUb3BSb3coKTsKICAgICAgICB2YXIgbGFzdFJvdyA9IHRoaXMucmVuZGVyZXIuZ2V0U2Nyb2xsQm90dG9tUm93KCk7CgogICAgICAgIHJldHVybiBmaXJzdFJvdyAtIChsYXN0Um93IC0gZmlyc3RSb3cpOwogICAgfTsKCiAgICB0aGlzLnNlbGVjdFBhZ2VEb3duID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHJvdyA9IHRoaXMuJGdldFBhZ2VEb3duUm93KCkgKyBNYXRoLmZsb29yKHRoaXMuJGdldFZpc2libGVSb3dDb3VudCgpIC8gMik7CgogICAgICAgIHRoaXMuc2Nyb2xsUGFnZURvd24oKTsKCiAgICAgICAgdmFyIHNlbGVjdGlvbiA9IHRoaXMuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgdmFyIGxlYWRTY3JlZW5Qb3MgPSB0aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHNlbGVjdGlvbi5nZXRTZWxlY3Rpb25MZWFkKCkpOwogICAgICAgIHZhciBkZXN0ID0gdGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihyb3csIGxlYWRTY3JlZW5Qb3MuY29sdW1uKTsKICAgICAgICBzZWxlY3Rpb24uc2VsZWN0VG8oZGVzdC5yb3csIGRlc3QuY29sdW1uKTsKICAgIH07CgogICAgdGhpcy5zZWxlY3RQYWdlVXAgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdmlzaWJsZVJvd3MgPSB0aGlzLnJlbmRlcmVyLmdldFNjcm9sbFRvcFJvdygpIC0gdGhpcy5yZW5kZXJlci5nZXRTY3JvbGxCb3R0b21Sb3coKTsKICAgICAgICB2YXIgcm93ID0gdGhpcy4kZ2V0UGFnZVVwUm93KCkgKyBNYXRoLnJvdW5kKHZpc2libGVSb3dzIC8gMik7CgogICAgICAgIHRoaXMuc2Nyb2xsUGFnZVVwKCk7CgogICAgICAgIHZhciBzZWxlY3Rpb24gPSB0aGlzLmdldFNlbGVjdGlvbigpOwogICAgICAgIHZhciBsZWFkU2NyZWVuUG9zID0gdGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbihzZWxlY3Rpb24uZ2V0U2VsZWN0aW9uTGVhZCgpKTsKICAgICAgICB2YXIgZGVzdCA9IHRoaXMuc2Vzc2lvbi5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24ocm93LCBsZWFkU2NyZWVuUG9zLmNvbHVtbik7CiAgICAgICAgc2VsZWN0aW9uLnNlbGVjdFRvKGRlc3Qucm93LCBkZXN0LmNvbHVtbik7CiAgICB9OwoKICAgIHRoaXMuZ290b1BhZ2VEb3duID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHJvdyA9IHRoaXMuJGdldFBhZ2VEb3duUm93KCk7CiAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb25TY3JlZW4oKS5jb2x1bW47CgogICAgICAgIHRoaXMuc2Nyb2xsVG9Sb3cocm93KTsKICAgICAgICB0aGlzLmdldFNlbGVjdGlvbigpLm1vdmVDdXJzb3JUb1NjcmVlbihyb3csIGNvbHVtbik7CiAgICB9OwoKICAgIHRoaXMuZ290b1BhZ2VVcCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciByb3cgPSB0aGlzLiRnZXRQYWdlVXBSb3coKTsKICAgICAgICB2YXIgY29sdW1uID0gdGhpcy5nZXRDdXJzb3JQb3NpdGlvblNjcmVlbigpLmNvbHVtbjsKCiAgICAgICB0aGlzLnNjcm9sbFRvUm93KHJvdyk7CiAgICAgICB0aGlzLmdldFNlbGVjdGlvbigpLm1vdmVDdXJzb3JUb1NjcmVlbihyb3csIGNvbHVtbik7CiAgICB9OwoKICAgIHRoaXMuc2Nyb2xsUGFnZURvd24gPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnNjcm9sbFRvUm93KHRoaXMuJGdldFBhZ2VEb3duUm93KCkpOwogICAgfTsKCiAgICB0aGlzLnNjcm9sbFBhZ2VVcCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMucmVuZGVyZXIuc2Nyb2xsVG9Sb3codGhpcy4kZ2V0UGFnZVVwUm93KCkpOwogICAgfTsKCiAgICB0aGlzLnNjcm9sbFRvUm93ID0gZnVuY3Rpb24ocm93KSB7CiAgICAgICAgdGhpcy5yZW5kZXJlci5zY3JvbGxUb1Jvdyhyb3cpOwogICAgfTsKCiAgICB0aGlzLnNjcm9sbFRvTGluZSA9IGZ1bmN0aW9uKGxpbmUsIGNlbnRlcikgewogICAgICAgIHRoaXMucmVuZGVyZXIuc2Nyb2xsVG9MaW5lKGxpbmUsIGNlbnRlcik7CiAgICB9OwoKICAgIHRoaXMuY2VudGVyU2VsZWN0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHJhbmdlID0gdGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpOwogICAgICAgIHZhciBsaW5lID0gTWF0aC5mbG9vcihyYW5nZS5zdGFydC5yb3cgKyAocmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdykgLyAyKTsKICAgICAgICB0aGlzLnJlbmRlcmVyLnNjcm9sbFRvTGluZShsaW5lLCB0cnVlKTsKICAgIH07CgogICAgdGhpcy5nZXRDdXJzb3JQb3NpdGlvbiA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbi5nZXRDdXJzb3IoKTsKICAgIH07CgogICAgdGhpcy5nZXRDdXJzb3JQb3NpdGlvblNjcmVlbiA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKSk7CiAgICB9OwoKICAgIHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24uZ2V0UmFuZ2UoKTsKICAgIH07CgoKICAgIHRoaXMuc2VsZWN0QWxsID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy4kYmxvY2tTY3JvbGxpbmcgKz0gMTsKICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RBbGwoKTsKICAgICAgICB0aGlzLiRibG9ja1Njcm9sbGluZyAtPSAxOwogICAgfTsKCiAgICB0aGlzLmNsZWFyU2VsZWN0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXJTZWxlY3Rpb24oKTsKICAgIH07CgogICAgdGhpcy5tb3ZlQ3Vyc29yVG8gPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIHRoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JUbyhyb3csIGNvbHVtbik7CiAgICB9OwoKICAgIHRoaXMubW92ZUN1cnNvclRvUG9zaXRpb24gPSBmdW5jdGlvbihwb3MpIHsKICAgICAgICB0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihwb3MpOwogICAgfTsKCiAgICB0aGlzLmp1bXBUb01hdGNoaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGN1cnNvciA9IHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICB2YXIgcG9zID0gdGhpcy5zZXNzaW9uLmZpbmRNYXRjaGluZ0JyYWNrZXQoY3Vyc29yKTsKICAgICAgICBpZiAoIXBvcykgewogICAgICAgICAgICBjdXJzb3IuY29sdW1uICs9IDE7CiAgICAgICAgICAgIHBvcyA9IHRoaXMuc2Vzc2lvbi5maW5kTWF0Y2hpbmdCcmFja2V0KGN1cnNvcik7CiAgICAgICAgfQogICAgICAgIGlmICghcG9zKSB7CiAgICAgICAgICAgIGN1cnNvci5jb2x1bW4gLT0gMjsKICAgICAgICAgICAgcG9zID0gdGhpcy5zZXNzaW9uLmZpbmRNYXRjaGluZ0JyYWNrZXQoY3Vyc29yKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKHBvcykgewogICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvclRvKHBvcy5yb3csIHBvcy5jb2x1bW4pOwogICAgICAgIH0KICAgIH07CiAgICAKICAgIHRoaXMuZ290b0xpbmUgPSBmdW5jdGlvbihsaW5lTnVtYmVyLCBjb2x1bW4pIHsKICAgICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbigpOwogICAgICAgIHRoaXMuc2Vzc2lvbi51bmZvbGQoe3JvdzogbGluZU51bWJlciAtIDEsIGNvbHVtbjogY29sdW1uIHx8IDB9KTsKCiAgICAgICAgdGhpcy4kYmxvY2tTY3JvbGxpbmcgKz0gMTsKICAgICAgICB0aGlzLm1vdmVDdXJzb3JUbyhsaW5lTnVtYmVyLTEsIGNvbHVtbiB8fCAwKTsKICAgICAgICB0aGlzLiRibG9ja1Njcm9sbGluZyAtPSAxOwogICAgICAgIGlmICghdGhpcy5pc1Jvd0Z1bGx5VmlzaWJsZSh0aGlzLmdldEN1cnNvclBvc2l0aW9uKCkucm93KSkKICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0xpbmUobGluZU51bWJlciwgdHJ1ZSk7CiAgICB9OwoKICAgIHRoaXMubmF2aWdhdGVUbyA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7CiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOwogICAgICAgIHRoaXMubW92ZUN1cnNvclRvKHJvdywgY29sdW1uKTsKICAgIH07CgogICAgdGhpcy5uYXZpZ2F0ZVVwID0gZnVuY3Rpb24odGltZXMpIHsKICAgICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbigpOwogICAgICAgIHRpbWVzID0gdGltZXMgfHwgMTsKICAgICAgICB0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yQnkoLXRpbWVzLCAwKTsKICAgIH07CgogICAgdGhpcy5uYXZpZ2F0ZURvd24gPSBmdW5jdGlvbih0aW1lcykgewogICAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKCk7CiAgICAgICAgdGltZXMgPSB0aW1lcyB8fCAxOwogICAgICAgIHRoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JCeSh0aW1lcywgMCk7CiAgICB9OwoKICAgIHRoaXMubmF2aWdhdGVMZWZ0ID0gZnVuY3Rpb24odGltZXMpIHsKICAgICAgICBpZiAoIXRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSkgewogICAgICAgICAgICB2YXIgc2VsZWN0aW9uU3RhcnQgPSB0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkuc3RhcnQ7CiAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvclRvUG9zaXRpb24oc2VsZWN0aW9uU3RhcnQpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGltZXMgPSB0aW1lcyB8fCAxOwogICAgICAgICAgICB3aGlsZSAodGltZXMtLSkgewogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvckxlZnQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7CiAgICB9OwoKICAgIHRoaXMubmF2aWdhdGVSaWdodCA9IGZ1bmN0aW9uKHRpbWVzKSB7CiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgdmFyIHNlbGVjdGlvbkVuZCA9IHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKS5lbmQ7CiAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvclRvUG9zaXRpb24oc2VsZWN0aW9uRW5kKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRpbWVzID0gdGltZXMgfHwgMTsKICAgICAgICAgICAgd2hpbGUgKHRpbWVzLS0pIHsKICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JSaWdodCgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTsKICAgIH07CgogICAgdGhpcy5uYXZpZ2F0ZUxpbmVTdGFydCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JMaW5lU3RhcnQoKTsKICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7CiAgICB9OwoKICAgIHRoaXMubmF2aWdhdGVMaW5lRW5kID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvckxpbmVFbmQoKTsKICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7CiAgICB9OwoKICAgIHRoaXMubmF2aWdhdGVGaWxlRW5kID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvckZpbGVFbmQoKTsKICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7CiAgICB9OwoKICAgIHRoaXMubmF2aWdhdGVGaWxlU3RhcnQgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yRmlsZVN0YXJ0KCk7CiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOwogICAgfTsKCiAgICB0aGlzLm5hdmlnYXRlV29yZFJpZ2h0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvcldvcmRSaWdodCgpOwogICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTsKICAgIH07CgogICAgdGhpcy5uYXZpZ2F0ZVdvcmRMZWZ0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvcldvcmRMZWZ0KCk7CiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOwogICAgfTsKCiAgICB0aGlzLnJlcGxhY2UgPSBmdW5jdGlvbihyZXBsYWNlbWVudCwgb3B0aW9ucykgewogICAgICAgIGlmIChvcHRpb25zKQogICAgICAgICAgICB0aGlzLiRzZWFyY2guc2V0KG9wdGlvbnMpOwoKICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLiRzZWFyY2guZmluZCh0aGlzLnNlc3Npb24pOwogICAgICAgIGlmICghcmFuZ2UpCiAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgdGhpcy4kdHJ5UmVwbGFjZShyYW5nZSwgcmVwbGFjZW1lbnQpOwogICAgICAgIGlmIChyYW5nZSAhPT0gbnVsbCkKICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UocmFuZ2UpOwogICAgfTsKCiAgICB0aGlzLnJlcGxhY2VBbGwgPSBmdW5jdGlvbihyZXBsYWNlbWVudCwgb3B0aW9ucykgewogICAgICAgIGlmIChvcHRpb25zKSB7CiAgICAgICAgICAgIHRoaXMuJHNlYXJjaC5zZXQob3B0aW9ucyk7CiAgICAgICAgfQoKICAgICAgICB2YXIgcmFuZ2VzID0gdGhpcy4kc2VhcmNoLmZpbmRBbGwodGhpcy5zZXNzaW9uKTsKICAgICAgICBpZiAoIXJhbmdlcy5sZW5ndGgpCiAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgdmFyIHNlbGVjdGlvbiA9IHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7CiAgICAgICAgdGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvclRvKDAsIDApOwoKICAgICAgICB0aGlzLiRibG9ja1Njcm9sbGluZyArPSAxOwogICAgICAgIGZvciAodmFyIGkgPSByYW5nZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpCiAgICAgICAgICAgIHRoaXMuJHRyeVJlcGxhY2UocmFuZ2VzW2ldLCByZXBsYWNlbWVudCk7CgogICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvbik7CiAgICAgICAgdGhpcy4kYmxvY2tTY3JvbGxpbmcgLT0gMTsKICAgIH07CgogICAgdGhpcy4kdHJ5UmVwbGFjZSA9IGZ1bmN0aW9uKHJhbmdlLCByZXBsYWNlbWVudCkgewogICAgICAgIHZhciBpbnB1dCA9IHRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2UocmFuZ2UpOwogICAgICAgIHJlcGxhY2VtZW50ID0gdGhpcy4kc2VhcmNoLnJlcGxhY2UoaW5wdXQsIHJlcGxhY2VtZW50KTsKICAgICAgICBpZiAocmVwbGFjZW1lbnQgIT09IG51bGwpIHsKICAgICAgICAgICAgcmFuZ2UuZW5kID0gdGhpcy5zZXNzaW9uLnJlcGxhY2UocmFuZ2UsIHJlcGxhY2VtZW50KTsKICAgICAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgIH07CgogICAgdGhpcy5nZXRMYXN0U2VhcmNoT3B0aW9ucyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLiRzZWFyY2guZ2V0T3B0aW9ucygpOwogICAgfTsKCiAgICB0aGlzLmZpbmQgPSBmdW5jdGlvbihuZWVkbGUsIG9wdGlvbnMpIHsKICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7CiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICAgICAgb3B0aW9ucy5uZWVkbGUgPSBuZWVkbGU7CiAgICAgICAgdGhpcy4kc2VhcmNoLnNldChvcHRpb25zKTsKICAgICAgICB0aGlzLiRmaW5kKCk7CiAgICB9OwoKICAgIHRoaXMuZmluZE5leHQgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmJhY2t3YXJkcyA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgb3B0aW9ucy5iYWNrd2FyZHMgPSBmYWxzZTsKICAgICAgICB0aGlzLiRzZWFyY2guc2V0KG9wdGlvbnMpOwogICAgICAgIHRoaXMuJGZpbmQoKTsKICAgIH07CgogICAgdGhpcy5maW5kUHJldmlvdXMgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmJhY2t3YXJkcyA9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgb3B0aW9ucy5iYWNrd2FyZHMgPSB0cnVlOwogICAgICAgIHRoaXMuJHNlYXJjaC5zZXQob3B0aW9ucyk7CiAgICAgICAgdGhpcy4kZmluZCgpOwogICAgfTsKCiAgICB0aGlzLiRmaW5kID0gZnVuY3Rpb24oYmFja3dhcmRzKSB7CiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpCiAgICAgICAgICAgIHRoaXMuJHNlYXJjaC5zZXQoe25lZWRsZTogdGhpcy5zZXNzaW9uLmdldFRleHRSYW5nZSh0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkpfSk7CgogICAgICAgIGlmICh0eXBlb2YgYmFja3dhcmRzICE9ICJ1bmRlZmluZWQiKQogICAgICAgICAgICB0aGlzLiRzZWFyY2guc2V0KHtiYWNrd2FyZHM6IGJhY2t3YXJkc30pOwoKICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLiRzZWFyY2guZmluZCh0aGlzLnNlc3Npb24pOwogICAgICAgIGlmIChyYW5nZSkgewogICAgICAgICAgICB0aGlzLnNlc3Npb24udW5mb2xkKHJhbmdlKTsKICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UocmFuZ2UpOyAvLyB0aGlzIHNjcm9sbHMgc2VsZWN0aW9uIGludG8gdmlldwogICAgICAgIH0KICAgIH07CgogICAgdGhpcy51bmRvID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zZXNzaW9uLmdldFVuZG9NYW5hZ2VyKCkudW5kbygpOwogICAgfTsKCiAgICB0aGlzLnJlZG8gPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnNlc3Npb24uZ2V0VW5kb01hbmFnZXIoKS5yZWRvKCk7CiAgICB9OwoKICAgIHRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMucmVuZGVyZXIuZGVzdHJveSgpOwogICAgfTsKCn0pLmNhbGwoRWRpdG9yLnByb3RvdHlwZSk7CgoKZXhwb3J0cy5FZGl0b3IgPSBFZGl0b3I7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9saWIvbGFuZycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCmV4cG9ydHMuc3RyaW5nUmV2ZXJzZSA9IGZ1bmN0aW9uKHN0cmluZykgewogICAgcmV0dXJuIHN0cmluZy5zcGxpdCgiIikucmV2ZXJzZSgpLmpvaW4oIiIpOwp9OwoKZXhwb3J0cy5zdHJpbmdSZXBlYXQgPSBmdW5jdGlvbiAoc3RyaW5nLCBjb3VudCkgewogICAgIHJldHVybiBuZXcgQXJyYXkoY291bnQgKyAxKS5qb2luKHN0cmluZyk7Cn07Cgp2YXIgdHJpbUJlZ2luUmVnZXhwID0gL15cc1xzKi87CnZhciB0cmltRW5kUmVnZXhwID0gL1xzXHMqJC87CgpleHBvcnRzLnN0cmluZ1RyaW1MZWZ0ID0gZnVuY3Rpb24gKHN0cmluZykgewogICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHRyaW1CZWdpblJlZ2V4cCwgJycpOwp9OwoKZXhwb3J0cy5zdHJpbmdUcmltUmlnaHQgPSBmdW5jdGlvbiAoc3RyaW5nKSB7CiAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UodHJpbUVuZFJlZ2V4cCwgJycpOwp9OwoKZXhwb3J0cy5jb3B5T2JqZWN0ID0gZnVuY3Rpb24ob2JqKSB7CiAgICB2YXIgY29weSA9IHt9OwogICAgZm9yICh2YXIga2V5IGluIG9iaikgewogICAgICAgIGNvcHlba2V5XSA9IG9ialtrZXldOwogICAgfQogICAgcmV0dXJuIGNvcHk7Cn07CgpleHBvcnRzLmNvcHlBcnJheSA9IGZ1bmN0aW9uKGFycmF5KXsKICAgIHZhciBjb3B5ID0gW107CiAgICBmb3IgKHZhciBpPTAsIGw9YXJyYXkubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICAgIGlmIChhcnJheVtpXSAmJiB0eXBlb2YgYXJyYXlbaV0gPT0gIm9iamVjdCIpCiAgICAgICAgICAgIGNvcHlbaV0gPSB0aGlzLmNvcHlPYmplY3QoIGFycmF5W2ldICk7CiAgICAgICAgZWxzZSAKICAgICAgICAgICAgY29weVtpXSA9IGFycmF5W2ldOwogICAgfQogICAgcmV0dXJuIGNvcHk7Cn07CgpleHBvcnRzLmRlZXBDb3B5ID0gZnVuY3Rpb24gKG9iaikgewogICAgaWYgKHR5cGVvZiBvYmogIT0gIm9iamVjdCIpIHsKICAgICAgICByZXR1cm4gb2JqOwogICAgfQogICAgCiAgICB2YXIgY29weSA9IG9iai5jb25zdHJ1Y3RvcigpOwogICAgZm9yICh2YXIga2V5IGluIG9iaikgewogICAgICAgIGlmICh0eXBlb2Ygb2JqW2tleV0gPT0gIm9iamVjdCIpIHsKICAgICAgICAgICAgY29weVtrZXldID0gdGhpcy5kZWVwQ29weShvYmpba2V5XSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29weVtrZXldID0gb2JqW2tleV07CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGNvcHk7Cn07CgpleHBvcnRzLmFycmF5VG9NYXAgPSBmdW5jdGlvbihhcnIpIHsKICAgIHZhciBtYXAgPSB7fTsKICAgIGZvciAodmFyIGk9MDsgaTxhcnIubGVuZ3RoOyBpKyspIHsKICAgICAgICBtYXBbYXJyW2ldXSA9IDE7CiAgICB9CiAgICByZXR1cm4gbWFwOwoKfTsKCi8qKgogKiBzcGxpY2Ugb3V0IG9mICdhcnJheScgYW55dGhpbmcgdGhhdCA9PT0gJ3ZhbHVlJwogKi8KZXhwb3J0cy5hcnJheVJlbW92ZSA9IGZ1bmN0aW9uKGFycmF5LCB2YWx1ZSkgewogIGZvciAodmFyIGkgPSAwOyBpIDw9IGFycmF5Lmxlbmd0aDsgaSsrKSB7CiAgICBpZiAodmFsdWUgPT09IGFycmF5W2ldKSB7CiAgICAgIGFycmF5LnNwbGljZShpLCAxKTsKICAgIH0KICB9Cn07CgpleHBvcnRzLmVzY2FwZVJlZ0V4cCA9IGZ1bmN0aW9uKHN0cikgewogICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oWy4qKz9eJHt9KCl8W1xdXC9cXF0pL2csICdcXCQxJyk7Cn07CgpleHBvcnRzLmRlZmVycmVkQ2FsbCA9IGZ1bmN0aW9uKGZjbikgewoKICAgIHZhciB0aW1lciA9IG51bGw7CiAgICB2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aW1lciA9IG51bGw7CiAgICAgICAgZmNuKCk7CiAgICB9OwoKICAgIHZhciBkZWZlcnJlZCA9IGZ1bmN0aW9uKHRpbWVvdXQpIHsKICAgICAgICBkZWZlcnJlZC5jYW5jZWwoKTsKICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIHRpbWVvdXQgfHwgMCk7CiAgICAgICAgcmV0dXJuIGRlZmVycmVkOwogICAgfTsKCiAgICBkZWZlcnJlZC5zY2hlZHVsZSA9IGRlZmVycmVkOwoKICAgIGRlZmVycmVkLmNhbGwgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLmNhbmNlbCgpOwogICAgICAgIGZjbigpOwogICAgICAgIHJldHVybiBkZWZlcnJlZDsKICAgIH07CgogICAgZGVmZXJyZWQuY2FuY2VsID0gZnVuY3Rpb24oKSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTsKICAgICAgICB0aW1lciA9IG51bGw7CiAgICAgICAgcmV0dXJuIGRlZmVycmVkOwogICAgfTsKCiAgICByZXR1cm4gZGVmZXJyZWQ7Cn07Cgp9KTsKLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoKICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKiAgICAgIE1paGFpIFN1Y2FuIDxtaWhhaSBET1Qgc3VjYW4gQVQgZ21haWwgRE9UIGNvbT4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL2tleWJvYXJkL3RleHRpbnB1dCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9ldmVudCcsICdhY2UvbGliL3VzZXJhZ2VudCcsICdhY2UvbGliL2RvbSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIGV2ZW50ID0gcmVxdWlyZSgiLi4vbGliL2V2ZW50Iik7CnZhciB1c2VyYWdlbnQgPSByZXF1aXJlKCIuLi9saWIvdXNlcmFnZW50Iik7CnZhciBkb20gPSByZXF1aXJlKCIuLi9saWIvZG9tIik7Cgp2YXIgVGV4dElucHV0ID0gZnVuY3Rpb24ocGFyZW50Tm9kZSwgaG9zdCkgewoKICAgIHZhciB0ZXh0ID0gZG9tLmNyZWF0ZUVsZW1lbnQoInRleHRhcmVhIik7CiAgICBpZiAodXNlcmFnZW50LmlzVG91Y2hQYWQpCiAgICAgICAgdGV4dC5zZXRBdHRyaWJ1dGUoIngtcGFsbS1kaXNhYmxlLWF1dG8tY2FwIiwgdHJ1ZSk7CiAgICAgICAgCiAgICB0ZXh0LnN0eWxlLmxlZnQgPSAiLTEwMDAwcHgiOwogICAgdGV4dC5zdHlsZS5wb3NpdGlvbiA9ICJmaXhlZCI7CiAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZSh0ZXh0LCBwYXJlbnROb2RlLmZpcnN0Q2hpbGQpOwoKICAgIHZhciBQTEFDRUhPTERFUiA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMCk7CiAgICBzZW5kVGV4dCgpOwoKICAgIHZhciBpbkNvbXBvc3Rpb24gPSBmYWxzZTsKICAgIHZhciBjb3BpZWQgPSBmYWxzZTsKICAgIHZhciBwYXN0ZWQgPSBmYWxzZTsKICAgIHZhciB0ZW1wU3R5bGUgPSAnJzsKCiAgICBmdW5jdGlvbiBzZWxlY3QoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdGV4dC5zZWxlY3QoKTsKICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgfQoKICAgIGZ1bmN0aW9uIHNlbmRUZXh0KHZhbHVlVG9TZW5kKSB7CiAgICAgICAgaWYgKCFjb3BpZWQpIHsKICAgICAgICAgICAgdmFyIHZhbHVlID0gdmFsdWVUb1NlbmQgfHwgdGV4dC52YWx1ZTsKICAgICAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUuY2hhckNvZGVBdCh2YWx1ZS5sZW5ndGgtMSkgPT0gUExBQ0VIT0xERVIuY2hhckNvZGVBdCgwKSkgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMCwgLTEpOwogICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgaG9zdC5vblRleHRJbnB1dCh2YWx1ZSwgcGFzdGVkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGhvc3Qub25UZXh0SW5wdXQodmFsdWUsIHBhc3RlZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gSWYgZWRpdG9yIGlzIG5vIGxvbmdlciBmb2N1c2VkIHdlIHF1aXQgaW1tZWRpYXRlbHksIHNpbmNlCiAgICAgICAgICAgICAgICAvLyBpdCBtZWFucyB0aGF0IHNvbWV0aGluZyBlbHNlIGlzIGluIGNoYXJnZSBub3cuCiAgICAgICAgICAgICAgICBpZiAoIWlzRm9jdXNlZCgpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgY29waWVkID0gZmFsc2U7CiAgICAgICAgcGFzdGVkID0gZmFsc2U7CgogICAgICAgIC8vIFNhZmFyaSBkb2Vzbid0IGZpcmUgY29weSBldmVudHMgaWYgbm8gdGV4dCBpcyBzZWxlY3RlZAogICAgICAgIHRleHQudmFsdWUgPSBQTEFDRUhPTERFUjsKICAgICAgICBzZWxlY3QoKTsKICAgIH0KCiAgICB2YXIgb25UZXh0SW5wdXQgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICghaW5Db21wb3N0aW9uKQogICAgICAgICAgICAgICAgc2VuZFRleHQoZS5kYXRhKTsgICAgICAgICAgICAgICAgCiAgICAgICAgfSwgMCk7CiAgICB9OwogICAgCiAgICB2YXIgb25Qcm9wZXJ0eUNoYW5nZSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICBpZiAodXNlcmFnZW50LmlzT2xkSUUgJiYgdGV4dC52YWx1ZS5jaGFyQ29kZUF0KDApID4gMTI4KSByZXR1cm47CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKCFpbkNvbXBvc3Rpb24pCiAgICAgICAgICAgICAgICBzZW5kVGV4dCgpOwogICAgICAgIH0sIDApOwogICAgfTsKCiAgICB2YXIgb25Db21wb3NpdGlvblN0YXJ0ID0gZnVuY3Rpb24oZSkgewogICAgICAgIGluQ29tcG9zdGlvbiA9IHRydWU7CiAgICAgICAgaG9zdC5vbkNvbXBvc2l0aW9uU3RhcnQoKTsKICAgICAgICBpZiAoIXVzZXJhZ2VudC5pc0dlY2tvKSBzZXRUaW1lb3V0KG9uQ29tcG9zaXRpb25VcGRhdGUsIDApOwogICAgfTsKCiAgICB2YXIgb25Db21wb3NpdGlvblVwZGF0ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICghaW5Db21wb3N0aW9uKSByZXR1cm47CiAgICAgICAgaG9zdC5vbkNvbXBvc2l0aW9uVXBkYXRlKHRleHQudmFsdWUpOwogICAgfTsKCiAgICB2YXIgb25Db21wb3NpdGlvbkVuZCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICBpbkNvbXBvc3Rpb24gPSBmYWxzZTsKICAgICAgICBob3N0Lm9uQ29tcG9zaXRpb25FbmQoKTsKICAgIH07CgogICAgdmFyIG9uQ29weSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICBjb3BpZWQgPSB0cnVlOwogICAgICAgIHZhciBjb3B5VGV4dCA9IGhvc3QuZ2V0Q29weVRleHQoKTsKICAgICAgICBpZihjb3B5VGV4dCkKICAgICAgICAgICAgdGV4dC52YWx1ZSA9IGNvcHlUZXh0OwogICAgICAgIGVsc2UKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIHNlbGVjdCgpOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBzZW5kVGV4dCgpOwogICAgICAgIH0sIDApOwogICAgfTsKICAgIAogICAgdmFyIG9uQ3V0ID0gZnVuY3Rpb24oZSkgewogICAgICAgIGNvcGllZCA9IHRydWU7CiAgICAgICAgdmFyIGNvcHlUZXh0ID0gaG9zdC5nZXRDb3B5VGV4dCgpOwogICAgICAgIGlmKGNvcHlUZXh0KSB7CiAgICAgICAgICAgIHRleHQudmFsdWUgPSBjb3B5VGV4dDsKICAgICAgICAgICAgaG9zdC5vbkN1dCgpOwogICAgICAgIH0gZWxzZQogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgc2VsZWN0KCk7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHNlbmRUZXh0KCk7CiAgICAgICAgfSwgMCk7CiAgICB9OwoKICAgIGV2ZW50LmFkZENvbW1hbmRLZXlMaXN0ZW5lcih0ZXh0LCBob3N0Lm9uQ29tbWFuZEtleS5iaW5kKGhvc3QpKTsKICAgIGlmICh1c2VyYWdlbnQuaXNPbGRJRSkgewogICAgICAgIHZhciBrZXl0YWJsZSA9IHsgMTM6MSwgMjc6MSB9OwogICAgICAgIGV2ZW50LmFkZExpc3RlbmVyKHRleHQsICJrZXl1cCIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGlmIChpbkNvbXBvc3Rpb24gJiYgKCF0ZXh0LnZhbHVlIHx8IGtleXRhYmxlW2Uua2V5Q29kZV0pKQogICAgICAgICAgICAgICAgc2V0VGltZW91dChvbkNvbXBvc2l0aW9uRW5kLCAwKTsKICAgICAgICAgICAgaWYgKCh0ZXh0LnZhbHVlLmNoYXJDb2RlQXQoMCl8MCkgPCAxMjkpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbkNvbXBvc3Rpb24gPyBvbkNvbXBvc2l0aW9uVXBkYXRlKCkgOiBvbkNvbXBvc2l0aW9uU3RhcnQoKTsKICAgICAgICB9KTsKICAgIH0KICAgIAogICAgaWYgKCJvbnByb3BlcnR5Y2hhbmdlIiBpbiB0ZXh0ICYmICEoIm9uaW5wdXQiIGluIHRleHQpKQogICAgICAgIGV2ZW50LmFkZExpc3RlbmVyKHRleHQsICJwcm9wZXJ0eWNoYW5nZSIsIG9uUHJvcGVydHlDaGFuZ2UpOwogICAgZWxzZQogICAgICAgIGV2ZW50LmFkZExpc3RlbmVyKHRleHQsICJpbnB1dCIsIG9uVGV4dElucHV0KTsKICAgIAogICAgZXZlbnQuYWRkTGlzdGVuZXIodGV4dCwgInBhc3RlIiwgZnVuY3Rpb24oZSkgewogICAgICAgIC8vIE1hcmsgdGhhdCB0aGUgbmV4dCBpbnB1dCB0ZXh0IGNvbWVzIGZyb20gcGFzdC4KICAgICAgICBwYXN0ZWQgPSB0cnVlOwogICAgICAgIC8vIFNvbWUgYnJvd3NlcnMgc3VwcG9ydCB0aGUgZXZlbnQuY2xpcGJvYXJkRGF0YSBBUEkuIFVzZSB0aGlzIHRvIGdldAogICAgICAgIC8vIHRoZSBwYXN0ZWQgY29udGVudCB3aGljaCBpbmNyZWFzZXMgc3BlZWQgaWYgcGFzdGluZyBhIGxvdCBvZiBsaW5lcy4KICAgICAgICBpZiAoZS5jbGlwYm9hcmREYXRhICYmIGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKSB7CiAgICAgICAgICAgIHNlbmRUZXh0KGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCJ0ZXh0L3BsYWluIikpOwogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgfSAKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gSWYgYSBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBhbnkgb2YgdGhlIHRoaW5ncyBhYm92ZSwgdXNlIHRoZSByZWd1bGFyCiAgICAgICAgICAgIC8vIG1ldGhvZCB0byBkZXRlY3QgdGhlIHBhc3RlZCBpbnB1dC4KICAgICAgICAgICAgb25Qcm9wZXJ0eUNoYW5nZSgpOwogICAgICAgIH0KICAgIH0pOwoKICAgIGlmICgib25iZWZvcmVjb3B5IiBpbiB0ZXh0ICYmIHR5cGVvZiBjbGlwYm9hcmREYXRhICE9PSAidW5kZWZpbmVkIikgewogICAgICAgIGV2ZW50LmFkZExpc3RlbmVyKHRleHQsICJiZWZvcmVjb3B5IiwgZnVuY3Rpb24oZSkgewogICAgICAgICAgICB2YXIgY29weVRleHQgPSBob3N0LmdldENvcHlUZXh0KCk7CiAgICAgICAgICAgIGlmIChjb3B5VGV4dCkKICAgICAgICAgICAgICAgIGNsaXBib2FyZERhdGEuc2V0RGF0YSgiVGV4dCIsIGNvcHlUZXh0KTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIH0pOwogICAgICAgIGV2ZW50LmFkZExpc3RlbmVyKHBhcmVudE5vZGUsICJrZXlkb3duIiwgZnVuY3Rpb24oZSkgewogICAgICAgICAgICBpZiAoZS5jdHJsS2V5ICYmIGUua2V5Q29kZSA9PSA4OCkgewogICAgICAgICAgICAgICAgdmFyIGNvcHlUZXh0ID0gaG9zdC5nZXRDb3B5VGV4dCgpOwogICAgICAgICAgICAgICAgaWYgKGNvcHlUZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgY2xpcGJvYXJkRGF0YS5zZXREYXRhKCJUZXh0IiwgY29weVRleHQpOwogICAgICAgICAgICAgICAgICAgIGhvc3Qub25DdXQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KGUpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBldmVudC5hZGRMaXN0ZW5lcih0ZXh0LCAiY29weSIsIG9uQ29weSk7CiAgICAgICAgZXZlbnQuYWRkTGlzdGVuZXIodGV4dCwgImN1dCIsIG9uQ3V0KTsKICAgIH0KCiAgICBldmVudC5hZGRMaXN0ZW5lcih0ZXh0LCAiY29tcG9zaXRpb25zdGFydCIsIG9uQ29tcG9zaXRpb25TdGFydCk7CiAgICBpZiAodXNlcmFnZW50LmlzR2Vja28pIHsKICAgICAgICBldmVudC5hZGRMaXN0ZW5lcih0ZXh0LCAidGV4dCIsIG9uQ29tcG9zaXRpb25VcGRhdGUpOwogICAgfQogICAgaWYgKHVzZXJhZ2VudC5pc1dlYktpdCkgewogICAgICAgIGV2ZW50LmFkZExpc3RlbmVyKHRleHQsICJrZXl1cCIsIG9uQ29tcG9zaXRpb25VcGRhdGUpOwogICAgfQogICAgZXZlbnQuYWRkTGlzdGVuZXIodGV4dCwgImNvbXBvc2l0aW9uZW5kIiwgb25Db21wb3NpdGlvbkVuZCk7CgogICAgZXZlbnQuYWRkTGlzdGVuZXIodGV4dCwgImJsdXIiLCBmdW5jdGlvbigpIHsKICAgICAgICBob3N0Lm9uQmx1cigpOwogICAgfSk7CgogICAgZXZlbnQuYWRkTGlzdGVuZXIodGV4dCwgImZvY3VzIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgaG9zdC5vbkZvY3VzKCk7CiAgICAgICAgc2VsZWN0KCk7CiAgICB9KTsKCiAgICB0aGlzLmZvY3VzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaG9zdC5vbkZvY3VzKCk7CiAgICAgICAgc2VsZWN0KCk7CiAgICAgICAgdGV4dC5mb2N1cygpOwogICAgfTsKCiAgICB0aGlzLmJsdXIgPSBmdW5jdGlvbigpIHsKICAgICAgICB0ZXh0LmJsdXIoKTsKICAgIH07CgogICAgZnVuY3Rpb24gaXNGb2N1c2VkKCkgewogICAgICAgIHJldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0ZXh0OwogICAgfQogICAgdGhpcy5pc0ZvY3VzZWQgPSBpc0ZvY3VzZWQ7CgogICAgdGhpcy5nZXRFbGVtZW50ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwoKICAgIHRoaXMub25Db250ZXh0TWVudSA9IGZ1bmN0aW9uKG1vdXNlUG9zLCBpc0VtcHR5KXsKICAgICAgICBpZiAobW91c2VQb3MpIHsKICAgICAgICAgICAgaWYgKCF0ZW1wU3R5bGUpCiAgICAgICAgICAgICAgICB0ZW1wU3R5bGUgPSB0ZXh0LnN0eWxlLmNzc1RleHQ7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgdGV4dC5zdHlsZS5jc3NUZXh0ID0gCiAgICAgICAgICAgICAgICAncG9zaXRpb246Zml4ZWQ7IHotaW5kZXg6MTAwMDsnICsKICAgICAgICAgICAgICAgICdsZWZ0OicgKyAobW91c2VQb3MueCAtIDIpICsgJ3B4OyB0b3A6JyArIChtb3VzZVBvcy55IC0gMikgKyAncHg7JzsKCiAgICAgICAgfQogICAgICAgIGlmIChpc0VtcHR5KQogICAgICAgICAgICB0ZXh0LnZhbHVlPScnOwogICAgfTsKCiAgICB0aGlzLm9uQ29udGV4dE1lbnVDbG9zZSA9IGZ1bmN0aW9uKCl7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICh0ZW1wU3R5bGUpIHsKICAgICAgICAgICAgICAgIHRleHQuc3R5bGUuY3NzVGV4dCA9IHRlbXBTdHlsZTsKICAgICAgICAgICAgICAgIHRlbXBTdHlsZSA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlbmRUZXh0KCk7CiAgICAgICAgfSwgMCk7CiAgICB9Owp9OwoKZXhwb3J0cy5UZXh0SW5wdXQgPSBUZXh0SW5wdXQ7Cn0pOwovKiB2aW06dHM9NDpzdHM9NDpzdz00OgogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqICAgICAgTWloYWkgU3VjYW4gPG1paGFpIERPVCBzdWNhbiBBVCBnbWFpbCBET1QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW91c2UvbW91c2VfaGFuZGxlcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9ldmVudCcsICdhY2UvbW91c2UvZGVmYXVsdF9oYW5kbGVycycsICdhY2UvbW91c2UvZGVmYXVsdF9ndXR0ZXJfaGFuZGxlcicsICdhY2UvbW91c2UvbW91c2VfZXZlbnQnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBldmVudCA9IHJlcXVpcmUoIi4uL2xpYi9ldmVudCIpOwp2YXIgRGVmYXVsdEhhbmRsZXJzID0gcmVxdWlyZSgiLi9kZWZhdWx0X2hhbmRsZXJzIikuRGVmYXVsdEhhbmRsZXJzOwp2YXIgRGVmYXVsdEd1dHRlckhhbmRsZXIgPSByZXF1aXJlKCIuL2RlZmF1bHRfZ3V0dGVyX2hhbmRsZXIiKS5HdXR0ZXJIYW5kbGVyOwp2YXIgTW91c2VFdmVudCA9IHJlcXVpcmUoIi4vbW91c2VfZXZlbnQiKS5Nb3VzZUV2ZW50OwoKdmFyIE1vdXNlSGFuZGxlciA9IGZ1bmN0aW9uKGVkaXRvcikgewogICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7CiAgICAKICAgIG5ldyBEZWZhdWx0SGFuZGxlcnMoZWRpdG9yKTsKICAgIG5ldyBEZWZhdWx0R3V0dGVySGFuZGxlcihlZGl0b3IpOwogICAgCiAgICBldmVudC5hZGRMaXN0ZW5lcihlZGl0b3IuY29udGFpbmVyLCAibW91c2Vkb3duIiwgZnVuY3Rpb24oZSkgewogICAgICAgIGVkaXRvci5mb2N1cygpOwogICAgICAgIHJldHVybiBldmVudC5wcmV2ZW50RGVmYXVsdChlKTsKICAgIH0pOwogICAgZXZlbnQuYWRkTGlzdGVuZXIoZWRpdG9yLmNvbnRhaW5lciwgInNlbGVjdHN0YXJ0IiwgZnVuY3Rpb24oZSkgewogICAgICAgIHJldHVybiBldmVudC5wcmV2ZW50RGVmYXVsdChlKTsKICAgIH0pOwoKICAgIHZhciBtb3VzZVRhcmdldCA9IGVkaXRvci5yZW5kZXJlci5nZXRNb3VzZUV2ZW50VGFyZ2V0KCk7CiAgICBldmVudC5hZGRMaXN0ZW5lcihtb3VzZVRhcmdldCwgIm1vdXNlZG93biIsIHRoaXMub25Nb3VzZUV2ZW50LmJpbmQodGhpcywgIm1vdXNlZG93biIpKTsKICAgIGV2ZW50LmFkZExpc3RlbmVyKG1vdXNlVGFyZ2V0LCAiY2xpY2siLCB0aGlzLm9uTW91c2VFdmVudC5iaW5kKHRoaXMsICJjbGljayIpKTsKICAgIGV2ZW50LmFkZExpc3RlbmVyKG1vdXNlVGFyZ2V0LCAibW91c2Vtb3ZlIiwgdGhpcy5vbk1vdXNlTW92ZS5iaW5kKHRoaXMsICJtb3VzZW1vdmUiKSk7CiAgICBldmVudC5hZGRNdWx0aU1vdXNlRG93bkxpc3RlbmVyKG1vdXNlVGFyZ2V0LCAwLCAyLCA1MDAsIHRoaXMub25Nb3VzZUV2ZW50LmJpbmQodGhpcywgImRibGNsaWNrIikpOwogICAgZXZlbnQuYWRkTXVsdGlNb3VzZURvd25MaXN0ZW5lcihtb3VzZVRhcmdldCwgMCwgMywgNjAwLCB0aGlzLm9uTW91c2VFdmVudC5iaW5kKHRoaXMsICJ0cmlwbGVjbGljayIpKTsKICAgIGV2ZW50LmFkZE11bHRpTW91c2VEb3duTGlzdGVuZXIobW91c2VUYXJnZXQsIDAsIDQsIDYwMCwgdGhpcy5vbk1vdXNlRXZlbnQuYmluZCh0aGlzLCAicXVhZGNsaWNrIikpOwogICAgZXZlbnQuYWRkTW91c2VXaGVlbExpc3RlbmVyKGVkaXRvci5jb250YWluZXIsIHRoaXMub25Nb3VzZVdoZWVsLmJpbmQodGhpcywgIm1vdXNld2hlZWwiKSk7CiAgICAKICAgIHZhciBndXR0ZXJFbCA9IGVkaXRvci5yZW5kZXJlci4kZ3V0dGVyOwogICAgZXZlbnQuYWRkTGlzdGVuZXIoZ3V0dGVyRWwsICJtb3VzZWRvd24iLCB0aGlzLm9uTW91c2VFdmVudC5iaW5kKHRoaXMsICJndXR0ZXJtb3VzZWRvd24iKSk7CiAgICBldmVudC5hZGRMaXN0ZW5lcihndXR0ZXJFbCwgImNsaWNrIiwgdGhpcy5vbk1vdXNlRXZlbnQuYmluZCh0aGlzLCAiZ3V0dGVyY2xpY2siKSk7CiAgICBldmVudC5hZGRMaXN0ZW5lcihndXR0ZXJFbCwgImRibGNsaWNrIiwgdGhpcy5vbk1vdXNlRXZlbnQuYmluZCh0aGlzLCAiZ3V0dGVyZGJsY2xpY2siKSk7CiAgICBldmVudC5hZGRMaXN0ZW5lcihndXR0ZXJFbCwgIm1vdXNlbW92ZSIsIHRoaXMub25Nb3VzZU1vdmUuYmluZCh0aGlzLCAiZ3V0dGVyIikpOwp9OwoKKGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuJHNjcm9sbFNwZWVkID0gMTsKICAgIHRoaXMuc2V0U2Nyb2xsU3BlZWQgPSBmdW5jdGlvbihzcGVlZCkgewogICAgICAgIHRoaXMuJHNjcm9sbFNwZWVkID0gc3BlZWQ7CiAgICB9OwoKICAgIHRoaXMuZ2V0U2Nyb2xsU3BlZWQgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy4kc2Nyb2xsU3BlZWQ7CiAgICB9OwoKICAgIHRoaXMub25Nb3VzZUV2ZW50ID0gZnVuY3Rpb24obmFtZSwgZSkgewogICAgICAgIHRoaXMuZWRpdG9yLl9lbWl0KG5hbWUsIG5ldyBNb3VzZUV2ZW50KGUsIHRoaXMuZWRpdG9yKSk7CiAgICB9OwogICAgCiAgICB0aGlzLiRkcmFnRGVsYXkgPSAyNTA7CiAgICB0aGlzLnNldERyYWdEZWxheSA9IGZ1bmN0aW9uKGRyYWdEZWxheSkgewogICAgICAgIHRoaXMuJGRyYWdEZWxheSA9IGRyYWdEZWxheTsKICAgIH07CgogICAgdGhpcy5nZXREcmFnRGVsYXkgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy4kZHJhZ0RlbGF5OwogICAgfTsKCiAgICB0aGlzLm9uTW91c2VNb3ZlID0gZnVuY3Rpb24obmFtZSwgZSkgewogICAgICAgIC8vIG9wdGltaXphdGlvbiwgYmVjYXVzZSBtb3VzZW1vdmUgZG9lc24ndCBoYXZlIGEgZGVmYXVsdCBoYW5kbGVyLgogICAgICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLmVkaXRvci5fZXZlbnRSZWdpc3RyeSAmJiB0aGlzLmVkaXRvci5fZXZlbnRSZWdpc3RyeS5tb3VzZW1vdmU7CiAgICAgICAgaWYgKCFsaXN0ZW5lcnMgfHwgIWxpc3RlbmVycy5sZW5ndGgpCiAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgdGhpcy5lZGl0b3IuX2VtaXQobmFtZSwgbmV3IE1vdXNlRXZlbnQoZSwgdGhpcy5lZGl0b3IpKTsKICAgIH07CgogICAgdGhpcy5vbk1vdXNlV2hlZWwgPSBmdW5jdGlvbihuYW1lLCBlKSB7CiAgICAgICAgdmFyIG1vdXNlRXZlbnQgPSBuZXcgTW91c2VFdmVudChlLCB0aGlzLmVkaXRvcik7CiAgICAgICAgbW91c2VFdmVudC5zcGVlZCA9IHRoaXMuJHNjcm9sbFNwZWVkICogMjsKICAgICAgICBtb3VzZUV2ZW50LndoZWVsWCA9IGUud2hlZWxYOwogICAgICAgIG1vdXNlRXZlbnQud2hlZWxZID0gZS53aGVlbFk7CiAgICAgICAgCiAgICAgICAgdGhpcy5lZGl0b3IuX2VtaXQobmFtZSwgbW91c2VFdmVudCk7CiAgICB9OwoKfSkuY2FsbChNb3VzZUhhbmRsZXIucHJvdG90eXBlKTsKCmV4cG9ydHMuTW91c2VIYW5kbGVyID0gTW91c2VIYW5kbGVyOwp9KTsKLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoKICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKiAgICAgIE1pa2UgZGUgQm9lciA8bWlrZSBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb3VzZS9kZWZhdWx0X2hhbmRsZXJzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2V2ZW50JywgJ2FjZS9saWIvZG9tJywgJ2FjZS9saWIvYnJvd3Nlcl9mb2N1cyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIGV2ZW50ID0gcmVxdWlyZSgiLi4vbGliL2V2ZW50Iik7CnZhciBkb20gPSByZXF1aXJlKCIuLi9saWIvZG9tIik7CnZhciBCcm93c2VyRm9jdXMgPSByZXF1aXJlKCIuLi9saWIvYnJvd3Nlcl9mb2N1cyIpLkJyb3dzZXJGb2N1czsKCnZhciBTVEFURV9VTktOT1dOID0gMDsKdmFyIFNUQVRFX1NFTEVDVCA9IDE7CnZhciBTVEFURV9EUkFHID0gMjsKCnZhciBEUkFHX09GRlNFVCA9IDU7IC8vIHBpeGVscwoKZnVuY3Rpb24gRGVmYXVsdEhhbmRsZXJzKGVkaXRvcikgewogICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7CiAgICB0aGlzLiRjbGlja1NlbGVjdGlvbiA9IG51bGw7CiAgICB0aGlzLmJyb3dzZXJGb2N1cyA9IG5ldyBCcm93c2VyRm9jdXMoKTsKCiAgICBlZGl0b3Iuc2V0RGVmYXVsdEhhbmRsZXIoIm1vdXNlZG93biIsIHRoaXMub25Nb3VzZURvd24uYmluZCh0aGlzKSk7CiAgICBlZGl0b3Iuc2V0RGVmYXVsdEhhbmRsZXIoImRibGNsaWNrIiwgdGhpcy5vbkRvdWJsZUNsaWNrLmJpbmQodGhpcykpOwogICAgZWRpdG9yLnNldERlZmF1bHRIYW5kbGVyKCJ0cmlwbGVjbGljayIsIHRoaXMub25UcmlwbGVDbGljay5iaW5kKHRoaXMpKTsKICAgIGVkaXRvci5zZXREZWZhdWx0SGFuZGxlcigicXVhZGNsaWNrIiwgdGhpcy5vblF1YWRDbGljay5iaW5kKHRoaXMpKTsKICAgIGVkaXRvci5zZXREZWZhdWx0SGFuZGxlcigibW91c2V3aGVlbCIsIHRoaXMub25TY3JvbGwuYmluZCh0aGlzKSk7Cn0KCihmdW5jdGlvbigpIHsKICAgIAogICAgdGhpcy5vbk1vdXNlRG93biA9IGZ1bmN0aW9uKGV2KSB7CiAgICAgICAgdmFyIGluU2VsZWN0aW9uID0gZXYuaW5TZWxlY3Rpb24oKTsKICAgICAgICB2YXIgcGFnZVggPSBldi5wYWdlWDsKICAgICAgICB2YXIgcGFnZVkgPSBldi5wYWdlWTsKICAgICAgICB2YXIgcG9zID0gZXYuZ2V0RG9jdW1lbnRQb3NpdGlvbigpOwogICAgICAgIHZhciBlZGl0b3IgPSB0aGlzLmVkaXRvcjsKICAgICAgICB2YXIgX3NlbGYgPSB0aGlzOwogICAgICAgIAogICAgICAgIHZhciBzZWxlY3Rpb25SYW5nZSA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOwogICAgICAgIHZhciBzZWxlY3Rpb25FbXB0eSA9IHNlbGVjdGlvblJhbmdlLmlzRW1wdHkoKTsKICAgICAgICB2YXIgc3RhdGUgPSBTVEFURV9VTktOT1dOOwogICAgICAgIAogICAgICAgIC8vIGlmIHRoaXMgY2xpY2sgY2F1c2VkIHRoZSBlZGl0b3IgdG8gYmUgZm9jdXNlZCBzaG91bGQgbm90IGNsZWFyIHRoZQogICAgICAgIC8vIHNlbGVjdGlvbgogICAgICAgIGlmICgKICAgICAgICAgICAgaW5TZWxlY3Rpb24gJiYgKAogICAgICAgICAgICAgICAgIXRoaXMuYnJvd3NlckZvY3VzLmlzRm9jdXNlZCgpCiAgICAgICAgICAgICAgICB8fCBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHRoaXMuYnJvd3NlckZvY3VzLmxhc3RGb2N1cyA8IDIwCiAgICAgICAgICAgICAgICB8fCAhZWRpdG9yLmlzRm9jdXNlZCgpCiAgICAgICAgICAgICkKICAgICAgICApIHsKICAgICAgICAgICAgZWRpdG9yLmZvY3VzKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHZhciBidXR0b24gPSBldi5nZXRCdXR0b24oKTsKICAgICAgICBpZiAoYnV0dG9uICE9PSAwKSB7CiAgICAgICAgICAgIGlmIChzZWxlY3Rpb25FbXB0eSkgewogICAgICAgICAgICAgICAgZWRpdG9yLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKHBvcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJ1dHRvbiA9PSAyKSB7CiAgICAgICAgICAgICAgICBlZGl0b3IudGV4dElucHV0Lm9uQ29udGV4dE1lbnUoe3g6IGV2LmNsaWVudFgsIHk6IGV2LmNsaWVudFl9LCBzZWxlY3Rpb25FbXB0eSk7CiAgICAgICAgICAgICAgICBldmVudC5jYXB0dXJlKGVkaXRvci5jb250YWluZXIsIGZ1bmN0aW9uKCl7fSwgZWRpdG9yLnRleHRJbnB1dC5vbkNvbnRleHRNZW51Q2xvc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICghaW5TZWxlY3Rpb24pIHsKICAgICAgICAgICAgLy8gRGlyZWN0bHkgcGljayBTVEFURV9TRUxFQ1QsIHNpbmNlIHRoZSB1c2VyIGlzIG5vdCBjbGlja2luZyBpbnNpZGUKICAgICAgICAgICAgLy8gYSBzZWxlY3Rpb24uCiAgICAgICAgICAgIG9uU3RhcnRTZWxlY3QocG9zKTsKICAgICAgICB9CgogICAgICAgIHZhciBtb3VzZVBhZ2VYID0gcGFnZVgsIG1vdXNlUGFnZVkgPSBwYWdlWTsKICAgICAgICB2YXIgbW91c2Vkb3duVGltZSA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7CiAgICAgICAgdmFyIGRyYWdDdXJzb3IsIGRyYWdSYW5nZSwgZHJhZ1NlbGVjdGlvbk1hcmtlcjsKCiAgICAgICAgdmFyIG9uTW91c2VTZWxlY3Rpb24gPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIG1vdXNlUGFnZVggPSBldmVudC5nZXREb2N1bWVudFgoZSk7CiAgICAgICAgICAgIG1vdXNlUGFnZVkgPSBldmVudC5nZXREb2N1bWVudFkoZSk7CiAgICAgICAgfTsKCiAgICAgICAgdmFyIG9uTW91c2VTZWxlY3Rpb25FbmQgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXJJZCk7CiAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTVEFURV9VTktOT1dOKQogICAgICAgICAgICAgICAgb25TdGFydFNlbGVjdChwb3MpOwogICAgICAgICAgICBlbHNlIGlmIChzdGF0ZSA9PSBTVEFURV9EUkFHKQogICAgICAgICAgICAgICAgb25Nb3VzZURyYWdTZWxlY3Rpb25FbmQoZSk7CgogICAgICAgICAgICBfc2VsZi4kY2xpY2tTZWxlY3Rpb24gPSBudWxsOwogICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX1VOS05PV047CiAgICAgICAgfTsKCiAgICAgICAgdmFyIG9uTW91c2VEcmFnU2VsZWN0aW9uRW5kID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICBkb20ucmVtb3ZlQ3NzQ2xhc3MoZWRpdG9yLmNvbnRhaW5lciwgImFjZV9kcmFnZ2luZyIpOwogICAgICAgICAgICBlZGl0b3Iuc2Vzc2lvbi5yZW1vdmVNYXJrZXIoZHJhZ1NlbGVjdGlvbk1hcmtlcik7CgogICAgICAgICAgICBpZiAoIWVkaXRvci4kbW91c2VIYW5kbGVyLiRjbGlja1NlbGVjdGlvbikgewogICAgICAgICAgICAgICAgaWYgKCFkcmFnQ3Vyc29yKSB7CiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKHBvcyk7CiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLnNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbihwb3Mucm93LCBwb3MuY29sdW1uKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFkcmFnQ3Vyc29yKQogICAgICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICAgICAgaWYgKGRyYWdSYW5nZS5jb250YWlucyhkcmFnQ3Vyc29yLnJvdywgZHJhZ0N1cnNvci5jb2x1bW4pKSB7CiAgICAgICAgICAgICAgICBkcmFnQ3Vyc29yID0gbnVsbDsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZWRpdG9yLmNsZWFyU2VsZWN0aW9uKCk7CiAgICAgICAgICAgIGlmIChlICYmIChlLmN0cmxLZXkgfHwgZS5hbHRLZXkpKSB7CiAgICAgICAgICAgICAgICB2YXIgc2Vzc2lvbiA9IGVkaXRvci5zZXNzaW9uOwogICAgICAgICAgICAgICAgdmFyIG5ld1JhbmdlID0gc2Vzc2lvbi5pbnNlcnQoZHJhZ0N1cnNvciwgc2Vzc2lvbi5nZXRUZXh0UmFuZ2UoZHJhZ1JhbmdlKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgbmV3UmFuZ2UgPSBlZGl0b3IubW92ZVRleHQoZHJhZ1JhbmdlLCBkcmFnQ3Vyc29yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW5ld1JhbmdlKSB7CiAgICAgICAgICAgICAgICBkcmFnQ3Vyc29yID0gbnVsbDsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZWRpdG9yLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShuZXdSYW5nZSk7CiAgICAgICAgfTsKCiAgICAgICAgdmFyIG9uU2VsZWN0aW9uSW50ZXJ2YWwgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKHN0YXRlID09IFNUQVRFX1VOS05PV04pIHsKICAgICAgICAgICAgICAgIHZhciBkaXN0YW5jZSA9IGNhbGNEaXN0YW5jZShwYWdlWCwgcGFnZVksIG1vdXNlUGFnZVgsIG1vdXNlUGFnZVkpOwogICAgICAgICAgICAgICAgdmFyIHRpbWUgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpOwoKICAgICAgICAgICAgICAgIGlmIChkaXN0YW5jZSA+IERSQUdfT0ZGU0VUKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9TRUxFQ1Q7CiAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5yZW5kZXJlci5zY3JlZW5Ub1RleHRDb29yZGluYXRlcyhtb3VzZVBhZ2VYLCBtb3VzZVBhZ2VZKTsKICAgICAgICAgICAgICAgICAgICBjdXJzb3Iucm93ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oY3Vyc29yLnJvdywgZWRpdG9yLnNlc3Npb24uZ2V0TGVuZ3RoKCktMSkpOwogICAgICAgICAgICAgICAgICAgIG9uU3RhcnRTZWxlY3QoY3Vyc29yKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCh0aW1lIC0gbW91c2Vkb3duVGltZSkgPiBlZGl0b3IuZ2V0RHJhZ0RlbGF5KCkpIHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX0RSQUc7CiAgICAgICAgICAgICAgICAgICAgZHJhZ1JhbmdlID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN0eWxlID0gZWRpdG9yLmdldFNlbGVjdGlvblN0eWxlKCk7CiAgICAgICAgICAgICAgICAgICAgZHJhZ1NlbGVjdGlvbk1hcmtlciA9IGVkaXRvci5zZXNzaW9uLmFkZE1hcmtlcihkcmFnUmFuZ2UsICJhY2Vfc2VsZWN0aW9uIiwgc3R5bGUpOwogICAgICAgICAgICAgICAgICAgIGVkaXRvci5jbGVhclNlbGVjdGlvbigpOwogICAgICAgICAgICAgICAgICAgIGRvbS5hZGRDc3NDbGFzcyhlZGl0b3IuY29udGFpbmVyLCAiYWNlX2RyYWdnaW5nIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc3RhdGUgPT0gU1RBVEVfRFJBRykKICAgICAgICAgICAgICAgIG9uRHJhZ1NlbGVjdGlvbkludGVydmFsKCk7CiAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlID09IFNUQVRFX1NFTEVDVCkKICAgICAgICAgICAgICAgIG9uVXBkYXRlU2VsZWN0aW9uSW50ZXJ2YWwoKTsKICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiBvblN0YXJ0U2VsZWN0KHBvcykgewogICAgICAgICAgICBpZiAoZXYuZ2V0U2hpZnRLZXkoKSkgewogICAgICAgICAgICAgICAgZWRpdG9yLnNlbGVjdGlvbi5zZWxlY3RUb1Bvc2l0aW9uKHBvcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoIV9zZWxmLiRjbGlja1NlbGVjdGlvbikgewogICAgICAgICAgICAgICAgICAgIGVkaXRvci5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihwb3MpOwogICAgICAgICAgICAgICAgICAgIGVkaXRvci5zZWxlY3Rpb24uY2xlYXJTZWxlY3Rpb24ocG9zLnJvdywgcG9zLmNvbHVtbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9TRUxFQ1Q7CiAgICAgICAgfQoKICAgICAgICB2YXIgb25VcGRhdGVTZWxlY3Rpb25JbnRlcnZhbCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgYW5jaG9yOwogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLnJlbmRlcmVyLnNjcmVlblRvVGV4dENvb3JkaW5hdGVzKG1vdXNlUGFnZVgsIG1vdXNlUGFnZVkpOwogICAgICAgICAgICBjdXJzb3Iucm93ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oY3Vyc29yLnJvdywgZWRpdG9yLnNlc3Npb24uZ2V0TGVuZ3RoKCktMSkpOwoKICAgICAgICAgICAgaWYgKF9zZWxmLiRjbGlja1NlbGVjdGlvbikgewogICAgICAgICAgICAgICAgaWYgKF9zZWxmLiRjbGlja1NlbGVjdGlvbi5jb250YWlucyhjdXJzb3Iucm93LCBjdXJzb3IuY29sdW1uKSkgewogICAgICAgICAgICAgICAgICAgIGVkaXRvci5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UoX3NlbGYuJGNsaWNrU2VsZWN0aW9uKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmIChfc2VsZi4kY2xpY2tTZWxlY3Rpb24uY29tcGFyZShjdXJzb3Iucm93LCBjdXJzb3IuY29sdW1uKSA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICBhbmNob3IgPSBfc2VsZi4kY2xpY2tTZWxlY3Rpb24uZW5kOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yID0gX3NlbGYuJGNsaWNrU2VsZWN0aW9uLnN0YXJ0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlZGl0b3Iuc2VsZWN0aW9uLnNldFNlbGVjdGlvbkFuY2hvcihhbmNob3Iucm93LCBhbmNob3IuY29sdW1uKTsKICAgICAgICAgICAgICAgICAgICBlZGl0b3Iuc2VsZWN0aW9uLnNlbGVjdFRvUG9zaXRpb24oY3Vyc29yKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGVkaXRvci5zZWxlY3Rpb24uc2VsZWN0VG9Qb3NpdGlvbihjdXJzb3IpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBlZGl0b3IucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcoKTsKICAgICAgICB9OwoKICAgICAgICB2YXIgb25EcmFnU2VsZWN0aW9uSW50ZXJ2YWwgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgZHJhZ0N1cnNvciA9IGVkaXRvci5yZW5kZXJlci5zY3JlZW5Ub1RleHRDb29yZGluYXRlcyhtb3VzZVBhZ2VYLCBtb3VzZVBhZ2VZKTsKICAgICAgICAgICAgZHJhZ0N1cnNvci5yb3cgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihkcmFnQ3Vyc29yLnJvdywgZWRpdG9yLnNlc3Npb24uZ2V0TGVuZ3RoKCkgLSAxKSk7CgogICAgICAgICAgICBlZGl0b3IubW92ZUN1cnNvclRvUG9zaXRpb24oZHJhZ0N1cnNvcik7CiAgICAgICAgfTsKCiAgICAgICAgZXZlbnQuY2FwdHVyZShlZGl0b3IuY29udGFpbmVyLCBvbk1vdXNlU2VsZWN0aW9uLCBvbk1vdXNlU2VsZWN0aW9uRW5kKTsKICAgICAgICB2YXIgdGltZXJJZCA9IHNldEludGVydmFsKG9uU2VsZWN0aW9uSW50ZXJ2YWwsIDIwKTsKCiAgICAgICAgcmV0dXJuIGV2LnByZXZlbnREZWZhdWx0KCk7CiAgICB9OwogICAgCiAgICB0aGlzLm9uRG91YmxlQ2xpY2sgPSBmdW5jdGlvbihldikgewogICAgICAgIHZhciBwb3MgPSBldi5nZXREb2N1bWVudFBvc2l0aW9uKCk7CiAgICAgICAgdmFyIGVkaXRvciA9IHRoaXMuZWRpdG9yOwogICAgICAgIAogICAgICAgIGVkaXRvci5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihwb3MpOwogICAgICAgIGVkaXRvci5zZWxlY3Rpb24uc2VsZWN0V29yZCgpOwogICAgICAgIHRoaXMuJGNsaWNrU2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7CiAgICB9OwogICAgCiAgICB0aGlzLm9uVHJpcGxlQ2xpY2sgPSBmdW5jdGlvbihldikgewogICAgICAgIHZhciBwb3MgPSBldi5nZXREb2N1bWVudFBvc2l0aW9uKCk7CiAgICAgICAgdmFyIGVkaXRvciA9IHRoaXMuZWRpdG9yOwogICAgICAgIAogICAgICAgIGVkaXRvci5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihwb3MpOwogICAgICAgIGVkaXRvci5zZWxlY3Rpb24uc2VsZWN0TGluZSgpOwogICAgICAgIHRoaXMuJGNsaWNrU2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7CiAgICB9OwogICAgCiAgICB0aGlzLm9uUXVhZENsaWNrID0gZnVuY3Rpb24oZXYpIHsKICAgICAgICB2YXIgZWRpdG9yID0gdGhpcy5lZGl0b3I7CiAgICAgICAgCiAgICAgICAgZWRpdG9yLnNlbGVjdEFsbCgpOwogICAgICAgIHRoaXMuJGNsaWNrU2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7CiAgICB9OwogICAgCiAgICB0aGlzLm9uU2Nyb2xsID0gZnVuY3Rpb24oZXYpIHsKICAgICAgICB2YXIgZWRpdG9yID0gdGhpcy5lZGl0b3I7CiAgICAgICAgCiAgICAgICAgZWRpdG9yLnJlbmRlcmVyLnNjcm9sbEJ5KGV2LndoZWVsWCAqIGV2LnNwZWVkLCBldi53aGVlbFkgKiBldi5zcGVlZCk7CiAgICAgICAgaWYgKGVkaXRvci5yZW5kZXJlci5pc1Njcm9sbGFibGVCeShldi53aGVlbFggKiBldi5zcGVlZCwgZXYud2hlZWxZICogZXYuc3BlZWQpKQogICAgICAgICAgICByZXR1cm4gZXYucHJldmVudERlZmF1bHQoKTsKICAgIH07CiAgICAKfSkuY2FsbChEZWZhdWx0SGFuZGxlcnMucHJvdG90eXBlKTsKCmV4cG9ydHMuRGVmYXVsdEhhbmRsZXJzID0gRGVmYXVsdEhhbmRsZXJzOwoKZnVuY3Rpb24gY2FsY0Rpc3RhbmNlKGF4LCBheSwgYngsIGJ5KSB7CiAgICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KGJ4IC0gYXgsIDIpICsgTWF0aC5wb3coYnkgLSBheSwgMikpOwp9Cgp9KTsKLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoKICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKiAgICAgIElyYWtsaSBHb3phbGlzaHZpbGkgPHJmb2JpY0BnbWFpbC5jb20+IChodHRwOi8vamVkaXRvb2xraXQuY29tKQogKiAgICAgIEp1bGlhbiBWaWVyZWNrIDxqdWxpYW4udmllcmVja0BnbWFpbC5jb20+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9saWIvYnJvd3Nlcl9mb2N1cycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9ldmVudCcsICdhY2UvbGliL2V2ZW50X2VtaXR0ZXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuL29vcCIpOwp2YXIgZXZlbnQgPSByZXF1aXJlKCIuL2V2ZW50Iik7CnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCIuL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXI7CgovKioKICogVGhpcyBjbGFzcyBrZWVwcyB0cmFjayBvZiB0aGUgZm9jdXMgc3RhdGUgb2YgdGhlIGdpdmVuIHdpbmRvdy4KICogRm9jdXMgY2hhbmdlcyBmb3IgZXhhbXBsZSB3aGVuIHRoZSB1c2VyIHN3aXRjaGVzIGEgYnJvd3NlciB0YWIsCiAqIGdvZXMgdG8gdGhlIGxvY2F0aW9uIGJhciBvciBzd2l0Y2hlcyB0byBhbm90aGVyIGFwcGxpY2F0aW9uLgogKi8gCnZhciBCcm93c2VyRm9jdXMgPSBmdW5jdGlvbih3aW4pIHsKICAgIHdpbiA9IHdpbiB8fCB3aW5kb3c7CiAgICAKICAgIHRoaXMubGFzdEZvY3VzID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICB0aGlzLl9pc0ZvY3VzZWQgPSB0cnVlOwogICAgCiAgICB2YXIgX3NlbGYgPSB0aGlzOwoKICAgIC8vIElFIDwgOSBzdXBwb3J0cyBmb2N1c2luIGFuZCBmb2N1c291dCBldmVudHMKICAgIGlmICgib25mb2N1c2luIiBpbiB3aW4uZG9jdW1lbnQpIHsKICAgICAgICBldmVudC5hZGRMaXN0ZW5lcih3aW4uZG9jdW1lbnQsICJmb2N1c2luIiwgZnVuY3Rpb24oZSkgewogICAgICAgICAgICBfc2VsZi5fc2V0Rm9jdXNlZCh0cnVlKTsKICAgICAgICB9KTsKCiAgICAgICAgZXZlbnQuYWRkTGlzdGVuZXIod2luLmRvY3VtZW50LCAiZm9jdXNvdXQiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIF9zZWxmLl9zZXRGb2N1c2VkKCEhZS50b0VsZW1lbnQpOwogICAgICAgIH0pOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgZXZlbnQuYWRkTGlzdGVuZXIod2luLCAiYmx1ciIsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgX3NlbGYuX3NldEZvY3VzZWQoZmFsc2UpOwogICAgICAgIH0pOwoKICAgICAgICBldmVudC5hZGRMaXN0ZW5lcih3aW4sICJmb2N1cyIsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgX3NlbGYuX3NldEZvY3VzZWQodHJ1ZSk7CiAgICAgICAgfSk7CiAgICB9Cn07CgooZnVuY3Rpb24oKXsKCiAgICBvb3AuaW1wbGVtZW50KHRoaXMsIEV2ZW50RW1pdHRlcik7CiAgICAKICAgIHRoaXMuaXNGb2N1c2VkID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRm9jdXNlZDsKICAgIH07CiAgICAKICAgIHRoaXMuX3NldEZvY3VzZWQgPSBmdW5jdGlvbihpc0ZvY3VzZWQpIHsKICAgICAgICBpZiAodGhpcy5faXNGb2N1c2VkID09IGlzRm9jdXNlZCkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAKICAgICAgICBpZiAoaXNGb2N1c2VkKQogICAgICAgICAgICB0aGlzLmxhc3RGb2N1cyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgICAgICAgICAKICAgICAgICB0aGlzLl9pc0ZvY3VzZWQgPSBpc0ZvY3VzZWQ7CiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlRm9jdXMiKTsKICAgIH07Cgp9KS5jYWxsKEJyb3dzZXJGb2N1cy5wcm90b3R5cGUpOwoKCmV4cG9ydHMuQnJvd3NlckZvY3VzID0gQnJvd3NlckZvY3VzOwp9KTsKLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoKICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKiAgICAgIElyYWtsaSBHb3phbGlzaHZpbGkgPHJmb2JpY0BnbWFpbC5jb20+IChodHRwOi8vamVkaXRvb2xraXQuY29tKQogKiAgICAgIE1pa2UgZGUgQm9lciA8bWlrZSBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9saWIvZXZlbnRfZW1pdHRlcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBFdmVudEVtaXR0ZXIgPSB7fTsKCkV2ZW50RW1pdHRlci5fZW1pdCA9CkV2ZW50RW1pdHRlci5fZGlzcGF0Y2hFdmVudCA9IGZ1bmN0aW9uKGV2ZW50TmFtZSwgZSkgewogICAgdGhpcy5fZXZlbnRSZWdpc3RyeSA9IHRoaXMuX2V2ZW50UmVnaXN0cnkgfHwge307CiAgICB0aGlzLl9kZWZhdWx0SGFuZGxlcnMgPSB0aGlzLl9kZWZhdWx0SGFuZGxlcnMgfHwge307CgogICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50UmVnaXN0cnlbZXZlbnROYW1lXSB8fCBbXTsKICAgIHZhciBkZWZhdWx0SGFuZGxlciA9IHRoaXMuX2RlZmF1bHRIYW5kbGVyc1tldmVudE5hbWVdOwogICAgaWYgKCFsaXN0ZW5lcnMubGVuZ3RoICYmICFkZWZhdWx0SGFuZGxlcikKICAgICAgICByZXR1cm47CgogICAgZSA9IGUgfHwge307CiAgICBlLnR5cGUgPSBldmVudE5hbWU7CiAgICAKICAgIGlmICghZS5zdG9wUHJvcGFnYXRpb24pIHsKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB0aGlzLnByb3BhZ2F0aW9uU3RvcHBlZCA9IHRydWU7CiAgICAgICAgfTsKICAgIH0KICAgIAogICAgaWYgKCFlLnByZXZlbnREZWZhdWx0KSB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB0aGlzLmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlOwogICAgICAgIH07CiAgICB9CgogICAgZm9yICh2YXIgaT0wOyBpPGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewogICAgICAgIGxpc3RlbmVyc1tpXShlKTsKICAgICAgICBpZiAoZS5wcm9wYWdhdGlvblN0b3BwZWQpCiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgCiAgICBpZiAoZGVmYXVsdEhhbmRsZXIgJiYgIWUuZGVmYXVsdFByZXZlbnRlZCkKICAgICAgICBkZWZhdWx0SGFuZGxlcihlKTsKfTsKCkV2ZW50RW1pdHRlci5zZXREZWZhdWx0SGFuZGxlciA9IGZ1bmN0aW9uKGV2ZW50TmFtZSwgY2FsbGJhY2spIHsKICAgIHRoaXMuX2RlZmF1bHRIYW5kbGVycyA9IHRoaXMuX2RlZmF1bHRIYW5kbGVycyB8fCB7fTsKICAgIAogICAgaWYgKHRoaXMuX2RlZmF1bHRIYW5kbGVyc1tldmVudE5hbWVdKQogICAgICAgIHRocm93IG5ldyBFcnJvcigiVGhlIGRlZmF1bHQgaGFuZGxlciBmb3IgJyIgKyBldmVudE5hbWUgKyAiJyBpcyBhbHJlYWR5IHNldCIpOwogICAgICAgIAogICAgdGhpcy5fZGVmYXVsdEhhbmRsZXJzW2V2ZW50TmFtZV0gPSBjYWxsYmFjazsKfTsKCkV2ZW50RW1pdHRlci5vbiA9CkV2ZW50RW1pdHRlci5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZlbnROYW1lLCBjYWxsYmFjaykgewogICAgdGhpcy5fZXZlbnRSZWdpc3RyeSA9IHRoaXMuX2V2ZW50UmVnaXN0cnkgfHwge307CgogICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50UmVnaXN0cnlbZXZlbnROYW1lXTsKICAgIGlmICghbGlzdGVuZXJzKQogICAgICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudFJlZ2lzdHJ5W2V2ZW50TmFtZV0gPSBbXTsKCiAgICBpZiAobGlzdGVuZXJzLmluZGV4T2YoY2FsbGJhY2spID09IC0xKQogICAgICAgIGxpc3RlbmVycy5wdXNoKGNhbGxiYWNrKTsKfTsKCkV2ZW50RW1pdHRlci5yZW1vdmVMaXN0ZW5lciA9CkV2ZW50RW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZlbnROYW1lLCBjYWxsYmFjaykgewogICAgdGhpcy5fZXZlbnRSZWdpc3RyeSA9IHRoaXMuX2V2ZW50UmVnaXN0cnkgfHwge307CgogICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50UmVnaXN0cnlbZXZlbnROYW1lXTsKICAgIGlmICghbGlzdGVuZXJzKQogICAgICAgIHJldHVybjsKCiAgICB2YXIgaW5kZXggPSBsaXN0ZW5lcnMuaW5kZXhPZihjYWxsYmFjayk7CiAgICBpZiAoaW5kZXggIT09IC0xKQogICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpOwp9OwoKRXZlbnRFbWl0dGVyLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uKGV2ZW50TmFtZSkgewogICAgaWYgKHRoaXMuX2V2ZW50UmVnaXN0cnkpIHRoaXMuX2V2ZW50UmVnaXN0cnlbZXZlbnROYW1lXSA9IFtdOwp9OwoKZXhwb3J0cy5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7Cgp9KTsvKiB2aW06dHM9NDpzdHM9NDpzdz00OgogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb3VzZS9kZWZhdWx0X2d1dHRlcl9oYW5kbGVyJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKZnVuY3Rpb24gR3V0dGVySGFuZGxlcihlZGl0b3IpIHsKICAgIGVkaXRvci5zZXREZWZhdWx0SGFuZGxlcigiZ3V0dGVyY2xpY2siLCBmdW5jdGlvbihlKSB7CiAgICAgICAgdmFyIHJvdyA9IGUuZ2V0RG9jdW1lbnRQb3NpdGlvbigpLnJvdzsKICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLnNlc3Npb24uc2VsZWN0aW9uOwogICAgICAgIAogICAgICAgIHNlbGVjdGlvbi5tb3ZlQ3Vyc29yVG8ocm93LCAwKTsKICAgICAgICBzZWxlY3Rpb24uc2VsZWN0TGluZSgpOwogICAgfSk7Cn0KCmV4cG9ydHMuR3V0dGVySGFuZGxlciA9IEd1dHRlckhhbmRsZXI7Cgp9KTsvKiB2aW06dHM9NDpzdHM9NDpzdz00OgogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb3VzZS9tb3VzZV9ldmVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9ldmVudCddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIGV2ZW50ID0gcmVxdWlyZSgiLi4vbGliL2V2ZW50Iik7CgovKioKICogQ3VzdG9tIEFjZSBtb3VzZSBldmVudAogKi8KdmFyIE1vdXNlRXZlbnQgPSBleHBvcnRzLk1vdXNlRXZlbnQgPSBmdW5jdGlvbihkb21FdmVudCwgZWRpdG9yKSB7CiAgICB0aGlzLmRvbUV2ZW50ID0gZG9tRXZlbnQ7CiAgICB0aGlzLmVkaXRvciA9IGVkaXRvcjsKICAgIAogICAgdGhpcy5wYWdlWCA9IGV2ZW50LmdldERvY3VtZW50WChkb21FdmVudCk7CiAgICB0aGlzLnBhZ2VZID0gZXZlbnQuZ2V0RG9jdW1lbnRZKGRvbUV2ZW50KTsKICAgIAogICAgdGhpcy5jbGllbnRYID0gZG9tRXZlbnQuY2xpZW50WDsKICAgIHRoaXMuY2xpZW50WSA9IGRvbUV2ZW50LmNsaWVudFk7CgogICAgdGhpcy4kcG9zID0gbnVsbDsKICAgIHRoaXMuJGluU2VsZWN0aW9uID0gbnVsbDsKICAgIAogICAgdGhpcy5wcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZTsKICAgIHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9IGZhbHNlOwp9OwoKKGZ1bmN0aW9uKCkgeyAgCiAgICAKICAgIHRoaXMuc3RvcFByb3BhZ2F0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKHRoaXMuZG9tRXZlbnQpOwogICAgICAgIHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZTsKICAgIH07CiAgICAKICAgIHRoaXMucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbigpIHsKICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCh0aGlzLmRvbUV2ZW50KTsKICAgICAgICB0aGlzLmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlOwogICAgfTsKICAgIAogICAgdGhpcy5zdG9wID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICB0aGlzLnByZXZlbnREZWZhdWx0KCk7CiAgICB9OwoKICAgIC8qKgogICAgICogR2V0IHRoZSBkb2N1bWVudCBwb3NpdGlvbiBiZWxvdyB0aGUgbW91c2UgY3Vyc29yCiAgICAgKiAKICAgICAqIEByZXR1cm4ge09iamVjdH0gJ3JvdycgYW5kICdjb2x1bW4nIG9mIHRoZSBkb2N1bWVudCBwb3NpdGlvbgogICAgICovCiAgICB0aGlzLmdldERvY3VtZW50UG9zaXRpb24gPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy4kcG9zKQogICAgICAgICAgICByZXR1cm4gdGhpcy4kcG9zOwogICAgICAgICAgICAKICAgICAgICB2YXIgcGFnZVggPSBldmVudC5nZXREb2N1bWVudFgodGhpcy5kb21FdmVudCk7CiAgICAgICAgdmFyIHBhZ2VZID0gZXZlbnQuZ2V0RG9jdW1lbnRZKHRoaXMuZG9tRXZlbnQpOwogICAgICAgIHRoaXMuJHBvcyA9IHRoaXMuZWRpdG9yLnJlbmRlcmVyLnNjcmVlblRvVGV4dENvb3JkaW5hdGVzKHBhZ2VYLCBwYWdlWSk7CiAgICAgICAgdGhpcy4kcG9zLnJvdyA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMuJHBvcy5yb3csIHRoaXMuZWRpdG9yLnNlc3Npb24uZ2V0TGVuZ3RoKCktMSkpOwogICAgICAgIHJldHVybiB0aGlzLiRwb3M7CiAgICB9OwogICAgCiAgICAvKioKICAgICAqIENoZWNrIGlmIHRoZSBtb3VzZSBjdXJzb3IgaXMgaW5zaWRlIG9mIHRoZSB0ZXh0IHNlbGVjdGlvbgogICAgICogCiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSB3aGV0aGVyIHRoZSBtb3VzZSBjdXJzb3IgaXMgaW5zaWRlIG9mIHRoZSBzZWxlY3Rpb24KICAgICAqLwogICAgdGhpcy5pblNlbGVjdGlvbiA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLiRpblNlbGVjdGlvbiAhPT0gbnVsbCkKICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGluU2VsZWN0aW9uOwogICAgICAgICAgICAKICAgICAgICB2YXIgZWRpdG9yID0gdGhpcy5lZGl0b3I7CiAgICAgICAgCiAgICAgICAgaWYgKGVkaXRvci5nZXRSZWFkT25seSgpKSB7CiAgICAgICAgICAgIHRoaXMuJGluU2VsZWN0aW9uID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB2YXIgc2VsZWN0aW9uUmFuZ2UgPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKICAgICAgICAgICAgaWYgKHNlbGVjdGlvblJhbmdlLmlzRW1wdHkoKSkKICAgICAgICAgICAgICAgIHRoaXMuJGluU2VsZWN0aW9uID0gZmFsc2U7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdmFyIHBvcyA9IHRoaXMuZ2V0RG9jdW1lbnRQb3NpdGlvbigpOwogICAgICAgICAgICAgICAgdGhpcy4kaW5TZWxlY3Rpb24gPSBzZWxlY3Rpb25SYW5nZS5jb250YWlucyhwb3Mucm93LCBwb3MuY29sdW1uKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy4kaW5TZWxlY3Rpb247CiAgICB9OwogICAgCiAgICAvKioKICAgICAqIEdldCB0aGUgY2xpY2tlZCBtb3VzZSBidXR0b24KICAgICAqIAogICAgICogQHJldHVybiB7TnVtYmVyfSAwIGZvciBsZWZ0IGJ1dHRvbiwgMSBmb3IgbWlkZGxlIGJ1dHRvbiwgMiBmb3IgcmlnaHQgYnV0dG9uCiAgICAgKi8KICAgIHRoaXMuZ2V0QnV0dG9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGV2ZW50LmdldEJ1dHRvbih0aGlzLmRvbUV2ZW50KTsKICAgIH07CiAgICAKICAgIC8qKgogICAgICogQHJldHVybiB7Qm9vbGVhbn0gd2hldGhlciB0aGUgc2hpZnQga2V5IHdhcyBwcmVzc2VkIHdoZW4gdGhlIGV2ZW50IHdhcyBlbWl0dGVkCiAgICAgKi8KICAgIHRoaXMuZ2V0U2hpZnRLZXkgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5kb21FdmVudC5zaGlmdEtleTsKICAgIH07CiAgICAKICAgIHRoaXMuZ2V0QWNjZWxLZXkgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5kb21FdmVudC5jdHJsS2V5IHx8IHRoaXMuZG9tRXZlbnQubWV0YUtleSA7CiAgICB9OwogICAgCn0pLmNhbGwoTW91c2VFdmVudC5wcm90b3R5cGUpOwoKfSk7Ci8qIHZpbTp0cz00OnN0cz00OnN3PTQ6CiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vdXNlL2ZvbGRfaGFuZGxlcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCmZ1bmN0aW9uIEZvbGRIYW5kbGVyKGVkaXRvcikgewogICAgCiAgICBlZGl0b3Iub24oImNsaWNrIiwgZnVuY3Rpb24oZSkgewogICAgICAgIHZhciBwb3NpdGlvbiA9IGUuZ2V0RG9jdW1lbnRQb3NpdGlvbigpOwogICAgICAgIHZhciBzZXNzaW9uID0gZWRpdG9yLnNlc3Npb247CiAgICAgICAgCiAgICAgICAgLy8gSWYgdGhlIHVzZXIgZGNsaWNrZWQgb24gYSBmb2xkLCB0aGVuIGV4cGFuZCBpdC4KICAgICAgICB2YXIgZm9sZCA9IHNlc3Npb24uZ2V0Rm9sZEF0KHBvc2l0aW9uLnJvdywgcG9zaXRpb24uY29sdW1uLCAxKTsKICAgICAgICBpZiAoZm9sZCkgewogICAgICAgICAgICBpZiAoZS5nZXRBY2NlbEtleSgpKQogICAgICAgICAgICAgICAgc2Vzc2lvbi5yZW1vdmVGb2xkKGZvbGQpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBzZXNzaW9uLmV4cGFuZEZvbGQoZm9sZCk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgZS5zdG9wKCk7CiAgICAgICAgfQogICAgfSk7CiAgICAKICAgIGVkaXRvci5vbigiZ3V0dGVyY2xpY2siLCBmdW5jdGlvbihlKSB7CiAgICAgICAgaWYgKGUuZG9tRXZlbnQudGFyZ2V0LmNsYXNzTmFtZS5pbmRleE9mKCJhY2VfZm9sZC13aWRnZXQiKSAhPSAtMSkgewogICAgICAgICAgICB2YXIgcm93ID0gZS5nZXREb2N1bWVudFBvc2l0aW9uKCkucm93OwogICAgICAgICAgICBlZGl0b3Iuc2Vzc2lvbi5vbkZvbGRXaWRnZXRDbGljayhyb3csIGUuZG9tRXZlbnQpOwogICAgICAgICAgICBlLnN0b3AoKTsKICAgICAgICB9CiAgICB9KTsKfQoKZXhwb3J0cy5Gb2xkSGFuZGxlciA9IEZvbGRIYW5kbGVyOwoKfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKiAgICAgIEp1bGlhbiBWaWVyZWNrIDxqdWxpYW4udmllcmVja0BnbWFpbC5jb20+CiAqICAgICAgSGFydXR5dW4gQW1pcmphbnlhbiA8YW1pcmphbnlhbkBnbWFpbC5jb20+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9rZXlib2FyZC9rZXliaW5kaW5nJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2tleXMnLCAnYWNlL2xpYi9ldmVudCcsICdhY2UvY29tbWFuZHMvZGVmYXVsdF9jb21tYW5kcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIGtleVV0aWwgID0gcmVxdWlyZSgiLi4vbGliL2tleXMiKTsKdmFyIGV2ZW50ID0gcmVxdWlyZSgiLi4vbGliL2V2ZW50Iik7CnJlcXVpcmUoIi4uL2NvbW1hbmRzL2RlZmF1bHRfY29tbWFuZHMiKTsKCnZhciBLZXlCaW5kaW5nID0gZnVuY3Rpb24oZWRpdG9yKSB7CiAgICB0aGlzLiRlZGl0b3IgPSBlZGl0b3I7CiAgICB0aGlzLiRkYXRhID0geyB9OwogICAgdGhpcy4kaGFuZGxlcnMgPSBbdGhpc107Cn07CgooZnVuY3Rpb24oKSB7CiAgICB0aGlzLnNldEtleWJvYXJkSGFuZGxlciA9IGZ1bmN0aW9uKGtleWJvYXJkSGFuZGxlcikgewogICAgICAgIGlmICh0aGlzLiRoYW5kbGVyc1t0aGlzLiRoYW5kbGVycy5sZW5ndGggLSAxXSA9PSBrZXlib2FyZEhhbmRsZXIpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB0aGlzLiRkYXRhID0geyB9OwogICAgICAgIHRoaXMuJGhhbmRsZXJzID0ga2V5Ym9hcmRIYW5kbGVyID8gW3RoaXMsIGtleWJvYXJkSGFuZGxlcl0gOiBbdGhpc107CiAgICB9OwoKICAgIHRoaXMuYWRkS2V5Ym9hcmRIYW5kbGVyID0gZnVuY3Rpb24oa2V5Ym9hcmRIYW5kbGVyKSB7CiAgICAgICAgdGhpcy5yZW1vdmVLZXlib2FyZEhhbmRsZXIoa2V5Ym9hcmRIYW5kbGVyKTsKICAgICAgICB0aGlzLiRoYW5kbGVycy5wdXNoKGtleWJvYXJkSGFuZGxlcik7CiAgICB9OwoKICAgIHRoaXMucmVtb3ZlS2V5Ym9hcmRIYW5kbGVyID0gZnVuY3Rpb24oa2V5Ym9hcmRIYW5kbGVyKSB7CiAgICAgICAgdmFyIGkgPSB0aGlzLiRoYW5kbGVycy5pbmRleE9mKGtleWJvYXJkSGFuZGxlcik7CiAgICAgICAgaWYgKGkgPT0gLTEpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB0aGlzLiRoYW5kbGVycy5zcGxpY2UoaSwgMSk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9OwoKICAgIHRoaXMuZ2V0S2V5Ym9hcmRIYW5kbGVyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJGhhbmRsZXJzW3RoaXMuJGhhbmRsZXJzLmxlbmd0aCAtIDFdOwogICAgfTsKCiAgICB0aGlzLiRjYWxsS2V5Ym9hcmRIYW5kbGVycyA9IGZ1bmN0aW9uIChoYXNoSWQsIGtleVN0cmluZywga2V5Q29kZSwgZSkgewogICAgICAgIHZhciB0b0V4ZWN1dGU7CiAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMuJGhhbmRsZXJzLmxlbmd0aDsgaS0tOykgewogICAgICAgICAgICB0b0V4ZWN1dGUgPSB0aGlzLiRoYW5kbGVyc1tpXS5oYW5kbGVLZXlib2FyZCgKICAgICAgICAgICAgICAgIHRoaXMuJGRhdGEsIGhhc2hJZCwga2V5U3RyaW5nLCBrZXlDb2RlLCBlCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICh0b0V4ZWN1dGUgJiYgdG9FeGVjdXRlLmNvbW1hbmQpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGlmICghdG9FeGVjdXRlIHx8ICF0b0V4ZWN1dGUuY29tbWFuZCkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgICB2YXIgc3VjY2VzcyA9IGZhbHNlOwogICAgICAgIHZhciBjb21tYW5kcyA9IHRoaXMuJGVkaXRvci5jb21tYW5kczsKCiAgICAgICAgLy8gYWxsb3cga2V5Ym9hcmRIYW5kbGVyIHRvIGNvbnN1bWUga2V5cwogICAgICAgIGlmICh0b0V4ZWN1dGUuY29tbWFuZCAhPSAibnVsbCIpCiAgICAgICAgICAgIHN1Y2Nlc3MgPSBjb21tYW5kcy5leGVjKHRvRXhlY3V0ZS5jb21tYW5kLCB0aGlzLiRlZGl0b3IsIHRvRXhlY3V0ZS5hcmdzKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOwoKICAgICAgICBpZiAoc3VjY2VzcyAmJiBlKQogICAgICAgICAgICBldmVudC5zdG9wRXZlbnQoZSk7CgogICAgICAgIHJldHVybiBzdWNjZXNzOwogICAgfTsKCiAgICB0aGlzLmhhbmRsZUtleWJvYXJkID0gZnVuY3Rpb24oZGF0YSwgaGFzaElkLCBrZXlTdHJpbmcpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBjb21tYW5kOiB0aGlzLiRlZGl0b3IuY29tbWFuZHMuZmluZEtleUNvbW1hbmQoaGFzaElkLCBrZXlTdHJpbmcpCiAgICAgICAgfTsKICAgIH07CgogICAgdGhpcy5vbkNvbW1hbmRLZXkgPSBmdW5jdGlvbihlLCBoYXNoSWQsIGtleUNvZGUpIHsKICAgICAgICB2YXIga2V5U3RyaW5nID0ga2V5VXRpbC5rZXlDb2RlVG9TdHJpbmcoa2V5Q29kZSk7CiAgICAgICAgdGhpcy4kY2FsbEtleWJvYXJkSGFuZGxlcnMoaGFzaElkLCBrZXlTdHJpbmcsIGtleUNvZGUsIGUpOwogICAgfTsKCiAgICB0aGlzLm9uVGV4dElucHV0ID0gZnVuY3Rpb24odGV4dCwgcGFzdGVkKSB7CiAgICAgICAgdmFyIHN1Y2Nlc3MgPSBmYWxzZTsKICAgICAgICBpZiAoIXBhc3RlZCAmJiB0ZXh0Lmxlbmd0aCA9PSAxKQogICAgICAgICAgICBzdWNjZXNzID0gdGhpcy4kY2FsbEtleWJvYXJkSGFuZGxlcnMoMCwgdGV4dCk7CiAgICAgICAgaWYgKCFzdWNjZXNzKQogICAgICAgICAgICB0aGlzLiRlZGl0b3IuY29tbWFuZHMuZXhlYygiaW5zZXJ0c3RyaW5nIiwgdGhpcy4kZWRpdG9yLCB0ZXh0KTsKICAgIH07Cgp9KS5jYWxsKEtleUJpbmRpbmcucHJvdG90eXBlKTsKCmV4cG9ydHMuS2V5QmluZGluZyA9IEtleUJpbmRpbmc7Cn0pOwovKiB2aW06dHM9NDpzdHM9NDpzdz00OgogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqICAgICAgSnVsaWFuIFZpZXJlY2sgPGp1bGlhbi52aWVyZWNrQGdtYWlsLmNvbT4KICogICAgICBNaWhhaSBTdWNhbiA8bWloYWkuc3VjYW5AZ21haWwuY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvY29tbWFuZHMvZGVmYXVsdF9jb21tYW5kcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9sYW5nJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7CgpmdW5jdGlvbiBiaW5kS2V5KHdpbiwgbWFjKSB7CiAgICByZXR1cm4gewogICAgICAgIHdpbjogd2luLAogICAgICAgIG1hYzogbWFjCiAgICB9Owp9CgpleHBvcnRzLmNvbW1hbmRzID0gW3sKICAgIG5hbWU6ICJzZWxlY3RhbGwiLAogICAgYmluZEtleTogYmluZEtleSgiQ3RybC1BIiwgIkNvbW1hbmQtQSIpLAogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5zZWxlY3RBbGwoKTsgfSwKICAgIHJlYWRPbmx5OiB0cnVlCn0sIHsKICAgIG5hbWU6ICJjZW50ZXJzZWxlY3Rpb24iLAogICAgYmluZEtleTogYmluZEtleShudWxsLCAiQ3RybC1MIiksCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLmNlbnRlclNlbGVjdGlvbigpOyB9LAogICAgcmVhZE9ubHk6IHRydWUKfSwgewogICAgbmFtZTogImdvdG9saW5lIiwKICAgIGJpbmRLZXk6IGJpbmRLZXkoIkN0cmwtTCIsICJDb21tYW5kLUwiKSwKICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgewogICAgICAgIHZhciBsaW5lID0gcGFyc2VJbnQocHJvbXB0KCJFbnRlciBsaW5lIG51bWJlcjoiKSwgMTApOwogICAgICAgIGlmICghaXNOYU4obGluZSkpIHsKICAgICAgICAgICAgZWRpdG9yLmdvdG9MaW5lKGxpbmUpOwogICAgICAgIH0KICAgIH0sCiAgICByZWFkT25seTogdHJ1ZQp9LCB7CiAgICBuYW1lOiAiZm9sZCIsCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJBbHQtTCIsICJBbHQtTCIpLAogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5zZXNzaW9uLnRvZ2dsZUZvbGQoZmFsc2UpOyB9LAogICAgcmVhZE9ubHk6IHRydWUKfSwgewogICAgbmFtZTogInVuZm9sZCIsCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJBbHQtU2hpZnQtTCIsICJBbHQtU2hpZnQtTCIpLAogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5zZXNzaW9uLnRvZ2dsZUZvbGQodHJ1ZSk7IH0sCiAgICByZWFkT25seTogdHJ1ZQp9LCB7CiAgICBuYW1lOiAiZm9sZGFsbCIsCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJBbHQtMCIsICJBbHQtMCIpLAogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5zZXNzaW9uLmZvbGRBbGwoKTsgfSwKICAgIHJlYWRPbmx5OiB0cnVlCn0sIHsKICAgIG5hbWU6ICJ1bmZvbGRhbGwiLAogICAgYmluZEtleTogYmluZEtleSgiQWx0LVNoaWZ0LTAiLCAiQWx0LVNoaWZ0LTAiKSwKICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3Iuc2Vzc2lvbi51bmZvbGQoKTsgfSwKICAgIHJlYWRPbmx5OiB0cnVlCn0sIHsKICAgIG5hbWU6ICJmaW5kbmV4dCIsCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLUsiLCAiQ29tbWFuZC1HIiksCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLmZpbmROZXh0KCk7IH0sCiAgICByZWFkT25seTogdHJ1ZQp9LCB7CiAgICBuYW1lOiAiZmluZHByZXZpb3VzIiwKICAgIGJpbmRLZXk6IGJpbmRLZXkoIkN0cmwtU2hpZnQtSyIsICJDb21tYW5kLVNoaWZ0LUciKSwKICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IuZmluZFByZXZpb3VzKCk7IH0sCiAgICByZWFkT25seTogdHJ1ZQp9LCB7CiAgICBuYW1lOiAiZmluZCIsCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLUYiLCAiQ29tbWFuZC1GIiksCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsKICAgICAgICB2YXIgbmVlZGxlID0gcHJvbXB0KCJGaW5kOiIsIGVkaXRvci5nZXRDb3B5VGV4dCgpKTsKICAgICAgICBlZGl0b3IuZmluZChuZWVkbGUpOwogICAgfSwKICAgIHJlYWRPbmx5OiB0cnVlCn0sIHsKICAgIG5hbWU6ICJvdmVyd3JpdGUiLAogICAgYmluZEtleTogYmluZEtleSgiSW5zZXJ0IiwgIkluc2VydCIpLAogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci50b2dnbGVPdmVyd3JpdGUoKTsgfSwKICAgIHJlYWRPbmx5OiB0cnVlCn0sIHsKICAgIG5hbWU6ICJzZWxlY3R0b3N0YXJ0IiwKICAgIGJpbmRLZXk6IGJpbmRLZXkoIkN0cmwtU2hpZnQtSG9tZXxBbHQtU2hpZnQtVXAiLCAiQ29tbWFuZC1TaGlmdC1VcCIpLAogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5nZXRTZWxlY3Rpb24oKS5zZWxlY3RGaWxlU3RhcnQoKTsgfSwKICAgIHJlYWRPbmx5OiB0cnVlCn0sIHsKICAgIG5hbWU6ICJnb3Rvc3RhcnQiLAogICAgYmluZEtleTogYmluZEtleSgiQ3RybC1Ib21lfEN0cmwtVXAiLCAiQ29tbWFuZC1Ib21lfENvbW1hbmQtVXAiKSwKICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IubmF2aWdhdGVGaWxlU3RhcnQoKTsgfSwKICAgIHJlYWRPbmx5OiB0cnVlCn0sIHsKICAgIG5hbWU6ICJzZWxlY3R1cCIsCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJTaGlmdC1VcCIsICJTaGlmdC1VcCIpLAogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5nZXRTZWxlY3Rpb24oKS5zZWxlY3RVcCgpOyB9LAogICAgcmVhZE9ubHk6IHRydWUKfSwgewogICAgbmFtZTogImdvbGluZXVwIiwKICAgIGJpbmRLZXk6IGJpbmRLZXkoIlVwIiwgIlVwfEN0cmwtUCIpLAogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yLCBhcmdzKSB7IGVkaXRvci5uYXZpZ2F0ZVVwKGFyZ3MudGltZXMpOyB9LAogICAgcmVhZE9ubHk6IHRydWUKfSwgewogICAgbmFtZTogInNlbGVjdHRvZW5kIiwKICAgIGJpbmRLZXk6IGJpbmRLZXkoIkN0cmwtU2hpZnQtRW5kfEFsdC1TaGlmdC1Eb3duIiwgIkNvbW1hbmQtU2hpZnQtRG93biIpLAogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5nZXRTZWxlY3Rpb24oKS5zZWxlY3RGaWxlRW5kKCk7IH0sCiAgICByZWFkT25seTogdHJ1ZQp9LCB7CiAgICBuYW1lOiAiZ290b2VuZCIsCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLUVuZHxDdHJsLURvd24iLCAiQ29tbWFuZC1FbmR8Q29tbWFuZC1Eb3duIiksCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLm5hdmlnYXRlRmlsZUVuZCgpOyB9LAogICAgcmVhZE9ubHk6IHRydWUKfSwgewogICAgbmFtZTogInNlbGVjdGRvd24iLAogICAgYmluZEtleTogYmluZEtleSgiU2hpZnQtRG93biIsICJTaGlmdC1Eb3duIiksCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLmdldFNlbGVjdGlvbigpLnNlbGVjdERvd24oKTsgfSwKICAgIHJlYWRPbmx5OiB0cnVlCn0sIHsKICAgIG5hbWU6ICJnb2xpbmVkb3duIiwKICAgIGJpbmRLZXk6IGJpbmRLZXkoIkRvd24iLCAiRG93bnxDdHJsLU4iKSwKICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvciwgYXJncykgeyBlZGl0b3IubmF2aWdhdGVEb3duKGFyZ3MudGltZXMpOyB9LAogICAgcmVhZE9ubHk6IHRydWUKfSwgewogICAgbmFtZTogInNlbGVjdHdvcmRsZWZ0IiwKICAgIGJpbmRLZXk6IGJpbmRLZXkoIkN0cmwtU2hpZnQtTGVmdCIsICJPcHRpb24tU2hpZnQtTGVmdCIpLAogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5nZXRTZWxlY3Rpb24oKS5zZWxlY3RXb3JkTGVmdCgpOyB9LAogICAgcmVhZE9ubHk6IHRydWUKfSwgewogICAgbmFtZTogImdvdG93b3JkbGVmdCIsCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLUxlZnQiLCAiT3B0aW9uLUxlZnQiKSwKICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IubmF2aWdhdGVXb3JkTGVmdCgpOyB9LAogICAgcmVhZE9ubHk6IHRydWUKfSwgewogICAgbmFtZTogInNlbGVjdHRvbGluZXN0YXJ0IiwKICAgIGJpbmRLZXk6IGJpbmRLZXkoIkFsdC1TaGlmdC1MZWZ0IiwgIkNvbW1hbmQtU2hpZnQtTGVmdCIpLAogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5nZXRTZWxlY3Rpb24oKS5zZWxlY3RMaW5lU3RhcnQoKTsgfSwKICAgIHJlYWRPbmx5OiB0cnVlCn0sIHsKICAgIG5hbWU6ICJnb3RvbGluZXN0YXJ0IiwKICAgIGJpbmRLZXk6IGJpbmRLZXkoIkFsdC1MZWZ0fEhvbWUiLCAiQ29tbWFuZC1MZWZ0fEhvbWV8Q3RybC1BIiksCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLm5hdmlnYXRlTGluZVN0YXJ0KCk7IH0sCiAgICByZWFkT25seTogdHJ1ZQp9LCB7CiAgICBuYW1lOiAic2VsZWN0bGVmdCIsCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJTaGlmdC1MZWZ0IiwgIlNoaWZ0LUxlZnQiKSwKICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0TGVmdCgpOyB9LAogICAgcmVhZE9ubHk6IHRydWUKfSwgewogICAgbmFtZTogImdvdG9sZWZ0IiwKICAgIGJpbmRLZXk6IGJpbmRLZXkoIkxlZnQiLCAiTGVmdHxDdHJsLUIiKSwKICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvciwgYXJncykgeyBlZGl0b3IubmF2aWdhdGVMZWZ0KGFyZ3MudGltZXMpOyB9LAogICAgcmVhZE9ubHk6IHRydWUKfSwgewogICAgbmFtZTogInNlbGVjdHdvcmRyaWdodCIsCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLVNoaWZ0LVJpZ2h0IiwgIk9wdGlvbi1TaGlmdC1SaWdodCIpLAogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5nZXRTZWxlY3Rpb24oKS5zZWxlY3RXb3JkUmlnaHQoKTsgfSwKICAgIHJlYWRPbmx5OiB0cnVlCn0sIHsKICAgIG5hbWU6ICJnb3Rvd29yZHJpZ2h0IiwKICAgIGJpbmRLZXk6IGJpbmRLZXkoIkN0cmwtUmlnaHQiLCAiT3B0aW9uLVJpZ2h0IiksCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLm5hdmlnYXRlV29yZFJpZ2h0KCk7IH0sCiAgICByZWFkT25seTogdHJ1ZQp9LCB7CiAgICBuYW1lOiAic2VsZWN0dG9saW5lZW5kIiwKICAgIGJpbmRLZXk6IGJpbmRLZXkoIkFsdC1TaGlmdC1SaWdodCIsICJDb21tYW5kLVNoaWZ0LVJpZ2h0IiksCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLmdldFNlbGVjdGlvbigpLnNlbGVjdExpbmVFbmQoKTsgfSwKICAgIHJlYWRPbmx5OiB0cnVlCn0sIHsKICAgIG5hbWU6ICJnb3RvbGluZWVuZCIsCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJBbHQtUmlnaHR8RW5kIiwgIkNvbW1hbmQtUmlnaHR8RW5kfEN0cmwtRSIpLAogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5uYXZpZ2F0ZUxpbmVFbmQoKTsgfSwKICAgIHJlYWRPbmx5OiB0cnVlCn0sIHsKICAgIG5hbWU6ICJzZWxlY3RyaWdodCIsCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJTaGlmdC1SaWdodCIsICJTaGlmdC1SaWdodCIpLAogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5nZXRTZWxlY3Rpb24oKS5zZWxlY3RSaWdodCgpOyB9LAogICAgcmVhZE9ubHk6IHRydWUKfSwgewogICAgbmFtZTogImdvdG9yaWdodCIsCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJSaWdodCIsICJSaWdodHxDdHJsLUYiKSwKICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvciwgYXJncykgeyBlZGl0b3IubmF2aWdhdGVSaWdodChhcmdzLnRpbWVzKTsgfSwKICAgIHJlYWRPbmx5OiB0cnVlCn0sIHsKICAgIG5hbWU6ICJzZWxlY3RwYWdlZG93biIsCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJTaGlmdC1QYWdlRG93biIsICJTaGlmdC1QYWdlRG93biIpLAogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5zZWxlY3RQYWdlRG93bigpOyB9LAogICAgcmVhZE9ubHk6IHRydWUKfSwgewogICAgbmFtZTogInBhZ2Vkb3duIiwKICAgIGJpbmRLZXk6IGJpbmRLZXkobnVsbCwgIlBhZ2VEb3duIiksCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLnNjcm9sbFBhZ2VEb3duKCk7IH0sCiAgICByZWFkT25seTogdHJ1ZQp9LCB7CiAgICBuYW1lOiAiZ290b3BhZ2Vkb3duIiwKICAgIGJpbmRLZXk6IGJpbmRLZXkoIlBhZ2VEb3duIiwgIk9wdGlvbi1QYWdlRG93bnxDdHJsLVYiKSwKICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IuZ290b1BhZ2VEb3duKCk7IH0sCiAgICByZWFkT25seTogdHJ1ZQp9LCB7CiAgICBuYW1lOiAic2VsZWN0cGFnZXVwIiwKICAgIGJpbmRLZXk6IGJpbmRLZXkoIlNoaWZ0LVBhZ2VVcCIsICJTaGlmdC1QYWdlVXAiKSwKICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3Iuc2VsZWN0UGFnZVVwKCk7IH0sCiAgICByZWFkT25seTogdHJ1ZQp9LCB7CiAgICBuYW1lOiAicGFnZXVwIiwKICAgIGJpbmRLZXk6IGJpbmRLZXkobnVsbCwgIlBhZ2VVcCIpLAogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5zY3JvbGxQYWdlVXAoKTsgfSwKICAgIHJlYWRPbmx5OiB0cnVlCn0sIHsKICAgIG5hbWU6ICJnb3RvcGFnZXVwIiwKICAgIGJpbmRLZXk6IGJpbmRLZXkoIlBhZ2VVcCIsICJPcHRpb24tUGFnZVVwIiksCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLmdvdG9QYWdlVXAoKTsgfSwKICAgIHJlYWRPbmx5OiB0cnVlCn0sIHsKICAgIG5hbWU6ICJzZWxlY3RsaW5lc3RhcnQiLAogICAgYmluZEtleTogYmluZEtleSgiU2hpZnQtSG9tZSIsICJTaGlmdC1Ib21lIiksCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLmdldFNlbGVjdGlvbigpLnNlbGVjdExpbmVTdGFydCgpOyB9LAogICAgcmVhZE9ubHk6IHRydWUKfSwgewogICAgbmFtZTogInNlbGVjdGxpbmVlbmQiLAogICAgYmluZEtleTogYmluZEtleSgiU2hpZnQtRW5kIiwgIlNoaWZ0LUVuZCIpLAogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5nZXRTZWxlY3Rpb24oKS5zZWxlY3RMaW5lRW5kKCk7IH0sCiAgICByZWFkT25seTogdHJ1ZQp9LCB7CiAgICBuYW1lOiAidG9nZ2xlcmVjb3JkaW5nIiwKICAgIGJpbmRLZXk6IGJpbmRLZXkoIkN0cmwtQWx0LUUiLCAiQ29tbWFuZC1PcHRpb24tRSIpLAogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5jb21tYW5kcy50b2dnbGVSZWNvcmRpbmcoKTsgfSwKICAgIHJlYWRPbmx5OiB0cnVlCn0sIHsKICAgIG5hbWU6ICJyZXBsYXltYWNybyIsCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLVNoaWZ0LUUiLCAiQ29tbWFuZC1TaGlmdC1FIiksCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLmNvbW1hbmRzLnJlcGxheShlZGl0b3IpOyB9LAogICAgcmVhZE9ubHk6IHRydWUKfSwgewogICAgbmFtZTogImp1bXB0b21hdGNoaW5nIiwKICAgIGJpbmRLZXk6IGJpbmRLZXkoIkN0cmwtU2hpZnQtUCIsICJDdHJsLVNoaWZ0LVAiKSwKICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IuanVtcFRvTWF0Y2hpbmcoKTsgfSwKICAgIHJlYWRPbmx5OiB0cnVlCn0sIAoKLy8gY29tbWFuZHMgZGlzYWJsZWQgaW4gcmVhZE9ubHkgbW9kZQp7CiAgICBuYW1lOiAicmVtb3ZlbGluZSIsCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLUQiLCAiQ29tbWFuZC1EIiksCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLnJlbW92ZUxpbmVzKCk7IH0KfSwgewogICAgbmFtZTogInRvZ2dsZWNvbW1lbnQiLAogICAgYmluZEtleTogYmluZEtleSgiQ3RybC03IiwgIkNvbW1hbmQtNyIpLAogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci50b2dnbGVDb21tZW50TGluZXMoKTsgfQp9LCB7CiAgICBuYW1lOiAicmVwbGFjZSIsCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLVIiLCAiQ29tbWFuZC1PcHRpb24tRiIpLAogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7CiAgICAgICAgdmFyIG5lZWRsZSA9IHByb21wdCgiRmluZDoiLCBlZGl0b3IuZ2V0Q29weVRleHQoKSk7CiAgICAgICAgaWYgKCFuZWVkbGUpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBwcm9tcHQoIlJlcGxhY2VtZW50OiIpOwogICAgICAgIGlmICghcmVwbGFjZW1lbnQpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBlZGl0b3IucmVwbGFjZShyZXBsYWNlbWVudCwge25lZWRsZTogbmVlZGxlfSk7CiAgICB9Cn0sIHsKICAgIG5hbWU6ICJyZXBsYWNlYWxsIiwKICAgIGJpbmRLZXk6IGJpbmRLZXkoIkN0cmwtU2hpZnQtUiIsICJDb21tYW5kLVNoaWZ0LU9wdGlvbi1GIiksCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsKICAgICAgICB2YXIgbmVlZGxlID0gcHJvbXB0KCJGaW5kOiIpOwogICAgICAgIGlmICghbmVlZGxlKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gcHJvbXB0KCJSZXBsYWNlbWVudDoiKTsKICAgICAgICBpZiAoIXJlcGxhY2VtZW50KQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgZWRpdG9yLnJlcGxhY2VBbGwocmVwbGFjZW1lbnQsIHtuZWVkbGU6IG5lZWRsZX0pOwogICAgfQp9LCB7CiAgICBuYW1lOiAidW5kbyIsCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLVoiLCAiQ29tbWFuZC1aIiksCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLnVuZG8oKTsgfQp9LCB7CiAgICBuYW1lOiAicmVkbyIsCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLVNoaWZ0LVp8Q3RybC1ZIiwgIkNvbW1hbmQtU2hpZnQtWnxDb21tYW5kLVkiKSwKICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IucmVkbygpOyB9Cn0sIHsKICAgIG5hbWU6ICJjb3B5bGluZXN1cCIsCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLUFsdC1VcCIsICJDb21tYW5kLU9wdGlvbi1VcCIpLAogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5jb3B5TGluZXNVcCgpOyB9Cn0sIHsKICAgIG5hbWU6ICJtb3ZlbGluZXN1cCIsCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJBbHQtVXAiLCAiT3B0aW9uLVVwIiksCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLm1vdmVMaW5lc1VwKCk7IH0KfSwgewogICAgbmFtZTogImNvcHlsaW5lc2Rvd24iLAogICAgYmluZEtleTogYmluZEtleSgiQ3RybC1BbHQtRG93biIsICJDb21tYW5kLU9wdGlvbi1Eb3duIiksCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLmNvcHlMaW5lc0Rvd24oKTsgfQp9LCB7CiAgICBuYW1lOiAibW92ZWxpbmVzZG93biIsCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJBbHQtRG93biIsICJPcHRpb24tRG93biIpLAogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5tb3ZlTGluZXNEb3duKCk7IH0KfSwgewogICAgbmFtZTogImRlbCIsCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJEZWxldGUiLCAiRGVsZXRlfEN0cmwtRCIpLAogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5yZW1vdmUoInJpZ2h0Iik7IH0KfSwgewogICAgbmFtZTogImJhY2tzcGFjZSIsCiAgICBiaW5kS2V5OiBiaW5kS2V5KAogICAgICAgICJDdHJsLUJhY2tzcGFjZXxDb21tYW5kLUJhY2tzcGFjZXxPcHRpb24tQmFja3NwYWNlfFNoaWZ0LUJhY2tzcGFjZXxCYWNrc3BhY2UiLAogICAgICAgICJDdHJsLUJhY2tzcGFjZXxDb21tYW5kLUJhY2tzcGFjZXxTaGlmdC1CYWNrc3BhY2V8QmFja3NwYWNlfEN0cmwtSCIKICAgICksCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLnJlbW92ZSgibGVmdCIpOyB9Cn0sIHsKICAgIG5hbWU6ICJyZW1vdmV0b2xpbmVzdGFydCIsCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJBbHQtQmFja3NwYWNlIiwgIk9wdGlvbi1CYWNrc3BhY2UiKSwKICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvcikgeyBlZGl0b3IucmVtb3ZlVG9MaW5lU3RhcnQoKTsgfQp9LCB7CiAgICBuYW1lOiAicmVtb3ZldG9saW5lZW5kIiwKICAgIGJpbmRLZXk6IGJpbmRLZXkoIkFsdC1EZWxldGUiLCAiQ3RybC1LIiksCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLnJlbW92ZVRvTGluZUVuZCgpOyB9Cn0sIHsKICAgIG5hbWU6ICJyZW1vdmV3b3JkbGVmdCIsCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLUJhY2tzcGFjZSIsICJBbHQtQmFja3NwYWNlfEN0cmwtQWx0LUJhY2tzcGFjZSIpLAogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5yZW1vdmVXb3JkTGVmdCgpOyB9Cn0sIHsKICAgIG5hbWU6ICJyZW1vdmV3b3JkcmlnaHQiLAogICAgYmluZEtleTogYmluZEtleSgiQ3RybC1EZWxldGUiLCAiQWx0LURlbGV0ZSIpLAogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5yZW1vdmVXb3JkUmlnaHQoKTsgfQp9LCB7CiAgICBuYW1lOiAib3V0ZGVudCIsCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJTaGlmdC1UYWIiLCAiU2hpZnQtVGFiIiksCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLmJsb2NrT3V0ZGVudCgpOyB9Cn0sIHsKICAgIG5hbWU6ICJpbmRlbnQiLAogICAgYmluZEtleTogYmluZEtleSgiVGFiIiwgIlRhYiIpLAogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5pbmRlbnQoKTsgfQp9LCB7CiAgICBuYW1lOiAiaW5zZXJ0c3RyaW5nIiwKICAgIGV4ZWM6IGZ1bmN0aW9uKGVkaXRvciwgc3RyKSB7IGVkaXRvci5pbnNlcnQoc3RyKTsgfQp9LCB7CiAgICBuYW1lOiAiaW5zZXJ0dGV4dCIsCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IsIGFyZ3MpIHsKICAgICAgICBlZGl0b3IuaW5zZXJ0KGxhbmcuc3RyaW5nUmVwZWF0KGFyZ3MudGV4dCAgfHwgIiIsIGFyZ3MudGltZXMgfHwgMSkpOwogICAgfQp9LCB7CiAgICBuYW1lOiAic3BsaXRsaW5lIiwKICAgIGJpbmRLZXk6IGJpbmRLZXkobnVsbCwgIkN0cmwtTyIpLAogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci5zcGxpdExpbmUoKTsgfQp9LCB7CiAgICBuYW1lOiAidHJhbnNwb3NlbGV0dGVycyIsCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLVQiLCAiQ3RybC1UIiksCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLnRyYW5zcG9zZUxldHRlcnMoKTsgfQp9LCB7CiAgICBuYW1lOiAidG91cHBlcmNhc2UiLAogICAgYmluZEtleTogYmluZEtleSgiQ3RybC1VIiwgIkN0cmwtVSIpLAogICAgZXhlYzogZnVuY3Rpb24oZWRpdG9yKSB7IGVkaXRvci50b1VwcGVyQ2FzZSgpOyB9Cn0sIHsKICAgIG5hbWU6ICJ0b2xvd2VyY2FzZSIsCiAgICBiaW5kS2V5OiBiaW5kS2V5KCJDdHJsLVNoaWZ0LVUiLCAiQ3RybC1TaGlmdC1VIiksCiAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdG9yLnRvTG93ZXJDYXNlKCk7IH0KfV07Cgp9KTsKLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoKICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKiAgICAgIE1paGFpIFN1Y2FuIDxtaWhhaSBET1Qgc3VjYW4gQVQgZ21haWwgRE9UIGNvbT4KICogICAgICBKdWxpYW4gVmllcmVjayA8anVsaWFuIERPVCB2aWVyZWNrIEFUIGdtYWlsIERPVCBjb20+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9lZGl0X3Nlc3Npb24nLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbGliL2V2ZW50X2VtaXR0ZXInLCAnYWNlL3NlbGVjdGlvbicsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS9yYW5nZScsICdhY2UvZG9jdW1lbnQnLCAnYWNlL2JhY2tncm91bmRfdG9rZW5pemVyJywgJ2FjZS9lZGl0X3Nlc3Npb24vZm9sZGluZycsICdhY2UvZWRpdF9zZXNzaW9uL2JyYWNrZXRfbWF0Y2gnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuL2xpYi9vb3AiKTsKdmFyIGxhbmcgPSByZXF1aXJlKCIuL2xpYi9sYW5nIik7CnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOwp2YXIgU2VsZWN0aW9uID0gcmVxdWlyZSgiLi9zZWxlY3Rpb24iKS5TZWxlY3Rpb247CnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vbW9kZS90ZXh0IikuTW9kZTsKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi9yYW5nZSIpLlJhbmdlOwp2YXIgRG9jdW1lbnQgPSByZXF1aXJlKCIuL2RvY3VtZW50IikuRG9jdW1lbnQ7CnZhciBCYWNrZ3JvdW5kVG9rZW5pemVyID0gcmVxdWlyZSgiLi9iYWNrZ3JvdW5kX3Rva2VuaXplciIpLkJhY2tncm91bmRUb2tlbml6ZXI7Cgp2YXIgRWRpdFNlc3Npb24gPSBmdW5jdGlvbih0ZXh0LCBtb2RlKSB7CiAgICB0aGlzLiRtb2RpZmllZCA9IHRydWU7CiAgICB0aGlzLiRicmVha3BvaW50cyA9IFtdOwogICAgdGhpcy4kZnJvbnRNYXJrZXJzID0ge307CiAgICB0aGlzLiRiYWNrTWFya2VycyA9IHt9OwogICAgdGhpcy4kbWFya2VySWQgPSAxOwogICAgdGhpcy4kcm93Q2FjaGUgPSBbXTsKICAgIHRoaXMuJHdyYXBEYXRhID0gW107CiAgICB0aGlzLiRmb2xkRGF0YSA9IFtdOwogICAgdGhpcy4kdW5kb1NlbGVjdCA9IHRydWU7CiAgICB0aGlzLiRmb2xkRGF0YS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzdHIgPSAiIjsKICAgICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24oZm9sZExpbmUpIHsKICAgICAgICAgICAgc3RyICs9ICJcbiIgKyBmb2xkTGluZS50b1N0cmluZygpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBzdHI7CiAgICB9CgogICAgaWYgKHRleHQgaW5zdGFuY2VvZiBEb2N1bWVudCkgewogICAgICAgIHRoaXMuc2V0RG9jdW1lbnQodGV4dCk7CiAgICB9IGVsc2UgewogICAgICAgIHRoaXMuc2V0RG9jdW1lbnQobmV3IERvY3VtZW50KHRleHQpKTsKICAgIH0KCiAgICB0aGlzLnNlbGVjdGlvbiA9IG5ldyBTZWxlY3Rpb24odGhpcyk7CiAgICBpZiAobW9kZSkKICAgICAgICB0aGlzLnNldE1vZGUobW9kZSk7CiAgICBlbHNlCiAgICAgICAgdGhpcy5zZXRNb2RlKG5ldyBUZXh0TW9kZSgpKTsKfTsKCgooZnVuY3Rpb24oKSB7CgogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOwoKICAgIHRoaXMuc2V0RG9jdW1lbnQgPSBmdW5jdGlvbihkb2MpIHsKICAgICAgICBpZiAodGhpcy5kb2MpCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiRG9jdW1lbnQgaXMgYWxyZWFkeSBzZXQiKTsKCiAgICAgICAgdGhpcy5kb2MgPSBkb2M7CiAgICAgICAgZG9jLm9uKCJjaGFuZ2UiLCB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcykpOwogICAgICAgIHRoaXMub24oImNoYW5nZUZvbGQiLCB0aGlzLm9uQ2hhbmdlRm9sZC5iaW5kKHRoaXMpKTsKCiAgICAgICAgaWYgKHRoaXMuYmdUb2tlbml6ZXIpIHsKICAgICAgICAgICAgdGhpcy5iZ1Rva2VuaXplci5zZXREb2N1bWVudCh0aGlzLmdldERvY3VtZW50KCkpOwogICAgICAgICAgICB0aGlzLmJnVG9rZW5pemVyLnN0YXJ0KDApOwogICAgICAgIH0KICAgIH07CgogICAgdGhpcy5nZXREb2N1bWVudCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmRvYzsKICAgIH07CgogICAgdGhpcy4kcmVzZXRSb3dDYWNoZSA9IGZ1bmN0aW9uKHJvdykgewogICAgICAgIGlmIChyb3cgPT0gMCkgewogICAgICAgICAgICB0aGlzLiRyb3dDYWNoZSA9IFtdOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciByb3dDYWNoZSA9IHRoaXMuJHJvd0NhY2hlOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93Q2FjaGUubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKHJvd0NhY2hlW2ldLmRvY1JvdyA+PSByb3cpIHsKICAgICAgICAgICAgICAgIHJvd0NhY2hlLnNwbGljZShpLCByb3dDYWNoZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICB0aGlzLm9uQ2hhbmdlRm9sZCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICB2YXIgZm9sZCA9IGUuZGF0YTsKICAgICAgICB0aGlzLiRyZXNldFJvd0NhY2hlKGZvbGQuc3RhcnQucm93KTsKICAgIH07CgogICAgdGhpcy5vbkNoYW5nZSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICB2YXIgZGVsdGEgPSBlLmRhdGE7CiAgICAgICAgdGhpcy4kbW9kaWZpZWQgPSB0cnVlOwoKICAgICAgICB0aGlzLiRyZXNldFJvd0NhY2hlKGRlbHRhLnJhbmdlLnN0YXJ0LnJvdyk7CgogICAgICAgIHZhciByZW1vdmVkRm9sZHMgPSB0aGlzLiR1cGRhdGVJbnRlcm5hbERhdGFPbkNoYW5nZShlKTsKICAgICAgICBpZiAoIXRoaXMuJGZyb21VbmRvICYmIHRoaXMuJHVuZG9NYW5hZ2VyICYmICFkZWx0YS5pZ25vcmUpIHsKICAgICAgICAgICAgdGhpcy4kZGVsdGFzRG9jLnB1c2goZGVsdGEpOwogICAgICAgICAgICBpZiAocmVtb3ZlZEZvbGRzICYmIHJlbW92ZWRGb2xkcy5sZW5ndGggIT0gMCkgewogICAgICAgICAgICAgICAgdGhpcy4kZGVsdGFzRm9sZC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICJyZW1vdmVGb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgZm9sZHM6ICByZW1vdmVkRm9sZHMKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLiRpbmZvcm1VbmRvTWFuYWdlci5zY2hlZHVsZSgpOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5iZ1Rva2VuaXplci5zdGFydChkZWx0YS5yYW5nZS5zdGFydC5yb3cpOwogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIGUpOwogICAgfTsKCiAgICB0aGlzLnNldFZhbHVlID0gZnVuY3Rpb24odGV4dCkgewogICAgICAgIHRoaXMuZG9jLnNldFZhbHVlKHRleHQpOwogICAgICAgIHRoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JUbygwLCAwKTsKICAgICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbigpOwoKICAgICAgICB0aGlzLiRyZXNldFJvd0NhY2hlKDApOwogICAgICAgIHRoaXMuJGRlbHRhcyA9IFtdOwogICAgICAgIHRoaXMuJGRlbHRhc0RvYyA9IFtdOwogICAgICAgIHRoaXMuJGRlbHRhc0ZvbGQgPSBbXTsKICAgICAgICB0aGlzLmdldFVuZG9NYW5hZ2VyKCkucmVzZXQoKTsKICAgIH07CgogICAgdGhpcy5nZXRWYWx1ZSA9CiAgICB0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZG9jLmdldFZhbHVlKCk7CiAgICB9OwoKICAgIHRoaXMuZ2V0U2VsZWN0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uOwogICAgfTsKCiAgICB0aGlzLmdldFN0YXRlID0gZnVuY3Rpb24ocm93KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYmdUb2tlbml6ZXIuZ2V0U3RhdGUocm93KTsKICAgIH07CgogICAgdGhpcy5nZXRUb2tlbnMgPSBmdW5jdGlvbihmaXJzdFJvdywgbGFzdFJvdykgewogICAgICAgIHJldHVybiB0aGlzLmJnVG9rZW5pemVyLmdldFRva2VucyhmaXJzdFJvdywgbGFzdFJvdyk7CiAgICB9OwoKICAgIHRoaXMuZ2V0VG9rZW5BdCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7CiAgICAgICAgdmFyIHRva2VucyA9IHRoaXMuYmdUb2tlbml6ZXIuZ2V0VG9rZW5zKHJvdywgcm93KVswXS50b2tlbnM7CiAgICAgICAgdmFyIHRva2VuLCBjID0gMDsKICAgICAgICBpZiAoY29sdW1uID09IG51bGwpIHsKICAgICAgICAgICAgaSA9IHRva2Vucy5sZW5ndGggLSAxOwogICAgICAgICAgICBjID0gdGhpcy5nZXRMaW5lKHJvdykubGVuZ3RoOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjICs9IHRva2Vuc1tpXS52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAoYyA+PSBjb2x1bW4pCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdG9rZW4gPSB0b2tlbnNbaV07CiAgICAgICAgaWYgKCF0b2tlbikKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgdG9rZW4uaW5kZXggPSBpOwogICAgICAgIHRva2VuLnN0YXJ0ID0gYyAtIHRva2VuLnZhbHVlLmxlbmd0aDsKICAgICAgICByZXR1cm4gdG9rZW47CiAgICB9OwoKICAgIHRoaXMuc2V0VW5kb01hbmFnZXIgPSBmdW5jdGlvbih1bmRvTWFuYWdlcikgewogICAgICAgIHRoaXMuJHVuZG9NYW5hZ2VyID0gdW5kb01hbmFnZXI7CiAgICAgICAgdGhpcy4kcmVzZXRSb3dDYWNoZSgwKTsKICAgICAgICB0aGlzLiRkZWx0YXMgPSBbXTsKICAgICAgICB0aGlzLiRkZWx0YXNEb2MgPSBbXTsKICAgICAgICB0aGlzLiRkZWx0YXNGb2xkID0gW107CgogICAgICAgIGlmICh0aGlzLiRpbmZvcm1VbmRvTWFuYWdlcikKICAgICAgICAgICAgdGhpcy4kaW5mb3JtVW5kb01hbmFnZXIuY2FuY2VsKCk7CgogICAgICAgIGlmICh1bmRvTWFuYWdlcikgewogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgICAgICAgIHRoaXMuJHN5bmNJbmZvcm1VbmRvTWFuYWdlciA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgc2VsZi4kaW5mb3JtVW5kb01hbmFnZXIuY2FuY2VsKCk7CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuJGRlbHRhc0ZvbGQubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi4kZGVsdGFzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICBncm91cDogImZvbGQiLAogICAgICAgICAgICAgICAgICAgICAgICBkZWx0YXM6IHNlbGYuJGRlbHRhc0ZvbGQKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBzZWxmLiRkZWx0YXNGb2xkID0gW107CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHNlbGYuJGRlbHRhc0RvYy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLiRkZWx0YXMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwOiAiZG9jIiwKICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFzOiBzZWxmLiRkZWx0YXNEb2MKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBzZWxmLiRkZWx0YXNEb2MgPSBbXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoc2VsZi4kZGVsdGFzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICB1bmRvTWFuYWdlci5leGVjdXRlKHsKICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAiYWNldXBkYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogW3NlbGYuJGRlbHRhcywgc2VsZl0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZWxmLiRkZWx0YXMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLiRpbmZvcm1VbmRvTWFuYWdlciA9CiAgICAgICAgICAgICAgICBsYW5nLmRlZmVycmVkQ2FsbCh0aGlzLiRzeW5jSW5mb3JtVW5kb01hbmFnZXIpOwogICAgICAgIH0KICAgIH07CgogICAgdGhpcy4kZGVmYXVsdFVuZG9NYW5hZ2VyID0gewogICAgICAgIHVuZG86IGZ1bmN0aW9uKCkge30sCiAgICAgICAgcmVkbzogZnVuY3Rpb24oKSB7fSwKICAgICAgICByZXNldDogZnVuY3Rpb24oKSB7fQogICAgfTsKCiAgICB0aGlzLmdldFVuZG9NYW5hZ2VyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJHVuZG9NYW5hZ2VyIHx8IHRoaXMuJGRlZmF1bHRVbmRvTWFuYWdlcjsKICAgIH0sCgogICAgdGhpcy5nZXRUYWJTdHJpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5nZXRVc2VTb2Z0VGFicygpKSB7CiAgICAgICAgICAgIHJldHVybiBsYW5nLnN0cmluZ1JlcGVhdCgiICIsIHRoaXMuZ2V0VGFiU2l6ZSgpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gIlx0IjsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMuJHVzZVNvZnRUYWJzID0gdHJ1ZTsKICAgIHRoaXMuc2V0VXNlU29mdFRhYnMgPSBmdW5jdGlvbih1c2VTb2Z0VGFicykgewogICAgICAgIGlmICh0aGlzLiR1c2VTb2Z0VGFicyA9PT0gdXNlU29mdFRhYnMpIHJldHVybjsKCiAgICAgICAgdGhpcy4kdXNlU29mdFRhYnMgPSB1c2VTb2Z0VGFiczsKICAgIH07CgogICAgdGhpcy5nZXRVc2VTb2Z0VGFicyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLiR1c2VTb2Z0VGFiczsKICAgIH07CgogICAgdGhpcy4kdGFiU2l6ZSA9IDQ7CiAgICB0aGlzLnNldFRhYlNpemUgPSBmdW5jdGlvbih0YWJTaXplKSB7CiAgICAgICAgaWYgKGlzTmFOKHRhYlNpemUpIHx8IHRoaXMuJHRhYlNpemUgPT09IHRhYlNpemUpIHJldHVybjsKCiAgICAgICAgdGhpcy4kbW9kaWZpZWQgPSB0cnVlOwogICAgICAgIHRoaXMuJHRhYlNpemUgPSB0YWJTaXplOwogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZVRhYlNpemUiKTsKICAgIH07CgogICAgdGhpcy5nZXRUYWJTaXplID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJHRhYlNpemU7CiAgICB9OwoKICAgIHRoaXMuaXNUYWJTdG9wID0gZnVuY3Rpb24ocG9zaXRpb24pIHsKICAgICAgICByZXR1cm4gdGhpcy4kdXNlU29mdFRhYnMgJiYgKHBvc2l0aW9uLmNvbHVtbiAlIHRoaXMuJHRhYlNpemUgPT0gMCk7CiAgICB9OwoKICAgIHRoaXMuJG92ZXJ3cml0ZSA9IGZhbHNlOwogICAgdGhpcy5zZXRPdmVyd3JpdGUgPSBmdW5jdGlvbihvdmVyd3JpdGUpIHsKICAgICAgICBpZiAodGhpcy4kb3ZlcndyaXRlID09IG92ZXJ3cml0ZSkgcmV0dXJuOwoKICAgICAgICB0aGlzLiRvdmVyd3JpdGUgPSBvdmVyd3JpdGU7CiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlT3ZlcndyaXRlIik7CiAgICB9OwoKICAgIHRoaXMuZ2V0T3ZlcndyaXRlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJG92ZXJ3cml0ZTsKICAgIH07CgogICAgdGhpcy50b2dnbGVPdmVyd3JpdGUgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnNldE92ZXJ3cml0ZSghdGhpcy4kb3ZlcndyaXRlKTsKICAgIH07CgogICAgdGhpcy5nZXRCcmVha3BvaW50cyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLiRicmVha3BvaW50czsKICAgIH07CgogICAgdGhpcy5zZXRCcmVha3BvaW50cyA9IGZ1bmN0aW9uKHJvd3MpIHsKICAgICAgICB0aGlzLiRicmVha3BvaW50cyA9IFtdOwogICAgICAgIGZvciAodmFyIGk9MDsgaTxyb3dzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHRoaXMuJGJyZWFrcG9pbnRzW3Jvd3NbaV1dID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlQnJlYWtwb2ludCIsIHt9KTsKICAgIH07CgogICAgdGhpcy5jbGVhckJyZWFrcG9pbnRzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy4kYnJlYWtwb2ludHMgPSBbXTsKICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2VCcmVha3BvaW50Iiwge30pOwogICAgfTsKCiAgICB0aGlzLnNldEJyZWFrcG9pbnQgPSBmdW5jdGlvbihyb3cpIHsKICAgICAgICB0aGlzLiRicmVha3BvaW50c1tyb3ddID0gdHJ1ZTsKICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2VCcmVha3BvaW50Iiwge30pOwogICAgfTsKCiAgICB0aGlzLmNsZWFyQnJlYWtwb2ludCA9IGZ1bmN0aW9uKHJvdykgewogICAgICAgIGRlbGV0ZSB0aGlzLiRicmVha3BvaW50c1tyb3ddOwogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZUJyZWFrcG9pbnQiLCB7fSk7CiAgICB9OwoKICAgIHRoaXMuZ2V0QnJlYWtwb2ludHMgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy4kYnJlYWtwb2ludHM7CiAgICB9OwoKICAgIHRoaXMuYWRkTWFya2VyID0gZnVuY3Rpb24ocmFuZ2UsIGNsYXp6LCB0eXBlLCBpbkZyb250KSB7CiAgICAgICAgdmFyIGlkID0gdGhpcy4kbWFya2VySWQrKzsKCiAgICAgICAgdmFyIG1hcmtlciA9IHsKICAgICAgICAgICAgcmFuZ2UgOiByYW5nZSwKICAgICAgICAgICAgdHlwZSA6IHR5cGUgfHwgImxpbmUiLAogICAgICAgICAgICByZW5kZXJlcjogdHlwZW9mIHR5cGUgPT0gImZ1bmN0aW9uIiA/IHR5cGUgOiBudWxsLAogICAgICAgICAgICBjbGF6eiA6IGNsYXp6LAogICAgICAgICAgICBpbkZyb250OiAhIWluRnJvbnQKICAgICAgICB9CgogICAgICAgIGlmIChpbkZyb250KSB7CiAgICAgICAgICAgIHRoaXMuJGZyb250TWFya2Vyc1tpZF0gPSBtYXJrZXI7CiAgICAgICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZUZyb250TWFya2VyIikKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLiRiYWNrTWFya2Vyc1tpZF0gPSBtYXJrZXI7CiAgICAgICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZUJhY2tNYXJrZXIiKQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGlkOwogICAgfTsKCiAgICB0aGlzLnJlbW92ZU1hcmtlciA9IGZ1bmN0aW9uKG1hcmtlcklkKSB7CiAgICAgICAgdmFyIG1hcmtlciA9IHRoaXMuJGZyb250TWFya2Vyc1ttYXJrZXJJZF0gfHwgdGhpcy4kYmFja01hcmtlcnNbbWFya2VySWRdOwogICAgICAgIGlmICghbWFya2VyKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIHZhciBtYXJrZXJzID0gbWFya2VyLmluRnJvbnQgPyB0aGlzLiRmcm9udE1hcmtlcnMgOiB0aGlzLiRiYWNrTWFya2VyczsKICAgICAgICBpZiAobWFya2VyKSB7CiAgICAgICAgICAgIGRlbGV0ZSAobWFya2Vyc1ttYXJrZXJJZF0pOwogICAgICAgICAgICB0aGlzLl9lbWl0KG1hcmtlci5pbkZyb250ID8gImNoYW5nZUZyb250TWFya2VyIiA6ICJjaGFuZ2VCYWNrTWFya2VyIik7CiAgICAgICAgfQogICAgfTsKCiAgICB0aGlzLmdldE1hcmtlcnMgPSBmdW5jdGlvbihpbkZyb250KSB7CiAgICAgICAgcmV0dXJuIGluRnJvbnQgPyB0aGlzLiRmcm9udE1hcmtlcnMgOiB0aGlzLiRiYWNrTWFya2VyczsKICAgIH07CgogICAgLyoqCiAgICAgKiBFcnJvcjoKICAgICAqICB7CiAgICAgKiAgICByb3c6IDEyLAogICAgICogICAgY29sdW1uOiAyLCAvL2NhbiBiZSB1bmRlZmluZWQKICAgICAqICAgIHRleHQ6ICJNaXNzaW5nIGFyZ3VtZW50IiwKICAgICAqICAgIHR5cGU6ICJlcnJvciIgLy8gb3IgIndhcm5pbmciIG9yICJpbmZvIgogICAgICogIH0KICAgICAqLwogICAgdGhpcy5zZXRBbm5vdGF0aW9ucyA9IGZ1bmN0aW9uKGFubm90YXRpb25zKSB7CiAgICAgICAgdGhpcy4kYW5ub3RhdGlvbnMgPSB7fTsKICAgICAgICBmb3IgKHZhciBpPTA7IGk8YW5ub3RhdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGFubm90YXRpb24gPSBhbm5vdGF0aW9uc1tpXTsKICAgICAgICAgICAgdmFyIHJvdyA9IGFubm90YXRpb24ucm93OwogICAgICAgICAgICBpZiAodGhpcy4kYW5ub3RhdGlvbnNbcm93XSkKICAgICAgICAgICAgICAgIHRoaXMuJGFubm90YXRpb25zW3Jvd10ucHVzaChhbm5vdGF0aW9uKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgdGhpcy4kYW5ub3RhdGlvbnNbcm93XSA9IFthbm5vdGF0aW9uXTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlQW5ub3RhdGlvbiIsIHt9KTsKICAgIH07CgogICAgdGhpcy5nZXRBbm5vdGF0aW9ucyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLiRhbm5vdGF0aW9ucyB8fCB7fTsKICAgIH07CgogICAgdGhpcy5jbGVhckFubm90YXRpb25zID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy4kYW5ub3RhdGlvbnMgPSB7fTsKICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2VBbm5vdGF0aW9uIiwge30pOwogICAgfTsKCiAgICB0aGlzLiRkZXRlY3ROZXdMaW5lID0gZnVuY3Rpb24odGV4dCkgewogICAgICAgIHZhciBtYXRjaCA9IHRleHQubWF0Y2goL14uKj8oXHI/XG4pL20pOwogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICB0aGlzLiRhdXRvTmV3TGluZSA9IG1hdGNoWzFdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMuJGF1dG9OZXdMaW5lID0gIlxuIjsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMuZ2V0V29yZFJhbmdlID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsKICAgICAgICB2YXIgbGluZSA9IHRoaXMuZ2V0TGluZShyb3cpOwoKICAgICAgICB2YXIgaW5Ub2tlbiA9IGZhbHNlOwogICAgICAgIGlmIChjb2x1bW4gPiAwKSB7CiAgICAgICAgICAgIGluVG9rZW4gPSAhIWxpbmUuY2hhckF0KGNvbHVtbiAtIDEpLm1hdGNoKHRoaXMudG9rZW5SZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWluVG9rZW4pIHsKICAgICAgICAgICAgaW5Ub2tlbiA9ICEhbGluZS5jaGFyQXQoY29sdW1uKS5tYXRjaCh0aGlzLnRva2VuUmUpOwogICAgICAgIH0KCiAgICAgICAgdmFyIHJlID0gaW5Ub2tlbiA/IHRoaXMudG9rZW5SZSA6IHRoaXMubm9uVG9rZW5SZTsKCiAgICAgICAgdmFyIHN0YXJ0ID0gY29sdW1uOwogICAgICAgIGlmIChzdGFydCA+IDApIHsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgc3RhcnQtLTsKICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoc3RhcnQgPj0gMCAmJiBsaW5lLmNoYXJBdChzdGFydCkubWF0Y2gocmUpKTsKICAgICAgICAgICAgc3RhcnQrKzsKICAgICAgICB9CgogICAgICAgIHZhciBlbmQgPSBjb2x1bW47CiAgICAgICAgd2hpbGUgKGVuZCA8IGxpbmUubGVuZ3RoICYmIGxpbmUuY2hhckF0KGVuZCkubWF0Y2gocmUpKSB7CiAgICAgICAgICAgIGVuZCsrOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShyb3csIHN0YXJ0LCByb3csIGVuZCk7CiAgICB9OwoKICAgIC8vIEdldHMgdGhlIHJhbmdlIG9mIGEgd29yZCBpbmNsdWRpbmcgaXRzIHJpZ2h0IHdoaXRlc3BhY2UKICAgIHRoaXMuZ2V0QVdvcmRSYW5nZSA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7CiAgICAgICAgdmFyIHdvcmRSYW5nZSA9IHRoaXMuZ2V0V29yZFJhbmdlKHJvdywgY29sdW1uKTsKICAgICAgICB2YXIgbGluZSA9IHRoaXMuZ2V0TGluZSh3b3JkUmFuZ2UuZW5kLnJvdyk7CgogICAgICAgIHdoaWxlIChsaW5lLmNoYXJBdCh3b3JkUmFuZ2UuZW5kLmNvbHVtbikubWF0Y2goL1sgXHRdLykpIHsKICAgICAgICAgICAgd29yZFJhbmdlLmVuZC5jb2x1bW4gKz0gMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHdvcmRSYW5nZTsKICAgIH07CgogICAgdGhpcy5zZXROZXdMaW5lTW9kZSA9IGZ1bmN0aW9uKG5ld0xpbmVNb2RlKSB7CiAgICAgICAgdGhpcy5kb2Muc2V0TmV3TGluZU1vZGUobmV3TGluZU1vZGUpOwogICAgfTsKCiAgICB0aGlzLmdldE5ld0xpbmVNb2RlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZG9jLmdldE5ld0xpbmVNb2RlKCk7CiAgICB9OwoKICAgIHRoaXMuJHVzZVdvcmtlciA9IHRydWU7CiAgICB0aGlzLnNldFVzZVdvcmtlciA9IGZ1bmN0aW9uKHVzZVdvcmtlcikgewogICAgICAgIGlmICh0aGlzLiR1c2VXb3JrZXIgPT0gdXNlV29ya2VyKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIHRoaXMuJHVzZVdvcmtlciA9IHVzZVdvcmtlcjsKCiAgICAgICAgdGhpcy4kc3RvcFdvcmtlcigpOwogICAgICAgIGlmICh1c2VXb3JrZXIpCiAgICAgICAgICAgIHRoaXMuJHN0YXJ0V29ya2VyKCk7CiAgICB9OwoKICAgIHRoaXMuZ2V0VXNlV29ya2VyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJHVzZVdvcmtlcjsKICAgIH07CgogICAgdGhpcy5vblJlbG9hZFRva2VuaXplciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICB2YXIgcm93cyA9IGUuZGF0YTsKICAgICAgICB0aGlzLmJnVG9rZW5pemVyLnN0YXJ0KHJvd3MuZmlyc3QpOwogICAgICAgIHRoaXMuX2VtaXQoInRva2VuaXplclVwZGF0ZSIsIGUpOwogICAgfTsKCiAgICB0aGlzLiRtb2RlID0gbnVsbDsKICAgIHRoaXMuc2V0TW9kZSA9IGZ1bmN0aW9uKG1vZGUpIHsKICAgICAgICBpZiAodGhpcy4kbW9kZSA9PT0gbW9kZSkgcmV0dXJuOwogICAgICAgIHRoaXMuJG1vZGUgPSBtb2RlOwoKICAgICAgICB0aGlzLiRzdG9wV29ya2VyKCk7CgogICAgICAgIGlmICh0aGlzLiR1c2VXb3JrZXIpCiAgICAgICAgICAgIHRoaXMuJHN0YXJ0V29ya2VyKCk7CgogICAgICAgIHZhciB0b2tlbml6ZXIgPSBtb2RlLmdldFRva2VuaXplcigpOwoKICAgICAgICBpZih0b2tlbml6ZXIuYWRkRXZlbnRMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIHZhciBvblJlbG9hZFRva2VuaXplciA9IHRoaXMub25SZWxvYWRUb2tlbml6ZXIuYmluZCh0aGlzKTsKICAgICAgICAgICAgdG9rZW5pemVyLmFkZEV2ZW50TGlzdGVuZXIoInVwZGF0ZSIsIG9uUmVsb2FkVG9rZW5pemVyKTsKICAgICAgICB9CgogICAgICAgIGlmICghdGhpcy5iZ1Rva2VuaXplcikgewogICAgICAgICAgICB0aGlzLmJnVG9rZW5pemVyID0gbmV3IEJhY2tncm91bmRUb2tlbml6ZXIodG9rZW5pemVyKTsKICAgICAgICAgICAgdmFyIF9zZWxmID0gdGhpczsKICAgICAgICAgICAgdGhpcy5iZ1Rva2VuaXplci5hZGRFdmVudExpc3RlbmVyKCJ1cGRhdGUiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICBfc2VsZi5fZW1pdCgidG9rZW5pemVyVXBkYXRlIiwgZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMuYmdUb2tlbml6ZXIuc2V0VG9rZW5pemVyKHRva2VuaXplcik7CiAgICAgICAgfQoKICAgICAgICB0aGlzLmJnVG9rZW5pemVyLnNldERvY3VtZW50KHRoaXMuZ2V0RG9jdW1lbnQoKSk7CiAgICAgICAgdGhpcy5iZ1Rva2VuaXplci5zdGFydCgwKTsKCiAgICAgICAgdGhpcy50b2tlblJlID0gbW9kZS50b2tlblJlOwogICAgICAgIHRoaXMubm9uVG9rZW5SZSA9IG1vZGUubm9uVG9rZW5SZTsKCiAgICAgICAgdGhpcy4kc2V0Rm9sZGluZyhtb2RlLmZvbGRpbmdSdWxlcyk7CgogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZU1vZGUiKTsKICAgIH07CgogICAgdGhpcy4kc3RvcFdvcmtlciA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLiR3b3JrZXIpCiAgICAgICAgICAgIHRoaXMuJHdvcmtlci50ZXJtaW5hdGUoKTsKCiAgICAgICAgdGhpcy4kd29ya2VyID0gbnVsbDsKICAgIH07CgogICAgdGhpcy4kc3RhcnRXb3JrZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodHlwZW9mIFdvcmtlciAhPT0gInVuZGVmaW5lZCIgJiYgIXJlcXVpcmUubm9Xb3JrZXIpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHRoaXMuJHdvcmtlciA9IHRoaXMuJG1vZGUuY3JlYXRlV29ya2VyKHRoaXMpOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiQ291bGQgbm90IGxvYWQgd29ya2VyIik7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlKTsKICAgICAgICAgICAgICAgIHRoaXMuJHdvcmtlciA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICB0aGlzLiR3b3JrZXIgPSBudWxsOwogICAgfTsKCiAgICB0aGlzLmdldE1vZGUgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy4kbW9kZTsKICAgIH07CiAgICAKICAgIHRoaXMuJHNjcm9sbFRvcCA9IDA7CiAgICB0aGlzLnNldFNjcm9sbFRvcCA9IGZ1bmN0aW9uKHNjcm9sbFRvcCkgewogICAgICAgIHNjcm9sbFRvcCA9IE1hdGgucm91bmQoTWF0aC5tYXgoMCwgc2Nyb2xsVG9wKSk7CiAgICAgICAgaWYgKHRoaXMuJHNjcm9sbFRvcCA9PT0gc2Nyb2xsVG9wKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIHRoaXMuJHNjcm9sbFRvcCA9IHNjcm9sbFRvcDsKICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2VTY3JvbGxUb3AiLCBzY3JvbGxUb3ApOwogICAgfTsKCiAgICB0aGlzLmdldFNjcm9sbFRvcCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLiRzY3JvbGxUb3A7CiAgICB9OwogICAgCiAgICB0aGlzLiRzY3JvbGxMZWZ0ID0gMDsKICAgIHRoaXMuc2V0U2Nyb2xsTGVmdCA9IGZ1bmN0aW9uKHNjcm9sbExlZnQpIHsKICAgICAgICBzY3JvbGxMZWZ0ID0gTWF0aC5yb3VuZChNYXRoLm1heCgwLCBzY3JvbGxMZWZ0KSk7CiAgICAgICAgaWYgKHRoaXMuJHNjcm9sbExlZnQgPT09IHNjcm9sbExlZnQpCiAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgdGhpcy4kc2Nyb2xsTGVmdCA9IHNjcm9sbExlZnQ7CiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlU2Nyb2xsTGVmdCIsIHNjcm9sbExlZnQpOwogICAgfTsKCiAgICB0aGlzLmdldFNjcm9sbExlZnQgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy4kc2Nyb2xsTGVmdDsKICAgIH07CgogICAgdGhpcy5nZXRXaWR0aCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuJGNvbXB1dGVXaWR0aCgpOwogICAgICAgIHJldHVybiB0aGlzLndpZHRoOwogICAgfTsKCiAgICB0aGlzLmdldFNjcmVlbldpZHRoID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy4kY29tcHV0ZVdpZHRoKCk7CiAgICAgICAgcmV0dXJuIHRoaXMuc2NyZWVuV2lkdGg7CiAgICB9OwoKICAgIHRoaXMuJGNvbXB1dGVXaWR0aCA9IGZ1bmN0aW9uKGZvcmNlKSB7CiAgICAgICAgaWYgKHRoaXMuJG1vZGlmaWVkIHx8IGZvcmNlKSB7CiAgICAgICAgICAgIHRoaXMuJG1vZGlmaWVkID0gZmFsc2U7CgogICAgICAgICAgICB2YXIgbGluZXMgPSB0aGlzLmRvYy5nZXRBbGxMaW5lcygpOwogICAgICAgICAgICB2YXIgbG9uZ2VzdExpbmUgPSAwOwogICAgICAgICAgICB2YXIgbG9uZ2VzdFNjcmVlbkxpbmUgPSAwOwoKICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciBmb2xkTGluZSA9IHRoaXMuZ2V0Rm9sZExpbmUoaSksCiAgICAgICAgICAgICAgICAgICAgbGluZSwgbGVuOwoKICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lc1tpXTsKICAgICAgICAgICAgICAgIGlmIChmb2xkTGluZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBlbmQgPSBmb2xkTGluZS5yYW5nZS5lbmQ7CiAgICAgICAgICAgICAgICAgICAgbGluZSA9IHRoaXMuZ2V0Rm9sZERpc3BsYXlMaW5lKGZvbGRMaW5lKTsKICAgICAgICAgICAgICAgICAgICAvLyBDb250aW51ZSBhZnRlciB0aGUgZm9sZExpbmUuZW5kLnJvdy4gQWxsIHRoZSBsaW5lcyBpbgogICAgICAgICAgICAgICAgICAgIC8vIGJldHdlZW4gYXJlIGZvbGRlZC4KICAgICAgICAgICAgICAgICAgICBpID0gZW5kLnJvdzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxlbiA9IGxpbmUubGVuZ3RoOwogICAgICAgICAgICAgICAgbG9uZ2VzdExpbmUgPSBNYXRoLm1heChsb25nZXN0TGluZSwgbGVuKTsKICAgICAgICAgICAgICAgIGlmICghdGhpcy4kdXNlV3JhcE1vZGUpIHsKICAgICAgICAgICAgICAgICAgICBsb25nZXN0U2NyZWVuTGluZSA9IE1hdGgubWF4KAogICAgICAgICAgICAgICAgICAgICAgICBsb25nZXN0U2NyZWVuTGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kZ2V0U3RyaW5nU2NyZWVuV2lkdGgobGluZSlbMF0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMud2lkdGggPSBsb25nZXN0TGluZTsKCiAgICAgICAgICAgIGlmICh0aGlzLiR1c2VXcmFwTW9kZSkgewogICAgICAgICAgICAgICAgdGhpcy5zY3JlZW5XaWR0aCA9IHRoaXMuJHdyYXBMaW1pdDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NyZWVuV2lkdGggPSBsb25nZXN0U2NyZWVuTGluZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBHZXQgYSB2ZXJiYXRpbSBjb3B5IG9mIHRoZSBnaXZlbiBsaW5lIGFzIGl0IGlzIGluIHRoZSBkb2N1bWVudAogICAgICovCiAgICB0aGlzLmdldExpbmUgPSBmdW5jdGlvbihyb3cpIHsKICAgICAgICByZXR1cm4gdGhpcy5kb2MuZ2V0TGluZShyb3cpOwogICAgfTsKCiAgICB0aGlzLmdldExpbmVzID0gZnVuY3Rpb24oZmlyc3RSb3csIGxhc3RSb3cpIHsKICAgICAgICByZXR1cm4gdGhpcy5kb2MuZ2V0TGluZXMoZmlyc3RSb3csIGxhc3RSb3cpOwogICAgfTsKCiAgICB0aGlzLmdldExlbmd0aCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmRvYy5nZXRMZW5ndGgoKTsKICAgIH07CgogICAgdGhpcy5nZXRUZXh0UmFuZ2UgPSBmdW5jdGlvbihyYW5nZSkgewogICAgICAgIHJldHVybiB0aGlzLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOwogICAgfTsKCiAgICB0aGlzLmluc2VydCA9IGZ1bmN0aW9uKHBvc2l0aW9uLCB0ZXh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZG9jLmluc2VydChwb3NpdGlvbiwgdGV4dCk7CiAgICB9OwoKICAgIHRoaXMucmVtb3ZlID0gZnVuY3Rpb24ocmFuZ2UpIHsKICAgICAgICByZXR1cm4gdGhpcy5kb2MucmVtb3ZlKHJhbmdlKTsKICAgIH07CgogICAgdGhpcy51bmRvQ2hhbmdlcyA9IGZ1bmN0aW9uKGRlbHRhcywgZG9udFNlbGVjdCkgewogICAgICAgIGlmICghZGVsdGFzLmxlbmd0aCkKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICB0aGlzLiRmcm9tVW5kbyA9IHRydWU7CiAgICAgICAgdmFyIGxhc3RVbmRvUmFuZ2UgPSBudWxsOwogICAgICAgIGZvciAodmFyIGkgPSBkZWx0YXMubGVuZ3RoIC0gMTsgaSAhPSAtMTsgaS0tKSB7CiAgICAgICAgICAgIHZhciBkZWx0YSA9IGRlbHRhc1tpXTsKICAgICAgICAgICAgaWYgKGRlbHRhLmdyb3VwID09ICJkb2MiKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRvYy5yZXZlcnREZWx0YXMoZGVsdGEuZGVsdGFzKTsKICAgICAgICAgICAgICAgIGxhc3RVbmRvUmFuZ2UgPQogICAgICAgICAgICAgICAgICAgIHRoaXMuJGdldFVuZG9TZWxlY3Rpb24oZGVsdGEuZGVsdGFzLCB0cnVlLCBsYXN0VW5kb1JhbmdlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGRlbHRhLmRlbHRhcy5mb3JFYWNoKGZ1bmN0aW9uKGZvbGREZWx0YSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkRm9sZHMoZm9sZERlbHRhLmZvbGRzKTsKICAgICAgICAgICAgICAgIH0sIHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuJGZyb21VbmRvID0gZmFsc2U7CiAgICAgICAgbGFzdFVuZG9SYW5nZSAmJgogICAgICAgICAgICB0aGlzLiR1bmRvU2VsZWN0ICYmCiAgICAgICAgICAgICFkb250U2VsZWN0ICYmCiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKGxhc3RVbmRvUmFuZ2UpOwogICAgICAgIHJldHVybiBsYXN0VW5kb1JhbmdlOwogICAgfTsKCiAgICB0aGlzLnJlZG9DaGFuZ2VzID0gZnVuY3Rpb24oZGVsdGFzLCBkb250U2VsZWN0KSB7CiAgICAgICAgaWYgKCFkZWx0YXMubGVuZ3RoKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIHRoaXMuJGZyb21VbmRvID0gdHJ1ZTsKICAgICAgICB2YXIgbGFzdFVuZG9SYW5nZSA9IG51bGw7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGRlbHRhID0gZGVsdGFzW2ldOwogICAgICAgICAgICBpZiAoZGVsdGEuZ3JvdXAgPT0gImRvYyIpIHsKICAgICAgICAgICAgICAgIHRoaXMuZG9jLmFwcGx5RGVsdGFzKGRlbHRhLmRlbHRhcyk7CiAgICAgICAgICAgICAgICBsYXN0VW5kb1JhbmdlID0KICAgICAgICAgICAgICAgICAgICB0aGlzLiRnZXRVbmRvU2VsZWN0aW9uKGRlbHRhLmRlbHRhcywgZmFsc2UsIGxhc3RVbmRvUmFuZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuJGZyb21VbmRvID0gZmFsc2U7CiAgICAgICAgbGFzdFVuZG9SYW5nZSAmJgogICAgICAgICAgICB0aGlzLiR1bmRvU2VsZWN0ICYmCiAgICAgICAgICAgICFkb250U2VsZWN0ICYmCiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKGxhc3RVbmRvUmFuZ2UpOwogICAgICAgIHJldHVybiBsYXN0VW5kb1JhbmdlOwogICAgfTsKICAgIAogICAgdGhpcy5zZXRVbmRvU2VsZWN0ID0gZnVuY3Rpb24oZW5hYmxlKSB7CiAgICAgICAgdGhpcy4kdW5kb1NlbGVjdCA9IGVuYWJsZTsKICAgIH07CgogICAgdGhpcy4kZ2V0VW5kb1NlbGVjdGlvbiA9IGZ1bmN0aW9uKGRlbHRhcywgaXNVbmRvLCBsYXN0VW5kb1JhbmdlKSB7CiAgICAgICAgZnVuY3Rpb24gaXNJbnNlcnQoZGVsdGEpIHsKICAgICAgICAgICAgdmFyIGluc2VydCA9CiAgICAgICAgICAgICAgICBkZWx0YS5hY3Rpb24gPT0gImluc2VydFRleHQiIHx8IGRlbHRhLmFjdGlvbiA9PSAiaW5zZXJ0TGluZXMiOwogICAgICAgICAgICByZXR1cm4gaXNVbmRvID8gIWluc2VydCA6IGluc2VydDsKICAgICAgICB9CgogICAgICAgIHZhciBkZWx0YSA9IGRlbHRhc1swXTsKICAgICAgICB2YXIgcmFuZ2UsIHBvaW50OwogICAgICAgIHZhciBsYXN0RGVsdGFJc0luc2VydCA9IGZhbHNlOwogICAgICAgIGlmIChpc0luc2VydChkZWx0YSkpIHsKICAgICAgICAgICAgcmFuZ2UgPSBkZWx0YS5yYW5nZS5jbG9uZSgpOwogICAgICAgICAgICBsYXN0RGVsdGFJc0luc2VydCA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmFuZ2UgPSBSYW5nZS5mcm9tUG9pbnRzKGRlbHRhLnJhbmdlLnN0YXJ0LCBkZWx0YS5yYW5nZS5zdGFydCk7CiAgICAgICAgICAgIGxhc3REZWx0YUlzSW5zZXJ0ID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBkZWx0YSA9IGRlbHRhc1tpXTsKICAgICAgICAgICAgaWYgKGlzSW5zZXJ0KGRlbHRhKSkgewogICAgICAgICAgICAgICAgcG9pbnQgPSBkZWx0YS5yYW5nZS5zdGFydDsKICAgICAgICAgICAgICAgIGlmIChyYW5nZS5jb21wYXJlKHBvaW50LnJvdywgcG9pbnQuY29sdW1uKSA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KGRlbHRhLnJhbmdlLnN0YXJ0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBvaW50ID0gZGVsdGEucmFuZ2UuZW5kOwogICAgICAgICAgICAgICAgaWYgKHJhbmdlLmNvbXBhcmUocG9pbnQucm93LCBwb2ludC5jb2x1bW4pID09IDEpIHsKICAgICAgICAgICAgICAgICAgICByYW5nZS5zZXRFbmQoZGVsdGEucmFuZ2UuZW5kKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxhc3REZWx0YUlzSW5zZXJ0ID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHBvaW50ID0gZGVsdGEucmFuZ2Uuc3RhcnQ7CiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuY29tcGFyZShwb2ludC5yb3csIHBvaW50LmNvbHVtbikgPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICByYW5nZSA9CiAgICAgICAgICAgICAgICAgICAgICAgIFJhbmdlLmZyb21Qb2ludHMoZGVsdGEucmFuZ2Uuc3RhcnQsIGRlbHRhLnJhbmdlLnN0YXJ0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxhc3REZWx0YUlzSW5zZXJ0ID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIENoZWNrIGlmIHRoaXMgcmFuZ2UgYW5kIHRoZSBsYXN0IHVuZG8gcmFuZ2UgaGFzIHNvbWV0aGluZyBpbiBjb21tb24uCiAgICAgICAgLy8gSWYgdHJ1ZSwgbWVyZ2UgdGhlIHJhbmdlcy4KICAgICAgICBpZiAobGFzdFVuZG9SYW5nZSAhPSBudWxsKSB7CiAgICAgICAgICAgIHZhciBjbXAgPSBsYXN0VW5kb1JhbmdlLmNvbXBhcmVSYW5nZShyYW5nZSk7CiAgICAgICAgICAgIGlmIChjbXAgPT0gMSkgewogICAgICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQobGFzdFVuZG9SYW5nZS5zdGFydCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoY21wID09IC0xKSB7CiAgICAgICAgICAgICAgICByYW5nZS5zZXRFbmQobGFzdFVuZG9SYW5nZS5lbmQpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICB9LAoKICAgIHRoaXMucmVwbGFjZSA9IGZ1bmN0aW9uKHJhbmdlLCB0ZXh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZG9jLnJlcGxhY2UocmFuZ2UsIHRleHQpOwogICAgfTsKCiAgICAvKioKICAgICAqIE1vdmUgYSByYW5nZSBvZiB0ZXh0IGZyb20gdGhlIGdpdmVuIHJhbmdlIHRvIHRoZSBnaXZlbiBwb3NpdGlvbi4KICAgICAqCiAgICAgKiBAcGFyYW0gZnJvbVJhbmdlIHtSYW5nZX0gVGhlIHJhbmdlIG9mIHRleHQgeW91IHdhbnQgbW92ZWQgd2l0aGluIHRoZQogICAgICogZG9jdW1lbnQuCiAgICAgKiBAcGFyYW0gdG9Qb3NpdGlvbiB7T2JqZWN0fSBUaGUgbG9jYXRpb24gKHJvdyBhbmQgY29sdW1uKSB3aGVyZSB5b3Ugd2FudAogICAgICogdG8gbW92ZSB0aGUgdGV4dCB0by4KICAgICAqIEByZXR1cm4ge1JhbmdlfSBUaGUgbmV3IHJhbmdlIHdoZXJlIHRoZSB0ZXh0IHdhcyBtb3ZlZCB0by4KICAgICAqLwogICAgdGhpcy5tb3ZlVGV4dCA9IGZ1bmN0aW9uKGZyb21SYW5nZSwgdG9Qb3NpdGlvbikgewogICAgICAgIHZhciB0ZXh0ID0gdGhpcy5nZXRUZXh0UmFuZ2UoZnJvbVJhbmdlKTsKICAgICAgICB0aGlzLnJlbW92ZShmcm9tUmFuZ2UpOwoKICAgICAgICB2YXIgdG9Sb3cgPSB0b1Bvc2l0aW9uLnJvdzsKICAgICAgICB2YXIgdG9Db2x1bW4gPSB0b1Bvc2l0aW9uLmNvbHVtbjsKCiAgICAgICAgLy8gTWFrZSBzdXJlIHRvIHVwZGF0ZSB0aGUgaW5zZXJ0IGxvY2F0aW9uLCB3aGVuIHRleHQgaXMgcmVtb3ZlZCBpbgogICAgICAgIC8vIGZyb250IG9mIHRoZSBjaG9zZW4gcG9pbnQgb2YgaW5zZXJ0aW9uLgogICAgICAgIGlmICghZnJvbVJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgZnJvbVJhbmdlLnN0YXJ0LnJvdyA9PSB0b1JvdyAmJgogICAgICAgICAgICBmcm9tUmFuZ2UuZW5kLmNvbHVtbiA8IHRvQ29sdW1uKQogICAgICAgICAgICB0b0NvbHVtbiAtPSB0ZXh0Lmxlbmd0aDsKCiAgICAgICAgaWYgKGZyb21SYW5nZS5pc011bHRpTGluZSgpICYmIGZyb21SYW5nZS5lbmQucm93IDwgdG9Sb3cpIHsKICAgICAgICAgICAgdmFyIGxpbmVzID0gdGhpcy5kb2MuJHNwbGl0KHRleHQpOwogICAgICAgICAgICB0b1JvdyAtPSBsaW5lcy5sZW5ndGggLSAxOwogICAgICAgIH0KCiAgICAgICAgdmFyIGVuZFJvdyA9IHRvUm93ICsgZnJvbVJhbmdlLmVuZC5yb3cgLSBmcm9tUmFuZ2Uuc3RhcnQucm93OwogICAgICAgIHZhciBlbmRDb2x1bW4gPSBmcm9tUmFuZ2UuaXNNdWx0aUxpbmUoKSA/CiAgICAgICAgICAgICAgICAgICAgICAgIGZyb21SYW5nZS5lbmQuY29sdW1uIDoKICAgICAgICAgICAgICAgICAgICAgICAgdG9Db2x1bW4gKyBmcm9tUmFuZ2UuZW5kLmNvbHVtbiAtIGZyb21SYW5nZS5zdGFydC5jb2x1bW47CgogICAgICAgIHZhciB0b1JhbmdlID0gbmV3IFJhbmdlKHRvUm93LCB0b0NvbHVtbiwgZW5kUm93LCBlbmRDb2x1bW4pOwoKICAgICAgICB0aGlzLmluc2VydCh0b1JhbmdlLnN0YXJ0LCB0ZXh0KTsKCiAgICAgICAgcmV0dXJuIHRvUmFuZ2U7CiAgICB9OwoKICAgIHRoaXMuaW5kZW50Um93cyA9IGZ1bmN0aW9uKHN0YXJ0Um93LCBlbmRSb3csIGluZGVudFN0cmluZykgewogICAgICAgIGluZGVudFN0cmluZyA9IGluZGVudFN0cmluZy5yZXBsYWNlKC9cdC9nLCB0aGlzLmdldFRhYlN0cmluZygpKTsKICAgICAgICBmb3IgKHZhciByb3c9c3RhcnRSb3c7IHJvdzw9ZW5kUm93OyByb3crKykKICAgICAgICAgICAgdGhpcy5pbnNlcnQoe3Jvdzogcm93LCBjb2x1bW46MH0sIGluZGVudFN0cmluZyk7CiAgICB9OwoKICAgIHRoaXMub3V0ZGVudFJvd3MgPSBmdW5jdGlvbiAocmFuZ2UpIHsKICAgICAgICB2YXIgcm93UmFuZ2UgPSByYW5nZS5jb2xsYXBzZVJvd3MoKTsKICAgICAgICB2YXIgZGVsZXRlUmFuZ2UgPSBuZXcgUmFuZ2UoMCwgMCwgMCwgMCk7CiAgICAgICAgdmFyIHNpemUgPSB0aGlzLmdldFRhYlNpemUoKTsKCiAgICAgICAgZm9yICh2YXIgaSA9IHJvd1JhbmdlLnN0YXJ0LnJvdzsgaSA8PSByb3dSYW5nZS5lbmQucm93OyArK2kpIHsKICAgICAgICAgICAgdmFyIGxpbmUgPSB0aGlzLmdldExpbmUoaSk7CgogICAgICAgICAgICBkZWxldGVSYW5nZS5zdGFydC5yb3cgPSBpOwogICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQucm93ID0gaTsKICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzaXplOyArK2opCiAgICAgICAgICAgICAgICBpZiAobGluZS5jaGFyQXQoaikgIT0gJyAnKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBpZiAoaiA8IHNpemUgJiYgbGluZS5jaGFyQXQoaikgPT0gJ1x0JykgewogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2Uuc3RhcnQuY29sdW1uID0gajsKICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLmVuZC5jb2x1bW4gPSBqICsgMTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLnN0YXJ0LmNvbHVtbiA9IDA7CiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQuY29sdW1uID0gajsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnJlbW92ZShkZWxldGVSYW5nZSk7CiAgICAgICAgfQogICAgfTsKCiAgICB0aGlzLm1vdmVMaW5lc1VwID0gZnVuY3Rpb24oZmlyc3RSb3csIGxhc3RSb3cpIHsKICAgICAgICBpZiAoZmlyc3RSb3cgPD0gMCkgcmV0dXJuIDA7CgogICAgICAgIHZhciByZW1vdmVkID0gdGhpcy5kb2MucmVtb3ZlTGluZXMoZmlyc3RSb3csIGxhc3RSb3cpOwogICAgICAgIHRoaXMuZG9jLmluc2VydExpbmVzKGZpcnN0Um93IC0gMSwgcmVtb3ZlZCk7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfTsKCiAgICB0aGlzLm1vdmVMaW5lc0Rvd24gPSBmdW5jdGlvbihmaXJzdFJvdywgbGFzdFJvdykgewogICAgICAgIGlmIChsYXN0Um93ID49IHRoaXMuZG9jLmdldExlbmd0aCgpLTEpIHJldHVybiAwOwoKICAgICAgICB2YXIgcmVtb3ZlZCA9IHRoaXMuZG9jLnJlbW92ZUxpbmVzKGZpcnN0Um93LCBsYXN0Um93KTsKICAgICAgICB0aGlzLmRvYy5pbnNlcnRMaW5lcyhmaXJzdFJvdysxLCByZW1vdmVkKTsKICAgICAgICByZXR1cm4gMTsKICAgIH07CgogICAgdGhpcy5kdXBsaWNhdGVMaW5lcyA9IGZ1bmN0aW9uKGZpcnN0Um93LCBsYXN0Um93KSB7CiAgICAgICAgdmFyIGZpcnN0Um93ID0gdGhpcy4kY2xpcFJvd1RvRG9jdW1lbnQoZmlyc3RSb3cpOwogICAgICAgIHZhciBsYXN0Um93ID0gdGhpcy4kY2xpcFJvd1RvRG9jdW1lbnQobGFzdFJvdyk7CgogICAgICAgIHZhciBsaW5lcyA9IHRoaXMuZ2V0TGluZXMoZmlyc3RSb3csIGxhc3RSb3cpOwogICAgICAgIHRoaXMuZG9jLmluc2VydExpbmVzKGZpcnN0Um93LCBsaW5lcyk7CgogICAgICAgIHZhciBhZGRlZFJvd3MgPSBsYXN0Um93IC0gZmlyc3RSb3cgKyAxOwogICAgICAgIHJldHVybiBhZGRlZFJvd3M7CiAgICB9OwoKICAgIHRoaXMuJGNsaXBSb3dUb0RvY3VtZW50ID0gZnVuY3Rpb24ocm93KSB7CiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKHJvdywgdGhpcy5kb2MuZ2V0TGVuZ3RoKCktMSkpOwogICAgfTsKCiAgICB0aGlzLiRjbGlwQ29sdW1uVG9Sb3cgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIGlmIChjb2x1bW4gPCAwKQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICByZXR1cm4gTWF0aC5taW4odGhpcy5kb2MuZ2V0TGluZShyb3cpLmxlbmd0aCwgY29sdW1uKTsKICAgIH07CgogICAgdGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7CiAgICAgICAgY29sdW1uID0gTWF0aC5tYXgoMCwgY29sdW1uKTsKCiAgICAgICAgaWYgKHJvdyA8IDApIHsKICAgICAgICAgICAgcm93ID0gMDsKICAgICAgICAgICAgY29sdW1uID0gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YXIgbGVuID0gdGhpcy5kb2MuZ2V0TGVuZ3RoKCk7CiAgICAgICAgICAgIGlmIChyb3cgPj0gbGVuKSB7CiAgICAgICAgICAgICAgICByb3cgPSBsZW4gLSAxOwogICAgICAgICAgICAgICAgY29sdW1uID0gdGhpcy5kb2MuZ2V0TGluZShsZW4tMSkubGVuZ3RoOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29sdW1uID0gTWF0aC5taW4odGhpcy5kb2MuZ2V0TGluZShyb3cpLmxlbmd0aCwgY29sdW1uKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcm93OiByb3csCiAgICAgICAgICAgIGNvbHVtbjogY29sdW1uCiAgICAgICAgfTsKICAgIH07CgogICAgdGhpcy4kY2xpcFJhbmdlVG9Eb2N1bWVudCA9IGZ1bmN0aW9uKHJhbmdlKSB7CiAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA8IDApIHsKICAgICAgICAgICAgcmFuZ2Uuc3RhcnQucm93ID0gMDsKICAgICAgICAgICAgcmFuZ2Uuc3RhcnQuY29sdW1uID0gMAogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJhbmdlLnN0YXJ0LmNvbHVtbiA9IHRoaXMuJGNsaXBDb2x1bW5Ub1JvdygKICAgICAgICAgICAgICAgIHJhbmdlLnN0YXJ0LnJvdywKICAgICAgICAgICAgICAgIHJhbmdlLnN0YXJ0LmNvbHVtbgogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAKICAgICAgICB2YXIgbGVuID0gdGhpcy5kb2MuZ2V0TGVuZ3RoKCkgLSAxOwogICAgICAgIGlmIChyYW5nZS5lbmQucm93ID4gbGVuKSB7CiAgICAgICAgICAgIHJhbmdlLmVuZC5yb3cgPSBsZW47CiAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gPSB0aGlzLmRvYy5nZXRMaW5lKGxlbikubGVuZ3RoOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gPSB0aGlzLiRjbGlwQ29sdW1uVG9Sb3coCiAgICAgICAgICAgICAgICByYW5nZS5lbmQucm93LAogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbgogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICB9OwoKICAgIC8vIFdSQVBNT0RFCiAgICB0aGlzLiR3cmFwTGltaXQgPSA4MDsKICAgIHRoaXMuJHVzZVdyYXBNb2RlID0gZmFsc2U7CiAgICB0aGlzLiR3cmFwTGltaXRSYW5nZSA9IHsKICAgICAgICBtaW4gOiBudWxsLAogICAgICAgIG1heCA6IG51bGwKICAgIH07CgogICAgdGhpcy5zZXRVc2VXcmFwTW9kZSA9IGZ1bmN0aW9uKHVzZVdyYXBNb2RlKSB7CiAgICAgICAgaWYgKHVzZVdyYXBNb2RlICE9IHRoaXMuJHVzZVdyYXBNb2RlKSB7CiAgICAgICAgICAgIHRoaXMuJHVzZVdyYXBNb2RlID0gdXNlV3JhcE1vZGU7CiAgICAgICAgICAgIHRoaXMuJG1vZGlmaWVkID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy4kcmVzZXRSb3dDYWNoZSgwKTsKCiAgICAgICAgICAgIC8vIElmIHdyYXBNb2RlIGlzIGFjdGl2YWVkLCB0aGUgd3JhcERhdGEgYXJyYXkgaGFzIHRvIGJlIGluaXRpYWxpemVkLgogICAgICAgICAgICBpZiAodXNlV3JhcE1vZGUpIHsKICAgICAgICAgICAgICAgIHZhciBsZW4gPSB0aGlzLmdldExlbmd0aCgpOwogICAgICAgICAgICAgICAgdGhpcy4kd3JhcERhdGEgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLiR3cmFwRGF0YS5wdXNoKFtdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuJHVwZGF0ZVdyYXBEYXRhKDAsIGxlbiAtIDEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2VXcmFwTW9kZSIpOwogICAgICAgIH0KICAgIH07CgogICAgdGhpcy5nZXRVc2VXcmFwTW9kZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLiR1c2VXcmFwTW9kZTsKICAgIH07CgogICAgLy8gQWxsb3cgdGhlIHdyYXAgbGltaXQgdG8gbW92ZSBmcmVlbHkgYmV0d2VlbiBtaW4gYW5kIG1heC4gRWl0aGVyCiAgICAvLyBwYXJhbWV0ZXIgY2FuIGJlIG51bGwgdG8gYWxsb3cgdGhlIHdyYXAgbGltaXQgdG8gYmUgdW5jb25zdHJhaW5lZAogICAgLy8gaW4gdGhhdCBkaXJlY3Rpb24uIE9yIHNldCBib3RoIHBhcmFtZXRlcnMgdG8gdGhlIHNhbWUgbnVtYmVyIHRvIHBpbgogICAgLy8gdGhlIGxpbWl0IHRvIHRoYXQgdmFsdWUuCiAgICB0aGlzLnNldFdyYXBMaW1pdFJhbmdlID0gZnVuY3Rpb24obWluLCBtYXgpIHsKICAgICAgICBpZiAodGhpcy4kd3JhcExpbWl0UmFuZ2UubWluICE9PSBtaW4gfHwgdGhpcy4kd3JhcExpbWl0UmFuZ2UubWF4ICE9PSBtYXgpIHsKICAgICAgICAgICAgdGhpcy4kd3JhcExpbWl0UmFuZ2UubWluID0gbWluOwogICAgICAgICAgICB0aGlzLiR3cmFwTGltaXRSYW5nZS5tYXggPSBtYXg7CiAgICAgICAgICAgIHRoaXMuJG1vZGlmaWVkID0gdHJ1ZTsKICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGZvcmNlIGEgcmVjYWxjdWxhdGlvbiBvZiB0aGUgd3JhcCBsaW1pdAogICAgICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2VXcmFwTW9kZSIpOwogICAgICAgIH0KICAgIH07CgogICAgLy8gVGhpcyBzaG91bGQgZ2VuZXJhbGx5IG9ubHkgYmUgY2FsbGVkIGJ5IHRoZSByZW5kZXJlciB3aGVuIGEgcmVzaXplCiAgICAvLyBpcyBkZXRlY3RlZC4KICAgIHRoaXMuYWRqdXN0V3JhcExpbWl0ID0gZnVuY3Rpb24oZGVzaXJlZExpbWl0KSB7CiAgICAgICAgdmFyIHdyYXBMaW1pdCA9IHRoaXMuJGNvbnN0cmFpbldyYXBMaW1pdChkZXNpcmVkTGltaXQpOwogICAgICAgIGlmICh3cmFwTGltaXQgIT0gdGhpcy4kd3JhcExpbWl0ICYmIHdyYXBMaW1pdCA+IDApIHsKICAgICAgICAgICAgdGhpcy4kd3JhcExpbWl0ID0gd3JhcExpbWl0OwogICAgICAgICAgICB0aGlzLiRtb2RpZmllZCA9IHRydWU7CiAgICAgICAgICAgIGlmICh0aGlzLiR1c2VXcmFwTW9kZSkgewogICAgICAgICAgICAgICAgdGhpcy4kdXBkYXRlV3JhcERhdGEoMCwgdGhpcy5nZXRMZW5ndGgoKSAtIDEpOwogICAgICAgICAgICAgICAgdGhpcy4kcmVzZXRSb3dDYWNoZSgwKQogICAgICAgICAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlV3JhcExpbWl0Iik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH07CgogICAgdGhpcy4kY29uc3RyYWluV3JhcExpbWl0ID0gZnVuY3Rpb24od3JhcExpbWl0KSB7CiAgICAgICAgdmFyIG1pbiA9IHRoaXMuJHdyYXBMaW1pdFJhbmdlLm1pbjsKICAgICAgICBpZiAobWluKQogICAgICAgICAgICB3cmFwTGltaXQgPSBNYXRoLm1heChtaW4sIHdyYXBMaW1pdCk7CgogICAgICAgIHZhciBtYXggPSB0aGlzLiR3cmFwTGltaXRSYW5nZS5tYXg7CiAgICAgICAgaWYgKG1heCkKICAgICAgICAgICAgd3JhcExpbWl0ID0gTWF0aC5taW4obWF4LCB3cmFwTGltaXQpOwoKICAgICAgICAvLyBXaGF0IHdvdWxkIGEgbGltaXQgb2YgMCBldmVuIG1lYW4/CiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDEsIHdyYXBMaW1pdCk7CiAgICB9OwoKICAgIHRoaXMuZ2V0V3JhcExpbWl0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJHdyYXBMaW1pdDsKICAgIH07CgogICAgdGhpcy5nZXRXcmFwTGltaXRSYW5nZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIEF2b2lkIHVuZXhwZWN0ZWQgbXV0YXRpb24gYnkgcmV0dXJuaW5nIGEgY29weQogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG1pbiA6IHRoaXMuJHdyYXBMaW1pdFJhbmdlLm1pbiwKICAgICAgICAgICAgbWF4IDogdGhpcy4kd3JhcExpbWl0UmFuZ2UubWF4CiAgICAgICAgfTsKICAgIH07CgogICAgdGhpcy4kdXBkYXRlSW50ZXJuYWxEYXRhT25DaGFuZ2UgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgdmFyIHVzZVdyYXBNb2RlID0gdGhpcy4kdXNlV3JhcE1vZGU7CiAgICAgICAgdmFyIGxlbjsKICAgICAgICB2YXIgYWN0aW9uID0gZS5kYXRhLmFjdGlvbjsKICAgICAgICB2YXIgZmlyc3RSb3cgPSBlLmRhdGEucmFuZ2Uuc3RhcnQucm93OwogICAgICAgIHZhciBsYXN0Um93ID0gZS5kYXRhLnJhbmdlLmVuZC5yb3c7CiAgICAgICAgdmFyIHN0YXJ0ID0gZS5kYXRhLnJhbmdlLnN0YXJ0OwogICAgICAgIHZhciBlbmQgPSBlLmRhdGEucmFuZ2UuZW5kOwogICAgICAgIHZhciByZW1vdmVkRm9sZHMgPSBudWxsOwoKICAgICAgICBpZiAoYWN0aW9uLmluZGV4T2YoIkxpbmVzIikgIT0gLTEpIHsKICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSAiaW5zZXJ0TGluZXMiKSB7CiAgICAgICAgICAgICAgICBsYXN0Um93ID0gZmlyc3RSb3cgKyAoZS5kYXRhLmxpbmVzLmxlbmd0aCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBsYXN0Um93ID0gZmlyc3RSb3c7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGVuID0gZS5kYXRhLmxpbmVzID8gZS5kYXRhLmxpbmVzLmxlbmd0aCA6IGxhc3RSb3cgLSBmaXJzdFJvdzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsZW4gPSBsYXN0Um93IC0gZmlyc3RSb3c7CiAgICAgICAgfQoKICAgICAgICBpZiAobGVuICE9IDApIHsKICAgICAgICAgICAgaWYgKGFjdGlvbi5pbmRleE9mKCJyZW1vdmUiKSAhPSAtMSkgewogICAgICAgICAgICAgICAgdXNlV3JhcE1vZGUgJiYgdGhpcy4kd3JhcERhdGEuc3BsaWNlKGZpcnN0Um93LCBsZW4pOwoKICAgICAgICAgICAgICAgIHZhciBmb2xkTGluZXMgPSB0aGlzLiRmb2xkRGF0YTsKICAgICAgICAgICAgICAgIHJlbW92ZWRGb2xkcyA9IHRoaXMuZ2V0Rm9sZHNJblJhbmdlKGUuZGF0YS5yYW5nZSk7CiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUZvbGRzKHJlbW92ZWRGb2xkcyk7CgogICAgICAgICAgICAgICAgdmFyIGZvbGRMaW5lID0gdGhpcy5nZXRGb2xkTGluZShlbmQucm93KTsKICAgICAgICAgICAgICAgIHZhciBpZHggPSAwOwogICAgICAgICAgICAgICAgaWYgKGZvbGRMaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgZm9sZExpbmUuYWRkUmVtb3ZlQ2hhcnMoZW5kLnJvdywgZW5kLmNvbHVtbiwgc3RhcnQuY29sdW1uIC0gZW5kLmNvbHVtbik7CiAgICAgICAgICAgICAgICAgICAgZm9sZExpbmUuc2hpZnRSb3coLWxlbik7CgogICAgICAgICAgICAgICAgICAgIHZhciBmb2xkTGluZUJlZm9yZSA9IHRoaXMuZ2V0Rm9sZExpbmUoZmlyc3RSb3cpOwogICAgICAgICAgICAgICAgICAgIGlmIChmb2xkTGluZUJlZm9yZSAmJiBmb2xkTGluZUJlZm9yZSAhPT0gZm9sZExpbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9sZExpbmVCZWZvcmUubWVyZ2UoZm9sZExpbmUpOwogICAgICAgICAgICAgICAgICAgICAgICBmb2xkTGluZSA9IGZvbGRMaW5lQmVmb3JlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZHggPSBmb2xkTGluZXMuaW5kZXhPZihmb2xkTGluZSkgKyAxOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGZvciAoaWR4OyBpZHggPCBmb2xkTGluZXMubGVuZ3RoOyBpZHgrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBmb2xkTGluZSA9IGZvbGRMaW5lc1tpZHhdOwogICAgICAgICAgICAgICAgICAgIGlmIChmb2xkTGluZS5zdGFydC5yb3cgPj0gZW5kLnJvdykgewogICAgICAgICAgICAgICAgICAgICAgICBmb2xkTGluZS5zaGlmdFJvdygtbGVuKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbGFzdFJvdyA9IGZpcnN0Um93OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFyIGFyZ3M7CiAgICAgICAgICAgICAgICBpZiAodXNlV3JhcE1vZGUpIHsKICAgICAgICAgICAgICAgICAgICBhcmdzID0gW2ZpcnN0Um93LCAwXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSBhcmdzLnB1c2goW10pOwogICAgICAgICAgICAgICAgICAgIHRoaXMuJHdyYXBEYXRhLnNwbGljZS5hcHBseSh0aGlzLiR3cmFwRGF0YSwgYXJncyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gSWYgc29tZSBuZXcgbGluZSBpcyBhZGRlZCBpbnNpZGUgb2YgYSBmb2xkTGluZSwgdGhlbiBzcGxpdAogICAgICAgICAgICAgICAgLy8gdGhlIGZvbGQgbGluZSB1cC4KICAgICAgICAgICAgICAgIHZhciBmb2xkTGluZXMgPSB0aGlzLiRmb2xkRGF0YTsKICAgICAgICAgICAgICAgIHZhciBmb2xkTGluZSA9IHRoaXMuZ2V0Rm9sZExpbmUoZmlyc3RSb3cpOwogICAgICAgICAgICAgICAgdmFyIGlkeCA9IDA7CiAgICAgICAgICAgICAgICBpZiAoZm9sZExpbmUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY21wID0gZm9sZExpbmUucmFuZ2UuY29tcGFyZUluc2lkZShzdGFydC5yb3csIHN0YXJ0LmNvbHVtbikKICAgICAgICAgICAgICAgICAgICAvLyBJbnNpZGUgb2YgdGhlIGZvbGRMaW5lIHJhbmdlLiBOZWVkIHRvIHNwbGl0IHN0dWZmIHVwLgogICAgICAgICAgICAgICAgICAgIGlmIChjbXAgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBmb2xkTGluZSA9IGZvbGRMaW5lLnNwbGl0KHN0YXJ0LnJvdywgc3RhcnQuY29sdW1uKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9sZExpbmUuc2hpZnRSb3cobGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9sZExpbmUuYWRkUmVtb3ZlQ2hhcnMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0Um93LCAwLCBlbmQuY29sdW1uIC0gc3RhcnQuY29sdW1uKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAvLyBJbmZyb250IG9mIHRoZSBmb2xkTGluZSBidXQgc2FtZSByb3cuIE5lZWQgdG8gc2hpZnQgY29sdW1uLgogICAgICAgICAgICAgICAgICAgIGlmIChjbXAgPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9sZExpbmUuYWRkUmVtb3ZlQ2hhcnMoZmlyc3RSb3csIDAsIGVuZC5jb2x1bW4gLSBzdGFydC5jb2x1bW4pOwogICAgICAgICAgICAgICAgICAgICAgICBmb2xkTGluZS5zaGlmdFJvdyhsZW4pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGlmIHRoZSBpbnNlcnQgaXMgYWZ0ZXIgdGhlIGZvbGRMaW5lLgogICAgICAgICAgICAgICAgICAgIGlkeCA9IGZvbGRMaW5lcy5pbmRleE9mKGZvbGRMaW5lKSArIDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZm9yIChpZHg7IGlkeCA8IGZvbGRMaW5lcy5sZW5ndGg7IGlkeCsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZvbGRMaW5lID0gZm9sZExpbmVzW2lkeF07CiAgICAgICAgICAgICAgICAgICAgaWYgKGZvbGRMaW5lLnN0YXJ0LnJvdyA+PSBmaXJzdFJvdykgewogICAgICAgICAgICAgICAgICAgICAgICBmb2xkTGluZS5zaGlmdFJvdyhsZW4pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIFJlYWxpZ24gZm9sZHMuIEUuZy4gaWYgeW91IGFkZCBzb21lIG5ldyBjaGFycyBiZWZvcmUgYSBmb2xkLCB0aGUKICAgICAgICAgICAgLy8gZm9sZCBzaG91bGQgIm1vdmUiIHRvIHRoZSByaWdodC4KICAgICAgICAgICAgbGVuID0gTWF0aC5hYnMoZS5kYXRhLnJhbmdlLnN0YXJ0LmNvbHVtbiAtIGUuZGF0YS5yYW5nZS5lbmQuY29sdW1uKTsKICAgICAgICAgICAgaWYgKGFjdGlvbi5pbmRleE9mKCJyZW1vdmUiKSAhPSAtMSkgewogICAgICAgICAgICAgICAgLy8gR2V0IGFsbCB0aGUgZm9sZHMgaW4gdGhlIGNoYW5nZSByYW5nZSBhbmQgcmVtb3ZlIHRoZW0uCiAgICAgICAgICAgICAgICByZW1vdmVkRm9sZHMgPSB0aGlzLmdldEZvbGRzSW5SYW5nZShlLmRhdGEucmFuZ2UpOwogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVGb2xkcyhyZW1vdmVkRm9sZHMpOwoKICAgICAgICAgICAgICAgIGxlbiA9IC1sZW47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGZvbGRMaW5lID0gdGhpcy5nZXRGb2xkTGluZShmaXJzdFJvdyk7CiAgICAgICAgICAgIGlmIChmb2xkTGluZSkgewogICAgICAgICAgICAgICAgZm9sZExpbmUuYWRkUmVtb3ZlQ2hhcnMoZmlyc3RSb3csIHN0YXJ0LmNvbHVtbiwgbGVuKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHVzZVdyYXBNb2RlICYmIHRoaXMuJHdyYXBEYXRhLmxlbmd0aCAhPSB0aGlzLmRvYy5nZXRMZW5ndGgoKSkgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCJkb2MuZ2V0TGVuZ3RoKCkgYW5kICR3cmFwRGF0YS5sZW5ndGggaGF2ZSB0byBiZSB0aGUgc2FtZSEiKTsKICAgICAgICB9CgogICAgICAgIHVzZVdyYXBNb2RlICYmIHRoaXMuJHVwZGF0ZVdyYXBEYXRhKGZpcnN0Um93LCBsYXN0Um93KTsKCiAgICAgICAgcmV0dXJuIHJlbW92ZWRGb2xkczsKICAgIH07CgogICAgdGhpcy4kdXBkYXRlV3JhcERhdGEgPSBmdW5jdGlvbihmaXJzdFJvdywgbGFzdFJvdykgewogICAgICAgIHZhciBsaW5lcyA9IHRoaXMuZG9jLmdldEFsbExpbmVzKCk7CiAgICAgICAgdmFyIHRhYlNpemUgPSB0aGlzLmdldFRhYlNpemUoKTsKICAgICAgICB2YXIgd3JhcERhdGEgPSB0aGlzLiR3cmFwRGF0YTsKICAgICAgICB2YXIgd3JhcExpbWl0ID0gdGhpcy4kd3JhcExpbWl0OwogICAgICAgIHZhciB0b2tlbnM7CiAgICAgICAgdmFyIGZvbGRMaW5lOwoKICAgICAgICB2YXIgcm93ID0gZmlyc3RSb3c7CiAgICAgICAgbGFzdFJvdyA9IE1hdGgubWluKGxhc3RSb3csIGxpbmVzLmxlbmd0aCAtIDEpOwogICAgICAgIHdoaWxlIChyb3cgPD0gbGFzdFJvdykgewogICAgICAgICAgICBmb2xkTGluZSA9IHRoaXMuZ2V0Rm9sZExpbmUocm93LCBmb2xkTGluZSk7CiAgICAgICAgICAgIGlmICghZm9sZExpbmUpIHsKICAgICAgICAgICAgICAgIHRva2VucyA9IHRoaXMuJGdldERpc3BsYXlUb2tlbnMobGFuZy5zdHJpbmdUcmltUmlnaHQobGluZXNbcm93XSkpOwogICAgICAgICAgICAgICAgd3JhcERhdGFbcm93XSA9IHRoaXMuJGNvbXB1dGVXcmFwU3BsaXRzKHRva2Vucywgd3JhcExpbWl0LCB0YWJTaXplKTsKICAgICAgICAgICAgICAgIHJvdyArKzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRva2VucyA9IFtdOwogICAgICAgICAgICAgICAgZm9sZExpbmUud2FsaygKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihwbGFjZWhvbGRlciwgcm93LCBjb2x1bW4sIGxhc3RDb2x1bW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdhbGtUb2tlbnM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGFjZWhvbGRlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Fsa1Rva2VucyA9IHRoaXMuJGdldERpc3BsYXlUb2tlbnMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXIsIHRva2Vucy5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Fsa1Rva2Vuc1swXSA9IFBMQUNFSE9MREVSX1NUQVJUOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCB3YWxrVG9rZW5zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Fsa1Rva2Vuc1tpXSA9IFBMQUNFSE9MREVSX0JPRFk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWxrVG9rZW5zID0gdGhpcy4kZ2V0RGlzcGxheVRva2VucygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc1tyb3ddLnN1YnN0cmluZyhsYXN0Q29sdW1uLCBjb2x1bW4pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2Vucy5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VucyA9IHRva2Vucy5jb25jYXQod2Fsa1Rva2Vucyk7CiAgICAgICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpLAogICAgICAgICAgICAgICAgICAgIGZvbGRMaW5lLmVuZC5yb3csCiAgICAgICAgICAgICAgICAgICAgbGluZXNbZm9sZExpbmUuZW5kLnJvd10ubGVuZ3RoICsgMQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBzcGFjZXMvdGFicyBmcm9tIHRoZSBiYWNrIG9mIHRoZSB0b2tlbiBhcnJheS4KICAgICAgICAgICAgICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoICE9IDAgJiYgdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXSA+PSBTUEFDRSkKICAgICAgICAgICAgICAgICAgICB0b2tlbnMucG9wKCk7CgogICAgICAgICAgICAgICAgd3JhcERhdGFbZm9sZExpbmUuc3RhcnQucm93XQogICAgICAgICAgICAgICAgICAgID0gdGhpcy4kY29tcHV0ZVdyYXBTcGxpdHModG9rZW5zLCB3cmFwTGltaXQsIHRhYlNpemUpOwogICAgICAgICAgICAgICAgcm93ID0gZm9sZExpbmUuZW5kLnJvdyArIDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIC8vICJUb2tlbnMiCiAgICB2YXIgQ0hBUiA9IDEsCiAgICAgICAgQ0hBUl9FWFQgPSAyLAogICAgICAgIFBMQUNFSE9MREVSX1NUQVJUID0gMywKICAgICAgICBQTEFDRUhPTERFUl9CT0RZID0gIDQsCiAgICAgICAgUFVOQ1RVQVRJT04gPSA5LAogICAgICAgIFNQQUNFID0gMTAsCiAgICAgICAgVEFCID0gMTEsCiAgICAgICAgVEFCX1NQQUNFID0gMTI7CgogICAgdGhpcy4kY29tcHV0ZVdyYXBTcGxpdHMgPSBmdW5jdGlvbih0b2tlbnMsIHdyYXBMaW1pdCkgewogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0KCiAgICAgICAgdmFyIHNwbGl0cyA9IFtdOwogICAgICAgIHZhciBkaXNwbGF5TGVuZ3RoID0gdG9rZW5zLmxlbmd0aDsKICAgICAgICB2YXIgbGFzdFNwbGl0ID0gMCwgbGFzdERvY1NwbGl0ID0gMDsKCiAgICAgICAgZnVuY3Rpb24gYWRkU3BsaXQoc2NyZWVuUG9zKSB7CiAgICAgICAgICAgIHZhciBkaXNwbGF5ZWQgPSB0b2tlbnMuc2xpY2UobGFzdFNwbGl0LCBzY3JlZW5Qb3MpOwoKICAgICAgICAgICAgLy8gVGhlIGRvY3VtZW50IHNpemUgaXMgdGhlIGN1cnJlbnQgc2l6ZSAtIHRoZSBleHRyYSB3aWR0aCBmb3IgdGFicwogICAgICAgICAgICAvLyBhbmQgbXVsdGlwbGVXaWR0aCBjaGFyYWN0ZXJzLgogICAgICAgICAgICB2YXIgbGVuID0gZGlzcGxheWVkLmxlbmd0aDsKICAgICAgICAgICAgZGlzcGxheWVkLmpvaW4oIiIpLgogICAgICAgICAgICAgICAgLy8gR2V0IGFsbCB0aGUgVEFCX1NQQUNFcy4KICAgICAgICAgICAgICAgIHJlcGxhY2UoLzEyL2csIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGxlbiAtPSAxOwogICAgICAgICAgICAgICAgfSkuCiAgICAgICAgICAgICAgICAvLyBHZXQgYWxsIHRoZSBDSEFSX0VYVC9tdWx0aXBsZVdpZHRoIGNoYXJhY3RlcnMuCiAgICAgICAgICAgICAgICByZXBsYWNlKC8yL2csIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGxlbiAtPSAxOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBsYXN0RG9jU3BsaXQgKz0gbGVuOwogICAgICAgICAgICBzcGxpdHMucHVzaChsYXN0RG9jU3BsaXQpOwogICAgICAgICAgICBsYXN0U3BsaXQgPSBzY3JlZW5Qb3M7CiAgICAgICAgfQoKICAgICAgICB3aGlsZSAoZGlzcGxheUxlbmd0aCAtIGxhc3RTcGxpdCA+IHdyYXBMaW1pdCkgewogICAgICAgICAgICAvLyBUaGlzIGlzLCB3aGVyZSB0aGUgc3BsaXQgc2hvdWxkIGJlLgogICAgICAgICAgICB2YXIgc3BsaXQgPSBsYXN0U3BsaXQgKyB3cmFwTGltaXQ7CgogICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHNwYWNlIG9yIHRhYiBhdCB0aGlzIHNwbGl0IHBvc2l0aW9uLCB0aGVuIG1ha2luZwogICAgICAgICAgICAvLyBhIHNwbGl0IGlzIHNpbXBsZS4KICAgICAgICAgICAgaWYgKHRva2Vuc1tzcGxpdF0gPj0gU1BBQ0UpIHsKICAgICAgICAgICAgICAgIC8vIEluY2x1ZGUgYWxsIGZvbGxvd2luZyBzcGFjZXMgKyB0YWJzIGluIHRoaXMgc3BsaXQgYXMgd2VsbC4KICAgICAgICAgICAgICAgIHdoaWxlICh0b2tlbnNbc3BsaXRdID49IFNQQUNFKSB7CiAgICAgICAgICAgICAgICAgICAgc3BsaXQgKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhZGRTcGxpdChzcGxpdCk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gPT09IEVMU0UgPT09CiAgICAgICAgICAgIC8vIENoZWNrIGlmIHNwbGl0IGlzIGluc2lkZSBvZiBhIHBsYWNlaG9sZGVyLiBQbGFjZWhvbGRlciBhcmUKICAgICAgICAgICAgLy8gbm90IHNwbGl0YWJsZS4gVGhlcmVmb3JlLCBzZWVrIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBsYWNlaG9sZGVyCiAgICAgICAgICAgIC8vIGFuZCB0cnkgdG8gcGxhY2UgdGhlIHNwbGl0IGJlb2ZyZSB0aGUgcGxhY2Vob2xkZXIncyBzdGFydC4KICAgICAgICAgICAgaWYgKHRva2Vuc1tzcGxpdF0gPT0gUExBQ0VIT0xERVJfU1RBUlQKICAgICAgICAgICAgICAgIHx8IHRva2Vuc1tzcGxpdF0gPT0gUExBQ0VIT0xERVJfQk9EWSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gU2VlayB0aGUgc3RhcnQgb2YgdGhlIHBsYWNlaG9sZGVyIGFuZCBkbyB0aGUgc3BsaXQKICAgICAgICAgICAgICAgIC8vIGJlZm9yZSB0aGUgcGxhY2Vob2xkZXIuIEJ5IGRlZmluaXRpb24gdGhlcmUgYWx3YXlzCiAgICAgICAgICAgICAgICAvLyBhIFBMQUNFSE9MREVSX1NUQVJUIGJldHdlZW4gc3BsaXQgYW5kIGxhc3RTcGxpdC4KICAgICAgICAgICAgICAgIGZvciAoc3BsaXQ7IHNwbGl0ICE9IGxhc3RTcGxpdCAtIDE7IHNwbGl0LS0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5zW3NwbGl0XSA9PSBQTEFDRUhPTERFUl9TVEFSVCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGxpdCsrOyA8PCBObyBpbmNyZW1lbnRhbCBoZXJlIGFzIHdlIHdhbnQgdG8KICAgICAgICAgICAgICAgICAgICAgICAgLy8gIGhhdmUgdGhlIHBvc2l0aW9uIGJlZm9yZSB0aGUgUGxhY2Vob2xkZXIuCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgUExBQ0VIT0xERVJfU1RBUlQgaXMgbm90IHRoZSBpbmRleCBvZiB0aGUKICAgICAgICAgICAgICAgIC8vIGxhc3Qgc3BsaXQsIHRoZW4gd2UgY2FuIGRvIHRoZSBzcGxpdAogICAgICAgICAgICAgICAgaWYgKHNwbGl0ID4gbGFzdFNwbGl0KSB7CiAgICAgICAgICAgICAgICAgICAgYWRkU3BsaXQoc3BsaXQpOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIElmIHRoZSBQTEFDRUhPTERFUl9TVEFSVCBJUyB0aGUgaW5kZXggb2YgdGhlIGxhc3QKICAgICAgICAgICAgICAgIC8vIHNwbGl0LCB0aGVuIHdlIGhhdmUgdG8gcGxhY2UgdGhlIHNwbGl0IGFmdGVyIHRoZQogICAgICAgICAgICAgICAgLy8gcGxhY2Vob2xkZXIuIFNvLCBsZXQncyBzZWVrIGZvciB0aGUgZW5kIG9mIHRoZSBwbGFjZWhvbGRlci4KICAgICAgICAgICAgICAgIHNwbGl0ID0gbGFzdFNwbGl0ICsgd3JhcExpbWl0OwogICAgICAgICAgICAgICAgZm9yIChzcGxpdDsgc3BsaXQgPCB0b2tlbnMubGVuZ3RoOyBzcGxpdCsrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2Vuc1tzcGxpdF0gIT0gUExBQ0VIT0xERVJfQk9EWSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBJZiBzcGlsdCA9PSB0b2tlbnMubGVuZ3RoLCB0aGVuIHRoZSBwbGFjZWhvbGRlciBpcyB0aGUgbGFzdAogICAgICAgICAgICAgICAgLy8gdGhpbmcgaW4gdGhlIGxpbmUgYW5kIGFkZGluZyBhIG5ldyBzcGxpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UuCiAgICAgICAgICAgICAgICBpZiAoc3BsaXQgPT0gdG9rZW5zLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgLy8gQnJlYWtzIHRoZSB3aGlsZS1sb29wLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIEZpbmFsbHksIGFkZCB0aGUgc3BsaXQuLi4KICAgICAgICAgICAgICAgIGFkZFNwbGl0KHNwbGl0KTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyA9PT0gRUxTRSA9PT0KICAgICAgICAgICAgLy8gU2VhcmNoIGZvciB0aGUgZmlyc3Qgbm9uIHNwYWNlL3RhYi9wbGFjZWhvbGRlci9wdW5jdHVhdGlvbiB0b2tlbiBiYWNrd2FyZHMuCiAgICAgICAgICAgIHZhciBtaW5TcGxpdCA9IE1hdGgubWF4KHNwbGl0IC0gMTAsIGxhc3RTcGxpdCAtIDEpOwogICAgICAgICAgICB3aGlsZSAoc3BsaXQgPiBtaW5TcGxpdCAmJiB0b2tlbnNbc3BsaXRdIDwgUExBQ0VIT0xERVJfU1RBUlQpIHsKICAgICAgICAgICAgICAgIHNwbGl0IC0tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlIChzcGxpdCA+IG1pblNwbGl0ICYmIHRva2Vuc1tzcGxpdF0gPT0gUFVOQ1RVQVRJT04pIHsKICAgICAgICAgICAgICAgIHNwbGl0IC0tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIElmIHdlIGZvdW5kIG9uZSwgdGhlbiBhZGQgdGhlIHNwbGl0LgogICAgICAgICAgICBpZiAoc3BsaXQgPiBtaW5TcGxpdCkgewogICAgICAgICAgICAgICAgYWRkU3BsaXQoKytzcGxpdCk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gPT09IEVMU0UgPT09CiAgICAgICAgICAgIHNwbGl0ID0gbGFzdFNwbGl0ICsgd3JhcExpbWl0OwogICAgICAgICAgICAvLyBUaGUgc3BsaXQgaXMgaW5zaWRlIG9mIGEgQ0hBUiBvciBDSEFSX0VYVCB0b2tlbiBhbmQgbm8gc3BhY2UKICAgICAgICAgICAgLy8gYXJvdW5kIC0+IGZvcmNlIGEgc3BsaXQuCiAgICAgICAgICAgIGFkZFNwbGl0KHNwbGl0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNwbGl0czsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbQogICAgICogICBvZmZzZXQ6IFRoZSBvZmZzZXQgaW4gc2NyZWVuQ29sdW1uIGF0IHdoaWNoIHBvc2l0aW9uIHN0ciBzdGFydHMuCiAgICAgKiAgICAgICAgICAgSW1wb3J0YW50IGZvciBjYWxjdWxhdGluZyB0aGUgcmVhbFRhYlNpemUuCiAgICAgKi8KICAgIHRoaXMuJGdldERpc3BsYXlUb2tlbnMgPSBmdW5jdGlvbihzdHIsIG9mZnNldCkgewogICAgICAgIHZhciBhcnIgPSBbXTsKICAgICAgICB2YXIgdGFiU2l6ZTsKICAgICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDsKCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGMgPSBzdHIuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgLy8gVGFiCiAgICAgICAgICAgIGlmIChjID09IDkpIHsKICAgICAgICAgICAgICAgIHRhYlNpemUgPSB0aGlzLmdldFNjcmVlblRhYlNpemUoYXJyLmxlbmd0aCArIG9mZnNldCk7CiAgICAgICAgICAgICAgICBhcnIucHVzaChUQUIpOwogICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDE7IG4gPCB0YWJTaXplOyBuKyspIHsKICAgICAgICAgICAgICAgICAgICBhcnIucHVzaChUQUJfU1BBQ0UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFNwYWNlCiAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gMzIpIHsKICAgICAgICAgICAgICAgIGFyci5wdXNoKFNQQUNFKTsKICAgICAgICAgICAgfSBlbHNlIGlmKChjID4gMzkgJiYgYyA8IDQ4KSB8fCAoYyA+IDU3ICYmIGMgPCA2NCkpIHsKICAgICAgICAgICAgICAgIGFyci5wdXNoKFBVTkNUVUFUSU9OKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBmdWxsIHdpZHRoIGNoYXJhY3RlcnMKICAgICAgICAgICAgZWxzZSBpZiAoYyA+PSAweDExMDAgJiYgaXNGdWxsV2lkdGgoYykpIHsKICAgICAgICAgICAgICAgIGFyci5wdXNoKENIQVIsIENIQVJfRVhUKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGFyci5wdXNoKENIQVIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBhcnI7CiAgICB9CgogICAgLyoqCiAgICAgKiBDYWxjdWxhdGVzIHRoZSB3aWR0aCBvZiB0aGUgYSBzdHJpbmcgb24gdGhlIHNjcmVlbiB3aGlsZSBhc3N1bWluZyB0aGF0CiAgICAgKiB0aGUgc3RyaW5nIHN0YXJ0cyBhdCB0aGUgZmlyc3QgY29sdW1uIG9uIHRoZSBzY3JlZW4uCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyBzdHIgU3RyaW5nIHRvIGNhbGN1bGF0ZSB0aGUgc2NyZWVuIHdpZHRoIG9mCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKiAgICAgIFswXTogbnVtYmVyIG9mIGNvbHVtbnMgZm9yIHN0ciBvbiBzY3JlZW4uCiAgICAgKiAgICAgIFsxXTogZG9jQ29sdW1uIHBvc2l0aW9uIHRoYXQgd2FzIHJlYWQgdW50aWwgKHVzZWZ1bCB3aXRoIHNjcmVlbkNvbHVtbikKICAgICAqLwogICAgdGhpcy4kZ2V0U3RyaW5nU2NyZWVuV2lkdGggPSBmdW5jdGlvbihzdHIsIG1heFNjcmVlbkNvbHVtbiwgc2NyZWVuQ29sdW1uKSB7CiAgICAgICAgaWYgKG1heFNjcmVlbkNvbHVtbiA9PSAwKSB7CiAgICAgICAgICAgIHJldHVybiBbMCwgMF07CiAgICAgICAgfQogICAgICAgIGlmIChtYXhTY3JlZW5Db2x1bW4gPT0gbnVsbCkgewogICAgICAgICAgICBtYXhTY3JlZW5Db2x1bW4gPSBzY3JlZW5Db2x1bW4gKwogICAgICAgICAgICAgICAgc3RyLmxlbmd0aCAqIE1hdGgubWF4KHRoaXMuZ2V0VGFiU2l6ZSgpLCAyKTsKICAgICAgICB9CiAgICAgICAgc2NyZWVuQ29sdW1uID0gc2NyZWVuQ29sdW1uIHx8IDA7CgogICAgICAgIHZhciBjLCBjb2x1bW47CiAgICAgICAgZm9yIChjb2x1bW4gPSAwOyBjb2x1bW4gPCBzdHIubGVuZ3RoOyBjb2x1bW4rKykgewogICAgICAgICAgICBjID0gc3RyLmNoYXJDb2RlQXQoY29sdW1uKTsKICAgICAgICAgICAgLy8gdGFiCiAgICAgICAgICAgIGlmIChjID09IDkpIHsKICAgICAgICAgICAgICAgIHNjcmVlbkNvbHVtbiArPSB0aGlzLmdldFNjcmVlblRhYlNpemUoc2NyZWVuQ29sdW1uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBmdWxsIHdpZHRoIGNoYXJhY3RlcnMKICAgICAgICAgICAgZWxzZSBpZiAoYyA+PSAweDExMDAgJiYgaXNGdWxsV2lkdGgoYykpIHsKICAgICAgICAgICAgICAgIHNjcmVlbkNvbHVtbiArPSAyOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc2NyZWVuQ29sdW1uICs9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNjcmVlbkNvbHVtbiA+IG1heFNjcmVlbkNvbHVtbikgewogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFtzY3JlZW5Db2x1bW4sIGNvbHVtbl07CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cyByZXF1aXJlZCB0byByZW5kZXIgdGhpcyByb3cgb24gdGhlIHNjcmVlbgogICAgICovCiAgICB0aGlzLmdldFJvd0xlbmd0aCA9IGZ1bmN0aW9uKHJvdykgewogICAgICAgIGlmICghdGhpcy4kdXNlV3JhcE1vZGUgfHwgIXRoaXMuJHdyYXBEYXRhW3Jvd10pIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHdyYXBEYXRhW3Jvd10ubGVuZ3RoICsgMTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBoZWlnaHQgaW4gcGl4ZWxzIHJlcXVpcmVkIHRvIHJlbmRlciB0aGlzIHJvdyBvbiB0aGUgc2NyZWVuCiAgICAgKiovCiAgICB0aGlzLmdldFJvd0hlaWdodCA9IGZ1bmN0aW9uKGNvbmZpZywgcm93KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Um93TGVuZ3RoKHJvdykgKiBjb25maWcubGluZUhlaWdodDsKICAgIH0KCiAgICB0aGlzLmdldFNjcmVlbkxhc3RSb3dDb2x1bW4gPSBmdW5jdGlvbihzY3JlZW5Sb3cpIHsKICAgICAgICAvL3JldHVybiB0aGlzLnNjcmVlblRvRG9jdW1lbnRDb2x1bW4oc2NyZWVuUm93LCBOdW1iZXIuTUFYX1ZBTFVFIC8gMTApCiAgICAgICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRUb1NjcmVlbkNvbHVtbihzY3JlZW5Sb3csIHRoaXMuZG9jLmdldExpbmUoc2NyZWVuUm93KS5sZW5ndGgpOwogICAgfTsKCiAgICB0aGlzLmdldERvY3VtZW50TGFzdFJvd0NvbHVtbiA9IGZ1bmN0aW9uKGRvY1JvdywgZG9jQ29sdW1uKSB7CiAgICAgICAgdmFyIHNjcmVlblJvdyA9IHRoaXMuZG9jdW1lbnRUb1NjcmVlblJvdyhkb2NSb3csIGRvY0NvbHVtbik7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2NyZWVuTGFzdFJvd0NvbHVtbihzY3JlZW5Sb3cpOwogICAgfTsKCiAgICB0aGlzLmdldERvY3VtZW50TGFzdFJvd0NvbHVtblBvc2l0aW9uID0gZnVuY3Rpb24oZG9jUm93LCBkb2NDb2x1bW4pIHsKICAgICAgICB2YXIgc2NyZWVuUm93ID0gdGhpcy5kb2N1bWVudFRvU2NyZWVuUm93KGRvY1JvdywgZG9jQ29sdW1uKTsKICAgICAgICByZXR1cm4gdGhpcy5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24oc2NyZWVuUm93LCBOdW1iZXIuTUFYX1ZBTFVFIC8gMTApOwogICAgfTsKCiAgICB0aGlzLmdldFJvd1NwbGl0RGF0YSA9IGZ1bmN0aW9uKHJvdykgewogICAgICAgIGlmICghdGhpcy4kdXNlV3JhcE1vZGUpIHsKICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gdGhpcy4kd3JhcERhdGFbcm93XTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgd2lkdGggb2YgYSB0YWIgY2hhcmFjdGVyIGF0IHNjcmVlbkNvbHVtbi4KICAgICAqLwogICAgdGhpcy5nZXRTY3JlZW5UYWJTaXplID0gZnVuY3Rpb24oc2NyZWVuQ29sdW1uKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJHRhYlNpemUgLSBzY3JlZW5Db2x1bW4gJSB0aGlzLiR0YWJTaXplOwogICAgfTsKCiAgICB0aGlzLnNjcmVlblRvRG9jdW1lbnRSb3cgPSBmdW5jdGlvbihzY3JlZW5Sb3csIHNjcmVlbkNvbHVtbikgewogICAgICAgIHJldHVybiB0aGlzLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihzY3JlZW5Sb3csIHNjcmVlbkNvbHVtbikucm93OwogICAgfTsKCiAgICB0aGlzLnNjcmVlblRvRG9jdW1lbnRDb2x1bW4gPSBmdW5jdGlvbihzY3JlZW5Sb3csIHNjcmVlbkNvbHVtbikgewogICAgICAgIHJldHVybiB0aGlzLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihzY3JlZW5Sb3csIHNjcmVlbkNvbHVtbikuY29sdW1uOwogICAgfTsKCiAgICB0aGlzLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbiA9IGZ1bmN0aW9uKHNjcmVlblJvdywgc2NyZWVuQ29sdW1uKSB7CiAgICAgICAgaWYgKHNjcmVlblJvdyA8IDApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHJvdzogMCwKICAgICAgICAgICAgICAgIGNvbHVtbjogMAogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgbGluZTsKICAgICAgICB2YXIgZG9jUm93ID0gMDsKICAgICAgICB2YXIgZG9jQ29sdW1uID0gMDsKICAgICAgICB2YXIgY29sdW1uOwogICAgICAgIHZhciByb3cgPSAwOwogICAgICAgIHZhciByb3dMZW5ndGggPSAwOwoKICAgICAgICB2YXIgcm93Q2FjaGUgPSB0aGlzLiRyb3dDYWNoZTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd0NhY2hlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChyb3dDYWNoZVtpXS5zY3JlZW5Sb3cgPCBzY3JlZW5Sb3cpIHsKICAgICAgICAgICAgICAgIHJvdyA9IHJvd0NhY2hlW2ldLnNjcmVlblJvdzsKICAgICAgICAgICAgICAgIGRvY1JvdyA9IHJvd0NhY2hlW2ldLmRvY1JvdzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciBkb0NhY2hlID0gIXJvd0NhY2hlLmxlbmd0aCB8fCBpID09IHJvd0NhY2hlLmxlbmd0aDsKCiAgICAgICAgdmFyIG1heFJvdyA9IHRoaXMuZ2V0TGVuZ3RoKCkgLSAxOwogICAgICAgIHZhciBmb2xkTGluZSA9IHRoaXMuZ2V0TmV4dEZvbGRMaW5lKGRvY1Jvdyk7CiAgICAgICAgdmFyIGZvbGRTdGFydCA9IGZvbGRMaW5lID8gZm9sZExpbmUuc3RhcnQucm93IDogSW5maW5pdHk7CgogICAgICAgIHdoaWxlIChyb3cgPD0gc2NyZWVuUm93KSB7CiAgICAgICAgICAgIHJvd0xlbmd0aCA9IHRoaXMuZ2V0Um93TGVuZ3RoKGRvY1Jvdyk7CiAgICAgICAgICAgIGlmIChyb3cgKyByb3dMZW5ndGggLSAxID49IHNjcmVlblJvdyB8fCBkb2NSb3cgPj0gbWF4Um93KSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJvdyArPSByb3dMZW5ndGg7CiAgICAgICAgICAgICAgICBkb2NSb3crKzsKICAgICAgICAgICAgICAgIGlmIChkb2NSb3cgPiBmb2xkU3RhcnQpIHsKICAgICAgICAgICAgICAgICAgICBkb2NSb3cgPSBmb2xkTGluZS5lbmQucm93KzE7CiAgICAgICAgICAgICAgICAgICAgZm9sZExpbmUgPSB0aGlzLmdldE5leHRGb2xkTGluZShkb2NSb3csIGZvbGRMaW5lKTsKICAgICAgICAgICAgICAgICAgICBmb2xkU3RhcnQgPSBmb2xkTGluZSA/IGZvbGRMaW5lLnN0YXJ0LnJvdyA6IEluZmluaXR5OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChkb0NhY2hlKSB7CiAgICAgICAgICAgICAgICByb3dDYWNoZS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICBkb2NSb3c6IGRvY1JvdywKICAgICAgICAgICAgICAgICAgICBzY3JlZW5Sb3c6IHJvdwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChmb2xkTGluZSAmJiBmb2xkTGluZS5zdGFydC5yb3cgPD0gZG9jUm93KSB7CiAgICAgICAgICAgIGxpbmUgPSB0aGlzLmdldEZvbGREaXNwbGF5TGluZShmb2xkTGluZSk7CiAgICAgICAgICAgIGRvY1JvdyA9IGZvbGRMaW5lLnN0YXJ0LnJvdzsKICAgICAgICB9IGVsc2UgaWYgKHJvdyArIHJvd0xlbmd0aCA8PSBzY3JlZW5Sb3cgfHwgZG9jUm93ID4gbWF4Um93KSB7CiAgICAgICAgICAgIC8vIGNsaXAgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHJvdzogbWF4Um93LAogICAgICAgICAgICAgICAgY29sdW1uOiB0aGlzLmdldExpbmUobWF4Um93KS5sZW5ndGgKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxpbmUgPSB0aGlzLmdldExpbmUoZG9jUm93KTsKICAgICAgICAgICAgZm9sZExpbmUgPSBudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMuJHVzZVdyYXBNb2RlKSB7CiAgICAgICAgICAgIHZhciBzcGxpdHMgPSB0aGlzLiR3cmFwRGF0YVtkb2NSb3ddOwogICAgICAgICAgICBpZiAoc3BsaXRzKSB7CiAgICAgICAgICAgICAgICBjb2x1bW4gPSBzcGxpdHNbc2NyZWVuUm93IC0gcm93XTsKICAgICAgICAgICAgICAgIGlmKHNjcmVlblJvdyA+IHJvdyAmJiBzcGxpdHMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgZG9jQ29sdW1uID0gc3BsaXRzW3NjcmVlblJvdyAtIHJvdyAtIDFdIHx8IHNwbGl0c1tzcGxpdHMubGVuZ3RoIC0gMV07CiAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKGRvY0NvbHVtbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGRvY0NvbHVtbiArPSB0aGlzLiRnZXRTdHJpbmdTY3JlZW5XaWR0aChsaW5lLCBzY3JlZW5Db2x1bW4pWzFdOwoKICAgICAgICAvLyBOZWVkIHRvIGRvIHNvbWUgY2xhbXBpbmcgYWN0aW9uIGhlcmUuCiAgICAgICAgaWYgKHRoaXMuJHVzZVdyYXBNb2RlKSB7CiAgICAgICAgICAgIGlmIChkb2NDb2x1bW4gPj0gY29sdW1uKSB7CiAgICAgICAgICAgICAgICAvLyBXZSByZW1vdmUgb25lIGNoYXJhY3RlciBhdCB0aGUgZW5kIHN1Y2ggdGhhdCB0aGUgZG9jQ29sdW1uCiAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbiByZXR1cm5lZCBpcyBub3QgYXNzb2NpYXRlZCB0byB0aGUgbmV4dCByb3cgb24gdGhlCiAgICAgICAgICAgICAgICAvLyBzY3JlZW4uCiAgICAgICAgICAgICAgICBkb2NDb2x1bW4gPSBjb2x1bW4gLSAxOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZG9jQ29sdW1uID0gTWF0aC5taW4oZG9jQ29sdW1uLCBsaW5lLmxlbmd0aCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoZm9sZExpbmUpIHsKICAgICAgICAgICAgcmV0dXJuIGZvbGRMaW5lLmlkeFRvUG9zaXRpb24oZG9jQ29sdW1uKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHJvdzogZG9jUm93LAogICAgICAgICAgICBjb2x1bW46IGRvY0NvbHVtbgogICAgICAgIH0KICAgIH07CgogICAgdGhpcy5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24gPSBmdW5jdGlvbihkb2NSb3csIGRvY0NvbHVtbikgewogICAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgcGFzc2VkIGluIGFyZ3VtZW50cy4KICAgICAgICBpZiAodHlwZW9mIGRvY0NvbHVtbiA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHZhciBwb3MgPSB0aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50KGRvY1Jvdy5yb3csIGRvY1Jvdy5jb2x1bW4pOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcG9zID0gdGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudChkb2NSb3csIGRvY0NvbHVtbik7CgogICAgICAgIGRvY1JvdyA9IHBvcy5yb3c7CiAgICAgICAgZG9jQ29sdW1uID0gcG9zLmNvbHVtbjsKCiAgICAgICAgdmFyIHdyYXBEYXRhOwogICAgICAgIC8vIFNwZWNpYWwgY2FzZSBpbiB3cmFwTW9kZSBpZiB0aGUgZG9jIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LgogICAgICAgIGlmICh0aGlzLiR1c2VXcmFwTW9kZSkgewogICAgICAgICAgICB3cmFwRGF0YSA9IHRoaXMuJHdyYXBEYXRhOwogICAgICAgICAgICBpZiAoZG9jUm93ID4gd3JhcERhdGEubGVuZ3RoIC0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByb3c6IHRoaXMuZ2V0U2NyZWVuTGVuZ3RoKCksCiAgICAgICAgICAgICAgICAgICAgY29sdW1uOiB3cmFwRGF0YS5sZW5ndGggPT0gMAogICAgICAgICAgICAgICAgICAgICAgICA/IDAKICAgICAgICAgICAgICAgICAgICAgICAgOiAod3JhcERhdGFbd3JhcERhdGEubGVuZ3RoIC0gMV0ubGVuZ3RoIC0gMSkKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHZhciBzY3JlZW5Sb3cgPSAwOwogICAgICAgIHZhciBmb2xkU3RhcnRSb3cgPSBudWxsOwogICAgICAgIHZhciBmb2xkID0gbnVsbDsKCiAgICAgICAgLy8gQ2xhbXAgdGhlIGRvY1JvdyBwb3NpdGlvbiBpbiBjYXNlIGl0J3MgaW5zaWRlIG9mIGEgZm9sZGVkIGJsb2NrLgogICAgICAgIGZvbGQgPSB0aGlzLmdldEZvbGRBdChkb2NSb3csIGRvY0NvbHVtbiwgMSk7CiAgICAgICAgaWYgKGZvbGQpIHsKICAgICAgICAgICAgZG9jUm93ID0gZm9sZC5zdGFydC5yb3c7CiAgICAgICAgICAgIGRvY0NvbHVtbiA9IGZvbGQuc3RhcnQuY29sdW1uOwogICAgICAgIH0KCiAgICAgICAgdmFyIHJvd0VuZCwgcm93ID0gMDsKICAgICAgICB2YXIgcm93Q2FjaGUgPSB0aGlzLiRyb3dDYWNoZTsKCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dDYWNoZS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAocm93Q2FjaGVbaV0uZG9jUm93IDwgZG9jUm93KSB7CiAgICAgICAgICAgICAgICBzY3JlZW5Sb3cgPSByb3dDYWNoZVtpXS5zY3JlZW5Sb3c7CiAgICAgICAgICAgICAgICByb3cgPSByb3dDYWNoZVtpXS5kb2NSb3c7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgZG9DYWNoZSA9ICFyb3dDYWNoZS5sZW5ndGggfHwgaSA9PSByb3dDYWNoZS5sZW5ndGg7CgogICAgICAgIHZhciBmb2xkTGluZSA9IHRoaXMuZ2V0TmV4dEZvbGRMaW5lKHJvdyk7CiAgICAgICAgdmFyIGZvbGRTdGFydCA9IGZvbGRMaW5lID9mb2xkTGluZS5zdGFydC5yb3cgOkluZmluaXR5OwoKICAgICAgICB3aGlsZSAocm93IDwgZG9jUm93KSB7CiAgICAgICAgICAgIGlmIChyb3cgPj0gZm9sZFN0YXJ0KSB7CiAgICAgICAgICAgICAgICByb3dFbmQgPSBmb2xkTGluZS5lbmQucm93ICsgMTsKICAgICAgICAgICAgICAgIGlmIChyb3dFbmQgPiBkb2NSb3cpCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBmb2xkTGluZSA9IHRoaXMuZ2V0TmV4dEZvbGRMaW5lKHJvd0VuZCwgZm9sZExpbmUpOwogICAgICAgICAgICAgICAgZm9sZFN0YXJ0ID0gZm9sZExpbmUgP2ZvbGRMaW5lLnN0YXJ0LnJvdyA6SW5maW5pdHk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByb3dFbmQgPSByb3cgKyAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBzY3JlZW5Sb3cgKz0gdGhpcy5nZXRSb3dMZW5ndGgocm93KTsKICAgICAgICAgICAgcm93ID0gcm93RW5kOwoKICAgICAgICAgICAgaWYgKGRvQ2FjaGUpIHsKICAgICAgICAgICAgICAgIHJvd0NhY2hlLnB1c2goewogICAgICAgICAgICAgICAgICAgIGRvY1Jvdzogcm93LAogICAgICAgICAgICAgICAgICAgIHNjcmVlblJvdzogc2NyZWVuUm93CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSB0ZXh0IGxpbmUgdGhhdCBpcyBkaXNwbGF5ZWQgaW4gZG9jUm93IG9uIHRoZSBzY3JlZW4uCiAgICAgICAgdmFyIHRleHRMaW5lID0gIiI7CiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZpbmFsIHJvdyB3ZSB3YW50IHRvIHJlYWNoIGlzIGluc2lkZSBvZiBhIGZvbGQuCiAgICAgICAgaWYgKGZvbGRMaW5lICYmIHJvdyA+PSBmb2xkU3RhcnQpIHsKICAgICAgICAgICAgdGV4dExpbmUgPSB0aGlzLmdldEZvbGREaXNwbGF5TGluZShmb2xkTGluZSwgZG9jUm93LCBkb2NDb2x1bW4pOwogICAgICAgICAgICBmb2xkU3RhcnRSb3cgPSBmb2xkTGluZS5zdGFydC5yb3c7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGV4dExpbmUgPSB0aGlzLmdldExpbmUoZG9jUm93KS5zdWJzdHJpbmcoMCwgZG9jQ29sdW1uKTsKICAgICAgICAgICAgZm9sZFN0YXJ0Um93ID0gZG9jUm93OwogICAgICAgIH0KICAgICAgICAvLyBDbGFtcCB0ZXh0TGluZSBpZiBpbiB3cmFwTW9kZS4KICAgICAgICBpZiAodGhpcy4kdXNlV3JhcE1vZGUpIHsKICAgICAgICAgICAgdmFyIHdyYXBSb3cgPSB3cmFwRGF0YVtmb2xkU3RhcnRSb3ddOwogICAgICAgICAgICB2YXIgc2NyZWVuUm93T2Zmc2V0ID0gMDsKICAgICAgICAgICAgd2hpbGUgKHRleHRMaW5lLmxlbmd0aCA+PSB3cmFwUm93W3NjcmVlblJvd09mZnNldF0pIHsKICAgICAgICAgICAgICAgIHNjcmVlblJvdyArKzsKICAgICAgICAgICAgICAgIHNjcmVlblJvd09mZnNldCsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRleHRMaW5lID0gdGV4dExpbmUuc3Vic3RyaW5nKAogICAgICAgICAgICAgICAgd3JhcFJvd1tzY3JlZW5Sb3dPZmZzZXQgLSAxXSB8fCAwLCB0ZXh0TGluZS5sZW5ndGgKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHJvdzogc2NyZWVuUm93LAogICAgICAgICAgICBjb2x1bW46IHRoaXMuJGdldFN0cmluZ1NjcmVlbldpZHRoKHRleHRMaW5lKVswXQogICAgICAgIH07CiAgICB9OwoKICAgIHRoaXMuZG9jdW1lbnRUb1NjcmVlbkNvbHVtbiA9IGZ1bmN0aW9uKHJvdywgZG9jQ29sdW1uKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHJvdywgZG9jQ29sdW1uKS5jb2x1bW47CiAgICB9OwoKICAgIHRoaXMuZG9jdW1lbnRUb1NjcmVlblJvdyA9IGZ1bmN0aW9uKGRvY1JvdywgZG9jQ29sdW1uKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKGRvY1JvdywgZG9jQ29sdW1uKS5yb3c7CiAgICB9OwoKICAgIHRoaXMuZ2V0U2NyZWVuTGVuZ3RoID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHNjcmVlblJvd3MgPSAwOwogICAgICAgIHZhciBmb2xkID0gbnVsbDsKICAgICAgICBpZiAoIXRoaXMuJHVzZVdyYXBNb2RlKSB7CiAgICAgICAgICAgIHNjcmVlblJvd3MgPSB0aGlzLmdldExlbmd0aCgpOwoKICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBmb2xkZWQgbGluZXMgYWdhaW4uCiAgICAgICAgICAgIHZhciBmb2xkRGF0YSA9IHRoaXMuJGZvbGREYXRhOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvbGREYXRhLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBmb2xkID0gZm9sZERhdGFbaV07CiAgICAgICAgICAgICAgICBzY3JlZW5Sb3dzIC09IGZvbGQuZW5kLnJvdyAtIGZvbGQuc3RhcnQucm93OwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFyIGxhc3RSb3cgPSB0aGlzLiR3cmFwRGF0YS5sZW5ndGg7CiAgICAgICAgICAgIHZhciByb3cgPSAwLCBpID0gMDsKICAgICAgICAgICAgdmFyIGZvbGQgPSB0aGlzLiRmb2xkRGF0YVtpKytdOwogICAgICAgICAgICB2YXIgZm9sZFN0YXJ0ID0gZm9sZCA/IGZvbGQuc3RhcnQucm93IDpJbmZpbml0eTsKCiAgICAgICAgICAgIHdoaWxlIChyb3cgPCBsYXN0Um93KSB7CiAgICAgICAgICAgICAgICBzY3JlZW5Sb3dzICs9IHRoaXMuJHdyYXBEYXRhW3Jvd10ubGVuZ3RoICsgMTsKICAgICAgICAgICAgICAgIHJvdyArKzsKICAgICAgICAgICAgICAgIGlmIChyb3cgPiBmb2xkU3RhcnQpIHsKICAgICAgICAgICAgICAgICAgICByb3cgPSBmb2xkLmVuZC5yb3crMTsKICAgICAgICAgICAgICAgICAgICBmb2xkID0gdGhpcy4kZm9sZERhdGFbaSsrXTsKICAgICAgICAgICAgICAgICAgICBmb2xkU3RhcnQgPSBmb2xkID9mb2xkLnN0YXJ0LnJvdyA6SW5maW5pdHk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBzY3JlZW5Sb3dzOwogICAgfQoKICAgIC8vIEZvciBldmVyeSBrZXlzdHJva2UgdGhpcyBnZXRzIGNhbGxlZCBvbmNlIHBlciBjaGFyIGluIHRoZSB3aG9sZSBkb2MhIQogICAgLy8gV291bGRuJ3QgaHVydCB0byBtYWtlIGl0IGEgYml0IGZhc3RlciBmb3IgYyA+PSAweDExMDAKICAgIGZ1bmN0aW9uIGlzRnVsbFdpZHRoKGMpIHsKICAgICAgICBpZiAoYyA8IDB4MTEwMCkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIHJldHVybiBjID49IDB4MTEwMCAmJiBjIDw9IDB4MTE1RiB8fAogICAgICAgICAgICAgICBjID49IDB4MTFBMyAmJiBjIDw9IDB4MTFBNyB8fAogICAgICAgICAgICAgICBjID49IDB4MTFGQSAmJiBjIDw9IDB4MTFGRiB8fAogICAgICAgICAgICAgICBjID49IDB4MjMyOSAmJiBjIDw9IDB4MjMyQSB8fAogICAgICAgICAgICAgICBjID49IDB4MkU4MCAmJiBjIDw9IDB4MkU5OSB8fAogICAgICAgICAgICAgICBjID49IDB4MkU5QiAmJiBjIDw9IDB4MkVGMyB8fAogICAgICAgICAgICAgICBjID49IDB4MkYwMCAmJiBjIDw9IDB4MkZENSB8fAogICAgICAgICAgICAgICBjID49IDB4MkZGMCAmJiBjIDw9IDB4MkZGQiB8fAogICAgICAgICAgICAgICBjID49IDB4MzAwMCAmJiBjIDw9IDB4MzAzRSB8fAogICAgICAgICAgICAgICBjID49IDB4MzA0MSAmJiBjIDw9IDB4MzA5NiB8fAogICAgICAgICAgICAgICBjID49IDB4MzA5OSAmJiBjIDw9IDB4MzBGRiB8fAogICAgICAgICAgICAgICBjID49IDB4MzEwNSAmJiBjIDw9IDB4MzEyRCB8fAogICAgICAgICAgICAgICBjID49IDB4MzEzMSAmJiBjIDw9IDB4MzE4RSB8fAogICAgICAgICAgICAgICBjID49IDB4MzE5MCAmJiBjIDw9IDB4MzFCQSB8fAogICAgICAgICAgICAgICBjID49IDB4MzFDMCAmJiBjIDw9IDB4MzFFMyB8fAogICAgICAgICAgICAgICBjID49IDB4MzFGMCAmJiBjIDw9IDB4MzIxRSB8fAogICAgICAgICAgICAgICBjID49IDB4MzIyMCAmJiBjIDw9IDB4MzI0NyB8fAogICAgICAgICAgICAgICBjID49IDB4MzI1MCAmJiBjIDw9IDB4MzJGRSB8fAogICAgICAgICAgICAgICBjID49IDB4MzMwMCAmJiBjIDw9IDB4NERCRiB8fAogICAgICAgICAgICAgICBjID49IDB4NEUwMCAmJiBjIDw9IDB4QTQ4QyB8fAogICAgICAgICAgICAgICBjID49IDB4QTQ5MCAmJiBjIDw9IDB4QTRDNiB8fAogICAgICAgICAgICAgICBjID49IDB4QTk2MCAmJiBjIDw9IDB4QTk3QyB8fAogICAgICAgICAgICAgICBjID49IDB4QUMwMCAmJiBjIDw9IDB4RDdBMyB8fAogICAgICAgICAgICAgICBjID49IDB4RDdCMCAmJiBjIDw9IDB4RDdDNiB8fAogICAgICAgICAgICAgICBjID49IDB4RDdDQiAmJiBjIDw9IDB4RDdGQiB8fAogICAgICAgICAgICAgICBjID49IDB4RjkwMCAmJiBjIDw9IDB4RkFGRiB8fAogICAgICAgICAgICAgICBjID49IDB4RkUxMCAmJiBjIDw9IDB4RkUxOSB8fAogICAgICAgICAgICAgICBjID49IDB4RkUzMCAmJiBjIDw9IDB4RkU1MiB8fAogICAgICAgICAgICAgICBjID49IDB4RkU1NCAmJiBjIDw9IDB4RkU2NiB8fAogICAgICAgICAgICAgICBjID49IDB4RkU2OCAmJiBjIDw9IDB4RkU2QiB8fAogICAgICAgICAgICAgICBjID49IDB4RkYwMSAmJiBjIDw9IDB4RkY2MCB8fAogICAgICAgICAgICAgICBjID49IDB4RkZFMCAmJiBjIDw9IDB4RkZFNjsKICAgIH07Cgp9KS5jYWxsKEVkaXRTZXNzaW9uLnByb3RvdHlwZSk7CgpyZXF1aXJlKCIuL2VkaXRfc2Vzc2lvbi9mb2xkaW5nIikuRm9sZGluZy5jYWxsKEVkaXRTZXNzaW9uLnByb3RvdHlwZSk7CnJlcXVpcmUoIi4vZWRpdF9zZXNzaW9uL2JyYWNrZXRfbWF0Y2giKS5CcmFja2V0TWF0Y2guY2FsbChFZGl0U2Vzc2lvbi5wcm90b3R5cGUpOwoKZXhwb3J0cy5FZGl0U2Vzc2lvbiA9IEVkaXRTZXNzaW9uOwp9KTsKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKiAgICAgIEp1bGlhbiBWaWVyZWNrIDxqdWxpYW4udmllcmVja0BnbWFpbC5jb20+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9zZWxlY3Rpb24nLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbGliL2V2ZW50X2VtaXR0ZXInLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi9saWIvb29wIik7CnZhciBsYW5nID0gcmVxdWlyZSgiLi9saWIvbGFuZyIpOwp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi9yYW5nZSIpLlJhbmdlOwoKLyoqCiAqIEtlZXBzIGN1cnNvciBwb3NpdGlvbiBhbmQgdGhlIHRleHQgc2VsZWN0aW9uIG9mIGFuIGVkaXQgc2Vzc2lvbi4KICoKICogVGhlIHJvdy9jb2x1bW5zIHVzZWQgaW4gdGhlIHNlbGVjdGlvbiBhcmUgaW4gZG9jdW1lbnQgY29vcmRpbmF0ZXMKICogcmVwcmVzZW50aW5nIHRocyBjb29yZGluYXRlcyBhcyB0aGV6IGFwcGVhciBpbiB0aGUgZG9jdW1lbnQKICogYmVmb3JlIGFwcGx5aW5nIHNvZnQgd3JhcCBhbmQgZm9sZGluZy4KICovCnZhciBTZWxlY3Rpb24gPSBmdW5jdGlvbihzZXNzaW9uKSB7CiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uOwogICAgdGhpcy5kb2MgPSBzZXNzaW9uLmdldERvY3VtZW50KCk7CgogICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOwogICAgdGhpcy5zZWxlY3Rpb25MZWFkID0gdGhpcy5kb2MuY3JlYXRlQW5jaG9yKDAsIDApOwogICAgdGhpcy5zZWxlY3Rpb25BbmNob3IgPSB0aGlzLmRvYy5jcmVhdGVBbmNob3IoMCwgMCk7CgogICAgdmFyIF9zZWxmID0gdGhpczsKICAgIHRoaXMuc2VsZWN0aW9uTGVhZC5vbigiY2hhbmdlIiwgZnVuY3Rpb24oZSkgewogICAgICAgIF9zZWxmLl9lbWl0KCJjaGFuZ2VDdXJzb3IiKTsKICAgICAgICBpZiAoIV9zZWxmLiRpc0VtcHR5KQogICAgICAgICAgICBfc2VsZi5fZW1pdCgiY2hhbmdlU2VsZWN0aW9uIik7CiAgICAgICAgaWYgKCFfc2VsZi4kcHJldmVudFVwZGF0ZURlc2lyZWRDb2x1bW5PbkNoYW5nZSAmJiBlLm9sZC5jb2x1bW4gIT0gZS52YWx1ZS5jb2x1bW4pCiAgICAgICAgICAgIF9zZWxmLiR1cGRhdGVEZXNpcmVkQ29sdW1uKCk7CiAgICB9KTsKCiAgICB0aGlzLnNlbGVjdGlvbkFuY2hvci5vbigiY2hhbmdlIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKCFfc2VsZi4kaXNFbXB0eSkKICAgICAgICAgICAgX3NlbGYuX2VtaXQoImNoYW5nZVNlbGVjdGlvbiIpOwogICAgfSk7Cn07CgooZnVuY3Rpb24oKSB7CgogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOwoKICAgIHRoaXMuaXNFbXB0eSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAodGhpcy4kaXNFbXB0eSB8fCAoCiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uQW5jaG9yLnJvdyA9PSB0aGlzLnNlbGVjdGlvbkxlYWQucm93ICYmCiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uQW5jaG9yLmNvbHVtbiA9PSB0aGlzLnNlbGVjdGlvbkxlYWQuY29sdW1uCiAgICAgICAgKSk7CiAgICB9OwoKICAgIHRoaXMuaXNNdWx0aUxpbmUgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmFuZ2UoKS5pc011bHRpTGluZSgpOwogICAgfTsKCiAgICB0aGlzLmdldEN1cnNvciA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbkxlYWQuZ2V0UG9zaXRpb24oKTsKICAgIH07CgogICAgdGhpcy5zZXRTZWxlY3Rpb25BbmNob3IgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIHRoaXMuc2VsZWN0aW9uQW5jaG9yLnNldFBvc2l0aW9uKHJvdywgY29sdW1uKTsKCiAgICAgICAgaWYgKHRoaXMuJGlzRW1wdHkpIHsKICAgICAgICAgICAgdGhpcy4kaXNFbXB0eSA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2VTZWxlY3Rpb24iKTsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMuZ2V0U2VsZWN0aW9uQW5jaG9yID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuJGlzRW1wdHkpCiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFNlbGVjdGlvbkxlYWQoKQogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uQW5jaG9yLmdldFBvc2l0aW9uKCk7CiAgICB9OwoKICAgIHRoaXMuZ2V0U2VsZWN0aW9uTGVhZCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbkxlYWQuZ2V0UG9zaXRpb24oKTsKICAgIH07CgogICAgdGhpcy5zaGlmdFNlbGVjdGlvbiA9IGZ1bmN0aW9uKGNvbHVtbnMpIHsKICAgICAgICBpZiAodGhpcy4kaXNFbXB0eSkgewogICAgICAgICAgICB0aGlzLm1vdmVDdXJzb3JUbyh0aGlzLnNlbGVjdGlvbkxlYWQucm93LCB0aGlzLnNlbGVjdGlvbkxlYWQuY29sdW1uICsgY29sdW1ucyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9OwoKICAgICAgICB2YXIgYW5jaG9yID0gdGhpcy5nZXRTZWxlY3Rpb25BbmNob3IoKTsKICAgICAgICB2YXIgbGVhZCA9IHRoaXMuZ2V0U2VsZWN0aW9uTGVhZCgpOwoKICAgICAgICB2YXIgaXNCYWNrd2FyZHMgPSB0aGlzLmlzQmFja3dhcmRzKCk7CgogICAgICAgIGlmICghaXNCYWNrd2FyZHMgfHwgYW5jaG9yLmNvbHVtbiAhPT0gMCkKICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb25BbmNob3IoYW5jaG9yLnJvdywgYW5jaG9yLmNvbHVtbiArIGNvbHVtbnMpOwoKICAgICAgICBpZiAoaXNCYWNrd2FyZHMgfHwgbGVhZC5jb2x1bW4gIT09IDApIHsKICAgICAgICAgICAgdGhpcy4kbW92ZVNlbGVjdGlvbihmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvclRvKGxlYWQucm93LCBsZWFkLmNvbHVtbiArIGNvbHVtbnMpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMuaXNCYWNrd2FyZHMgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYW5jaG9yID0gdGhpcy5zZWxlY3Rpb25BbmNob3I7CiAgICAgICAgdmFyIGxlYWQgPSB0aGlzLnNlbGVjdGlvbkxlYWQ7CiAgICAgICAgcmV0dXJuIChhbmNob3Iucm93ID4gbGVhZC5yb3cgfHwgKGFuY2hvci5yb3cgPT0gbGVhZC5yb3cgJiYgYW5jaG9yLmNvbHVtbiA+IGxlYWQuY29sdW1uKSk7CiAgICB9OwoKICAgIHRoaXMuZ2V0UmFuZ2UgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYW5jaG9yID0gdGhpcy5zZWxlY3Rpb25BbmNob3I7CiAgICAgICAgdmFyIGxlYWQgPSB0aGlzLnNlbGVjdGlvbkxlYWQ7CgogICAgICAgIGlmICh0aGlzLmlzRW1wdHkoKSkKICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMobGVhZCwgbGVhZCk7CgogICAgICAgIGlmICh0aGlzLmlzQmFja3dhcmRzKCkpIHsKICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMobGVhZCwgYW5jaG9yKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKGFuY2hvciwgbGVhZCk7CiAgICAgICAgfQogICAgfTsKCiAgICB0aGlzLmNsZWFyU2VsZWN0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKCF0aGlzLiRpc0VtcHR5KSB7CiAgICAgICAgICAgIHRoaXMuJGlzRW1wdHkgPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2VTZWxlY3Rpb24iKTsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMuc2VsZWN0QWxsID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGxhc3RSb3cgPSB0aGlzLmRvYy5nZXRMZW5ndGgoKSAtIDE7CiAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb25BbmNob3IobGFzdFJvdywgdGhpcy5kb2MuZ2V0TGluZShsYXN0Um93KS5sZW5ndGgpOwogICAgICAgIHRoaXMubW92ZUN1cnNvclRvKDAsIDApOwogICAgfTsKCiAgICB0aGlzLnNldFNlbGVjdGlvblJhbmdlID0gZnVuY3Rpb24ocmFuZ2UsIHJldmVyc2UpIHsKICAgICAgICBpZiAocmV2ZXJzZSkgewogICAgICAgICAgICB0aGlzLnNldFNlbGVjdGlvbkFuY2hvcihyYW5nZS5lbmQucm93LCByYW5nZS5lbmQuY29sdW1uKTsKICAgICAgICAgICAgdGhpcy5zZWxlY3RUbyhyYW5nZS5zdGFydC5yb3csIHJhbmdlLnN0YXJ0LmNvbHVtbik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb25BbmNob3IocmFuZ2Uuc3RhcnQucm93LCByYW5nZS5zdGFydC5jb2x1bW4pOwogICAgICAgICAgICB0aGlzLnNlbGVjdFRvKHJhbmdlLmVuZC5yb3csIHJhbmdlLmVuZC5jb2x1bW4pOwogICAgICAgIH0KICAgICAgICB0aGlzLiR1cGRhdGVEZXNpcmVkQ29sdW1uKCk7CiAgICB9OwoKICAgIHRoaXMuJHVwZGF0ZURlc2lyZWRDb2x1bW4gPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgY3Vyc29yID0gdGhpcy5nZXRDdXJzb3IoKTsKICAgICAgICB0aGlzLiRkZXNpcmVkQ29sdW1uID0gdGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Db2x1bW4oY3Vyc29yLnJvdywgY3Vyc29yLmNvbHVtbik7CiAgICB9OwoKICAgIHRoaXMuJG1vdmVTZWxlY3Rpb24gPSBmdW5jdGlvbihtb3ZlcikgewogICAgICAgIHZhciBsZWFkID0gdGhpcy5zZWxlY3Rpb25MZWFkOwogICAgICAgIGlmICh0aGlzLiRpc0VtcHR5KQogICAgICAgICAgICB0aGlzLnNldFNlbGVjdGlvbkFuY2hvcihsZWFkLnJvdywgbGVhZC5jb2x1bW4pOwoKICAgICAgICBtb3Zlci5jYWxsKHRoaXMpOwogICAgfTsKCiAgICB0aGlzLnNlbGVjdFRvID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsKICAgICAgICB0aGlzLiRtb3ZlU2VsZWN0aW9uKGZ1bmN0aW9uKCkgewogICAgICAgICAgICB0aGlzLm1vdmVDdXJzb3JUbyhyb3csIGNvbHVtbik7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIHRoaXMuc2VsZWN0VG9Qb3NpdGlvbiA9IGZ1bmN0aW9uKHBvcykgewogICAgICAgIHRoaXMuJG1vdmVTZWxlY3Rpb24oZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvclRvUG9zaXRpb24ocG9zKTsKICAgICAgICB9KTsKICAgIH07CgogICAgdGhpcy5zZWxlY3RVcCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yVXApOwogICAgfTsKCiAgICB0aGlzLnNlbGVjdERvd24gPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvckRvd24pOwogICAgfTsKCiAgICB0aGlzLnNlbGVjdFJpZ2h0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JSaWdodCk7CiAgICB9OwoKICAgIHRoaXMuc2VsZWN0TGVmdCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yTGVmdCk7CiAgICB9OwoKICAgIHRoaXMuc2VsZWN0TGluZVN0YXJ0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JMaW5lU3RhcnQpOwogICAgfTsKCiAgICB0aGlzLnNlbGVjdExpbmVFbmQgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvckxpbmVFbmQpOwogICAgfTsKCiAgICB0aGlzLnNlbGVjdEZpbGVFbmQgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvckZpbGVFbmQpOwogICAgfTsKCiAgICB0aGlzLnNlbGVjdEZpbGVTdGFydCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yRmlsZVN0YXJ0KTsKICAgIH07CgogICAgdGhpcy5zZWxlY3RXb3JkUmlnaHQgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvcldvcmRSaWdodCk7CiAgICB9OwoKICAgIHRoaXMuc2VsZWN0V29yZExlZnQgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvcldvcmRMZWZ0KTsKICAgIH07CgogICAgdGhpcy5zZWxlY3RXb3JkID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGN1cnNvciA9IHRoaXMuZ2V0Q3Vyc29yKCk7CiAgICAgICAgdmFyIHJhbmdlICA9IHRoaXMuc2Vzc2lvbi5nZXRXb3JkUmFuZ2UoY3Vyc29yLnJvdywgY3Vyc29yLmNvbHVtbik7CiAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb25SYW5nZShyYW5nZSk7CiAgICB9OwoKICAgIC8vIFNlbGVjdHMgYSB3b3JkIGluY2x1ZGluZyBpdHMgcmlnaHQgd2hpdGVzcGFjZQogICAgdGhpcy5zZWxlY3RBV29yZCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBjdXJzb3IgPSB0aGlzLmdldEN1cnNvcigpOwogICAgICAgIHZhciByYW5nZSA9IHRoaXMuc2Vzc2lvbi5nZXRBV29yZFJhbmdlKGN1cnNvci5yb3csIGN1cnNvci5jb2x1bW4pOwogICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uUmFuZ2UocmFuZ2UpOwogICAgfTsKCiAgICB0aGlzLnNlbGVjdExpbmUgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgcm93U3RhcnQgPSB0aGlzLnNlbGVjdGlvbkxlYWQucm93OwogICAgICAgIHZhciByb3dFbmQ7CgogICAgICAgIHZhciBmb2xkTGluZSA9IHRoaXMuc2Vzc2lvbi5nZXRGb2xkTGluZShyb3dTdGFydCk7CiAgICAgICAgaWYgKGZvbGRMaW5lKSB7CiAgICAgICAgICAgIHJvd1N0YXJ0ID0gZm9sZExpbmUuc3RhcnQucm93OwogICAgICAgICAgICByb3dFbmQgPSBmb2xkTGluZS5lbmQucm93OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJvd0VuZCA9IHJvd1N0YXJ0OwogICAgICAgIH0KICAgICAgICB0aGlzLnNldFNlbGVjdGlvbkFuY2hvcihyb3dTdGFydCwgMCk7CiAgICAgICAgdGhpcy4kbW92ZVNlbGVjdGlvbihmdW5jdGlvbigpIHsKICAgICAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yVG8ocm93RW5kICsgMSwgMCk7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIHRoaXMubW92ZUN1cnNvclVwID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yQnkoLTEsIDApOwogICAgfTsKCiAgICB0aGlzLm1vdmVDdXJzb3JEb3duID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yQnkoMSwgMCk7CiAgICB9OwoKICAgIHRoaXMubW92ZUN1cnNvckxlZnQgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgY3Vyc29yID0gdGhpcy5zZWxlY3Rpb25MZWFkLmdldFBvc2l0aW9uKCksCiAgICAgICAgICAgIGZvbGQ7CgogICAgICAgIGlmIChmb2xkID0gdGhpcy5zZXNzaW9uLmdldEZvbGRBdChjdXJzb3Iucm93LCBjdXJzb3IuY29sdW1uLCAtMSkpIHsKICAgICAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yVG8oZm9sZC5zdGFydC5yb3csIGZvbGQuc3RhcnQuY29sdW1uKTsKICAgICAgICB9IGVsc2UgaWYgKGN1cnNvci5jb2x1bW4gPT0gMCkgewogICAgICAgICAgICAvLyBjdXJzb3IgaXMgYSBsaW5lIChzdGFydAogICAgICAgICAgICBpZiAoY3Vyc29yLnJvdyA+IDApIHsKICAgICAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvclRvKGN1cnNvci5yb3cgLSAxLCB0aGlzLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cgLSAxKS5sZW5ndGgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB2YXIgdGFiU2l6ZSA9IHRoaXMuc2Vzc2lvbi5nZXRUYWJTaXplKCk7CiAgICAgICAgICAgIGlmICh0aGlzLnNlc3Npb24uaXNUYWJTdG9wKGN1cnNvcikgJiYgdGhpcy5kb2MuZ2V0TGluZShjdXJzb3Iucm93KS5zbGljZShjdXJzb3IuY29sdW1uLXRhYlNpemUsIGN1cnNvci5jb2x1bW4pLnNwbGl0KCIgIikubGVuZ3RoLTEgPT0gdGFiU2l6ZSkKICAgICAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvckJ5KDAsIC10YWJTaXplKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yQnkoMCwgLTEpOwogICAgICAgIH0KICAgIH07CgogICAgdGhpcy5tb3ZlQ3Vyc29yUmlnaHQgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgY3Vyc29yID0gdGhpcy5zZWxlY3Rpb25MZWFkLmdldFBvc2l0aW9uKCksCiAgICAgICAgICAgIGZvbGQ7CiAgICAgICAgaWYgKGZvbGQgPSB0aGlzLnNlc3Npb24uZ2V0Rm9sZEF0KGN1cnNvci5yb3csIGN1cnNvci5jb2x1bW4sIDEpKSB7CiAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvclRvKGZvbGQuZW5kLnJvdywgZm9sZC5lbmQuY29sdW1uKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25MZWFkLmNvbHVtbiA9PSB0aGlzLmRvYy5nZXRMaW5lKHRoaXMuc2VsZWN0aW9uTGVhZC5yb3cpLmxlbmd0aCkgewogICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25MZWFkLnJvdyA8IHRoaXMuZG9jLmdldExlbmd0aCgpIC0gMSkgewogICAgICAgICAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yVG8odGhpcy5zZWxlY3Rpb25MZWFkLnJvdyArIDEsIDApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB2YXIgdGFiU2l6ZSA9IHRoaXMuc2Vzc2lvbi5nZXRUYWJTaXplKCk7CiAgICAgICAgICAgIHZhciBjdXJzb3IgPSB0aGlzLnNlbGVjdGlvbkxlYWQ7CiAgICAgICAgICAgIGlmICh0aGlzLnNlc3Npb24uaXNUYWJTdG9wKGN1cnNvcikgJiYgdGhpcy5kb2MuZ2V0TGluZShjdXJzb3Iucm93KS5zbGljZShjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uK3RhYlNpemUpLnNwbGl0KCIgIikubGVuZ3RoLTEgPT0gdGFiU2l6ZSkKICAgICAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvckJ5KDAsIHRhYlNpemUpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB0aGlzLm1vdmVDdXJzb3JCeSgwLCAxKTsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMubW92ZUN1cnNvckxpbmVTdGFydCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciByb3cgPSB0aGlzLnNlbGVjdGlvbkxlYWQucm93OwogICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLnNlbGVjdGlvbkxlYWQuY29sdW1uOwogICAgICAgIHZhciBzY3JlZW5Sb3cgPSB0aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblJvdyhyb3csIGNvbHVtbik7CgogICAgICAgIC8vIERldGVybSB0aGUgZG9jLXBvc2l0aW9uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYXQgdGhlIHNjcmVlbiBsaW5lLgogICAgICAgIHZhciBmaXJzdENvbHVtblBvc2l0aW9uID0gdGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihzY3JlZW5Sb3csIDApOwoKICAgICAgICAvLyBEZXRlcm0gdGhlIGxpbmUKICAgICAgICB2YXIgYmVmb3JlQ3Vyc29yID0gdGhpcy5zZXNzaW9uLmdldERpc3BsYXlMaW5lKAogICAgICAgICAgICByb3csIG51bGwsCiAgICAgICAgICAgIGZpcnN0Q29sdW1uUG9zaXRpb24ucm93LCBmaXJzdENvbHVtblBvc2l0aW9uLmNvbHVtbgogICAgICAgICk7CgogICAgICAgIHZhciBsZWFkaW5nU3BhY2UgPSBiZWZvcmVDdXJzb3IubWF0Y2goL15ccyovKTsKICAgICAgICBpZiAobGVhZGluZ1NwYWNlWzBdLmxlbmd0aCA9PSBjb2x1bW4pIHsKICAgICAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yVG8oCiAgICAgICAgICAgICAgICBmaXJzdENvbHVtblBvc2l0aW9uLnJvdywgZmlyc3RDb2x1bW5Qb3NpdGlvbi5jb2x1bW4KICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvclRvKAogICAgICAgICAgICAgICAgZmlyc3RDb2x1bW5Qb3NpdGlvbi5yb3csCiAgICAgICAgICAgICAgICBmaXJzdENvbHVtblBvc2l0aW9uLmNvbHVtbiArIGxlYWRpbmdTcGFjZVswXS5sZW5ndGgKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMubW92ZUN1cnNvckxpbmVFbmQgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgbGVhZCA9IHRoaXMuc2VsZWN0aW9uTGVhZDsKICAgICAgICB2YXIgbGFzdFJvd0NvbHVtblBvc2l0aW9uID0KICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmdldERvY3VtZW50TGFzdFJvd0NvbHVtblBvc2l0aW9uKGxlYWQucm93LCBsZWFkLmNvbHVtbik7CiAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yVG8oCiAgICAgICAgICAgIGxhc3RSb3dDb2x1bW5Qb3NpdGlvbi5yb3csCiAgICAgICAgICAgIGxhc3RSb3dDb2x1bW5Qb3NpdGlvbi5jb2x1bW4KICAgICAgICApOwogICAgfTsKCiAgICB0aGlzLm1vdmVDdXJzb3JGaWxlRW5kID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHJvdyA9IHRoaXMuZG9jLmdldExlbmd0aCgpIC0gMTsKICAgICAgICB2YXIgY29sdW1uID0gdGhpcy5kb2MuZ2V0TGluZShyb3cpLmxlbmd0aDsKICAgICAgICB0aGlzLm1vdmVDdXJzb3JUbyhyb3csIGNvbHVtbik7CiAgICB9OwoKICAgIHRoaXMubW92ZUN1cnNvckZpbGVTdGFydCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMubW92ZUN1cnNvclRvKDAsIDApOwogICAgfTsKCiAgICB0aGlzLm1vdmVDdXJzb3JXb3JkUmlnaHQgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgcm93ID0gdGhpcy5zZWxlY3Rpb25MZWFkLnJvdzsKICAgICAgICB2YXIgY29sdW1uID0gdGhpcy5zZWxlY3Rpb25MZWFkLmNvbHVtbjsKICAgICAgICB2YXIgbGluZSA9IHRoaXMuZG9jLmdldExpbmUocm93KTsKICAgICAgICB2YXIgcmlnaHRPZkN1cnNvciA9IGxpbmUuc3Vic3RyaW5nKGNvbHVtbik7CgogICAgICAgIHZhciBtYXRjaDsKICAgICAgICB0aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXggPSAwOwogICAgICAgIHRoaXMuc2Vzc2lvbi50b2tlblJlLmxhc3RJbmRleCA9IDA7CgogICAgICAgIC8vIHNraXAgZm9sZHMKICAgICAgICB2YXIgZm9sZCA9IHRoaXMuc2Vzc2lvbi5nZXRGb2xkQXQocm93LCBjb2x1bW4sIDEpOwogICAgICAgIGlmIChmb2xkKSB7CiAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvclRvKGZvbGQuZW5kLnJvdywgZm9sZC5lbmQuY29sdW1uKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBmaXJzdCBza2lwIHNwYWNlCiAgICAgICAgaWYgKG1hdGNoID0gdGhpcy5zZXNzaW9uLm5vblRva2VuUmUuZXhlYyhyaWdodE9mQ3Vyc29yKSkgewogICAgICAgICAgICBjb2x1bW4gKz0gdGhpcy5zZXNzaW9uLm5vblRva2VuUmUubGFzdEluZGV4OwogICAgICAgICAgICB0aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXggPSAwOwogICAgICAgICAgICByaWdodE9mQ3Vyc29yID0gbGluZS5zdWJzdHJpbmcoY29sdW1uKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gaWYgYXQgbGluZSBlbmQgcHJvY2VlZCB3aXRoIG5leHQgbGluZQogICAgICAgIGlmIChjb2x1bW4gPj0gbGluZS5sZW5ndGgpIHsKICAgICAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yVG8ocm93LCBsaW5lLmxlbmd0aCk7CiAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvclJpZ2h0KCk7CiAgICAgICAgICAgIGlmIChyb3cgPCB0aGlzLmRvYy5nZXRMZW5ndGgoKSAtIDEpCiAgICAgICAgICAgICAgICB0aGlzLm1vdmVDdXJzb3JXb3JkUmlnaHQoKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBhZHZhbmNlIHRvIHRoZSBlbmQgb2YgdGhlIG5leHQgdG9rZW4KICAgICAgICBpZiAobWF0Y2ggPSB0aGlzLnNlc3Npb24udG9rZW5SZS5leGVjKHJpZ2h0T2ZDdXJzb3IpKSB7CiAgICAgICAgICAgIGNvbHVtbiArPSB0aGlzLnNlc3Npb24udG9rZW5SZS5sYXN0SW5kZXg7CiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi50b2tlblJlLmxhc3RJbmRleCA9IDA7CiAgICAgICAgfQoKICAgICAgICB0aGlzLm1vdmVDdXJzb3JUbyhyb3csIGNvbHVtbik7CiAgICB9OwoKICAgIHRoaXMubW92ZUN1cnNvcldvcmRMZWZ0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHJvdyA9IHRoaXMuc2VsZWN0aW9uTGVhZC5yb3c7CiAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMuc2VsZWN0aW9uTGVhZC5jb2x1bW47CgogICAgICAgIC8vIHNraXAgZm9sZHMKICAgICAgICB2YXIgZm9sZDsKICAgICAgICBpZiAoZm9sZCA9IHRoaXMuc2Vzc2lvbi5nZXRGb2xkQXQocm93LCBjb2x1bW4sIC0xKSkgewogICAgICAgICAgICB0aGlzLm1vdmVDdXJzb3JUbyhmb2xkLnN0YXJ0LnJvdywgZm9sZC5zdGFydC5jb2x1bW4pOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB2YXIgc3RyID0gdGhpcy5zZXNzaW9uLmdldEZvbGRTdHJpbmdBdChyb3csIGNvbHVtbiwgLTEpOwogICAgICAgIGlmIChzdHIgPT0gbnVsbCkgewogICAgICAgICAgICBzdHIgPSB0aGlzLmRvYy5nZXRMaW5lKHJvdykuc3Vic3RyaW5nKDAsIGNvbHVtbikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdmFyIGxlZnRPZkN1cnNvciA9IGxhbmcuc3RyaW5nUmV2ZXJzZShzdHIpOwogICAgICAgIHZhciBtYXRjaDsKICAgICAgICB0aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXggPSAwOwogICAgICAgIHRoaXMuc2Vzc2lvbi50b2tlblJlLmxhc3RJbmRleCA9IDA7CiAgICAgICAgCiAgICAgICAgLy8gc2tpcCB3aGl0ZXNwYWNlCiAgICAgICAgaWYgKG1hdGNoID0gdGhpcy5zZXNzaW9uLm5vblRva2VuUmUuZXhlYyhsZWZ0T2ZDdXJzb3IpKSB7CiAgICAgICAgICAgIGNvbHVtbiAtPSB0aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXg7CiAgICAgICAgICAgIGxlZnRPZkN1cnNvciA9IGxlZnRPZkN1cnNvci5zbGljZSh0aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXgpOwogICAgICAgICAgICB0aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXggPSAwOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBpZiBhdCBiZWdpbiBvZiB0aGUgbGluZSBwcm9jZWVkIGluIGxpbmUgYWJvdmUKICAgICAgICBpZiAoY29sdW1uIDw9IDApIHsKICAgICAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yVG8ocm93LCAwKTsKICAgICAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yTGVmdCgpOwogICAgICAgICAgICBpZiAocm93ID4gMCkKICAgICAgICAgICAgICAgIHRoaXMubW92ZUN1cnNvcldvcmRMZWZ0KCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIG1vdmUgdG8gdGhlIGJlZ2luIG9mIHRoZSB3b3JkCiAgICAgICAgaWYgKG1hdGNoID0gdGhpcy5zZXNzaW9uLnRva2VuUmUuZXhlYyhsZWZ0T2ZDdXJzb3IpKSB7CiAgICAgICAgICAgIGNvbHVtbiAtPSB0aGlzLnNlc3Npb24udG9rZW5SZS5sYXN0SW5kZXg7CiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi50b2tlblJlLmxhc3RJbmRleCA9IDA7CiAgICAgICAgfQoKICAgICAgICB0aGlzLm1vdmVDdXJzb3JUbyhyb3csIGNvbHVtbik7CiAgICB9OwoKICAgIHRoaXMubW92ZUN1cnNvckJ5ID0gZnVuY3Rpb24ocm93cywgY2hhcnMpIHsKICAgICAgICB2YXIgc2NyZWVuUG9zID0gdGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbigKICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25MZWFkLnJvdywKICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25MZWFkLmNvbHVtbgogICAgICAgICk7CgogICAgICAgIHZhciBzY3JlZW5Db2wgPSAoY2hhcnMgPT09IDAgJiYgdGhpcy4kZGVzaXJlZENvbHVtbikgfHwgc2NyZWVuUG9zLmNvbHVtbjsKICAgICAgICB2YXIgZG9jUG9zID0gdGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihzY3JlZW5Qb3Mucm93ICsgcm93cywgc2NyZWVuQ29sKTsKCiAgICAgICAgLy8gbW92ZSB0aGUgY3Vyc29yIGFuZCB1cGRhdGUgdGhlIGRlc2lyZWQgY29sdW1uCiAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yVG8oZG9jUG9zLnJvdywgZG9jUG9zLmNvbHVtbiArIGNoYXJzLCBjaGFycyA9PT0gMCk7CiAgICB9OwoKICAgIHRoaXMubW92ZUN1cnNvclRvUG9zaXRpb24gPSBmdW5jdGlvbihwb3NpdGlvbikgewogICAgICAgIHRoaXMubW92ZUN1cnNvclRvKHBvc2l0aW9uLnJvdywgcG9zaXRpb24uY29sdW1uKTsKICAgIH07CgogICAgdGhpcy5tb3ZlQ3Vyc29yVG8gPSBmdW5jdGlvbihyb3csIGNvbHVtbiwgcHJldmVudFVwZGF0ZURlc2lyZWRDb2x1bW4pIHsKICAgICAgICAvLyBFbnN1cmUgdGhlIHJvdy9jb2x1bW4gaXMgbm90IGluc2lkZSBvZiBhIGZvbGQuCiAgICAgICAgdmFyIGZvbGQgPSB0aGlzLnNlc3Npb24uZ2V0Rm9sZEF0KHJvdywgY29sdW1uLCAxKTsKICAgICAgICBpZiAoZm9sZCkgewogICAgICAgICAgICByb3cgPSBmb2xkLnN0YXJ0LnJvdzsKICAgICAgICAgICAgY29sdW1uID0gZm9sZC5zdGFydC5jb2x1bW47CiAgICAgICAgfQoKICAgICAgICB0aGlzLiRwcmV2ZW50VXBkYXRlRGVzaXJlZENvbHVtbk9uQ2hhbmdlID0gdHJ1ZTsKICAgICAgICB0aGlzLnNlbGVjdGlvbkxlYWQuc2V0UG9zaXRpb24ocm93LCBjb2x1bW4pOwogICAgICAgIHRoaXMuJHByZXZlbnRVcGRhdGVEZXNpcmVkQ29sdW1uT25DaGFuZ2UgPSBmYWxzZTsKCiAgICAgICAgaWYgKCFwcmV2ZW50VXBkYXRlRGVzaXJlZENvbHVtbikKICAgICAgICAgICAgdGhpcy4kdXBkYXRlRGVzaXJlZENvbHVtbih0aGlzLnNlbGVjdGlvbkxlYWQuY29sdW1uKTsKICAgIH07CgogICAgdGhpcy5tb3ZlQ3Vyc29yVG9TY3JlZW4gPSBmdW5jdGlvbihyb3csIGNvbHVtbiwgcHJldmVudFVwZGF0ZURlc2lyZWRDb2x1bW4pIHsKICAgICAgICB2YXIgcG9zID0gdGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihyb3csIGNvbHVtbik7CiAgICAgICAgcm93ID0gcG9zLnJvdzsKICAgICAgICBjb2x1bW4gPSBwb3MuY29sdW1uOwogICAgICAgIHRoaXMubW92ZUN1cnNvclRvKHJvdywgY29sdW1uLCBwcmV2ZW50VXBkYXRlRGVzaXJlZENvbHVtbik7CiAgICB9OwoKfSkuY2FsbChTZWxlY3Rpb24ucHJvdG90eXBlKTsKCmV4cG9ydHMuU2VsZWN0aW9uID0gU2VsZWN0aW9uOwp9KTsKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvcmFuZ2UnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgUmFuZ2UgPSBmdW5jdGlvbihzdGFydFJvdywgc3RhcnRDb2x1bW4sIGVuZFJvdywgZW5kQ29sdW1uKSB7CiAgICB0aGlzLnN0YXJ0ID0gewogICAgICAgIHJvdzogc3RhcnRSb3csCiAgICAgICAgY29sdW1uOiBzdGFydENvbHVtbgogICAgfTsKCiAgICB0aGlzLmVuZCA9IHsKICAgICAgICByb3c6IGVuZFJvdywKICAgICAgICBjb2x1bW46IGVuZENvbHVtbgogICAgfTsKfTsKCihmdW5jdGlvbigpIHsKICAgIHRoaXMuaXNFZXF1YWwgPSBmdW5jdGlvbihyYW5nZSkgewogICAgICAgIHJldHVybiB0aGlzLnN0YXJ0LnJvdyA9PSByYW5nZS5zdGFydC5yb3cgJiYKICAgICAgICAgICAgdGhpcy5lbmQucm93ID09IHJhbmdlLmVuZC5yb3cgJiYKICAgICAgICAgICAgdGhpcy5zdGFydC5jb2x1bW4gPT0gcmFuZ2Uuc3RhcnQuY29sdW1uICYmCiAgICAgICAgICAgIHRoaXMuZW5kLmNvbHVtbiA9PSByYW5nZS5lbmQuY29sdW1uCiAgICB9OwoKICAgIHRoaXMudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gKCJSYW5nZTogWyIgKyB0aGlzLnN0YXJ0LnJvdyArICIvIiArIHRoaXMuc3RhcnQuY29sdW1uICsKICAgICAgICAgICAgIl0gLT4gWyIgKyB0aGlzLmVuZC5yb3cgKyAiLyIgKyB0aGlzLmVuZC5jb2x1bW4gKyAiXSIpOwogICAgfTsKCiAgICB0aGlzLmNvbnRhaW5zID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsKICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlKHJvdywgY29sdW1uKSA9PSAwOwogICAgfTsKCiAgICAvKioKICAgICAqIENvbXBhcmVzIHRoaXMgcmFuZ2UgKEEpIHdpdGggYW5vdGhlciByYW5nZSAoQiksIHdoZXJlIEIgaXMgdGhlIHBhc3NlZCBpbgogICAgICogcmFuZ2UuCiAgICAgKgogICAgICogUmV0dXJuIHZhbHVlczoKICAgICAqICAtMjogKEIpIGlzIGluZnJvbnQgb2YgKEEpIGFuZCBkb2Vzbid0IGludGVyc2VjdCB3aXRoIChBKQogICAgICogIC0xOiAoQikgYmVnaW5zIGJlZm9yZSAoQSkgYnV0IGVuZHMgaW5zaWRlIG9mIChBKQogICAgICogICAwOiAoQikgaXMgY29tcGxldGx5IGluc2lkZSBvZiAoQSkgT1IgKEEpIGlzIGNvbXBsZXR5IGluc2lkZSBvZiAoQikKICAgICAqICArMTogKEIpIGJlZ2lucyBpbnNpZGUgb2YgKEEpIGJ1dCBlbmRzIG91dHNpZGUgb2YgKEEpCiAgICAgKiAgKzI6IChCKSBpcyBhZnRlciAoQSkgYW5kIGRvZXNuJ3QgaW50ZXJzZWN0IHdpdGggKEEpCiAgICAgKgogICAgICogIDQyOiBGVFcgc3RhdGU6IChCKSBlbmRzIGluIChBKSBidXQgc3RhcnRzIG91dHNpZGUgb2YgKEEpCiAgICAgKi8KICAgIHRoaXMuY29tcGFyZVJhbmdlID0gZnVuY3Rpb24ocmFuZ2UpIHsKICAgICAgICB2YXIgY21wLAogICAgICAgICAgICBlbmQgPSByYW5nZS5lbmQsCiAgICAgICAgICAgIHN0YXJ0ID0gcmFuZ2Uuc3RhcnQ7CgogICAgICAgIGNtcCA9IHRoaXMuY29tcGFyZShlbmQucm93LCBlbmQuY29sdW1uKTsKICAgICAgICBpZiAoY21wID09IDEpIHsKICAgICAgICAgICAgY21wID0gdGhpcy5jb21wYXJlKHN0YXJ0LnJvdywgc3RhcnQuY29sdW1uKTsKICAgICAgICAgICAgaWYgKGNtcCA9PSAxKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICAgICAgfSBlbHNlIGlmIChjbXAgPT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoY21wID09IC0xKSB7CiAgICAgICAgICAgIHJldHVybiAtMjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjbXAgPSB0aGlzLmNvbXBhcmUoc3RhcnQucm93LCBzdGFydC5jb2x1bW4pOwogICAgICAgICAgICBpZiAoY21wID09IC0xKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoY21wID09IDEpIHsKICAgICAgICAgICAgICAgIHJldHVybiA0MjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHRoaXMuY29tcGFyZVBvaW50ID0gZnVuY3Rpb24ocCkgewogICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmUocC5yb3csIHAuY29sdW1uKTsKICAgIH0KCiAgICB0aGlzLmNvbnRhaW5zUmFuZ2UgPSBmdW5jdGlvbihyYW5nZSkgewogICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmVQb2ludChyYW5nZS5zdGFydCkgPT0gMCAmJiB0aGlzLmNvbXBhcmVQb2ludChyYW5nZS5lbmQpID09IDA7CiAgICB9CgogICAgdGhpcy5pc0VuZCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZW5kLnJvdyA9PSByb3cgJiYgdGhpcy5lbmQuY29sdW1uID09IGNvbHVtbjsKICAgIH0KCiAgICB0aGlzLmlzU3RhcnQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIHJldHVybiB0aGlzLnN0YXJ0LnJvdyA9PSByb3cgJiYgdGhpcy5zdGFydC5jb2x1bW4gPT0gY29sdW1uOwogICAgfQoKICAgIHRoaXMuc2V0U3RhcnQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIGlmICh0eXBlb2Ygcm93ID09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIHRoaXMuc3RhcnQuY29sdW1uID0gcm93LmNvbHVtbjsKICAgICAgICAgICAgdGhpcy5zdGFydC5yb3cgPSByb3cucm93OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMuc3RhcnQucm93ID0gcm93OwogICAgICAgICAgICB0aGlzLnN0YXJ0LmNvbHVtbiA9IGNvbHVtbjsKICAgICAgICB9CiAgICB9CgogICAgdGhpcy5zZXRFbmQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIGlmICh0eXBlb2Ygcm93ID09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIHRoaXMuZW5kLmNvbHVtbiA9IHJvdy5jb2x1bW47CiAgICAgICAgICAgIHRoaXMuZW5kLnJvdyA9IHJvdy5yb3c7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5lbmQucm93ID0gcm93OwogICAgICAgICAgICB0aGlzLmVuZC5jb2x1bW4gPSBjb2x1bW47CiAgICAgICAgfQogICAgfQoKICAgIHRoaXMuaW5zaWRlID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsKICAgICAgICBpZiAodGhpcy5jb21wYXJlKHJvdywgY29sdW1uKSA9PSAwKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmlzRW5kKHJvdywgY29sdW1uKSB8fCB0aGlzLmlzU3RhcnQocm93LCBjb2x1bW4pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgdGhpcy5pbnNpZGVTdGFydCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7CiAgICAgICAgaWYgKHRoaXMuY29tcGFyZShyb3csIGNvbHVtbikgPT0gMCkgewogICAgICAgICAgICBpZiAodGhpcy5pc0VuZChyb3csIGNvbHVtbikpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICB0aGlzLmluc2lkZUVuZCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7CiAgICAgICAgaWYgKHRoaXMuY29tcGFyZShyb3csIGNvbHVtbikgPT0gMCkgewogICAgICAgICAgICBpZiAodGhpcy5pc1N0YXJ0KHJvdywgY29sdW1uKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHRoaXMuY29tcGFyZSA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7CiAgICAgICAgaWYgKCF0aGlzLmlzTXVsdGlMaW5lKCkpIHsKICAgICAgICAgICAgaWYgKHJvdyA9PT0gdGhpcy5zdGFydC5yb3cpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW4gPCB0aGlzLnN0YXJ0LmNvbHVtbiA/IC0xIDogKGNvbHVtbiA+IHRoaXMuZW5kLmNvbHVtbiA/IDEgOiAwKTsKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIGlmIChyb3cgPCB0aGlzLnN0YXJ0LnJvdykKICAgICAgICAgICAgcmV0dXJuIC0xOwoKICAgICAgICBpZiAocm93ID4gdGhpcy5lbmQucm93KQogICAgICAgICAgICByZXR1cm4gMTsKCiAgICAgICAgaWYgKHRoaXMuc3RhcnQucm93ID09PSByb3cpCiAgICAgICAgICAgIHJldHVybiBjb2x1bW4gPj0gdGhpcy5zdGFydC5jb2x1bW4gPyAwIDogLTE7CgogICAgICAgIGlmICh0aGlzLmVuZC5yb3cgPT09IHJvdykKICAgICAgICAgICAgcmV0dXJuIGNvbHVtbiA8PSB0aGlzLmVuZC5jb2x1bW4gPyAwIDogMTsKCiAgICAgICAgcmV0dXJuIDA7CiAgICB9OwoKICAgIC8qKgogICAgICogTGlrZSAuY29tcGFyZSgpLCBidXQgaWYgaXNTdGFydCBpcyB0cnVlLCByZXR1cm4gLTE7CiAgICAgKi8KICAgIHRoaXMuY29tcGFyZVN0YXJ0ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsKICAgICAgICBpZiAodGhpcy5zdGFydC5yb3cgPT0gcm93ICYmIHRoaXMuc3RhcnQuY29sdW1uID09IGNvbHVtbikgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbik7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogTGlrZSAuY29tcGFyZSgpLCBidXQgaWYgaXNFbmQgaXMgdHJ1ZSwgcmV0dXJuIDE7CiAgICAgKi8KICAgIHRoaXMuY29tcGFyZUVuZCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7CiAgICAgICAgaWYgKHRoaXMuZW5kLnJvdyA9PSByb3cgJiYgdGhpcy5lbmQuY29sdW1uID09IGNvbHVtbikgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlKHJvdywgY29sdW1uKTsKICAgICAgICB9CiAgICB9CgogICAgdGhpcy5jb21wYXJlSW5zaWRlID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsKICAgICAgICBpZiAodGhpcy5lbmQucm93ID09IHJvdyAmJiB0aGlzLmVuZC5jb2x1bW4gPT0gY29sdW1uKSB7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGFydC5yb3cgPT0gcm93ICYmIHRoaXMuc3RhcnQuY29sdW1uID09IGNvbHVtbikgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbik7CiAgICAgICAgfQogICAgfQoKICAgIHRoaXMuY2xpcFJvd3MgPSBmdW5jdGlvbihmaXJzdFJvdywgbGFzdFJvdykgewogICAgICAgIGlmICh0aGlzLmVuZC5yb3cgPiBsYXN0Um93KSB7CiAgICAgICAgICAgIHZhciBlbmQgPSB7CiAgICAgICAgICAgICAgICByb3c6IGxhc3RSb3crMSwKICAgICAgICAgICAgICAgIGNvbHVtbjogMAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMuc3RhcnQucm93ID4gbGFzdFJvdykgewogICAgICAgICAgICB2YXIgc3RhcnQgPSB7CiAgICAgICAgICAgICAgICByb3c6IGxhc3RSb3crMSwKICAgICAgICAgICAgICAgIGNvbHVtbjogMAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMuc3RhcnQucm93IDwgZmlyc3RSb3cpIHsKICAgICAgICAgICAgdmFyIHN0YXJ0ID0gewogICAgICAgICAgICAgICAgcm93OiBmaXJzdFJvdywKICAgICAgICAgICAgICAgIGNvbHVtbjogMAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMuZW5kLnJvdyA8IGZpcnN0Um93KSB7CiAgICAgICAgICAgIHZhciBlbmQgPSB7CiAgICAgICAgICAgICAgICByb3c6IGZpcnN0Um93LAogICAgICAgICAgICAgICAgY29sdW1uOiAwCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0IHx8IHRoaXMuc3RhcnQsIGVuZCB8fCB0aGlzLmVuZCk7CiAgICB9OwoKICAgIHRoaXMuZXh0ZW5kID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsKICAgICAgICB2YXIgY21wID0gdGhpcy5jb21wYXJlKHJvdywgY29sdW1uKTsKCiAgICAgICAgaWYgKGNtcCA9PSAwKQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICBlbHNlIGlmIChjbXAgPT0gLTEpCiAgICAgICAgICAgIHZhciBzdGFydCA9IHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW59OwogICAgICAgIGVsc2UKICAgICAgICAgICAgdmFyIGVuZCA9IHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW59OwoKICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyhzdGFydCB8fCB0aGlzLnN0YXJ0LCBlbmQgfHwgdGhpcy5lbmQpOwogICAgfTsKCiAgICB0aGlzLmlzRW1wdHkgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gKHRoaXMuc3RhcnQucm93ID09IHRoaXMuZW5kLnJvdyAmJiB0aGlzLnN0YXJ0LmNvbHVtbiA9PSB0aGlzLmVuZC5jb2x1bW4pOwogICAgfTsKCiAgICB0aGlzLmlzTXVsdGlMaW5lID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuICh0aGlzLnN0YXJ0LnJvdyAhPT0gdGhpcy5lbmQucm93KTsKICAgIH07CgogICAgdGhpcy5jbG9uZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHRoaXMuc3RhcnQsIHRoaXMuZW5kKTsKICAgIH07CgogICAgdGhpcy5jb2xsYXBzZVJvd3MgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5lbmQuY29sdW1uID09IDApCiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2UodGhpcy5zdGFydC5yb3csIDAsIE1hdGgubWF4KHRoaXMuc3RhcnQucm93LCB0aGlzLmVuZC5yb3ctMSksIDApCiAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHRoaXMuc3RhcnQucm93LCAwLCB0aGlzLmVuZC5yb3csIDApCiAgICB9OwoKICAgIHRoaXMudG9TY3JlZW5SYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24pIHsKICAgICAgICB2YXIgc2NyZWVuUG9zU3RhcnQgPQogICAgICAgICAgICBzZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbih0aGlzLnN0YXJ0KTsKICAgICAgICB2YXIgc2NyZWVuUG9zRW5kID0KICAgICAgICAgICAgc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24odGhpcy5lbmQpOwoKICAgICAgICByZXR1cm4gbmV3IFJhbmdlKAogICAgICAgICAgICBzY3JlZW5Qb3NTdGFydC5yb3csIHNjcmVlblBvc1N0YXJ0LmNvbHVtbiwKICAgICAgICAgICAgc2NyZWVuUG9zRW5kLnJvdywgc2NyZWVuUG9zRW5kLmNvbHVtbgogICAgICAgICk7CiAgICB9OwoKfSkuY2FsbChSYW5nZS5wcm90b3R5cGUpOwoKClJhbmdlLmZyb21Qb2ludHMgPSBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgICByZXR1cm4gbmV3IFJhbmdlKHN0YXJ0LnJvdywgc3RhcnQuY29sdW1uLCBlbmQucm93LCBlbmQuY29sdW1uKTsKfTsKCmV4cG9ydHMuUmFuZ2UgPSBSYW5nZTsKfSk7Ci8qIHZpbTp0cz00OnN0cz00OnN3PTQ6CiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICogICAgICBNaWhhaSBTdWNhbiA8bWloYWkgRE9UIHN1Y2FuIEFUIGdtYWlsIERPVCBjb20+CiAqICAgICAgQ2hyaXMgU3BlbmNlciA8Y2hyaXMuYWcuc3BlbmNlciBBVCBnb29nbGVtYWlsIERPVCBjb20+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL3RleHQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvYmVoYXZpb3VyJywgJ2FjZS91bmljb2RlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOwp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsKdmFyIEJlaGF2aW91ciA9IHJlcXVpcmUoIi4vYmVoYXZpb3VyIikuQmVoYXZpb3VyOwp2YXIgdW5pY29kZSA9IHJlcXVpcmUoIi4uL3VuaWNvZGUiKTsKCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKG5ldyBUZXh0SGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsKICAgIHRoaXMuJGJlaGF2aW91ciA9IG5ldyBCZWhhdmlvdXIoKTsKfTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLnRva2VuUmUgPSBuZXcgUmVnRXhwKCJeWyIKICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTAogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5NbiArIHVuaWNvZGUucGFja2FnZXMuTWMKICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTmQKICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuUGMgKyAiXFwkX10rIiwgImciCiAgICApOwogICAgCiAgICB0aGlzLm5vblRva2VuUmUgPSBuZXcgUmVnRXhwKCJeKD86W14iCiAgICAgICAgKyB1bmljb2RlLnBhY2thZ2VzLkwKICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTW4gKyB1bmljb2RlLnBhY2thZ2VzLk1jCiAgICAgICAgKyB1bmljb2RlLnBhY2thZ2VzLk5kCiAgICAgICAgKyB1bmljb2RlLnBhY2thZ2VzLlBjICsgIlxcJF9dfFxzXSkrIiwgImciCiAgICApOwoKICAgIHRoaXMuZ2V0VG9rZW5pemVyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJHRva2VuaXplcjsKICAgIH07CgogICAgdGhpcy50b2dnbGVDb21tZW50TGluZXMgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCBzdGFydFJvdywgZW5kUm93KSB7CiAgICB9OwoKICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7CiAgICAgICAgcmV0dXJuICIiOwogICAgfTsKCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCBpbnB1dCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH07CgogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgewogICAgfTsKCiAgICB0aGlzLiRnZXRJbmRlbnQgPSBmdW5jdGlvbihsaW5lKSB7CiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAiIjsKICAgIH07CiAgICAKICAgIHRoaXMuY3JlYXRlV29ya2VyID0gZnVuY3Rpb24oc2Vzc2lvbikgewogICAgICAgIHJldHVybiBudWxsOwogICAgfTsKCiAgICB0aGlzLmhpZ2hsaWdodFNlbGVjdGlvbiA9IGZ1bmN0aW9uKGVkaXRvcikgewogICAgICAgIHZhciBzZXNzaW9uID0gZWRpdG9yLnNlc3Npb247CiAgICAgICAgaWYgKCFzZXNzaW9uLiRzZWxlY3Rpb25PY2N1cnJlbmNlcykKICAgICAgICAgICAgc2Vzc2lvbi4kc2VsZWN0aW9uT2NjdXJyZW5jZXMgPSBbXTsKCiAgICAgICAgaWYgKHNlc3Npb24uJHNlbGVjdGlvbk9jY3VycmVuY2VzLmxlbmd0aCkKICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbkhpZ2hsaWdodChlZGl0b3IpOwoKICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7CiAgICAgICAgaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkgfHwgc2VsZWN0aW9uLmlzTXVsdGlMaW5lKCkpCiAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgdmFyIHN0YXJ0T3V0ZXIgPSBzZWxlY3Rpb24uc3RhcnQuY29sdW1uIC0gMTsKICAgICAgICB2YXIgZW5kT3V0ZXIgPSBzZWxlY3Rpb24uZW5kLmNvbHVtbiArIDE7CiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUoc2VsZWN0aW9uLnN0YXJ0LnJvdyk7CiAgICAgICAgdmFyIGxpbmVDb2xzID0gbGluZS5sZW5ndGg7CiAgICAgICAgdmFyIG5lZWRsZSA9IGxpbmUuc3Vic3RyaW5nKE1hdGgubWF4KHN0YXJ0T3V0ZXIsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihlbmRPdXRlciwgbGluZUNvbHMpKTsKCiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBvdXRlciBjaGFyYWN0ZXJzIGFyZSBub3QgcGFydCBvZiB0aGUgd29yZC4KICAgICAgICBpZiAoKHN0YXJ0T3V0ZXIgPj0gMCAmJiAvXltcd1xkXS8udGVzdChuZWVkbGUpKSB8fAogICAgICAgICAgICAoZW5kT3V0ZXIgPD0gbGluZUNvbHMgJiYgL1tcd1xkXSQvLnRlc3QobmVlZGxlKSkpCiAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgbmVlZGxlID0gbGluZS5zdWJzdHJpbmcoc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbiwgc2VsZWN0aW9uLmVuZC5jb2x1bW4pOwogICAgICAgIGlmICghL15bXHdcZF0rJC8udGVzdChuZWVkbGUpKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKCiAgICAgICAgdmFyIG5ld09wdGlvbnMgPSB7CiAgICAgICAgICAgIHdyYXA6IHRydWUsCiAgICAgICAgICAgIHdob2xlV29yZDogdHJ1ZSwKICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZTogdHJ1ZSwKICAgICAgICAgICAgbmVlZGxlOiBuZWVkbGUKICAgICAgICB9OwoKICAgICAgICB2YXIgY3VycmVudE9wdGlvbnMgPSBlZGl0b3IuJHNlYXJjaC5nZXRPcHRpb25zKCk7CiAgICAgICAgZWRpdG9yLiRzZWFyY2guc2V0KG5ld09wdGlvbnMpOwoKICAgICAgICB2YXIgcmFuZ2VzID0gZWRpdG9yLiRzZWFyY2guZmluZEFsbChzZXNzaW9uKTsKICAgICAgICByYW5nZXMuZm9yRWFjaChmdW5jdGlvbihyYW5nZSkgewogICAgICAgICAgICBpZiAoIXJhbmdlLmNvbnRhaW5zKGN1cnNvci5yb3csIGN1cnNvci5jb2x1bW4pKSB7CiAgICAgICAgICAgICAgICB2YXIgbWFya2VyID0gc2Vzc2lvbi5hZGRNYXJrZXIocmFuZ2UsICJhY2Vfc2VsZWN0ZWRfd29yZCIsICJ0ZXh0Iik7CiAgICAgICAgICAgICAgICBzZXNzaW9uLiRzZWxlY3Rpb25PY2N1cnJlbmNlcy5wdXNoKG1hcmtlcik7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgZWRpdG9yLiRzZWFyY2guc2V0KGN1cnJlbnRPcHRpb25zKTsKICAgIH07CgogICAgdGhpcy5jbGVhclNlbGVjdGlvbkhpZ2hsaWdodCA9IGZ1bmN0aW9uKGVkaXRvcikgewogICAgICAgIGlmICghZWRpdG9yLnNlc3Npb24uJHNlbGVjdGlvbk9jY3VycmVuY2VzKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIGVkaXRvci5zZXNzaW9uLiRzZWxlY3Rpb25PY2N1cnJlbmNlcy5mb3JFYWNoKGZ1bmN0aW9uKG1hcmtlcikgewogICAgICAgICAgICBlZGl0b3Iuc2Vzc2lvbi5yZW1vdmVNYXJrZXIobWFya2VyKTsKICAgICAgICB9KTsKCiAgICAgICAgZWRpdG9yLnNlc3Npb24uJHNlbGVjdGlvbk9jY3VycmVuY2VzID0gW107CiAgICB9OwogICAgCiAgICB0aGlzLmNyZWF0ZU1vZGVEZWxlZ2F0ZXMgPSBmdW5jdGlvbiAobWFwcGluZykgewogICAgICAgIGlmICghdGhpcy4kZW1iZWRzKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy4kbW9kZXMgPSB7fTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuJGVtYmVkcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAobWFwcGluZ1t0aGlzLiRlbWJlZHNbaV1dKSB7CiAgICAgICAgICAgICAgICB0aGlzLiRtb2Rlc1t0aGlzLiRlbWJlZHNbaV1dID0gbmV3IG1hcHBpbmdbdGhpcy4kZW1iZWRzW2ldXSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHZhciBkZWxlZ2F0aW9ucyA9IFsndG9nZ2xlQ29tbWVudExpbmVzJywgJ2dldE5leHRMaW5lSW5kZW50JywgJ2NoZWNrT3V0ZGVudCcsICdhdXRvT3V0ZGVudCcsICd0cmFuc2Zvcm1BY3Rpb24nXTsKCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWxlZ2F0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAoZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgICAgICAgICB2YXIgZnVuY3Rpb25OYW1lID0gZGVsZWdhdGlvbnNbaV07CiAgICAgICAgICAgICAgdmFyIGRlZmF1bHRIYW5kbGVyID0gc2NvcGVbZnVuY3Rpb25OYW1lXTsKICAgICAgICAgICAgICBzY29wZVtkZWxlZ2F0aW9uc1tpXV0gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGRlbGVnYXRvcihmdW5jdGlvbk5hbWUsIGFyZ3VtZW50cywgZGVmYXVsdEhhbmRsZXIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSAodGhpcykpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgdGhpcy4kZGVsZWdhdG9yID0gZnVuY3Rpb24obWV0aG9kLCBhcmdzLCBkZWZhdWx0SGFuZGxlcikgewogICAgICAgIHZhciBzdGF0ZSA9IGFyZ3NbMF07CiAgICAgICAgCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLiRlbWJlZHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKCF0aGlzLiRtb2Rlc1t0aGlzLiRlbWJlZHNbaV1dKSBjb250aW51ZTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBzcGxpdCA9IHN0YXRlLnNwbGl0KHRoaXMuJGVtYmVkc1tpXSk7CiAgICAgICAgICAgIGlmICghc3BsaXRbMF0gJiYgc3BsaXRbMV0pIHsKICAgICAgICAgICAgICAgIGFyZ3NbMF0gPSBzcGxpdFsxXTsKICAgICAgICAgICAgICAgIHZhciBtb2RlID0gdGhpcy4kbW9kZXNbdGhpcy4kZW1iZWRzW2ldXTsKICAgICAgICAgICAgICAgIHJldHVybiBtb2RlW21ldGhvZF0uYXBwbHkobW9kZSwgYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmFyIHJldCA9IGRlZmF1bHRIYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgIHJldHVybiBkZWZhdWx0SGFuZGxlciA/IHJldCA6IHVuZGVmaW5lZDsKICAgIH07CiAgICAKICAgIHRoaXMudHJhbnNmb3JtQWN0aW9uID0gZnVuY3Rpb24oc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCBwYXJhbSkgewogICAgICAgIGlmICh0aGlzLiRiZWhhdmlvdXIpIHsKICAgICAgICAgICAgdmFyIGJlaGF2aW91cnMgPSB0aGlzLiRiZWhhdmlvdXIuZ2V0QmVoYXZpb3VycygpOwogICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYmVoYXZpb3VycykgewogICAgICAgICAgICAgICAgaWYgKGJlaGF2aW91cnNba2V5XVthY3Rpb25dKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IGJlaGF2aW91cnNba2V5XVthY3Rpb25dLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJldCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIAp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsKCmV4cG9ydHMuTW9kZSA9IE1vZGU7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS90b2tlbml6ZXInLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgVG9rZW5pemVyID0gZnVuY3Rpb24ocnVsZXMsIGZsYWcpIHsKICAgIGZsYWcgPSBmbGFnID8gImciICsgZmxhZyA6ICJnIjsKICAgIHRoaXMucnVsZXMgPSBydWxlczsKCiAgICB0aGlzLnJlZ0V4cHMgPSB7fTsKICAgIHRoaXMubWF0Y2hNYXBwaW5ncyA9IHt9OwogICAgZm9yICggdmFyIGtleSBpbiB0aGlzLnJ1bGVzKSB7CiAgICAgICAgdmFyIHJ1bGUgPSB0aGlzLnJ1bGVzW2tleV07CiAgICAgICAgdmFyIHN0YXRlID0gcnVsZTsKICAgICAgICB2YXIgcnVsZVJlZ0V4cHMgPSBbXTsKICAgICAgICB2YXIgbWF0Y2hUb3RhbCA9IDA7CiAgICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLm1hdGNoTWFwcGluZ3Nba2V5XSA9IHt9OwogICAgICAgIAogICAgICAgIGZvciAoIHZhciBpID0gMDsgaSA8IHN0YXRlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIC8vIENvdW50IG51bWJlciBvZiBtYXRjaGluZyBncm91cHMuIDIgZXh0cmEgZ3JvdXBzIGZyb20gdGhlIGZ1bGwgbWF0Y2gKICAgICAgICAgICAgLy8gQW5kIHRoZSBjYXRjaC1hbGwgb24gdGhlIGVuZCAodXNlZCB0byBmb3JjZSBhIG1hdGNoKTsKICAgICAgICAgICAgdmFyIG1hdGNoY291bnQgPSBuZXcgUmVnRXhwKCIoPzooIiArIHN0YXRlW2ldLnJlZ2V4ICsgIil8KC4pKSIpLmV4ZWMoImEiKS5sZW5ndGggLSAyOwogICAgICAgIAogICAgICAgICAgICAvLyBSZXBsYWNlIGFueSBiYWNrcmVmZXJlbmNlcyBhbmQgb2Zmc2V0IGFwcHJvcHJpYXRlbHkuCiAgICAgICAgICAgIHZhciBhZGp1c3RlZHJlZ2V4ID0gc3RhdGVbaV0ucmVnZXgucmVwbGFjZSgvXFwoWzAtOV0rKS9nLCBmdW5jdGlvbiAobWF0Y2gsIGRpZ2l0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIlxcIiArIChwYXJzZUludChkaWdpdCwgMTApICsgbWF0Y2hUb3RhbCArIDEpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIG1hcHBpbmdbbWF0Y2hUb3RhbF0gPSB7CiAgICAgICAgICAgICAgICBydWxlOiBpLAogICAgICAgICAgICAgICAgbGVuOiBtYXRjaGNvdW50CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIG1hdGNoVG90YWwgKz0gbWF0Y2hjb3VudDsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJ1bGVSZWdFeHBzLnB1c2goYWRqdXN0ZWRyZWdleCk7CiAgICAgICAgfQoKICAgICAgICB0aGlzLnJlZ0V4cHNba2V5XSA9IG5ldyBSZWdFeHAoIig/OigiICsgcnVsZVJlZ0V4cHMuam9pbigiKXwoIikgKyAiKXwoLikpIiwgZmxhZyk7CiAgICB9Cn07CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5nZXRMaW5lVG9rZW5zID0gZnVuY3Rpb24obGluZSwgc3RhcnRTdGF0ZSkgewogICAgICAgIHZhciBjdXJyZW50U3RhdGUgPSBzdGFydFN0YXRlOwogICAgICAgIHZhciBzdGF0ZSA9IHRoaXMucnVsZXNbY3VycmVudFN0YXRlXTsKICAgICAgICB2YXIgbWFwcGluZyA9IHRoaXMubWF0Y2hNYXBwaW5nc1tjdXJyZW50U3RhdGVdOwogICAgICAgIHZhciByZSA9IHRoaXMucmVnRXhwc1tjdXJyZW50U3RhdGVdOwogICAgICAgIHJlLmxhc3RJbmRleCA9IDA7CiAgICAgICAgCiAgICAgICAgdmFyIG1hdGNoLCB0b2tlbnMgPSBbXTsKICAgICAgICAKICAgICAgICB2YXIgbGFzdEluZGV4ID0gMDsKICAgICAgICAKICAgICAgICB2YXIgdG9rZW4gPSB7CiAgICAgICAgICAgIHR5cGU6IG51bGwsCiAgICAgICAgICAgIHZhbHVlOiAiIgogICAgICAgIH07CiAgICAgICAgCiAgICAgICAgd2hpbGUgKG1hdGNoID0gcmUuZXhlYyhsaW5lKSkgewogICAgICAgICAgICB2YXIgdHlwZSA9ICJ0ZXh0IjsKICAgICAgICAgICAgdmFyIHJ1bGUgPSBudWxsOwogICAgICAgICAgICB2YXIgdmFsdWUgPSBbbWF0Y2hbMF1dOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXRjaC5sZW5ndGgtMjsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAobWF0Y2hbaSArIDFdICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICBydWxlID0gc3RhdGVbbWFwcGluZ1tpXS5ydWxlXTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBpZiAobWFwcGluZ1tpXS5sZW4gPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbWF0Y2guc2xpY2UoaSsyLCBpKzErbWFwcGluZ1tpXS5sZW4pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHRva2VuIHR5cGUKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJ1bGUudG9rZW4gPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHJ1bGUudG9rZW4uYXBwbHkodGhpcywgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHJ1bGUudG9rZW47CgogICAgICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gcnVsZS5uZXh0OyAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgJiYgbmV4dCAhPT0gY3VycmVudFN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IG5leHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gdGhpcy5ydWxlc1tjdXJyZW50U3RhdGVdOwogICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gdGhpcy5tYXRjaE1hcHBpbmdzW2N1cnJlbnRTdGF0ZV07CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RJbmRleCA9IHJlLmxhc3RJbmRleDsKCiAgICAgICAgICAgICAgICAgICAgICAgIHJlID0gdGhpcy5yZWdFeHBzW2N1cnJlbnRTdGF0ZV07CiAgICAgICAgICAgICAgICAgICAgICAgIHJlLmxhc3RJbmRleCA9IGxhc3RJbmRleDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh2YWx1ZVswXSkgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBbdmFsdWUuam9pbigiIildOwogICAgICAgICAgICAgICAgICAgIHR5cGUgPSBbdHlwZV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCghcnVsZSB8fCBydWxlLm1lcmdlIHx8IHR5cGVbaV0gPT09ICJ0ZXh0IikgJiYgdG9rZW4udHlwZSA9PT0gdHlwZVtpXSkgewogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi52YWx1ZSArPSB2YWx1ZVtpXTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdHlwZVtpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVtpXQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKGxhc3RJbmRleCA9PSBsaW5lLmxlbmd0aCkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAKICAgICAgICAgICAgbGFzdEluZGV4ID0gcmUubGFzdEluZGV4OwogICAgICAgIH0KCiAgICAgICAgaWYgKHRva2VuLnR5cGUpCiAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdG9rZW5zIDogdG9rZW5zLAogICAgICAgICAgICBzdGF0ZSA6IGN1cnJlbnRTdGF0ZQogICAgICAgIH07CiAgICB9OwoKfSkuY2FsbChUb2tlbml6ZXIucHJvdG90eXBlKTsKCmV4cG9ydHMuVG9rZW5pemVyID0gVG9rZW5pemVyOwp9KTsKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9sYW5nJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7Cgp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7CgogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzCiAgICAvLyByZWdleHBzIGFyZSBvcmRlcmVkIC0+IHRoZSBmaXJzdCBtYXRjaCBpcyB1c2VkCgogICAgdGhpcy4kcnVsZXMgPSB7CiAgICAgICAgInN0YXJ0IiA6IFt7CiAgICAgICAgICAgIHRva2VuIDogImVtcHR5X2xpbmUiLAogICAgICAgICAgICByZWdleCA6ICdeJCcKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgICAgICByZWdleCA6ICIuKyIKICAgICAgICB9XQogICAgfTsKfTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmFkZFJ1bGVzID0gZnVuY3Rpb24ocnVsZXMsIHByZWZpeCkgewogICAgICAgIGZvciAodmFyIGtleSBpbiBydWxlcykgewogICAgICAgICAgICB2YXIgc3RhdGUgPSBydWxlc1trZXldOwogICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8c3RhdGUubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciBydWxlID0gc3RhdGVbaV07CiAgICAgICAgICAgICAgICBpZiAocnVsZS5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgcnVsZS5uZXh0ID0gcHJlZml4ICsgcnVsZS5uZXh0OwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBydWxlLm5leHQgPSBwcmVmaXggKyBrZXk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy4kcnVsZXNbcHJlZml4ICsga2V5XSA9IHN0YXRlOwogICAgICAgIH0KICAgIH07CgogICAgdGhpcy5nZXRSdWxlcyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLiRydWxlczsKICAgIH07CiAgICAKICAgIHRoaXMuZW1iZWRSdWxlcyA9IGZ1bmN0aW9uIChIaWdobGlnaHRSdWxlcywgcHJlZml4LCBlc2NhcGVSdWxlcywgc3RhdGVzKSB7CiAgICAgICAgdmFyIGVtYmVkUnVsZXMgPSBuZXcgSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpOwogICAgICAgIGlmIChzdGF0ZXMpIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGF0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHN0YXRlc1tpXSA9IHByZWZpeCArIHN0YXRlc1tpXTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0YXRlcyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gZW1iZWRSdWxlcykgewogICAgICAgICAgICAgICAgc3RhdGVzLnB1c2gocHJlZml4ICsga2V5KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLmFkZFJ1bGVzKGVtYmVkUnVsZXMsIHByZWZpeCk7CiAgICAgICAgCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGF0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnVuc2hpZnQuYXBwbHkodGhpcy4kcnVsZXNbc3RhdGVzW2ldXSwgbGFuZy5kZWVwQ29weShlc2NhcGVSdWxlcykpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoIXRoaXMuJGVtYmVkcykgewogICAgICAgICAgICB0aGlzLiRlbWJlZHMgPSBbXTsKICAgICAgICB9CiAgICAgICAgdGhpcy4kZW1iZWRzLnB1c2gocHJlZml4KTsKICAgIH0KICAgIAogICAgdGhpcy5nZXRFbWJlZHMgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy4kZW1iZWRzOwogICAgfQoKfSkuY2FsbChUZXh0SGlnaGxpZ2h0UnVsZXMucHJvdG90eXBlKTsKCmV4cG9ydHMuVGV4dEhpZ2hsaWdodFJ1bGVzID0gVGV4dEhpZ2hsaWdodFJ1bGVzOwp9KTsKLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoKICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBDaHJpcyBTcGVuY2VyIDxjaHJpcy5hZy5zcGVuY2VyIEFUIGdvb2dsZW1haWwgRE9UIGNvbT4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvYmVoYXZpb3VyJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIEJlaGF2aW91ciA9IGZ1bmN0aW9uKCkgewogICB0aGlzLiRiZWhhdmlvdXJzID0ge307Cn07CgooZnVuY3Rpb24gKCkgewoKICAgIHRoaXMuYWRkID0gZnVuY3Rpb24gKG5hbWUsIGFjdGlvbiwgY2FsbGJhY2spIHsKICAgICAgICBzd2l0Y2ggKHVuZGVmaW5lZCkgewogICAgICAgICAgY2FzZSB0aGlzLiRiZWhhdmlvdXJzOgogICAgICAgICAgICAgIHRoaXMuJGJlaGF2aW91cnMgPSB7fTsKICAgICAgICAgIGNhc2UgdGhpcy4kYmVoYXZpb3Vyc1tuYW1lXToKICAgICAgICAgICAgICB0aGlzLiRiZWhhdmlvdXJzW25hbWVdID0ge307CiAgICAgICAgfQogICAgICAgIHRoaXMuJGJlaGF2aW91cnNbbmFtZV1bYWN0aW9uXSA9IGNhbGxiYWNrOwogICAgfQogICAgCiAgICB0aGlzLmFkZEJlaGF2aW91cnMgPSBmdW5jdGlvbiAoYmVoYXZpb3VycykgewogICAgICAgIGZvciAodmFyIGtleSBpbiBiZWhhdmlvdXJzKSB7CiAgICAgICAgICAgIGZvciAodmFyIGFjdGlvbiBpbiBiZWhhdmlvdXJzW2tleV0pIHsKICAgICAgICAgICAgICAgIHRoaXMuYWRkKGtleSwgYWN0aW9uLCBiZWhhdmlvdXJzW2tleV1bYWN0aW9uXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAKICAgIHRoaXMucmVtb3ZlID0gZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgICBpZiAodGhpcy4kYmVoYXZpb3VycyAmJiB0aGlzLiRiZWhhdmlvdXJzW25hbWVdKSB7CiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLiRiZWhhdmlvdXJzW25hbWVdOwogICAgICAgIH0KICAgIH0KICAgIAogICAgdGhpcy5pbmhlcml0ID0gZnVuY3Rpb24gKG1vZGUsIGZpbHRlcikgewogICAgICAgIGlmICh0eXBlb2YgbW9kZSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICB2YXIgYmVoYXZpb3VycyA9IG5ldyBtb2RlKCkuZ2V0QmVoYXZpb3VycyhmaWx0ZXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhciBiZWhhdmlvdXJzID0gbW9kZS5nZXRCZWhhdmlvdXJzKGZpbHRlcik7CiAgICAgICAgfQogICAgICAgIHRoaXMuYWRkQmVoYXZpb3VycyhiZWhhdmlvdXJzKTsKICAgIH0KICAgIAogICAgdGhpcy5nZXRCZWhhdmlvdXJzID0gZnVuY3Rpb24gKGZpbHRlcikgewogICAgICAgIGlmICghZmlsdGVyKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLiRiZWhhdmlvdXJzOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhciByZXQgPSB7fQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbHRlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuJGJlaGF2aW91cnNbZmlsdGVyW2ldXSkgewogICAgICAgICAgICAgICAgICAgIHJldFtmaWx0ZXJbaV1dID0gdGhpcy4kYmVoYXZpb3Vyc1tmaWx0ZXJbaV1dOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfQogICAgfQoKfSkuY2FsbChCZWhhdmlvdXIucHJvdG90eXBlKTsKCmV4cG9ydHMuQmVoYXZpb3VyID0gQmVoYXZpb3VyOwp9KTtkZWZpbmUoJ2FjZS91bmljb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKLyoKWFJlZ0V4cCBVbmljb2RlIHBsdWdpbiBwYWNrOiBDYXRlZ29yaWVzIDEuMAooYykgMjAxMCBTdGV2ZW4gTGV2aXRoYW4KTUlUIExpY2Vuc2UKPGh0dHA6Ly94cmVnZXhwLmNvbT4KVXNlcyB0aGUgVW5pY29kZSA1LjIgY2hhcmFjdGVyIGRhdGFiYXNlCgpUaGlzIHBhY2thZ2UgZm9yIHRoZSBYUmVnRXhwIFVuaWNvZGUgcGx1Z2luIGVuYWJsZXMgdGhlIGZvbGxvd2luZyBVbmljb2RlIGNhdGVnb3JpZXMgKGFrYSBwcm9wZXJ0aWVzKToKCkwgLSBMZXR0ZXIgKHRoZSB0b3AtbGV2ZWwgTGV0dGVyIGNhdGVnb3J5IGlzIGluY2x1ZGVkIGluIHRoZSBVbmljb2RlIHBsdWdpbiBiYXNlIHNjcmlwdCkKICAgIExsIC0gTG93ZXJjYXNlIGxldHRlcgogICAgTHUgLSBVcHBlcmNhc2UgbGV0dGVyCiAgICBMdCAtIFRpdGxlY2FzZSBsZXR0ZXIKICAgIExtIC0gTW9kaWZpZXIgbGV0dGVyCiAgICBMbyAtIExldHRlciB3aXRob3V0IGNhc2UKTSAtIE1hcmsKICAgIE1uIC0gTm9uLXNwYWNpbmcgbWFyawogICAgTWMgLSBTcGFjaW5nIGNvbWJpbmluZyBtYXJrCiAgICBNZSAtIEVuY2xvc2luZyBtYXJrCk4gLSBOdW1iZXIKICAgIE5kIC0gRGVjaW1hbCBkaWdpdAogICAgTmwgLSBMZXR0ZXIgbnVtYmVyCiAgICBObyAtICBPdGhlciBudW1iZXIKUCAtIFB1bmN0dWF0aW9uCiAgICBQZCAtIERhc2ggcHVuY3R1YXRpb24KICAgIFBzIC0gT3BlbiBwdW5jdHVhdGlvbgogICAgUGUgLSBDbG9zZSBwdW5jdHVhdGlvbgogICAgUGkgLSBJbml0aWFsIHB1bmN0dWF0aW9uCiAgICBQZiAtIEZpbmFsIHB1bmN0dWF0aW9uCiAgICBQYyAtIENvbm5lY3RvciBwdW5jdHVhdGlvbgogICAgUG8gLSBPdGhlciBwdW5jdHVhdGlvbgpTIC0gU3ltYm9sCiAgICBTbSAtIE1hdGggc3ltYm9sCiAgICBTYyAtIEN1cnJlbmN5IHN5bWJvbAogICAgU2sgLSBNb2RpZmllciBzeW1ib2wKICAgIFNvIC0gT3RoZXIgc3ltYm9sClogLSBTZXBhcmF0b3IKICAgIFpzIC0gU3BhY2Ugc2VwYXJhdG9yCiAgICBabCAtIExpbmUgc2VwYXJhdG9yCiAgICBacCAtIFBhcmFncmFwaCBzZXBhcmF0b3IKQyAtIE90aGVyCiAgICBDYyAtIENvbnRyb2wKICAgIENmIC0gRm9ybWF0CiAgICBDbyAtIFByaXZhdGUgdXNlCiAgICBDcyAtIFN1cnJvZ2F0ZQogICAgQ24gLSBVbmFzc2lnbmVkCgpFeGFtcGxlIHVzYWdlOgoKICAgIFxwe059CiAgICBccHtDbn0KKi8KCgovLyB3aWxsIGJlIHBvcHVsYXRlZCBieSBhZGRVbmljb2RlUGFja2FnZQpleHBvcnRzLnBhY2thZ2VzID0ge307CgphZGRVbmljb2RlUGFja2FnZSh7CiAgICBMOiAgIjAwNDEtMDA1QTAwNjEtMDA3QTAwQUEwMEI1MDBCQTAwQzAtMDBENjAwRDgtMDBGNjAwRjgtMDJDMTAyQzYtMDJEMTAyRTAtMDJFNDAyRUMwMkVFMDM3MC0wMzc0MDM3NjAzNzcwMzdBLTAzN0QwMzg2MDM4OC0wMzhBMDM4QzAzOEUtMDNBMTAzQTMtMDNGNTAzRjctMDQ4MTA0OEEtMDUyNTA1MzEtMDU1NjA1NTkwNTYxLTA1ODcwNUQwLTA1RUEwNUYwLTA1RjIwNjIxLTA2NEEwNjZFMDY2RjA2NzEtMDZEMzA2RDUwNkU1MDZFNjA2RUUwNkVGMDZGQS0wNkZDMDZGRjA3MTAwNzEyLTA3MkYwNzRELTA3QTUwN0IxMDdDQS0wN0VBMDdGNDA3RjUwN0ZBMDgwMC0wODE1MDgxQTA4MjQwODI4MDkwNC0wOTM5MDkzRDA5NTAwOTU4LTA5NjEwOTcxMDk3MjA5NzktMDk3RjA5ODUtMDk4QzA5OEYwOTkwMDk5My0wOUE4MDlBQS0wOUIwMDlCMjA5QjYtMDlCOTA5QkQwOUNFMDlEQzA5REQwOURGLTA5RTEwOUYwMDlGMTBBMDUtMEEwQTBBMEYwQTEwMEExMy0wQTI4MEEyQS0wQTMwMEEzMjBBMzMwQTM1MEEzNjBBMzgwQTM5MEE1OS0wQTVDMEE1RTBBNzItMEE3NDBBODUtMEE4RDBBOEYtMEE5MTBBOTMtMEFBODBBQUEtMEFCMDBBQjIwQUIzMEFCNS0wQUI5MEFCRDBBRDAwQUUwMEFFMTBCMDUtMEIwQzBCMEYwQjEwMEIxMy0wQjI4MEIyQS0wQjMwMEIzMjBCMzMwQjM1LTBCMzkwQjNEMEI1QzBCNUQwQjVGLTBCNjEwQjcxMEI4MzBCODUtMEI4QTBCOEUtMEI5MDBCOTItMEI5NTBCOTkwQjlBMEI5QzBCOUUwQjlGMEJBMzBCQTQwQkE4LTBCQUEwQkFFLTBCQjkwQkQwMEMwNS0wQzBDMEMwRS0wQzEwMEMxMi0wQzI4MEMyQS0wQzMzMEMzNS0wQzM5MEMzRDBDNTgwQzU5MEM2MDBDNjEwQzg1LTBDOEMwQzhFLTBDOTAwQzkyLTBDQTgwQ0FBLTBDQjMwQ0I1LTBDQjkwQ0JEMENERTBDRTAwQ0UxMEQwNS0wRDBDMEQwRS0wRDEwMEQxMi0wRDI4MEQyQS0wRDM5MEQzRDBENjAwRDYxMEQ3QS0wRDdGMEQ4NS0wRDk2MEQ5QS0wREIxMERCMy0wREJCMERCRDBEQzAtMERDNjBFMDEtMEUzMDBFMzIwRTMzMEU0MC0wRTQ2MEU4MTBFODIwRTg0MEU4NzBFODgwRThBMEU4RDBFOTQtMEU5NzBFOTktMEU5RjBFQTEtMEVBMzBFQTUwRUE3MEVBQTBFQUIwRUFELTBFQjAwRUIyMEVCMzBFQkQwRUMwLTBFQzQwRUM2MEVEQzBFREQwRjAwMEY0MC0wRjQ3MEY0OS0wRjZDMEY4OC0wRjhCMTAwMC0xMDJBMTAzRjEwNTAtMTA1NTEwNUEtMTA1RDEwNjExMDY1MTA2NjEwNkUtMTA3MDEwNzUtMTA4MTEwOEUxMEEwLTEwQzUxMEQwLTEwRkExMEZDMTEwMC0xMjQ4MTI0QS0xMjREMTI1MC0xMjU2MTI1ODEyNUEtMTI1RDEyNjAtMTI4ODEyOEEtMTI4RDEyOTAtMTJCMDEyQjItMTJCNTEyQjgtMTJCRTEyQzAxMkMyLTEyQzUxMkM4LTEyRDYxMkQ4LTEzMTAxMzEyLTEzMTUxMzE4LTEzNUExMzgwLTEzOEYxM0EwLTEzRjQxNDAxLTE2NkMxNjZGLTE2N0YxNjgxLTE2OUExNkEwLTE2RUExNzAwLTE3MEMxNzBFLTE3MTExNzIwLTE3MzExNzQwLTE3NTExNzYwLTE3NkMxNzZFLTE3NzAxNzgwLTE3QjMxN0Q3MTdEQzE4MjAtMTg3NzE4ODAtMThBODE4QUExOEIwLTE4RjUxOTAwLTE5MUMxOTUwLTE5NkQxOTcwLTE5NzQxOTgwLTE5QUIxOUMxLTE5QzcxQTAwLTFBMTYxQTIwLTFBNTQxQUE3MUIwNS0xQjMzMUI0NS0xQjRCMUI4My0xQkEwMUJBRTFCQUYxQzAwLTFDMjMxQzRELTFDNEYxQzVBLTFDN0QxQ0U5LTFDRUMxQ0VFLTFDRjExRDAwLTFEQkYxRTAwLTFGMTUxRjE4LTFGMUQxRjIwLTFGNDUxRjQ4LTFGNEQxRjUwLTFGNTcxRjU5MUY1QjFGNUQxRjVGLTFGN0QxRjgwLTFGQjQxRkI2LTFGQkMxRkJFMUZDMi0xRkM0MUZDNi0xRkNDMUZEMC0xRkQzMUZENi0xRkRCMUZFMC0xRkVDMUZGMi0xRkY0MUZGNi0xRkZDMjA3MTIwN0YyMDkwLTIwOTQyMTAyMjEwNzIxMEEtMjExMzIxMTUyMTE5LTIxMUQyMTI0MjEyNjIxMjgyMTJBLTIxMkQyMTJGLTIxMzkyMTNDLTIxM0YyMTQ1LTIxNDkyMTRFMjE4MzIxODQyQzAwLTJDMkUyQzMwLTJDNUUyQzYwLTJDRTQyQ0VCLTJDRUUyRDAwLTJEMjUyRDMwLTJENjUyRDZGMkQ4MC0yRDk2MkRBMC0yREE2MkRBOC0yREFFMkRCMC0yREI2MkRCOC0yREJFMkRDMC0yREM2MkRDOC0yRENFMkREMC0yREQ2MkREOC0yRERFMkUyRjMwMDUzMDA2MzAzMS0zMDM1MzAzQjMwM0MzMDQxLTMwOTYzMDlELTMwOUYzMEExLTMwRkEzMEZDLTMwRkYzMTA1LTMxMkQzMTMxLTMxOEUzMUEwLTMxQjczMUYwLTMxRkYzNDAwLTREQjU0RTAwLTlGQ0JBMDAwLUE0OENBNEQwLUE0RkRBNTAwLUE2MENBNjEwLUE2MUZBNjJBQTYyQkE2NDAtQTY1RkE2NjItQTY2RUE2N0YtQTY5N0E2QTAtQTZFNUE3MTctQTcxRkE3MjItQTc4OEE3OEJBNzhDQTdGQi1BODAxQTgwMy1BODA1QTgwNy1BODBBQTgwQy1BODIyQTg0MC1BODczQTg4Mi1BOEIzQThGMi1BOEY3QThGQkE5MEEtQTkyNUE5MzAtQTk0NkE5NjAtQTk3Q0E5ODQtQTlCMkE5Q0ZBQTAwLUFBMjhBQTQwLUFBNDJBQTQ0LUFBNEJBQTYwLUFBNzZBQTdBQUE4MC1BQUFGQUFCMUFBQjVBQUI2QUFCOS1BQUJEQUFDMEFBQzJBQURCLUFBRERBQkMwLUFCRTJBQzAwLUQ3QTNEN0IwLUQ3QzZEN0NCLUQ3RkJGOTAwLUZBMkRGQTMwLUZBNkRGQTcwLUZBRDlGQjAwLUZCMDZGQjEzLUZCMTdGQjFERkIxRi1GQjI4RkIyQS1GQjM2RkIzOC1GQjNDRkIzRUZCNDBGQjQxRkI0M0ZCNDRGQjQ2LUZCQjFGQkQzLUZEM0RGRDUwLUZEOEZGRDkyLUZEQzdGREYwLUZERkJGRTcwLUZFNzRGRTc2LUZFRkNGRjIxLUZGM0FGRjQxLUZGNUFGRjY2LUZGQkVGRkMyLUZGQzdGRkNBLUZGQ0ZGRkQyLUZGRDdGRkRBLUZGREMiLAogICAgTGw6ICIwMDYxLTAwN0EwMEFBMDBCNTAwQkEwMERGLTAwRjYwMEY4LTAwRkYwMTAxMDEwMzAxMDUwMTA3MDEwOTAxMEIwMTBEMDEwRjAxMTEwMTEzMDExNTAxMTcwMTE5MDExQjAxMUQwMTFGMDEyMTAxMjMwMTI1MDEyNzAxMjkwMTJCMDEyRDAxMkYwMTMxMDEzMzAxMzUwMTM3MDEzODAxM0EwMTNDMDEzRTAxNDAwMTQyMDE0NDAxNDYwMTQ4MDE0OTAxNEIwMTREMDE0RjAxNTEwMTUzMDE1NTAxNTcwMTU5MDE1QjAxNUQwMTVGMDE2MTAxNjMwMTY1MDE2NzAxNjkwMTZCMDE2RDAxNkYwMTcxMDE3MzAxNzUwMTc3MDE3QTAxN0MwMTdFLTAxODAwMTgzMDE4NTAxODgwMThDMDE4RDAxOTIwMTk1MDE5OS0wMTlCMDE5RTAxQTEwMUEzMDFBNTAxQTgwMUFBMDFBQjAxQUQwMUIwMDFCNDAxQjYwMUI5MDFCQTAxQkQtMDFCRjAxQzYwMUM5MDFDQzAxQ0UwMUQwMDFEMjAxRDQwMUQ2MDFEODAxREEwMURDMDFERDAxREYwMUUxMDFFMzAxRTUwMUU3MDFFOTAxRUIwMUVEMDFFRjAxRjAwMUYzMDFGNTAxRjkwMUZCMDFGRDAxRkYwMjAxMDIwMzAyMDUwMjA3MDIwOTAyMEIwMjBEMDIwRjAyMTEwMjEzMDIxNTAyMTcwMjE5MDIxQjAyMUQwMjFGMDIyMTAyMjMwMjI1MDIyNzAyMjkwMjJCMDIyRDAyMkYwMjMxMDIzMy0wMjM5MDIzQzAyM0YwMjQwMDI0MjAyNDcwMjQ5MDI0QjAyNEQwMjRGLTAyOTMwMjk1LTAyQUYwMzcxMDM3MzAzNzcwMzdCLTAzN0QwMzkwMDNBQy0wM0NFMDNEMDAzRDEwM0Q1LTAzRDcwM0Q5MDNEQjAzREQwM0RGMDNFMTAzRTMwM0U1MDNFNzAzRTkwM0VCMDNFRDAzRUYtMDNGMzAzRjUwM0Y4MDNGQjAzRkMwNDMwLTA0NUYwNDYxMDQ2MzA0NjUwNDY3MDQ2OTA0NkIwNDZEMDQ2RjA0NzEwNDczMDQ3NTA0NzcwNDc5MDQ3QjA0N0QwNDdGMDQ4MTA0OEIwNDhEMDQ4RjA0OTEwNDkzMDQ5NTA0OTcwNDk5MDQ5QjA0OUQwNDlGMDRBMTA0QTMwNEE1MDRBNzA0QTkwNEFCMDRBRDA0QUYwNEIxMDRCMzA0QjUwNEI3MDRCOTA0QkIwNEJEMDRCRjA0QzIwNEM0MDRDNjA0QzgwNENBMDRDQzA0Q0UwNENGMDREMTA0RDMwNEQ1MDRENzA0RDkwNERCMDRERDA0REYwNEUxMDRFMzA0RTUwNEU3MDRFOTA0RUIwNEVEMDRFRjA0RjEwNEYzMDRGNTA0RjcwNEY5MDRGQjA0RkQwNEZGMDUwMTA1MDMwNTA1MDUwNzA1MDkwNTBCMDUwRDA1MEYwNTExMDUxMzA1MTUwNTE3MDUxOTA1MUIwNTFEMDUxRjA1MjEwNTIzMDUyNTA1NjEtMDU4NzFEMDAtMUQyQjFENjItMUQ3NzFENzktMUQ5QTFFMDExRTAzMUUwNTFFMDcxRTA5MUUwQjFFMEQxRTBGMUUxMTFFMTMxRTE1MUUxNzFFMTkxRTFCMUUxRDFFMUYxRTIxMUUyMzFFMjUxRTI3MUUyOTFFMkIxRTJEMUUyRjFFMzExRTMzMUUzNTFFMzcxRTM5MUUzQjFFM0QxRTNGMUU0MTFFNDMxRTQ1MUU0NzFFNDkxRTRCMUU0RDFFNEYxRTUxMUU1MzFFNTUxRTU3MUU1OTFFNUIxRTVEMUU1RjFFNjExRTYzMUU2NTFFNjcxRTY5MUU2QjFFNkQxRTZGMUU3MTFFNzMxRTc1MUU3NzFFNzkxRTdCMUU3RDFFN0YxRTgxMUU4MzFFODUxRTg3MUU4OTFFOEIxRThEMUU4RjFFOTExRTkzMUU5NS0xRTlEMUU5RjFFQTExRUEzMUVBNTFFQTcxRUE5MUVBQjFFQUQxRUFGMUVCMTFFQjMxRUI1MUVCNzFFQjkxRUJCMUVCRDFFQkYxRUMxMUVDMzFFQzUxRUM3MUVDOTFFQ0IxRUNEMUVDRjFFRDExRUQzMUVENTFFRDcxRUQ5MUVEQjFFREQxRURGMUVFMTFFRTMxRUU1MUVFNzFFRTkxRUVCMUVFRDFFRUYxRUYxMUVGMzFFRjUxRUY3MUVGOTFFRkIxRUZEMUVGRi0xRjA3MUYxMC0xRjE1MUYyMC0xRjI3MUYzMC0xRjM3MUY0MC0xRjQ1MUY1MC0xRjU3MUY2MC0xRjY3MUY3MC0xRjdEMUY4MC0xRjg3MUY5MC0xRjk3MUZBMC0xRkE3MUZCMC0xRkI0MUZCNjFGQjcxRkJFMUZDMi0xRkM0MUZDNjFGQzcxRkQwLTFGRDMxRkQ2MUZENzFGRTAtMUZFNzFGRjItMUZGNDFGRjYxRkY3MjEwQTIxMEUyMTBGMjExMzIxMkYyMTM0MjEzOTIxM0MyMTNEMjE0Ni0yMTQ5MjE0RTIxODQyQzMwLTJDNUUyQzYxMkM2NTJDNjYyQzY4MkM2QTJDNkMyQzcxMkM3MzJDNzQyQzc2LTJDN0MyQzgxMkM4MzJDODUyQzg3MkM4OTJDOEIyQzhEMkM4RjJDOTEyQzkzMkM5NTJDOTcyQzk5MkM5QjJDOUQyQzlGMkNBMTJDQTMyQ0E1MkNBNzJDQTkyQ0FCMkNBRDJDQUYyQ0IxMkNCMzJDQjUyQ0I3MkNCOTJDQkIyQ0JEMkNCRjJDQzEyQ0MzMkNDNTJDQzcyQ0M5MkNDQjJDQ0QyQ0NGMkNEMTJDRDMyQ0Q1MkNENzJDRDkyQ0RCMkNERDJDREYyQ0UxMkNFMzJDRTQyQ0VDMkNFRTJEMDAtMkQyNUE2NDFBNjQzQTY0NUE2NDdBNjQ5QTY0QkE2NERBNjRGQTY1MUE2NTNBNjU1QTY1N0E2NTlBNjVCQTY1REE2NUZBNjYzQTY2NUE2NjdBNjY5QTY2QkE2NkRBNjgxQTY4M0E2ODVBNjg3QTY4OUE2OEJBNjhEQTY4RkE2OTFBNjkzQTY5NUE2OTdBNzIzQTcyNUE3MjdBNzI5QTcyQkE3MkRBNzJGLUE3MzFBNzMzQTczNUE3MzdBNzM5QTczQkE3M0RBNzNGQTc0MUE3NDNBNzQ1QTc0N0E3NDlBNzRCQTc0REE3NEZBNzUxQTc1M0E3NTVBNzU3QTc1OUE3NUJBNzVEQTc1RkE3NjFBNzYzQTc2NUE3NjdBNzY5QTc2QkE3NkRBNzZGQTc3MS1BNzc4QTc3QUE3N0NBNzdGQTc4MUE3ODNBNzg1QTc4N0E3OENGQjAwLUZCMDZGQjEzLUZCMTdGRjQxLUZGNUEiLAogICAgTHU6ICIwMDQxLTAwNUEwMEMwLTAwRDYwMEQ4LTAwREUwMTAwMDEwMjAxMDQwMTA2MDEwODAxMEEwMTBDMDEwRTAxMTAwMTEyMDExNDAxMTYwMTE4MDExQTAxMUMwMTFFMDEyMDAxMjIwMTI0MDEyNjAxMjgwMTJBMDEyQzAxMkUwMTMwMDEzMjAxMzQwMTM2MDEzOTAxM0IwMTNEMDEzRjAxNDEwMTQzMDE0NTAxNDcwMTRBMDE0QzAxNEUwMTUwMDE1MjAxNTQwMTU2MDE1ODAxNUEwMTVDMDE1RTAxNjAwMTYyMDE2NDAxNjYwMTY4MDE2QTAxNkMwMTZFMDE3MDAxNzIwMTc0MDE3NjAxNzgwMTc5MDE3QjAxN0QwMTgxMDE4MjAxODQwMTg2MDE4NzAxODktMDE4QjAxOEUtMDE5MTAxOTMwMTk0MDE5Ni0wMTk4MDE5QzAxOUQwMTlGMDFBMDAxQTIwMUE0MDFBNjAxQTcwMUE5MDFBQzAxQUUwMUFGMDFCMS0wMUIzMDFCNTAxQjcwMUI4MDFCQzAxQzQwMUM3MDFDQTAxQ0QwMUNGMDFEMTAxRDMwMUQ1MDFENzAxRDkwMURCMDFERTAxRTAwMUUyMDFFNDAxRTYwMUU4MDFFQTAxRUMwMUVFMDFGMTAxRjQwMUY2LTAxRjgwMUZBMDFGQzAxRkUwMjAwMDIwMjAyMDQwMjA2MDIwODAyMEEwMjBDMDIwRTAyMTAwMjEyMDIxNDAyMTYwMjE4MDIxQTAyMUMwMjFFMDIyMDAyMjIwMjI0MDIyNjAyMjgwMjJBMDIyQzAyMkUwMjMwMDIzMjAyM0EwMjNCMDIzRDAyM0UwMjQxMDI0My0wMjQ2MDI0ODAyNEEwMjRDMDI0RTAzNzAwMzcyMDM3NjAzODYwMzg4LTAzOEEwMzhDMDM4RTAzOEYwMzkxLTAzQTEwM0EzLTAzQUIwM0NGMDNEMi0wM0Q0MDNEODAzREEwM0RDMDNERTAzRTAwM0UyMDNFNDAzRTYwM0U4MDNFQTAzRUMwM0VFMDNGNDAzRjcwM0Y5MDNGQTAzRkQtMDQyRjA0NjAwNDYyMDQ2NDA0NjYwNDY4MDQ2QTA0NkMwNDZFMDQ3MDA0NzIwNDc0MDQ3NjA0NzgwNDdBMDQ3QzA0N0UwNDgwMDQ4QTA0OEMwNDhFMDQ5MDA0OTIwNDk0MDQ5NjA0OTgwNDlBMDQ5QzA0OUUwNEEwMDRBMjA0QTQwNEE2MDRBODA0QUEwNEFDMDRBRTA0QjAwNEIyMDRCNDA0QjYwNEI4MDRCQTA0QkMwNEJFMDRDMDA0QzEwNEMzMDRDNTA0QzcwNEM5MDRDQjA0Q0QwNEQwMDREMjA0RDQwNEQ2MDREODA0REEwNERDMDRERTA0RTAwNEUyMDRFNDA0RTYwNEU4MDRFQTA0RUMwNEVFMDRGMDA0RjIwNEY0MDRGNjA0RjgwNEZBMDRGQzA0RkUwNTAwMDUwMjA1MDQwNTA2MDUwODA1MEEwNTBDMDUwRTA1MTAwNTEyMDUxNDA1MTYwNTE4MDUxQTA1MUMwNTFFMDUyMDA1MjIwNTI0MDUzMS0wNTU2MTBBMC0xMEM1MUUwMDFFMDIxRTA0MUUwNjFFMDgxRTBBMUUwQzFFMEUxRTEwMUUxMjFFMTQxRTE2MUUxODFFMUExRTFDMUUxRTFFMjAxRTIyMUUyNDFFMjYxRTI4MUUyQTFFMkMxRTJFMUUzMDFFMzIxRTM0MUUzNjFFMzgxRTNBMUUzQzFFM0UxRTQwMUU0MjFFNDQxRTQ2MUU0ODFFNEExRTRDMUU0RTFFNTAxRTUyMUU1NDFFNTYxRTU4MUU1QTFFNUMxRTVFMUU2MDFFNjIxRTY0MUU2NjFFNjgxRTZBMUU2QzFFNkUxRTcwMUU3MjFFNzQxRTc2MUU3ODFFN0ExRTdDMUU3RTFFODAxRTgyMUU4NDFFODYxRTg4MUU4QTFFOEMxRThFMUU5MDFFOTIxRTk0MUU5RTFFQTAxRUEyMUVBNDFFQTYxRUE4MUVBQTFFQUMxRUFFMUVCMDFFQjIxRUI0MUVCNjFFQjgxRUJBMUVCQzFFQkUxRUMwMUVDMjFFQzQxRUM2MUVDODFFQ0ExRUNDMUVDRTFFRDAxRUQyMUVENDFFRDYxRUQ4MUVEQTFFREMxRURFMUVFMDFFRTIxRUU0MUVFNjFFRTgxRUVBMUVFQzFFRUUxRUYwMUVGMjFFRjQxRUY2MUVGODFFRkExRUZDMUVGRTFGMDgtMUYwRjFGMTgtMUYxRDFGMjgtMUYyRjFGMzgtMUYzRjFGNDgtMUY0RDFGNTkxRjVCMUY1RDFGNUYxRjY4LTFGNkYxRkI4LTFGQkIxRkM4LTFGQ0IxRkQ4LTFGREIxRkU4LTFGRUMxRkY4LTFGRkIyMTAyMjEwNzIxMEItMjEwRDIxMTAtMjExMjIxMTUyMTE5LTIxMUQyMTI0MjEyNjIxMjgyMTJBLTIxMkQyMTMwLTIxMzMyMTNFMjEzRjIxNDUyMTgzMkMwMC0yQzJFMkM2MDJDNjItMkM2NDJDNjcyQzY5MkM2QjJDNkQtMkM3MDJDNzIyQzc1MkM3RS0yQzgwMkM4MjJDODQyQzg2MkM4ODJDOEEyQzhDMkM4RTJDOTAyQzkyMkM5NDJDOTYyQzk4MkM5QTJDOUMyQzlFMkNBMDJDQTIyQ0E0MkNBNjJDQTgyQ0FBMkNBQzJDQUUyQ0IwMkNCMjJDQjQyQ0I2MkNCODJDQkEyQ0JDMkNCRTJDQzAyQ0MyMkNDNDJDQzYyQ0M4MkNDQTJDQ0MyQ0NFMkNEMDJDRDIyQ0Q0MkNENjJDRDgyQ0RBMkNEQzJDREUyQ0UwMkNFMjJDRUIyQ0VEQTY0MEE2NDJBNjQ0QTY0NkE2NDhBNjRBQTY0Q0E2NEVBNjUwQTY1MkE2NTRBNjU2QTY1OEE2NUFBNjVDQTY1RUE2NjJBNjY0QTY2NkE2NjhBNjZBQTY2Q0E2ODBBNjgyQTY4NEE2ODZBNjg4QTY4QUE2OENBNjhFQTY5MEE2OTJBNjk0QTY5NkE3MjJBNzI0QTcyNkE3MjhBNzJBQTcyQ0E3MkVBNzMyQTczNEE3MzZBNzM4QTczQUE3M0NBNzNFQTc0MEE3NDJBNzQ0QTc0NkE3NDhBNzRBQTc0Q0E3NEVBNzUwQTc1MkE3NTRBNzU2QTc1OEE3NUFBNzVDQTc1RUE3NjBBNzYyQTc2NEE3NjZBNzY4QTc2QUE3NkNBNzZFQTc3OUE3N0JBNzdEQTc3RUE3ODBBNzgyQTc4NEE3ODZBNzhCRkYyMS1GRjNBIiwKICAgIEx0OiAiMDFDNTAxQzgwMUNCMDFGMjFGODgtMUY4RjFGOTgtMUY5RjFGQTgtMUZBRjFGQkMxRkNDMUZGQyIsCiAgICBMbTogIjAyQjAtMDJDMTAyQzYtMDJEMTAyRTAtMDJFNDAyRUMwMkVFMDM3NDAzN0EwNTU5MDY0MDA2RTUwNkU2MDdGNDA3RjUwN0ZBMDgxQTA4MjQwODI4MDk3MTBFNDYwRUM2MTBGQzE3RDcxODQzMUFBNzFDNzgtMUM3RDFEMkMtMUQ2MTFENzgxRDlCLTFEQkYyMDcxMjA3RjIwOTAtMjA5NDJDN0QyRDZGMkUyRjMwMDUzMDMxLTMwMzUzMDNCMzA5RDMwOUUzMEZDLTMwRkVBMDE1QTRGOC1BNEZEQTYwQ0E2N0ZBNzE3LUE3MUZBNzcwQTc4OEE5Q0ZBQTcwQUFEREZGNzBGRjlFRkY5RiIsCiAgICBMbzogIjAxQkIwMUMwLTAxQzMwMjk0MDVEMC0wNUVBMDVGMC0wNUYyMDYyMS0wNjNGMDY0MS0wNjRBMDY2RTA2NkYwNjcxLTA2RDMwNkQ1MDZFRTA2RUYwNkZBLTA2RkMwNkZGMDcxMDA3MTItMDcyRjA3NEQtMDdBNTA3QjEwN0NBLTA3RUEwODAwLTA4MTUwOTA0LTA5MzkwOTNEMDk1MDA5NTgtMDk2MTA5NzIwOTc5LTA5N0YwOTg1LTA5OEMwOThGMDk5MDA5OTMtMDlBODA5QUEtMDlCMDA5QjIwOUI2LTA5QjkwOUJEMDlDRTA5REMwOUREMDlERi0wOUUxMDlGMDA5RjEwQTA1LTBBMEEwQTBGMEExMDBBMTMtMEEyODBBMkEtMEEzMDBBMzIwQTMzMEEzNTBBMzYwQTM4MEEzOTBBNTktMEE1QzBBNUUwQTcyLTBBNzQwQTg1LTBBOEQwQThGLTBBOTEwQTkzLTBBQTgwQUFBLTBBQjAwQUIyMEFCMzBBQjUtMEFCOTBBQkQwQUQwMEFFMDBBRTEwQjA1LTBCMEMwQjBGMEIxMDBCMTMtMEIyODBCMkEtMEIzMDBCMzIwQjMzMEIzNS0wQjM5MEIzRDBCNUMwQjVEMEI1Ri0wQjYxMEI3MTBCODMwQjg1LTBCOEEwQjhFLTBCOTAwQjkyLTBCOTUwQjk5MEI5QTBCOUMwQjlFMEI5RjBCQTMwQkE0MEJBOC0wQkFBMEJBRS0wQkI5MEJEMDBDMDUtMEMwQzBDMEUtMEMxMDBDMTItMEMyODBDMkEtMEMzMzBDMzUtMEMzOTBDM0QwQzU4MEM1OTBDNjAwQzYxMEM4NS0wQzhDMEM4RS0wQzkwMEM5Mi0wQ0E4MENBQS0wQ0IzMENCNS0wQ0I5MENCRDBDREUwQ0UwMENFMTBEMDUtMEQwQzBEMEUtMEQxMDBEMTItMEQyODBEMkEtMEQzOTBEM0QwRDYwMEQ2MTBEN0EtMEQ3RjBEODUtMEQ5NjBEOUEtMERCMTBEQjMtMERCQjBEQkQwREMwLTBEQzYwRTAxLTBFMzAwRTMyMEUzMzBFNDAtMEU0NTBFODEwRTgyMEU4NDBFODcwRTg4MEU4QTBFOEQwRTk0LTBFOTcwRTk5LTBFOUYwRUExLTBFQTMwRUE1MEVBNzBFQUEwRUFCMEVBRC0wRUIwMEVCMjBFQjMwRUJEMEVDMC0wRUM0MEVEQzBFREQwRjAwMEY0MC0wRjQ3MEY0OS0wRjZDMEY4OC0wRjhCMTAwMC0xMDJBMTAzRjEwNTAtMTA1NTEwNUEtMTA1RDEwNjExMDY1MTA2NjEwNkUtMTA3MDEwNzUtMTA4MTEwOEUxMEQwLTEwRkExMTAwLTEyNDgxMjRBLTEyNEQxMjUwLTEyNTYxMjU4MTI1QS0xMjVEMTI2MC0xMjg4MTI4QS0xMjhEMTI5MC0xMkIwMTJCMi0xMkI1MTJCOC0xMkJFMTJDMDEyQzItMTJDNTEyQzgtMTJENjEyRDgtMTMxMDEzMTItMTMxNTEzMTgtMTM1QTEzODAtMTM4RjEzQTAtMTNGNDE0MDEtMTY2QzE2NkYtMTY3RjE2ODEtMTY5QTE2QTAtMTZFQTE3MDAtMTcwQzE3MEUtMTcxMTE3MjAtMTczMTE3NDAtMTc1MTE3NjAtMTc2QzE3NkUtMTc3MDE3ODAtMTdCMzE3REMxODIwLTE4NDIxODQ0LTE4NzcxODgwLTE4QTgxOEFBMThCMC0xOEY1MTkwMC0xOTFDMTk1MC0xOTZEMTk3MC0xOTc0MTk4MC0xOUFCMTlDMS0xOUM3MUEwMC0xQTE2MUEyMC0xQTU0MUIwNS0xQjMzMUI0NS0xQjRCMUI4My0xQkEwMUJBRTFCQUYxQzAwLTFDMjMxQzRELTFDNEYxQzVBLTFDNzcxQ0U5LTFDRUMxQ0VFLTFDRjEyMTM1LTIxMzgyRDMwLTJENjUyRDgwLTJEOTYyREEwLTJEQTYyREE4LTJEQUUyREIwLTJEQjYyREI4LTJEQkUyREMwLTJEQzYyREM4LTJEQ0UyREQwLTJERDYyREQ4LTJEREUzMDA2MzAzQzMwNDEtMzA5NjMwOUYzMEExLTMwRkEzMEZGMzEwNS0zMTJEMzEzMS0zMThFMzFBMC0zMUI3MzFGMC0zMUZGMzQwMC00REI1NEUwMC05RkNCQTAwMC1BMDE0QTAxNi1BNDhDQTREMC1BNEY3QTUwMC1BNjBCQTYxMC1BNjFGQTYyQUE2MkJBNjZFQTZBMC1BNkU1QTdGQi1BODAxQTgwMy1BODA1QTgwNy1BODBBQTgwQy1BODIyQTg0MC1BODczQTg4Mi1BOEIzQThGMi1BOEY3QThGQkE5MEEtQTkyNUE5MzAtQTk0NkE5NjAtQTk3Q0E5ODQtQTlCMkFBMDAtQUEyOEFBNDAtQUE0MkFBNDQtQUE0QkFBNjAtQUE2RkFBNzEtQUE3NkFBN0FBQTgwLUFBQUZBQUIxQUFCNUFBQjZBQUI5LUFBQkRBQUMwQUFDMkFBREJBQURDQUJDMC1BQkUyQUMwMC1EN0EzRDdCMC1EN0M2RDdDQi1EN0ZCRjkwMC1GQTJERkEzMC1GQTZERkE3MC1GQUQ5RkIxREZCMUYtRkIyOEZCMkEtRkIzNkZCMzgtRkIzQ0ZCM0VGQjQwRkI0MUZCNDNGQjQ0RkI0Ni1GQkIxRkJEMy1GRDNERkQ1MC1GRDhGRkQ5Mi1GREM3RkRGMC1GREZCRkU3MC1GRTc0RkU3Ni1GRUZDRkY2Ni1GRjZGRkY3MS1GRjlERkZBMC1GRkJFRkZDMi1GRkM3RkZDQS1GRkNGRkZEMi1GRkQ3RkZEQS1GRkRDIiwKICAgIE06ICAiMDMwMC0wMzZGMDQ4My0wNDg5MDU5MS0wNUJEMDVCRjA1QzEwNUMyMDVDNDA1QzUwNUM3MDYxMC0wNjFBMDY0Qi0wNjVFMDY3MDA2RDYtMDZEQzA2REUtMDZFNDA2RTcwNkU4MDZFQS0wNkVEMDcxMTA3MzAtMDc0QTA3QTYtMDdCMDA3RUItMDdGMzA4MTYtMDgxOTA4MUItMDgyMzA4MjUtMDgyNzA4MjktMDgyRDA5MDAtMDkwMzA5M0MwOTNFLTA5NEUwOTUxLTA5NTUwOTYyMDk2MzA5ODEtMDk4MzA5QkMwOUJFLTA5QzQwOUM3MDlDODA5Q0ItMDlDRDA5RDcwOUUyMDlFMzBBMDEtMEEwMzBBM0MwQTNFLTBBNDIwQTQ3MEE0ODBBNEItMEE0RDBBNTEwQTcwMEE3MTBBNzUwQTgxLTBBODMwQUJDMEFCRS0wQUM1MEFDNy0wQUM5MEFDQi0wQUNEMEFFMjBBRTMwQjAxLTBCMDMwQjNDMEIzRS0wQjQ0MEI0NzBCNDgwQjRCLTBCNEQwQjU2MEI1NzBCNjIwQjYzMEI4MjBCQkUtMEJDMjBCQzYtMEJDODBCQ0EtMEJDRDBCRDcwQzAxLTBDMDMwQzNFLTBDNDQwQzQ2LTBDNDgwQzRBLTBDNEQwQzU1MEM1NjBDNjIwQzYzMEM4MjBDODMwQ0JDMENCRS0wQ0M0MENDNi0wQ0M4MENDQS0wQ0NEMENENTBDRDYwQ0UyMENFMzBEMDIwRDAzMEQzRS0wRDQ0MEQ0Ni0wRDQ4MEQ0QS0wRDREMEQ1NzBENjIwRDYzMEQ4MjBEODMwRENBMERDRi0wREQ0MERENjBERDgtMERERjBERjIwREYzMEUzMTBFMzQtMEUzQTBFNDctMEU0RTBFQjEwRUI0LTBFQjkwRUJCMEVCQzBFQzgtMEVDRDBGMTgwRjE5MEYzNTBGMzcwRjM5MEYzRTBGM0YwRjcxLTBGODQwRjg2MEY4NzBGOTAtMEY5NzBGOTktMEZCQzBGQzYxMDJCLTEwM0UxMDU2LTEwNTkxMDVFLTEwNjAxMDYyLTEwNjQxMDY3LTEwNkQxMDcxLTEwNzQxMDgyLTEwOEQxMDhGMTA5QS0xMDlEMTM1RjE3MTItMTcxNDE3MzItMTczNDE3NTIxNzUzMTc3MjE3NzMxN0I2LTE3RDMxN0REMTgwQi0xODBEMThBOTE5MjAtMTkyQjE5MzAtMTkzQjE5QjAtMTlDMDE5QzgxOUM5MUExNy0xQTFCMUE1NS0xQTVFMUE2MC0xQTdDMUE3RjFCMDAtMUIwNDFCMzQtMUI0NDFCNkItMUI3MzFCODAtMUI4MjFCQTEtMUJBQTFDMjQtMUMzNzFDRDAtMUNEMjFDRDQtMUNFODFDRUQxQ0YyMURDMC0xREU2MURGRC0xREZGMjBEMC0yMEYwMkNFRi0yQ0YxMkRFMC0yREZGMzAyQS0zMDJGMzA5OTMwOUFBNjZGLUE2NzJBNjdDQTY3REE2RjBBNkYxQTgwMkE4MDZBODBCQTgyMy1BODI3QTg4MEE4ODFBOEI0LUE4QzRBOEUwLUE4RjFBOTI2LUE5MkRBOTQ3LUE5NTNBOTgwLUE5ODNBOUIzLUE5QzBBQTI5LUFBMzZBQTQzQUE0Q0FBNERBQTdCQUFCMEFBQjItQUFCNEFBQjdBQUI4QUFCRUFBQkZBQUMxQUJFMy1BQkVBQUJFQ0FCRURGQjFFRkUwMC1GRTBGRkUyMC1GRTI2IiwKICAgIE1uOiAiMDMwMC0wMzZGMDQ4My0wNDg3MDU5MS0wNUJEMDVCRjA1QzEwNUMyMDVDNDA1QzUwNUM3MDYxMC0wNjFBMDY0Qi0wNjVFMDY3MDA2RDYtMDZEQzA2REYtMDZFNDA2RTcwNkU4MDZFQS0wNkVEMDcxMTA3MzAtMDc0QTA3QTYtMDdCMDA3RUItMDdGMzA4MTYtMDgxOTA4MUItMDgyMzA4MjUtMDgyNzA4MjktMDgyRDA5MDAtMDkwMjA5M0MwOTQxLTA5NDgwOTREMDk1MS0wOTU1MDk2MjA5NjMwOTgxMDlCQzA5QzEtMDlDNDA5Q0QwOUUyMDlFMzBBMDEwQTAyMEEzQzBBNDEwQTQyMEE0NzBBNDgwQTRCLTBBNEQwQTUxMEE3MDBBNzEwQTc1MEE4MTBBODIwQUJDMEFDMS0wQUM1MEFDNzBBQzgwQUNEMEFFMjBBRTMwQjAxMEIzQzBCM0YwQjQxLTBCNDQwQjREMEI1NjBCNjIwQjYzMEI4MjBCQzAwQkNEMEMzRS0wQzQwMEM0Ni0wQzQ4MEM0QS0wQzREMEM1NTBDNTYwQzYyMEM2MzBDQkMwQ0JGMENDNjBDQ0MwQ0NEMENFMjBDRTMwRDQxLTBENDQwRDREMEQ2MjBENjMwRENBMEREMi0wREQ0MERENjBFMzEwRTM0LTBFM0EwRTQ3LTBFNEUwRUIxMEVCNC0wRUI5MEVCQjBFQkMwRUM4LTBFQ0QwRjE4MEYxOTBGMzUwRjM3MEYzOTBGNzEtMEY3RTBGODAtMEY4NDBGODYwRjg3MEY5MC0wRjk3MEY5OS0wRkJDMEZDNjEwMkQtMTAzMDEwMzItMTAzNzEwMzkxMDNBMTAzRDEwM0UxMDU4MTA1OTEwNUUtMTA2MDEwNzEtMTA3NDEwODIxMDg1MTA4NjEwOEQxMDlEMTM1RjE3MTItMTcxNDE3MzItMTczNDE3NTIxNzUzMTc3MjE3NzMxN0I3LTE3QkQxN0M2MTdDOS0xN0QzMTdERDE4MEItMTgwRDE4QTkxOTIwLTE5MjIxOTI3MTkyODE5MzIxOTM5LTE5M0IxQTE3MUExODFBNTYxQTU4LTFBNUUxQTYwMUE2MjFBNjUtMUE2QzFBNzMtMUE3QzFBN0YxQjAwLTFCMDMxQjM0MUIzNi0xQjNBMUIzQzFCNDIxQjZCLTFCNzMxQjgwMUI4MTFCQTItMUJBNTFCQTgxQkE5MUMyQy0xQzMzMUMzNjFDMzcxQ0QwLTFDRDIxQ0Q0LTFDRTAxQ0UyLTFDRTgxQ0VEMURDMC0xREU2MURGRC0xREZGMjBEMC0yMERDMjBFMTIwRTUtMjBGMDJDRUYtMkNGMTJERTAtMkRGRjMwMkEtMzAyRjMwOTkzMDlBQTY2RkE2N0NBNjdEQTZGMEE2RjFBODAyQTgwNkE4MEJBODI1QTgyNkE4QzRBOEUwLUE4RjFBOTI2LUE5MkRBOTQ3LUE5NTFBOTgwLUE5ODJBOUIzQTlCNi1BOUI5QTlCQ0FBMjktQUEyRUFBMzFBQTMyQUEzNUFBMzZBQTQzQUE0Q0FBQjBBQUIyLUFBQjRBQUI3QUFCOEFBQkVBQUJGQUFDMUFCRTVBQkU4QUJFREZCMUVGRTAwLUZFMEZGRTIwLUZFMjYiLAogICAgTWM6ICIwOTAzMDkzRS0wOTQwMDk0OS0wOTRDMDk0RTA5ODIwOTgzMDlCRS0wOUMwMDlDNzA5QzgwOUNCMDlDQzA5RDcwQTAzMEEzRS0wQTQwMEE4MzBBQkUtMEFDMDBBQzkwQUNCMEFDQzBCMDIwQjAzMEIzRTBCNDAwQjQ3MEI0ODBCNEIwQjRDMEI1NzBCQkUwQkJGMEJDMTBCQzIwQkM2LTBCQzgwQkNBLTBCQ0MwQkQ3MEMwMS0wQzAzMEM0MS0wQzQ0MEM4MjBDODMwQ0JFMENDMC0wQ0M0MENDNzBDQzgwQ0NBMENDQjBDRDUwQ0Q2MEQwMjBEMDMwRDNFLTBENDAwRDQ2LTBENDgwRDRBLTBENEMwRDU3MEQ4MjBEODMwRENGLTBERDEwREQ4LTBEREYwREYyMERGMzBGM0UwRjNGMEY3RjEwMkIxMDJDMTAzMTEwMzgxMDNCMTAzQzEwNTYxMDU3MTA2Mi0xMDY0MTA2Ny0xMDZEMTA4MzEwODQxMDg3LTEwOEMxMDhGMTA5QS0xMDlDMTdCNjE3QkUtMTdDNTE3QzcxN0M4MTkyMy0xOTI2MTkyOS0xOTJCMTkzMDE5MzExOTMzLTE5MzgxOUIwLTE5QzAxOUM4MTlDOTFBMTktMUExQjFBNTUxQTU3MUE2MTFBNjMxQTY0MUE2RC0xQTcyMUIwNDFCMzUxQjNCMUIzRC0xQjQxMUI0MzFCNDQxQjgyMUJBMTFCQTYxQkE3MUJBQTFDMjQtMUMyQjFDMzQxQzM1MUNFMTFDRjJBODIzQTgyNEE4MjdBODgwQTg4MUE4QjQtQThDM0E5NTJBOTUzQTk4M0E5QjRBOUI1QTlCQUE5QkJBOUJELUE5QzBBQTJGQUEzMEFBMzNBQTM0QUE0REFBN0JBQkUzQUJFNEFCRTZBQkU3QUJFOUFCRUFBQkVDIiwKICAgIE1lOiAiMDQ4ODA0ODkwNkRFMjBERC0yMEUwMjBFMi0yMEU0QTY3MC1BNjcyIiwKICAgIE46ICAiMDAzMC0wMDM5MDBCMjAwQjMwMEI5MDBCQy0wMEJFMDY2MC0wNjY5MDZGMC0wNkY5MDdDMC0wN0M5MDk2Ni0wOTZGMDlFNi0wOUVGMDlGNC0wOUY5MEE2Ni0wQTZGMEFFNi0wQUVGMEI2Ni0wQjZGMEJFNi0wQkYyMEM2Ni0wQzZGMEM3OC0wQzdFMENFNi0wQ0VGMEQ2Ni0wRDc1MEU1MC0wRTU5MEVEMC0wRUQ5MEYyMC0wRjMzMTA0MC0xMDQ5MTA5MC0xMDk5MTM2OS0xMzdDMTZFRS0xNkYwMTdFMC0xN0U5MTdGMC0xN0Y5MTgxMC0xODE5MTk0Ni0xOTRGMTlEMC0xOURBMUE4MC0xQTg5MUE5MC0xQTk5MUI1MC0xQjU5MUJCMC0xQkI5MUM0MC0xQzQ5MUM1MC0xQzU5MjA3MDIwNzQtMjA3OTIwODAtMjA4OTIxNTAtMjE4MjIxODUtMjE4OTI0NjAtMjQ5QjI0RUEtMjRGRjI3NzYtMjc5MzJDRkQzMDA3MzAyMS0zMDI5MzAzOC0zMDNBMzE5Mi0zMTk1MzIyMC0zMjI5MzI1MS0zMjVGMzI4MC0zMjg5MzJCMS0zMkJGQTYyMC1BNjI5QTZFNi1BNkVGQTgzMC1BODM1QThEMC1BOEQ5QTkwMC1BOTA5QTlEMC1BOUQ5QUE1MC1BQTU5QUJGMC1BQkY5RkYxMC1GRjE5IiwKICAgIE5kOiAiMDAzMC0wMDM5MDY2MC0wNjY5MDZGMC0wNkY5MDdDMC0wN0M5MDk2Ni0wOTZGMDlFNi0wOUVGMEE2Ni0wQTZGMEFFNi0wQUVGMEI2Ni0wQjZGMEJFNi0wQkVGMEM2Ni0wQzZGMENFNi0wQ0VGMEQ2Ni0wRDZGMEU1MC0wRTU5MEVEMC0wRUQ5MEYyMC0wRjI5MTA0MC0xMDQ5MTA5MC0xMDk5MTdFMC0xN0U5MTgxMC0xODE5MTk0Ni0xOTRGMTlEMC0xOURBMUE4MC0xQTg5MUE5MC0xQTk5MUI1MC0xQjU5MUJCMC0xQkI5MUM0MC0xQzQ5MUM1MC0xQzU5QTYyMC1BNjI5QThEMC1BOEQ5QTkwMC1BOTA5QTlEMC1BOUQ5QUE1MC1BQTU5QUJGMC1BQkY5RkYxMC1GRjE5IiwKICAgIE5sOiAiMTZFRS0xNkYwMjE2MC0yMTgyMjE4NS0yMTg4MzAwNzMwMjEtMzAyOTMwMzgtMzAzQUE2RTYtQTZFRiIsCiAgICBObzogIjAwQjIwMEIzMDBCOTAwQkMtMDBCRTA5RjQtMDlGOTBCRjAtMEJGMjBDNzgtMEM3RTBENzAtMEQ3NTBGMkEtMEYzMzEzNjktMTM3QzE3RjAtMTdGOTIwNzAyMDc0LTIwNzkyMDgwLTIwODkyMTUwLTIxNUYyMTg5MjQ2MC0yNDlCMjRFQS0yNEZGMjc3Ni0yNzkzMkNGRDMxOTItMzE5NTMyMjAtMzIyOTMyNTEtMzI1RjMyODAtMzI4OTMyQjEtMzJCRkE4MzAtQTgzNSIsCiAgICBQOiAgIjAwMjEtMDAyMzAwMjUtMDAyQTAwMkMtMDAyRjAwM0EwMDNCMDAzRjAwNDAwMDVCLTAwNUQwMDVGMDA3QjAwN0QwMEExMDBBQjAwQjcwMEJCMDBCRjAzN0UwMzg3MDU1QS0wNTVGMDU4OTA1OEEwNUJFMDVDMDA1QzMwNUM2MDVGMzA1RjQwNjA5MDYwQTA2MEMwNjBEMDYxQjA2MUUwNjFGMDY2QS0wNjZEMDZENDA3MDAtMDcwRDA3RjctMDdGOTA4MzAtMDgzRTA5NjQwOTY1MDk3MDBERjQwRTRGMEU1QTBFNUIwRjA0LTBGMTIwRjNBLTBGM0QwRjg1MEZEMC0wRkQ0MTA0QS0xMDRGMTBGQjEzNjEtMTM2ODE0MDAxNjZEMTY2RTE2OUIxNjlDMTZFQi0xNkVEMTczNTE3MzYxN0Q0LTE3RDYxN0Q4LTE3REExODAwLTE4MEExOTQ0MTk0NTE5REUxOURGMUExRTFBMUYxQUEwLTFBQTYxQUE4LTFBQUQxQjVBLTFCNjAxQzNCLTFDM0YxQzdFMUM3RjFDRDMyMDEwLTIwMjcyMDMwLTIwNDMyMDQ1LTIwNTEyMDUzLTIwNUUyMDdEMjA3RTIwOEQyMDhFMjMyOTIzMkEyNzY4LTI3NzUyN0M1MjdDNjI3RTYtMjdFRjI5ODMtMjk5ODI5RDgtMjlEQjI5RkMyOUZEMkNGOS0yQ0ZDMkNGRTJDRkYyRTAwLTJFMkUyRTMwMkUzMTMwMDEtMzAwMzMwMDgtMzAxMTMwMTQtMzAxRjMwMzAzMDNEMzBBMDMwRkJBNEZFQTRGRkE2MEQtQTYwRkE2NzNBNjdFQTZGMi1BNkY3QTg3NC1BODc3QThDRUE4Q0ZBOEY4LUE4RkFBOTJFQTkyRkE5NUZBOUMxLUE5Q0RBOURFQTlERkFBNUMtQUE1RkFBREVBQURGQUJFQkZEM0VGRDNGRkUxMC1GRTE5RkUzMC1GRTUyRkU1NC1GRTYxRkU2M0ZFNjhGRTZBRkU2QkZGMDEtRkYwM0ZGMDUtRkYwQUZGMEMtRkYwRkZGMUFGRjFCRkYxRkZGMjBGRjNCLUZGM0RGRjNGRkY1QkZGNURGRjVGLUZGNjUiLAogICAgUGQ6ICIwMDJEMDU4QTA1QkUxNDAwMTgwNjIwMTAtMjAxNTJFMTcyRTFBMzAxQzMwMzAzMEEwRkUzMUZFMzJGRTU4RkU2M0ZGMEQiLAogICAgUHM6ICIwMDI4MDA1QjAwN0IwRjNBMEYzQzE2OUIyMDFBMjAxRTIwNDUyMDdEMjA4RDIzMjkyNzY4Mjc2QTI3NkMyNzZFMjc3MDI3NzIyNzc0MjdDNTI3RTYyN0U4MjdFQTI3RUMyN0VFMjk4MzI5ODUyOTg3Mjk4OTI5OEIyOThEMjk4RjI5OTEyOTkzMjk5NTI5OTcyOUQ4MjlEQTI5RkMyRTIyMkUyNDJFMjYyRTI4MzAwODMwMEEzMDBDMzAwRTMwMTAzMDE0MzAxNjMwMTgzMDFBMzAxREZEM0VGRTE3RkUzNUZFMzdGRTM5RkUzQkZFM0RGRTNGRkU0MUZFNDNGRTQ3RkU1OUZFNUJGRTVERkYwOEZGM0JGRjVCRkY1RkZGNjIiLAogICAgUGU6ICIwMDI5MDA1RDAwN0QwRjNCMEYzRDE2OUMyMDQ2MjA3RTIwOEUyMzJBMjc2OTI3NkIyNzZEMjc2RjI3NzEyNzczMjc3NTI3QzYyN0U3MjdFOTI3RUIyN0VEMjdFRjI5ODQyOTg2Mjk4ODI5OEEyOThDMjk4RTI5OTAyOTkyMjk5NDI5OTYyOTk4MjlEOTI5REIyOUZEMkUyMzJFMjUyRTI3MkUyOTMwMDkzMDBCMzAwRDMwMEYzMDExMzAxNTMwMTczMDE5MzAxQjMwMUUzMDFGRkQzRkZFMThGRTM2RkUzOEZFM0FGRTNDRkUzRUZFNDBGRTQyRkU0NEZFNDhGRTVBRkU1Q0ZFNUVGRjA5RkYzREZGNURGRjYwRkY2MyIsCiAgICBQaTogIjAwQUIyMDE4MjAxQjIwMUMyMDFGMjAzOTJFMDIyRTA0MkUwOTJFMEMyRTFDMkUyMCIsCiAgICBQZjogIjAwQkIyMDE5MjAxRDIwM0EyRTAzMkUwNTJFMEEyRTBEMkUxRDJFMjEiLAogICAgUGM6ICIwMDVGMjAzRjIwNDAyMDU0RkUzM0ZFMzRGRTRELUZFNEZGRjNGIiwKICAgIFBvOiAiMDAyMS0wMDIzMDAyNS0wMDI3MDAyQTAwMkMwMDJFMDAyRjAwM0EwMDNCMDAzRjAwNDAwMDVDMDBBMTAwQjcwMEJGMDM3RTAzODcwNTVBLTA1NUYwNTg5MDVDMDA1QzMwNUM2MDVGMzA1RjQwNjA5MDYwQTA2MEMwNjBEMDYxQjA2MUUwNjFGMDY2QS0wNjZEMDZENDA3MDAtMDcwRDA3RjctMDdGOTA4MzAtMDgzRTA5NjQwOTY1MDk3MDBERjQwRTRGMEU1QTBFNUIwRjA0LTBGMTIwRjg1MEZEMC0wRkQ0MTA0QS0xMDRGMTBGQjEzNjEtMTM2ODE2NkQxNjZFMTZFQi0xNkVEMTczNTE3MzYxN0Q0LTE3RDYxN0Q4LTE3REExODAwLTE4MDUxODA3LTE4MEExOTQ0MTk0NTE5REUxOURGMUExRTFBMUYxQUEwLTFBQTYxQUE4LTFBQUQxQjVBLTFCNjAxQzNCLTFDM0YxQzdFMUM3RjFDRDMyMDE2MjAxNzIwMjAtMjAyNzIwMzAtMjAzODIwM0ItMjAzRTIwNDEtMjA0MzIwNDctMjA1MTIwNTMyMDU1LTIwNUUyQ0Y5LTJDRkMyQ0ZFMkNGRjJFMDAyRTAxMkUwNi0yRTA4MkUwQjJFMEUtMkUxNjJFMTgyRTE5MkUxQjJFMUUyRTFGMkUyQS0yRTJFMkUzMDJFMzEzMDAxLTMwMDMzMDNEMzBGQkE0RkVBNEZGQTYwRC1BNjBGQTY3M0E2N0VBNkYyLUE2RjdBODc0LUE4NzdBOENFQThDRkE4RjgtQThGQUE5MkVBOTJGQTk1RkE5QzEtQTlDREE5REVBOURGQUE1Qy1BQTVGQUFERUFBREZBQkVCRkUxMC1GRTE2RkUxOUZFMzBGRTQ1RkU0NkZFNDktRkU0Q0ZFNTAtRkU1MkZFNTQtRkU1N0ZFNUYtRkU2MUZFNjhGRTZBRkU2QkZGMDEtRkYwM0ZGMDUtRkYwN0ZGMEFGRjBDRkYwRUZGMEZGRjFBRkYxQkZGMUZGRjIwRkYzQ0ZGNjFGRjY0RkY2NSIsCiAgICBTOiAgIjAwMjQwMDJCMDAzQy0wMDNFMDA1RTAwNjAwMDdDMDA3RTAwQTItMDBBOTAwQUMwMEFFLTAwQjEwMEI0MDBCNjAwQjgwMEQ3MDBGNzAyQzItMDJDNTAyRDItMDJERjAyRTUtMDJFQjAyRUQwMkVGLTAyRkYwMzc1MDM4NDAzODUwM0Y2MDQ4MjA2MDYtMDYwODA2MEIwNjBFMDYwRjA2RTkwNkZEMDZGRTA3RjYwOUYyMDlGMzA5RkEwOUZCMEFGMTBCNzAwQkYzLTBCRkEwQzdGMENGMTBDRjIwRDc5MEUzRjBGMDEtMEYwMzBGMTMtMEYxNzBGMUEtMEYxRjBGMzQwRjM2MEYzODBGQkUtMEZDNTBGQzctMEZDQzBGQ0UwRkNGMEZENS0wRkQ4MTA5RTEwOUYxMzYwMTM5MC0xMzk5MTdEQjE5NDAxOUUwLTE5RkYxQjYxLTFCNkExQjc0LTFCN0MxRkJEMUZCRi0xRkMxMUZDRC0xRkNGMUZERC0xRkRGMUZFRC0xRkVGMUZGRDFGRkUyMDQ0MjA1MjIwN0EtMjA3QzIwOEEtMjA4QzIwQTAtMjBCODIxMDAyMTAxMjEwMy0yMTA2MjEwODIxMDkyMTE0MjExNi0yMTE4MjExRS0yMTIzMjEyNTIxMjcyMTI5MjEyRTIxM0EyMTNCMjE0MC0yMTQ0MjE0QS0yMTREMjE0RjIxOTAtMjMyODIzMkItMjNFODI0MDAtMjQyNjI0NDAtMjQ0QTI0OUMtMjRFOTI1MDAtMjZDRDI2Q0YtMjZFMTI2RTMyNkU4LTI2RkYyNzAxLTI3MDQyNzA2LTI3MDkyNzBDLTI3MjcyNzI5LTI3NEIyNzREMjc0Ri0yNzUyMjc1Ni0yNzVFMjc2MS0yNzY3Mjc5NDI3OTgtMjdBRjI3QjEtMjdCRTI3QzAtMjdDNDI3QzctMjdDQTI3Q0MyN0QwLTI3RTUyN0YwLTI5ODIyOTk5LTI5RDcyOURDLTI5RkIyOUZFLTJCNEMyQjUwLTJCNTkyQ0U1LTJDRUEyRTgwLTJFOTkyRTlCLTJFRjMyRjAwLTJGRDUyRkYwLTJGRkIzMDA0MzAxMjMwMTMzMDIwMzAzNjMwMzczMDNFMzAzRjMwOUIzMDlDMzE5MDMxOTEzMTk2LTMxOUYzMUMwLTMxRTMzMjAwLTMyMUUzMjJBLTMyNTAzMjYwLTMyN0YzMjhBLTMyQjAzMkMwLTMyRkUzMzAwLTMzRkY0REMwLTRERkZBNDkwLUE0QzZBNzAwLUE3MTZBNzIwQTcyMUE3ODlBNzhBQTgyOC1BODJCQTgzNi1BODM5QUE3Ny1BQTc5RkIyOUZERkNGREZERkU2MkZFNjQtRkU2NkZFNjlGRjA0RkYwQkZGMUMtRkYxRUZGM0VGRjQwRkY1Q0ZGNUVGRkUwLUZGRTZGRkU4LUZGRUVGRkZDRkZGRCIsCiAgICBTbTogIjAwMkIwMDNDLTAwM0UwMDdDMDA3RTAwQUMwMEIxMDBENzAwRjcwM0Y2MDYwNi0wNjA4MjA0NDIwNTIyMDdBLTIwN0MyMDhBLTIwOEMyMTQwLTIxNDQyMTRCMjE5MC0yMTk0MjE5QTIxOUIyMUEwMjFBMzIxQTYyMUFFMjFDRTIxQ0YyMUQyMjFENDIxRjQtMjJGRjIzMDgtMjMwQjIzMjAyMzIxMjM3QzIzOUItMjNCMzIzREMtMjNFMTI1QjcyNUMxMjVGOC0yNUZGMjY2RjI3QzAtMjdDNDI3QzctMjdDQTI3Q0MyN0QwLTI3RTUyN0YwLTI3RkYyOTAwLTI5ODIyOTk5LTI5RDcyOURDLTI5RkIyOUZFLTJBRkYyQjMwLTJCNDQyQjQ3LTJCNENGQjI5RkU2MkZFNjQtRkU2NkZGMEJGRjFDLUZGMUVGRjVDRkY1RUZGRTJGRkU5LUZGRUMiLAogICAgU2M6ICIwMDI0MDBBMi0wMEE1MDYwQjA5RjIwOUYzMDlGQjBBRjEwQkY5MEUzRjE3REIyMEEwLTIwQjhBODM4RkRGQ0ZFNjlGRjA0RkZFMEZGRTFGRkU1RkZFNiIsCiAgICBTazogIjAwNUUwMDYwMDBBODAwQUYwMEI0MDBCODAyQzItMDJDNTAyRDItMDJERjAyRTUtMDJFQjAyRUQwMkVGLTAyRkYwMzc1MDM4NDAzODUxRkJEMUZCRi0xRkMxMUZDRC0xRkNGMUZERC0xRkRGMUZFRC0xRkVGMUZGRDFGRkUzMDlCMzA5Q0E3MDAtQTcxNkE3MjBBNzIxQTc4OUE3OEFGRjNFRkY0MEZGRTMiLAogICAgU286ICIwMEE2MDBBNzAwQTkwMEFFMDBCMDAwQjYwNDgyMDYwRTA2MEYwNkU5MDZGRDA2RkUwN0Y2MDlGQTBCNzAwQkYzLTBCRjgwQkZBMEM3RjBDRjEwQ0YyMEQ3OTBGMDEtMEYwMzBGMTMtMEYxNzBGMUEtMEYxRjBGMzQwRjM2MEYzODBGQkUtMEZDNTBGQzctMEZDQzBGQ0UwRkNGMEZENS0wRkQ4MTA5RTEwOUYxMzYwMTM5MC0xMzk5MTk0MDE5RTAtMTlGRjFCNjEtMUI2QTFCNzQtMUI3QzIxMDAyMTAxMjEwMy0yMTA2MjEwODIxMDkyMTE0MjExNi0yMTE4MjExRS0yMTIzMjEyNTIxMjcyMTI5MjEyRTIxM0EyMTNCMjE0QTIxNEMyMTREMjE0RjIxOTUtMjE5OTIxOUMtMjE5RjIxQTEyMUEyMjFBNDIxQTUyMUE3LTIxQUQyMUFGLTIxQ0QyMUQwMjFEMTIxRDMyMUQ1LTIxRjMyMzAwLTIzMDcyMzBDLTIzMUYyMzIyLTIzMjgyMzJCLTIzN0IyMzdELTIzOUEyM0I0LTIzREIyM0UyLTIzRTgyNDAwLTI0MjYyNDQwLTI0NEEyNDlDLTI0RTkyNTAwLTI1QjYyNUI4LTI1QzAyNUMyLTI1RjcyNjAwLTI2NkUyNjcwLTI2Q0QyNkNGLTI2RTEyNkUzMjZFOC0yNkZGMjcwMS0yNzA0MjcwNi0yNzA5MjcwQy0yNzI3MjcyOS0yNzRCMjc0RDI3NEYtMjc1MjI3NTYtMjc1RTI3NjEtMjc2NzI3OTQyNzk4LTI3QUYyN0IxLTI3QkUyODAwLTI4RkYyQjAwLTJCMkYyQjQ1MkI0NjJCNTAtMkI1OTJDRTUtMkNFQTJFODAtMkU5OTJFOUItMkVGMzJGMDAtMkZENTJGRjAtMkZGQjMwMDQzMDEyMzAxMzMwMjAzMDM2MzAzNzMwM0UzMDNGMzE5MDMxOTEzMTk2LTMxOUYzMUMwLTMxRTMzMjAwLTMyMUUzMjJBLTMyNTAzMjYwLTMyN0YzMjhBLTMyQjAzMkMwLTMyRkUzMzAwLTMzRkY0REMwLTRERkZBNDkwLUE0QzZBODI4LUE4MkJBODM2QTgzN0E4MzlBQTc3LUFBNzlGREZERkZFNEZGRThGRkVERkZFRUZGRkNGRkZEIiwKICAgIFo6ICAiMDAyMDAwQTAxNjgwMTgwRTIwMDAtMjAwQTIwMjgyMDI5MjAyRjIwNUYzMDAwIiwKICAgIFpzOiAiMDAyMDAwQTAxNjgwMTgwRTIwMDAtMjAwQTIwMkYyMDVGMzAwMCIsCiAgICBabDogIjIwMjgiLAogICAgWnA6ICIyMDI5IiwKICAgIEM6ICAiMDAwMC0wMDFGMDA3Ri0wMDlGMDBBRDAzNzgwMzc5MDM3Ri0wMzgzMDM4QjAzOEQwM0EyMDUyNi0wNTMwMDU1NzA1NTgwNTYwMDU4ODA1OEItMDU5MDA1QzgtMDVDRjA1RUItMDVFRjA1RjUtMDYwNTA2MUMwNjFEMDYyMDA2NUYwNkREMDcwRTA3MEYwNzRCMDc0QzA3QjItMDdCRjA3RkItMDdGRjA4MkUwODJGMDgzRi0wOEZGMDkzQTA5M0IwOTRGMDk1NjA5NTcwOTczLTA5NzgwOTgwMDk4NDA5OEQwOThFMDk5MTA5OTIwOUE5MDlCMTA5QjMtMDlCNTA5QkEwOUJCMDlDNTA5QzYwOUM5MDlDQTA5Q0YtMDlENjA5RDgtMDlEQjA5REUwOUU0MDlFNTA5RkMtMEEwMDBBMDQwQTBCLTBBMEUwQTExMEExMjBBMjkwQTMxMEEzNDBBMzcwQTNBMEEzQjBBM0QwQTQzLTBBNDYwQTQ5MEE0QTBBNEUtMEE1MDBBNTItMEE1ODBBNUQwQTVGLTBBNjUwQTc2LTBBODAwQTg0MEE4RTBBOTIwQUE5MEFCMTBBQjQwQUJBMEFCQjBBQzYwQUNBMEFDRTBBQ0YwQUQxLTBBREYwQUU0MEFFNTBBRjAwQUYyLTBCMDAwQjA0MEIwRDBCMEUwQjExMEIxMjBCMjkwQjMxMEIzNDBCM0EwQjNCMEI0NTBCNDYwQjQ5MEI0QTBCNEUtMEI1NTBCNTgtMEI1QjBCNUUwQjY0MEI2NTBCNzItMEI4MTBCODQwQjhCLTBCOEQwQjkxMEI5Ni0wQjk4MEI5QjBCOUQwQkEwLTBCQTIwQkE1LTBCQTcwQkFCLTBCQUQwQkJBLTBCQkQwQkMzLTBCQzUwQkM5MEJDRTBCQ0YwQkQxLTBCRDYwQkQ4LTBCRTUwQkZCLTBDMDAwQzA0MEMwRDBDMTEwQzI5MEMzNDBDM0EtMEMzQzBDNDUwQzQ5MEM0RS0wQzU0MEM1NzBDNUEtMEM1RjBDNjQwQzY1MEM3MC0wQzc3MEM4MDBDODEwQzg0MEM4RDBDOTEwQ0E5MENCNDBDQkEwQ0JCMENDNTBDQzkwQ0NFLTBDRDQwQ0Q3LTBDREQwQ0RGMENFNDBDRTUwQ0YwMENGMy0wRDAxMEQwNDBEMEQwRDExMEQyOTBEM0EtMEQzQzBENDUwRDQ5MEQ0RS0wRDU2MEQ1OC0wRDVGMEQ2NDBENjUwRDc2LTBENzgwRDgwMEQ4MTBEODQwRDk3LTBEOTkwREIyMERCQzBEQkUwREJGMERDNy0wREM5MERDQi0wRENFMERENTBERDcwREUwLTBERjEwREY1LTBFMDAwRTNCLTBFM0UwRTVDLTBFODAwRTgzMEU4NTBFODYwRTg5MEU4QjBFOEMwRThFLTBFOTMwRTk4MEVBMDBFQTQwRUE2MEVBODBFQTkwRUFDMEVCQTBFQkUwRUJGMEVDNTBFQzcwRUNFMEVDRjBFREEwRURCMEVERS0wRUZGMEY0ODBGNkQtMEY3MDBGOEMtMEY4RjBGOTgwRkJEMEZDRDBGRDktMEZGRjEwQzYtMTBDRjEwRkQtMTBGRjEyNDkxMjRFMTI0RjEyNTcxMjU5MTI1RTEyNUYxMjg5MTI4RTEyOEYxMkIxMTJCNjEyQjcxMkJGMTJDMTEyQzYxMkM3MTJENzEzMTExMzE2MTMxNzEzNUItMTM1RTEzN0QtMTM3RjEzOUEtMTM5RjEzRjUtMTNGRjE2OUQtMTY5RjE2RjEtMTZGRjE3MEQxNzE1LTE3MUYxNzM3LTE3M0YxNzU0LTE3NUYxNzZEMTc3MTE3NzQtMTc3RjE3QjQxN0I1MTdERTE3REYxN0VBLTE3RUYxN0ZBLTE3RkYxODBGMTgxQS0xODFGMTg3OC0xODdGMThBQi0xOEFGMThGNi0xOEZGMTkxRC0xOTFGMTkyQy0xOTJGMTkzQy0xOTNGMTk0MS0xOTQzMTk2RTE5NkYxOTc1LTE5N0YxOUFDLTE5QUYxOUNBLTE5Q0YxOURCLTE5REQxQTFDMUExRDFBNUYxQTdEMUE3RTFBOEEtMUE4RjFBOUEtMUE5RjFBQUUtMUFGRjFCNEMtMUI0RjFCN0QtMUI3RjFCQUItMUJBRDFCQkEtMUJGRjFDMzgtMUMzQTFDNEEtMUM0QzFDODAtMUNDRjFDRjMtMUNGRjFERTctMURGQzFGMTYxRjE3MUYxRTFGMUYxRjQ2MUY0NzFGNEUxRjRGMUY1ODFGNUExRjVDMUY1RTFGN0UxRjdGMUZCNTFGQzUxRkQ0MUZENTFGREMxRkYwMUZGMTFGRjUxRkZGMjAwQi0yMDBGMjAyQS0yMDJFMjA2MC0yMDZGMjA3MjIwNzMyMDhGMjA5NS0yMDlGMjBCOS0yMENGMjBGMS0yMEZGMjE4QS0yMThGMjNFOS0yM0ZGMjQyNy0yNDNGMjQ0Qi0yNDVGMjZDRTI2RTIyNkU0LTI2RTcyNzAwMjcwNTI3MEEyNzBCMjcyODI3NEMyNzRFMjc1My0yNzU1Mjc1RjI3NjAyNzk1LTI3OTcyN0IwMjdCRjI3Q0IyN0NELTI3Q0YyQjRELTJCNEYyQjVBLTJCRkYyQzJGMkM1RjJDRjItMkNGODJEMjYtMkQyRjJENjYtMkQ2RTJENzAtMkQ3RjJEOTctMkQ5RjJEQTcyREFGMkRCNzJEQkYyREM3MkRDRjJERDcyRERGMkUzMi0yRTdGMkU5QTJFRjQtMkVGRjJGRDYtMkZFRjJGRkMtMkZGRjMwNDAzMDk3MzA5ODMxMDAtMzEwNDMxMkUtMzEzMDMxOEYzMUI4LTMxQkYzMUU0LTMxRUYzMjFGMzJGRjREQjYtNERCRjlGQ0MtOUZGRkE0OEQtQTQ4RkE0QzctQTRDRkE2MkMtQTYzRkE2NjBBNjYxQTY3NC1BNjdCQTY5OC1BNjlGQTZGOC1BNkZGQTc4RC1BN0ZBQTgyQy1BODJGQTgzQS1BODNGQTg3OC1BODdGQThDNS1BOENEQThEQS1BOERGQThGQy1BOEZGQTk1NC1BOTVFQTk3RC1BOTdGQTlDRUE5REEtQTlEREE5RTAtQTlGRkFBMzctQUEzRkFBNEVBQTRGQUE1QUFBNUJBQTdDLUFBN0ZBQUMzLUFBREFBQUUwLUFCQkZBQkVFQUJFRkFCRkEtQUJGRkQ3QTQtRDdBRkQ3QzctRDdDQUQ3RkMtRjhGRkZBMkVGQTJGRkE2RUZBNkZGQURBLUZBRkZGQjA3LUZCMTJGQjE4LUZCMUNGQjM3RkIzREZCM0ZGQjQyRkI0NUZCQjItRkJEMkZENDAtRkQ0RkZEOTBGRDkxRkRDOC1GREVGRkRGRUZERkZGRTFBLUZFMUZGRTI3LUZFMkZGRTUzRkU2N0ZFNkMtRkU2RkZFNzVGRUZELUZGMDBGRkJGLUZGQzFGRkM4RkZDOUZGRDBGRkQxRkZEOEZGRDlGRkRELUZGREZGRkU3RkZFRi1GRkZCRkZGRUZGRkYiLAogICAgQ2M6ICIwMDAwLTAwMUYwMDdGLTAwOUYiLAogICAgQ2Y6ICIwMEFEMDYwMC0wNjAzMDZERDA3MEYxN0I0MTdCNTIwMEItMjAwRjIwMkEtMjAyRTIwNjAtMjA2NDIwNkEtMjA2RkZFRkZGRkY5LUZGRkIiLAogICAgQ286ICJFMDAwLUY4RkYiLAogICAgQ3M6ICJEODAwLURGRkYiLAogICAgQ246ICIwMzc4MDM3OTAzN0YtMDM4MzAzOEIwMzhEMDNBMjA1MjYtMDUzMDA1NTcwNTU4MDU2MDA1ODgwNThCLTA1OTAwNUM4LTA1Q0YwNUVCLTA1RUYwNUY1LTA1RkYwNjA0MDYwNTA2MUMwNjFEMDYyMDA2NUYwNzBFMDc0QjA3NEMwN0IyLTA3QkYwN0ZCLTA3RkYwODJFMDgyRjA4M0YtMDhGRjA5M0EwOTNCMDk0RjA5NTYwOTU3MDk3My0wOTc4MDk4MDA5ODQwOThEMDk4RTA5OTEwOTkyMDlBOTA5QjEwOUIzLTA5QjUwOUJBMDlCQjA5QzUwOUM2MDlDOTA5Q0EwOUNGLTA5RDYwOUQ4LTA5REIwOURFMDlFNDA5RTUwOUZDLTBBMDAwQTA0MEEwQi0wQTBFMEExMTBBMTIwQTI5MEEzMTBBMzQwQTM3MEEzQTBBM0IwQTNEMEE0My0wQTQ2MEE0OTBBNEEwQTRFLTBBNTAwQTUyLTBBNTgwQTVEMEE1Ri0wQTY1MEE3Ni0wQTgwMEE4NDBBOEUwQTkyMEFBOTBBQjEwQUI0MEFCQTBBQkIwQUM2MEFDQTBBQ0UwQUNGMEFEMS0wQURGMEFFNDBBRTUwQUYwMEFGMi0wQjAwMEIwNDBCMEQwQjBFMEIxMTBCMTIwQjI5MEIzMTBCMzQwQjNBMEIzQjBCNDUwQjQ2MEI0OTBCNEEwQjRFLTBCNTUwQjU4LTBCNUIwQjVFMEI2NDBCNjUwQjcyLTBCODEwQjg0MEI4Qi0wQjhEMEI5MTBCOTYtMEI5ODBCOUIwQjlEMEJBMC0wQkEyMEJBNS0wQkE3MEJBQi0wQkFEMEJCQS0wQkJEMEJDMy0wQkM1MEJDOTBCQ0UwQkNGMEJEMS0wQkQ2MEJEOC0wQkU1MEJGQi0wQzAwMEMwNDBDMEQwQzExMEMyOTBDMzQwQzNBLTBDM0MwQzQ1MEM0OTBDNEUtMEM1NDBDNTcwQzVBLTBDNUYwQzY0MEM2NTBDNzAtMEM3NzBDODAwQzgxMEM4NDBDOEQwQzkxMENBOTBDQjQwQ0JBMENCQjBDQzUwQ0M5MENDRS0wQ0Q0MENENy0wQ0REMENERjBDRTQwQ0U1MENGMDBDRjMtMEQwMTBEMDQwRDBEMEQxMTBEMjkwRDNBLTBEM0MwRDQ1MEQ0OTBENEUtMEQ1NjBENTgtMEQ1RjBENjQwRDY1MEQ3Ni0wRDc4MEQ4MDBEODEwRDg0MEQ5Ny0wRDk5MERCMjBEQkMwREJFMERCRjBEQzctMERDOTBEQ0ItMERDRTBERDUwREQ3MERFMC0wREYxMERGNS0wRTAwMEUzQi0wRTNFMEU1Qy0wRTgwMEU4MzBFODUwRTg2MEU4OTBFOEIwRThDMEU4RS0wRTkzMEU5ODBFQTAwRUE0MEVBNjBFQTgwRUE5MEVBQzBFQkEwRUJFMEVCRjBFQzUwRUM3MEVDRTBFQ0YwRURBMEVEQjBFREUtMEVGRjBGNDgwRjZELTBGNzAwRjhDLTBGOEYwRjk4MEZCRDBGQ0QwRkQ5LTBGRkYxMEM2LTEwQ0YxMEZELTEwRkYxMjQ5MTI0RTEyNEYxMjU3MTI1OTEyNUUxMjVGMTI4OTEyOEUxMjhGMTJCMTEyQjYxMkI3MTJCRjEyQzExMkM2MTJDNzEyRDcxMzExMTMxNjEzMTcxMzVCLTEzNUUxMzdELTEzN0YxMzlBLTEzOUYxM0Y1LTEzRkYxNjlELTE2OUYxNkYxLTE2RkYxNzBEMTcxNS0xNzFGMTczNy0xNzNGMTc1NC0xNzVGMTc2RDE3NzExNzc0LTE3N0YxN0RFMTdERjE3RUEtMTdFRjE3RkEtMTdGRjE4MEYxODFBLTE4MUYxODc4LTE4N0YxOEFCLTE4QUYxOEY2LTE4RkYxOTFELTE5MUYxOTJDLTE5MkYxOTNDLTE5M0YxOTQxLTE5NDMxOTZFMTk2RjE5NzUtMTk3RjE5QUMtMTlBRjE5Q0EtMTlDRjE5REItMTlERDFBMUMxQTFEMUE1RjFBN0QxQTdFMUE4QS0xQThGMUE5QS0xQTlGMUFBRS0xQUZGMUI0Qy0xQjRGMUI3RC0xQjdGMUJBQi0xQkFEMUJCQS0xQkZGMUMzOC0xQzNBMUM0QS0xQzRDMUM4MC0xQ0NGMUNGMy0xQ0ZGMURFNy0xREZDMUYxNjFGMTcxRjFFMUYxRjFGNDYxRjQ3MUY0RTFGNEYxRjU4MUY1QTFGNUMxRjVFMUY3RTFGN0YxRkI1MUZDNTFGRDQxRkQ1MUZEQzFGRjAxRkYxMUZGNTFGRkYyMDY1LTIwNjkyMDcyMjA3MzIwOEYyMDk1LTIwOUYyMEI5LTIwQ0YyMEYxLTIwRkYyMThBLTIxOEYyM0U5LTIzRkYyNDI3LTI0M0YyNDRCLTI0NUYyNkNFMjZFMjI2RTQtMjZFNzI3MDAyNzA1MjcwQTI3MEIyNzI4Mjc0QzI3NEUyNzUzLTI3NTUyNzVGMjc2MDI3OTUtMjc5NzI3QjAyN0JGMjdDQjI3Q0QtMjdDRjJCNEQtMkI0RjJCNUEtMkJGRjJDMkYyQzVGMkNGMi0yQ0Y4MkQyNi0yRDJGMkQ2Ni0yRDZFMkQ3MC0yRDdGMkQ5Ny0yRDlGMkRBNzJEQUYyREI3MkRCRjJEQzcyRENGMkRENzJEREYyRTMyLTJFN0YyRTlBMkVGNC0yRUZGMkZENi0yRkVGMkZGQy0yRkZGMzA0MDMwOTczMDk4MzEwMC0zMTA0MzEyRS0zMTMwMzE4RjMxQjgtMzFCRjMxRTQtMzFFRjMyMUYzMkZGNERCNi00REJGOUZDQy05RkZGQTQ4RC1BNDhGQTRDNy1BNENGQTYyQy1BNjNGQTY2MEE2NjFBNjc0LUE2N0JBNjk4LUE2OUZBNkY4LUE2RkZBNzhELUE3RkFBODJDLUE4MkZBODNBLUE4M0ZBODc4LUE4N0ZBOEM1LUE4Q0RBOERBLUE4REZBOEZDLUE4RkZBOTU0LUE5NUVBOTdELUE5N0ZBOUNFQTlEQS1BOUREQTlFMC1BOUZGQUEzNy1BQTNGQUE0RUFBNEZBQTVBQUE1QkFBN0MtQUE3RkFBQzMtQUFEQUFBRTAtQUJCRkFCRUVBQkVGQUJGQS1BQkZGRDdBNC1EN0FGRDdDNy1EN0NBRDdGQy1EN0ZGRkEyRUZBMkZGQTZFRkE2RkZBREEtRkFGRkZCMDctRkIxMkZCMTgtRkIxQ0ZCMzdGQjNERkIzRkZCNDJGQjQ1RkJCMi1GQkQyRkQ0MC1GRDRGRkQ5MEZEOTFGREM4LUZERUZGREZFRkRGRkZFMUEtRkUxRkZFMjctRkUyRkZFNTNGRTY3RkU2Qy1GRTZGRkU3NUZFRkRGRUZFRkYwMEZGQkYtRkZDMUZGQzhGRkM5RkZEMEZGRDFGRkQ4RkZEOUZGREQtRkZERkZGRTdGRkVGLUZGRjhGRkZFRkZGRiIKfSk7CgpmdW5jdGlvbiBhZGRVbmljb2RlUGFja2FnZSAocGFjaykgewogICAgdmFyIGNvZGVQb2ludCA9IC9cd3s0fS9nOwogICAgZm9yICh2YXIgbmFtZSBpbiBwYWNrKQogICAgICAgIGV4cG9ydHMucGFja2FnZXNbbmFtZV0gPSBwYWNrW25hbWVdLnJlcGxhY2UoY29kZVBvaW50LCAiXFx1JCYiKTsKfTsKCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL2RvY3VtZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2V2ZW50X2VtaXR0ZXInLCAnYWNlL3JhbmdlJywgJ2FjZS9hbmNob3InXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuL2xpYi9vb3AiKTsKdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXI7CnZhciBSYW5nZSA9IHJlcXVpcmUoIi4vcmFuZ2UiKS5SYW5nZTsKdmFyIEFuY2hvciA9IHJlcXVpcmUoIi4vYW5jaG9yIikuQW5jaG9yOwoKdmFyIERvY3VtZW50ID0gZnVuY3Rpb24odGV4dCkgewogICAgdGhpcy4kbGluZXMgPSBbXTsKCiAgICBpZiAoQXJyYXkuaXNBcnJheSh0ZXh0KSkgewogICAgICAgIHRoaXMuaW5zZXJ0TGluZXMoMCwgdGV4dCk7CiAgICB9CiAgICAvLyBUaGVyZSBoYXMgdG8gYmUgb25lIGxpbmUgYXQgbGVhc3QgaW4gdGhlIGRvY3VtZW50LiBJZiB5b3UgcGFzcyBhbiBlbXB0eQogICAgLy8gc3RyaW5nIHRvIHRoZSBpbnNlcnQgZnVuY3Rpb24sIG5vdGhpbmcgd2lsbCBoYXBwZW4uIFdvcmthcm91bmQuCiAgICBlbHNlIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKSB7CiAgICAgICAgdGhpcy4kbGluZXMgPSBbIiJdOwogICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmluc2VydCh7cm93OiAwLCBjb2x1bW46MH0sIHRleHQpOwogICAgfQp9OwoKKGZ1bmN0aW9uKCkgewoKICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsKCiAgICB0aGlzLnNldFZhbHVlID0gZnVuY3Rpb24odGV4dCkgewogICAgICAgIHZhciBsZW4gPSB0aGlzLmdldExlbmd0aCgpOwogICAgICAgIHRoaXMucmVtb3ZlKG5ldyBSYW5nZSgwLCAwLCBsZW4sIHRoaXMuZ2V0TGluZShsZW4tMSkubGVuZ3RoKSk7CiAgICAgICAgdGhpcy5pbnNlcnQoe3JvdzogMCwgY29sdW1uOjB9LCB0ZXh0KTsKICAgIH07CgogICAgdGhpcy5nZXRWYWx1ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmdldEFsbExpbmVzKCkuam9pbih0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIoKSk7CiAgICB9OwoKICAgIHRoaXMuY3JlYXRlQW5jaG9yID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsKICAgICAgICByZXR1cm4gbmV3IEFuY2hvcih0aGlzLCByb3csIGNvbHVtbik7CiAgICB9OwoKICAgIC8vIGNoZWNrIGZvciBJRSBzcGxpdCBidWcKICAgIGlmICgiYWFhIi5zcGxpdCgvYS8pLmxlbmd0aCA9PSAwKQogICAgICAgIHRoaXMuJHNwbGl0ID0gZnVuY3Rpb24odGV4dCkgewogICAgICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9cclxufFxyL2csICJcbiIpLnNwbGl0KCJcbiIpOwogICAgICAgIH0KICAgIGVsc2UKICAgICAgICB0aGlzLiRzcGxpdCA9IGZ1bmN0aW9uKHRleHQpIHsKICAgICAgICAgICAgcmV0dXJuIHRleHQuc3BsaXQoL1xyXG58XHJ8XG4vKTsKICAgICAgICB9OwoKCiAgICB0aGlzLiRkZXRlY3ROZXdMaW5lID0gZnVuY3Rpb24odGV4dCkgewogICAgICAgIHZhciBtYXRjaCA9IHRleHQubWF0Y2goL14uKj8oXHJcbnxccnxcbikvbSk7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHRoaXMuJGF1dG9OZXdMaW5lID0gbWF0Y2hbMV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy4kYXV0b05ld0xpbmUgPSAiXG4iOwogICAgICAgIH0KICAgIH07CgogICAgdGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyID0gZnVuY3Rpb24oKSB7CiAgICAgIHN3aXRjaCAodGhpcy4kbmV3TGluZU1vZGUpIHsKICAgICAgICAgIGNhc2UgIndpbmRvd3MiOgogICAgICAgICAgICAgIHJldHVybiAiXHJcbiI7CgogICAgICAgICAgY2FzZSAidW5peCI6CiAgICAgICAgICAgICAgcmV0dXJuICJcbiI7CgogICAgICAgICAgY2FzZSAiYXV0byI6CiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGF1dG9OZXdMaW5lOwogICAgICB9CiAgICB9OwoKICAgIHRoaXMuJGF1dG9OZXdMaW5lID0gIlxuIjsKICAgIHRoaXMuJG5ld0xpbmVNb2RlID0gImF1dG8iOwogICAgdGhpcy5zZXROZXdMaW5lTW9kZSA9IGZ1bmN0aW9uKG5ld0xpbmVNb2RlKSB7CiAgICAgICAgaWYgKHRoaXMuJG5ld0xpbmVNb2RlID09PSBuZXdMaW5lTW9kZSkKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICB0aGlzLiRuZXdMaW5lTW9kZSA9IG5ld0xpbmVNb2RlOwogICAgfTsKCiAgICB0aGlzLmdldE5ld0xpbmVNb2RlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJG5ld0xpbmVNb2RlOwogICAgfTsKCiAgICB0aGlzLmlzTmV3TGluZSA9IGZ1bmN0aW9uKHRleHQpIHsKICAgICAgICByZXR1cm4gKHRleHQgPT0gIlxyXG4iIHx8IHRleHQgPT0gIlxyIiB8fCB0ZXh0ID09ICJcbiIpOwogICAgfTsKCiAgICAvKioKICAgICAqIEdldCBhIHZlcmJhdGltIGNvcHkgb2YgdGhlIGdpdmVuIGxpbmUgYXMgaXQgaXMgaW4gdGhlIGRvY3VtZW50CiAgICAgKi8KICAgIHRoaXMuZ2V0TGluZSA9IGZ1bmN0aW9uKHJvdykgewogICAgICAgIHJldHVybiB0aGlzLiRsaW5lc1tyb3ddIHx8ICIiOwogICAgfTsKCiAgICB0aGlzLmdldExpbmVzID0gZnVuY3Rpb24oZmlyc3RSb3csIGxhc3RSb3cpIHsKICAgICAgICByZXR1cm4gdGhpcy4kbGluZXMuc2xpY2UoZmlyc3RSb3csIGxhc3RSb3cgKyAxKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFsbCBsaW5lcyBpbiB0aGUgZG9jdW1lbnQgYXMgc3RyaW5nIGFycmF5LiBXYXJuaW5nOiBUaGUgY2FsbGVyCiAgICAgKiBzaG91bGQgbm90IG1vZGlmeSB0aGlzIGFycmF5IQogICAgICovCiAgICB0aGlzLmdldEFsbExpbmVzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGluZXMoMCwgdGhpcy5nZXRMZW5ndGgoKSk7CiAgICB9OwoKICAgIHRoaXMuZ2V0TGVuZ3RoID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJGxpbmVzLmxlbmd0aDsKICAgIH07CgogICAgdGhpcy5nZXRUZXh0UmFuZ2UgPSBmdW5jdGlvbihyYW5nZSkgewogICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT0gcmFuZ2UuZW5kLnJvdykgewogICAgICAgICAgICByZXR1cm4gdGhpcy4kbGluZXNbcmFuZ2Uuc3RhcnQucm93XS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHZhciBsaW5lcyA9IFtdOwogICAgICAgICAgICBsaW5lcy5wdXNoKHRoaXMuJGxpbmVzW3JhbmdlLnN0YXJ0LnJvd10uc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbikpOwogICAgICAgICAgICBsaW5lcy5wdXNoLmFwcGx5KGxpbmVzLCB0aGlzLmdldExpbmVzKHJhbmdlLnN0YXJ0LnJvdysxLCByYW5nZS5lbmQucm93LTEpKTsKICAgICAgICAgICAgbGluZXMucHVzaCh0aGlzLiRsaW5lc1tyYW5nZS5lbmQucm93XS5zdWJzdHJpbmcoMCwgcmFuZ2UuZW5kLmNvbHVtbikpOwogICAgICAgICAgICByZXR1cm4gbGluZXMuam9pbih0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIoKSk7CiAgICAgICAgfQogICAgfTsKCiAgICB0aGlzLiRjbGlwUG9zaXRpb24gPSBmdW5jdGlvbihwb3NpdGlvbikgewogICAgICAgIHZhciBsZW5ndGggPSB0aGlzLmdldExlbmd0aCgpOwogICAgICAgIGlmIChwb3NpdGlvbi5yb3cgPj0gbGVuZ3RoKSB7CiAgICAgICAgICAgIHBvc2l0aW9uLnJvdyA9IE1hdGgubWF4KDAsIGxlbmd0aCAtIDEpOwogICAgICAgICAgICBwb3NpdGlvbi5jb2x1bW4gPSB0aGlzLmdldExpbmUobGVuZ3RoLTEpLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBvc2l0aW9uOwogICAgfTsKCiAgICB0aGlzLmluc2VydCA9IGZ1bmN0aW9uKHBvc2l0aW9uLCB0ZXh0KSB7CiAgICAgICAgaWYgKHRleHQubGVuZ3RoID09IDApCiAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsKCiAgICAgICAgcG9zaXRpb24gPSB0aGlzLiRjbGlwUG9zaXRpb24ocG9zaXRpb24pOwoKICAgICAgICBpZiAodGhpcy5nZXRMZW5ndGgoKSA8PSAxKQogICAgICAgICAgICB0aGlzLiRkZXRlY3ROZXdMaW5lKHRleHQpOwoKICAgICAgICB2YXIgbGluZXMgPSB0aGlzLiRzcGxpdCh0ZXh0KTsKICAgICAgICB2YXIgZmlyc3RMaW5lID0gbGluZXMuc3BsaWNlKDAsIDEpWzBdOwogICAgICAgIHZhciBsYXN0TGluZSA9IGxpbmVzLmxlbmd0aCA9PSAwID8gbnVsbCA6IGxpbmVzLnNwbGljZShsaW5lcy5sZW5ndGggLSAxLCAxKVswXTsKCiAgICAgICAgcG9zaXRpb24gPSB0aGlzLmluc2VydEluTGluZShwb3NpdGlvbiwgZmlyc3RMaW5lKTsKICAgICAgICBpZiAobGFzdExpbmUgIT09IG51bGwpIHsKICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLmluc2VydE5ld0xpbmUocG9zaXRpb24pOyAvLyB0ZXJtaW5hdGUgZmlyc3QgbGluZQogICAgICAgICAgICBwb3NpdGlvbiA9IHRoaXMuaW5zZXJ0TGluZXMocG9zaXRpb24ucm93LCBsaW5lcyk7CiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5pbnNlcnRJbkxpbmUocG9zaXRpb24sIGxhc3RMaW5lIHx8ICIiKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBvc2l0aW9uOwogICAgfTsKCiAgICB0aGlzLmluc2VydExpbmVzID0gZnVuY3Rpb24ocm93LCBsaW5lcykgewogICAgICAgIGlmIChsaW5lcy5sZW5ndGggPT0gMCkKICAgICAgICAgICAgcmV0dXJuIHtyb3c6IHJvdywgY29sdW1uOiAwfTsKCiAgICAgICAgdmFyIGFyZ3MgPSBbcm93LCAwXTsKICAgICAgICBhcmdzLnB1c2guYXBwbHkoYXJncywgbGluZXMpOwogICAgICAgIHRoaXMuJGxpbmVzLnNwbGljZS5hcHBseSh0aGlzLiRsaW5lcywgYXJncyk7CgogICAgICAgIHZhciByYW5nZSA9IG5ldyBSYW5nZShyb3csIDAsIHJvdyArIGxpbmVzLmxlbmd0aCwgMCk7CiAgICAgICAgdmFyIGRlbHRhID0gewogICAgICAgICAgICBhY3Rpb246ICJpbnNlcnRMaW5lcyIsCiAgICAgICAgICAgIHJhbmdlOiByYW5nZSwKICAgICAgICAgICAgbGluZXM6IGxpbmVzCiAgICAgICAgfTsKICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2UiLCB7IGRhdGE6IGRlbHRhIH0pOwogICAgICAgIHJldHVybiByYW5nZS5lbmQ7CiAgICB9OwoKICAgIHRoaXMuaW5zZXJ0TmV3TGluZSA9IGZ1bmN0aW9uKHBvc2l0aW9uKSB7CiAgICAgICAgcG9zaXRpb24gPSB0aGlzLiRjbGlwUG9zaXRpb24ocG9zaXRpb24pOwogICAgICAgIHZhciBsaW5lID0gdGhpcy4kbGluZXNbcG9zaXRpb24ucm93XSB8fCAiIjsKCiAgICAgICAgdGhpcy4kbGluZXNbcG9zaXRpb24ucm93XSA9IGxpbmUuc3Vic3RyaW5nKDAsIHBvc2l0aW9uLmNvbHVtbik7CiAgICAgICAgdGhpcy4kbGluZXMuc3BsaWNlKHBvc2l0aW9uLnJvdyArIDEsIDAsIGxpbmUuc3Vic3RyaW5nKHBvc2l0aW9uLmNvbHVtbiwgbGluZS5sZW5ndGgpKTsKCiAgICAgICAgdmFyIGVuZCA9IHsKICAgICAgICAgICAgcm93IDogcG9zaXRpb24ucm93ICsgMSwKICAgICAgICAgICAgY29sdW1uIDogMAogICAgICAgIH07CgogICAgICAgIHZhciBkZWx0YSA9IHsKICAgICAgICAgICAgYWN0aW9uOiAiaW5zZXJ0VGV4dCIsCiAgICAgICAgICAgIHJhbmdlOiBSYW5nZS5mcm9tUG9pbnRzKHBvc2l0aW9uLCBlbmQpLAogICAgICAgICAgICB0ZXh0OiB0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIoKQogICAgICAgIH07CiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgeyBkYXRhOiBkZWx0YSB9KTsKCiAgICAgICAgcmV0dXJuIGVuZDsKICAgIH07CgogICAgdGhpcy5pbnNlcnRJbkxpbmUgPSBmdW5jdGlvbihwb3NpdGlvbiwgdGV4dCkgewogICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKQogICAgICAgICAgICByZXR1cm4gcG9zaXRpb247CgogICAgICAgIHZhciBsaW5lID0gdGhpcy4kbGluZXNbcG9zaXRpb24ucm93XSB8fCAiIjsKCiAgICAgICAgdGhpcy4kbGluZXNbcG9zaXRpb24ucm93XSA9IGxpbmUuc3Vic3RyaW5nKDAsIHBvc2l0aW9uLmNvbHVtbikgKyB0ZXh0CiAgICAgICAgICAgICAgICArIGxpbmUuc3Vic3RyaW5nKHBvc2l0aW9uLmNvbHVtbik7CgogICAgICAgIHZhciBlbmQgPSB7CiAgICAgICAgICAgIHJvdyA6IHBvc2l0aW9uLnJvdywKICAgICAgICAgICAgY29sdW1uIDogcG9zaXRpb24uY29sdW1uICsgdGV4dC5sZW5ndGgKICAgICAgICB9OwoKICAgICAgICB2YXIgZGVsdGEgPSB7CiAgICAgICAgICAgIGFjdGlvbjogImluc2VydFRleHQiLAogICAgICAgICAgICByYW5nZTogUmFuZ2UuZnJvbVBvaW50cyhwb3NpdGlvbiwgZW5kKSwKICAgICAgICAgICAgdGV4dDogdGV4dAogICAgICAgIH07CiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgeyBkYXRhOiBkZWx0YSB9KTsKCiAgICAgICAgcmV0dXJuIGVuZDsKICAgIH07CgogICAgdGhpcy5yZW1vdmUgPSBmdW5jdGlvbihyYW5nZSkgewogICAgICAgIC8vIGNsaXAgdG8gZG9jdW1lbnQKICAgICAgICByYW5nZS5zdGFydCA9IHRoaXMuJGNsaXBQb3NpdGlvbihyYW5nZS5zdGFydCk7CiAgICAgICAgcmFuZ2UuZW5kID0gdGhpcy4kY2xpcFBvc2l0aW9uKHJhbmdlLmVuZCk7CgogICAgICAgIGlmIChyYW5nZS5pc0VtcHR5KCkpCiAgICAgICAgICAgIHJldHVybiByYW5nZS5zdGFydDsKCiAgICAgICAgdmFyIGZpcnN0Um93ID0gcmFuZ2Uuc3RhcnQucm93OwogICAgICAgIHZhciBsYXN0Um93ID0gcmFuZ2UuZW5kLnJvdzsKCiAgICAgICAgaWYgKHJhbmdlLmlzTXVsdGlMaW5lKCkpIHsKICAgICAgICAgICAgdmFyIGZpcnN0RnVsbFJvdyA9IHJhbmdlLnN0YXJ0LmNvbHVtbiA9PSAwID8gZmlyc3RSb3cgOiBmaXJzdFJvdyArIDE7CiAgICAgICAgICAgIHZhciBsYXN0RnVsbFJvdyA9IGxhc3RSb3cgLSAxOwoKICAgICAgICAgICAgaWYgKHJhbmdlLmVuZC5jb2x1bW4gPiAwKQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVJbkxpbmUobGFzdFJvdywgMCwgcmFuZ2UuZW5kLmNvbHVtbik7CgogICAgICAgICAgICBpZiAobGFzdEZ1bGxSb3cgPj0gZmlyc3RGdWxsUm93KQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVMaW5lcyhmaXJzdEZ1bGxSb3csIGxhc3RGdWxsUm93KTsKCiAgICAgICAgICAgIGlmIChmaXJzdEZ1bGxSb3cgIT0gZmlyc3RSb3cpIHsKICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSW5MaW5lKGZpcnN0Um93LCByYW5nZS5zdGFydC5jb2x1bW4sIHRoaXMuZ2V0TGluZShmaXJzdFJvdykubGVuZ3RoKTsKICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlTmV3TGluZShyYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLnJlbW92ZUluTGluZShmaXJzdFJvdywgcmFuZ2Uuc3RhcnQuY29sdW1uLCByYW5nZS5lbmQuY29sdW1uKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJhbmdlLnN0YXJ0OwogICAgfTsKCiAgICB0aGlzLnJlbW92ZUluTGluZSA9IGZ1bmN0aW9uKHJvdywgc3RhcnRDb2x1bW4sIGVuZENvbHVtbikgewogICAgICAgIGlmIChzdGFydENvbHVtbiA9PSBlbmRDb2x1bW4pCiAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgdmFyIHJhbmdlID0gbmV3IFJhbmdlKHJvdywgc3RhcnRDb2x1bW4sIHJvdywgZW5kQ29sdW1uKTsKICAgICAgICB2YXIgbGluZSA9IHRoaXMuZ2V0TGluZShyb3cpOwogICAgICAgIHZhciByZW1vdmVkID0gbGluZS5zdWJzdHJpbmcoc3RhcnRDb2x1bW4sIGVuZENvbHVtbik7CiAgICAgICAgdmFyIG5ld0xpbmUgPSBsaW5lLnN1YnN0cmluZygwLCBzdGFydENvbHVtbikgKyBsaW5lLnN1YnN0cmluZyhlbmRDb2x1bW4sIGxpbmUubGVuZ3RoKTsKICAgICAgICB0aGlzLiRsaW5lcy5zcGxpY2Uocm93LCAxLCBuZXdMaW5lKTsKCiAgICAgICAgdmFyIGRlbHRhID0gewogICAgICAgICAgICBhY3Rpb246ICJyZW1vdmVUZXh0IiwKICAgICAgICAgICAgcmFuZ2U6IHJhbmdlLAogICAgICAgICAgICB0ZXh0OiByZW1vdmVkCiAgICAgICAgfTsKICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2UiLCB7IGRhdGE6IGRlbHRhIH0pOwogICAgICAgIHJldHVybiByYW5nZS5zdGFydDsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZW1vdmVzIGEgcmFuZ2Ugb2YgZnVsbCBsaW5lcwogICAgICoKICAgICAqIEBwYXJhbSBmaXJzdFJvdyB7SW50ZWdlcn0gVGhlIGZpcnN0IHJvdyB0byBiZSByZW1vdmVkCiAgICAgKiBAcGFyYW0gbGFzdFJvdyB7SW50ZWdlcn0gVGhlIGxhc3Qgcm93IHRvIGJlIHJlbW92ZWQKICAgICAqIEByZXR1cm4ge1N0cmluZ1tdfSBUaGUgcmVtb3ZlZCBsaW5lcwogICAgICovCiAgICB0aGlzLnJlbW92ZUxpbmVzID0gZnVuY3Rpb24oZmlyc3RSb3csIGxhc3RSb3cpIHsKICAgICAgICB2YXIgcmFuZ2UgPSBuZXcgUmFuZ2UoZmlyc3RSb3csIDAsIGxhc3RSb3cgKyAxLCAwKTsKICAgICAgICB2YXIgcmVtb3ZlZCA9IHRoaXMuJGxpbmVzLnNwbGljZShmaXJzdFJvdywgbGFzdFJvdyAtIGZpcnN0Um93ICsgMSk7CgogICAgICAgIHZhciBkZWx0YSA9IHsKICAgICAgICAgICAgYWN0aW9uOiAicmVtb3ZlTGluZXMiLAogICAgICAgICAgICByYW5nZTogcmFuZ2UsCiAgICAgICAgICAgIG5sOiB0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIoKSwKICAgICAgICAgICAgbGluZXM6IHJlbW92ZWQKICAgICAgICB9OwogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7CiAgICAgICAgcmV0dXJuIHJlbW92ZWQ7CiAgICB9OwoKICAgIHRoaXMucmVtb3ZlTmV3TGluZSA9IGZ1bmN0aW9uKHJvdykgewogICAgICAgIHZhciBmaXJzdExpbmUgPSB0aGlzLmdldExpbmUocm93KTsKICAgICAgICB2YXIgc2Vjb25kTGluZSA9IHRoaXMuZ2V0TGluZShyb3crMSk7CgogICAgICAgIHZhciByYW5nZSA9IG5ldyBSYW5nZShyb3csIGZpcnN0TGluZS5sZW5ndGgsIHJvdysxLCAwKTsKICAgICAgICB2YXIgbGluZSA9IGZpcnN0TGluZSArIHNlY29uZExpbmU7CgogICAgICAgIHRoaXMuJGxpbmVzLnNwbGljZShyb3csIDIsIGxpbmUpOwoKICAgICAgICB2YXIgZGVsdGEgPSB7CiAgICAgICAgICAgIGFjdGlvbjogInJlbW92ZVRleHQiLAogICAgICAgICAgICByYW5nZTogcmFuZ2UsCiAgICAgICAgICAgIHRleHQ6IHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpCiAgICAgICAgfTsKICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2UiLCB7IGRhdGE6IGRlbHRhIH0pOwogICAgfTsKCiAgICB0aGlzLnJlcGxhY2UgPSBmdW5jdGlvbihyYW5nZSwgdGV4dCkgewogICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwICYmIHJhbmdlLmlzRW1wdHkoKSkKICAgICAgICAgICAgcmV0dXJuIHJhbmdlLnN0YXJ0OwoKICAgICAgICAvLyBTaG9ydGN1dDogSWYgdGhlIHRleHQgd2Ugd2FudCB0byBpbnNlcnQgaXMgdGhlIHNhbWUgYXMgaXQgaXMgYWxyZWFkeQogICAgICAgIC8vIGluIHRoZSBkb2N1bWVudCwgd2UgZG9uJ3QgaGF2ZSB0byByZXBsYWNlIGFueXRoaW5nLgogICAgICAgIGlmICh0ZXh0ID09IHRoaXMuZ2V0VGV4dFJhbmdlKHJhbmdlKSkKICAgICAgICAgICAgcmV0dXJuIHJhbmdlLmVuZDsKCiAgICAgICAgdGhpcy5yZW1vdmUocmFuZ2UpOwogICAgICAgIGlmICh0ZXh0KSB7CiAgICAgICAgICAgIHZhciBlbmQgPSB0aGlzLmluc2VydChyYW5nZS5zdGFydCwgdGV4dCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBlbmQgPSByYW5nZS5zdGFydDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBlbmQ7CiAgICB9OwoKICAgIHRoaXMuYXBwbHlEZWx0YXMgPSBmdW5jdGlvbihkZWx0YXMpIHsKICAgICAgICBmb3IgKHZhciBpPTA7IGk8ZGVsdGFzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBkZWx0YSA9IGRlbHRhc1tpXTsKICAgICAgICAgICAgdmFyIHJhbmdlID0gUmFuZ2UuZnJvbVBvaW50cyhkZWx0YS5yYW5nZS5zdGFydCwgZGVsdGEucmFuZ2UuZW5kKTsKCiAgICAgICAgICAgIGlmIChkZWx0YS5hY3Rpb24gPT0gImluc2VydExpbmVzIikKICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0TGluZXMocmFuZ2Uuc3RhcnQucm93LCBkZWx0YS5saW5lcyk7CiAgICAgICAgICAgIGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAiaW5zZXJ0VGV4dCIpCiAgICAgICAgICAgICAgICB0aGlzLmluc2VydChyYW5nZS5zdGFydCwgZGVsdGEudGV4dCk7CiAgICAgICAgICAgIGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAicmVtb3ZlTGluZXMiKQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVMaW5lcyhyYW5nZS5zdGFydC5yb3csIHJhbmdlLmVuZC5yb3cgLSAxKTsKICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJyZW1vdmVUZXh0IikKICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKHJhbmdlKTsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMucmV2ZXJ0RGVsdGFzID0gZnVuY3Rpb24oZGVsdGFzKSB7CiAgICAgICAgZm9yICh2YXIgaT1kZWx0YXMubGVuZ3RoLTE7IGk+PTA7IGktLSkgewogICAgICAgICAgICB2YXIgZGVsdGEgPSBkZWx0YXNbaV07CgogICAgICAgICAgICB2YXIgcmFuZ2UgPSBSYW5nZS5mcm9tUG9pbnRzKGRlbHRhLnJhbmdlLnN0YXJ0LCBkZWx0YS5yYW5nZS5lbmQpOwoKICAgICAgICAgICAgaWYgKGRlbHRhLmFjdGlvbiA9PSAiaW5zZXJ0TGluZXMiKQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVMaW5lcyhyYW5nZS5zdGFydC5yb3csIHJhbmdlLmVuZC5yb3cgLSAxKTsKICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJpbnNlcnRUZXh0IikKICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKHJhbmdlKTsKICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJyZW1vdmVMaW5lcyIpCiAgICAgICAgICAgICAgICB0aGlzLmluc2VydExpbmVzKHJhbmdlLnN0YXJ0LnJvdywgZGVsdGEubGluZXMpOwogICAgICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZVRleHQiKQogICAgICAgICAgICAgICAgdGhpcy5pbnNlcnQocmFuZ2Uuc3RhcnQsIGRlbHRhLnRleHQpOwogICAgICAgIH0KICAgIH07Cgp9KS5jYWxsKERvY3VtZW50LnByb3RvdHlwZSk7CgpleHBvcnRzLkRvY3VtZW50ID0gRG9jdW1lbnQ7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9hbmNob3InLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvZXZlbnRfZW1pdHRlciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4vbGliL29vcCIpOwp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsKCi8qKgogKiBBbiBBbmNob3IgaXMgYSBmbG9hdGluZyBwb2ludGVyIGluIHRoZSBkb2N1bWVudC4gV2hlbmV2ZXIgdGV4dCBpcyBpbnNlcnRlZCBvcgogKiBkZWxldGVkIGJlZm9yZSB0aGUgY3Vyc29yLCB0aGUgcG9zaXRpb24gb2YgdGhlIGN1cnNvciBpcyB1cGRhdGVkCiAqLwp2YXIgQW5jaG9yID0gZXhwb3J0cy5BbmNob3IgPSBmdW5jdGlvbihkb2MsIHJvdywgY29sdW1uKSB7CiAgICB0aGlzLmRvY3VtZW50ID0gZG9jOwogICAgCiAgICBpZiAodHlwZW9mIGNvbHVtbiA9PSAidW5kZWZpbmVkIikKICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHJvdy5yb3csIHJvdy5jb2x1bW4pOwogICAgZWxzZQogICAgICAgIHRoaXMuc2V0UG9zaXRpb24ocm93LCBjb2x1bW4pOwoKICAgIHRoaXMuJG9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpOwogICAgZG9jLm9uKCJjaGFuZ2UiLCB0aGlzLiRvbkNoYW5nZSk7Cn07CgooZnVuY3Rpb24oKSB7CgogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOwogICAgCiAgICB0aGlzLmdldFBvc2l0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQodGhpcy5yb3csIHRoaXMuY29sdW1uKTsKICAgIH07CiAgICAKICAgIHRoaXMuZ2V0RG9jdW1lbnQgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudDsKICAgIH07CiAgICAKICAgIHRoaXMub25DaGFuZ2UgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgdmFyIGRlbHRhID0gZS5kYXRhOwogICAgICAgIHZhciByYW5nZSA9IGRlbHRhLnJhbmdlOwogICAgICAgICAgICAKICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09IHJhbmdlLmVuZC5yb3cgJiYgcmFuZ2Uuc3RhcnQucm93ICE9IHRoaXMucm93KQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIAogICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPiB0aGlzLnJvdykKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAKICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09IHRoaXMucm93ICYmIHJhbmdlLnN0YXJ0LmNvbHVtbiA+IHRoaXMuY29sdW1uKQogICAgICAgICAgICByZXR1cm47CiAgICAKICAgICAgICB2YXIgcm93ID0gdGhpcy5yb3c7CiAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMuY29sdW1uOwogICAgICAgIAogICAgICAgIGlmIChkZWx0YS5hY3Rpb24gPT09ICJpbnNlcnRUZXh0IikgewogICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09PSByb3cgJiYgcmFuZ2Uuc3RhcnQuY29sdW1uIDw9IGNvbHVtbikgewogICAgICAgICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA9PT0gcmFuZ2UuZW5kLnJvdykgewogICAgICAgICAgICAgICAgICAgIGNvbHVtbiArPSByYW5nZS5lbmQuY29sdW1uIC0gcmFuZ2Uuc3RhcnQuY29sdW1uOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY29sdW1uIC09IHJhbmdlLnN0YXJ0LmNvbHVtbjsKICAgICAgICAgICAgICAgICAgICByb3cgKz0gcmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChyYW5nZS5zdGFydC5yb3cgIT09IHJhbmdlLmVuZC5yb3cgJiYgcmFuZ2Uuc3RhcnQucm93IDwgcm93KSB7CiAgICAgICAgICAgICAgICByb3cgKz0gcmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdzsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09PSAiaW5zZXJ0TGluZXMiKSB7CiAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPD0gcm93KSB7CiAgICAgICAgICAgICAgICByb3cgKz0gcmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZVRleHQiKSB7CiAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT0gcm93ICYmIHJhbmdlLnN0YXJ0LmNvbHVtbiA8IGNvbHVtbikgewogICAgICAgICAgICAgICAgaWYgKHJhbmdlLmVuZC5jb2x1bW4gPj0gY29sdW1uKQogICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IHJhbmdlLnN0YXJ0LmNvbHVtbjsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSBNYXRoLm1heCgwLCBjb2x1bW4gLSAocmFuZ2UuZW5kLmNvbHVtbiAtIHJhbmdlLnN0YXJ0LmNvbHVtbikpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0gZWxzZSBpZiAocmFuZ2Uuc3RhcnQucm93ICE9PSByYW5nZS5lbmQucm93ICYmIHJhbmdlLnN0YXJ0LnJvdyA8IHJvdykgewogICAgICAgICAgICAgICAgaWYgKHJhbmdlLmVuZC5yb3cgPT0gcm93KSB7CiAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gTWF0aC5tYXgoMCwgY29sdW1uIC0gcmFuZ2UuZW5kLmNvbHVtbikgKyByYW5nZS5zdGFydC5jb2x1bW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByb3cgLT0gKHJhbmdlLmVuZC5yb3cgLSByYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHJhbmdlLmVuZC5yb3cgPT0gcm93KSB7CiAgICAgICAgICAgICAgICByb3cgLT0gcmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdzsKICAgICAgICAgICAgICAgIGNvbHVtbiA9IE1hdGgubWF4KDAsIGNvbHVtbiAtIHJhbmdlLmVuZC5jb2x1bW4pICsgcmFuZ2Uuc3RhcnQuY29sdW1uOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZUxpbmVzIikgewogICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93IDw9IHJvdykgewogICAgICAgICAgICAgICAgaWYgKHJhbmdlLmVuZC5yb3cgPD0gcm93KQogICAgICAgICAgICAgICAgICAgIHJvdyAtPSByYW5nZS5lbmQucm93IC0gcmFuZ2Uuc3RhcnQucm93OwogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcm93ID0gcmFuZ2Uuc3RhcnQucm93OwogICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRoaXMuc2V0UG9zaXRpb24ocm93LCBjb2x1bW4sIHRydWUpOwogICAgfTsKCiAgICB0aGlzLnNldFBvc2l0aW9uID0gZnVuY3Rpb24ocm93LCBjb2x1bW4sIG5vQ2xpcCkgewogICAgICAgIHZhciBwb3M7CiAgICAgICAgaWYgKG5vQ2xpcCkgewogICAgICAgICAgICBwb3MgPSB7CiAgICAgICAgICAgICAgICByb3c6IHJvdywKICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwb3MgPSB0aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50KHJvdywgY29sdW1uKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKHRoaXMucm93ID09IHBvcy5yb3cgJiYgdGhpcy5jb2x1bW4gPT0gcG9zLmNvbHVtbikKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAKICAgICAgICB2YXIgb2xkID0gewogICAgICAgICAgICByb3c6IHRoaXMucm93LAogICAgICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uCiAgICAgICAgfTsKICAgICAgICAKICAgICAgICB0aGlzLnJvdyA9IHBvcy5yb3c7CiAgICAgICAgdGhpcy5jb2x1bW4gPSBwb3MuY29sdW1uOwogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsKICAgICAgICAgICAgb2xkOiBvbGQsCiAgICAgICAgICAgIHZhbHVlOiBwb3MKICAgICAgICB9KTsKICAgIH07CiAgICAKICAgIHRoaXMuZGV0YWNoID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCB0aGlzLiRvbkNoYW5nZSk7CiAgICB9OwogICAgCiAgICB0aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsKICAgICAgICB2YXIgcG9zID0ge307CiAgICAKICAgICAgICBpZiAocm93ID49IHRoaXMuZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsKICAgICAgICAgICAgcG9zLnJvdyA9IE1hdGgubWF4KDAsIHRoaXMuZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgLSAxKTsKICAgICAgICAgICAgcG9zLmNvbHVtbiA9IHRoaXMuZG9jdW1lbnQuZ2V0TGluZShwb3Mucm93KS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHJvdyA8IDApIHsKICAgICAgICAgICAgcG9zLnJvdyA9IDA7CiAgICAgICAgICAgIHBvcy5jb2x1bW4gPSAwOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcG9zLnJvdyA9IHJvdzsKICAgICAgICAgICAgcG9zLmNvbHVtbiA9IE1hdGgubWluKHRoaXMuZG9jdW1lbnQuZ2V0TGluZShwb3Mucm93KS5sZW5ndGgsIE1hdGgubWF4KDAsIGNvbHVtbikpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoY29sdW1uIDwgMCkKICAgICAgICAgICAgcG9zLmNvbHVtbiA9IDA7CiAgICAgICAgICAgIAogICAgICAgIHJldHVybiBwb3M7CiAgICB9OwogICAgCn0pLmNhbGwoQW5jaG9yLnByb3RvdHlwZSk7Cgp9KTsKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvYmFja2dyb3VuZF90b2tlbml6ZXInLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvZXZlbnRfZW1pdHRlciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4vbGliL29vcCIpOwp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsKCnZhciBCYWNrZ3JvdW5kVG9rZW5pemVyID0gZnVuY3Rpb24odG9rZW5pemVyLCBlZGl0b3IpIHsKICAgIHRoaXMucnVubmluZyA9IGZhbHNlOyAgICAKICAgIHRoaXMubGluZXMgPSBbXTsKICAgIHRoaXMuY3VycmVudExpbmUgPSAwOwogICAgdGhpcy50b2tlbml6ZXIgPSB0b2tlbml6ZXI7CgogICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgIHRoaXMuJHdvcmtlciA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICghc2VsZi5ydW5uaW5nKSB7IHJldHVybjsgfQoKICAgICAgICB2YXIgd29ya2VyU3RhcnQgPSBuZXcgRGF0ZSgpOwogICAgICAgIHZhciBzdGFydExpbmUgPSBzZWxmLmN1cnJlbnRMaW5lOwogICAgICAgIHZhciBkb2MgPSBzZWxmLmRvYzsKCiAgICAgICAgdmFyIHByb2Nlc3NlZExpbmVzID0gMDsKCiAgICAgICAgdmFyIGxlbiA9IGRvYy5nZXRMZW5ndGgoKTsKICAgICAgICB3aGlsZSAoc2VsZi5jdXJyZW50TGluZSA8IGxlbikgewogICAgICAgICAgICBzZWxmLmxpbmVzW3NlbGYuY3VycmVudExpbmVdID0gc2VsZi4kdG9rZW5pemVSb3dzKHNlbGYuY3VycmVudExpbmUsIHNlbGYuY3VycmVudExpbmUpWzBdOwogICAgICAgICAgICBzZWxmLmN1cnJlbnRMaW5lKys7CgogICAgICAgICAgICAvLyBvbmx5IGNoZWNrIGV2ZXJ5IDUgbGluZXMKICAgICAgICAgICAgcHJvY2Vzc2VkTGluZXMgKz0gMTsKICAgICAgICAgICAgaWYgKChwcm9jZXNzZWRMaW5lcyAlIDUgPT0gMCkgJiYgKG5ldyBEYXRlKCkgLSB3b3JrZXJTdGFydCkgPiAyMCkgewogICAgICAgICAgICAgICAgc2VsZi5maXJlVXBkYXRlRXZlbnQoc3RhcnRMaW5lLCBzZWxmLmN1cnJlbnRMaW5lLTEpOwogICAgICAgICAgICAgICAgc2VsZi5ydW5uaW5nID0gc2V0VGltZW91dChzZWxmLiR3b3JrZXIsIDIwKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgc2VsZi5ydW5uaW5nID0gZmFsc2U7CgogICAgICAgIHNlbGYuZmlyZVVwZGF0ZUV2ZW50KHN0YXJ0TGluZSwgbGVuIC0gMSk7CiAgICB9Owp9OwoKKGZ1bmN0aW9uKCl7CgogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOwoKICAgIHRoaXMuc2V0VG9rZW5pemVyID0gZnVuY3Rpb24odG9rZW5pemVyKSB7CiAgICAgICAgdGhpcy50b2tlbml6ZXIgPSB0b2tlbml6ZXI7CiAgICAgICAgdGhpcy5saW5lcyA9IFtdOwoKICAgICAgICB0aGlzLnN0YXJ0KDApOwogICAgfTsKCiAgICB0aGlzLnNldERvY3VtZW50ID0gZnVuY3Rpb24oZG9jKSB7CiAgICAgICAgdGhpcy5kb2MgPSBkb2M7CiAgICAgICAgdGhpcy5saW5lcyA9IFtdOwoKICAgICAgICB0aGlzLnN0b3AoKTsKICAgIH07CgogICAgdGhpcy5maXJlVXBkYXRlRXZlbnQgPSBmdW5jdGlvbihmaXJzdFJvdywgbGFzdFJvdykgewogICAgICAgIHZhciBkYXRhID0gewogICAgICAgICAgICBmaXJzdDogZmlyc3RSb3csCiAgICAgICAgICAgIGxhc3Q6IGxhc3RSb3cKICAgICAgICB9OwogICAgICAgIHRoaXMuX2VtaXQoInVwZGF0ZSIsIHtkYXRhOiBkYXRhfSk7CiAgICB9OwoKICAgIHRoaXMuc3RhcnQgPSBmdW5jdGlvbihzdGFydFJvdykgewogICAgICAgIHRoaXMuY3VycmVudExpbmUgPSBNYXRoLm1pbihzdGFydFJvdyB8fCAwLCB0aGlzLmN1cnJlbnRMaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRvYy5nZXRMZW5ndGgoKSk7CgogICAgICAgIC8vIHJlbW92ZSBhbGwgY2FjaGVkIGl0ZW1zIGJlbG93IHRoaXMgbGluZQogICAgICAgIHRoaXMubGluZXMuc3BsaWNlKHRoaXMuY3VycmVudExpbmUsIHRoaXMubGluZXMubGVuZ3RoKTsKCiAgICAgICAgdGhpcy5zdG9wKCk7CiAgICAgICAgLy8gcHJldHR5IGxvbmcgZGVsYXkgdG8gcHJldmVudCB0aGUgdG9rZW5pemVyIGZyb20gaW50ZXJmZXJpbmcgd2l0aCB0aGUgdXNlcgogICAgICAgIHRoaXMucnVubmluZyA9IHNldFRpbWVvdXQodGhpcy4kd29ya2VyLCA3MDApOwogICAgfTsKCiAgICB0aGlzLnN0b3AgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5ydW5uaW5nKQogICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5ydW5uaW5nKTsKICAgICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTsKICAgIH07CgogICAgdGhpcy5nZXRUb2tlbnMgPSBmdW5jdGlvbihmaXJzdFJvdywgbGFzdFJvdykgewogICAgICAgIHJldHVybiB0aGlzLiR0b2tlbml6ZVJvd3MoZmlyc3RSb3csIGxhc3RSb3cpOwogICAgfTsKCiAgICB0aGlzLmdldFN0YXRlID0gZnVuY3Rpb24ocm93KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJHRva2VuaXplUm93cyhyb3csIHJvdylbMF0uc3RhdGU7CiAgICB9OwoKICAgIHRoaXMuJHRva2VuaXplUm93cyA9IGZ1bmN0aW9uKGZpcnN0Um93LCBsYXN0Um93KSB7CiAgICAgICAgaWYgKCF0aGlzLmRvYyB8fCBpc05hTihmaXJzdFJvdykgfHwgaXNOYU4obGFzdFJvdykpCiAgICAgICAgICAgIHJldHVybiBbeydzdGF0ZSc6J3N0YXJ0JywndG9rZW5zJzpbXX1dOwogICAgICAgICAgICAKICAgICAgICB2YXIgcm93cyA9IFtdOwoKICAgICAgICAvLyBkZXRlcm1pbmUgc3RhcnQgc3RhdGUKICAgICAgICB2YXIgc3RhdGUgPSAic3RhcnQiOwogICAgICAgIHZhciBkb0NhY2hlID0gZmFsc2U7CiAgICAgICAgaWYgKGZpcnN0Um93ID4gMCAmJiB0aGlzLmxpbmVzW2ZpcnN0Um93IC0gMV0pIHsKICAgICAgICAgICAgc3RhdGUgPSB0aGlzLmxpbmVzW2ZpcnN0Um93IC0gMV0uc3RhdGU7CiAgICAgICAgICAgIGRvQ2FjaGUgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAoZmlyc3RSb3cgPT0gMCkgewogICAgICAgICAgICBzdGF0ZSA9ICJzdGFydCI7CiAgICAgICAgICAgIGRvQ2FjaGUgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5saW5lcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIC8vIEd1ZXNzIHRoYXQgd2UgaGF2ZW4ndCBjaGFuZ2VkIHN0YXRlLgogICAgICAgICAgICBzdGF0ZSA9IHRoaXMubGluZXNbdGhpcy5saW5lcy5sZW5ndGgtMV0uc3RhdGU7CiAgICAgICAgfQoKICAgICAgICB2YXIgbGluZXMgPSB0aGlzLmRvYy5nZXRMaW5lcyhmaXJzdFJvdywgbGFzdFJvdyk7CiAgICAgICAgZm9yICh2YXIgcm93PWZpcnN0Um93OyByb3c8PWxhc3RSb3c7IHJvdysrKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5saW5lc1tyb3ddKSB7CiAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gdGhpcy50b2tlbml6ZXIuZ2V0TGluZVRva2VucyhsaW5lc1tyb3ctZmlyc3RSb3ddIHx8ICIiLCBzdGF0ZSk7CiAgICAgICAgICAgICAgICB2YXIgc3RhdGUgPSB0b2tlbnMuc3RhdGU7CiAgICAgICAgICAgICAgICByb3dzLnB1c2godG9rZW5zKTsKCiAgICAgICAgICAgICAgICBpZiAoZG9DYWNoZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMubGluZXNbcm93XSA9IHRva2VuczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSB0aGlzLmxpbmVzW3Jvd107CiAgICAgICAgICAgICAgICBzdGF0ZSA9IHRva2Vucy5zdGF0ZTsKICAgICAgICAgICAgICAgIHJvd3MucHVzaCh0b2tlbnMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByb3dzOwogICAgfTsKCn0pLmNhbGwoQmFja2dyb3VuZFRva2VuaXplci5wcm90b3R5cGUpOwoKZXhwb3J0cy5CYWNrZ3JvdW5kVG9rZW5pemVyID0gQmFja2dyb3VuZFRva2VuaXplcjsKfSk7Ci8qIHZpbTp0cz00OnN0cz00OnN3PTQ6CiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgSnVsaWFuIFZpZXJlY2sgPGp1bGlhbiBET1QgdmllcmVjayBBVCBnbWFpbCBET1QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvZWRpdF9zZXNzaW9uL2ZvbGRpbmcnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZScsICdhY2UvZWRpdF9zZXNzaW9uL2ZvbGRfbGluZScsICdhY2UvZWRpdF9zZXNzaW9uL2ZvbGQnLCAnYWNlL3Rva2VuX2l0ZXJhdG9yJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOwp2YXIgRm9sZExpbmUgPSByZXF1aXJlKCIuL2ZvbGRfbGluZSIpLkZvbGRMaW5lOwp2YXIgRm9sZCA9IHJlcXVpcmUoIi4vZm9sZCIpLkZvbGQ7CnZhciBUb2tlbkl0ZXJhdG9yID0gcmVxdWlyZSgiLi4vdG9rZW5faXRlcmF0b3IiKS5Ub2tlbkl0ZXJhdG9yOwoKZnVuY3Rpb24gRm9sZGluZygpIHsKICAgIC8qKgogICAgICogTG9va3MgdXAgYSBmb2xkIGF0IGEgZ2l2ZW4gcm93L2NvbHVtbi4gUG9zc2libGUgdmFsdWVzIGZvciBzaWRlOgogICAgICogICAtMTogaWdub3JlIGEgZm9sZCBpZiBmb2xkLnN0YXJ0ID0gcm93L2NvbHVtbgogICAgICogICArMTogaWdub3JlIGEgZm9sZCBpZiBmb2xkLmVuZCA9IHJvdy9jb2x1bW4KICAgICAqLwogICAgdGhpcy5nZXRGb2xkQXQgPSBmdW5jdGlvbihyb3csIGNvbHVtbiwgc2lkZSkgewogICAgICAgIHZhciBmb2xkTGluZSA9IHRoaXMuZ2V0Rm9sZExpbmUocm93KTsKICAgICAgICBpZiAoIWZvbGRMaW5lKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKCiAgICAgICAgdmFyIGZvbGRzID0gZm9sZExpbmUuZm9sZHM7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb2xkcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgZm9sZCA9IGZvbGRzW2ldOwogICAgICAgICAgICBpZiAoZm9sZC5yYW5nZS5jb250YWlucyhyb3csIGNvbHVtbikpIHsKICAgICAgICAgICAgICAgIGlmIChzaWRlID09IDEgJiYgZm9sZC5yYW5nZS5pc0VuZChyb3csIGNvbHVtbikpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2lkZSA9PSAtMSAmJiBmb2xkLnJhbmdlLmlzU3RhcnQocm93LCBjb2x1bW4pKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZm9sZDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFsbCBmb2xkcyBpbiB0aGUgZ2l2ZW4gcmFuZ2UuIE5vdGUsIHRoYXQgdGhpcyB3aWxsIHJldHVybiBmb2xkcwogICAgICoKICAgICAqLwogICAgdGhpcy5nZXRGb2xkc0luUmFuZ2UgPSBmdW5jdGlvbihyYW5nZSkgewogICAgICAgIHJhbmdlID0gcmFuZ2UuY2xvbmUoKTsKICAgICAgICB2YXIgc3RhcnQgPSByYW5nZS5zdGFydDsKICAgICAgICB2YXIgZW5kID0gcmFuZ2UuZW5kOwogICAgICAgIHZhciBmb2xkTGluZXMgPSB0aGlzLiRmb2xkRGF0YTsKICAgICAgICB2YXIgZm91bmRGb2xkcyA9IFtdOwoKICAgICAgICBzdGFydC5jb2x1bW4gKz0gMTsKICAgICAgICBlbmQuY29sdW1uIC09IDE7CgogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZm9sZExpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBjbXAgPSBmb2xkTGluZXNbaV0ucmFuZ2UuY29tcGFyZVJhbmdlKHJhbmdlKTsKICAgICAgICAgICAgaWYgKGNtcCA9PSAyKSB7CiAgICAgICAgICAgICAgICAvLyBSYW5nZSBpcyBiZWZvcmUgZm9sZExpbmUuIE5vIGludGVyc2VjdGlvbi4gVGhpcyBtZWFucywKICAgICAgICAgICAgICAgIC8vIHRoZXJlIG1pZ2h0IGJlIG90aGVyIGZvbGRMaW5lcyB0aGF0IGludGVyc2VjdC4KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGNtcCA9PSAtMikgewogICAgICAgICAgICAgICAgLy8gUmFuZ2UgaXMgYWZ0ZXIgZm9sZExpbmUuIFRoZXJlIGNhbid0IGJlIGFueSBvdGhlciBmb2xkTGluZXMgdGhlbiwKICAgICAgICAgICAgICAgIC8vIHNvIGxldCdzIGdpdmUgdXAuCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGZvbGRzID0gZm9sZExpbmVzW2ldLmZvbGRzOwogICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGZvbGRzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICB2YXIgZm9sZCA9IGZvbGRzW2pdOwogICAgICAgICAgICAgICAgY21wID0gZm9sZC5yYW5nZS5jb21wYXJlUmFuZ2UocmFuZ2UpOwogICAgICAgICAgICAgICAgaWYgKGNtcCA9PSAtMikgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjbXAgPT0gMikgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAvLyBXVEYtc3RhdGU6IENhbiBoYXBwZW4gZHVlIHRvIC0xLysxIHRvIHN0YXJ0L2VuZCBjb2x1bW4uCiAgICAgICAgICAgICAgICBpZiAoY21wID09IDQyKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3VuZEZvbGRzLnB1c2goZm9sZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZvdW5kRm9sZHM7CiAgICB9OwogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgYWxsIGZvbGRzIGluIHRoZSBkb2N1bWVudAogICAgICovCiAgICB0aGlzLmdldEFsbEZvbGRzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGZvbGRzID0gW107CiAgICAgICAgdmFyIGZvbGRMaW5lcyA9IHRoaXMuJGZvbGREYXRhOwogICAgICAgIAogICAgICAgIGZ1bmN0aW9uIGFkZEZvbGQoZm9sZCkgewogICAgICAgICAgICBmb2xkcy5wdXNoKGZvbGQpOwogICAgICAgICAgICBpZiAoIWZvbGQuc3ViRm9sZHMpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb2xkLnN1YkZvbGRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgYWRkRm9sZChmb2xkLnN1YkZvbGRzW2ldKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb2xkTGluZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZm9sZExpbmVzW2ldLmZvbGRzLmxlbmd0aDsgaisrKQogICAgICAgICAgICAgICAgYWRkRm9sZChmb2xkTGluZXNbaV0uZm9sZHNbal0pOwoKICAgICAgICByZXR1cm4gZm9sZHM7CiAgICB9OwoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgc3RyaW5nIGJldHdlZW4gZm9sZHMgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLgogICAgICogRS5nLgogICAgICogIGZvbzxmb2xkPmJ8YXI8Zm9sZD53b2xyZCAtPiAiYmFyIgogICAgICogIGZvbzxmb2xkPmJhcjxmb2xkPndvbHxyZCAtPiAid29ybGQiCiAgICAgKiAgZm9vPGZvbGQ+YmFyPGZvfGxkPndvbHJkIC0+IDxudWxsPgogICAgICoKICAgICAqIHdoZXJlIHwgbWVhbnMgdGhlIHBvc2l0aW9uIG9mIHJvdy9jb2x1bW4KICAgICAqCiAgICAgKiBUaGUgdHJpbSBvcHRpb24gZGV0ZXJtcyBpZiB0aGUgcmV0dXJuIHN0cmluZyBzaG91bGQgYmUgdHJpbWVkIGFjY29yZGluZwogICAgICogdG8gdGhlICJzaWRlIiBwYXNzZWQgd2l0aCB0aGUgdHJpbSB2YWx1ZToKICAgICAqCiAgICAgKiBFLmcuCiAgICAgKiAgZm9vPGZvbGQ+Ynxhcjxmb2xkPndvbHJkIC10cmltPS0xPiAiYiIKICAgICAqICBmb288Zm9sZD5iYXI8Zm9sZD53b2x8cmQgLXRyaW09KzE+ICJybGQiCiAgICAgKiAgZm98bzxmb2xkPmJhcjxmb2xkPndvbHJkIC10cmltPTAwPiAiZm9vIgogICAgICovCiAgICB0aGlzLmdldEZvbGRTdHJpbmdBdCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uLCB0cmltLCBmb2xkTGluZSkgewogICAgICAgIGZvbGRMaW5lID0gZm9sZExpbmUgfHwgdGhpcy5nZXRGb2xkTGluZShyb3cpOwogICAgICAgIGlmICghZm9sZExpbmUpCiAgICAgICAgICAgIHJldHVybiBudWxsOwoKICAgICAgICB2YXIgbGFzdEZvbGQgPSB7CiAgICAgICAgICAgIGVuZDogeyBjb2x1bW46IDAgfQogICAgICAgIH07CiAgICAgICAgLy8gVE9ETzogUmVmYWN0b3IgdG8gdXNlIGdldE5leHRGb2xkVG8gZnVuY3Rpb24uCiAgICAgICAgdmFyIHN0ciwgZm9sZDsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvbGRMaW5lLmZvbGRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGZvbGQgPSBmb2xkTGluZS5mb2xkc1tpXTsKICAgICAgICAgICAgdmFyIGNtcCA9IGZvbGQucmFuZ2UuY29tcGFyZUVuZChyb3csIGNvbHVtbik7CiAgICAgICAgICAgIGlmIChjbXAgPT0gLTEpIHsKICAgICAgICAgICAgICAgIHN0ciA9IHRoaXMKICAgICAgICAgICAgICAgICAgICAuZ2V0TGluZShmb2xkLnN0YXJ0LnJvdykKICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKGxhc3RGb2xkLmVuZC5jb2x1bW4sIGZvbGQuc3RhcnQuY29sdW1uKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGNtcCA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGFzdEZvbGQgPSBmb2xkOwogICAgICAgIH0KICAgICAgICBpZiAoIXN0cikKICAgICAgICAgICAgc3RyID0gdGhpcy5nZXRMaW5lKGZvbGQuc3RhcnQucm93KS5zdWJzdHJpbmcobGFzdEZvbGQuZW5kLmNvbHVtbik7CgogICAgICAgIGlmICh0cmltID09IC0xKQogICAgICAgICAgICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCBjb2x1bW4gLSBsYXN0Rm9sZC5lbmQuY29sdW1uKTsKICAgICAgICBlbHNlIGlmICh0cmltID09IDEpCiAgICAgICAgICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKGNvbHVtbiAtIGxhc3RGb2xkLmVuZC5jb2x1bW4pOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuIHN0cjsKICAgIH07CgogICAgdGhpcy5nZXRGb2xkTGluZSA9IGZ1bmN0aW9uKGRvY1Jvdywgc3RhcnRGb2xkTGluZSkgewogICAgICAgIHZhciBmb2xkRGF0YSA9IHRoaXMuJGZvbGREYXRhOwogICAgICAgIHZhciBpID0gMDsKICAgICAgICBpZiAoc3RhcnRGb2xkTGluZSkKICAgICAgICAgICAgaSA9IGZvbGREYXRhLmluZGV4T2Yoc3RhcnRGb2xkTGluZSk7CiAgICAgICAgaWYgKGkgPT0gLTEpCiAgICAgICAgICAgIGkgPSAwOwogICAgICAgIGZvciAoaTsgaSA8IGZvbGREYXRhLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBmb2xkTGluZSA9IGZvbGREYXRhW2ldOwogICAgICAgICAgICBpZiAoZm9sZExpbmUuc3RhcnQucm93IDw9IGRvY1JvdyAmJiBmb2xkTGluZS5lbmQucm93ID49IGRvY1JvdykgewogICAgICAgICAgICAgICAgcmV0dXJuIGZvbGRMaW5lOwogICAgICAgICAgICB9IGVsc2UgaWYgKGZvbGRMaW5lLmVuZC5yb3cgPiBkb2NSb3cpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfTsKCiAgICAvLyByZXR1cm5zIHRoZSBmb2xkIHdoaWNoIHN0YXJ0cyBhZnRlciBvciBjb250YWlucyBkb2NSb3cKICAgIHRoaXMuZ2V0TmV4dEZvbGRMaW5lID0gZnVuY3Rpb24oZG9jUm93LCBzdGFydEZvbGRMaW5lKSB7CiAgICAgICAgdmFyIGZvbGREYXRhID0gdGhpcy4kZm9sZERhdGE7CiAgICAgICAgdmFyIGkgPSAwOwogICAgICAgIGlmIChzdGFydEZvbGRMaW5lKQogICAgICAgICAgICBpID0gZm9sZERhdGEuaW5kZXhPZihzdGFydEZvbGRMaW5lKTsKICAgICAgICBpZiAoaSA9PSAtMSkKICAgICAgICAgICAgaSA9IDA7CiAgICAgICAgZm9yIChpOyBpIDwgZm9sZERhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGZvbGRMaW5lID0gZm9sZERhdGFbaV07CiAgICAgICAgICAgIGlmIChmb2xkTGluZS5lbmQucm93ID49IGRvY1JvdykgewogICAgICAgICAgICAgICAgcmV0dXJuIGZvbGRMaW5lOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfTsKCiAgICB0aGlzLmdldEZvbGRlZFJvd0NvdW50ID0gZnVuY3Rpb24oZmlyc3QsIGxhc3QpIHsKICAgICAgICB2YXIgZm9sZERhdGEgPSB0aGlzLiRmb2xkRGF0YSwgcm93Q291bnQgPSBsYXN0LWZpcnN0KzE7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb2xkRGF0YS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgZm9sZExpbmUgPSBmb2xkRGF0YVtpXSwKICAgICAgICAgICAgICAgIGVuZCA9IGZvbGRMaW5lLmVuZC5yb3csCiAgICAgICAgICAgICAgICBzdGFydCA9IGZvbGRMaW5lLnN0YXJ0LnJvdzsKICAgICAgICAgICAgaWYgKGVuZCA+PSBsYXN0KSB7CiAgICAgICAgICAgICAgICBpZihzdGFydCA8IGxhc3QpIHsKICAgICAgICAgICAgICAgICAgICBpZihzdGFydCA+PSBmaXJzdCkKICAgICAgICAgICAgICAgICAgICAgICAgcm93Q291bnQgLT0gbGFzdC1zdGFydDsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0NvdW50ID0gMDsvL2luIG9uZSBmb2xkCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfSBlbHNlIGlmKGVuZCA+PSBmaXJzdCl7CiAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gZmlyc3QpIC8vZm9sZCBpbnNpZGUgcmFuZ2UKICAgICAgICAgICAgICAgICAgICByb3dDb3VudCAtPSAgZW5kLXN0YXJ0OwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHJvd0NvdW50IC09ICBlbmQtZmlyc3QrMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcm93Q291bnQ7CiAgICB9OwoKICAgIHRoaXMuJGFkZEZvbGRMaW5lID0gZnVuY3Rpb24oZm9sZExpbmUpIHsKICAgICAgICB0aGlzLiRmb2xkRGF0YS5wdXNoKGZvbGRMaW5lKTsKICAgICAgICB0aGlzLiRmb2xkRGF0YS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICAgICAgcmV0dXJuIGEuc3RhcnQucm93IC0gYi5zdGFydC5yb3c7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGZvbGRMaW5lOwogICAgfTsKCiAgICAvKioKICAgICAqIEFkZHMgYSBuZXcgZm9sZC4KICAgICAqCiAgICAgKiBAcmV0dXJucwogICAgICogICAgICBUaGUgbmV3IGNyZWF0ZWQgRm9sZCBvYmplY3Qgb3IgYW4gZXhpc3RpbmcgZm9sZCBvYmplY3QgaW4gY2FzZSB0aGUKICAgICAqICAgICAgcGFzc2VkIGluIHJhbmdlIGZpdHMgYW4gZXhpc3RpbmcgZm9sZCBleGFjdGx5LgogICAgICovCiAgICB0aGlzLmFkZEZvbGQgPSBmdW5jdGlvbihwbGFjZWhvbGRlciwgcmFuZ2UpIHsKICAgICAgICB2YXIgZm9sZERhdGEgPSB0aGlzLiRmb2xkRGF0YTsKICAgICAgICB2YXIgYWRkZWQgPSBmYWxzZTsKICAgICAgICB2YXIgZm9sZDsKICAgICAgICAKICAgICAgICBpZiAocGxhY2Vob2xkZXIgaW5zdGFuY2VvZiBGb2xkKQogICAgICAgICAgICBmb2xkID0gcGxhY2Vob2xkZXI7CiAgICAgICAgZWxzZQogICAgICAgICAgICBmb2xkID0gbmV3IEZvbGQocmFuZ2UsIHBsYWNlaG9sZGVyKTsKCiAgICAgICAgdGhpcy4kY2xpcFJhbmdlVG9Eb2N1bWVudChmb2xkLnJhbmdlKTsKCiAgICAgICAgdmFyIHN0YXJ0Um93ID0gZm9sZC5zdGFydC5yb3c7CiAgICAgICAgdmFyIHN0YXJ0Q29sdW1uID0gZm9sZC5zdGFydC5jb2x1bW47CiAgICAgICAgdmFyIGVuZFJvdyA9IGZvbGQuZW5kLnJvdzsKICAgICAgICB2YXIgZW5kQ29sdW1uID0gZm9sZC5lbmQuY29sdW1uOwoKICAgICAgICAvLyAtLS0gU29tZSBjaGVja2luZyAtLS0KICAgICAgICBpZiAoZm9sZC5wbGFjZWhvbGRlci5sZW5ndGggPCAyKQogICAgICAgICAgICB0aHJvdyAiUGxhY2Vob2xkZXIgaGFzIHRvIGJlIGF0IGxlYXN0IDIgY2hhcmFjdGVycyI7CgogICAgICAgIGlmIChzdGFydFJvdyA9PSBlbmRSb3cgJiYgZW5kQ29sdW1uIC0gc3RhcnRDb2x1bW4gPCAyKQogICAgICAgICAgICB0aHJvdyAiVGhlIHJhbmdlIGhhcyB0byBiZSBhdCBsZWFzdCAyIGNoYXJhY3RlcnMgd2lkdGgiOwoKICAgICAgICB2YXIgc3RhcnRGb2xkID0gdGhpcy5nZXRGb2xkQXQoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCAxKTsKICAgICAgICB2YXIgZW5kRm9sZCA9IHRoaXMuZ2V0Rm9sZEF0KGVuZFJvdywgZW5kQ29sdW1uLCAtMSk7CiAgICAgICAgaWYgKHN0YXJ0Rm9sZCAmJiBlbmRGb2xkID09IHN0YXJ0Rm9sZCkKICAgICAgICAgICAgcmV0dXJuIHN0YXJ0Rm9sZC5hZGRTdWJGb2xkKGZvbGQpOwoKICAgICAgICBpZiAoCiAgICAgICAgICAgIChzdGFydEZvbGQgJiYgIXN0YXJ0Rm9sZC5yYW5nZS5pc1N0YXJ0KHN0YXJ0Um93LCBzdGFydENvbHVtbikpCiAgICAgICAgICAgIHx8IChlbmRGb2xkICYmICFlbmRGb2xkLnJhbmdlLmlzRW5kKGVuZFJvdywgZW5kQ29sdW1uKSkKICAgICAgICApIHsKICAgICAgICAgICAgdGhyb3cgIkEgZm9sZCBjYW4ndCBpbnRlcnNlY3QgYWxyZWFkeSBleGlzdGluZyBmb2xkIiArIGZvbGQucmFuZ2UgKyBzdGFydEZvbGQucmFuZ2U7CiAgICAgICAgfQoKICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgZm9sZHMgaW4gdGhlIHJhbmdlIHdlIGNyZWF0ZSB0aGUgbmV3IGZvbGQgZm9yLgogICAgICAgIHZhciBmb2xkcyA9IHRoaXMuZ2V0Rm9sZHNJblJhbmdlKGZvbGQucmFuZ2UpOwogICAgICAgIGlmIChmb2xkcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZm9sZHMgZnJvbSBmb2xkIGRhdGEuCiAgICAgICAgICAgIHRoaXMucmVtb3ZlRm9sZHMoZm9sZHMpOwogICAgICAgICAgICAvLyBBZGQgdGhlIHJlbW92ZWQgZm9sZHMgYXMgc3ViZm9sZHMgb24gdGhlIG5ldyBmb2xkLgogICAgICAgICAgICBmb2xkLnN1YkZvbGRzID0gZm9sZHM7CiAgICAgICAgfQoKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvbGREYXRhLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBmb2xkTGluZSA9IGZvbGREYXRhW2ldOwogICAgICAgICAgICBpZiAoZW5kUm93ID09IGZvbGRMaW5lLnN0YXJ0LnJvdykgewogICAgICAgICAgICAgICAgZm9sZExpbmUuYWRkRm9sZChmb2xkKTsKICAgICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJ0Um93ID09IGZvbGRMaW5lLmVuZC5yb3cpIHsKICAgICAgICAgICAgICAgIGZvbGRMaW5lLmFkZEZvbGQoZm9sZCk7CiAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBpZiAoIWZvbGQuc2FtZVJvdykgewogICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIG1pZ2h0IGhhdmUgdG8gbWVyZ2UgdHdvIEZvbGRMaW5lcy4KICAgICAgICAgICAgICAgICAgICB2YXIgZm9sZExpbmVOZXh0ID0gZm9sZERhdGFbaSArIDFdOwogICAgICAgICAgICAgICAgICAgIGlmIChmb2xkTGluZU5leHQgJiYgZm9sZExpbmVOZXh0LnN0YXJ0LnJvdyA9PSBlbmRSb3cpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBtZXJnZSEKICAgICAgICAgICAgICAgICAgICAgICAgZm9sZExpbmUubWVyZ2UoZm9sZExpbmVOZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZW5kUm93IDw9IGZvbGRMaW5lLnN0YXJ0LnJvdykgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghYWRkZWQpCiAgICAgICAgICAgIGZvbGRMaW5lID0gdGhpcy4kYWRkRm9sZExpbmUobmV3IEZvbGRMaW5lKHRoaXMuJGZvbGREYXRhLCBmb2xkKSk7CgogICAgICAgIGlmICh0aGlzLiR1c2VXcmFwTW9kZSkKICAgICAgICAgICAgdGhpcy4kdXBkYXRlV3JhcERhdGEoZm9sZExpbmUuc3RhcnQucm93LCBmb2xkTGluZS5zdGFydC5yb3cpOwoKICAgICAgICAvLyBOb3RpZnkgdGhhdCBmb2xkIGRhdGEgaGFzIGNoYW5nZWQuCiAgICAgICAgdGhpcy4kbW9kaWZpZWQgPSB0cnVlOwogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZUZvbGQiLCB7IGRhdGE6IGZvbGQgfSk7CgogICAgICAgIHJldHVybiBmb2xkOwogICAgfTsKCiAgICB0aGlzLmFkZEZvbGRzID0gZnVuY3Rpb24oZm9sZHMpIHsKICAgICAgICBmb2xkcy5mb3JFYWNoKGZ1bmN0aW9uKGZvbGQpIHsKICAgICAgICAgICAgdGhpcy5hZGRGb2xkKGZvbGQpOwogICAgICAgIH0sIHRoaXMpOwogICAgfTsKCiAgICB0aGlzLnJlbW92ZUZvbGQgPSBmdW5jdGlvbihmb2xkKSB7CiAgICAgICAgdmFyIGZvbGRMaW5lID0gZm9sZC5mb2xkTGluZTsKICAgICAgICB2YXIgc3RhcnRSb3cgPSBmb2xkTGluZS5zdGFydC5yb3c7CiAgICAgICAgdmFyIGVuZFJvdyA9IGZvbGRMaW5lLmVuZC5yb3c7CgogICAgICAgIHZhciBmb2xkTGluZXMgPSB0aGlzLiRmb2xkRGF0YTsKICAgICAgICB2YXIgZm9sZHMgPSBmb2xkTGluZS5mb2xkczsKICAgICAgICAvLyBTaW1wbGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBvbmx5IG9uZSBmb2xkIGluIHRoZSBGb2xkTGluZSBzdWNoIHRoYXQKICAgICAgICAvLyB0aGUgZW50aXJlIGZvbGQgbGluZSBjYW4gZ2V0IHJlbW92ZWQgZGlyZWN0bHkuCiAgICAgICAgaWYgKGZvbGRzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAgIGZvbGRMaW5lcy5zcGxpY2UoZm9sZExpbmVzLmluZGV4T2YoZm9sZExpbmUpLCAxKTsKICAgICAgICB9IGVsc2UKICAgICAgICAvLyBJZiB0aGUgZm9sZCBpcyB0aGUgbGFzdCBmb2xkIG9mIHRoZSBmb2xkTGluZSwganVzdCByZW1vdmUgaXQuCiAgICAgICAgaWYgKGZvbGRMaW5lLnJhbmdlLmlzRW5kKGZvbGQuZW5kLnJvdywgZm9sZC5lbmQuY29sdW1uKSkgewogICAgICAgICAgICBmb2xkcy5wb3AoKTsKICAgICAgICAgICAgZm9sZExpbmUuZW5kLnJvdyA9IGZvbGRzW2ZvbGRzLmxlbmd0aCAtIDFdLmVuZC5yb3c7CiAgICAgICAgICAgIGZvbGRMaW5lLmVuZC5jb2x1bW4gPSBmb2xkc1tmb2xkcy5sZW5ndGggLSAxXS5lbmQuY29sdW1uOwogICAgICAgIH0gZWxzZQogICAgICAgIC8vIElmIHRoZSBmb2xkIGlzIHRoZSBmaXJzdCBmb2xkIG9mIHRoZSBmb2xkTGluZSwganVzdCByZW1vdmUgaXQuCiAgICAgICAgaWYgKGZvbGRMaW5lLnJhbmdlLmlzU3RhcnQoZm9sZC5zdGFydC5yb3csIGZvbGQuc3RhcnQuY29sdW1uKSkgewogICAgICAgICAgICBmb2xkcy5zaGlmdCgpOwogICAgICAgICAgICBmb2xkTGluZS5zdGFydC5yb3cgPSBmb2xkc1swXS5zdGFydC5yb3c7CiAgICAgICAgICAgIGZvbGRMaW5lLnN0YXJ0LmNvbHVtbiA9IGZvbGRzWzBdLnN0YXJ0LmNvbHVtbjsKICAgICAgICB9IGVsc2UKICAgICAgICAvLyBXZSBrbm93IHRoZXJlIGFyZSBtb3JlIHRoZW4gMiBmb2xkcyBhbmQgdGhlIGZvbGQgaXMgbm90IGF0IHRoZSBlZGdlLgogICAgICAgIC8vIFRoaXMgbWVhbnMsIHRoZSBmb2xkIGlzIHNvbWV3aGVyZSBpbiBiZXR3ZWVuLgogICAgICAgIC8vCiAgICAgICAgLy8gSWYgdGhlIGZvbGQgaXMgaW4gb25lIHJvdywgd2UganVzdCBjYW4gcmVtb3ZlIGl0LgogICAgICAgIGlmIChmb2xkLnNhbWVSb3cpIHsKICAgICAgICAgICAgZm9sZHMuc3BsaWNlKGZvbGRzLmluZGV4T2YoZm9sZCksIDEpOwogICAgICAgIH0gZWxzZQogICAgICAgIC8vIFRoZSBmb2xkIGdvZXMgb3ZlciBtb3JlIHRoZW4gb25lIHJvdy4gVGhpcyBtZWFucyByZW12b2luZyB0aGlzIGZvbGQKICAgICAgICAvLyB3aWxsIGNhdXNlIHRoZSBmb2xkIGxpbmUgdG8gZ2V0IHNwbGl0dGVkIHVwLiBuZXdGb2xkTGluZSBpcyB0aGUgc2Vjb25kIHBhcnQKICAgICAgICB7CiAgICAgICAgICAgIHZhciBuZXdGb2xkTGluZSA9IGZvbGRMaW5lLnNwbGl0KGZvbGQuc3RhcnQucm93LCBmb2xkLnN0YXJ0LmNvbHVtbik7CiAgICAgICAgICAgIGZvbGRzID0gbmV3Rm9sZExpbmUuZm9sZHM7CiAgICAgICAgICAgIGZvbGRzLnNoaWZ0KCk7CiAgICAgICAgICAgIG5ld0ZvbGRMaW5lLnN0YXJ0LnJvdyA9IGZvbGRzWzBdLnN0YXJ0LnJvdzsKICAgICAgICAgICAgbmV3Rm9sZExpbmUuc3RhcnQuY29sdW1uID0gZm9sZHNbMF0uc3RhcnQuY29sdW1uOwogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMuJHVzZVdyYXBNb2RlKSB7CiAgICAgICAgICAgIHRoaXMuJHVwZGF0ZVdyYXBEYXRhKHN0YXJ0Um93LCBlbmRSb3cpOwogICAgICAgIH0KCiAgICAgICAgLy8gTm90aWZ5IHRoYXQgZm9sZCBkYXRhIGhhcyBjaGFuZ2VkLgogICAgICAgIHRoaXMuJG1vZGlmaWVkID0gdHJ1ZTsKICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2VGb2xkIiwgeyBkYXRhOiBmb2xkIH0pOwogICAgfTsKCiAgICB0aGlzLnJlbW92ZUZvbGRzID0gZnVuY3Rpb24oZm9sZHMpIHsKICAgICAgICAvLyBXZSBuZWVkIHRvIGNsb25lIHRoZSBmb2xkcyBhcnJheSBwYXNzZWQgaW4gYXMgaXQgbWlnaHQgYmUgdGhlIGZvbGRzCiAgICAgICAgLy8gYXJyYXkgb2YgYSBmb2xkIGxpbmUgYW5kIGFzIHdlIGNhbGwgdGhpcy5yZW1vdmVGb2xkKGZvbGQpLCBmb2xkcwogICAgICAgIC8vIGFyZSByZW1vdmVkIGZyb20gZm9sZHMgYW5kIGNoYW5nZXMgdGhlIGN1cnJlbnQgaW5kZXguCiAgICAgICAgdmFyIGNsb25lRm9sZHMgPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvbGRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGNsb25lRm9sZHMucHVzaChmb2xkc1tpXSk7CiAgICAgICAgfQoKICAgICAgICBjbG9uZUZvbGRzLmZvckVhY2goZnVuY3Rpb24oZm9sZCkgewogICAgICAgICAgICB0aGlzLnJlbW92ZUZvbGQoZm9sZCk7CiAgICAgICAgfSwgdGhpcyk7CiAgICAgICAgdGhpcy4kbW9kaWZpZWQgPSB0cnVlOwogICAgfTsKCiAgICB0aGlzLmV4cGFuZEZvbGQgPSBmdW5jdGlvbihmb2xkKSB7CiAgICAgICAgdGhpcy5yZW1vdmVGb2xkKGZvbGQpOwogICAgICAgIGZvbGQuc3ViRm9sZHMuZm9yRWFjaChmdW5jdGlvbihmb2xkKSB7CiAgICAgICAgICAgIHRoaXMuYWRkRm9sZChmb2xkKTsKICAgICAgICB9LCB0aGlzKTsKICAgICAgICBmb2xkLnN1YkZvbGRzID0gW107CiAgICB9OwoKICAgIHRoaXMuZXhwYW5kRm9sZHMgPSBmdW5jdGlvbihmb2xkcykgewogICAgICAgIGZvbGRzLmZvckVhY2goZnVuY3Rpb24oZm9sZCkgewogICAgICAgICAgICB0aGlzLmV4cGFuZEZvbGQoZm9sZCk7CiAgICAgICAgfSwgdGhpcyk7CiAgICB9OwoKICAgIHRoaXMudW5mb2xkID0gZnVuY3Rpb24obG9jYXRpb24sIGV4cGFuZElubmVyKSB7CiAgICAgICAgdmFyIHJhbmdlLCBmb2xkczsKICAgICAgICBpZiAobG9jYXRpb24gPT0gbnVsbCkKICAgICAgICAgICAgcmFuZ2UgPSBuZXcgUmFuZ2UoMCwgMCwgdGhpcy5nZXRMZW5ndGgoKSwgMCk7CiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGxvY2F0aW9uID09ICJudW1iZXIiKQogICAgICAgICAgICByYW5nZSA9IG5ldyBSYW5nZShsb2NhdGlvbiwgMCwgbG9jYXRpb24sIHRoaXMuZ2V0TGluZShsb2NhdGlvbikubGVuZ3RoKTsKICAgICAgICBlbHNlIGlmICgicm93IiBpbiBsb2NhdGlvbikKICAgICAgICAgICAgcmFuZ2UgPSBSYW5nZS5mcm9tUG9pbnRzKGxvY2F0aW9uLCBsb2NhdGlvbik7CiAgICAgICAgZWxzZQogICAgICAgICAgICByYW5nZSA9IGxvY2F0aW9uOwoKICAgICAgICBmb2xkcyA9IHRoaXMuZ2V0Rm9sZHNJblJhbmdlKHJhbmdlKTsKICAgICAgICBpZiAoZXhwYW5kSW5uZXIpIHsKICAgICAgICAgICAgdGhpcy5yZW1vdmVGb2xkcyhmb2xkcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gVE9ETzogbWlnaHQgbmVlZCB0byByZW1vdmUgYW5kIGFkZCBmb2xkcyBpbiBvbmUgZ28gaW5zdGVhZCBvZiB1c2luZwogICAgICAgICAgICAvLyBleHBhbmRGb2xkcyBzZXZlcmFsIHRpbWVzLgogICAgICAgICAgICB3aGlsZSAoZm9sZHMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICB0aGlzLmV4cGFuZEZvbGRzKGZvbGRzKTsKICAgICAgICAgICAgICAgIGZvbGRzID0gdGhpcy5nZXRGb2xkc0luUmFuZ2UocmFuZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIENoZWNrcyBpZiBhIGdpdmVuIGRvY3VtZW50Um93IGlzIGZvbGRlZC4gVGhpcyBpcyB0cnVlIGlmIHRoZXJlIGFyZSBzb21lCiAgICAgKiBmb2xkZWQgcGFydHMgc3VjaCB0aGF0IHNvbWUgcGFydHMgb2YgdGhlIGxpbmUgaXMgc3RpbGwgdmlzaWJsZS4KICAgICAqKi8KICAgIHRoaXMuaXNSb3dGb2xkZWQgPSBmdW5jdGlvbihkb2NSb3csIHN0YXJ0Rm9sZFJvdykgewogICAgICAgIHJldHVybiAhIXRoaXMuZ2V0Rm9sZExpbmUoZG9jUm93LCBzdGFydEZvbGRSb3cpOwogICAgfTsKCiAgICB0aGlzLmdldFJvd0ZvbGRFbmQgPSBmdW5jdGlvbihkb2NSb3csIHN0YXJ0Rm9sZFJvdykgewogICAgICAgIHZhciBmb2xkTGluZSA9IHRoaXMuZ2V0Rm9sZExpbmUoZG9jUm93LCBzdGFydEZvbGRSb3cpOwogICAgICAgIHJldHVybiAoZm9sZExpbmUKICAgICAgICAgICAgPyBmb2xkTGluZS5lbmQucm93CiAgICAgICAgICAgIDogZG9jUm93KTsKICAgIH07CgogICAgdGhpcy5nZXRGb2xkRGlzcGxheUxpbmUgPSBmdW5jdGlvbihmb2xkTGluZSwgZW5kUm93LCBlbmRDb2x1bW4sIHN0YXJ0Um93LCBzdGFydENvbHVtbikgewogICAgICAgIGlmIChzdGFydFJvdyA9PSBudWxsKSB7CiAgICAgICAgICAgIHN0YXJ0Um93ID0gZm9sZExpbmUuc3RhcnQucm93OwogICAgICAgICAgICBzdGFydENvbHVtbiA9IDA7CiAgICAgICAgfQoKICAgICAgICBpZiAoZW5kUm93ID09IG51bGwpIHsKICAgICAgICAgICAgZW5kUm93ID0gZm9sZExpbmUuZW5kLnJvdzsKICAgICAgICAgICAgZW5kQ29sdW1uID0gdGhpcy5nZXRMaW5lKGVuZFJvdykubGVuZ3RoOwogICAgICAgIH0KCiAgICAgICAgLy8gQnVpbGQgdGhlIHRleHRsaW5lIHVzaW5nIHRoZSBGb2xkTGluZSB3YWxrZXIuCiAgICAgICAgdmFyIGRvYyA9IHRoaXMuZG9jOwogICAgICAgIHZhciB0ZXh0TGluZSA9ICIiOwoKICAgICAgICBmb2xkTGluZS53YWxrKGZ1bmN0aW9uKHBsYWNlaG9sZGVyLCByb3csIGNvbHVtbiwgbGFzdENvbHVtbikgewogICAgICAgICAgICBpZiAocm93IDwgc3RhcnRSb3cpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfSBlbHNlIGlmIChyb3cgPT0gc3RhcnRSb3cpIHsKICAgICAgICAgICAgICAgIGlmIChjb2x1bW4gPCBzdGFydENvbHVtbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxhc3RDb2x1bW4gPSBNYXRoLm1heChzdGFydENvbHVtbiwgbGFzdENvbHVtbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHBsYWNlaG9sZGVyKSB7CiAgICAgICAgICAgICAgICB0ZXh0TGluZSArPSBwbGFjZWhvbGRlcjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRleHRMaW5lICs9IGRvYy5nZXRMaW5lKHJvdykuc3Vic3RyaW5nKGxhc3RDb2x1bW4sIGNvbHVtbik7CiAgICAgICAgICAgIH0KICAgICAgICB9LmJpbmQodGhpcyksIGVuZFJvdywgZW5kQ29sdW1uKTsKICAgICAgICByZXR1cm4gdGV4dExpbmU7CiAgICB9OwoKICAgIHRoaXMuZ2V0RGlzcGxheUxpbmUgPSBmdW5jdGlvbihyb3csIGVuZENvbHVtbiwgc3RhcnRSb3csIHN0YXJ0Q29sdW1uKSB7CiAgICAgICAgdmFyIGZvbGRMaW5lID0gdGhpcy5nZXRGb2xkTGluZShyb3cpOwoKICAgICAgICBpZiAoIWZvbGRMaW5lKSB7CiAgICAgICAgICAgIHZhciBsaW5lOwogICAgICAgICAgICBsaW5lID0gdGhpcy5kb2MuZ2V0TGluZShyb3cpOwogICAgICAgICAgICByZXR1cm4gbGluZS5zdWJzdHJpbmcoc3RhcnRDb2x1bW4gfHwgMCwgZW5kQ29sdW1uIHx8IGxpbmUubGVuZ3RoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGb2xkRGlzcGxheUxpbmUoCiAgICAgICAgICAgICAgICBmb2xkTGluZSwgcm93LCBlbmRDb2x1bW4sIHN0YXJ0Um93LCBzdGFydENvbHVtbik7CiAgICAgICAgfQogICAgfTsKCiAgICB0aGlzLiRjbG9uZUZvbGREYXRhID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGZkID0gW107CiAgICAgICAgZmQgPSB0aGlzLiRmb2xkRGF0YS5tYXAoZnVuY3Rpb24oZm9sZExpbmUpIHsKICAgICAgICAgICAgdmFyIGZvbGRzID0gZm9sZExpbmUuZm9sZHMubWFwKGZ1bmN0aW9uKGZvbGQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmb2xkLmNsb25lKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gbmV3IEZvbGRMaW5lKGZkLCBmb2xkcyk7CiAgICAgICAgfSk7CgogICAgICAgIHJldHVybiBmZDsKICAgIH07CgogICAgdGhpcy50b2dnbGVGb2xkID0gZnVuY3Rpb24odHJ5VG9VbmZvbGQpIHsKICAgICAgICB2YXIgc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb247CiAgICAgICAgdmFyIHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlKCk7CiAgICAgICAgdmFyIGZvbGQ7CiAgICAgICAgdmFyIGJyYWNrZXRQb3M7CgogICAgICAgIGlmIChyYW5nZS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgdmFyIGN1cnNvciA9IHJhbmdlLnN0YXJ0OwogICAgICAgICAgICBmb2xkID0gdGhpcy5nZXRGb2xkQXQoY3Vyc29yLnJvdywgY3Vyc29yLmNvbHVtbik7CgogICAgICAgICAgICBpZiAoZm9sZCkgewogICAgICAgICAgICAgICAgdGhpcy5leHBhbmRGb2xkKGZvbGQpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGJyYWNrZXRQb3MgPSB0aGlzLmZpbmRNYXRjaGluZ0JyYWNrZXQoY3Vyc29yKSkgewogICAgICAgICAgICAgICAgaWYgKHJhbmdlLmNvbXBhcmVQb2ludChicmFja2V0UG9zKSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgcmFuZ2UuZW5kID0gYnJhY2tldFBvczsKICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByYW5nZS5zdGFydCA9IGJyYWNrZXRQb3M7CiAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc3RhcnQuY29sdW1uKys7CiAgICAgICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbi0tOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGJyYWNrZXRQb3MgPSB0aGlzLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzogY3Vyc29yLnJvdywgY29sdW1uOiBjdXJzb3IuY29sdW1uICsgMX0pKSB7CiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuY29tcGFyZVBvaW50KGJyYWNrZXRQb3MpID09IDEpCiAgICAgICAgICAgICAgICAgICAgcmFuZ2UuZW5kID0gYnJhY2tldFBvczsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICByYW5nZS5zdGFydCA9IGJyYWNrZXRQb3M7CgogICAgICAgICAgICAgICAgcmFuZ2Uuc3RhcnQuY29sdW1uKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByYW5nZSA9IHRoaXMuZ2V0Q29tbWVudEZvbGRSYW5nZShjdXJzb3Iucm93LCBjdXJzb3IuY29sdW1uKSB8fCByYW5nZTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhciBmb2xkcyA9IHRoaXMuZ2V0Rm9sZHNJblJhbmdlKHJhbmdlKTsKICAgICAgICAgICAgaWYgKHRyeVRvVW5mb2xkICYmIGZvbGRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdGhpcy5leHBhbmRGb2xkcyhmb2xkcyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0gCiAgICAgICAgICAgIGVsc2UgaWYgKGZvbGRzLmxlbmd0aCA9PSAxICkgewogICAgICAgICAgICAgICAgZm9sZCA9IGZvbGRzWzBdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoIWZvbGQpCiAgICAgICAgICAgIGZvbGQgPSB0aGlzLmdldEZvbGRBdChyYW5nZS5zdGFydC5yb3csIHJhbmdlLnN0YXJ0LmNvbHVtbik7CgogICAgICAgIGlmIChmb2xkICYmIGZvbGQucmFuZ2UudG9TdHJpbmcoKSA9PSByYW5nZS50b1N0cmluZygpKSB7CiAgICAgICAgICAgIHRoaXMuZXhwYW5kRm9sZChmb2xkKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdmFyIHBsYWNlaG9sZGVyID0gIi4uLiI7CiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpKSB7CiAgICAgICAgICAgIHBsYWNlaG9sZGVyID0gdGhpcy5nZXRUZXh0UmFuZ2UocmFuZ2UpOwogICAgICAgICAgICBpZihwbGFjZWhvbGRlci5sZW5ndGggPCA0KQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBwbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyLnRyaW0oKS5zdWJzdHJpbmcoMCwgMikgKyAiLi4iOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5hZGRGb2xkKHBsYWNlaG9sZGVyLCByYW5nZSk7CiAgICB9OwoKICAgIHRoaXMuZ2V0Q29tbWVudEZvbGRSYW5nZSA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7CiAgICAgICAgdmFyIGl0ZXJhdG9yID0gbmV3IFRva2VuSXRlcmF0b3IodGhpcywgcm93LCBjb2x1bW4pOwogICAgICAgIHZhciB0b2tlbiA9IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbigpOwogICAgICAgIGlmICh0b2tlbiAmJiAvXmNvbW1lbnR8c3RyaW5nLy50ZXN0KHRva2VuLnR5cGUpKSB7CiAgICAgICAgICAgIHZhciByYW5nZSA9IG5ldyBSYW5nZSgpOwogICAgICAgICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKHRva2VuLnR5cGUucmVwbGFjZSgvXC4uKi8sICJcXC4iKSk7CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgIHRva2VuID0gaXRlcmF0b3Iuc3RlcEJhY2t3YXJkKCk7CiAgICAgICAgICAgIH0gd2hpbGUodG9rZW4gJiYgcmUudGVzdCh0b2tlbi50eXBlKSk7CgogICAgICAgICAgICBpdGVyYXRvci5zdGVwRm9yd2FyZCgpOwogICAgICAgICAgICByYW5nZS5zdGFydC5yb3cgPSBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Sb3coKTsKICAgICAgICAgICAgcmFuZ2Uuc3RhcnQuY29sdW1uID0gaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkgKyAyOwoKICAgICAgICAgICAgaXRlcmF0b3IgPSBuZXcgVG9rZW5JdGVyYXRvcih0aGlzLCByb3csIGNvbHVtbik7CgogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICB0b2tlbiA9IGl0ZXJhdG9yLnN0ZXBGb3J3YXJkKCk7CiAgICAgICAgICAgIH0gd2hpbGUodG9rZW4gJiYgcmUudGVzdCh0b2tlbi50eXBlKSk7CiAgICAgICAgICAgIAogICAgICAgICAgICB0b2tlbiA9IGl0ZXJhdG9yLnN0ZXBCYWNrd2FyZCgpOwoKICAgICAgICAgICAgcmFuZ2UuZW5kLnJvdyA9IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpOwogICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uID0gaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkgKyB0b2tlbi52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgIHJldHVybiByYW5nZTsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMuZm9sZEFsbCA9IGZ1bmN0aW9uKHN0YXJ0Um93LCBlbmRSb3cpIHsKICAgICAgICB2YXIgZm9sZFdpZGdldHMgPSB0aGlzLmZvbGRXaWRnZXRzOwogICAgICAgIGVuZFJvdyA9IGVuZFJvdyB8fCB0aGlzLmdldExlbmd0aCgpOwogICAgICAgIGZvciAodmFyIHJvdyA9IHN0YXJ0Um93IHx8IDA7IHJvdyA8IGVuZFJvdzsgcm93KyspIHsKICAgICAgICAgICAgaWYgKGZvbGRXaWRnZXRzW3Jvd10gPT0gbnVsbCkKICAgICAgICAgICAgICAgIGZvbGRXaWRnZXRzW3Jvd10gPSB0aGlzLmdldEZvbGRXaWRnZXQocm93KTsKICAgICAgICAgICAgaWYgKGZvbGRXaWRnZXRzW3Jvd10gIT0gInN0YXJ0IikKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgdmFyIHJhbmdlID0gdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2Uocm93KTsKICAgICAgICAgICAgLy8gc29tZXRpbWVzIHJhbmdlIGNhbiBiZSBpbmNvbXBhdGlibGUgd2l0aCBleGlzdGluZyBmb2xkCiAgICAgICAgICAgIC8vIHdvdWxkbid0IGl0IGJlIGJldHRlciBmb3IgYWRkRm9sZCB0byByZXR1cm4gbnVsbCBpc3RlYWQgb2YgdGhyb3dpbmc/CiAgICAgICAgICAgIGlmIChyYW5nZSAmJiByYW5nZS5lbmQucm93IDwgZW5kUm93KSB0cnkgewogICAgICAgICAgICAgICAgdGhpcy5hZGRGb2xkKCIuLi4iLCByYW5nZSk7CiAgICAgICAgICAgIH0gY2F0Y2goZSkge30KICAgICAgICB9CiAgICB9OwogICAgCiAgICB0aGlzLiRmb2xkU3R5bGVzID0gewogICAgICAgICJtYW51YWwiOiAxLAogICAgICAgICJtYXJrYmVnaW4iOiAxLAogICAgICAgICJtYXJrYmVnaW5lbmQiOiAxCiAgICB9OwogICAgdGhpcy4kZm9sZFN0eWxlID0gIm1hcmtiZWdpbiI7CiAgICB0aGlzLnNldEZvbGRTdHlsZSA9IGZ1bmN0aW9uKHN0eWxlKSB7CiAgICAgICAgaWYgKCF0aGlzLiRmb2xkU3R5bGVzW3N0eWxlXSkKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvbGQgc3R5bGU6ICIgKyBzdHlsZSArICJbIiArIE9iamVjdC5rZXlzKHRoaXMuJGZvbGRTdHlsZXMpLmpvaW4oIiwgIikgKyAiXSIpOwogICAgICAgIAogICAgICAgIGlmICh0aGlzLiRmb2xkU3R5bGUgPT0gc3R5bGUpCiAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgdGhpcy4kZm9sZFN0eWxlID0gc3R5bGU7CiAgICAgICAgCiAgICAgICAgaWYgKHN0eWxlID09ICJtYW51YWwiKQogICAgICAgICAgICB0aGlzLnVuZm9sZCgpOwogICAgICAgIAogICAgICAgIC8vIHJlc2V0IGZvbGRpbmcKICAgICAgICB2YXIgbW9kZSA9IHRoaXMuJGZvbGRNb2RlOwogICAgICAgIHRoaXMuJHNldEZvbGRpbmcobnVsbCk7CiAgICAgICAgdGhpcy4kc2V0Rm9sZGluZyhtb2RlKTsKICAgIH07CgogICAgLy8gc3RydWN0dXJlZCBmb2xkaW5nCiAgICB0aGlzLiRzZXRGb2xkaW5nID0gZnVuY3Rpb24oZm9sZE1vZGUpIHsKICAgICAgICBpZiAodGhpcy4kZm9sZE1vZGUgPT0gZm9sZE1vZGUpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgCiAgICAgICAgdGhpcy4kZm9sZE1vZGUgPSBmb2xkTW9kZTsKICAgICAgICAKICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLiR1cGRhdGVGb2xkV2lkZ2V0cyk7CiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlQW5ub3RhdGlvbiIpOwogICAgICAgIAogICAgICAgIGlmICghZm9sZE1vZGUgfHwgdGhpcy4kZm9sZFN0eWxlID09ICJtYW51YWwiKSB7CiAgICAgICAgICAgIHRoaXMuZm9sZFdpZGdldHMgPSBudWxsOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHRoaXMuZm9sZFdpZGdldHMgPSBbXTsKICAgICAgICB0aGlzLmdldEZvbGRXaWRnZXQgPSBmb2xkTW9kZS5nZXRGb2xkV2lkZ2V0LmJpbmQoZm9sZE1vZGUsIHRoaXMsIHRoaXMuJGZvbGRTdHlsZSk7CiAgICAgICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmb2xkTW9kZS5nZXRGb2xkV2lkZ2V0UmFuZ2UuYmluZChmb2xkTW9kZSwgdGhpcywgdGhpcy4kZm9sZFN0eWxlKTsKICAgICAgICAKICAgICAgICB0aGlzLiR1cGRhdGVGb2xkV2lkZ2V0cyA9IHRoaXMudXBkYXRlRm9sZFdpZGdldHMuYmluZCh0aGlzKTsKICAgICAgICB0aGlzLm9uKCdjaGFuZ2UnLCB0aGlzLiR1cGRhdGVGb2xkV2lkZ2V0cyk7CiAgICAgICAgCiAgICB9OwoKICAgIHRoaXMub25Gb2xkV2lkZ2V0Q2xpY2sgPSBmdW5jdGlvbihyb3csIGUpIHsKICAgICAgICB2YXIgdHlwZSA9IHRoaXMuZ2V0Rm9sZFdpZGdldChyb3cpOwogICAgICAgIHZhciBsaW5lID0gdGhpcy5nZXRMaW5lKHJvdyk7CiAgICAgICAgdmFyIG9ubHlTdWJmb2xkcyA9IGUuc2hpZnRLZXk7CiAgICAgICAgdmFyIGFkZFN1YmZvbGRzID0gb25seVN1YmZvbGRzIHx8IGUuY3RybEtleSB8fCBlLmFsdEtleSB8fCBlLm1ldGFLZXk7CiAgICAgICAgdmFyIGZvbGQ7CgogICAgICAgIGlmICh0eXBlID09ICJlbmQiKQogICAgICAgICAgICBmb2xkID0gdGhpcy5nZXRGb2xkQXQocm93LCAwLCAtMSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBmb2xkID0gdGhpcy5nZXRGb2xkQXQocm93LCBsaW5lLmxlbmd0aCwgMSk7CgogICAgICAgIGlmIChmb2xkKSB7CiAgICAgICAgICAgIGlmIChhZGRTdWJmb2xkcykKICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRm9sZChmb2xkKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgdGhpcy5leHBhbmRGb2xkKGZvbGQpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZShyb3cpOwogICAgICAgIGlmIChyYW5nZSkgewogICAgICAgICAgICAvLyBzb21ldGltZXMgc2luZ2xlbGluZSBmb2xkcyBjYW4gYmUgbWlzc2VkIGJ5IHRoZSBjb2RlIGFib3ZlCiAgICAgICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSkgewogICAgICAgICAgICAgICAgZm9sZCA9IHRoaXMuZ2V0Rm9sZEF0KHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2Uuc3RhcnQuY29sdW1uLCAxKTsKICAgICAgICAgICAgICAgIGlmIChmb2xkICYmIHJhbmdlLmlzRWVxdWFsKGZvbGQucmFuZ2UpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVGb2xkKGZvbGQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKCFvbmx5U3ViZm9sZHMpCiAgICAgICAgICAgICAgICB0aGlzLmFkZEZvbGQoIi4uLiIsIHJhbmdlKTsKCiAgICAgICAgICAgIGlmIChhZGRTdWJmb2xkcykKICAgICAgICAgICAgICAgIHRoaXMuZm9sZEFsbChyYW5nZS5zdGFydC5yb3cgKyAxLCByYW5nZS5lbmQucm93KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoYWRkU3ViZm9sZHMpCiAgICAgICAgICAgICAgICB0aGlzLmZvbGRBbGwocm93ICsgMSwgdGhpcy5nZXRMZW5ndGgoKSk7CiAgICAgICAgICAgIGUudGFyZ2V0LmNsYXNzTmFtZSArPSAiIGludmFsaWQiCiAgICAgICAgfQogICAgfTsKICAgIAogICAgdGhpcy51cGRhdGVGb2xkV2lkZ2V0cyA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICB2YXIgZGVsdGEgPSBlLmRhdGE7CiAgICAgICAgdmFyIHJhbmdlID0gZGVsdGEucmFuZ2U7CiAgICAgICAgdmFyIGZpcnN0Um93ID0gcmFuZ2Uuc3RhcnQucm93OwogICAgICAgIHZhciBsZW4gPSByYW5nZS5lbmQucm93IC0gZmlyc3RSb3c7CgogICAgICAgIGlmIChsZW4gPT09IDApIHsKICAgICAgICAgICAgdGhpcy5mb2xkV2lkZ2V0c1tmaXJzdFJvd10gPSBudWxsOwogICAgICAgIH0gZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJyZW1vdmVUZXh0IiB8fCBkZWx0YS5hY3Rpb24gPT0gInJlbW92ZUxpbmVzIikgewogICAgICAgICAgICB0aGlzLmZvbGRXaWRnZXRzLnNwbGljZShmaXJzdFJvdywgbGVuICsgMSwgbnVsbCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheShsZW4gKyAxKTsKICAgICAgICAgICAgYXJncy51bnNoaWZ0KGZpcnN0Um93LCAxKTsKICAgICAgICAgICAgdGhpcy5mb2xkV2lkZ2V0cy5zcGxpY2UuYXBwbHkodGhpcy5mb2xkV2lkZ2V0cywgYXJncyk7CiAgICAgICAgfQogICAgfTsKCn0KCmV4cG9ydHMuRm9sZGluZyA9IEZvbGRpbmc7Cgp9KTsKLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoKICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBKdWxpYW4gVmllcmVjayA8anVsaWFuIERPVCB2aWVyZWNrIEFUIGdtYWlsIERPVCBjb20+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9lZGl0X3Nlc3Npb24vZm9sZF9saW5lJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7CgovKioKICogSWYgYW4gYXJyYXkgaXMgcGFzc2VkIGluLCB0aGUgZm9sZHMgYXJlIGV4cGVjdGVkIHRvIGJlIHNvcnRlZCBhbHJlYWR5LgogKi8KZnVuY3Rpb24gRm9sZExpbmUoZm9sZERhdGEsIGZvbGRzKSB7CiAgICB0aGlzLmZvbGREYXRhID0gZm9sZERhdGE7CiAgICBpZiAoQXJyYXkuaXNBcnJheShmb2xkcykpIHsKICAgICAgICB0aGlzLmZvbGRzID0gZm9sZHM7CiAgICB9IGVsc2UgewogICAgICAgIGZvbGRzID0gdGhpcy5mb2xkcyA9IFsgZm9sZHMgXTsKICAgIH0KCiAgICB2YXIgbGFzdCA9IGZvbGRzW2ZvbGRzLmxlbmd0aCAtIDFdCiAgICB0aGlzLnJhbmdlID0gbmV3IFJhbmdlKGZvbGRzWzBdLnN0YXJ0LnJvdywgZm9sZHNbMF0uc3RhcnQuY29sdW1uLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0LmVuZC5yb3csIGxhc3QuZW5kLmNvbHVtbik7CiAgICB0aGlzLnN0YXJ0ID0gdGhpcy5yYW5nZS5zdGFydDsKICAgIHRoaXMuZW5kICAgPSB0aGlzLnJhbmdlLmVuZDsKCiAgICB0aGlzLmZvbGRzLmZvckVhY2goZnVuY3Rpb24oZm9sZCkgewogICAgICAgIGZvbGQuc2V0Rm9sZExpbmUodGhpcyk7CiAgICB9LCB0aGlzKTsKfQoKKGZ1bmN0aW9uKCkgewogICAgLyoqCiAgICAgKiBOb3RlOiBUaGlzIGRvZXNuJ3QgdXBkYXRlIHdyYXBEYXRhIQogICAgICovCiAgICB0aGlzLnNoaWZ0Um93ID0gZnVuY3Rpb24oc2hpZnQpIHsKICAgICAgICB0aGlzLnN0YXJ0LnJvdyArPSBzaGlmdDsKICAgICAgICB0aGlzLmVuZC5yb3cgKz0gc2hpZnQ7CiAgICAgICAgdGhpcy5mb2xkcy5mb3JFYWNoKGZ1bmN0aW9uKGZvbGQpIHsKICAgICAgICAgICAgZm9sZC5zdGFydC5yb3cgKz0gc2hpZnQ7CiAgICAgICAgICAgIGZvbGQuZW5kLnJvdyArPSBzaGlmdDsKICAgICAgICB9KTsKICAgIH0KCiAgICB0aGlzLmFkZEZvbGQgPSBmdW5jdGlvbihmb2xkKSB7CiAgICAgICAgaWYgKGZvbGQuc2FtZVJvdykgewogICAgICAgICAgICBpZiAoZm9sZC5zdGFydC5yb3cgPCB0aGlzLnN0YXJ0Um93IHx8IGZvbGQuZW5kUm93ID4gdGhpcy5lbmRSb3cpIHsKICAgICAgICAgICAgICAgIHRocm93ICJDYW4ndCBhZGQgYSBmb2xkIHRvIHRoaXMgRm9sZExpbmUgYXMgaXQgaGFzIG5vIGNvbm5lY3Rpb24iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuZm9sZHMucHVzaChmb2xkKTsKICAgICAgICAgICAgdGhpcy5mb2xkcy5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICAgICAgICAgIHJldHVybiAtYS5yYW5nZS5jb21wYXJlRW5kKGIuc3RhcnQucm93LCBiLnN0YXJ0LmNvbHVtbik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAodGhpcy5yYW5nZS5jb21wYXJlRW5kKGZvbGQuc3RhcnQucm93LCBmb2xkLnN0YXJ0LmNvbHVtbikgPiAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVuZC5yb3cgPSBmb2xkLmVuZC5yb3c7CiAgICAgICAgICAgICAgICB0aGlzLmVuZC5jb2x1bW4gPSAgZm9sZC5lbmQuY29sdW1uOwogICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmFuZ2UuY29tcGFyZVN0YXJ0KGZvbGQuZW5kLnJvdywgZm9sZC5lbmQuY29sdW1uKSA8IDApIHsKICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQucm93ID0gZm9sZC5zdGFydC5yb3c7CiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0LmNvbHVtbiA9IGZvbGQuc3RhcnQuY29sdW1uOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChmb2xkLnN0YXJ0LnJvdyA9PSB0aGlzLmVuZC5yb3cpIHsKICAgICAgICAgICAgdGhpcy5mb2xkcy5wdXNoKGZvbGQpOwogICAgICAgICAgICB0aGlzLmVuZC5yb3cgPSBmb2xkLmVuZC5yb3c7CiAgICAgICAgICAgIHRoaXMuZW5kLmNvbHVtbiA9IGZvbGQuZW5kLmNvbHVtbjsKICAgICAgICB9IGVsc2UgaWYgKGZvbGQuZW5kLnJvdyA9PSB0aGlzLnN0YXJ0LnJvdykgewogICAgICAgICAgICB0aGlzLmZvbGRzLnVuc2hpZnQoZm9sZCk7CiAgICAgICAgICAgIHRoaXMuc3RhcnQucm93ID0gZm9sZC5zdGFydC5yb3c7CiAgICAgICAgICAgIHRoaXMuc3RhcnQuY29sdW1uID0gZm9sZC5zdGFydC5jb2x1bW47CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhyb3cgIlRyeWluZyB0byBhZGQgZm9sZCB0byBGb2xkUm93IHRoYXQgZG9lc24ndCBoYXZlIGEgbWF0Y2hpbmcgcm93IjsKICAgICAgICB9CiAgICAgICAgZm9sZC5mb2xkTGluZSA9IHRoaXM7CiAgICB9CgogICAgdGhpcy5jb250YWluc1JvdyA9IGZ1bmN0aW9uKHJvdykgewogICAgICAgIHJldHVybiByb3cgPj0gdGhpcy5zdGFydC5yb3cgJiYgcm93IDw9IHRoaXMuZW5kLnJvdzsKICAgIH0KCiAgICB0aGlzLndhbGsgPSBmdW5jdGlvbihjYWxsYmFjaywgZW5kUm93LCBlbmRDb2x1bW4pIHsKICAgICAgICB2YXIgbGFzdEVuZCA9IDAsCiAgICAgICAgICAgIGZvbGRzID0gdGhpcy5mb2xkcywKICAgICAgICAgICAgZm9sZCwKICAgICAgICAgICAgY29tcCwgc3RvcCwgaXNOZXdSb3cgPSB0cnVlOwoKICAgICAgICBpZiAoZW5kUm93ID09IG51bGwpIHsKICAgICAgICAgICAgZW5kUm93ID0gdGhpcy5lbmQucm93OwogICAgICAgICAgICBlbmRDb2x1bW4gPSB0aGlzLmVuZC5jb2x1bW47CiAgICAgICAgfQoKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvbGRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGZvbGQgPSBmb2xkc1tpXTsKCiAgICAgICAgICAgIGNvbXAgPSBmb2xkLnJhbmdlLmNvbXBhcmVTdGFydChlbmRSb3csIGVuZENvbHVtbik7CiAgICAgICAgICAgIC8vIFRoaXMgZm9sZCBpcyBhZnRlciB0aGUgZW5kUm93L0NvbHVtbi4KICAgICAgICAgICAgaWYgKGNvbXAgPT0gLTEpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGVuZFJvdywgZW5kQ29sdW1uLCBsYXN0RW5kLCBpc05ld1Jvdyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHN0b3AgPSBjYWxsYmFjayhudWxsLCBmb2xkLnN0YXJ0LnJvdywgZm9sZC5zdGFydC5jb2x1bW4sIGxhc3RFbmQsIGlzTmV3Um93KTsKICAgICAgICAgICAgc3RvcCA9ICFzdG9wICYmIGNhbGxiYWNrKGZvbGQucGxhY2Vob2xkZXIsIGZvbGQuc3RhcnQucm93LCBmb2xkLnN0YXJ0LmNvbHVtbiwgbGFzdEVuZCk7CgogICAgICAgICAgICAvLyBJZiB0aGUgdXNlciByZXF1ZXN0ZWQgdG8gc3RvcCB0aGUgd2FsayBvciBlbmRSb3cvZW5kQ29sdW1uIGlzCiAgICAgICAgICAgIC8vIGluc2lkZSBvZiB0aGlzIGZvbGQgKGNvbXAgPT0gMCksIHRoZW4gZW5kIGhlcmUuCiAgICAgICAgICAgIGlmIChzdG9wIHx8IGNvbXAgPT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBOb3RlIHRoZSBuZXcgbGFzdEVuZCBtaWdodCBub3QgYmUgb24gdGhlIHNhbWUgbGluZS4gSG93ZXZlciwKICAgICAgICAgICAgLy8gaXQncyB0aGUgY2FsbGJhY2sncyBqb2IgdG8gcmVjb2duaXplIHRoaXMuCiAgICAgICAgICAgIGlzTmV3Um93ID0gIWZvbGQuc2FtZVJvdzsKICAgICAgICAgICAgbGFzdEVuZCA9IGZvbGQuZW5kLmNvbHVtbjsKICAgICAgICB9CiAgICAgICAgY2FsbGJhY2sobnVsbCwgZW5kUm93LCBlbmRDb2x1bW4sIGxhc3RFbmQsIGlzTmV3Um93KTsKICAgIH0KCiAgICB0aGlzLmdldE5leHRGb2xkVG8gPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIHZhciBmb2xkLCBjbXA7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmZvbGRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGZvbGQgPSB0aGlzLmZvbGRzW2ldOwogICAgICAgICAgICBjbXAgPSBmb2xkLnJhbmdlLmNvbXBhcmVFbmQocm93LCBjb2x1bW4pOwogICAgICAgICAgICBpZiAoY21wID09IC0xKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIGZvbGQ6IGZvbGQsCiAgICAgICAgICAgICAgICAgICAga2luZDogImFmdGVyIgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjbXAgPT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBmb2xkOiBmb2xkLAogICAgICAgICAgICAgICAgICAgIGtpbmQ6ICJpbnNpZGUiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgdGhpcy5hZGRSZW1vdmVDaGFycyA9IGZ1bmN0aW9uKHJvdywgY29sdW1uLCBsZW4pIHsKICAgICAgICB2YXIgcmV0ID0gdGhpcy5nZXROZXh0Rm9sZFRvKHJvdywgY29sdW1uKSwKICAgICAgICAgICAgZm9sZCwgZm9sZHM7CiAgICAgICAgaWYgKHJldCkgewogICAgICAgICAgICBmb2xkID0gcmV0LmZvbGQ7CiAgICAgICAgICAgIGlmIChyZXQua2luZCA9PSAiaW5zaWRlIgogICAgICAgICAgICAgICAgJiYgZm9sZC5zdGFydC5jb2x1bW4gIT0gY29sdW1uCiAgICAgICAgICAgICAgICAmJiBmb2xkLnN0YXJ0LnJvdyAhPSByb3cpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRocm93ICJNb3ZpbmcgY2hhcmFjdGVycyBpbnNpZGUgb2YgYSBmb2xkIHNob3VsZCBuZXZlciBiZSByZWFjaGVkIjsKICAgICAgICAgICAgfSBlbHNlIGlmIChmb2xkLnN0YXJ0LnJvdyA9PSByb3cpIHsKICAgICAgICAgICAgICAgIGZvbGRzID0gdGhpcy5mb2xkczsKICAgICAgICAgICAgICAgIHZhciBpID0gZm9sZHMuaW5kZXhPZihmb2xkKTsKICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0LmNvbHVtbiArPSBsZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKGk7IGkgPCBmb2xkcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGZvbGQgPSBmb2xkc1tpXTsKICAgICAgICAgICAgICAgICAgICBmb2xkLnN0YXJ0LmNvbHVtbiArPSBsZW47CiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb2xkLnNhbWVSb3cpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb2xkLmVuZC5jb2x1bW4gKz0gbGVuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5lbmQuY29sdW1uICs9IGxlbjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICB0aGlzLnNwbGl0ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsKICAgICAgICB2YXIgZm9sZCA9IHRoaXMuZ2V0TmV4dEZvbGRUbyhyb3csIGNvbHVtbikuZm9sZCwKICAgICAgICAgICAgZm9sZHMgPSB0aGlzLmZvbGRzOwogICAgICAgIHZhciBmb2xkRGF0YSA9IHRoaXMuZm9sZERhdGE7CgogICAgICAgIGlmICghZm9sZCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgdmFyIGkgPSBmb2xkcy5pbmRleE9mKGZvbGQpOwogICAgICAgIHZhciBmb2xkQmVmb3JlID0gZm9sZHNbaSAtIDFdOwogICAgICAgIHRoaXMuZW5kLnJvdyA9IGZvbGRCZWZvcmUuZW5kLnJvdzsKICAgICAgICB0aGlzLmVuZC5jb2x1bW4gPSBmb2xkQmVmb3JlLmVuZC5jb2x1bW47CgogICAgICAgIC8vIFJlbW92ZSB0aGUgZm9sZHMgYWZ0ZXIgcm93L2NvbHVtbiBhbmQgY3JlYXRlIGEgbmV3IEZvbGRMaW5lCiAgICAgICAgLy8gY29udGFpbmluZyB0aGVzZSByZW1vdmVkIGZvbGRzLgogICAgICAgIGZvbGRzID0gZm9sZHMuc3BsaWNlKGksIGZvbGRzLmxlbmd0aCAtIGkpOwoKICAgICAgICB2YXIgbmV3Rm9sZExpbmUgPSBuZXcgRm9sZExpbmUoZm9sZERhdGEsIGZvbGRzKTsKICAgICAgICBmb2xkRGF0YS5zcGxpY2UoZm9sZERhdGEuaW5kZXhPZih0aGlzKSArIDEsIDAsIG5ld0ZvbGRMaW5lKTsKICAgICAgICByZXR1cm4gbmV3Rm9sZExpbmU7CiAgICB9CgogICAgdGhpcy5tZXJnZSA9IGZ1bmN0aW9uKGZvbGRMaW5lTmV4dCkgewogICAgICAgIHZhciBmb2xkcyA9IGZvbGRMaW5lTmV4dC5mb2xkczsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvbGRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHRoaXMuYWRkRm9sZChmb2xkc1tpXSk7CiAgICAgICAgfQogICAgICAgIC8vIFJlbW92ZSB0aGUgZm9sZExpbmVOZXh0IC0gbm8gbG9uZ2VyIG5lZWRlZCwgYXMKICAgICAgICAvLyBpdCdzIG1lcmdlZCBub3cgd2l0aCBmb2xkTGluZU5leHQuCiAgICAgICAgdmFyIGZvbGREYXRhID0gdGhpcy5mb2xkRGF0YTsKICAgICAgICBmb2xkRGF0YS5zcGxpY2UoZm9sZERhdGEuaW5kZXhPZihmb2xkTGluZU5leHQpLCAxKTsKICAgIH0KCiAgICB0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHJldCA9IFt0aGlzLnJhbmdlLnRvU3RyaW5nKCkgKyAiOiBbIiBdOwoKICAgICAgICB0aGlzLmZvbGRzLmZvckVhY2goZnVuY3Rpb24oZm9sZCkgewogICAgICAgICAgICByZXQucHVzaCgiICAiICsgZm9sZC50b1N0cmluZygpKTsKICAgICAgICB9KTsKICAgICAgICByZXQucHVzaCgiXSIpCiAgICAgICAgcmV0dXJuIHJldC5qb2luKCJcbiIpOwogICAgfQoKICAgIHRoaXMuaWR4VG9Qb3NpdGlvbiA9IGZ1bmN0aW9uKGlkeCkgewogICAgICAgIHZhciBsYXN0Rm9sZEVuZENvbHVtbiA9IDA7CiAgICAgICAgdmFyIGZvbGQ7CgogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5mb2xkcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgZm9sZCA9IHRoaXMuZm9sZHNbaV07CgogICAgICAgICAgICBpZHggLT0gZm9sZC5zdGFydC5jb2x1bW4gLSBsYXN0Rm9sZEVuZENvbHVtbjsKICAgICAgICAgICAgaWYgKGlkeCA8IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcm93OiBmb2xkLnN0YXJ0LnJvdywKICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGZvbGQuc3RhcnQuY29sdW1uICsgaWR4CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZHggLT0gZm9sZC5wbGFjZWhvbGRlci5sZW5ndGg7CiAgICAgICAgICAgIGlmIChpZHggPCAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9sZC5zdGFydDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGFzdEZvbGRFbmRDb2x1bW4gPSBmb2xkLmVuZC5jb2x1bW47CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICByb3c6IHRoaXMuZW5kLnJvdywKICAgICAgICAgICAgY29sdW1uOiB0aGlzLmVuZC5jb2x1bW4gKyBpZHgKICAgICAgICB9OwogICAgfQp9KS5jYWxsKEZvbGRMaW5lLnByb3RvdHlwZSk7CgpleHBvcnRzLkZvbGRMaW5lID0gRm9sZExpbmU7Cn0pOy8qIHZpbTp0cz00OnN0cz00OnN3PTQ6CiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgSnVsaWFuIFZpZXJlY2sgPGp1bGlhbiBET1QgdmllcmVjayBBVCBnbWFpbCBET1QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvZWRpdF9zZXNzaW9uL2ZvbGQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7CgovKioKICogU2ltcGxlIGZvbGQtZGF0YSBzdHJ1Y3QuCiAqKi8KdmFyIEZvbGQgPSBleHBvcnRzLkZvbGQgPSBmdW5jdGlvbihyYW5nZSwgcGxhY2Vob2xkZXIpIHsKICAgIHRoaXMuZm9sZExpbmUgPSBudWxsOwogICAgdGhpcy5wbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyOwogICAgdGhpcy5yYW5nZSA9IHJhbmdlOwogICAgdGhpcy5zdGFydCA9IHJhbmdlLnN0YXJ0OwogICAgdGhpcy5lbmQgPSByYW5nZS5lbmQ7CgogICAgdGhpcy5zYW1lUm93ID0gcmFuZ2Uuc3RhcnQucm93ID09IHJhbmdlLmVuZC5yb3c7CiAgICB0aGlzLnN1YkZvbGRzID0gW107Cn07CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAnIicgKyB0aGlzLnBsYWNlaG9sZGVyICsgJyIgJyArIHRoaXMucmFuZ2UudG9TdHJpbmcoKTsKICAgIH07CgogICAgdGhpcy5zZXRGb2xkTGluZSA9IGZ1bmN0aW9uKGZvbGRMaW5lKSB7CiAgICAgICAgdGhpcy5mb2xkTGluZSA9IGZvbGRMaW5lOwogICAgICAgIHRoaXMuc3ViRm9sZHMuZm9yRWFjaChmdW5jdGlvbihmb2xkKSB7CiAgICAgICAgICAgIGZvbGQuc2V0Rm9sZExpbmUoZm9sZExpbmUpOwogICAgICAgIH0pOwogICAgfTsKCiAgICB0aGlzLmNsb25lID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHJhbmdlID0gdGhpcy5yYW5nZS5jbG9uZSgpOwogICAgICAgIHZhciBmb2xkID0gbmV3IEZvbGQocmFuZ2UsIHRoaXMucGxhY2Vob2xkZXIpOwogICAgICAgIHRoaXMuc3ViRm9sZHMuZm9yRWFjaChmdW5jdGlvbihzdWJGb2xkKSB7CiAgICAgICAgICAgIGZvbGQuc3ViRm9sZHMucHVzaChzdWJGb2xkLmNsb25lKCkpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBmb2xkOwogICAgfTsKCiAgICB0aGlzLmFkZFN1YkZvbGQgPSBmdW5jdGlvbihmb2xkKSB7CiAgICAgICAgaWYgKHRoaXMucmFuZ2UuaXNFZXF1YWwoZm9sZCkpCiAgICAgICAgICAgIHJldHVybiB0aGlzOwoKICAgICAgICBpZiAoIXRoaXMucmFuZ2UuY29udGFpbnNSYW5nZShmb2xkKSkKICAgICAgICAgICAgdGhyb3cgIkEgZm9sZCBjYW4ndCBpbnRlcnNlY3QgYWxyZWFkeSBleGlzdGluZyBmb2xkIiArIGZvbGQucmFuZ2UgKyB0aGlzLnJhbmdlOwoKICAgICAgICB2YXIgcm93ID0gZm9sZC5yYW5nZS5zdGFydC5yb3csIGNvbHVtbiA9IGZvbGQucmFuZ2Uuc3RhcnQuY29sdW1uOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBjbXAgPSAtMTsgaSA8IHRoaXMuc3ViRm9sZHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgY21wID0gdGhpcy5zdWJGb2xkc1tpXS5yYW5nZS5jb21wYXJlKHJvdywgY29sdW1uKTsKICAgICAgICAgICAgaWYgKGNtcCAhPSAxKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHZhciBhZnRlclN0YXJ0ID0gdGhpcy5zdWJGb2xkc1tpXTsKCiAgICAgICAgaWYgKGNtcCA9PSAwKQogICAgICAgICAgICByZXR1cm4gYWZ0ZXJTdGFydC5hZGRTdWJGb2xkKGZvbGQpCgogICAgICAgIC8vIGNtcCA9PSAtMQogICAgICAgIHZhciByb3cgPSBmb2xkLnJhbmdlLmVuZC5yb3csIGNvbHVtbiA9IGZvbGQucmFuZ2UuZW5kLmNvbHVtbjsKICAgICAgICBmb3IgKHZhciBqID0gaSwgY21wID0gLTE7IGogPCB0aGlzLnN1YkZvbGRzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIGNtcCA9IHRoaXMuc3ViRm9sZHNbal0ucmFuZ2UuY29tcGFyZShyb3csIGNvbHVtbik7CiAgICAgICAgICAgIGlmIChjbXAgIT0gMSkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICB2YXIgYWZ0ZXJFbmQgPSB0aGlzLnN1YkZvbGRzW2pdOwoKICAgICAgICBpZiAoY21wID09IDApCiAgICAgICAgICAgIHRocm93ICJBIGZvbGQgY2FuJ3QgaW50ZXJzZWN0IGFscmVhZHkgZXhpc3RpbmcgZm9sZCIgKyBmb2xkLnJhbmdlICsgdGhpcy5yYW5nZTsKCiAgICAgICAgdmFyIGNvbnN1bWVkRm9sZHMgPSB0aGlzLnN1YkZvbGRzLnNwbGljZShpLCBqIC0gaSwgZm9sZCkKICAgICAgICBmb2xkLnNldEZvbGRMaW5lKHRoaXMuZm9sZExpbmUpOwoKICAgICAgICByZXR1cm4gZm9sZDsKICAgIH0KCn0pLmNhbGwoRm9sZC5wcm90b3R5cGUpOwoKfSk7LyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoKICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvdG9rZW5faXRlcmF0b3InLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgVG9rZW5JdGVyYXRvciA9IGZ1bmN0aW9uKHNlc3Npb24sIGluaXRpYWxSb3csIGluaXRpYWxDb2x1bW4pIHsKICAgIHRoaXMuJHNlc3Npb24gPSBzZXNzaW9uOwogICAgdGhpcy4kcm93ID0gaW5pdGlhbFJvdzsKICAgIHRoaXMuJHJvd1Rva2VucyA9IHNlc3Npb24uZ2V0VG9rZW5zKGluaXRpYWxSb3csIGluaXRpYWxSb3cpWzBdLnRva2VuczsKCiAgICB2YXIgdG9rZW4gPSBzZXNzaW9uLmdldFRva2VuQXQoaW5pdGlhbFJvdywgaW5pdGlhbENvbHVtbik7CiAgICB0aGlzLiR0b2tlbkluZGV4ID0gdG9rZW4gPyB0b2tlbi5pbmRleCA6IC0xOwp9OwoKKGZ1bmN0aW9uKCkgewogICAgCiAgICB0aGlzLnN0ZXBCYWNrd2FyZCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuJHRva2VuSW5kZXggLT0gMTsKICAgICAgICAKICAgICAgICB3aGlsZSAodGhpcy4kdG9rZW5JbmRleCA8IDApIHsKICAgICAgICAgICAgdGhpcy4kcm93IC09IDE7CiAgICAgICAgICAgIGlmICh0aGlzLiRyb3cgPCAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLiRyb3cgPSAwOwogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICB0aGlzLiRyb3dUb2tlbnMgPSB0aGlzLiRzZXNzaW9uLmdldFRva2Vucyh0aGlzLiRyb3csIHRoaXMuJHJvdylbMF0udG9rZW5zOwogICAgICAgICAgICB0aGlzLiR0b2tlbkluZGV4ID0gdGhpcy4kcm93VG9rZW5zLmxlbmd0aCAtIDE7CiAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICByZXR1cm4gdGhpcy4kcm93VG9rZW5zW3RoaXMuJHRva2VuSW5kZXhdOwogICAgfTsKICAgIAogICAgdGhpcy5zdGVwRm9yd2FyZCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciByb3dDb3VudCA9IHRoaXMuJHNlc3Npb24uZ2V0TGVuZ3RoKCk7CiAgICAgICAgdGhpcy4kdG9rZW5JbmRleCArPSAxOwogICAgICAgIAogICAgICAgIHdoaWxlICh0aGlzLiR0b2tlbkluZGV4ID49IHRoaXMuJHJvd1Rva2Vucy5sZW5ndGgpIHsKICAgICAgICAgICAgdGhpcy4kcm93ICs9IDE7CiAgICAgICAgICAgIGlmICh0aGlzLiRyb3cgPj0gcm93Q291bnQpIHsKICAgICAgICAgICAgICAgIHRoaXMuJHJvdyA9IHJvd0NvdW50IC0gMTsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLiRyb3dUb2tlbnMgPSB0aGlzLiRzZXNzaW9uLmdldFRva2Vucyh0aGlzLiRyb3csIHRoaXMuJHJvdylbMF0udG9rZW5zOwogICAgICAgICAgICB0aGlzLiR0b2tlbkluZGV4ID0gMDsKICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgIHJldHVybiB0aGlzLiRyb3dUb2tlbnNbdGhpcy4kdG9rZW5JbmRleF07CiAgICB9OwogICAgCiAgICB0aGlzLmdldEN1cnJlbnRUb2tlbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gdGhpcy4kcm93VG9rZW5zW3RoaXMuJHRva2VuSW5kZXhdOwogICAgfTsKICAgIAogICAgdGhpcy5nZXRDdXJyZW50VG9rZW5Sb3cgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJHJvdzsKICAgIH07CiAgICAKICAgIHRoaXMuZ2V0Q3VycmVudFRva2VuQ29sdW1uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHJvd1Rva2VucyA9IHRoaXMuJHJvd1Rva2VuczsKICAgICAgICB2YXIgdG9rZW5JbmRleCA9IHRoaXMuJHRva2VuSW5kZXg7CiAgICAgICAgCiAgICAgICAgLy8gSWYgYSBjb2x1bW4gd2FzIGNhY2hlZCBieSBFZGl0U2Vzc2lvbi5nZXRUb2tlbkF0LCB0aGVuIHVzZSBpdAogICAgICAgIHZhciBjb2x1bW4gPSByb3dUb2tlbnNbdG9rZW5JbmRleF0uc3RhcnQ7CiAgICAgICAgaWYgKGNvbHVtbiAhPT0gdW5kZWZpbmVkKQogICAgICAgICAgICByZXR1cm4gY29sdW1uOwogICAgICAgICAgICAKICAgICAgICBjb2x1bW4gPSAwOwogICAgICAgIHdoaWxlICh0b2tlbkluZGV4ID4gMCkgewogICAgICAgICAgICB0b2tlbkluZGV4IC09IDE7CiAgICAgICAgICAgIGNvbHVtbiArPSByb3dUb2tlbnNbdG9rZW5JbmRleF0udmFsdWUubGVuZ3RoOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gY29sdW1uOyAgCiAgICB9OwogICAgICAgICAgICAKfSkuY2FsbChUb2tlbkl0ZXJhdG9yLnByb3RvdHlwZSk7CgpleHBvcnRzLlRva2VuSXRlcmF0b3IgPSBUb2tlbkl0ZXJhdG9yOwp9KTsKLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoKICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvZWRpdF9zZXNzaW9uL2JyYWNrZXRfbWF0Y2gnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS90b2tlbl9pdGVyYXRvciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIFRva2VuSXRlcmF0b3IgPSByZXF1aXJlKCIuLi90b2tlbl9pdGVyYXRvciIpLlRva2VuSXRlcmF0b3I7CgpmdW5jdGlvbiBCcmFja2V0TWF0Y2goKSB7CgogICAgdGhpcy5maW5kTWF0Y2hpbmdCcmFja2V0ID0gZnVuY3Rpb24ocG9zaXRpb24pIHsKICAgICAgICBpZiAocG9zaXRpb24uY29sdW1uID09IDApIHJldHVybiBudWxsOwoKICAgICAgICB2YXIgY2hhckJlZm9yZUN1cnNvciA9IHRoaXMuZ2V0TGluZShwb3NpdGlvbi5yb3cpLmNoYXJBdChwb3NpdGlvbi5jb2x1bW4tMSk7CiAgICAgICAgaWYgKGNoYXJCZWZvcmVDdXJzb3IgPT0gIiIpIHJldHVybiBudWxsOwoKICAgICAgICB2YXIgbWF0Y2ggPSBjaGFyQmVmb3JlQ3Vyc29yLm1hdGNoKC8oW1woXFtce10pfChbXClcXVx9XSkvKTsKICAgICAgICBpZiAoIW1hdGNoKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKG1hdGNoWzFdKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLiRmaW5kQ2xvc2luZ0JyYWNrZXQobWF0Y2hbMV0sIHBvc2l0aW9uKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gdGhpcy4kZmluZE9wZW5pbmdCcmFja2V0KG1hdGNoWzJdLCBwb3NpdGlvbik7CiAgICAgICAgfQogICAgfTsKCiAgICB0aGlzLiRicmFja2V0cyA9IHsKICAgICAgICAiKSI6ICIoIiwKICAgICAgICAiKCI6ICIpIiwKICAgICAgICAiXSI6ICJbIiwKICAgICAgICAiWyI6ICJdIiwKICAgICAgICAieyI6ICJ9IiwKICAgICAgICAifSI6ICJ7IgogICAgfTsKCiAgICB0aGlzLiRmaW5kT3BlbmluZ0JyYWNrZXQgPSBmdW5jdGlvbihicmFja2V0LCBwb3NpdGlvbikgewogICAgICAgIHZhciBvcGVuQnJhY2tldCA9IHRoaXMuJGJyYWNrZXRzW2JyYWNrZXRdOwogICAgICAgIHZhciBkZXB0aCA9IDE7CgogICAgICAgIHZhciBpdGVyYXRvciA9IG5ldyBUb2tlbkl0ZXJhdG9yKHRoaXMsIHBvc2l0aW9uLnJvdywgcG9zaXRpb24uY29sdW1uKTsKICAgICAgICB2YXIgdG9rZW4gPSBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW4oKTsKICAgICAgICBpZiAoIXRva2VuKSByZXR1cm4gbnVsbDsKICAgICAgICAKICAgICAgICAvLyB0b2tlbi50eXBlIGNvbnRhaW5zIGEgcGVyaW9kLWRlbGltaXRlZCBsaXN0IG9mIHRva2VuIGlkZW50aWZpZXJzCiAgICAgICAgLy8gKGUuZy46ICJjb25zdGFudC5udW1lcmljIiBvciAicGFyZW4ubHBhcmVuIikuICBDcmVhdGUgYSBwYXR0ZXJuIHRoYXQKICAgICAgICAvLyBtYXRjaGVzIGFueSB0b2tlbiBjb250YWluaW5nIHRoZSBzYW1lIGlkZW50aWZpZXJzIG9yIGEgc3Vic2V0LiAgSW4KICAgICAgICAvLyBhZGRpdGlvbiwgaWYgdG9rZW4udHlwZSBpbmNsdWRlcyAicnBhcmVuIiwgdGhlbiBhbHNvIG1hdGNoICJscGFyZW4iLgogICAgICAgIC8vIFNvIGlmIHR5cGUudG9rZW4gaXMgInBhcmVuLnJwYXJlbiIsIHRoZW4gdHlwZVJlIHdpbGwgbWF0Y2ggImxwYXJlbi5wYXJlbiIuCiAgICAgICAgdmFyIHR5cGVSZSA9IG5ldyBSZWdFeHAoIihcXC4/IiArCiAgICAgICAgICAgIHRva2VuLnR5cGUucmVwbGFjZSgiLiIsICJ8IikucmVwbGFjZSgicnBhcmVuIiwgImxwYXJlbnxycGFyZW4iKSArICIpKyIpOwogICAgICAgIAogICAgICAgIC8vIFN0YXJ0IHNlYXJjaGluZyBpbiB0b2tlbiwganVzdCBiZWZvcmUgdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbi5jb2x1bW4KICAgICAgICB2YXIgdmFsdWVJbmRleCA9IHBvc2l0aW9uLmNvbHVtbiAtIGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpIC0gMjsKICAgICAgICB2YXIgdmFsdWUgPSB0b2tlbi52YWx1ZTsKICAgICAgICAKICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIAogICAgICAgICAgICB3aGlsZSAodmFsdWVJbmRleCA+PSAwKSB7CiAgICAgICAgICAgICAgICB2YXIgY2hyID0gdmFsdWUuY2hhckF0KHZhbHVlSW5kZXgpOwogICAgICAgICAgICAgICAgaWYgKGNociA9PSBvcGVuQnJhY2tldCkgewogICAgICAgICAgICAgICAgICAgIGRlcHRoIC09IDE7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRlcHRoID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtyb3c6IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiB2YWx1ZUluZGV4ICsgaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCl9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNociA9PSBicmFja2V0KSB7CiAgICAgICAgICAgICAgICAgICAgZGVwdGggKz0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhbHVlSW5kZXggLT0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gU2NhbiBiYWNrd2FyZCB0aHJvdWdoIHRoZSBkb2N1bWVudCwgbG9va2luZyBmb3IgdGhlIG5leHQgdG9rZW4KICAgICAgICAgICAgLy8gd2hvc2UgdHlwZSBtYXRjaGVzIHR5cGVSZQogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICB0b2tlbiA9IGl0ZXJhdG9yLnN0ZXBCYWNrd2FyZCgpOwogICAgICAgICAgICB9IHdoaWxlICh0b2tlbiAmJiAhdHlwZVJlLnRlc3QodG9rZW4udHlwZSkpOwoKICAgICAgICAgICAgaWYgKHRva2VuID09IG51bGwpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICB2YWx1ZSA9IHRva2VuLnZhbHVlOwogICAgICAgICAgICB2YWx1ZUluZGV4ID0gdmFsdWUubGVuZ3RoIC0gMTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgIHRoaXMuJGZpbmRDbG9zaW5nQnJhY2tldCA9IGZ1bmN0aW9uKGJyYWNrZXQsIHBvc2l0aW9uKSB7CiAgICAgICAgdmFyIGNsb3NpbmdCcmFja2V0ID0gdGhpcy4kYnJhY2tldHNbYnJhY2tldF07CiAgICAgICAgdmFyIGRlcHRoID0gMTsKCiAgICAgICAgdmFyIGl0ZXJhdG9yID0gbmV3IFRva2VuSXRlcmF0b3IodGhpcywgcG9zaXRpb24ucm93LCBwb3NpdGlvbi5jb2x1bW4pOwogICAgICAgIHZhciB0b2tlbiA9IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbigpOwogICAgICAgIGlmICghdG9rZW4pIHJldHVybiBudWxsOwoKICAgICAgICAvLyB0b2tlbi50eXBlIGNvbnRhaW5zIGEgcGVyaW9kLWRlbGltaXRlZCBsaXN0IG9mIHRva2VuIGlkZW50aWZpZXJzCiAgICAgICAgLy8gKGUuZy46ICJjb25zdGFudC5udW1lcmljIiBvciAicGFyZW4ubHBhcmVuIikuICBDcmVhdGUgYSBwYXR0ZXJuIHRoYXQKICAgICAgICAvLyBtYXRjaGVzIGFueSB0b2tlbiBjb250YWluaW5nIHRoZSBzYW1lIGlkZW50aWZpZXJzIG9yIGEgc3Vic2V0LiAgSW4KICAgICAgICAvLyBhZGRpdGlvbiwgaWYgdG9rZW4udHlwZSBpbmNsdWRlcyAibHBhcmVuIiwgdGhlbiBhbHNvIG1hdGNoICJycGFyZW4iLgogICAgICAgIC8vIFNvIGlmIHR5cGUudG9rZW4gaXMgImxwYXJlbi5wYXJlbiIsIHRoZW4gdHlwZVJlIHdpbGwgbWF0Y2ggInBhcmVuLnJwYXJlbiIuCiAgICAgICAgdmFyIHR5cGVSZSA9IG5ldyBSZWdFeHAoIihcXC4/IiArCiAgICAgICAgICAgIHRva2VuLnR5cGUucmVwbGFjZSgiLiIsICJ8IikucmVwbGFjZSgibHBhcmVuIiwgImxwYXJlbnxycGFyZW4iKSArICIpKyIpOwoKICAgICAgICAvLyBTdGFydCBzZWFyY2hpbmcgaW4gdG9rZW4sIGFmdGVyIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24uY29sdW1uCiAgICAgICAgdmFyIHZhbHVlSW5kZXggPSBwb3NpdGlvbi5jb2x1bW4gLSBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKTsKCiAgICAgICAgd2hpbGUgKHRydWUpIHsKCiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRva2VuLnZhbHVlOwogICAgICAgICAgICB2YXIgdmFsdWVMZW5ndGggPSB2YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgIHdoaWxlICh2YWx1ZUluZGV4IDwgdmFsdWVMZW5ndGgpIHsKICAgICAgICAgICAgICAgIHZhciBjaHIgPSB2YWx1ZS5jaGFyQXQodmFsdWVJbmRleCk7CiAgICAgICAgICAgICAgICBpZiAoY2hyID09IGNsb3NpbmdCcmFja2V0KSB7CiAgICAgICAgICAgICAgICAgICAgZGVwdGggLT0gMTsKICAgICAgICAgICAgICAgICAgICBpZiAoZGVwdGggPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge3JvdzogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuUm93KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHZhbHVlSW5kZXggKyBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKX07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hyID09IGJyYWNrZXQpIHsKICAgICAgICAgICAgICAgICAgICBkZXB0aCArPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFsdWVJbmRleCArPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBTY2FuIGZvcndhcmQgdGhyb3VnaCB0aGUgZG9jdW1lbnQsIGxvb2tpbmcgZm9yIHRoZSBuZXh0IHRva2VuCiAgICAgICAgICAgIC8vIHdob3NlIHR5cGUgbWF0Y2hlcyB0eXBlUmUKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgdG9rZW4gPSBpdGVyYXRvci5zdGVwRm9yd2FyZCgpOwogICAgICAgICAgICB9IHdoaWxlICh0b2tlbiAmJiAhdHlwZVJlLnRlc3QodG9rZW4udHlwZSkpOwoKICAgICAgICAgICAgaWYgKHRva2VuID09IG51bGwpCiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIHZhbHVlSW5kZXggPSAwOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH07Cn0KZXhwb3J0cy5CcmFja2V0TWF0Y2ggPSBCcmFja2V0TWF0Y2g7Cgp9KTsKLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoKICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKiAgICAgIE1paGFpIFN1Y2FuIDxtaWhhaSBET1Qgc3VjYW4gQVQgZ21haWwgRE9UIGNvbT4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL3NlYXJjaCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9sYW5nJywgJ2FjZS9saWIvb29wJywgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIGxhbmcgPSByZXF1aXJlKCIuL2xpYi9sYW5nIik7CnZhciBvb3AgPSByZXF1aXJlKCIuL2xpYi9vb3AiKTsKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi9yYW5nZSIpLlJhbmdlOwoKdmFyIFNlYXJjaCA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy4kb3B0aW9ucyA9IHsKICAgICAgICBuZWVkbGU6ICIiLAogICAgICAgIGJhY2t3YXJkczogZmFsc2UsCiAgICAgICAgd3JhcDogZmFsc2UsCiAgICAgICAgY2FzZVNlbnNpdGl2ZTogZmFsc2UsCiAgICAgICAgd2hvbGVXb3JkOiBmYWxzZSwKICAgICAgICBzY29wZTogU2VhcmNoLkFMTCwKICAgICAgICByZWdFeHA6IGZhbHNlCiAgICB9Owp9OwoKU2VhcmNoLkFMTCA9IDE7ClNlYXJjaC5TRUxFQ1RJT04gPSAyOwoKKGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuc2V0ID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgIG9vcC5taXhpbih0aGlzLiRvcHRpb25zLCBvcHRpb25zKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH07CiAgICAKICAgIHRoaXMuZ2V0T3B0aW9ucyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBsYW5nLmNvcHlPYmplY3QodGhpcy4kb3B0aW9ucyk7CiAgICB9OwoKICAgIHRoaXMuZmluZCA9IGZ1bmN0aW9uKHNlc3Npb24pIHsKICAgICAgICBpZiAoIXRoaXMuJG9wdGlvbnMubmVlZGxlKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKCiAgICAgICAgaWYgKHRoaXMuJG9wdGlvbnMuYmFja3dhcmRzKSB7CiAgICAgICAgICAgIHZhciBpdGVyYXRvciA9IHRoaXMuJGJhY2t3YXJkTWF0Y2hJdGVyYXRvcihzZXNzaW9uKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpdGVyYXRvciA9IHRoaXMuJGZvcndhcmRNYXRjaEl0ZXJhdG9yKHNlc3Npb24pOwogICAgICAgIH0KCiAgICAgICAgdmFyIGZpcnN0UmFuZ2UgPSBudWxsOwogICAgICAgIGl0ZXJhdG9yLmZvckVhY2goZnVuY3Rpb24ocmFuZ2UpIHsKICAgICAgICAgICAgZmlyc3RSYW5nZSA9IHJhbmdlOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9KTsKCiAgICAgICAgcmV0dXJuIGZpcnN0UmFuZ2U7CiAgICB9OwoKICAgIHRoaXMuZmluZEFsbCA9IGZ1bmN0aW9uKHNlc3Npb24pIHsKICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMuJG9wdGlvbnM7CiAgICAgICAgaWYgKCFvcHRpb25zLm5lZWRsZSkKICAgICAgICAgICAgcmV0dXJuIFtdOwoKICAgICAgICBpZiAob3B0aW9ucy5iYWNrd2FyZHMpIHsKICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gdGhpcy4kYmFja3dhcmRNYXRjaEl0ZXJhdG9yKHNlc3Npb24pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGl0ZXJhdG9yID0gdGhpcy4kZm9yd2FyZE1hdGNoSXRlcmF0b3Ioc2Vzc2lvbik7CiAgICAgICAgfQoKICAgICAgICB2YXIgaWdub3JlQ3Vyc29yID0gIW9wdGlvbnMuc3RhcnQgJiYgb3B0aW9ucy53cmFwICYmIG9wdGlvbnMuc2NvcGUgPT0gU2VhcmNoLkFMTDsKICAgICAgICBpZiAoaWdub3JlQ3Vyc29yKQogICAgICAgICAgICBvcHRpb25zLnN0YXJ0ID0ge3JvdzogMCwgY29sdW1uOiAwfTsKCiAgICAgICAgdmFyIHJhbmdlcyA9IFtdOwogICAgICAgIGl0ZXJhdG9yLmZvckVhY2goZnVuY3Rpb24ocmFuZ2UpIHsKICAgICAgICAgICAgcmFuZ2VzLnB1c2gocmFuZ2UpOwogICAgICAgIH0pOwoKICAgICAgICBpZiAoaWdub3JlQ3Vyc29yKQogICAgICAgICAgICBvcHRpb25zLnN0YXJ0ID0gbnVsbDsKCiAgICAgICAgcmV0dXJuIHJhbmdlczsKICAgIH07CgogICAgdGhpcy5yZXBsYWNlID0gZnVuY3Rpb24oaW5wdXQsIHJlcGxhY2VtZW50KSB7CiAgICAgICAgdmFyIHJlID0gdGhpcy4kYXNzZW1ibGVSZWdFeHAoKTsKICAgICAgICB2YXIgbWF0Y2ggPSByZS5leGVjKGlucHV0KTsKICAgICAgICBpZiAobWF0Y2ggJiYgbWF0Y2hbMF0ubGVuZ3RoID09IGlucHV0Lmxlbmd0aCkgewogICAgICAgICAgICBpZiAodGhpcy4kb3B0aW9ucy5yZWdFeHApIHsKICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKHJlLCByZXBsYWNlbWVudCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMuJGZvcndhcmRNYXRjaEl0ZXJhdG9yID0gZnVuY3Rpb24oc2Vzc2lvbikgewogICAgICAgIHZhciByZSA9IHRoaXMuJGFzc2VtYmxlUmVnRXhwKCk7CiAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBmb3JFYWNoOiBmdW5jdGlvbihjYWxsYmFjaykgewogICAgICAgICAgICAgICAgc2VsZi4kZm9yd2FyZExpbmVJdGVyYXRvcihzZXNzaW9uKS5mb3JFYWNoKGZ1bmN0aW9uKGxpbmUsIHN0YXJ0SW5kZXgsIHJvdykgewogICAgICAgICAgICAgICAgICAgIGlmIChzdGFydEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cmluZyhzdGFydEluZGV4KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciBtYXRjaGVzID0gW107CgogICAgICAgICAgICAgICAgICAgIGxpbmUucmVwbGFjZShyZSwgZnVuY3Rpb24oc3RyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aC0yXTsKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cjogc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBzdGFydEluZGV4ICsgb2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8bWF0Y2hlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSBtYXRjaGVzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZWxmLiRyYW5nZUZyb21NYXRjaChyb3csIG1hdGNoLm9mZnNldCwgbWF0Y2guc3RyLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayhyYW5nZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfTsKCiAgICB0aGlzLiRiYWNrd2FyZE1hdGNoSXRlcmF0b3IgPSBmdW5jdGlvbihzZXNzaW9uKSB7CiAgICAgICAgdmFyIHJlID0gdGhpcy4kYXNzZW1ibGVSZWdFeHAoKTsKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGZvckVhY2g6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBzZWxmLiRiYWNrd2FyZExpbmVJdGVyYXRvcihzZXNzaW9uKS5mb3JFYWNoKGZ1bmN0aW9uKGxpbmUsIHN0YXJ0SW5kZXgsIHJvdykgewogICAgICAgICAgICAgICAgICAgIGlmIChzdGFydEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cmluZyhzdGFydEluZGV4KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciBtYXRjaGVzID0gW107CgogICAgICAgICAgICAgICAgICAgIGxpbmUucmVwbGFjZShyZSwgZnVuY3Rpb24oc3RyLCBvZmZzZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cjogc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBzdGFydEluZGV4ICsgb2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpPW1hdGNoZXMubGVuZ3RoLTE7IGk+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gbWF0Y2hlc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gc2VsZi4kcmFuZ2VGcm9tTWF0Y2gocm93LCBtYXRjaC5vZmZzZXQsIG1hdGNoLnN0ci5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2socmFuZ2UpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfTsKCiAgICB0aGlzLiRyYW5nZUZyb21NYXRjaCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uLCBsZW5ndGgpIHsKICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHJvdywgY29sdW1uLCByb3csIGNvbHVtbitsZW5ndGgpOwogICAgfTsKCiAgICB0aGlzLiRhc3NlbWJsZVJlZ0V4cCA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLiRvcHRpb25zLnJlZ0V4cCkgewogICAgICAgICAgICB2YXIgbmVlZGxlID0gdGhpcy4kb3B0aW9ucy5uZWVkbGU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmVlZGxlID0gbGFuZy5lc2NhcGVSZWdFeHAodGhpcy4kb3B0aW9ucy5uZWVkbGUpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMuJG9wdGlvbnMud2hvbGVXb3JkKSB7CiAgICAgICAgICAgIG5lZWRsZSA9ICJcXGIiICsgbmVlZGxlICsgIlxcYiI7CiAgICAgICAgfQoKICAgICAgICB2YXIgbW9kaWZpZXIgPSAiZyI7CiAgICAgICAgaWYgKCF0aGlzLiRvcHRpb25zLmNhc2VTZW5zaXRpdmUpIHsKICAgICAgICAgICAgbW9kaWZpZXIgKz0gImkiOwogICAgICAgIH0KCiAgICAgICAgdmFyIHJlID0gbmV3IFJlZ0V4cChuZWVkbGUsIG1vZGlmaWVyKTsKICAgICAgICByZXR1cm4gcmU7CiAgICB9OwoKICAgIHRoaXMuJGZvcndhcmRMaW5lSXRlcmF0b3IgPSBmdW5jdGlvbihzZXNzaW9uKSB7CiAgICAgICAgdmFyIHNlYXJjaFNlbGVjdGlvbiA9IHRoaXMuJG9wdGlvbnMuc2NvcGUgPT0gU2VhcmNoLlNFTEVDVElPTjsKCiAgICAgICAgdmFyIHJhbmdlID0gdGhpcy4kb3B0aW9ucy5yYW5nZSB8fCBzZXNzaW9uLmdldFNlbGVjdGlvbigpLmdldFJhbmdlKCk7CiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy4kb3B0aW9ucy5zdGFydCB8fCByYW5nZVtzZWFyY2hTZWxlY3Rpb24gPyAic3RhcnQiIDogImVuZCJdOwoKICAgICAgICB2YXIgZmlyc3RSb3cgPSBzZWFyY2hTZWxlY3Rpb24gPyByYW5nZS5zdGFydC5yb3cgOiAwOwogICAgICAgIHZhciBmaXJzdENvbHVtbiA9IHNlYXJjaFNlbGVjdGlvbiA/IHJhbmdlLnN0YXJ0LmNvbHVtbiA6IDA7CiAgICAgICAgdmFyIGxhc3RSb3cgPSBzZWFyY2hTZWxlY3Rpb24gPyByYW5nZS5lbmQucm93IDogc2Vzc2lvbi5nZXRMZW5ndGgoKSAtIDE7CgogICAgICAgIHZhciB3cmFwID0gdGhpcy4kb3B0aW9ucy53cmFwOwogICAgICAgIHZhciBpbldyYXAgPSBmYWxzZTsKCiAgICAgICAgZnVuY3Rpb24gZ2V0TGluZShyb3cpIHsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICAgICAgaWYgKHNlYXJjaFNlbGVjdGlvbiAmJiByb3cgPT0gcmFuZ2UuZW5kLnJvdykgewogICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKDAsIHJhbmdlLmVuZC5jb2x1bW4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpbldyYXAgJiYgcm93ID09IHN0YXJ0LnJvdykgewogICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKDAsIHN0YXJ0LmNvbHVtbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGxpbmU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBmb3JFYWNoOiBmdW5jdGlvbihjYWxsYmFjaykgewogICAgICAgICAgICAgICAgdmFyIHJvdyA9IHN0YXJ0LnJvdzsKCiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IGdldExpbmUocm93KTsKICAgICAgICAgICAgICAgIHZhciBzdGFydEluZGV4ID0gc3RhcnQuY29sdW1uOwoKICAgICAgICAgICAgICAgIHZhciBzdG9wID0gZmFsc2U7CiAgICAgICAgICAgICAgICBpbldyYXAgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICB3aGlsZSAoIWNhbGxiYWNrKGxpbmUsIHN0YXJ0SW5kZXgsIHJvdykpIHsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0b3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcm93Kys7CiAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IDA7CgogICAgICAgICAgICAgICAgICAgIGlmIChyb3cgPiBsYXN0Um93KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cmFwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cgPSBmaXJzdFJvdzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBmaXJzdENvbHVtbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluV3JhcCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChyb3cgPT0gc3RhcnQucm93KQogICAgICAgICAgICAgICAgICAgICAgICBzdG9wID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgbGluZSA9IGdldExpbmUocm93KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9OwoKICAgIHRoaXMuJGJhY2t3YXJkTGluZUl0ZXJhdG9yID0gZnVuY3Rpb24oc2Vzc2lvbikgewogICAgICAgIHZhciBzZWFyY2hTZWxlY3Rpb24gPSB0aGlzLiRvcHRpb25zLnNjb3BlID09IFNlYXJjaC5TRUxFQ1RJT047CgogICAgICAgIHZhciByYW5nZSA9IHRoaXMuJG9wdGlvbnMucmFuZ2UgfHwgc2Vzc2lvbi5nZXRTZWxlY3Rpb24oKS5nZXRSYW5nZSgpOwogICAgICAgIHZhciBzdGFydCA9IHRoaXMuJG9wdGlvbnMuc3RhcnQgfHwgcmFuZ2Vbc2VhcmNoU2VsZWN0aW9uID8gImVuZCIgOiAic3RhcnQiXTsKCiAgICAgICAgdmFyIGZpcnN0Um93ID0gc2VhcmNoU2VsZWN0aW9uID8gcmFuZ2Uuc3RhcnQucm93IDogMDsKICAgICAgICB2YXIgZmlyc3RDb2x1bW4gPSBzZWFyY2hTZWxlY3Rpb24gPyByYW5nZS5zdGFydC5jb2x1bW4gOiAwOwogICAgICAgIHZhciBsYXN0Um93ID0gc2VhcmNoU2VsZWN0aW9uID8gcmFuZ2UuZW5kLnJvdyA6IHNlc3Npb24uZ2V0TGVuZ3RoKCkgLSAxOwoKICAgICAgICB2YXIgd3JhcCA9IHRoaXMuJG9wdGlvbnMud3JhcDsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgZm9yRWFjaCA6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICB2YXIgcm93ID0gc3RhcnQucm93OwoKICAgICAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdykuc3Vic3RyaW5nKDAsIHN0YXJ0LmNvbHVtbik7CiAgICAgICAgICAgICAgICB2YXIgc3RhcnRJbmRleCA9IDA7CiAgICAgICAgICAgICAgICB2YXIgc3RvcCA9IGZhbHNlOwogICAgICAgICAgICAgICAgdmFyIGluV3JhcCA9IGZhbHNlOwoKICAgICAgICAgICAgICAgIHdoaWxlICghY2FsbGJhY2sobGluZSwgc3RhcnRJbmRleCwgcm93KSkgewoKICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICByb3ctLTsKICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gMDsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHJvdyA8IGZpcnN0Um93KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cmFwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cgPSBsYXN0Um93OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5XcmFwID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKHJvdyA9PSBzdGFydC5yb3cpCiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3AgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaFNlbGVjdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocm93ID09IGZpcnN0Um93KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IGZpcnN0Q29sdW1uOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyb3cgPT0gbGFzdFJvdykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cmluZygwLCByYW5nZS5lbmQuY29sdW1uKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChpbldyYXAgJiYgcm93ID09IHN0YXJ0LnJvdykKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IHN0YXJ0LmNvbHVtbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9OwoKfSkuY2FsbChTZWFyY2gucHJvdG90eXBlKTsKCmV4cG9ydHMuU2VhcmNoID0gU2VhcmNoOwp9KTsKZGVmaW5lKCdhY2UvY29tbWFuZHMvY29tbWFuZF9tYW5hZ2VyJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2tleXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBrZXlVdGlsID0gcmVxdWlyZSgiLi4vbGliL2tleXMiKTsKCnZhciBDb21tYW5kTWFuYWdlciA9IGZ1bmN0aW9uKHBsYXRmb3JtLCBjb21tYW5kcykgewogICAgaWYgKHR5cGVvZiBwbGF0Zm9ybSAhPT0gInN0cmluZyIpCiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiJ3BsYXRmb3JtJyBhcmd1bWVudCBtdXN0IGJlIGVpdGhlciAnbWFjJyBvciAnd2luJyIpOwoKICAgIHRoaXMucGxhdGZvcm0gPSBwbGF0Zm9ybTsKICAgIHRoaXMuY29tbWFuZHMgPSB7fTsKICAgIHRoaXMuY29tbW1hbmRLZXlCaW5kaW5nID0ge307CgogICAgaWYgKGNvbW1hbmRzKQogICAgICAgIGNvbW1hbmRzLmZvckVhY2godGhpcy5hZGRDb21tYW5kLCB0aGlzKTsKfTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmFkZENvbW1hbmQgPSBmdW5jdGlvbihjb21tYW5kKSB7CiAgICAgICAgaWYgKHRoaXMuY29tbWFuZHNbY29tbWFuZC5uYW1lXSkKICAgICAgICAgICAgdGhpcy5yZW1vdmVDb21tYW5kKGNvbW1hbmQpOwoKICAgICAgICB0aGlzLmNvbW1hbmRzW2NvbW1hbmQubmFtZV0gPSBjb21tYW5kOwoKICAgICAgICBpZiAoY29tbWFuZC5iaW5kS2V5KSB7CiAgICAgICAgICAgIHRoaXMuX2J1aWxkS2V5SGFzaChjb21tYW5kKTsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMucmVtb3ZlQ29tbWFuZCA9IGZ1bmN0aW9uKGNvbW1hbmQpIHsKICAgICAgICB2YXIgbmFtZSA9ICh0eXBlb2YgY29tbWFuZCA9PT0gJ3N0cmluZycgPyBjb21tYW5kIDogY29tbWFuZC5uYW1lKTsKICAgICAgICBjb21tYW5kID0gdGhpcy5jb21tYW5kc1tuYW1lXTsKICAgICAgICBkZWxldGUgdGhpcy5jb21tYW5kc1tuYW1lXTsKCiAgICAgICAgLy8gZXhhdXN0aXZlIHNlYXJjaCBpcyBicnV0ZSBmb3JjZSBidXQgc2luY2UgcmVtb3ZlQ29tbWFuZCBpcwogICAgICAgIC8vIG5vdCBhIHBlcmZvcm1hbmNlIGNyaXRpY2FsIG9wZXJhdGlvbiB0aGlzIHNob3VsZCBiZSBPSwogICAgICAgIHZhciBja2IgPSB0aGlzLmNvbW1tYW5kS2V5QmluZGluZzsKICAgICAgICBmb3IgKHZhciBoYXNoSWQgaW4gY2tiKSB7CiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBja2JbaGFzaElkXSkgewogICAgICAgICAgICAgICAgaWYgKGNrYltoYXNoSWRdW2tleV0gPT0gY29tbWFuZCkKICAgICAgICAgICAgICAgICAgICBkZWxldGUgY2tiW2hhc2hJZF1ba2V5XTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CgogICAgdGhpcy5hZGRDb21tYW5kcyA9IGZ1bmN0aW9uKGNvbW1hbmRzKSB7CiAgICAgICAgT2JqZWN0LmtleXMoY29tbWFuZHMpLmZvckVhY2goZnVuY3Rpb24obmFtZSkgewogICAgICAgICAgICB2YXIgY29tbWFuZCA9IGNvbW1hbmRzW25hbWVdOwogICAgICAgICAgICBpZiAodHlwZW9mIGNvbW1hbmQgPT09ICJzdHJpbmciKQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmluZEtleShjb21tYW5kLCBuYW1lKTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YgY29tbWFuZCA9PT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgIGNvbW1hbmQgPSB7IGV4ZWM6IGNvbW1hbmQgfTsKCiAgICAgICAgICAgIGlmICghY29tbWFuZC5uYW1lKQogICAgICAgICAgICAgICAgY29tbWFuZC5uYW1lID0gbmFtZTsKCiAgICAgICAgICAgIHRoaXMuYWRkQ29tbWFuZChjb21tYW5kKTsKICAgICAgICB9LCB0aGlzKTsKICAgIH07CgogICAgdGhpcy5yZW1vdmVDb21tYW5kcyA9IGZ1bmN0aW9uKGNvbW1hbmRzKSB7CiAgICAgICAgT2JqZWN0LmtleXMoY29tbWFuZHMpLmZvckVhY2goZnVuY3Rpb24obmFtZSkgewogICAgICAgICAgICB0aGlzLnJlbW92ZUNvbW1hbmQoY29tbWFuZHNbbmFtZV0pOwogICAgICAgIH0sIHRoaXMpOwogICAgfTsKCiAgICB0aGlzLmJpbmRLZXkgPSBmdW5jdGlvbihrZXksIGNvbW1hbmQpIHsKICAgICAgICBpZigha2V5KQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIHZhciBja2IgPSB0aGlzLmNvbW1tYW5kS2V5QmluZGluZzsKICAgICAgICBrZXkuc3BsaXQoInwiKS5mb3JFYWNoKGZ1bmN0aW9uKGtleVBhcnQpIHsKICAgICAgICAgICAgdmFyIGJpbmRpbmcgPSBwYXJzZUtleXMoa2V5UGFydCwgY29tbWFuZCk7CiAgICAgICAgICAgIHZhciBoYXNoSWQgPSBiaW5kaW5nLmhhc2hJZDsKICAgICAgICAgICAgKGNrYltoYXNoSWRdIHx8IChja2JbaGFzaElkXSA9IHt9KSlbYmluZGluZy5rZXldID0gY29tbWFuZDsKICAgICAgICB9KTsKICAgIH07CgogICAgdGhpcy5iaW5kS2V5cyA9IGZ1bmN0aW9uKGtleUxpc3QpIHsKICAgICAgICBPYmplY3Qua2V5cyhrZXlMaXN0KS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkgewogICAgICAgICAgICB0aGlzLmJpbmRLZXkoa2V5LCBrZXlMaXN0W2tleV0pOwogICAgICAgIH0sIHRoaXMpOwogICAgfTsKCiAgICB0aGlzLl9idWlsZEtleUhhc2ggPSBmdW5jdGlvbihjb21tYW5kKSB7CiAgICAgICAgdmFyIGJpbmRpbmcgPSBjb21tYW5kLmJpbmRLZXk7CiAgICAgICAgaWYgKCFiaW5kaW5nKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIHZhciBrZXkgPSB0eXBlb2YgYmluZGluZyA9PSAic3RyaW5nIiA/IGJpbmRpbmc6IGJpbmRpbmdbdGhpcy5wbGF0Zm9ybV07CiAgICAgICAgdGhpcy5iaW5kS2V5KGtleSwgY29tbWFuZCk7CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VLZXlzKGtleXMsIHZhbCwgcmV0KSB7CiAgICAgICAgdmFyIGtleTsKICAgICAgICB2YXIgaGFzaElkID0gMDsKICAgICAgICB2YXIgcGFydHMgPSBzcGxpdFNhZmUoa2V5cyk7CgogICAgICAgIGZvciAodmFyIGk9MCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICAgICAgICBpZiAoa2V5VXRpbC5LRVlfTU9EU1twYXJ0c1tpXV0pCiAgICAgICAgICAgICAgICBoYXNoSWQgPSBoYXNoSWQgfCBrZXlVdGlsLktFWV9NT0RTW3BhcnRzW2ldXTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAga2V5ID0gcGFydHNbaV0gfHwgIi0iOyAvL3doZW4gZW1wdHksIHRoZSBzcGxpdFNhZmUgcmVtb3ZlZCBhICctJwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAga2V5OiBrZXksCiAgICAgICAgICAgIGhhc2hJZDogaGFzaElkCiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHNwbGl0U2FmZShzLCBzZXBhcmF0b3IpIHsKICAgICAgICByZXR1cm4gKHMudG9Mb3dlckNhc2UoKQogICAgICAgICAgICAudHJpbSgpCiAgICAgICAgICAgIC5zcGxpdChuZXcgUmVnRXhwKCJbXFxzIF0qXFwtW1xccyBdKiIsICJnIiksIDk5OSkpOwogICAgfQoKICAgIHRoaXMuZmluZEtleUNvbW1hbmQgPSBmdW5jdGlvbiBmaW5kS2V5Q29tbWFuZChoYXNoSWQsIHRleHRPcktleSkgewogICAgICAgIC8vIENvbnZlcnQga2V5Q29kZSB0byB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgogICAgICAgIGlmICh0eXBlb2YgdGV4dE9yS2V5ID09ICJudW1iZXIiKSB7CiAgICAgICAgICAgIHRleHRPcktleSA9IGtleVV0aWwua2V5Q29kZVRvU3RyaW5nKHRleHRPcktleSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgY2ticiA9IHRoaXMuY29tbW1hbmRLZXlCaW5kaW5nOwogICAgICAgIHJldHVybiBja2JyW2hhc2hJZF0gJiYgY2ticltoYXNoSWRdW3RleHRPcktleS50b0xvd2VyQ2FzZSgpXTsKICAgIH0KCiAgICB0aGlzLmV4ZWMgPSBmdW5jdGlvbihjb21tYW5kLCBlZGl0b3IsIGFyZ3MpIHsKICAgICAgICBpZiAodHlwZW9mIGNvbW1hbmQgPT09ICdzdHJpbmcnKQogICAgICAgICAgICBjb21tYW5kID0gdGhpcy5jb21tYW5kc1tjb21tYW5kXTsKCiAgICAgICAgaWYgKCFjb21tYW5kKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgIGlmIChlZGl0b3IgJiYgZWRpdG9yLiRyZWFkT25seSAmJiAhY29tbWFuZC5yZWFkT25seSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgICBjb21tYW5kLmV4ZWMoZWRpdG9yLCBhcmdzIHx8IHt9KTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH07CgogICAgdGhpcy50b2dnbGVSZWNvcmRpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy4kaW5SZXBsYXkpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBpZiAodGhpcy5yZWNvcmRpbmcpIHsKICAgICAgICAgICAgdGhpcy5tYWNyby5wb3AoKTsKICAgICAgICAgICAgdGhpcy5leGVjID0gdGhpcy5ub3JtYWxfZXhlYzsKCiAgICAgICAgICAgIGlmICghdGhpcy5tYWNyby5sZW5ndGgpCiAgICAgICAgICAgICAgICB0aGlzLm1hY3JvID0gdGhpcy5vbGRNYWNybzsKCiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlY29yZGluZyA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICB0aGlzLm9sZE1hY3JvID0gdGhpcy5tYWNybzsKICAgICAgICB0aGlzLm1hY3JvID0gW107CiAgICAgICAgdGhpcy5ub3JtYWxfZXhlYyA9IHRoaXMuZXhlYzsKICAgICAgICB0aGlzLmV4ZWMgPSBmdW5jdGlvbihjb21tYW5kLCBlZGl0b3IsIGFyZ3MpIHsKICAgICAgICAgICAgdGhpcy5tYWNyby5wdXNoKFtjb21tYW5kLCBhcmdzXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLm5vcm1hbF9leGVjKGNvbW1hbmQsIGVkaXRvciwgYXJncyk7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gdGhpcy5yZWNvcmRpbmcgPSB0cnVlOwogICAgfTsKCiAgICB0aGlzLnJlcGxheSA9IGZ1bmN0aW9uKGVkaXRvcikgewogICAgICAgIGlmICh0aGlzLiRpblJlcGxheSB8fCAhdGhpcy5tYWNybykKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICBpZiAodGhpcy5yZWNvcmRpbmcpCiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvZ2dsZVJlY29yZGluZygpOwoKICAgICAgICB0cnkgewogICAgICAgICAgICB0aGlzLiRpblJlcGxheSA9IHRydWU7CiAgICAgICAgICAgIHRoaXMubWFjcm8uZm9yRWFjaChmdW5jdGlvbih4KSB7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHggPT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgdGhpcy5leGVjKHgsIGVkaXRvcik7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgdGhpcy5leGVjKHhbMF0sIGVkaXRvciwgeFsxXSk7CiAgICAgICAgICAgIH0sIHRoaXMpCiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgdGhpcy4kaW5SZXBsYXkgPSBmYWxzZTsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMudHJpbU1hY3JvID0gZnVuY3Rpb24obSkgewogICAgICAgIHJldHVybiBtLm1hcChmdW5jdGlvbih4KXsKICAgICAgICAgICAgaWYgKHR5cGVvZiB4WzBdICE9ICJzdHJpbmciKQogICAgICAgICAgICAgICAgeFswXSA9IHhbMF0ubmFtZTsKICAgICAgICAgICAgaWYgKCF4WzFdKQogICAgICAgICAgICAgICAgeCA9IHhbMF07CiAgICAgICAgICAgIHJldHVybiB4CiAgICAgICAgfSkKICAgIH0KCn0pLmNhbGwoQ29tbWFuZE1hbmFnZXIucHJvdG90eXBlKTsKCmV4cG9ydHMuQ29tbWFuZE1hbmFnZXIgPSBDb21tYW5kTWFuYWdlcjsKCn0pOwovKiB2aW06dHM9NDpzdHM9NDpzdz00OgogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqICAgICAgTWloYWkgU3VjYW4gPG1paGFpIERPVCBzdWNhbiBBVCBnbWFpbCBET1QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvdW5kb21hbmFnZXInLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgVW5kb01hbmFnZXIgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMucmVzZXQoKTsKfTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmV4ZWN1dGUgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgdmFyIGRlbHRhcyA9IG9wdGlvbnMuYXJnc1swXTsKICAgICAgICB0aGlzLiRkb2MgID0gb3B0aW9ucy5hcmdzWzFdOwogICAgICAgIHRoaXMuJHVuZG9TdGFjay5wdXNoKGRlbHRhcyk7CiAgICAgICAgdGhpcy4kcmVkb1N0YWNrID0gW107CiAgICB9OwoKICAgIHRoaXMudW5kbyA9IGZ1bmN0aW9uKGRvbnRTZWxlY3QpIHsKICAgICAgICB2YXIgZGVsdGFzID0gdGhpcy4kdW5kb1N0YWNrLnBvcCgpOwogICAgICAgIHZhciB1bmRvU2VsZWN0aW9uUmFuZ2UgPSBudWxsOwogICAgICAgIGlmIChkZWx0YXMpIHsKICAgICAgICAgICAgdW5kb1NlbGVjdGlvblJhbmdlID0KICAgICAgICAgICAgICAgIHRoaXMuJGRvYy51bmRvQ2hhbmdlcyhkZWx0YXMsIGRvbnRTZWxlY3QpOwogICAgICAgICAgICB0aGlzLiRyZWRvU3RhY2sucHVzaChkZWx0YXMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdW5kb1NlbGVjdGlvblJhbmdlOwogICAgfTsKCiAgICB0aGlzLnJlZG8gPSBmdW5jdGlvbihkb250U2VsZWN0KSB7CiAgICAgICAgdmFyIGRlbHRhcyA9IHRoaXMuJHJlZG9TdGFjay5wb3AoKTsKICAgICAgICB2YXIgcmVkb1NlbGVjdGlvblJhbmdlID0gbnVsbDsKICAgICAgICBpZiAoZGVsdGFzKSB7CiAgICAgICAgICAgIHJlZG9TZWxlY3Rpb25SYW5nZSA9CiAgICAgICAgICAgICAgICB0aGlzLiRkb2MucmVkb0NoYW5nZXMoZGVsdGFzLCBkb250U2VsZWN0KTsKICAgICAgICAgICAgdGhpcy4kdW5kb1N0YWNrLnB1c2goZGVsdGFzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlZG9TZWxlY3Rpb25SYW5nZTsKICAgIH07CgogICAgdGhpcy5yZXNldCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuJHVuZG9TdGFjayA9IFtdOwogICAgICAgIHRoaXMuJHJlZG9TdGFjayA9IFtdOwogICAgfTsKCiAgICB0aGlzLmhhc1VuZG8gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy4kdW5kb1N0YWNrLmxlbmd0aCA+IDA7CiAgICB9OwoKICAgIHRoaXMuaGFzUmVkbyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLiRyZWRvU3RhY2subGVuZ3RoID4gMDsKICAgIH07Cgp9KS5jYWxsKFVuZG9NYW5hZ2VyLnByb3RvdHlwZSk7CgpleHBvcnRzLlVuZG9NYW5hZ2VyID0gVW5kb01hbmFnZXI7Cn0pOwovKiB2aW06dHM9NDpzdHM9NDpzdz00OgogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbkBhamF4Lm9yZz4KICogICAgICBJcmFrbGkgR296YWxpc2h2aWxpIDxyZm9iaWNAZ21haWwuY29tPiAoaHR0cDovL2plZGl0b29sa2l0LmNvbSkKICogICAgICBKdWxpYW4gVmllcmVjayA8anVsaWFuLnZpZXJlY2tAZ21haWwuY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvdmlydHVhbF9yZW5kZXJlcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9kb20nLCAnYWNlL2xpYi9ldmVudCcsICdhY2UvbGliL3VzZXJhZ2VudCcsICdhY2UvbGF5ZXIvZ3V0dGVyJywgJ2FjZS9sYXllci9tYXJrZXInLCAnYWNlL2xheWVyL3RleHQnLCAnYWNlL2xheWVyL2N1cnNvcicsICdhY2Uvc2Nyb2xsYmFyJywgJ2FjZS9yZW5kZXJsb29wJywgJ2FjZS9saWIvZXZlbnRfZW1pdHRlcicsICd0ZXh0IWFjZS9jc3MvZWRpdG9yLmNzcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4vbGliL29vcCIpOwp2YXIgZG9tID0gcmVxdWlyZSgiLi9saWIvZG9tIik7CnZhciBldmVudCA9IHJlcXVpcmUoIi4vbGliL2V2ZW50Iik7CnZhciB1c2VyYWdlbnQgPSByZXF1aXJlKCIuL2xpYi91c2VyYWdlbnQiKTsKdmFyIEd1dHRlckxheWVyID0gcmVxdWlyZSgiLi9sYXllci9ndXR0ZXIiKS5HdXR0ZXI7CnZhciBNYXJrZXJMYXllciA9IHJlcXVpcmUoIi4vbGF5ZXIvbWFya2VyIikuTWFya2VyOwp2YXIgVGV4dExheWVyID0gcmVxdWlyZSgiLi9sYXllci90ZXh0IikuVGV4dDsKdmFyIEN1cnNvckxheWVyID0gcmVxdWlyZSgiLi9sYXllci9jdXJzb3IiKS5DdXJzb3I7CnZhciBTY3JvbGxCYXIgPSByZXF1aXJlKCIuL3Njcm9sbGJhciIpLlNjcm9sbEJhcjsKdmFyIFJlbmRlckxvb3AgPSByZXF1aXJlKCIuL3JlbmRlcmxvb3AiKS5SZW5kZXJMb29wOwp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsKdmFyIGVkaXRvckNzcyA9IHJlcXVpcmUoInRleHQhLi9jc3MvZWRpdG9yLmNzcyIpOwoKZG9tLmltcG9ydENzc1N0cmluZyhlZGl0b3JDc3MsICJhY2VfZWRpdG9yIik7Cgp2YXIgVmlydHVhbFJlbmRlcmVyID0gZnVuY3Rpb24oY29udGFpbmVyLCB0aGVtZSkgewogICAgdmFyIF9zZWxmID0gdGhpczsKICAgIAogICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7CgogICAgLy8gVE9ETzogdGhpcyBicmVha3MgcmVuZGVyaW5nIGluIENsb3VkOSB3aXRoIG11bHRpcGxlIGFjZSBpbnN0YW5jZXMKLy8gICAgLy8gSW1wb3J0cyBDU1Mgb25jZSBwZXIgRE9NIGRvY3VtZW50ICgnYWNlX2VkaXRvcicgc2VydmVzIGFzIGFuIGlkZW50aWZpZXIpLgovLyAgICBkb20uaW1wb3J0Q3NzU3RyaW5nKGVkaXRvckNzcywgImFjZV9lZGl0b3IiLCBjb250YWluZXIub3duZXJEb2N1bWVudCk7CiAgICAKICAgIGRvbS5hZGRDc3NDbGFzcyhjb250YWluZXIsICJhY2VfZWRpdG9yIik7CgogICAgdGhpcy5zZXRUaGVtZSh0aGVtZSk7CgogICAgdGhpcy4kZ3V0dGVyID0gZG9tLmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgdGhpcy4kZ3V0dGVyLmNsYXNzTmFtZSA9ICJhY2VfZ3V0dGVyIjsKICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuJGd1dHRlcik7CgogICAgdGhpcy5zY3JvbGxlciA9IGRvbS5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIHRoaXMuc2Nyb2xsZXIuY2xhc3NOYW1lID0gImFjZV9zY3JvbGxlciI7CiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnNjcm9sbGVyKTsKCiAgICB0aGlzLmNvbnRlbnQgPSBkb20uY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICB0aGlzLmNvbnRlbnQuY2xhc3NOYW1lID0gImFjZV9jb250ZW50IjsKICAgIHRoaXMuc2Nyb2xsZXIuYXBwZW5kQ2hpbGQodGhpcy5jb250ZW50KTsKCiAgICB0aGlzLiRndXR0ZXJMYXllciA9IG5ldyBHdXR0ZXJMYXllcih0aGlzLiRndXR0ZXIpOwogICAgdGhpcy4kZ3V0dGVyTGF5ZXIub24oImNoYW5nZUd1dHRlcldpZHRoIiwgdGhpcy5vblJlc2l6ZS5iaW5kKHRoaXMsIHRydWUpKTsgICAgCiAgICAKICAgIHRoaXMuJG1hcmtlckJhY2sgPSBuZXcgTWFya2VyTGF5ZXIodGhpcy5jb250ZW50KTsKCiAgICB2YXIgdGV4dExheWVyID0gdGhpcy4kdGV4dExheWVyID0gbmV3IFRleHRMYXllcih0aGlzLmNvbnRlbnQpOwogICAgdGhpcy5jYW52YXMgPSB0ZXh0TGF5ZXIuZWxlbWVudDsKCiAgICB0aGlzLiRtYXJrZXJGcm9udCA9IG5ldyBNYXJrZXJMYXllcih0aGlzLmNvbnRlbnQpOwoKICAgIHRoaXMuY2hhcmFjdGVyV2lkdGggPSB0ZXh0TGF5ZXIuZ2V0Q2hhcmFjdGVyV2lkdGgoKTsKICAgIHRoaXMubGluZUhlaWdodCA9IHRleHRMYXllci5nZXRMaW5lSGVpZ2h0KCk7CgogICAgdGhpcy4kY3Vyc29yTGF5ZXIgPSBuZXcgQ3Vyc29yTGF5ZXIodGhpcy5jb250ZW50KTsKICAgIHRoaXMuJGN1cnNvclBhZGRpbmcgPSA4OwoKICAgIC8vIEluZGljYXRlcyB3aGV0aGVyIHRoZSBob3Jpem9udGFsIHNjcm9sbGJhciBpcyB2aXNpYmxlCiAgICB0aGlzLiRob3JpelNjcm9sbCA9IHRydWU7CiAgICB0aGlzLiRob3JpelNjcm9sbEFsd2F5c1Zpc2libGUgPSB0cnVlOwoKICAgIHRoaXMuc2Nyb2xsQmFyID0gbmV3IFNjcm9sbEJhcihjb250YWluZXIpOwogICAgdGhpcy5zY3JvbGxCYXIuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgZnVuY3Rpb24oZSkgewogICAgICAgIF9zZWxmLnNlc3Npb24uc2V0U2Nyb2xsVG9wKGUuZGF0YSk7CiAgICB9KTsKCiAgICB0aGlzLnNjcm9sbFRvcCA9IDA7CiAgICB0aGlzLnNjcm9sbExlZnQgPSAwOwogICAgCiAgICBldmVudC5hZGRMaXN0ZW5lcih0aGlzLnNjcm9sbGVyLCAic2Nyb2xsIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgX3NlbGYuc2Vzc2lvbi5zZXRTY3JvbGxMZWZ0KF9zZWxmLnNjcm9sbGVyLnNjcm9sbExlZnQpOwogICAgfSk7CgogICAgdGhpcy5jdXJzb3JQb3MgPSB7CiAgICAgICAgcm93IDogMCwKICAgICAgICBjb2x1bW4gOiAwCiAgICB9OwoKICAgIHRoaXMuJHRleHRMYXllci5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VDaGFyYWN0ZXJTaXplIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgX3NlbGYuY2hhcmFjdGVyV2lkdGggPSB0ZXh0TGF5ZXIuZ2V0Q2hhcmFjdGVyV2lkdGgoKTsKICAgICAgICBfc2VsZi5saW5lSGVpZ2h0ID0gdGV4dExheWVyLmdldExpbmVIZWlnaHQoKTsKICAgICAgICBfc2VsZi4kdXBkYXRlUHJpbnRNYXJnaW4oKTsKICAgICAgICBfc2VsZi5vblJlc2l6ZSh0cnVlKTsKCiAgICAgICAgX3NlbGYuJGxvb3Auc2NoZWR1bGUoX3NlbGYuQ0hBTkdFX0ZVTEwpOwogICAgfSk7CgogICAgdGhpcy4kc2l6ZSA9IHsKICAgICAgICB3aWR0aDogMCwKICAgICAgICBoZWlnaHQ6IDAsCiAgICAgICAgc2Nyb2xsZXJIZWlnaHQ6IDAsCiAgICAgICAgc2Nyb2xsZXJXaWR0aDogMAogICAgfTsKCiAgICB0aGlzLmxheWVyQ29uZmlnID0gewogICAgICAgIHdpZHRoIDogMSwKICAgICAgICBwYWRkaW5nIDogMCwKICAgICAgICBmaXJzdFJvdyA6IDAsCiAgICAgICAgZmlyc3RSb3dTY3JlZW46IDAsCiAgICAgICAgbGFzdFJvdyA6IDAsCiAgICAgICAgbGluZUhlaWdodCA6IDEsCiAgICAgICAgY2hhcmFjdGVyV2lkdGggOiAxLAogICAgICAgIG1pbkhlaWdodCA6IDEsCiAgICAgICAgbWF4SGVpZ2h0IDogMSwKICAgICAgICBvZmZzZXQgOiAwLAogICAgICAgIGhlaWdodCA6IDEKICAgIH07CgogICAgdGhpcy4kbG9vcCA9IG5ldyBSZW5kZXJMb29wKAogICAgICAgIHRoaXMuJHJlbmRlckNoYW5nZXMuYmluZCh0aGlzKSwKICAgICAgICB0aGlzLmNvbnRhaW5lci5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3CiAgICApOwogICAgdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9GVUxMKTsKCiAgICB0aGlzLnNldFBhZGRpbmcoNCk7CiAgICB0aGlzLiR1cGRhdGVQcmludE1hcmdpbigpOwp9OwoKKGZ1bmN0aW9uKCkgewogICAgdGhpcy5zaG93R3V0dGVyID0gdHJ1ZTsKCiAgICB0aGlzLkNIQU5HRV9DVVJTT1IgPSAxOwogICAgdGhpcy5DSEFOR0VfTUFSS0VSID0gMjsKICAgIHRoaXMuQ0hBTkdFX0dVVFRFUiA9IDQ7CiAgICB0aGlzLkNIQU5HRV9TQ1JPTEwgPSA4OwogICAgdGhpcy5DSEFOR0VfTElORVMgPSAxNjsKICAgIHRoaXMuQ0hBTkdFX1RFWFQgPSAzMjsKICAgIHRoaXMuQ0hBTkdFX1NJWkUgPSA2NDsKICAgIHRoaXMuQ0hBTkdFX01BUktFUl9CQUNLID0gMTI4OwogICAgdGhpcy5DSEFOR0VfTUFSS0VSX0ZST05UID0gMjU2OwogICAgdGhpcy5DSEFOR0VfRlVMTCA9IDUxMjsKICAgIHRoaXMuQ0hBTkdFX0hfU0NST0xMID0gMTAyNDsKCiAgICBvb3AuaW1wbGVtZW50KHRoaXMsIEV2ZW50RW1pdHRlcik7CgogICAgdGhpcy5zZXRTZXNzaW9uID0gZnVuY3Rpb24oc2Vzc2lvbikgewogICAgICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247CiAgICAgICAgdGhpcy4kY3Vyc29yTGF5ZXIuc2V0U2Vzc2lvbihzZXNzaW9uKTsKICAgICAgICB0aGlzLiRtYXJrZXJCYWNrLnNldFNlc3Npb24oc2Vzc2lvbik7CiAgICAgICAgdGhpcy4kbWFya2VyRnJvbnQuc2V0U2Vzc2lvbihzZXNzaW9uKTsKICAgICAgICB0aGlzLiRndXR0ZXJMYXllci5zZXRTZXNzaW9uKHNlc3Npb24pOwogICAgICAgIHRoaXMuJHRleHRMYXllci5zZXRTZXNzaW9uKHNlc3Npb24pOwogICAgICAgIHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfRlVMTCk7CiAgICB9OwoKICAgIC8qKgogICAgICogVHJpZ2dlcnMgcGFydGlhbCB1cGRhdGUgb2YgdGhlIHRleHQgbGF5ZXIKICAgICAqLwogICAgdGhpcy51cGRhdGVMaW5lcyA9IGZ1bmN0aW9uKGZpcnN0Um93LCBsYXN0Um93KSB7CiAgICAgICAgaWYgKGxhc3RSb3cgPT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgbGFzdFJvdyA9IEluZmluaXR5OwoKICAgICAgICBpZiAoIXRoaXMuJGNoYW5nZWRMaW5lcykgewogICAgICAgICAgICB0aGlzLiRjaGFuZ2VkTGluZXMgPSB7CiAgICAgICAgICAgICAgICBmaXJzdFJvdzogZmlyc3RSb3csCiAgICAgICAgICAgICAgICBsYXN0Um93OiBsYXN0Um93CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAodGhpcy4kY2hhbmdlZExpbmVzLmZpcnN0Um93ID4gZmlyc3RSb3cpCiAgICAgICAgICAgICAgICB0aGlzLiRjaGFuZ2VkTGluZXMuZmlyc3RSb3cgPSBmaXJzdFJvdzsKCiAgICAgICAgICAgIGlmICh0aGlzLiRjaGFuZ2VkTGluZXMubGFzdFJvdyA8IGxhc3RSb3cpCiAgICAgICAgICAgICAgICB0aGlzLiRjaGFuZ2VkTGluZXMubGFzdFJvdyA9IGxhc3RSb3c7CiAgICAgICAgfQoKICAgICAgICB0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0xJTkVTKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBUcmlnZ2VycyBmdWxsIHVwZGF0ZSBvZiB0aGUgdGV4dCBsYXllcgogICAgICovCiAgICB0aGlzLnVwZGF0ZVRleHQgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX1RFWFQpOwogICAgfTsKCiAgICAvKioKICAgICAqIFRyaWdnZXJzIGEgZnVsbCB1cGRhdGUgb2YgYWxsIGxheWVycwogICAgICovCiAgICB0aGlzLnVwZGF0ZUZ1bGwgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0ZVTEwpOwogICAgfTsKCiAgICB0aGlzLnVwZGF0ZUZvbnRTaXplID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy4kdGV4dExheWVyLmNoZWNrRm9yU2l6ZUNoYW5nZXMoKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBUcmlnZ2VycyByZXNpemUgb2YgdGhlIGVkaXRvcgogICAgICovCiAgICB0aGlzLm9uUmVzaXplID0gZnVuY3Rpb24oZm9yY2UpIHsKICAgICAgICB2YXIgY2hhbmdlcyA9IHRoaXMuQ0hBTkdFX1NJWkU7CiAgICAgICAgdmFyIHNpemUgPSB0aGlzLiRzaXplOwoKICAgICAgICB2YXIgaGVpZ2h0ID0gZG9tLmdldElubmVySGVpZ2h0KHRoaXMuY29udGFpbmVyKTsKICAgICAgICBpZiAoZm9yY2UgfHwgc2l6ZS5oZWlnaHQgIT0gaGVpZ2h0KSB7CiAgICAgICAgICAgIHNpemUuaGVpZ2h0ID0gaGVpZ2h0OwoKICAgICAgICAgICAgdGhpcy5zY3JvbGxlci5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAicHgiOwogICAgICAgICAgICBzaXplLnNjcm9sbGVySGVpZ2h0ID0gdGhpcy5zY3JvbGxlci5jbGllbnRIZWlnaHQ7CiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQmFyLnNldEhlaWdodChzaXplLnNjcm9sbGVySGVpZ2h0KTsKCiAgICAgICAgICAgIGlmICh0aGlzLnNlc3Npb24pIHsKICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3AodGhpcy5nZXRTY3JvbGxUb3AoKSk7CiAgICAgICAgICAgICAgICBjaGFuZ2VzID0gY2hhbmdlcyB8IHRoaXMuQ0hBTkdFX0ZVTEw7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHZhciB3aWR0aCA9IGRvbS5nZXRJbm5lcldpZHRoKHRoaXMuY29udGFpbmVyKTsKICAgICAgICBpZiAoZm9yY2UgfHwgc2l6ZS53aWR0aCAhPSB3aWR0aCkgewogICAgICAgICAgICBzaXplLndpZHRoID0gd2lkdGg7CgogICAgICAgICAgICB2YXIgZ3V0dGVyV2lkdGggPSB0aGlzLnNob3dHdXR0ZXIgPyB0aGlzLiRndXR0ZXIub2Zmc2V0V2lkdGggOiAwOwogICAgICAgICAgICB0aGlzLnNjcm9sbGVyLnN0eWxlLmxlZnQgPSBndXR0ZXJXaWR0aCArICJweCI7CiAgICAgICAgICAgIHNpemUuc2Nyb2xsZXJXaWR0aCA9IE1hdGgubWF4KDAsIHdpZHRoIC0gZ3V0dGVyV2lkdGggLSB0aGlzLnNjcm9sbEJhci5nZXRXaWR0aCgpKTsKICAgICAgICAgICAgdGhpcy5zY3JvbGxlci5zdHlsZS53aWR0aCA9IHNpemUuc2Nyb2xsZXJXaWR0aCArICJweCI7CgogICAgICAgICAgICBpZiAodGhpcy5zZXNzaW9uLmdldFVzZVdyYXBNb2RlKCkgJiYgdGhpcy5hZGp1c3RXcmFwTGltaXQoKSB8fCBmb3JjZSkKICAgICAgICAgICAgICAgIGNoYW5nZXMgPSBjaGFuZ2VzIHwgdGhpcy5DSEFOR0VfRlVMTDsKICAgICAgICB9CgogICAgICAgIHRoaXMuJGxvb3Auc2NoZWR1bGUoY2hhbmdlcyk7CiAgICB9OwoKICAgIHRoaXMuYWRqdXN0V3JhcExpbWl0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGF2YWlsYWJsZVdpZHRoID0gdGhpcy4kc2l6ZS5zY3JvbGxlcldpZHRoIC0gdGhpcy4kcGFkZGluZyAqIDI7CiAgICAgICAgdmFyIGxpbWl0ID0gTWF0aC5mbG9vcihhdmFpbGFibGVXaWR0aCAvIHRoaXMuY2hhcmFjdGVyV2lkdGgpOwogICAgICAgIHJldHVybiB0aGlzLnNlc3Npb24uYWRqdXN0V3JhcExpbWl0KGxpbWl0KTsKICAgIH07CgogICAgdGhpcy5zZXRTaG93SW52aXNpYmxlcyA9IGZ1bmN0aW9uKHNob3dJbnZpc2libGVzKSB7CiAgICAgICAgaWYgKHRoaXMuJHRleHRMYXllci5zZXRTaG93SW52aXNpYmxlcyhzaG93SW52aXNpYmxlcykpCiAgICAgICAgICAgIHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfVEVYVCk7CiAgICB9OwoKICAgIHRoaXMuZ2V0U2hvd0ludmlzaWJsZXMgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy4kdGV4dExheWVyLnNob3dJbnZpc2libGVzOwogICAgfTsKCiAgICB0aGlzLiRzaG93UHJpbnRNYXJnaW4gPSB0cnVlOwogICAgdGhpcy5zZXRTaG93UHJpbnRNYXJnaW4gPSBmdW5jdGlvbihzaG93UHJpbnRNYXJnaW4pIHsKICAgICAgICB0aGlzLiRzaG93UHJpbnRNYXJnaW4gPSBzaG93UHJpbnRNYXJnaW47CiAgICAgICAgdGhpcy4kdXBkYXRlUHJpbnRNYXJnaW4oKTsKICAgIH07CgogICAgdGhpcy5nZXRTaG93UHJpbnRNYXJnaW4gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy4kc2hvd1ByaW50TWFyZ2luOwogICAgfTsKCiAgICB0aGlzLiRwcmludE1hcmdpbkNvbHVtbiA9IDgwOwogICAgdGhpcy5zZXRQcmludE1hcmdpbkNvbHVtbiA9IGZ1bmN0aW9uKHNob3dQcmludE1hcmdpbikgewogICAgICAgIHRoaXMuJHByaW50TWFyZ2luQ29sdW1uID0gc2hvd1ByaW50TWFyZ2luOwogICAgICAgIHRoaXMuJHVwZGF0ZVByaW50TWFyZ2luKCk7CiAgICB9OwoKICAgIHRoaXMuZ2V0UHJpbnRNYXJnaW5Db2x1bW4gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy4kcHJpbnRNYXJnaW5Db2x1bW47CiAgICB9OwoKICAgIHRoaXMuZ2V0U2hvd0d1dHRlciA9IGZ1bmN0aW9uKCl7CiAgICAgICAgcmV0dXJuIHRoaXMuc2hvd0d1dHRlcjsKICAgIH07CgogICAgdGhpcy5zZXRTaG93R3V0dGVyID0gZnVuY3Rpb24oc2hvdyl7CiAgICAgICAgaWYodGhpcy5zaG93R3V0dGVyID09PSBzaG93KQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdGhpcy4kZ3V0dGVyLnN0eWxlLmRpc3BsYXkgPSBzaG93ID8gImJsb2NrIiA6ICJub25lIjsKICAgICAgICB0aGlzLnNob3dHdXR0ZXIgPSBzaG93OwogICAgICAgIHRoaXMub25SZXNpemUodHJ1ZSk7CiAgICB9OwoKICAgIHRoaXMuJHVwZGF0ZVByaW50TWFyZ2luID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGNvbnRhaW5lckVsOwoKICAgICAgICBpZiAoIXRoaXMuJHNob3dQcmludE1hcmdpbiAmJiAhdGhpcy4kcHJpbnRNYXJnaW5FbCkKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICBpZiAoIXRoaXMuJHByaW50TWFyZ2luRWwpIHsKICAgICAgICAgICAgY29udGFpbmVyRWwgPSBkb20uY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgICAgIGNvbnRhaW5lckVsLmNsYXNzTmFtZSA9ICJhY2VfcHJpbnRfbWFyZ2luX2xheWVyIjsKICAgICAgICAgICAgdGhpcy4kcHJpbnRNYXJnaW5FbCA9IGRvbS5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICAgICAgdGhpcy4kcHJpbnRNYXJnaW5FbC5jbGFzc05hbWUgPSAiYWNlX3ByaW50X21hcmdpbiI7CiAgICAgICAgICAgIGNvbnRhaW5lckVsLmFwcGVuZENoaWxkKHRoaXMuJHByaW50TWFyZ2luRWwpOwogICAgICAgICAgICB0aGlzLmNvbnRlbnQuaW5zZXJ0QmVmb3JlKGNvbnRhaW5lckVsLCB0aGlzLiR0ZXh0TGF5ZXIuZWxlbWVudCk7CiAgICAgICAgfQoKICAgICAgICB2YXIgc3R5bGUgPSB0aGlzLiRwcmludE1hcmdpbkVsLnN0eWxlOwogICAgICAgIHN0eWxlLmxlZnQgPSAoKHRoaXMuY2hhcmFjdGVyV2lkdGggKiB0aGlzLiRwcmludE1hcmdpbkNvbHVtbikgKyB0aGlzLiRwYWRkaW5nKSArICJweCI7CiAgICAgICAgc3R5bGUudmlzaWJpbGl0eSA9IHRoaXMuJHNob3dQcmludE1hcmdpbiA/ICJ2aXNpYmxlIiA6ICJoaWRkZW4iOwogICAgfTsKCiAgICB0aGlzLmdldENvbnRhaW5lckVsZW1lbnQgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CiAgICB9OwoKICAgIHRoaXMuZ2V0TW91c2VFdmVudFRhcmdldCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQ7CiAgICB9OwoKICAgIHRoaXMuZ2V0VGV4dEFyZWFDb250YWluZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CiAgICB9OwoKICAgIHRoaXMubW92ZVRleHRBcmVhVG9DdXJzb3IgPSBmdW5jdGlvbih0ZXh0YXJlYSkgewogICAgICAgIC8vIGluIElFIHRoZSBuYXRpdmUgY3Vyc29yIGFsd2F5cyBzaGluZXMgdGhyb3VnaAogICAgICAgIC8vIHRoaXMgcGVyc2lzdHMgaW4gSUU5CiAgICAgICAgaWYgKHVzZXJhZ2VudC5pc0lFKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgCiAgICAgICAgaWYgKHRoaXMubGF5ZXJDb25maWcubGFzdFJvdyA9PT0gMCkKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICB2YXIgcG9zID0gdGhpcy4kY3Vyc29yTGF5ZXIuZ2V0UGl4ZWxQb3NpdGlvbigpOwogICAgICAgIGlmICghcG9zKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIHZhciBib3VuZHMgPSB0aGlzLmNvbnRlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMubGF5ZXJDb25maWcub2Zmc2V0OwoKICAgICAgICB0ZXh0YXJlYS5zdHlsZS5sZWZ0ID0gKGJvdW5kcy5sZWZ0ICsgcG9zLmxlZnQpICsgInB4IjsKICAgICAgICB0ZXh0YXJlYS5zdHlsZS50b3AgPSAoYm91bmRzLnRvcCArIHBvcy50b3AgLSB0aGlzLnNjcm9sbFRvcCArIG9mZnNldCkgKyAicHgiOwogICAgfTsKCiAgICB0aGlzLmdldEZpcnN0VmlzaWJsZVJvdyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmxheWVyQ29uZmlnLmZpcnN0Um93OwogICAgfTsKCiAgICB0aGlzLmdldEZpcnN0RnVsbHlWaXNpYmxlUm93ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubGF5ZXJDb25maWcuZmlyc3RSb3cgKyAodGhpcy5sYXllckNvbmZpZy5vZmZzZXQgPT09IDAgPyAwIDogMSk7CiAgICB9OwoKICAgIHRoaXMuZ2V0TGFzdEZ1bGx5VmlzaWJsZVJvdyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBmbGludCA9IE1hdGguZmxvb3IoKHRoaXMubGF5ZXJDb25maWcuaGVpZ2h0ICsgdGhpcy5sYXllckNvbmZpZy5vZmZzZXQpIC8gdGhpcy5sYXllckNvbmZpZy5saW5lSGVpZ2h0KTsKICAgICAgICByZXR1cm4gdGhpcy5sYXllckNvbmZpZy5maXJzdFJvdyAtIDEgKyBmbGludDsKICAgIH07CgogICAgdGhpcy5nZXRMYXN0VmlzaWJsZVJvdyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmxheWVyQ29uZmlnLmxhc3RSb3c7CiAgICB9OwoKICAgIHRoaXMuJHBhZGRpbmcgPSBudWxsOwogICAgdGhpcy5zZXRQYWRkaW5nID0gZnVuY3Rpb24ocGFkZGluZykgewogICAgICAgIHRoaXMuJHBhZGRpbmcgPSBwYWRkaW5nOwogICAgICAgIHRoaXMuJHRleHRMYXllci5zZXRQYWRkaW5nKHBhZGRpbmcpOwogICAgICAgIHRoaXMuJGN1cnNvckxheWVyLnNldFBhZGRpbmcocGFkZGluZyk7CiAgICAgICAgdGhpcy4kbWFya2VyRnJvbnQuc2V0UGFkZGluZyhwYWRkaW5nKTsKICAgICAgICB0aGlzLiRtYXJrZXJCYWNrLnNldFBhZGRpbmcocGFkZGluZyk7CiAgICAgICAgdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9GVUxMKTsKICAgICAgICB0aGlzLiR1cGRhdGVQcmludE1hcmdpbigpOwogICAgfTsKCiAgICB0aGlzLmdldEhTY3JvbGxCYXJBbHdheXNWaXNpYmxlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJGhvcml6U2Nyb2xsQWx3YXlzVmlzaWJsZTsKICAgIH07CgogICAgdGhpcy5zZXRIU2Nyb2xsQmFyQWx3YXlzVmlzaWJsZSA9IGZ1bmN0aW9uKGFsd2F5c1Zpc2libGUpIHsKICAgICAgICBpZiAodGhpcy4kaG9yaXpTY3JvbGxBbHdheXNWaXNpYmxlICE9IGFsd2F5c1Zpc2libGUpIHsKICAgICAgICAgICAgdGhpcy4kaG9yaXpTY3JvbGxBbHdheXNWaXNpYmxlID0gYWx3YXlzVmlzaWJsZTsKICAgICAgICAgICAgaWYgKCF0aGlzLiRob3JpelNjcm9sbEFsd2F5c1Zpc2libGUgfHwgIXRoaXMuJGhvcml6U2Nyb2xsKQogICAgICAgICAgICAgICAgdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9TQ1JPTEwpOwogICAgICAgIH0KICAgIH07CgogICAgdGhpcy4kdXBkYXRlU2Nyb2xsQmFyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zY3JvbGxCYXIuc2V0SW5uZXJIZWlnaHQodGhpcy5sYXllckNvbmZpZy5tYXhIZWlnaHQpOwogICAgICAgIHRoaXMuc2Nyb2xsQmFyLnNldFNjcm9sbFRvcCh0aGlzLnNjcm9sbFRvcCk7CiAgICB9OwoKICAgIHRoaXMuJHJlbmRlckNoYW5nZXMgPSBmdW5jdGlvbihjaGFuZ2VzKSB7CiAgICAgICAgaWYgKCFjaGFuZ2VzIHx8ICF0aGlzLnNlc3Npb24pCiAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgLy8gdGV4dCwgc2Nyb2xsaW5nIGFuZCByZXNpemUgY2hhbmdlcyBjYW4gY2F1c2UgdGhlIHZpZXcgcG9ydCBzaXplIHRvIGNoYW5nZQogICAgICAgIGlmIChjaGFuZ2VzICYgdGhpcy5DSEFOR0VfRlVMTCB8fAogICAgICAgICAgICBjaGFuZ2VzICYgdGhpcy5DSEFOR0VfU0laRSB8fAogICAgICAgICAgICBjaGFuZ2VzICYgdGhpcy5DSEFOR0VfVEVYVCB8fAogICAgICAgICAgICBjaGFuZ2VzICYgdGhpcy5DSEFOR0VfTElORVMgfHwKICAgICAgICAgICAgY2hhbmdlcyAmIHRoaXMuQ0hBTkdFX1NDUk9MTAogICAgICAgICkKICAgICAgICAgICAgdGhpcy4kY29tcHV0ZUxheWVyQ29uZmlnKCk7CgogICAgICAgIC8vIGZ1bGwKICAgICAgICBpZiAoY2hhbmdlcyAmIHRoaXMuQ0hBTkdFX0ZVTEwpIHsKICAgICAgICAgICAgdGhpcy4kdGV4dExheWVyLnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKTsKICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0d1dHRlcikKICAgICAgICAgICAgICAgIHRoaXMuJGd1dHRlckxheWVyLnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKTsKICAgICAgICAgICAgdGhpcy4kbWFya2VyQmFjay51cGRhdGUodGhpcy5sYXllckNvbmZpZyk7CiAgICAgICAgICAgIHRoaXMuJG1hcmtlckZyb250LnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKTsKICAgICAgICAgICAgdGhpcy4kY3Vyc29yTGF5ZXIudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpOwogICAgICAgICAgICB0aGlzLiR1cGRhdGVTY3JvbGxCYXIoKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gc2Nyb2xsaW5nCiAgICAgICAgaWYgKGNoYW5nZXMgJiB0aGlzLkNIQU5HRV9TQ1JPTEwpIHsKICAgICAgICAgICAgaWYgKGNoYW5nZXMgJiB0aGlzLkNIQU5HRV9URVhUIHx8IGNoYW5nZXMgJiB0aGlzLkNIQU5HRV9MSU5FUykKICAgICAgICAgICAgICAgIHRoaXMuJHRleHRMYXllci51cGRhdGUodGhpcy5sYXllckNvbmZpZyk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHRoaXMuJHRleHRMYXllci5zY3JvbGxMaW5lcyh0aGlzLmxheWVyQ29uZmlnKTsKCiAgICAgICAgICAgIGlmICh0aGlzLnNob3dHdXR0ZXIpCiAgICAgICAgICAgICAgICB0aGlzLiRndXR0ZXJMYXllci51cGRhdGUodGhpcy5sYXllckNvbmZpZyk7CiAgICAgICAgICAgIHRoaXMuJG1hcmtlckJhY2sudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpOwogICAgICAgICAgICB0aGlzLiRtYXJrZXJGcm9udC51cGRhdGUodGhpcy5sYXllckNvbmZpZyk7CiAgICAgICAgICAgIHRoaXMuJGN1cnNvckxheWVyLnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKTsKICAgICAgICAgICAgdGhpcy4kdXBkYXRlU2Nyb2xsQmFyKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmIChjaGFuZ2VzICYgdGhpcy5DSEFOR0VfVEVYVCkgewogICAgICAgICAgICB0aGlzLiR0ZXh0TGF5ZXIudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpOwogICAgICAgICAgICBpZiAodGhpcy5zaG93R3V0dGVyKQogICAgICAgICAgICAgICAgdGhpcy4kZ3V0dGVyTGF5ZXIudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjaGFuZ2VzICYgdGhpcy5DSEFOR0VfTElORVMpIHsKICAgICAgICAgICAgdGhpcy4kdXBkYXRlTGluZXMoKTsKICAgICAgICAgICAgdGhpcy4kdXBkYXRlU2Nyb2xsQmFyKCk7CiAgICAgICAgICAgIGlmICh0aGlzLnNob3dHdXR0ZXIpCiAgICAgICAgICAgICAgICB0aGlzLiRndXR0ZXJMYXllci51cGRhdGUodGhpcy5sYXllckNvbmZpZyk7CiAgICAgICAgfSBlbHNlIGlmIChjaGFuZ2VzICYgdGhpcy5DSEFOR0VfR1VUVEVSKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnNob3dHdXR0ZXIpCiAgICAgICAgICAgICAgICB0aGlzLiRndXR0ZXJMYXllci51cGRhdGUodGhpcy5sYXllckNvbmZpZyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoY2hhbmdlcyAmIHRoaXMuQ0hBTkdFX0NVUlNPUikKICAgICAgICAgICAgdGhpcy4kY3Vyc29yTGF5ZXIudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpOwoKICAgICAgICBpZiAoY2hhbmdlcyAmICh0aGlzLkNIQU5HRV9NQVJLRVIgfCB0aGlzLkNIQU5HRV9NQVJLRVJfRlJPTlQpKSB7CiAgICAgICAgICAgIHRoaXMuJG1hcmtlckZyb250LnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKTsKICAgICAgICB9CgogICAgICAgIGlmIChjaGFuZ2VzICYgKHRoaXMuQ0hBTkdFX01BUktFUiB8IHRoaXMuQ0hBTkdFX01BUktFUl9CQUNLKSkgewogICAgICAgICAgICB0aGlzLiRtYXJrZXJCYWNrLnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKTsKICAgICAgICB9CgogICAgICAgIGlmIChjaGFuZ2VzICYgdGhpcy5DSEFOR0VfU0laRSkKICAgICAgICAgICAgdGhpcy4kdXBkYXRlU2Nyb2xsQmFyKCk7CgogICAgICAgIGlmIChjaGFuZ2VzICYgdGhpcy5DSEFOR0VfSF9TQ1JPTEwpIHsKICAgICAgICAgICAgLy90aGlzLmNvbnRlbnQuc3R5bGUubGVmdCA9IC10aGlzLnNjcm9sbExlZnQgKyAicHgiOwogICAgICAgICAgICB0aGlzLnNjcm9sbGVyLnNjcm9sbExlZnQgPSB0aGlzLnNjcm9sbExlZnQKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMuJGNvbXB1dGVMYXllckNvbmZpZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzZXNzaW9uID0gdGhpcy5zZXNzaW9uOwoKICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5zY3JvbGxUb3AgJSB0aGlzLmxpbmVIZWlnaHQ7CiAgICAgICAgdmFyIG1pbkhlaWdodCA9IHRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQgKyB0aGlzLmxpbmVIZWlnaHQ7CgogICAgICAgIHZhciBsb25nZXN0TGluZSA9IHRoaXMuJGdldExvbmdlc3RMaW5lKCk7CgogICAgICAgIHZhciBob3JpelNjcm9sbCA9IHRoaXMuJGhvcml6U2Nyb2xsQWx3YXlzVmlzaWJsZSB8fCB0aGlzLiRzaXplLnNjcm9sbGVyV2lkdGggLSBsb25nZXN0TGluZSA8IDA7CiAgICAgICAgdmFyIGhvcml6U2Nyb2xsQ2hhbmdlZCA9IHRoaXMuJGhvcml6U2Nyb2xsICE9PSBob3JpelNjcm9sbDsKICAgICAgICB0aGlzLiRob3JpelNjcm9sbCA9IGhvcml6U2Nyb2xsOwogICAgICAgIGlmIChob3JpelNjcm9sbENoYW5nZWQpCiAgICAgICAgICAgIHRoaXMuc2Nyb2xsZXIuc3R5bGUub3ZlcmZsb3dYID0gaG9yaXpTY3JvbGwgPyAic2Nyb2xsIiA6ICJoaWRkZW4iOwoKICAgICAgICB2YXIgbWF4SGVpZ2h0ID0gdGhpcy5zZXNzaW9uLmdldFNjcmVlbkxlbmd0aCgpICogdGhpcy5saW5lSGVpZ2h0OwogICAgICAgIHRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3AoTWF0aC5tYXgoMCwgTWF0aC5taW4odGhpcy5zY3JvbGxUb3AsIG1heEhlaWdodCAtIHRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQpKSk7CgogICAgICAgIHZhciBsaW5lQ291bnQgPSBNYXRoLmNlaWwobWluSGVpZ2h0IC8gdGhpcy5saW5lSGVpZ2h0KSAtIDE7CiAgICAgICAgdmFyIGZpcnN0Um93ID0gTWF0aC5tYXgoMCwgTWF0aC5yb3VuZCgodGhpcy5zY3JvbGxUb3AgLSBvZmZzZXQpIC8gdGhpcy5saW5lSGVpZ2h0KSk7CiAgICAgICAgdmFyIGxhc3RSb3cgPSBmaXJzdFJvdyArIGxpbmVDb3VudDsKCiAgICAgICAgLy8gTWFwIGxpbmVzIG9uIHRoZSBzY3JlZW4gdG8gbGluZXMgaW4gdGhlIGRvY3VtZW50LgogICAgICAgIHZhciBmaXJzdFJvd1NjcmVlbiwgZmlyc3RSb3dIZWlnaHQ7CiAgICAgICAgdmFyIGxpbmVIZWlnaHQgPSB7IGxpbmVIZWlnaHQ6IHRoaXMubGluZUhlaWdodCB9OwogICAgICAgIGZpcnN0Um93ID0gc2Vzc2lvbi5zY3JlZW5Ub0RvY3VtZW50Um93KGZpcnN0Um93LCAwKTsKCiAgICAgICAgLy8gQ2hlY2sgaWYgZmlyc3RSb3cgaXMgaW5zaWRlIG9mIGEgZm9sZExpbmUuIElmIHRydWUsIHRoZW4gdXNlIHRoZSBmaXJzdAogICAgICAgIC8vIHJvdyBvZiB0aGUgZm9sZExpbmUuCiAgICAgICAgdmFyIGZvbGRMaW5lID0gc2Vzc2lvbi5nZXRGb2xkTGluZShmaXJzdFJvdyk7CiAgICAgICAgaWYgKGZvbGRMaW5lKSB7CiAgICAgICAgICAgIGZpcnN0Um93ID0gZm9sZExpbmUuc3RhcnQucm93OwogICAgICAgIH0KCiAgICAgICAgZmlyc3RSb3dTY3JlZW4gPSBzZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Sb3coZmlyc3RSb3csIDApOwogICAgICAgIGZpcnN0Um93SGVpZ2h0ID0gc2Vzc2lvbi5nZXRSb3dIZWlnaHQobGluZUhlaWdodCwgZmlyc3RSb3cpOwoKICAgICAgICBsYXN0Um93ID0gTWF0aC5taW4oc2Vzc2lvbi5zY3JlZW5Ub0RvY3VtZW50Um93KGxhc3RSb3csIDApLCBzZXNzaW9uLmdldExlbmd0aCgpIC0gMSk7CiAgICAgICAgbWluSGVpZ2h0ID0gdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodCArIHNlc3Npb24uZ2V0Um93SGVpZ2h0KGxpbmVIZWlnaHQsIGxhc3RSb3cpKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFJvd0hlaWdodDsKCiAgICAgICAgb2Zmc2V0ID0gdGhpcy5zY3JvbGxUb3AgLSBmaXJzdFJvd1NjcmVlbiAqIHRoaXMubGluZUhlaWdodDsKCiAgICAgICAgdGhpcy5sYXllckNvbmZpZyA9IHsKICAgICAgICAgICAgd2lkdGggOiBsb25nZXN0TGluZSwKICAgICAgICAgICAgcGFkZGluZyA6IHRoaXMuJHBhZGRpbmcsCiAgICAgICAgICAgIGZpcnN0Um93IDogZmlyc3RSb3csCiAgICAgICAgICAgIGZpcnN0Um93U2NyZWVuOiBmaXJzdFJvd1NjcmVlbiwKICAgICAgICAgICAgbGFzdFJvdyA6IGxhc3RSb3csCiAgICAgICAgICAgIGxpbmVIZWlnaHQgOiB0aGlzLmxpbmVIZWlnaHQsCiAgICAgICAgICAgIGNoYXJhY3RlcldpZHRoIDogdGhpcy5jaGFyYWN0ZXJXaWR0aCwKICAgICAgICAgICAgbWluSGVpZ2h0IDogbWluSGVpZ2h0LAogICAgICAgICAgICBtYXhIZWlnaHQgOiBtYXhIZWlnaHQsCiAgICAgICAgICAgIG9mZnNldCA6IG9mZnNldCwKICAgICAgICAgICAgaGVpZ2h0IDogdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodAogICAgICAgIH07CgogICAgICAgIC8vIEZvciBkZWJ1Z2dpbmcuCiAgICAgICAgLy8gY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkodGhpcy5sYXllckNvbmZpZykpOwoKICAgICAgICB0aGlzLiRndXR0ZXJMYXllci5lbGVtZW50LnN0eWxlLm1hcmdpblRvcCA9ICgtb2Zmc2V0KSArICJweCI7CiAgICAgICAgdGhpcy5jb250ZW50LnN0eWxlLm1hcmdpblRvcCA9ICgtb2Zmc2V0KSArICJweCI7CiAgICAgICAgdGhpcy5jb250ZW50LnN0eWxlLndpZHRoID0gbG9uZ2VzdExpbmUgKyAyICogdGhpcy4kcGFkZGluZyArICJweCI7CiAgICAgICAgdGhpcy5jb250ZW50LnN0eWxlLmhlaWdodCA9IG1pbkhlaWdodCArICJweCI7CgogICAgICAgIC8vIEhvcml6b250YWwgc2Nyb2xsYmFyIHZpc2liaWxpdHkgbWF5IGhhdmUgY2hhbmdlZCwgd2hpY2ggY2hhbmdlcwogICAgICAgIC8vIHRoZSBjbGllbnQgaGVpZ2h0IG9mIHRoZSBzY3JvbGxlcgogICAgICAgIGlmIChob3JpelNjcm9sbENoYW5nZWQpCiAgICAgICAgICAgIHRoaXMub25SZXNpemUodHJ1ZSk7CiAgICB9OwoKICAgIHRoaXMuJHVwZGF0ZUxpbmVzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGZpcnN0Um93ID0gdGhpcy4kY2hhbmdlZExpbmVzLmZpcnN0Um93OwogICAgICAgIHZhciBsYXN0Um93ID0gdGhpcy4kY2hhbmdlZExpbmVzLmxhc3RSb3c7CiAgICAgICAgdGhpcy4kY2hhbmdlZExpbmVzID0gbnVsbDsKCiAgICAgICAgdmFyIGxheWVyQ29uZmlnID0gdGhpcy5sYXllckNvbmZpZzsKCiAgICAgICAgLy8gaWYgdGhlIHVwZGF0ZSBjaGFuZ2VzIHRoZSB3aWR0aCBvZiB0aGUgZG9jdW1lbnQgZG8gYSBmdWxsIHJlZHJhdwogICAgICAgIGlmIChsYXllckNvbmZpZy53aWR0aCAhPSB0aGlzLiRnZXRMb25nZXN0TGluZSgpKQogICAgICAgICAgICByZXR1cm4gdGhpcy4kdGV4dExheWVyLnVwZGF0ZShsYXllckNvbmZpZyk7CgogICAgICAgIGlmIChmaXJzdFJvdyA+IGxheWVyQ29uZmlnLmxhc3RSb3cgKyAxKSB7IHJldHVybjsgfQogICAgICAgIGlmIChsYXN0Um93IDwgbGF5ZXJDb25maWcuZmlyc3RSb3cpIHsgcmV0dXJuOyB9CgogICAgICAgIC8vIGlmIHRoZSBsYXN0IHJvdyBpcyB1bmtub3duIC0+IHJlZHJhdyBldmVyeXRoaW5nCiAgICAgICAgaWYgKGxhc3RSb3cgPT09IEluZmluaXR5KSB7CiAgICAgICAgICAgIGlmICh0aGlzLnNob3dHdXR0ZXIpCiAgICAgICAgICAgICAgICB0aGlzLiRndXR0ZXJMYXllci51cGRhdGUobGF5ZXJDb25maWcpOwogICAgICAgICAgICB0aGlzLiR0ZXh0TGF5ZXIudXBkYXRlKGxheWVyQ29uZmlnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gZWxzZSB1cGRhdGUgb25seSB0aGUgY2hhbmdlZCByb3dzCiAgICAgICAgdGhpcy4kdGV4dExheWVyLnVwZGF0ZUxpbmVzKGxheWVyQ29uZmlnLCBmaXJzdFJvdywgbGFzdFJvdyk7CiAgICB9OwoKICAgIHRoaXMuJGdldExvbmdlc3RMaW5lID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGNoYXJDb3VudCA9IHRoaXMuc2Vzc2lvbi5nZXRTY3JlZW5XaWR0aCgpOwogICAgICAgIGlmICh0aGlzLiR0ZXh0TGF5ZXIuc2hvd0ludmlzaWJsZXMpCiAgICAgICAgICAgIGNoYXJDb3VudCArPSAxOwoKICAgICAgICByZXR1cm4gTWF0aC5tYXgodGhpcy4kc2l6ZS5zY3JvbGxlcldpZHRoIC0gMiAqIHRoaXMuJHBhZGRpbmcsIE1hdGgucm91bmQoY2hhckNvdW50ICogdGhpcy5jaGFyYWN0ZXJXaWR0aCkpOwogICAgfTsKCiAgICB0aGlzLnVwZGF0ZUZyb250TWFya2VycyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuJG1hcmtlckZyb250LnNldE1hcmtlcnModGhpcy5zZXNzaW9uLmdldE1hcmtlcnModHJ1ZSkpOwogICAgICAgIHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfTUFSS0VSX0ZST05UKTsKICAgIH07CgogICAgdGhpcy51cGRhdGVCYWNrTWFya2VycyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuJG1hcmtlckJhY2suc2V0TWFya2Vycyh0aGlzLnNlc3Npb24uZ2V0TWFya2VycygpKTsKICAgICAgICB0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX01BUktFUl9CQUNLKTsKICAgIH07CgogICAgdGhpcy5hZGRHdXR0ZXJEZWNvcmF0aW9uID0gZnVuY3Rpb24ocm93LCBjbGFzc05hbWUpewogICAgICAgIHRoaXMuJGd1dHRlckxheWVyLmFkZEd1dHRlckRlY29yYXRpb24ocm93LCBjbGFzc05hbWUpOwogICAgICAgIHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfR1VUVEVSKTsKICAgIH07CgogICAgdGhpcy5yZW1vdmVHdXR0ZXJEZWNvcmF0aW9uID0gZnVuY3Rpb24ocm93LCBjbGFzc05hbWUpewogICAgICAgIHRoaXMuJGd1dHRlckxheWVyLnJlbW92ZUd1dHRlckRlY29yYXRpb24ocm93LCBjbGFzc05hbWUpOwogICAgICAgIHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfR1VUVEVSKTsKICAgIH07CgogICAgdGhpcy5zZXRCcmVha3BvaW50cyA9IGZ1bmN0aW9uKHJvd3MpIHsKICAgICAgICB0aGlzLiRndXR0ZXJMYXllci5zZXRCcmVha3BvaW50cyhyb3dzKTsKICAgICAgICB0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0dVVFRFUik7CiAgICB9OwoKICAgIHRoaXMuc2V0QW5ub3RhdGlvbnMgPSBmdW5jdGlvbihhbm5vdGF0aW9ucykgewogICAgICAgIHRoaXMuJGd1dHRlckxheWVyLnNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKICAgICAgICB0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0dVVFRFUik7CiAgICB9OwoKICAgIHRoaXMudXBkYXRlQ3Vyc29yID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9DVVJTT1IpOwogICAgfTsKCiAgICB0aGlzLmhpZGVDdXJzb3IgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLiRjdXJzb3JMYXllci5oaWRlQ3Vyc29yKCk7CiAgICB9OwoKICAgIHRoaXMuc2hvd0N1cnNvciA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuJGN1cnNvckxheWVyLnNob3dDdXJzb3IoKTsKICAgIH07CgogICAgdGhpcy5zY3JvbGxDdXJzb3JJbnRvVmlldyA9IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIHRoZSBlZGl0b3IgaXMgbm90IHZpc2libGUKICAgICAgICBpZiAodGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodCA9PT0gMCkKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICB2YXIgcG9zID0gdGhpcy4kY3Vyc29yTGF5ZXIuZ2V0UGl4ZWxQb3NpdGlvbigpOwoKICAgICAgICB2YXIgbGVmdCA9IHBvcy5sZWZ0OwogICAgICAgIHZhciB0b3AgPSBwb3MudG9wOwoKICAgICAgICBpZiAodGhpcy5zY3JvbGxUb3AgPiB0b3ApIHsKICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcCh0b3ApOwogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsVG9wICsgdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodCA8IHRvcCArIHRoaXMubGluZUhlaWdodCkgewogICAgICAgICAgICB0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKHRvcCArIHRoaXMubGluZUhlaWdodCAtIHRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQpOwogICAgICAgIH0KCiAgICAgICAgdmFyIHNjcm9sbExlZnQgPSB0aGlzLnNjcm9sbExlZnQ7CgogICAgICAgIGlmIChzY3JvbGxMZWZ0ID4gbGVmdCkgewogICAgICAgICAgICBpZiAobGVmdCA8IHRoaXMuJHBhZGRpbmcgKyAyICogdGhpcy5sYXllckNvbmZpZy5jaGFyYWN0ZXJXaWR0aCkKICAgICAgICAgICAgICAgIGxlZnQgPSAwOwogICAgICAgICAgICB0aGlzLnNlc3Npb24uc2V0U2Nyb2xsTGVmdChsZWZ0KTsKICAgICAgICB9CgogICAgICAgIGlmIChzY3JvbGxMZWZ0ICsgdGhpcy4kc2l6ZS5zY3JvbGxlcldpZHRoIDwgbGVmdCArIHRoaXMuY2hhcmFjdGVyV2lkdGgpIHsKICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnNldFNjcm9sbExlZnQoTWF0aC5yb3VuZChsZWZ0ICsgdGhpcy5jaGFyYWN0ZXJXaWR0aCAtIHRoaXMuJHNpemUuc2Nyb2xsZXJXaWR0aCkpOwogICAgICAgIH0KICAgIH07CgogICAgdGhpcy5nZXRTY3JvbGxUb3AgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLmdldFNjcm9sbFRvcCgpOwogICAgfTsKCiAgICB0aGlzLmdldFNjcm9sbExlZnQgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLmdldFNjcm9sbFRvcCgpOwogICAgfTsKCiAgICB0aGlzLmdldFNjcm9sbFRvcFJvdyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnNjcm9sbFRvcCAvIHRoaXMubGluZUhlaWdodDsKICAgIH07CgogICAgdGhpcy5nZXRTY3JvbGxCb3R0b21Sb3cgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcigodGhpcy5zY3JvbGxUb3AgKyB0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0KSAvIHRoaXMubGluZUhlaWdodCkgLSAxKTsKICAgIH07CgogICAgdGhpcy5zY3JvbGxUb1JvdyA9IGZ1bmN0aW9uKHJvdykgewogICAgICAgIHRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3Aocm93ICogdGhpcy5saW5lSGVpZ2h0KTsKICAgIH07CgogICAgdGhpcy5zY3JvbGxUb0xpbmUgPSBmdW5jdGlvbihsaW5lLCBjZW50ZXIpIHsKICAgICAgICB2YXIgcG9zID0gdGhpcy4kY3Vyc29yTGF5ZXIuZ2V0UGl4ZWxQb3NpdGlvbih7cm93OiBsaW5lLCBjb2x1bW46IDB9KTsKICAgICAgICB2YXIgb2Zmc2V0ID0gcG9zLnRvcDsKICAgICAgICBpZiAoY2VudGVyKQogICAgICAgICAgICBvZmZzZXQgLT0gdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodCAvIDI7CgogICAgICAgIHRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3Aob2Zmc2V0KTsKICAgIH07CgogICAgdGhpcy5zY3JvbGxUb1kgPSBmdW5jdGlvbihzY3JvbGxUb3ApIHsKICAgICAgICAvLyBhZnRlciBjYWxsaW5nIHNjcm9sbEJhci5zZXRTY3JvbGxUb3AKICAgICAgICAvLyBzY3JvbGxiYXIgc2VuZHMgdXMgZXZlbnQgd2l0aCBzYW1lIHNjcm9sbFRvcC4gaWdub3JlIGl0CiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsVG9wICE9PSBzY3JvbGxUb3ApIHsKICAgICAgICAgICAgdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9TQ1JPTEwpOwogICAgICAgICAgICB0aGlzLnNjcm9sbFRvcCA9IHNjcm9sbFRvcDsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMuc2Nyb2xsVG9YID0gZnVuY3Rpb24oc2Nyb2xsTGVmdCkgewogICAgICAgIGlmIChzY3JvbGxMZWZ0IDw9IHRoaXMuJHBhZGRpbmcpCiAgICAgICAgICAgIHNjcm9sbExlZnQgPSAwOwoKICAgICAgICBpZiAodGhpcy5zY3JvbGxMZWZ0ICE9PSBzY3JvbGxMZWZ0KSB7CiAgICAgICAgICAgIHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfSF9TQ1JPTEwpOwogICAgICAgICAgICB0aGlzLnNjcm9sbExlZnQgPSBzY3JvbGxMZWZ0OwogICAgICAgIH0KICAgIH07CgogICAgdGhpcy5zY3JvbGxCeSA9IGZ1bmN0aW9uKGRlbHRhWCwgZGVsdGFZKSB7CiAgICAgICAgZGVsdGFZICYmIHRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3AodGhpcy5zZXNzaW9uLmdldFNjcm9sbFRvcCgpICsgZGVsdGFZKTsKICAgICAgICBkZWx0YVggJiYgdGhpcy5zZXNzaW9uLnNldFNjcm9sbExlZnQodGhpcy5zZXNzaW9uLmdldFNjcm9sbExlZnQoKSArIGRlbHRhWCk7CiAgICB9OwoKICAgIHRoaXMuaXNTY3JvbGxhYmxlQnkgPSBmdW5jdGlvbihkZWx0YVgsIGRlbHRhWSkgewogICAgICAgIGlmIChkZWx0YVkgPCAwICYmIHRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxUb3AoKSA+IDApCiAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgaWYgKGRlbHRhWSA+IDAgJiYgdGhpcy5zZXNzaW9uLmdldFNjcm9sbFRvcCgpICsgdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodCA8IHRoaXMubGF5ZXJDb25maWcubWF4SGVpZ2h0KQogICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIC8vIHRvZG86IGhhbmRsZSBob3Jpem9udGFsIHNjcm9sbGluZwogICAgfTsKCiAgICB0aGlzLnNjcmVlblRvVGV4dENvb3JkaW5hdGVzID0gZnVuY3Rpb24ocGFnZVgsIHBhZ2VZKSB7CiAgICAgICAgdmFyIGNhbnZhc1BvcyA9IHRoaXMuc2Nyb2xsZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CgogICAgICAgIHZhciBjb2wgPSBNYXRoLnJvdW5kKAogICAgICAgICAgICAocGFnZVggKyB0aGlzLnNjcm9sbExlZnQgLSBjYW52YXNQb3MubGVmdCAtIHRoaXMuJHBhZGRpbmcgLSBkb20uZ2V0UGFnZVNjcm9sbExlZnQoKSkKICAgICAgICAgICAgLyB0aGlzLmNoYXJhY3RlcldpZHRoCiAgICAgICAgKTsKICAgICAgICB2YXIgcm93ID0gTWF0aC5mbG9vcigKICAgICAgICAgICAgKHBhZ2VZICsgdGhpcy5zY3JvbGxUb3AgLSBjYW52YXNQb3MudG9wIC0gZG9tLmdldFBhZ2VTY3JvbGxUb3AoKSkKICAgICAgICAgICAgLyB0aGlzLmxpbmVIZWlnaHQKICAgICAgICApOwoKICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihyb3csIE1hdGgubWF4KGNvbCwgMCkpOwogICAgfTsKCiAgICB0aGlzLnRleHRUb1NjcmVlbkNvb3JkaW5hdGVzID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsKICAgICAgICB2YXIgY2FudmFzUG9zID0gdGhpcy5zY3JvbGxlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICB2YXIgcG9zID0gdGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbihyb3csIGNvbHVtbik7CgogICAgICAgIHZhciB4ID0gdGhpcy4kcGFkZGluZyArIE1hdGgucm91bmQocG9zLmNvbHVtbiAqIHRoaXMuY2hhcmFjdGVyV2lkdGgpOwogICAgICAgIHZhciB5ID0gcG9zLnJvdyAqIHRoaXMubGluZUhlaWdodDsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcGFnZVg6IGNhbnZhc1Bvcy5sZWZ0ICsgeCAtIHRoaXMuc2Nyb2xsTGVmdCwKICAgICAgICAgICAgcGFnZVk6IGNhbnZhc1Bvcy50b3AgKyB5IC0gdGhpcy5zY3JvbGxUb3AKICAgICAgICB9OwogICAgfTsKCiAgICB0aGlzLnZpc3VhbGl6ZUZvY3VzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgZG9tLmFkZENzc0NsYXNzKHRoaXMuY29udGFpbmVyLCAiYWNlX2ZvY3VzIik7CiAgICB9OwoKICAgIHRoaXMudmlzdWFsaXplQmx1ciA9IGZ1bmN0aW9uKCkgewogICAgICAgIGRvbS5yZW1vdmVDc3NDbGFzcyh0aGlzLmNvbnRhaW5lciwgImFjZV9mb2N1cyIpOwogICAgfTsKCiAgICB0aGlzLnNob3dDb21wb3NpdGlvbiA9IGZ1bmN0aW9uKHBvc2l0aW9uKSB7CiAgICAgICAgaWYgKCF0aGlzLiRjb21wb3NpdGlvbikgewogICAgICAgICAgICB0aGlzLiRjb21wb3NpdGlvbiA9IGRvbS5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICAgICAgdGhpcy4kY29tcG9zaXRpb24uY2xhc3NOYW1lID0gImFjZV9jb21wb3NpdGlvbiI7CiAgICAgICAgICAgIHRoaXMuY29udGVudC5hcHBlbmRDaGlsZCh0aGlzLiRjb21wb3NpdGlvbik7CiAgICAgICAgfQoKICAgICAgICB0aGlzLiRjb21wb3NpdGlvbi5pbm5lckhUTUwgPSAiJiMxNjA7IjsKCiAgICAgICAgdmFyIHBvcyA9IHRoaXMuJGN1cnNvckxheWVyLmdldFBpeGVsUG9zaXRpb24oKTsKICAgICAgICB2YXIgc3R5bGUgPSB0aGlzLiRjb21wb3NpdGlvbi5zdHlsZTsKICAgICAgICBzdHlsZS50b3AgPSBwb3MudG9wICsgInB4IjsKICAgICAgICBzdHlsZS5sZWZ0ID0gKHBvcy5sZWZ0ICsgdGhpcy4kcGFkZGluZykgKyAicHgiOwogICAgICAgIHN0eWxlLmhlaWdodCA9IHRoaXMubGluZUhlaWdodCArICJweCI7CgogICAgICAgIHRoaXMuaGlkZUN1cnNvcigpOwogICAgfTsKCiAgICB0aGlzLnNldENvbXBvc2l0aW9uVGV4dCA9IGZ1bmN0aW9uKHRleHQpIHsKICAgICAgICBkb20uc2V0SW5uZXJUZXh0KHRoaXMuJGNvbXBvc2l0aW9uLCB0ZXh0KTsKICAgIH07CgogICAgdGhpcy5oaWRlQ29tcG9zaXRpb24gPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnNob3dDdXJzb3IoKTsKCiAgICAgICAgaWYgKCF0aGlzLiRjb21wb3NpdGlvbikKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICB2YXIgc3R5bGUgPSB0aGlzLiRjb21wb3NpdGlvbi5zdHlsZTsKICAgICAgICBzdHlsZS50b3AgPSAiLTEwMDAwcHgiOwogICAgICAgIHN0eWxlLmxlZnQgPSAiLTEwMDAwcHgiOwogICAgfTsKCiAgICB0aGlzLnNldFRoZW1lID0gZnVuY3Rpb24odGhlbWUpIHsKICAgICAgICB2YXIgX3NlbGYgPSB0aGlzOwoKICAgICAgICB0aGlzLiR0aGVtZVZhbHVlID0gdGhlbWU7CiAgICAgICAgaWYgKCF0aGVtZSB8fCB0eXBlb2YgdGhlbWUgPT0gInN0cmluZyIpIHsKICAgICAgICAgICAgdGhlbWUgPSB0aGVtZSB8fCAiYWNlL3RoZW1lL3RleHRtYXRlIjsKICAgICAgICAgICAgcmVxdWlyZShbdGhlbWVdLCBmdW5jdGlvbih0aGVtZSkgewogICAgICAgICAgICAgICAgYWZ0ZXJMb2FkKHRoZW1lKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYWZ0ZXJMb2FkKHRoZW1lKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGFmdGVyTG9hZCh0aGVtZSkgewogICAgICAgICAgICBkb20uaW1wb3J0Q3NzU3RyaW5nKAogICAgICAgICAgICAgICAgdGhlbWUuY3NzVGV4dCwKICAgICAgICAgICAgICAgIHRoZW1lLmNzc0NsYXNzLAogICAgICAgICAgICAgICAgX3NlbGYuY29udGFpbmVyLm93bmVyRG9jdW1lbnQKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmIChfc2VsZi4kdGhlbWUpCiAgICAgICAgICAgICAgICBkb20ucmVtb3ZlQ3NzQ2xhc3MoX3NlbGYuY29udGFpbmVyLCBfc2VsZi4kdGhlbWUpOwoKICAgICAgICAgICAgX3NlbGYuJHRoZW1lID0gdGhlbWUgPyB0aGVtZS5jc3NDbGFzcyA6IG51bGw7CgogICAgICAgICAgICBpZiAoX3NlbGYuJHRoZW1lKQogICAgICAgICAgICAgICAgZG9tLmFkZENzc0NsYXNzKF9zZWxmLmNvbnRhaW5lciwgX3NlbGYuJHRoZW1lKTsKCiAgICAgICAgICAgIGlmICh0aGVtZSAmJiB0aGVtZS5pc0RhcmspCiAgICAgICAgICAgICAgICBkb20uYWRkQ3NzQ2xhc3MoX3NlbGYuY29udGFpbmVyLCAiYWNlX2RhcmsiKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZG9tLnJlbW92ZUNzc0NsYXNzKF9zZWxmLmNvbnRhaW5lciwgImFjZV9kYXJrIik7CgogICAgICAgICAgICAvLyBmb3JjZSByZS1tZWFzdXJlIG9mIHRoZSBndXR0ZXIgd2lkdGgKICAgICAgICAgICAgaWYgKF9zZWxmLiRzaXplKSB7CiAgICAgICAgICAgICAgICBfc2VsZi4kc2l6ZS53aWR0aCA9IDA7CiAgICAgICAgICAgICAgICBfc2VsZi5vblJlc2l6ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICB0aGlzLmdldFRoZW1lID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJHRoZW1lVmFsdWU7CiAgICB9OwoKICAgIC8vIE1ldGhvZHMgYWxsb3dzIHRvIGFkZCAvIHJlbW92ZSBDU1MgY2xhc3NuYW1lcyB0byB0aGUgZWRpdG9yIGVsZW1lbnQuCiAgICAvLyBUaGlzIGZlYXR1cmUgY2FuIGJlIHVzZWQgYnkgcGx1Zy1pbnMgdG8gcHJvdmlkZSBhIHZpc3VhbCBpbmRpY2F0aW9uIG9mCiAgICAvLyBhIGNlcnRhaW4gbW9kZSB0aGF0IGVkaXRvciBpcyBpbi4KCiAgICB0aGlzLnNldFN0eWxlID0gZnVuY3Rpb24gc2V0U3R5bGUoc3R5bGUpIHsKICAgICAgZG9tLmFkZENzc0NsYXNzKHRoaXMuY29udGFpbmVyLCBzdHlsZSk7CiAgICB9OwoKICAgIHRoaXMudW5zZXRTdHlsZSA9IGZ1bmN0aW9uIHVuc2V0U3R5bGUoc3R5bGUpIHsKICAgICAgZG9tLnJlbW92ZUNzc0NsYXNzKHRoaXMuY29udGFpbmVyLCBzdHlsZSk7CiAgICB9OwoKICAgIHRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuJHRleHRMYXllci5kZXN0cm95KCk7CiAgICAgICAgdGhpcy4kY3Vyc29yTGF5ZXIuZGVzdHJveSgpOwogICAgfTsKCn0pLmNhbGwoVmlydHVhbFJlbmRlcmVyLnByb3RvdHlwZSk7CgpleHBvcnRzLlZpcnR1YWxSZW5kZXJlciA9IFZpcnR1YWxSZW5kZXJlcjsKfSk7Ci8qIHZpbTp0cz00OnN0cz00OnN3PTQ6CiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICogICAgICBKdWxpYW4gVmllcmVjayA8anVsaWFuIERPVCB2aWVyZWNrIEFUIGdtYWlsIERPVCBjb20+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9sYXllci9ndXR0ZXInLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvZG9tJywgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvZXZlbnRfZW1pdHRlciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoIi4uL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOwoKdmFyIEd1dHRlciA9IGZ1bmN0aW9uKHBhcmVudEVsKSB7CiAgICB0aGlzLmVsZW1lbnQgPSBkb20uY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICB0aGlzLmVsZW1lbnQuY2xhc3NOYW1lID0gImFjZV9sYXllciBhY2VfZ3V0dGVyLWxheWVyIjsKICAgIHBhcmVudEVsLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCk7CiAgICB0aGlzLnNldFNob3dGb2xkV2lkZ2V0cyh0aGlzLiRzaG93Rm9sZFdpZGdldHMpOwogICAgCiAgICB0aGlzLmd1dHRlcldpZHRoID0gMDsKCiAgICB0aGlzLiRicmVha3BvaW50cyA9IFtdOwogICAgdGhpcy4kYW5ub3RhdGlvbnMgPSBbXTsKICAgIHRoaXMuJGRlY29yYXRpb25zID0gW107Cn07CgooZnVuY3Rpb24oKSB7CgogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOwogICAgCiAgICB0aGlzLnNldFNlc3Npb24gPSBmdW5jdGlvbihzZXNzaW9uKSB7CiAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKICAgIH07CgogICAgdGhpcy5hZGRHdXR0ZXJEZWNvcmF0aW9uID0gZnVuY3Rpb24ocm93LCBjbGFzc05hbWUpewogICAgICAgIGlmICghdGhpcy4kZGVjb3JhdGlvbnNbcm93XSkKICAgICAgICAgICAgdGhpcy4kZGVjb3JhdGlvbnNbcm93XSA9ICIiOwogICAgICAgIHRoaXMuJGRlY29yYXRpb25zW3Jvd10gKz0gIiBhY2VfIiArIGNsYXNzTmFtZTsKICAgIH07CgogICAgdGhpcy5yZW1vdmVHdXR0ZXJEZWNvcmF0aW9uID0gZnVuY3Rpb24ocm93LCBjbGFzc05hbWUpewogICAgICAgIHRoaXMuJGRlY29yYXRpb25zW3Jvd10gPSB0aGlzLiRkZWNvcmF0aW9uc1tyb3ddLnJlcGxhY2UoIiBhY2VfIiArIGNsYXNzTmFtZSwgIiIpOwogICAgfTsKCiAgICB0aGlzLnNldEJyZWFrcG9pbnRzID0gZnVuY3Rpb24ocm93cykgewogICAgICAgIHRoaXMuJGJyZWFrcG9pbnRzID0gcm93cy5jb25jYXQoKTsKICAgIH07CgogICAgdGhpcy5zZXRBbm5vdGF0aW9ucyA9IGZ1bmN0aW9uKGFubm90YXRpb25zKSB7CiAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIHNwYXJzZSBhcnJheQogICAgICAgIHRoaXMuJGFubm90YXRpb25zID0gW107CiAgICAgICAgZm9yICh2YXIgcm93IGluIGFubm90YXRpb25zKSBpZiAoYW5ub3RhdGlvbnMuaGFzT3duUHJvcGVydHkocm93KSkgewogICAgICAgICAgICB2YXIgcm93QW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uc1tyb3ddOwogICAgICAgICAgICBpZiAoIXJvd0Fubm90YXRpb25zKQogICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICB2YXIgcm93SW5mbyA9IHRoaXMuJGFubm90YXRpb25zW3Jvd10gPSB7CiAgICAgICAgICAgICAgICB0ZXh0OiBbXQogICAgICAgICAgICB9OwogICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8cm93QW5ub3RhdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciBhbm5vdGF0aW9uID0gcm93QW5ub3RhdGlvbnNbaV07CiAgICAgICAgICAgICAgICB2YXIgYW5ub1RleHQgPSBhbm5vdGF0aW9uLnRleHQucmVwbGFjZSgvIi9nLCAiJnF1b3Q7IikucmVwbGFjZSgvJy9nLCAiJiM4MjE3OyIpLnJlcGxhY2UoLzwvLCAiJmx0OyIpOwogICAgICAgICAgICAgICAgaWYgKHJvd0luZm8udGV4dC5pbmRleE9mKGFubm9UZXh0KSA9PT0gLTEpCiAgICAgICAgICAgICAgICAgICAgcm93SW5mby50ZXh0LnB1c2goYW5ub1RleHQpOwogICAgICAgICAgICAgICAgdmFyIHR5cGUgPSBhbm5vdGF0aW9uLnR5cGU7CiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSAiZXJyb3IiKQogICAgICAgICAgICAgICAgICAgIHJvd0luZm8uY2xhc3NOYW1lID0gImFjZV9lcnJvciI7CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09ICJ3YXJuaW5nIiAmJiByb3dJbmZvLmNsYXNzTmFtZSAhPSAiYWNlX2Vycm9yIikKICAgICAgICAgICAgICAgICAgICByb3dJbmZvLmNsYXNzTmFtZSA9ICJhY2Vfd2FybmluZyI7CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09ICJpbmZvIiAmJiAoIXJvd0luZm8uY2xhc3NOYW1lKSkKICAgICAgICAgICAgICAgICAgICByb3dJbmZvLmNsYXNzTmFtZSA9ICJhY2VfaW5mbyI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMudXBkYXRlID0gZnVuY3Rpb24oY29uZmlnKSB7CiAgICAgICAgdGhpcy4kY29uZmlnID0gY29uZmlnOwoKICAgICAgICB2YXIgZW1wdHlBbm5vID0ge2NsYXNzTmFtZTogIiIsIHRleHQ6IFtdfTsKICAgICAgICB2YXIgaHRtbCA9IFtdOwogICAgICAgIHZhciBpID0gY29uZmlnLmZpcnN0Um93OwogICAgICAgIHZhciBsYXN0Um93ID0gY29uZmlnLmxhc3RSb3c7CiAgICAgICAgdmFyIGZvbGQgPSB0aGlzLnNlc3Npb24uZ2V0TmV4dEZvbGRMaW5lKGkpOwogICAgICAgIHZhciBmb2xkU3RhcnQgPSBmb2xkID8gZm9sZC5zdGFydC5yb3cgOiBJbmZpbml0eTsKICAgICAgICB2YXIgZm9sZFdpZGdldHMgPSB0aGlzLiRzaG93Rm9sZFdpZGdldHMgJiYgdGhpcy5zZXNzaW9uLmZvbGRXaWRnZXRzOwoKICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICBpZihpID4gZm9sZFN0YXJ0KSB7CiAgICAgICAgICAgICAgICBpID0gZm9sZC5lbmQucm93ICsgMTsKICAgICAgICAgICAgICAgIGZvbGQgPSB0aGlzLnNlc3Npb24uZ2V0TmV4dEZvbGRMaW5lKGksIGZvbGQpOwogICAgICAgICAgICAgICAgZm9sZFN0YXJ0ID0gZm9sZCA/Zm9sZC5zdGFydC5yb3cgOkluZmluaXR5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKGkgPiBsYXN0Um93KQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICB2YXIgYW5ub3RhdGlvbiA9IHRoaXMuJGFubm90YXRpb25zW2ldIHx8IGVtcHR5QW5ubzsKICAgICAgICAgICAgaHRtbC5wdXNoKCI8ZGl2IGNsYXNzPSdhY2VfZ3V0dGVyLWNlbGwiLAogICAgICAgICAgICAgICAgdGhpcy4kZGVjb3JhdGlvbnNbaV0gfHwgIiIsCiAgICAgICAgICAgICAgICB0aGlzLiRicmVha3BvaW50c1tpXSA/ICIgYWNlX2JyZWFrcG9pbnQgIiA6ICIgIiwKICAgICAgICAgICAgICAgIGFubm90YXRpb24uY2xhc3NOYW1lLAogICAgICAgICAgICAgICAgIicgdGl0bGU9JyIsIGFubm90YXRpb24udGV4dC5qb2luKCJcbiIpLAogICAgICAgICAgICAgICAgIicgc3R5bGU9J2hlaWdodDoiLCBjb25maWcubGluZUhlaWdodCwgInB4Oyc+IiwgKGkrMSkpOwoKICAgICAgICAgICAgaWYgKGZvbGRXaWRnZXRzKSB7CiAgICAgICAgICAgICAgICB2YXIgYyA9IGZvbGRXaWRnZXRzW2ldOwogICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgY2FjaGVkIHZhbHVlIGlzIGludmFsaWRhdGVkIGFuZCB3ZSBuZWVkIHRvIHJlY29tcHV0ZQogICAgICAgICAgICAgICAgaWYgKGMgPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICBjID0gZm9sZFdpZGdldHNbaV0gPSB0aGlzLnNlc3Npb24uZ2V0Rm9sZFdpZGdldChpKTsKICAgICAgICAgICAgICAgIGlmIChjKQogICAgICAgICAgICAgICAgICAgIGh0bWwucHVzaCgKICAgICAgICAgICAgICAgICAgICAgICAgIjxzcGFuIGNsYXNzPSdhY2VfZm9sZC13aWRnZXQgIiwgYywKICAgICAgICAgICAgICAgICAgICAgICAgYyA9PSAic3RhcnQiICYmIGkgPT0gZm9sZFN0YXJ0ICYmIGkgPCBmb2xkLmVuZC5yb3cgPyAiIGNsb3NlZCIgOiAiIG9wZW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiJz48L3NwYW4+IgogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB3cmFwcGVkUm93TGVuZ3RoID0gdGhpcy5zZXNzaW9uLmdldFJvd0xlbmd0aChpKSAtIDE7CiAgICAgICAgICAgIHdoaWxlICh3cmFwcGVkUm93TGVuZ3RoLS0pIHsKICAgICAgICAgICAgICAgIGh0bWwucHVzaCgiPC9kaXY+PGRpdiBjbGFzcz0nYWNlX2d1dHRlci1jZWxsJyBzdHlsZT0naGVpZ2h0OiIsIGNvbmZpZy5saW5lSGVpZ2h0LCAicHgnPlx4QTYiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaHRtbC5wdXNoKCI8L2Rpdj4iKTsKCiAgICAgICAgICAgIGkrKzsKICAgICAgICB9CiAgICAgICAgdGhpcy5lbGVtZW50ID0gZG9tLnNldElubmVySHRtbCh0aGlzLmVsZW1lbnQsIGh0bWwuam9pbigiIikpOwogICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBjb25maWcubWluSGVpZ2h0ICsgInB4IjsKICAgICAgICAKICAgICAgICB2YXIgZ3V0dGVyV2lkdGggPSB0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGg7CiAgICAgICAgaWYgKGd1dHRlcldpZHRoICE9PSB0aGlzLmd1dHRlcldpZHRoKSB7CiAgICAgICAgICAgIHRoaXMuZ3V0dGVyV2lkdGggPSBndXR0ZXJXaWR0aDsKICAgICAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlR3V0dGVyV2lkdGgiLCBndXR0ZXJXaWR0aCk7CiAgICAgICAgfQogICAgfTsKCiAgICB0aGlzLiRzaG93Rm9sZFdpZGdldHMgPSB0cnVlOwogICAgdGhpcy5zZXRTaG93Rm9sZFdpZGdldHMgPSBmdW5jdGlvbihzaG93KSB7CiAgICAgICAgaWYgKHNob3cpCiAgICAgICAgICAgIGRvbS5hZGRDc3NDbGFzcyh0aGlzLmVsZW1lbnQsICJhY2VfZm9sZGluZy1lbmFibGVkIik7CiAgICAgICAgZWxzZQogICAgICAgICAgICBkb20ucmVtb3ZlQ3NzQ2xhc3ModGhpcy5lbGVtZW50LCAiYWNlX2ZvbGRpbmctZW5hYmxlZCIpOwoKICAgICAgICB0aGlzLiRzaG93Rm9sZFdpZGdldHMgPSBzaG93OwogICAgfTsKICAgIAogICAgdGhpcy5nZXRTaG93Rm9sZFdpZGdldHMgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy4kc2hvd0ZvbGRXaWRnZXRzOwogICAgfTsKCn0pLmNhbGwoR3V0dGVyLnByb3RvdHlwZSk7CgpleHBvcnRzLkd1dHRlciA9IEd1dHRlcjsKCn0pOwovKiB2aW06dHM9NDpzdHM9NDpzdz00OgogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqICAgICAgSnVsaWFuIFZpZXJlY2sgPGp1bGlhbi52aWVyZWNrQGdtYWlsLmNvbT4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL2xheWVyL21hcmtlcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJywgJ2FjZS9saWIvZG9tJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOwp2YXIgZG9tID0gcmVxdWlyZSgiLi4vbGliL2RvbSIpOwoKdmFyIE1hcmtlciA9IGZ1bmN0aW9uKHBhcmVudEVsKSB7CiAgICB0aGlzLmVsZW1lbnQgPSBkb20uY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICB0aGlzLmVsZW1lbnQuY2xhc3NOYW1lID0gImFjZV9sYXllciBhY2VfbWFya2VyLWxheWVyIjsKICAgIHBhcmVudEVsLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCk7Cn07CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy4kcGFkZGluZyA9IDA7CgogICAgdGhpcy5zZXRQYWRkaW5nID0gZnVuY3Rpb24ocGFkZGluZykgewogICAgICAgIHRoaXMuJHBhZGRpbmcgPSBwYWRkaW5nOwogICAgfTsKICAgIHRoaXMuc2V0U2Vzc2lvbiA9IGZ1bmN0aW9uKHNlc3Npb24pIHsKICAgICAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uOwogICAgfTsKICAgIAogICAgdGhpcy5zZXRNYXJrZXJzID0gZnVuY3Rpb24obWFya2VycykgewogICAgICAgIHRoaXMubWFya2VycyA9IG1hcmtlcnM7CiAgICB9OwoKICAgIHRoaXMudXBkYXRlID0gZnVuY3Rpb24oY29uZmlnKSB7CiAgICAgICAgdmFyIGNvbmZpZyA9IGNvbmZpZyB8fCB0aGlzLmNvbmZpZzsKICAgICAgICBpZiAoIWNvbmZpZykKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKCgogICAgICAgIHZhciBodG1sID0gW107CiAgICAgICAgZm9yICggdmFyIGtleSBpbiB0aGlzLm1hcmtlcnMpIHsKICAgICAgICAgICAgdmFyIG1hcmtlciA9IHRoaXMubWFya2Vyc1trZXldOwoKICAgICAgICAgICAgdmFyIHJhbmdlID0gbWFya2VyLnJhbmdlLmNsaXBSb3dzKGNvbmZpZy5maXJzdFJvdywgY29uZmlnLmxhc3RSb3cpOwogICAgICAgICAgICBpZiAocmFuZ2UuaXNFbXB0eSgpKSBjb250aW51ZTsKCiAgICAgICAgICAgIHJhbmdlID0gcmFuZ2UudG9TY3JlZW5SYW5nZSh0aGlzLnNlc3Npb24pOwogICAgICAgICAgICBpZiAobWFya2VyLnJlbmRlcmVyKSB7CiAgICAgICAgICAgICAgICB2YXIgdG9wID0gdGhpcy4kZ2V0VG9wKHJhbmdlLnN0YXJ0LnJvdywgY29uZmlnKTsKICAgICAgICAgICAgICAgIHZhciBsZWZ0ID0gTWF0aC5yb3VuZCgKICAgICAgICAgICAgICAgICAgICB0aGlzLiRwYWRkaW5nICsgcmFuZ2Uuc3RhcnQuY29sdW1uICogY29uZmlnLmNoYXJhY3RlcldpZHRoCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbWFya2VyLnJlbmRlcmVyKGh0bWwsIHJhbmdlLCBsZWZ0LCB0b3AsIGNvbmZpZyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocmFuZ2UuaXNNdWx0aUxpbmUoKSkgewogICAgICAgICAgICAgICAgaWYgKG1hcmtlci50eXBlID09ICJ0ZXh0IikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhd1RleHRNYXJrZXIoaHRtbCwgcmFuZ2UsIG1hcmtlci5jbGF6eiwgY29uZmlnKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3TXVsdGlMaW5lTWFya2VyKAogICAgICAgICAgICAgICAgICAgICAgICBodG1sLCByYW5nZSwgbWFya2VyLmNsYXp6LCBjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlci50eXBlCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuZHJhd1NpbmdsZUxpbmVNYXJrZXIoCiAgICAgICAgICAgICAgICAgICAgaHRtbCwgcmFuZ2UsIG1hcmtlci5jbGF6eiwgY29uZmlnLAogICAgICAgICAgICAgICAgICAgIG51bGwsIG1hcmtlci50eXBlCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuZWxlbWVudCA9IGRvbS5zZXRJbm5lckh0bWwodGhpcy5lbGVtZW50LCBodG1sLmpvaW4oIiIpKTsKICAgIH07CgogICAgdGhpcy4kZ2V0VG9wID0gZnVuY3Rpb24ocm93LCBsYXllckNvbmZpZykgewogICAgICAgIHJldHVybiAocm93IC0gbGF5ZXJDb25maWcuZmlyc3RSb3dTY3JlZW4pICogbGF5ZXJDb25maWcubGluZUhlaWdodDsKICAgIH07CgogICAgLyoqCiAgICAgKiBEcmF3cyBhIG1hcmtlciwgd2hpY2ggc3BhbnMgYSByYW5nZSBvZiB0ZXh0IGluIGEgc2luZ2xlIGxpbmUKICAgICAqLyAKICAgIHRoaXMuZHJhd1RleHRNYXJrZXIgPSBmdW5jdGlvbihzdHJpbmdCdWlsZGVyLCByYW5nZSwgY2xhenosIGxheWVyQ29uZmlnKSB7CiAgICAgICAgLy8gc2VsZWN0aW9uIHN0YXJ0CiAgICAgICAgdmFyIHJvdyA9IHJhbmdlLnN0YXJ0LnJvdzsKCiAgICAgICAgdmFyIGxpbmVSYW5nZSA9IG5ldyBSYW5nZSgKICAgICAgICAgICAgcm93LCByYW5nZS5zdGFydC5jb2x1bW4sCiAgICAgICAgICAgIHJvdywgdGhpcy5zZXNzaW9uLmdldFNjcmVlbkxhc3RSb3dDb2x1bW4ocm93KQogICAgICAgICk7CiAgICAgICAgdGhpcy5kcmF3U2luZ2xlTGluZU1hcmtlcihzdHJpbmdCdWlsZGVyLCBsaW5lUmFuZ2UsIGNsYXp6LCBsYXllckNvbmZpZywgMSwgInRleHQiKTsKCiAgICAgICAgLy8gc2VsZWN0aW9uIGVuZAogICAgICAgIHJvdyA9IHJhbmdlLmVuZC5yb3c7CiAgICAgICAgbGluZVJhbmdlID0gbmV3IFJhbmdlKHJvdywgMCwgcm93LCByYW5nZS5lbmQuY29sdW1uKTsKICAgICAgICB0aGlzLmRyYXdTaW5nbGVMaW5lTWFya2VyKHN0cmluZ0J1aWxkZXIsIGxpbmVSYW5nZSwgY2xhenosIGxheWVyQ29uZmlnLCAwLCAidGV4dCIpOwoKICAgICAgICBmb3IgKHJvdyA9IHJhbmdlLnN0YXJ0LnJvdyArIDE7IHJvdyA8IHJhbmdlLmVuZC5yb3c7IHJvdysrKSB7CiAgICAgICAgICAgIGxpbmVSYW5nZS5zdGFydC5yb3cgPSByb3c7CiAgICAgICAgICAgIGxpbmVSYW5nZS5lbmQucm93ID0gcm93OwogICAgICAgICAgICBsaW5lUmFuZ2UuZW5kLmNvbHVtbiA9IHRoaXMuc2Vzc2lvbi5nZXRTY3JlZW5MYXN0Um93Q29sdW1uKHJvdyk7CiAgICAgICAgICAgIHRoaXMuZHJhd1NpbmdsZUxpbmVNYXJrZXIoc3RyaW5nQnVpbGRlciwgbGluZVJhbmdlLCBjbGF6eiwgbGF5ZXJDb25maWcsIDEsICJ0ZXh0Iik7CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIERyYXdzIGEgbXVsdGkgbGluZSBtYXJrZXIsIHdoZXJlIGxpbmVzIHNwYW4gdGhlIGZ1bGwgd2lkdGgKICAgICAqLwogICAgIHRoaXMuZHJhd011bHRpTGluZU1hcmtlciA9IGZ1bmN0aW9uKHN0cmluZ0J1aWxkZXIsIHJhbmdlLCBjbGF6eiwgbGF5ZXJDb25maWcsIHR5cGUpIHsKICAgICAgICB2YXIgcGFkZGluZyA9IHR5cGUgPT09ICJiYWNrZ3JvdW5kIiA/IDAgOiB0aGlzLiRwYWRkaW5nOwogICAgICAgIHZhciBsYXllcldpZHRoID0gbGF5ZXJDb25maWcud2lkdGggKyAyICogdGhpcy4kcGFkZGluZyAtIHBhZGRpbmc7CiAgICAgICAgLy8gZnJvbSBzZWxlY3Rpb24gc3RhcnQgdG8gdGhlIGVuZCBvZiB0aGUgbGluZQogICAgICAgIHZhciBoZWlnaHQgPSBsYXllckNvbmZpZy5saW5lSGVpZ2h0OwogICAgICAgIHZhciB3aWR0aCA9IE1hdGgucm91bmQobGF5ZXJXaWR0aCAtIChyYW5nZS5zdGFydC5jb2x1bW4gKiBsYXllckNvbmZpZy5jaGFyYWN0ZXJXaWR0aCkpOwogICAgICAgIHZhciB0b3AgPSB0aGlzLiRnZXRUb3AocmFuZ2Uuc3RhcnQucm93LCBsYXllckNvbmZpZyk7CiAgICAgICAgdmFyIGxlZnQgPSBNYXRoLnJvdW5kKAogICAgICAgICAgICBwYWRkaW5nICsgcmFuZ2Uuc3RhcnQuY29sdW1uICogbGF5ZXJDb25maWcuY2hhcmFjdGVyV2lkdGgKICAgICAgICApOwoKICAgICAgICBzdHJpbmdCdWlsZGVyLnB1c2goCiAgICAgICAgICAgICI8ZGl2IGNsYXNzPSciLCBjbGF6eiwgIicgc3R5bGU9JyIsCiAgICAgICAgICAgICJoZWlnaHQ6IiwgaGVpZ2h0LCAicHg7IiwKICAgICAgICAgICAgIndpZHRoOiIsIHdpZHRoLCAicHg7IiwKICAgICAgICAgICAgInRvcDoiLCB0b3AsICJweDsiLAogICAgICAgICAgICAibGVmdDoiLCBsZWZ0LCAicHg7Jz48L2Rpdj4iCiAgICAgICAgKTsKCiAgICAgICAgLy8gZnJvbSBzdGFydCBvZiB0aGUgbGFzdCBsaW5lIHRvIHRoZSBzZWxlY3Rpb24gZW5kCiAgICAgICAgdG9wID0gdGhpcy4kZ2V0VG9wKHJhbmdlLmVuZC5yb3csIGxheWVyQ29uZmlnKTsKICAgICAgICB3aWR0aCA9IE1hdGgucm91bmQocmFuZ2UuZW5kLmNvbHVtbiAqIGxheWVyQ29uZmlnLmNoYXJhY3RlcldpZHRoKTsKCiAgICAgICAgc3RyaW5nQnVpbGRlci5wdXNoKAogICAgICAgICAgICAiPGRpdiBjbGFzcz0nIiwgY2xhenosICInIHN0eWxlPSciLAogICAgICAgICAgICAiaGVpZ2h0OiIsIGhlaWdodCwgInB4OyIsCiAgICAgICAgICAgICJ3aWR0aDoiLCB3aWR0aCwgInB4OyIsCiAgICAgICAgICAgICJ0b3A6IiwgdG9wLCAicHg7IiwKICAgICAgICAgICAgImxlZnQ6IiwgcGFkZGluZywgInB4Oyc+PC9kaXY+IgogICAgICAgICk7CgogICAgICAgIC8vIGFsbCB0aGUgY29tcGxldGUgbGluZXMKICAgICAgICBoZWlnaHQgPSAocmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdyAtIDEpICogbGF5ZXJDb25maWcubGluZUhlaWdodDsKICAgICAgICBpZiAoaGVpZ2h0IDwgMCkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIHRvcCA9IHRoaXMuJGdldFRvcChyYW5nZS5zdGFydC5yb3cgKyAxLCBsYXllckNvbmZpZyk7CgogICAgICAgIHN0cmluZ0J1aWxkZXIucHVzaCgKICAgICAgICAgICAgIjxkaXYgY2xhc3M9JyIsIGNsYXp6LCAiJyBzdHlsZT0nIiwKICAgICAgICAgICAgImhlaWdodDoiLCBoZWlnaHQsICJweDsiLAogICAgICAgICAgICAid2lkdGg6IiwgbGF5ZXJXaWR0aCwgInB4OyIsCiAgICAgICAgICAgICJ0b3A6IiwgdG9wLCAicHg7IiwKICAgICAgICAgICAgImxlZnQ6IiwgcGFkZGluZywgInB4Oyc+PC9kaXY+IgogICAgICAgICk7CiAgICB9OwoKICAgIC8qKgogICAgICogRHJhd3MgYSBtYXJrZXIgd2hpY2ggY292ZXJzIG9uZSBzaW5nbGUgZnVsbCBsaW5lCiAgICAgKi8KICAgIHRoaXMuZHJhd1NpbmdsZUxpbmVNYXJrZXIgPSBmdW5jdGlvbihzdHJpbmdCdWlsZGVyLCByYW5nZSwgY2xhenosIGxheWVyQ29uZmlnLCBleHRyYUxlbmd0aCwgdHlwZSkgewogICAgICAgIHZhciBwYWRkaW5nID0gdHlwZSA9PT0gImJhY2tncm91bmQiID8gMCA6IHRoaXMuJHBhZGRpbmc7CiAgICAgICAgdmFyIGhlaWdodCA9IGxheWVyQ29uZmlnLmxpbmVIZWlnaHQ7CgogICAgICAgIGlmICh0eXBlID09PSAiYmFja2dyb3VuZCIpCiAgICAgICAgICAgIHZhciB3aWR0aCA9IGxheWVyQ29uZmlnLndpZHRoOwogICAgICAgIGVsc2UKICAgICAgICAgICAgd2lkdGggPSBNYXRoLnJvdW5kKChyYW5nZS5lbmQuY29sdW1uICsgKGV4dHJhTGVuZ3RoIHx8IDApIC0gcmFuZ2Uuc3RhcnQuY29sdW1uKSAqIGxheWVyQ29uZmlnLmNoYXJhY3RlcldpZHRoKTsKCiAgICAgICAgdmFyIHRvcCA9IHRoaXMuJGdldFRvcChyYW5nZS5zdGFydC5yb3csIGxheWVyQ29uZmlnKTsKICAgICAgICB2YXIgbGVmdCA9IE1hdGgucm91bmQoCiAgICAgICAgICAgIHBhZGRpbmcgKyByYW5nZS5zdGFydC5jb2x1bW4gKiBsYXllckNvbmZpZy5jaGFyYWN0ZXJXaWR0aAogICAgICAgICk7CgogICAgICAgIHN0cmluZ0J1aWxkZXIucHVzaCgKICAgICAgICAgICAgIjxkaXYgY2xhc3M9JyIsIGNsYXp6LCAiJyBzdHlsZT0nIiwKICAgICAgICAgICAgImhlaWdodDoiLCBoZWlnaHQsICJweDsiLAogICAgICAgICAgICAid2lkdGg6Iiwgd2lkdGgsICJweDsiLAogICAgICAgICAgICAidG9wOiIsIHRvcCwgInB4OyIsCiAgICAgICAgICAgICJsZWZ0OiIsIGxlZnQsInB4Oyc+PC9kaXY+IgogICAgICAgICk7CiAgICB9OwoKfSkuY2FsbChNYXJrZXIucHJvdG90eXBlKTsKCmV4cG9ydHMuTWFya2VyID0gTWFya2VyOwoKfSk7Ci8qIHZpbTp0cz00OnN0cz00OnN3PTQ6CiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICogICAgICBKdWxpYW4gVmllcmVjayA8anVsaWFuIERPVCB2aWVyZWNrIEFUIGdtYWlsIERPVCBjb20+CiAqICAgICAgTWloYWkgU3VjYW4gPG1paGFpLnN1Y2FuQGdtYWlsLmNvbT4KICogICAgICBJcmFrbGkgR296YWxpc2h2aWxpIDxyZm9iaWNAZ21haWwuY29tPiAoaHR0cDovL2plZGl0b29sa2l0LmNvbSkKICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL2xheWVyL3RleHQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvZG9tJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbGliL3VzZXJhZ2VudCcsICdhY2UvbGliL2V2ZW50X2VtaXR0ZXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBkb20gPSByZXF1aXJlKCIuLi9saWIvZG9tIik7CnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsKdmFyIHVzZXJhZ2VudCA9IHJlcXVpcmUoIi4uL2xpYi91c2VyYWdlbnQiKTsKdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoIi4uL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOwoKdmFyIFRleHQgPSBmdW5jdGlvbihwYXJlbnRFbCkgewogICAgdGhpcy5lbGVtZW50ID0gZG9tLmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgdGhpcy5lbGVtZW50LmNsYXNzTmFtZSA9ICJhY2VfbGF5ZXIgYWNlX3RleHQtbGF5ZXIiOwogICAgcGFyZW50RWwuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KTsKCiAgICB0aGlzLiRjaGFyYWN0ZXJTaXplID0gdGhpcy4kbWVhc3VyZVNpemVzKCkgfHwge3dpZHRoOiAwLCBoZWlnaHQ6IDB9OwogICAgdGhpcy4kcG9sbFNpemVDaGFuZ2VzKCk7Cn07CgooZnVuY3Rpb24oKSB7CgogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOwoKICAgIHRoaXMuRU9GX0NIQVIgPSAiXHhCNiI7IC8vIiZwYXJhOyI7CiAgICB0aGlzLkVPTF9DSEFSID0gIlx4QUMiOyAvLyImbm90OyI7CiAgICB0aGlzLlRBQl9DSEFSID0gIlx1MjE5MiI7IC8vIiZyYXJyOyI7CiAgICB0aGlzLlNQQUNFX0NIQVIgPSAiXHhCNyI7IC8vIiZtaWRkb3Q7IjsKICAgIHRoaXMuJHBhZGRpbmcgPSAwOwoKICAgIHRoaXMuc2V0UGFkZGluZyA9IGZ1bmN0aW9uKHBhZGRpbmcpIHsKICAgICAgICB0aGlzLiRwYWRkaW5nID0gcGFkZGluZzsKICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUucGFkZGluZyA9ICIwICIgKyBwYWRkaW5nICsgInB4IjsKICAgIH07CgogICAgdGhpcy5nZXRMaW5lSGVpZ2h0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJGNoYXJhY3RlclNpemUuaGVpZ2h0IHx8IDE7CiAgICB9OwoKICAgIHRoaXMuZ2V0Q2hhcmFjdGVyV2lkdGggPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy4kY2hhcmFjdGVyU2l6ZS53aWR0aCB8fCAxOwogICAgfTsKCiAgICB0aGlzLmNoZWNrRm9yU2l6ZUNoYW5nZXMgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc2l6ZSA9IHRoaXMuJG1lYXN1cmVTaXplcygpOwogICAgICAgIGlmIChzaXplICYmICh0aGlzLiRjaGFyYWN0ZXJTaXplLndpZHRoICE9PSBzaXplLndpZHRoIHx8IHRoaXMuJGNoYXJhY3RlclNpemUuaGVpZ2h0ICE9PSBzaXplLmhlaWdodCkpIHsKICAgICAgICAgICAgdGhpcy4kY2hhcmFjdGVyU2l6ZSA9IHNpemU7CiAgICAgICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZUNoYXJhY3RlclNpemUiLCB7ZGF0YTogc2l6ZX0pOwogICAgICAgIH0KICAgIH07CgogICAgdGhpcy4kcG9sbFNpemVDaGFuZ2VzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgIHRoaXMuJHBvbGxTaXplQ2hhbmdlc1RpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHNlbGYuY2hlY2tGb3JTaXplQ2hhbmdlcygpOwogICAgICAgIH0sIDUwMCk7CiAgICB9OwoKICAgIHRoaXMuJGZvbnRTdHlsZXMgPSB7CiAgICAgICAgZm9udEZhbWlseSA6IDEsCiAgICAgICAgZm9udFNpemUgOiAxLAogICAgICAgIGZvbnRXZWlnaHQgOiAxLAogICAgICAgIGZvbnRTdHlsZSA6IDEsCiAgICAgICAgbGluZUhlaWdodCA6IDEKICAgIH07CgogICAgdGhpcy4kbWVhc3VyZVNpemVzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIG4gPSAxMDAwOwogICAgICAgIGlmICghdGhpcy4kbWVhc3VyZU5vZGUpIHsKICAgICAgICAgICAgdmFyIG1lYXN1cmVOb2RlID0gdGhpcy4kbWVhc3VyZU5vZGUgPSBkb20uY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgICAgIHZhciBzdHlsZSA9IG1lYXN1cmVOb2RlLnN0eWxlOwoKICAgICAgICAgICAgc3R5bGUud2lkdGggPSBzdHlsZS5oZWlnaHQgPSAiYXV0byI7CiAgICAgICAgICAgIHN0eWxlLmxlZnQgPSBzdHlsZS50b3AgPSAoLW4gKiA0MCkgICsgInB4IjsKCiAgICAgICAgICAgIHN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsKICAgICAgICAgICAgc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICAgICAgICBzdHlsZS5vdmVyZmxvdyA9ICJ2aXNpYmxlIjsKICAgICAgICAgICAgc3R5bGUud2hpdGVTcGFjZSA9ICJub3dyYXAiOwoKICAgICAgICAgICAgLy8gaW4gRkYgMy42IG1vbm9zcGFjZSBmb250cyBjYW4gaGF2ZSBhIGZpeGVkIHN1YiBwaXhlbCB3aWR0aC4KICAgICAgICAgICAgLy8gdGhhdCdzIHdoeSB3ZSBoYXZlIHRvIG1lYXN1cmUgbWFueSBjaGFyYWN0ZXJzCiAgICAgICAgICAgIC8vIE5vdGU6IGNoYXJhY3RlcldpZHRoIGNhbiBiZSBhIGZsb2F0IQogICAgICAgICAgICBtZWFzdXJlTm9kZS5pbm5lckhUTUwgPSBsYW5nLnN0cmluZ1JlcGVhdCgiWHkiLCBuKTsKCiAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnQub3duZXJEb2N1bWVudC5ib2R5KSB7CiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQub3duZXJEb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1lYXN1cmVOb2RlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciBjb250YWluZXIgPSB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZTsKICAgICAgICAgICAgICAgIHdoaWxlICghZG9tLmhhc0Nzc0NsYXNzKGNvbnRhaW5lciwgImFjZV9lZGl0b3IiKSkKICAgICAgICAgICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTsKICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChtZWFzdXJlTm9kZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgICAgICB2YXIgc3R5bGUgPSB0aGlzLiRtZWFzdXJlTm9kZS5zdHlsZTsKICAgICAgICB2YXIgY29tcHV0ZWRTdHlsZSA9IGRvbS5jb21wdXRlZFN0eWxlKHRoaXMuZWxlbWVudCk7CiAgICAgICAgZm9yICh2YXIgcHJvcCBpbiB0aGlzLiRmb250U3R5bGVzKQogICAgICAgICAgICBzdHlsZVtwcm9wXSA9IGNvbXB1dGVkU3R5bGVbcHJvcF07CgogICAgICAgIHZhciBzaXplID0gewogICAgICAgICAgICBoZWlnaHQ6IHRoaXMuJG1lYXN1cmVOb2RlLm9mZnNldEhlaWdodCwKICAgICAgICAgICAgd2lkdGg6IHRoaXMuJG1lYXN1cmVOb2RlLm9mZnNldFdpZHRoIC8gKG4gKiAyKQogICAgICAgIH07CgogICAgICAgIC8vIFNpemUgYW5kIHdpZHRoIGNhbiBiZSBudWxsIGlmIHRoZSBlZGl0b3IgaXMgbm90IHZpc2libGUgb3IKICAgICAgICAvLyBkZXRhY2hlZCBmcm9tIHRoZSBkb2N1bWVudAogICAgICAgIGlmIChzaXplLndpZHRoID09IDAgJiYgc2l6ZS5oZWlnaHQgPT0gMCkKICAgICAgICAgICAgcmV0dXJuIG51bGw7CgogICAgICAgIHJldHVybiBzaXplOwogICAgfTsKCiAgICB0aGlzLnNldFNlc3Npb24gPSBmdW5jdGlvbihzZXNzaW9uKSB7CiAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKICAgIH07CgogICAgdGhpcy5zaG93SW52aXNpYmxlcyA9IGZhbHNlOwogICAgdGhpcy5zZXRTaG93SW52aXNpYmxlcyA9IGZ1bmN0aW9uKHNob3dJbnZpc2libGVzKSB7CiAgICAgICAgaWYgKHRoaXMuc2hvd0ludmlzaWJsZXMgPT0gc2hvd0ludmlzaWJsZXMpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgICAgdGhpcy5zaG93SW52aXNpYmxlcyA9IHNob3dJbnZpc2libGVzOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfTsKCiAgICB0aGlzLiR0YWJTdHJpbmdzID0gW107CiAgICB0aGlzLiRjb21wdXRlVGFiU3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHRhYlNpemUgPSB0aGlzLnNlc3Npb24uZ2V0VGFiU2l6ZSgpOwogICAgICAgIHZhciB0YWJTdHIgPSB0aGlzLiR0YWJTdHJpbmdzID0gWzBdOwogICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgdGFiU2l6ZSArIDE7IGkrKykgewogICAgICAgICAgICBpZiAodGhpcy5zaG93SW52aXNpYmxlcykgewogICAgICAgICAgICAgICAgdGFiU3RyLnB1c2goIjxzcGFuIGNsYXNzPSdhY2VfaW52aXNpYmxlJz4iCiAgICAgICAgICAgICAgICAgICAgKyB0aGlzLlRBQl9DSEFSCiAgICAgICAgICAgICAgICAgICAgKyBuZXcgQXJyYXkoaSkuam9pbigiJiMxNjA7IikKICAgICAgICAgICAgICAgICAgICArICI8L3NwYW4+Iik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0YWJTdHIucHVzaChuZXcgQXJyYXkoaSsxKS5qb2luKCImIzE2MDsiKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgfTsKCiAgICB0aGlzLnVwZGF0ZUxpbmVzID0gZnVuY3Rpb24oY29uZmlnLCBmaXJzdFJvdywgbGFzdFJvdykgewogICAgICAgIHRoaXMuJGNvbXB1dGVUYWJTdHJpbmcoKTsKICAgICAgICAvLyBEdWUgdG8gd3JhcCBsaW5lIGNoYW5nZXMgdGhlcmUgY2FuIGJlIG5ldyBsaW5lcyBpZiBlLmcuCiAgICAgICAgLy8gdGhlIGxpbmUgdG8gdXBkYXRlZCB3cmFwcGVkIGluIHRoZSBtZWFudGltZS4KICAgICAgICBpZiAodGhpcy5jb25maWcubGFzdFJvdyAhPSBjb25maWcubGFzdFJvdyB8fAogICAgICAgICAgICB0aGlzLmNvbmZpZy5maXJzdFJvdyAhPSBjb25maWcuZmlyc3RSb3cpIHsKICAgICAgICAgICAgdGhpcy5zY3JvbGxMaW5lcyhjb25maWcpOwogICAgICAgIH0KICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKCiAgICAgICAgdmFyIGZpcnN0ID0gTWF0aC5tYXgoZmlyc3RSb3csIGNvbmZpZy5maXJzdFJvdyk7CiAgICAgICAgdmFyIGxhc3QgPSBNYXRoLm1pbihsYXN0Um93LCBjb25maWcubGFzdFJvdyk7CgogICAgICAgIHZhciBsaW5lRWxlbWVudHMgPSB0aGlzLmVsZW1lbnQuY2hpbGROb2RlczsKICAgICAgICB2YXIgbGluZUVsZW1lbnRzSWR4ID0gMDsKCiAgICAgICAgZm9yICh2YXIgcm93ID0gY29uZmlnLmZpcnN0Um93OyByb3cgPCBmaXJzdDsgcm93KyspIHsKICAgICAgICAgICAgdmFyIGZvbGRMaW5lID0gdGhpcy5zZXNzaW9uLmdldEZvbGRMaW5lKHJvdyk7CiAgICAgICAgICAgIGlmIChmb2xkTGluZSkgewogICAgICAgICAgICAgICAgaWYgKGZvbGRMaW5lLmNvbnRhaW5zUm93KGZpcnN0KSkgewogICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZm9sZExpbmUuc3RhcnQucm93OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByb3cgPSBmb2xkTGluZS5lbmQucm93OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGxpbmVFbGVtZW50c0lkeCArKzsKICAgICAgICB9CgogICAgICAgIGZvciAodmFyIGk9Zmlyc3Q7IGk8PWxhc3Q7IGkrKykgewogICAgICAgICAgICB2YXIgbGluZUVsZW1lbnQgPSBsaW5lRWxlbWVudHNbbGluZUVsZW1lbnRzSWR4KytdOwogICAgICAgICAgICBpZiAoIWxpbmVFbGVtZW50KQogICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICB2YXIgaHRtbCA9IFtdOwogICAgICAgICAgICB2YXIgdG9rZW5zID0gdGhpcy5zZXNzaW9uLmdldFRva2VucyhpLCBpKTsKICAgICAgICAgICAgdGhpcy4kcmVuZGVyTGluZShodG1sLCBpLCB0b2tlbnNbMF0udG9rZW5zLCAhdGhpcy4kdXNlTGluZUdyb3VwcygpKTsKICAgICAgICAgICAgbGluZUVsZW1lbnQgPSBkb20uc2V0SW5uZXJIdG1sKGxpbmVFbGVtZW50LCBodG1sLmpvaW4oIiIpKTsKCiAgICAgICAgICAgIGkgPSB0aGlzLnNlc3Npb24uZ2V0Um93Rm9sZEVuZChpKTsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMuc2Nyb2xsTGluZXMgPSBmdW5jdGlvbihjb25maWcpIHsKICAgICAgICB0aGlzLiRjb21wdXRlVGFiU3RyaW5nKCk7CiAgICAgICAgdmFyIG9sZENvbmZpZyA9IHRoaXMuY29uZmlnOwogICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOwoKICAgICAgICBpZiAoIW9sZENvbmZpZyB8fCBvbGRDb25maWcubGFzdFJvdyA8IGNvbmZpZy5maXJzdFJvdykKICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKGNvbmZpZyk7CgogICAgICAgIGlmIChjb25maWcubGFzdFJvdyA8IG9sZENvbmZpZy5maXJzdFJvdykKICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKGNvbmZpZyk7CgogICAgICAgIHZhciBlbCA9IHRoaXMuZWxlbWVudDsKICAgICAgICBpZiAob2xkQ29uZmlnLmZpcnN0Um93IDwgY29uZmlnLmZpcnN0Um93KQogICAgICAgICAgICBmb3IgKHZhciByb3c9dGhpcy5zZXNzaW9uLmdldEZvbGRlZFJvd0NvdW50KG9sZENvbmZpZy5maXJzdFJvdywgY29uZmlnLmZpcnN0Um93IC0gMSk7IHJvdz4wOyByb3ctLSkKICAgICAgICAgICAgICAgIGVsLnJlbW92ZUNoaWxkKGVsLmZpcnN0Q2hpbGQpOwoKICAgICAgICBpZiAob2xkQ29uZmlnLmxhc3RSb3cgPiBjb25maWcubGFzdFJvdykKICAgICAgICAgICAgZm9yICh2YXIgcm93PXRoaXMuc2Vzc2lvbi5nZXRGb2xkZWRSb3dDb3VudChjb25maWcubGFzdFJvdyArIDEsIG9sZENvbmZpZy5sYXN0Um93KTsgcm93PjA7IHJvdy0tKQogICAgICAgICAgICAgICAgZWwucmVtb3ZlQ2hpbGQoZWwubGFzdENoaWxkKTsKCiAgICAgICAgaWYgKGNvbmZpZy5maXJzdFJvdyA8IG9sZENvbmZpZy5maXJzdFJvdykgewogICAgICAgICAgICB2YXIgZnJhZ21lbnQgPSB0aGlzLiRyZW5kZXJMaW5lc0ZyYWdtZW50KGNvbmZpZywgY29uZmlnLmZpcnN0Um93LCBvbGRDb25maWcuZmlyc3RSb3cgLSAxKTsKICAgICAgICAgICAgaWYgKGVsLmZpcnN0Q2hpbGQpCiAgICAgICAgICAgICAgICBlbC5pbnNlcnRCZWZvcmUoZnJhZ21lbnQsIGVsLmZpcnN0Q2hpbGQpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBlbC5hcHBlbmRDaGlsZChmcmFnbWVudCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoY29uZmlnLmxhc3RSb3cgPiBvbGRDb25maWcubGFzdFJvdykgewogICAgICAgICAgICB2YXIgZnJhZ21lbnQgPSB0aGlzLiRyZW5kZXJMaW5lc0ZyYWdtZW50KGNvbmZpZywgb2xkQ29uZmlnLmxhc3RSb3cgKyAxLCBjb25maWcubGFzdFJvdyk7CiAgICAgICAgICAgIGVsLmFwcGVuZENoaWxkKGZyYWdtZW50KTsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMuJHJlbmRlckxpbmVzRnJhZ21lbnQgPSBmdW5jdGlvbihjb25maWcsIGZpcnN0Um93LCBsYXN0Um93KSB7CiAgICAgICAgdmFyIGZyYWdtZW50ID0gdGhpcy5lbGVtZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLAogICAgICAgICAgICByb3cgPSBmaXJzdFJvdywKICAgICAgICAgICAgZm9sZCA9IHRoaXMuc2Vzc2lvbi5nZXROZXh0Rm9sZExpbmUocm93KSwKICAgICAgICAgICAgZm9sZFN0YXJ0ID0gZm9sZCA/Zm9sZC5zdGFydC5yb3cgOkluZmluaXR5OwoKICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICBpZiAocm93ID4gZm9sZFN0YXJ0KSB7CiAgICAgICAgICAgICAgICByb3cgPSBmb2xkLmVuZC5yb3crMTsKICAgICAgICAgICAgICAgIGZvbGQgPSB0aGlzLnNlc3Npb24uZ2V0TmV4dEZvbGRMaW5lKHJvdywgZm9sZCk7CiAgICAgICAgICAgICAgICBmb2xkU3RhcnQgPSBmb2xkID9mb2xkLnN0YXJ0LnJvdyA6SW5maW5pdHk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJvdyA+IGxhc3RSb3cpCiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIHZhciBjb250YWluZXIgPSBkb20uY3JlYXRlRWxlbWVudCgiZGl2Iik7CgogICAgICAgICAgICB2YXIgaHRtbCA9IFtdOwogICAgICAgICAgICAvLyBHZXQgdGhlIHRva2VucyBwZXIgbGluZSBhcyB0aGVyZSBtaWdodCBiZSBzb21lIGxpbmVzIGluIGJldHdlZW4KICAgICAgICAgICAgLy8gYmVlaW5nIGZvbGRlZC4KICAgICAgICAgICAgLy8gT1BUSU1JWkU6IElmIHRoZXJlIGlzIGEgbG9uZyBibG9jayBvZiB1bmZvbGRlZCBsaW5lcywganVzdCBtYWtlCiAgICAgICAgICAgIC8vIHRoaXMgY2FsbCBvbmNlIGZvciB0aGF0IGJpZyBibG9jayBvZiB1bmZvbGRlZCBsaW5lcy4KICAgICAgICAgICAgdmFyIHRva2VucyA9IHRoaXMuc2Vzc2lvbi5nZXRUb2tlbnMocm93LCByb3cpOwogICAgICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PSAxKQogICAgICAgICAgICAgICAgdGhpcy4kcmVuZGVyTGluZShodG1sLCByb3csIHRva2Vuc1swXS50b2tlbnMsIGZhbHNlKTsKCiAgICAgICAgICAgIC8vIGRvbid0IHVzZSBzZXRJbm5lckh0bWwgc2luY2Ugd2UgYXJlIHdvcmtpbmcgd2l0aCBhbiBlbXB0eSBESVYKICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWwuam9pbigiIik7CiAgICAgICAgICAgIGlmICh0aGlzLiR1c2VMaW5lR3JvdXBzKCkpIHsKICAgICAgICAgICAgICAgIGNvbnRhaW5lci5jbGFzc05hbWUgPSAnYWNlX2xpbmVfZ3JvdXAnOwogICAgICAgICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciBsaW5lcyA9IGNvbnRhaW5lci5jaGlsZE5vZGVzCiAgICAgICAgICAgICAgICB3aGlsZShsaW5lcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQobGluZXNbMF0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICByb3crKzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZyYWdtZW50OwogICAgfTsKCiAgICB0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKGNvbmZpZykgewogICAgICAgIHRoaXMuJGNvbXB1dGVUYWJTdHJpbmcoKTsKICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKCiAgICAgICAgdmFyIGh0bWwgPSBbXTsKICAgICAgICB2YXIgZmlyc3RSb3cgPSBjb25maWcuZmlyc3RSb3csIGxhc3RSb3cgPSBjb25maWcubGFzdFJvdzsKCiAgICAgICAgdmFyIHJvdyA9IGZpcnN0Um93LAogICAgICAgICAgICBmb2xkID0gdGhpcy5zZXNzaW9uLmdldE5leHRGb2xkTGluZShyb3cpLAogICAgICAgICAgICBmb2xkU3RhcnQgPSBmb2xkID9mb2xkLnN0YXJ0LnJvdyA6SW5maW5pdHk7CgogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgIGlmIChyb3cgPiBmb2xkU3RhcnQpIHsKICAgICAgICAgICAgICAgIHJvdyA9IGZvbGQuZW5kLnJvdysxOwogICAgICAgICAgICAgICAgZm9sZCA9IHRoaXMuc2Vzc2lvbi5nZXROZXh0Rm9sZExpbmUocm93LCBmb2xkKTsKICAgICAgICAgICAgICAgIGZvbGRTdGFydCA9IGZvbGQgP2ZvbGQuc3RhcnQucm93IDpJbmZpbml0eTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocm93ID4gbGFzdFJvdykKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgaWYgKHRoaXMuJHVzZUxpbmVHcm91cHMoKSkKICAgICAgICAgICAgICAgIGh0bWwucHVzaCgiPGRpdiBjbGFzcz0nYWNlX2xpbmVfZ3JvdXAnPiIpCgogICAgICAgICAgICAvLyBHZXQgdGhlIHRva2VucyBwZXIgbGluZSBhcyB0aGVyZSBtaWdodCBiZSBzb21lIGxpbmVzIGluIGJldHdlZW4KICAgICAgICAgICAgLy8gYmVlaW5nIGZvbGRlZC4KICAgICAgICAgICAgLy8gT1BUSU1JWkU6IElmIHRoZXJlIGlzIGEgbG9uZyBibG9jayBvZiB1bmZvbGRlZCBsaW5lcywganVzdCBtYWtlCiAgICAgICAgICAgIC8vIHRoaXMgY2FsbCBvbmNlIGZvciB0aGF0IGJpZyBibG9jayBvZiB1bmZvbGRlZCBsaW5lcy4KICAgICAgICAgICAgdmFyIHRva2VucyA9IHRoaXMuc2Vzc2lvbi5nZXRUb2tlbnMocm93LCByb3cpOwogICAgICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PSAxKQogICAgICAgICAgICAgICAgdGhpcy4kcmVuZGVyTGluZShodG1sLCByb3csIHRva2Vuc1swXS50b2tlbnMsIGZhbHNlKTsKCiAgICAgICAgICAgIGlmICh0aGlzLiR1c2VMaW5lR3JvdXBzKCkpCiAgICAgICAgICAgICAgICBodG1sLnB1c2goIjwvZGl2PiIpOyAvLyBlbmQgdGhlIGxpbmUgZ3JvdXAKCiAgICAgICAgICAgIHJvdysrOwogICAgICAgIH0KICAgICAgICB0aGlzLmVsZW1lbnQgPSBkb20uc2V0SW5uZXJIdG1sKHRoaXMuZWxlbWVudCwgaHRtbC5qb2luKCIiKSk7CiAgICB9OwoKICAgIHRoaXMuJHRleHRUb2tlbiA9IHsKICAgICAgICAidGV4dCI6IHRydWUsCiAgICAgICAgInJwYXJlbiI6IHRydWUsCiAgICAgICAgImxwYXJlbiI6IHRydWUKICAgIH07CgogICAgdGhpcy4kcmVuZGVyVG9rZW4gPSBmdW5jdGlvbihzdHJpbmdCdWlsZGVyLCBzY3JlZW5Db2x1bW4sIHRva2VuLCB2YWx1ZSkgeyAgICAgICAgCiAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgIHZhciByZXBsYWNlUmVnID0gL1x0fCZ8PHwoICspfChbXHZcZiBcdTAwYTBcdTIwMDBcdTIwMDFcdTIwMDJcdTIwMDNcdTIwMDRcdTIwMDVcdTIwMDZcdTIwMDdcdTIwMDhcdTIwMDlcdTIwMGFcdTIwMGJcdTIwMjhcdTIwMjlcdTMwMDBdKXxbXHUxMTAwLVx1MTE1Rl18W1x1MTFBMy1cdTExQTddfFtcdTExRkEtXHUxMUZGXXxbXHUyMzI5LVx1MjMyQV18W1x1MkU4MC1cdTJFOTldfFtcdTJFOUItXHUyRUYzXXxbXHUyRjAwLVx1MkZENV18W1x1MkZGMC1cdTJGRkJdfFtcdTMwMDAtXHUzMDNFXXxbXHUzMDQxLVx1MzA5Nl18W1x1MzA5OS1cdTMwRkZdfFtcdTMxMDUtXHUzMTJEXXxbXHUzMTMxLVx1MzE4RV18W1x1MzE5MC1cdTMxQkFdfFtcdTMxQzAtXHUzMUUzXXxbXHUzMUYwLVx1MzIxRV18W1x1MzIyMC1cdTMyNDddfFtcdTMyNTAtXHUzMkZFXXxbXHUzMzAwLVx1NERCRl18W1x1NEUwMC1cdUE0OENdfFtcdUE0OTAtXHVBNEM2XXxbXHVBOTYwLVx1QTk3Q118W1x1QUMwMC1cdUQ3QTNdfFtcdUQ3QjAtXHVEN0M2XXxbXHVEN0NCLVx1RDdGQl18W1x1RjkwMC1cdUZBRkZdfFtcdUZFMTAtXHVGRTE5XXxbXHVGRTMwLVx1RkU1Ml18W1x1RkU1NC1cdUZFNjZdfFtcdUZFNjgtXHVGRTZCXXxbXHVGRjAxLVx1RkY2MF18W1x1RkZFMC1cdUZGRTZdL2c7CiAgICAgICAgdmFyIHJlcGxhY2VGdW5jID0gZnVuY3Rpb24oYywgYSwgYiwgdGFiSWR4LCBpZHg0KSB7CiAgICAgICAgICAgIGlmIChjLmNoYXJDb2RlQXQoMCkgPT0gMzIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXkoYy5sZW5ndGgrMSkuam9pbigiJiMxNjA7Iik7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAiXHQiKSB7CiAgICAgICAgICAgICAgICB2YXIgdGFiU2l6ZSA9IHNlbGYuc2Vzc2lvbi5nZXRTY3JlZW5UYWJTaXplKHNjcmVlbkNvbHVtbiArIHRhYklkeCk7CiAgICAgICAgICAgICAgICBzY3JlZW5Db2x1bW4gKz0gdGFiU2l6ZSAtIDE7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi4kdGFiU3RyaW5nc1t0YWJTaXplXTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICImIikgewogICAgICAgICAgICAgICAgaWYgKHVzZXJhZ2VudC5pc09sZEdlY2tvKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAiJiI7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICImYW1wOyI7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAiPCIpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiJmx0OyI7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAiXHUzMDAwIikgewogICAgICAgICAgICAgICAgLy8gVSszMDAwIGlzIGJvdGggaW52aXNpYmxlIEFORCBmdWxsLXdpZHRoLCBzbyBtdXN0IGJlIGhhbmRsZWQgdW5pcXVlbHkKICAgICAgICAgICAgICAgIHZhciBjbGFzc1RvVXNlID0gc2VsZi5zaG93SW52aXNpYmxlcyA/ICJhY2VfY2prIGFjZV9pbnZpc2libGUiIDogImFjZV9jamsiOwogICAgICAgICAgICAgICAgdmFyIHNwYWNlID0gc2VsZi5zaG93SW52aXNpYmxlcyA/IHNlbGYuU1BBQ0VfQ0hBUiA6ICIiOwogICAgICAgICAgICAgICAgc2NyZWVuQ29sdW1uICs9IDE7CiAgICAgICAgICAgICAgICByZXR1cm4gIjxzcGFuIGNsYXNzPSciICsgY2xhc3NUb1VzZSArICInIHN0eWxlPSd3aWR0aDoiICsKICAgICAgICAgICAgICAgICAgICAoc2VsZi5jb25maWcuY2hhcmFjdGVyV2lkdGggKiAyKSArCiAgICAgICAgICAgICAgICAgICAgInB4Jz4iICsgc3BhY2UgKyAiPC9zcGFuPiI7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoYy5tYXRjaCgvW1x2XGYgXHUwMGEwXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzXHUyMDA0XHUyMDA1XHUyMDA2XHUyMDA3XHUyMDA4XHUyMDA5XHUyMDBhXHUyMDBiXHUyMDI4XHUyMDI5XHUzMDAwXS8pKSB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5zaG93SW52aXNpYmxlcykgewogICAgICAgICAgICAgICAgICAgIHZhciBzcGFjZSA9IG5ldyBBcnJheShjLmxlbmd0aCsxKS5qb2luKHNlbGYuU1BBQ0VfQ0hBUik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICI8c3BhbiBjbGFzcz0nYWNlX2ludmlzaWJsZSc+IiArIHNwYWNlICsgIjwvc3Bhbj4iOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiYjMTYwOyI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzY3JlZW5Db2x1bW4gKz0gMTsKICAgICAgICAgICAgICAgIHJldHVybiAiPHNwYW4gY2xhc3M9J2FjZV9jamsnIHN0eWxlPSd3aWR0aDoiICsKICAgICAgICAgICAgICAgICAgICAoc2VsZi5jb25maWcuY2hhcmFjdGVyV2lkdGggKiAyKSArCiAgICAgICAgICAgICAgICAgICAgInB4Jz4iICsgYyArICI8L3NwYW4+IjsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIHZhciBvdXRwdXQgPSB2YWx1ZS5yZXBsYWNlKHJlcGxhY2VSZWcsIHJlcGxhY2VGdW5jKTsKCiAgICAgICAgaWYgKCF0aGlzLiR0ZXh0VG9rZW5bdG9rZW4udHlwZV0pIHsKICAgICAgICAgICAgdmFyIGNsYXNzZXMgPSAiYWNlXyIgKyB0b2tlbi50eXBlLnJlcGxhY2UoL1wuL2csICIgYWNlXyIpOwogICAgICAgICAgICB2YXIgc3R5bGUgPSAiIjsKICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT0gImZvbGQiKQogICAgICAgICAgICAgICAgc3R5bGUgPSAiIHN0eWxlPSd3aWR0aDoiICsgKHRva2VuLnZhbHVlLmxlbmd0aCAqIHRoaXMuY29uZmlnLmNoYXJhY3RlcldpZHRoKSArICJweDsnICI7CiAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIucHVzaCgiPHNwYW4gY2xhc3M9JyIsIGNsYXNzZXMsICInIiwgc3R5bGUsICI+Iiwgb3V0cHV0LCAiPC9zcGFuPiIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5wdXNoKG91dHB1dCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzY3JlZW5Db2x1bW4gKyB2YWx1ZS5sZW5ndGg7CiAgICB9OwoKICAgIHRoaXMuJHJlbmRlckxpbmVDb3JlID0gZnVuY3Rpb24oc3RyaW5nQnVpbGRlciwgbGFzdFJvdywgdG9rZW5zLCBzcGxpdHMsIG9ubHlDb250ZW50cykgewogICAgICAgIHZhciBjaGFycyA9IDA7CiAgICAgICAgdmFyIHNwbGl0ID0gMDsKICAgICAgICB2YXIgc3BsaXRDaGFyczsKICAgICAgICB2YXIgc2NyZWVuQ29sdW1uID0gMDsKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIGlmICghc3BsaXRzIHx8IHNwbGl0cy5sZW5ndGggPT0gMCkKICAgICAgICAgICAgc3BsaXRDaGFycyA9IE51bWJlci5NQVhfVkFMVUU7CiAgICAgICAgZWxzZQogICAgICAgICAgICBzcGxpdENoYXJzID0gc3BsaXRzWzBdOwoKICAgICAgICBpZiAoIW9ubHlDb250ZW50cykgewogICAgICAgICAgICBzdHJpbmdCdWlsZGVyLnB1c2goIjxkaXYgY2xhc3M9J2FjZV9saW5lJyBzdHlsZT0naGVpZ2h0OiIsCiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5saW5lSGVpZ2h0LCAicHgiLAogICAgICAgICAgICAgICAgIic+IgogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV07CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRva2VuLnZhbHVlOwoKICAgICAgICAgICAgaWYgKGNoYXJzICsgdmFsdWUubGVuZ3RoIDwgc3BsaXRDaGFycykgewogICAgICAgICAgICAgICAgc2NyZWVuQ29sdW1uID0gc2VsZi4kcmVuZGVyVG9rZW4oCiAgICAgICAgICAgICAgICAgICAgc3RyaW5nQnVpbGRlciwgc2NyZWVuQ29sdW1uLCB0b2tlbiwgdmFsdWUKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBjaGFycyArPSB2YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB3aGlsZSAoY2hhcnMgKyB2YWx1ZS5sZW5ndGggPj0gc3BsaXRDaGFycykgewogICAgICAgICAgICAgICAgICAgIHNjcmVlbkNvbHVtbiA9IHNlbGYuJHJlbmRlclRva2VuKAogICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLCBzY3JlZW5Db2x1bW4sIAogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiwgdmFsdWUuc3Vic3RyaW5nKDAsIHNwbGl0Q2hhcnMgLSBjaGFycykKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKHNwbGl0Q2hhcnMgLSBjaGFycyk7CiAgICAgICAgICAgICAgICAgICAgY2hhcnMgPSBzcGxpdENoYXJzOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGlmICghb25seUNvbnRlbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIucHVzaCgiPC9kaXY+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8ZGl2IGNsYXNzPSdhY2VfbGluZScgc3R5bGU9J2hlaWdodDoiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcubGluZUhlaWdodCwgInB4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICInPiIKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHNwbGl0ICsrOwogICAgICAgICAgICAgICAgICAgIHNjcmVlbkNvbHVtbiA9IDA7CiAgICAgICAgICAgICAgICAgICAgc3BsaXRDaGFycyA9IHNwbGl0c1tzcGxpdF0gfHwgTnVtYmVyLk1BWF9WQUxVRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggIT0gMCkgewogICAgICAgICAgICAgICAgICAgIGNoYXJzICs9IHZhbHVlLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICBzY3JlZW5Db2x1bW4gPSBzZWxmLiRyZW5kZXJUb2tlbigKICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nQnVpbGRlciwgc2NyZWVuQ29sdW1uLCB0b2tlbiwgdmFsdWUKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAodGhpcy5zaG93SW52aXNpYmxlcykgewogICAgICAgICAgICBpZiAobGFzdFJvdyAhPT0gdGhpcy5zZXNzaW9uLmdldExlbmd0aCgpIC0gMSkKICAgICAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIucHVzaCgiPHNwYW4gY2xhc3M9J2FjZV9pbnZpc2libGUnPiIgKyB0aGlzLkVPTF9DSEFSICsgIjwvc3Bhbj4iKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5wdXNoKCI8c3BhbiBjbGFzcz0nYWNlX2ludmlzaWJsZSc+IiArIHRoaXMuRU9GX0NIQVIgKyAiPC9zcGFuPiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIW9ubHlDb250ZW50cykKICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5wdXNoKCI8L2Rpdj4iKTsKICAgIH07CgogICAgdGhpcy4kcmVuZGVyTGluZSA9IGZ1bmN0aW9uKHN0cmluZ0J1aWxkZXIsIHJvdywgdG9rZW5zLCBvbmx5Q29udGVudHMpIHsKICAgICAgICAvLyBDaGVjayBpZiB0aGUgbGluZSB0byByZW5kZXIgaXMgZm9sZGVkIG9yIG5vdC4gSWYgbm90LCB0aGluZ3MgYXJlCiAgICAgICAgLy8gc2ltcGxlLCBvdGhlcndpc2UsIHdlIG5lZWQgdG8gZmFrZSBzb21lIHRoaW5ncy4uLgogICAgICAgIGlmICghdGhpcy5zZXNzaW9uLmlzUm93Rm9sZGVkKHJvdykpIHsKICAgICAgICAgICAgdmFyIHNwbGl0cyA9IHRoaXMuc2Vzc2lvbi5nZXRSb3dTcGxpdERhdGEocm93KTsKICAgICAgICAgICAgdGhpcy4kcmVuZGVyTGluZUNvcmUoc3RyaW5nQnVpbGRlciwgcm93LCB0b2tlbnMsIHNwbGl0cywgb25seUNvbnRlbnRzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLiRyZW5kZXJGb2xkTGluZShzdHJpbmdCdWlsZGVyLCByb3csIHRva2Vucywgb25seUNvbnRlbnRzKTsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMuJHJlbmRlckZvbGRMaW5lID0gZnVuY3Rpb24oc3RyaW5nQnVpbGRlciwgcm93LCB0b2tlbnMsIG9ubHlDb250ZW50cykgewogICAgICAgIHZhciBzZXNzaW9uID0gdGhpcy5zZXNzaW9uLAogICAgICAgICAgICBmb2xkTGluZSA9IHNlc3Npb24uZ2V0Rm9sZExpbmUocm93KSwKICAgICAgICAgICAgcmVuZGVyVG9rZW5zID0gW107CgogICAgICAgIGZ1bmN0aW9uIGFkZFRva2Vucyh0b2tlbnMsIGZyb20sIHRvKSB7CiAgICAgICAgICAgIHZhciBpZHggPSAwLCBjb2wgPSAwOwogICAgICAgICAgICB3aGlsZSAoKGNvbCArIHRva2Vuc1tpZHhdLnZhbHVlLmxlbmd0aCkgPCBmcm9tKSB7CiAgICAgICAgICAgICAgICBjb2wgKz0gdG9rZW5zW2lkeF0udmFsdWUubGVuZ3RoOwogICAgICAgICAgICAgICAgaWR4Kys7CgogICAgICAgICAgICAgICAgaWYgKGlkeCA9PSB0b2tlbnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjb2wgIT0gZnJvbSkgewogICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdG9rZW5zW2lkeF0udmFsdWUuc3Vic3RyaW5nKGZyb20gLSBjb2wpOwogICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHRva2VuIHZhbHVlIGlzIGxvbmdlciB0aGVuIHRoZSBmcm9tLi4udG8gc3BhY2luZy4KICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAodG8gLSBmcm9tKSkgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDAsIHRvIC0gZnJvbSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmVuZGVyVG9rZW5zLnB1c2goewogICAgICAgICAgICAgICAgICAgIHR5cGU6IHRva2Vuc1tpZHhdLnR5cGUsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjb2wgPSBmcm9tICsgdmFsdWUubGVuZ3RoOwogICAgICAgICAgICAgICAgaWR4ICs9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdoaWxlIChjb2wgPCB0bykgewogICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdG9rZW5zW2lkeF0udmFsdWU7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoICsgY29sID4gdG8pIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygwLCB0byAtIGNvbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZW5kZXJUb2tlbnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgdHlwZTogdG9rZW5zW2lkeF0udHlwZSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgY29sICs9IHZhbHVlLmxlbmd0aDsKICAgICAgICAgICAgICAgIGlkeCArPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb2xkTGluZS53YWxrKGZ1bmN0aW9uKHBsYWNlaG9sZGVyLCByb3csIGNvbHVtbiwgbGFzdENvbHVtbiwgaXNOZXdSb3cpIHsKICAgICAgICAgICAgaWYgKHBsYWNlaG9sZGVyKSB7CiAgICAgICAgICAgICAgIHJlbmRlclRva2Vucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICB0eXBlOiAiZm9sZCIsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHBsYWNlaG9sZGVyCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChpc05ld1JvdykgewogICAgICAgICAgICAgICAgICAgdG9rZW5zID0gdGhpcy5zZXNzaW9uLmdldFRva2Vucyhyb3csIHJvdylbMF0udG9rZW5zOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggIT0gMCkgewogICAgICAgICAgICAgICAgICAgIGFkZFRva2Vucyh0b2tlbnMsIGxhc3RDb2x1bW4sIGNvbHVtbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LmJpbmQodGhpcyksIGZvbGRMaW5lLmVuZC5yb3csIHRoaXMuc2Vzc2lvbi5nZXRMaW5lKGZvbGRMaW5lLmVuZC5yb3cpLmxlbmd0aCk7CgogICAgICAgIC8vIFRPRE86IEJ1aWxkIGEgZmFrZSBzcGxpdHMgYXJyYXkhCiAgICAgICAgdmFyIHNwbGl0cyA9IHRoaXMuc2Vzc2lvbi4kdXNlV3JhcE1vZGU/dGhpcy5zZXNzaW9uLiR3cmFwRGF0YVtyb3ddOm51bGw7CiAgICAgICAgdGhpcy4kcmVuZGVyTGluZUNvcmUoc3RyaW5nQnVpbGRlciwgcm93LCByZW5kZXJUb2tlbnMsIHNwbGl0cywgb25seUNvbnRlbnRzKTsKICAgIH07CiAgICAKICAgIHRoaXMuJHVzZUxpbmVHcm91cHMgPSBmdW5jdGlvbigpIHsKICAgICAgICAvLyBGb3IgdGhlIHVwZGF0ZUxpbmVzIGZ1bmN0aW9uIHRvIHdvcmsgY29ycmVjdGx5LCBpdCdzIGltcG9ydGFudCB0aGF0IHRoZQogICAgICAgIC8vIGNoaWxkIG5vZGVzIG9mIHRoaXMuZWxlbWVudCBjb3JyZXNwb25kIG9uIGEgMS10by0xIGJhc2lzIHRvIHJvd3MgaW4gdGhlIAogICAgICAgIC8vIGRvY3VtZW50IChhcyBkaXN0aW5jdCBmcm9tIGxpbmVzIG9uIHRoZSBzY3JlZW4pLiBGb3Igc2Vzc2lvbnMgdGhhdCBhcmUKICAgICAgICAvLyB3cmFwcGVkLCB0aGlzIG1lYW5zIHdlIG5lZWQgdG8gYWRkIGEgbGF5ZXIgdG8gdGhlIG5vZGUgaGllcmFyY2h5ICh0YWdnZWQKICAgICAgICAvLyB3aXRoIHRoZSBjbGFzcyBuYW1lIGFjZV9saW5lX2dyb3VwKS4KICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLmdldFVzZVdyYXBNb2RlKCk7CiAgICB9OwoKICAgIHRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uKCkgewogICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy4kcG9sbFNpemVDaGFuZ2VzVGltZXIpOwogICAgICAgIGlmICh0aGlzLiRtZWFzdXJlTm9kZSkKICAgICAgICAgICAgdGhpcy4kbWVhc3VyZU5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLiRtZWFzdXJlTm9kZSk7CiAgICAgICAgZGVsZXRlIHRoaXMuJG1lYXN1cmVOb2RlOwogICAgfTsKCn0pLmNhbGwoVGV4dC5wcm90b3R5cGUpOwoKZXhwb3J0cy5UZXh0ID0gVGV4dDsKCn0pOwovKiB2aW06dHM9NDpzdHM9NDpzdz00OgogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqICAgICAgSnVsaWFuIFZpZXJlY2sgPGp1bGlhbi52aWVyZWNrQGdtYWlsLmNvbT4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL2xheWVyL2N1cnNvcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9kb20nXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBkb20gPSByZXF1aXJlKCIuLi9saWIvZG9tIik7Cgp2YXIgQ3Vyc29yID0gZnVuY3Rpb24ocGFyZW50RWwpIHsKICAgIHRoaXMuZWxlbWVudCA9IGRvbS5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIHRoaXMuZWxlbWVudC5jbGFzc05hbWUgPSAiYWNlX2xheWVyIGFjZV9jdXJzb3ItbGF5ZXIiOwogICAgcGFyZW50RWwuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KTsKCiAgICB0aGlzLmN1cnNvciA9IGRvbS5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIHRoaXMuY3Vyc29yLmNsYXNzTmFtZSA9ICJhY2VfY3Vyc29yIGFjZV9oaWRkZW4iOwogICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuY3Vyc29yKTsKCiAgICB0aGlzLmlzVmlzaWJsZSA9IGZhbHNlOwp9OwoKKGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuJHBhZGRpbmcgPSAwOwogICAgdGhpcy5zZXRQYWRkaW5nID0gZnVuY3Rpb24ocGFkZGluZykgewogICAgICAgIHRoaXMuJHBhZGRpbmcgPSBwYWRkaW5nOwogICAgfTsKCiAgICB0aGlzLnNldFNlc3Npb24gPSBmdW5jdGlvbihzZXNzaW9uKSB7CiAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKICAgIH07CgogICAgdGhpcy5oaWRlQ3Vyc29yID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5pc1Zpc2libGUgPSBmYWxzZTsKICAgICAgICBkb20uYWRkQ3NzQ2xhc3ModGhpcy5jdXJzb3IsICJhY2VfaGlkZGVuIik7CiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmJsaW5rSWQpOwogICAgfTsKCiAgICB0aGlzLnNob3dDdXJzb3IgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLmlzVmlzaWJsZSA9IHRydWU7CiAgICAgICAgZG9tLnJlbW92ZUNzc0NsYXNzKHRoaXMuY3Vyc29yLCAiYWNlX2hpZGRlbiIpOwogICAgICAgIHRoaXMuY3Vyc29yLnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7CiAgICAgICAgdGhpcy5yZXN0YXJ0VGltZXIoKTsKICAgIH07CgogICAgdGhpcy5yZXN0YXJ0VGltZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICBjbGVhckludGVydmFsKHRoaXMuYmxpbmtJZCk7CiAgICAgICAgaWYgKCF0aGlzLmlzVmlzaWJsZSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB2YXIgY3Vyc29yID0gdGhpcy5jdXJzb3I7CiAgICAgICAgdGhpcy5ibGlua0lkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGN1cnNvci5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBjdXJzb3Iuc3R5bGUudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsKICAgICAgICAgICAgfSwgNDAwKTsKICAgICAgICB9LCAxMDAwKTsKICAgIH07CgogICAgdGhpcy5nZXRQaXhlbFBvc2l0aW9uID0gZnVuY3Rpb24ocG9zaXRpb24sIG9uU2NyZWVuKSB7CiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZyB8fCAhdGhpcy5zZXNzaW9uKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBsZWZ0IDogMCwKICAgICAgICAgICAgICAgIHRvcCA6IDAKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIGlmICghcG9zaXRpb24pCiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5zZXNzaW9uLnNlbGVjdGlvbi5nZXRDdXJzb3IoKTsKICAgICAgICB2YXIgcG9zID0gdGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbihwb3NpdGlvbik7CiAgICAgICAgdmFyIGN1cnNvckxlZnQgPSBNYXRoLnJvdW5kKHRoaXMuJHBhZGRpbmcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MuY29sdW1uICogdGhpcy5jb25maWcuY2hhcmFjdGVyV2lkdGgpOwogICAgICAgIHZhciBjdXJzb3JUb3AgPSAocG9zLnJvdyAtIChvblNjcmVlbiA/IHRoaXMuY29uZmlnLmZpcnN0Um93U2NyZWVuIDogMCkpICoKICAgICAgICAgICAgdGhpcy5jb25maWcubGluZUhlaWdodDsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbGVmdCA6IGN1cnNvckxlZnQsCiAgICAgICAgICAgIHRvcCA6IGN1cnNvclRvcAogICAgICAgIH07CiAgICB9OwoKICAgIHRoaXMudXBkYXRlID0gZnVuY3Rpb24oY29uZmlnKSB7CiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7CgogICAgICAgIHRoaXMucGl4ZWxQb3MgPSB0aGlzLmdldFBpeGVsUG9zaXRpb24obnVsbCwgdHJ1ZSk7CgogICAgICAgIHRoaXMuY3Vyc29yLnN0eWxlLmxlZnQgPSB0aGlzLnBpeGVsUG9zLmxlZnQgKyAicHgiOwogICAgICAgIHRoaXMuY3Vyc29yLnN0eWxlLnRvcCA9ICB0aGlzLnBpeGVsUG9zLnRvcCArICJweCI7CiAgICAgICAgdGhpcy5jdXJzb3Iuc3R5bGUud2lkdGggPSBjb25maWcuY2hhcmFjdGVyV2lkdGggKyAicHgiOwogICAgICAgIHRoaXMuY3Vyc29yLnN0eWxlLmhlaWdodCA9IGNvbmZpZy5saW5lSGVpZ2h0ICsgInB4IjsKCiAgICAgICAgdmFyIG92ZXJ3cml0ZSA9IHRoaXMuc2Vzc2lvbi5nZXRPdmVyd3JpdGUoKQogICAgICAgIGlmIChvdmVyd3JpdGUgIT0gdGhpcy5vdmVyd3JpdGUpIHsKICAgICAgICAgICAgdGhpcy5vdmVyd3JpdGUgPSBvdmVyd3JpdGU7CiAgICAgICAgICAgIGlmIChvdmVyd3JpdGUpCiAgICAgICAgICAgICAgICBkb20uYWRkQ3NzQ2xhc3ModGhpcy5jdXJzb3IsICJhY2Vfb3ZlcndyaXRlIik7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGRvbS5yZW1vdmVDc3NDbGFzcyh0aGlzLmN1cnNvciwgImFjZV9vdmVyd3JpdGUiKTsKICAgICAgICB9CgogICAgICAgIHRoaXMucmVzdGFydFRpbWVyKCk7CiAgICB9OwoKICAgIHRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uKCkgewogICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5ibGlua0lkKTsKICAgIH0KCn0pLmNhbGwoQ3Vyc29yLnByb3RvdHlwZSk7CgpleHBvcnRzLkN1cnNvciA9IEN1cnNvcjsKCn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqICAgICAgSXJha2xpIEdvemFsaXNodmlsaSA8cmZvYmljQGdtYWlsLmNvbT4gKGh0dHA6Ly9qZWRpdG9vbGtpdC5jb20pCiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9zY3JvbGxiYXInLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvZG9tJywgJ2FjZS9saWIvZXZlbnQnLCAnYWNlL2xpYi9ldmVudF9lbWl0dGVyJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi9saWIvb29wIik7CnZhciBkb20gPSByZXF1aXJlKCIuL2xpYi9kb20iKTsKdmFyIGV2ZW50ID0gcmVxdWlyZSgiLi9saWIvZXZlbnQiKTsKdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXI7Cgp2YXIgU2Nyb2xsQmFyID0gZnVuY3Rpb24ocGFyZW50KSB7CiAgICB0aGlzLmVsZW1lbnQgPSBkb20uY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICB0aGlzLmVsZW1lbnQuY2xhc3NOYW1lID0gImFjZV9zYiI7CgogICAgdGhpcy5pbm5lciA9IGRvbS5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmlubmVyKTsKCiAgICBwYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KTsKCiAgICAvLyBpbiBPU1ggbGlvbiB0aGUgc2Nyb2xsYmFycyBhcHBlYXIgdG8gaGF2ZSBubyB3aWR0aC4gSW4gdGhpcyBjYXNlIHJlc2l6ZQogICAgLy8gdGhlIHRvIHNob3cgdGhlIHNjcm9sbGJhciBidXQgc3RpbGwgcHJldGVuZCB0aGF0IHRoZSBzY3JvbGxiYXIgaGFzIGEgd2lkdGgKICAgIC8vIG9mIDBweAogICAgLy8gaW4gRmlyZWZveCA2KyBzY3JvbGxiYXIgaXMgaGlkZGVuIGlmIGVsZW1lbnQgaGFzIHRoZSBzYW1lIHdpZHRoIGFzIHNjcm9sbGJhcgogICAgLy8gbWFrZSBlbGVtZW50IGEgbGl0dGxlIGJpdCB3aWRlciB0byByZXRhaW4gc2Nyb2xsYmFyIHdoZW4gcGFnZSBpcyB6b29tZWQgCiAgICB0aGlzLndpZHRoID0gZG9tLnNjcm9sbGJhcldpZHRoKHBhcmVudC5vd25lckRvY3VtZW50KTsKICAgIHRoaXMuZWxlbWVudC5zdHlsZS53aWR0aCA9ICh0aGlzLndpZHRoIHx8IDE1KSArIDUgKyAicHgiOwoKICAgIGV2ZW50LmFkZExpc3RlbmVyKHRoaXMuZWxlbWVudCwgInNjcm9sbCIsIHRoaXMub25TY3JvbGwuYmluZCh0aGlzKSk7Cn07CgooZnVuY3Rpb24oKSB7CiAgICBvb3AuaW1wbGVtZW50KHRoaXMsIEV2ZW50RW1pdHRlcik7CgogICAgdGhpcy5vblNjcm9sbCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2VtaXQoInNjcm9sbCIsIHtkYXRhOiB0aGlzLmVsZW1lbnQuc2Nyb2xsVG9wfSk7CiAgICB9OwoKICAgIHRoaXMuZ2V0V2lkdGggPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy53aWR0aDsKICAgIH07CgogICAgdGhpcy5zZXRIZWlnaHQgPSBmdW5jdGlvbihoZWlnaHQpIHsKICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgInB4IjsKICAgIH07CgogICAgdGhpcy5zZXRJbm5lckhlaWdodCA9IGZ1bmN0aW9uKGhlaWdodCkgewogICAgICAgIHRoaXMuaW5uZXIuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgInB4IjsKICAgIH07CgogICAgdGhpcy5zZXRTY3JvbGxUb3AgPSBmdW5jdGlvbihzY3JvbGxUb3ApIHsKICAgICAgICB0aGlzLmVsZW1lbnQuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wOwogICAgfTsKCn0pLmNhbGwoU2Nyb2xsQmFyLnByb3RvdHlwZSk7CgpleHBvcnRzLlNjcm9sbEJhciA9IFNjcm9sbEJhcjsKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICogICAgICBJcmFrbGkgR296YWxpc2h2aWxpIDxyZm9iaWNAZ21haWwuY29tPiAoaHR0cDovL2plZGl0b29sa2l0LmNvbSkKICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL3JlbmRlcmxvb3AnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvZXZlbnQnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBldmVudCA9IHJlcXVpcmUoIi4vbGliL2V2ZW50Iik7Cgp2YXIgUmVuZGVyTG9vcCA9IGZ1bmN0aW9uKG9uUmVuZGVyLCB3aW4pIHsKICAgIHRoaXMub25SZW5kZXIgPSBvblJlbmRlcjsKICAgIHRoaXMucGVuZGluZyA9IGZhbHNlOwogICAgdGhpcy5jaGFuZ2VzID0gMDsKICAgIHRoaXMud2luZG93ID0gd2luIHx8IHdpbmRvdzsKfTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLnNjaGVkdWxlID0gZnVuY3Rpb24oY2hhbmdlKSB7CiAgICAgICAgLy90aGlzLm9uUmVuZGVyKGNoYW5nZSk7CiAgICAgICAgLy9yZXR1cm47CiAgICAgICAgdGhpcy5jaGFuZ2VzID0gdGhpcy5jaGFuZ2VzIHwgY2hhbmdlOwogICAgICAgIGlmICghdGhpcy5wZW5kaW5nKSB7CiAgICAgICAgICAgIHRoaXMucGVuZGluZyA9IHRydWU7CiAgICAgICAgICAgIHZhciBfc2VsZiA9IHRoaXM7CiAgICAgICAgICAgIGV2ZW50Lm5leHRUaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgX3NlbGYucGVuZGluZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgdmFyIGNoYW5nZXM7CiAgICAgICAgICAgICAgICB3aGlsZSAoY2hhbmdlcyA9IF9zZWxmLmNoYW5nZXMpIHsKICAgICAgICAgICAgICAgICAgICBfc2VsZi5jaGFuZ2VzID0gMDsKICAgICAgICAgICAgICAgICAgICBfc2VsZi5vblJlbmRlcihjaGFuZ2VzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgdGhpcy53aW5kb3cpOwogICAgICAgIH0KICAgIH07Cgp9KS5jYWxsKFJlbmRlckxvb3AucHJvdG90eXBlKTsKCmV4cG9ydHMuUmVuZGVyTG9vcCA9IFJlbmRlckxvb3A7Cn0pOwpkZWZpbmUoInRleHQhYWNlL2Nzcy9lZGl0b3IuY3NzIiwgW10sICJAaW1wb3J0IHVybCgvL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9RHJvaWQrU2FucytNb25vKTtcbiIgKwogICJcbiIgKwogICJcbiIgKwogICIuYWNlX2VkaXRvciB7XG4iICsKICAiICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiIgKwogICIgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiIgKwogICIgICAgZm9udC1mYW1pbHk6ICdNb25hY28nLCAnTWVubG8nLCAnVWJ1bnR1IE1vbm8nLCAnRHJvaWQgU2FucyBNb25vJywgJ0NvbnNvbGFzJywgbW9ub3NwYWNlO1xuIiArCiAgIiAgICBmb250LXNpemU6IDEycHg7XG4iICsKICAifVxuIiArCiAgIlxuIiArCiAgIi5hY2Vfc2Nyb2xsZXIge1xuIiArCiAgIiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4iICsKICAiICAgIG92ZXJmbG93LXg6IHNjcm9sbDtcbiIgKwogICIgICAgb3ZlcmZsb3cteTogaGlkZGVuO1xuIiArCiAgIn1cbiIgKwogICJcbiIgKwogICIuYWNlX2NvbnRlbnQge1xuIiArCiAgIiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4iICsKICAiICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4iICsKICAiICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtcbiIgKwogICIgICAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuIiArCiAgIiAgICBjdXJzb3I6IHRleHQ7XG4iICsKICAifVxuIiArCiAgIlxuIiArCiAgIi8qIHNldHRpbmcgcG9pbnRlci1ldmVudHM6IGF1dG87IG9uIG5vZGUgdW5kZXIgdGhlIG1vdXNlLCB3aGljaCBjaGFuZ2VzIGR1cmluZyBzY3JvbGwsXG4iICsKICAiICB3aWxsIGJyZWFrIG1vdXNlIHdoZWVsIHNjcm9sbGluZyBpbiBTYWZhcmkgKi9cbiIgKwogICIuYWNlX2NvbnRlbnQgKiB7XG4iICsKICAiICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiIgKwogICJ9XG4iICsKICAiXG4iICsKICAiLmFjZV9jb21wb3NpdGlvbiB7XG4iICsKICAiICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiIgKwogICIgICAgYmFja2dyb3VuZDogIzU1NTtcbiIgKwogICIgICAgY29sb3I6ICNEREQ7XG4iICsKICAiICAgIHotaW5kZXg6IDQ7XG4iICsKICAifVxuIiArCiAgIlxuIiArCiAgIi5hY2VfZ3V0dGVyIC5hY2VfbGF5ZXIge1xuIiArCiAgIiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4iICsKICAiICAgIG1pbi13aWR0aDogNTRweDtcbiIgKwogICIgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4iICsKICAifVxuIiArCiAgIlxuIiArCiAgIi5hY2VfZ3V0dGVyIHtcbiIgKwogICIgICAgcG9zaXRpb246IGFic29sdXRlO1xuIiArCiAgIiAgICBvdmVyZmxvdyA6IGhpZGRlbjtcbiIgKwogICIgICAgaGVpZ2h0OiAxMDAlO1xuIiArCiAgIiAgICB3aWR0aDogYXV0bztcbiIgKwogICIgICAgY3Vyc29yOiBkZWZhdWx0O1xuIiArCiAgIn1cbiIgKwogICJcbiIgKwogICIuYWNlX2d1dHRlci1jZWxsIHtcbiIgKwogICIgICAgcGFkZGluZy1sZWZ0OiAxOXB4O1xuIiArCiAgIiAgICBwYWRkaW5nLXJpZ2h0OiA2cHg7XG4iICsKICAifVxuIiArCiAgIlxuIiArCiAgIi5hY2VfZ3V0dGVyLWNlbGwuYWNlX2Vycm9yIHtcbiIgKwogICIgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9naWYsR0lGODlhJTEwJTAwJTEwJTAwJUQ1JTAwJTAwJUY1b3IlRjUlODclODglRjVuciVGNG5zJUVCbXElRjV6JTdGJURESlQlREVLUyVERk9XJUYxWWMlRjJhaCVDRSg3JUNFKTglRDE4RSVERCU0ME0lRjJLWiVFQlUlNjAlRjQlNjBtJURDaXIlQzglMTYoJUM4JTE5KiVDRSUyNTUlRjElM0ZSJUYxJTNGUyVFNiVBQiVCNSVDQSU1REklQ0VuJTVFJUY3JUEyJTlBJUM5RyUzRSVFMGElNUIlRjclODklODUlRjV5eSVGNiU4MiU4MCVFRCU4MiU4MCVGRiVCRiVCRiVFMyVDNCVDNCVGRiVGRiVGRiVGRiVGRiVGRiUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCElRjklMDQlMDElMDAlMDAlMjUlMDAlMkMlMDAlMDAlMDAlMDAlMTAlMDAlMTAlMDAlMDAlMDZwJUMwJTkycEglMkMlMUElOEYlQzglRDJIJTkzJUUxZDQlMjMlRTQlODglRDMlMDltQiUxRE4lQjQ4JUY1JTkwJTQwJTYwJTkyRyU1QiU5NCUyMCUzRSUyMiVEMiU4NyUyNCVGQSUyMCUyNCVDNSUwNkElMDAlMjAlQjElMDclMDJCJUEzOCU4OVgudiUxNyU4MiUxMSUxM3ElMTAlMEZpJTI0JTBGJThCJTEwJTdCRCUxMiUwRWklMDklOTIlMDklMEVwRCUxOCUxNSUyNCUwQSU5Q2klMDUlMEMlMThGJTE4JTBCJTA3JTA0JTAxJTA0JTA2JUEwSCUxOCUxMiUwRCUxNCUwRCUxMiVBMUklQjMlQjQlQjVJQSUwMCUzQlwiKTtcbiIgKwogICIgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiIgKwogICIgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMnB4IGNlbnRlcjtcbiIgKwogICJ9XG4iICsKICAiXG4iICsKICAiLmFjZV9ndXR0ZXItY2VsbC5hY2Vfd2FybmluZyB7XG4iICsKICAiICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcImRhdGE6aW1hZ2UvZ2lmLEdJRjg5YSUxMCUwMCUxMCUwMCVENSUwMCUwMCVGRiVEQnIlRkYlREUlODElRkYlRTIlOEQlRkYlRTIlOEYlRkYlRTQlOTYlRkYlRTMlOTclRkYlRTUlOUQlRkYlRTYlOUUlRkYlRUUlQzElRkYlQzhaJUZGJUNEayVGRiVEMHMlRkYlRDQlODElRkYlRDUlODIlRkYlRDUlODMlRkYlREMlOTclRkYlREUlOUQlRkYlRTclQjglRkYlQ0NsJTdCUSUxMyU4MFUlMTUlODJXJTE2JTgxVSUxNiU4OSU1QiUxOCU4NyU1QiUxOCU4QyU1RSUxQSU5NGQlMUQlQzUlODMtJUM5JTg3JTJGJUM2JTg0LiVDNiU4NS4lQ0QlOEIyJUM5JTg3MSVDQiU4QTMlQ0QlOEI1JURDJTk4JTNGJURGJTlCQiVFMCU5Q0MlRTElQTVVJUNCJTg3MSVDRiU4QjUlRDElOEQ2JURCJTk3JTQwJURGJTlBQiVERCU5OUIlRTMlQjBwJUU3JUNDJUFFJUZGJUZGJUZGJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwJTAwISVGOSUwNCUwMSUwMCUwMCUyRiUwMCUyQyUwMCUwMCUwMCUwMCUxMCUwMCUxMCUwMCUwMCUwNmElQzAlOTdwSCUyQyUxQSU4RkglQTElQUJUciUyNSU4NyUyQiUwNCU4MiVGNCU3QyVCOVglOTElMDglQ0IlOTklMUMhJTI2JTEzJTg0KmlKOSglMTVHJUNBJTg0JTE0JTAxJTFBJTk3JTBDJTAzJTgwJTNBJTlBJTNFJTgxJTg0JTNFJTExJTA4JUIxJThCJTIwJTAyJTEyJTBGJTE4JTFBJTBGJTBBJTAzJ0YlMUMlMDQlMEIlMTAlMTYlMTglMTAlMEIlMDUlMUNGJTFELSUwNiUwNyU5QSU5QS0lMUVHJTFCJUEwJUExJUEwVSVBNCVBNSVBNkJBJTAwJTNCXCIpO1xuIiArCiAgIiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuIiArCiAgIiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAycHggY2VudGVyO1xuIiArCiAgIn1cbiIgKwogICJcbiIgKwogICIuYWNlX2d1dHRlci1jZWxsLmFjZV9pbmZvIHtcbiIgKwogICIgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoRUFBUUFNUUFBQUFBQUVGQlFWSlNVbDVlWG1Sa1pHdHJhMzkvZjRXRmhZbUppWkdSa2FhbXByeTh2TVBEdzh6TXpOWFYxZHpjM09UazVPcnE2dkR3OFAvLy93QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSDVCQWtBQUJRQUxBQUFBQUFRQUJBQUFBVXVJQ1dPWkdtZWFCbWw1WEd3RkNRU0JHeVhSU0F3dHFRSWlSdWl3SU01Qm9ZVmJFRkl5R0NRb2VKR3JWcHRJUUE3XCIpO1xuIiArCiAgIiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuIiArCiAgIiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAycHggY2VudGVyO1xuIiArCiAgIn1cbiIgKwogICJcbiIgKwogICIuYWNlX2VkaXRvciAuYWNlX3NiIHtcbiIgKwogICIgICAgcG9zaXRpb246IGFic29sdXRlO1xuIiArCiAgIiAgICBvdmVyZmxvdy14OiBoaWRkZW47XG4iICsKICAiICAgIG92ZXJmbG93LXk6IHNjcm9sbDtcbiIgKwogICIgICAgcmlnaHQ6IDA7XG4iICsKICAifVxuIiArCiAgIlxuIiArCiAgIi5hY2VfZWRpdG9yIC5hY2Vfc2IgZGl2IHtcbiIgKwogICIgICAgcG9zaXRpb246IGFic29sdXRlO1xuIiArCiAgIiAgICB3aWR0aDogMXB4O1xuIiArCiAgIiAgICBsZWZ0OiAwO1xuIiArCiAgIn1cbiIgKwogICJcbiIgKwogICIuYWNlX2VkaXRvciAuYWNlX3ByaW50X21hcmdpbl9sYXllciB7XG4iICsKICAiICAgIHotaW5kZXg6IDA7XG4iICsKICAiICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiIgKwogICIgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiIgKwogICIgICAgbWFyZ2luOiAwO1xuIiArCiAgIiAgICBsZWZ0OiAwO1xuIiArCiAgIiAgICBoZWlnaHQ6IDEwMCU7XG4iICsKICAiICAgIHdpZHRoOiAxMDAlO1xuIiArCiAgIn1cbiIgKwogICJcbiIgKwogICIuYWNlX2VkaXRvciAuYWNlX3ByaW50X21hcmdpbiB7XG4iICsKICAiICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiIgKwogICIgICAgaGVpZ2h0OiAxMDAlO1xuIiArCiAgIn1cbiIgKwogICJcbiIgKwogICIuYWNlX2VkaXRvciB0ZXh0YXJlYSB7XG4iICsKICAiICAgIHBvc2l0aW9uOiBmaXhlZDtcbiIgKwogICIgICAgei1pbmRleDogMDtcbiIgKwogICIgICAgd2lkdGg6IDEwcHg7XG4iICsKICAiICAgIGhlaWdodDogMzBweDtcbiIgKwogICIgICAgb3BhY2l0eTogMDtcbiIgKwogICIgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4iICsKICAiICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4iICsKICAiICAgIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcbiIgKwogICIgICAgYm9yZGVyOiBub25lO1xuIiArCiAgIiAgICByZXNpemU6IG5vbmU7XG4iICsKICAiICAgIG91dGxpbmU6IG5vbmU7XG4iICsKICAiICAgIG92ZXJmbG93OiBoaWRkZW47XG4iICsKICAifVxuIiArCiAgIlxuIiArCiAgIi5hY2VfbGF5ZXIge1xuIiArCiAgIiAgICB6LWluZGV4OiAxO1xuIiArCiAgIiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4iICsKICAiICAgIG92ZXJmbG93OiBoaWRkZW47XG4iICsKICAiICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4iICsKICAiICAgIGhlaWdodDogMTAwJTtcbiIgKwogICIgICAgd2lkdGg6IDEwMCU7XG4iICsKICAiICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4iICsKICAiICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtcbiIgKwogICIgICAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuIiArCiAgIn1cbiIgKwogICJcbiIgKwogICIuYWNlX3RleHQtbGF5ZXIge1xuIiArCiAgIiAgICBjb2xvcjogYmxhY2s7XG4iICsKICAifVxuIiArCiAgIlxuIiArCiAgIi5hY2VfY2prIHtcbiIgKwogICIgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuIiArCiAgIiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4iICsKICAifVxuIiArCiAgIlxuIiArCiAgIi5hY2VfY3Vyc29yLWxheWVyIHtcbiIgKwogICIgICAgei1pbmRleDogNDtcbiIgKwogICJ9XG4iICsKICAiXG4iICsKICAiLmFjZV9jdXJzb3Ige1xuIiArCiAgIiAgICB6LWluZGV4OiA0O1xuIiArCiAgIiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4iICsKICAifVxuIiArCiAgIlxuIiArCiAgIi5hY2VfY3Vyc29yLmFjZV9oaWRkZW4ge1xuIiArCiAgIiAgICBvcGFjaXR5OiAwLjI7XG4iICsKICAifVxuIiArCiAgIlxuIiArCiAgIi5hY2VfbGluZSB7XG4iICsKICAiICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4iICsKICAifVxuIiArCiAgIlxuIiArCiAgIi5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7XG4iICsKICAiICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiIgKwogICIgICAgei1pbmRleDogMztcbiIgKwogICJ9XG4iICsKICAiXG4iICsKICAiLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1xuIiArCiAgIiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4iICsKICAiICAgIHotaW5kZXg6IDQ7XG4iICsKICAifVxuIiArCiAgIlxuIiArCiAgIi5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7XG4iICsKICAiICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiIgKwogICIgICAgei1pbmRleDogNTtcbiIgKwogICJ9XG4iICsKICAiXG4iICsKICAiLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7XG4iICsKICAiICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiIgKwogICIgICAgei1pbmRleDogMjtcbiIgKwogICJ9XG4iICsKICAiXG4iICsKICAiLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcbiIgKwogICIgICAgcG9zaXRpb246IGFic29sdXRlO1xuIiArCiAgIiAgICB6LWluZGV4OiA2O1xuIiArCiAgIiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuIiArCiAgIiAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4iICsKICAiICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiIgKwogICJ9XG4iICsKICAiXG4iICsKICAiLmFjZV9saW5lIC5hY2VfZm9sZCB7XG4iICsKICAiICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4iICsKICAiICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtcbiIgKwogICIgICAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuIiArCiAgIiAgICBcbiIgKwogICIgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuIiArCiAgIiAgICBoZWlnaHQ6IDExcHg7XG4iICsKICAiICAgIG1hcmdpbi10b3A6IC0ycHg7XG4iICsKICAiICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4iICsKICAiXG4iICsKICAiICAgIGJhY2tncm91bmQtaW1hZ2U6IFxuIiArCiAgIiAgICAgICAgdXJsKFwiZGF0YTppbWFnZS9wbmcsJTg5UE5HJTBEJTBBJTFBJTBBJTAwJTAwJTAwJTBESUhEUiUwMCUwMCUwMCUxMSUwMCUwMCUwMCUwOSUwOCUwNiUwMCUwMCUwMCVENCVFOCVDNyUwQyUwMCUwMCUwMyUxRWlDQ1BJQ0MlMjBQcm9maWxlJTAwJTAweCUwMSU4NVQlREZrJUQzUCUxNCVGRSVEQWUlOUQlQjAlRTElOEIlM0FnJTExJTA5JTNFaCU5MW5kU3RDJTlDJUI2a1clQkElQ0RaJUVBNiVCNyFIJTlCJUE2bSU1QyU5QSVDNiUyNCVFRH4lQjAlMDclRDklOEJvJTNBJUM1dyVGMSUwNyUzRSVGOSUwNyUwQyVEOSU4M28lN0IlOTIlMEQlQzYlMTRhJUY4JUFDJTg4JTIyTCVGNiUyMiVCMyU5RSU5QjRNJ1MlMDMlQjklRjclQkIlREYlRjklRUU5JyVFNyVFNCU1RSVBMCVGOXFaJUQzJTE0JTJGJTBGJTE0VVNPJUM1JUMyJUZDJUM0JUU0JTE0JURGJUYyJTAxJTVFJTFDQyUyQiVGQ2hNJThCJTg2JTE2SiUyNkclNDAlMEYlRDMlQjJ5JUVGJUIzJUYzJTBFJTFFJUM2bHQlRUVvJURGJUFCJUZFYyVENSU5QSU5NSUwQyUxMSVGMCUxQyUyMCVCRSU5NDUlQzQlMjIlRTFZJUEwaSU1QyVENHQlMTMlRTAlRDYlODklRUYlOUQxNSVDMiVDRExzWCVBNyUwNCUwOSUxRmc4b2MlODElRTElOEMlOEQlMjMlOTZmNDUlNDAlOUElMDklQzIlMDclQzVCJTNBSyVCOCU0MDglOThpJUUwJUYzJTBEJUQ4JUNFJTgxJTE0JUU0JyUyNiVBOSU5Mi4lOEIlM0MlQUJFUiUyRiVFNWRFJUIyJTBDJUY2JUYwJTFGcyU4MyVGMl8lQjAlQTglOTQlRTklOUIlQUQlRTclMTAlOERtJTlBJTE5TiVEMSU3QyU4QSVERSUxRjklN0RwJThDJUU2JTAwJUQ1JUMxJTNGXyUxOCVCREElQjglOURwWDYlRTMlQTM1fkIlQ0QlMjQlQUUlMTElMjYlQkQlRTclRUV0aSU5OCVFRGUlOUElOTdZKSUxMiUyNSUxQyUyNCVCQ2JUJUFFM2xpJUU2JTBCJTAzJTg5JTlBJUU2JUQzJUVEJUY0UCU5MiVCMCU5RjQlQkY0M1klRjMlRTMlRURQJTk1JTA0JUVCMSVDNSVGNSVGNktGJUY0JUJBJUJEJUQ3JURCJTkxJTkzJTA3JUUzNSUzRSVBNyklRDYlN0YlNDAlRkUlQkQlRjclRjVyJThBJUU1eSU5MiVGMCVFQiVCNCUxRSU4RCVENSVGNCU1QiU5MiUzQVYlREIlREIlRTQlQ0QlQTYlMjMlQzMlQzR3USUzRiUwM0hCJTgyJThFJTFDZCglRTAlOTFCJTBDYSU5QWMlQzQlQUElRjhMJTE2JTE5JTIySiVBNCVEMml0VHklQjI4JUQ2JTNCKCU5MyU5NiVFRCUxQ0d4JUM5XyUwRSVCOCU1RSUxNiVGNSU1QiVCMiVCOCVGNiVFMCVGQiU5RSVERCUyNSVENyU4RSVCQyUxNSU4NSVDNSVCNyVBMyVEOFElRUQlQjUlODElRTklQkElQjIlMTMlOUElMUIlN0Z1YSVBNSVBM24lRTE3JUI5JUU1JTlCJTFCbSVBQiUwQiUwOFElRkUlOEElRTUlQjFIJTVFZSVDQU8lODJRJUQ3dTYlRTYlOTBTJTk3JUZDdSUwQiVDRjIlOTQlRUUlMjV2JTEyWCUwQyVCQSVBQyVGMCU1RSVGOCpsJTBBTyU4NSUxNyVDMiU5NyVCRiVENCVDOCVDRSVERSVBRCUxMSVDQiU4MHElMkMlM0UlQUIlOUVTJUNEJUM2JUVDJTI1JUQyTCVEMiVFQmQlQjglQkYlOEElRjVCJUM2JTE4JUY5JTkwMUNaJTlEJUJFJTI0TSU5QyU4QTklRjIlREFQJTBCJyUwNnclODIlRUIlRTYlRTIlNUMlMkYlRDclMDclOUUlQkIlQ0MlNUQlRTElRkElQjklMDglQUQuciUyMyU4RSVDMiUxNyVGNUUlN0MhJUYwJUJFMyVCRSUzRV8lQjdvJTg4YSVBNyVEQiVCRSVEM2QlRUIlQTMxWiVFQiVCQiVEMyU5MSVCQSVBMiVCMXolOTQlOEYlREInJUY2JTNEJThFJUFBJTEzJTE5JUIyJUIxJUJFJUIxflYlMDglMkIlQjQlQTJjakolQjN0TyUwMCUwMyUyNW1OJTk3JUYzJTA1JTkzJUVGJTExJTg0JTBCJTdDJTg4JUFFLSU4OSU4RiVBQmJXJTkwTyUyQiUwQW8lOTklMEMlNUUlOTclMENJJUFGSCVEOS4lQjAlM0IlOEYlRUQlMDMlQjZTJUQ2JTVEJUU2aV9zOSVGMypwJUU5JTFCJUZEJUMzJUVCLjdVJTA2JTVFJTE5JUMwJUQxcy4lMTclQTAzdSVFNCUwOSVCMCU3QyU1RSUyQyVFQiUxNSVEQiUxRiUzQyU5RSVCNyU4MCU5MSUzQiVEQmMlQUQlM0RtYSVCQSU4QiUzRVYlQUIlREJ0LiU1QiUxRSUwMSVCQiUwRiVBQiVENSU5RiVDRiVBQSVENSVERCVFNyVFNCU3RiUwQnglQTMlRkMlMDYlQTklMjMlMEElRDYlQzIlQTFfMiUwMCUwMCUwMCUwOXBIWXMlMDAlMDAlMEIlMTMlMDAlMDAlMEIlMTMlMDElMDAlOUElOUMlMTglMDAlMDAlMDAlQjVJREFUKCUxNSVBNSU5MSUzRCUwRSUwMiElMTAlODVhYyVFMSUwNSVENiVDRSVENiVDNiVDRSVEMiVFOCVFRCVDRCVERSVDMCVDNiVENk4uJUUwViVGOCUzRCU5Q2ElODkxWEglQzIlQkUlRDl5JTNGJTkwISVFNiU5QyVDMyVCRmslRTUlMDExJUM2LSVGNSVDOE4lMDQlREYlQkQlRkYlODklREZ0JTgzRE4lNjAlM0UlRjMlQUIlQTAlREUlMUElNURnJUJFJTEwUSU5NyUxQiU0MCU5QyVBOG8lMTAlOEYlNUUlODI4JUI0JTFCJTYwJTg3JUY2JTAyJTI2JTg1JTFDaCUxRSVDMSUyQiU1QmslRkYlODYlRUUlQjdqJTA5JTlBJURBJTlCJUFDZSVBMyVGOSVFQyVEQSE5JUI0JUQ1JUE2JTgxJTg2JTg2JTk4JUNDJTNDJTVCJTQwJUZBJTgxJUIzJUU5JUNCJTIzJTk0JUMxNkF6byUwNSVENCVFMSVDMSU5NWElM0IlOEEnJUEwJUU4JUNDJTE3JTIyJTg1JTFEJUJBJTAwJUEyJUZBJURDJTBBJTk0JUQxJUQxJThEJThCJTNBJTg0JTE3QiVDNyU2MCUxQSUyNVolRkMlOEQlMDAlMDAlMDAlMDBJRU5EJUFFQiU2MCU4MlwiKSxcbiIgKwogICIgICAgICAgIHVybChcImRhdGE6aW1hZ2UvcG5nLCU4OVBORyUwRCUwQSUxQSUwQSUwMCUwMCUwMCUwRElIRFIlMDAlMDAlMDAlMDUlMDAlMDAlMDA3JTA4JTA2JTAwJTAwJTAwJUM0JUREJTgwQyUwMCUwMCUwMyUxRWlDQ1BJQ0MlMjBQcm9maWxlJTAwJTAweCUwMSU4NVQlREZrJUQzUCUxNCVGRSVEQWUlOUQlQjAlRTElOEIlM0FnJTExJTA5JTNFaCU5MW5kU3RDJTlDJUI2a1clQkElQ0RaJUVBNiVCNyFIJTlCJUE2bSU1QyU5QSVDNiUyNCVFRH4lQjAlMDclRDklOEJvJTNBJUM1dyVGMSUwNyUzRSVGOSUwNyUwQyVEOSU4M28lN0IlOTIlMEQlQzYlMTRhJUY4JUFDJTg4JTIyTCVGNiUyMiVCMyU5RSU5QjRNJ1MlMDMlQjklRjclQkIlREYlRjklRUU5JyVFNyVFNCU1RSVBMCVGOXFaJUQzJTE0JTJGJTBGJTE0VVNPJUM1JUMyJUZDJUM0JUU0JTE0JURGJUYyJTAxJTVFJTFDQyUyQiVGQ2hNJThCJTg2JTE2SiUyNkclNDAlMEYlRDMlQjJ5JUVGJUIzJUYzJTBFJTFFJUM2bHQlRUVvJURGJUFCJUZFYyVENSU5QSU5NSUwQyUxMSVGMCUxQyUyMCVCRSU5NDUlQzQlMjIlRTFZJUEwaSU1QyVENHQlMTMlRTAlRDYlODklRUYlOUQxNSVDMiVDRExzWCVBNyUwNCUwOSUxRmc4b2MlODElRTElOEMlOEQlMjMlOTZmNDUlNDAlOUElMDklQzIlMDclQzVCJTNBSyVCOCU0MDglOThpJUUwJUYzJTBEJUQ4JUNFJTgxJTE0JUU0JyUyNiVBOSU5Mi4lOEIlM0MlQUJFUiUyRiVFNWRFJUIyJTBDJUY2JUYwJTFGcyU4MyVGMl8lQjAlQTglOTQlRTklOUIlQUQlRTclMTAlOERtJTlBJTE5TiVEMSU3QyU4QSVERSUxRjklN0RwJThDJUU2JTAwJUQ1JUMxJTNGXyUxOCVCREElQjglOURwWDYlRTMlQTM1fkIlQ0QlMjQlQUUlMTElMjYlQkQlRTclRUV0aSU5OCVFRGUlOUElOTdZKSUxMiUyNSUxQyUyNCVCQ2JUJUFFM2xpJUU2JTBCJTAzJTg5JTlBJUU2JUQzJUVEJUY0UCU5MiVCMCU5RjQlQkY0M1klRjMlRTMlRURQJTk1JTA0JUVCMSVDNSVGNSVGNktGJUY0JUJBJUJEJUQ3JURCJTkxJTkzJTA3JUUzNSUzRSVBNyklRDYlN0YlNDAlRkUlQkQlRjclRjVyJThBJUU1eSU5MiVGMCVFQiVCNCUxRSU4RCVENSVGNCU1QiU5MiUzQVYlREIlREIlRTQlQ0QlQTYlMjMlQzMlQzR3USUzRiUwM0hCJTgyJThFJTFDZCglRTAlOTFCJTBDYSU5QWMlQzQlQUElRjhMJTE2JTE5JTIySiVBNCVEMml0VHklQjI4JUQ2JTNCKCU5MyU5NiVFRCUxQ0d4JUM5XyUwRSVCOCU1RSUxNiVGNSU1QiVCMiVCOCVGNiVFMCVGQiU5RSVERCUyNSVENyU4RSVCQyUxNSU4NSVDNSVCNyVBMyVEOFElRUQlQjUlODElRTklQkElQjIlMTMlOUElMUIlN0Z1YSVBNSVBM24lRTE3JUI5JUU1JTlCJTFCbSVBQiUwQiUwOFElRkUlOEElRTUlQjFIJTVFZSVDQU8lODJRJUQ3dTYlRTYlOTBTJTk3JUZDdSUwQiVDRjIlOTQlRUUlMjV2JTEyWCUwQyVCQSVBQyVGMCU1RSVGOCpsJTBBTyU4NSUxNyVDMiU5NyVCRiVENCVDOCVDRSVERSVBRCUxMSVDQiU4MHElMkMlM0UlQUIlOUVTJUNEJUM2JUVDJTI1JUQyTCVEMiVFQmQlQjglQkYlOEElRjVCJUM2JTE4JUY5JTkwMUNaJTlEJUJFJTI0TSU5QyU4QTklRjIlREFQJTBCJyUwNnclODIlRUIlRTYlRTIlNUMlMkYlRDclMDclOUUlQkIlQ0MlNUQlRTElRkElQjklMDglQUQuciUyMyU4RSVDMiUxNyVGNUUlN0MhJUYwJUJFMyVCRSUzRV8lQjdvJTg4YSVBNyVEQiVCRSVEM2QlRUIlQTMxWiVFQiVCQiVEMyU5MSVCQSVBMiVCMXolOTQlOEYlREInJUY2JTNEJThFJUFBJTEzJTE5JUIyJUIxJUJFJUIxflYlMDglMkIlQjQlQTJjakolQjN0TyUwMCUwMyUyNW1OJTk3JUYzJTA1JTkzJUVGJTExJTg0JTBCJTdDJTg4JUFFLSU4OSU4RiVBQmJXJTkwTyUyQiUwQW8lOTklMEMlNUUlOTclMENJJUFGSCVEOS4lQjAlM0IlOEYlRUQlMDMlQjZTJUQ2JTVEJUU2aV9zOSVGMypwJUU5JTFCJUZEJUMzJUVCLjdVJTA2JTVFJTE5JUMwJUQxcy4lMTclQTAzdSVFNCUwOSVCMCU3QyU1RSUyQyVFQiUxNSVEQiUxRiUzQyU5RSVCNyU4MCU5MSUzQiVEQmMlQUQlM0RtYSVCQSU4QiUzRVYlQUIlREJ0LiU1QiUxRSUwMSVCQiUwRiVBQiVENSU5RiVDRiVBQSVENSVERCVFNyVFNCU3RiUwQnglQTMlRkMlMDYlQTklMjMlMEElRDYlQzIlQTFfMiUwMCUwMCUwMCUwOXBIWXMlMDAlMDAlMEIlMTMlMDAlMDAlMEIlMTMlMDElMDAlOUElOUMlMTglMDAlMDAlMDAlM0FJREFUOCUxMWMlRkMlRkYlRkYlN0YlMTglMDMlMUElNjAlMDElRjIlM0YlQTAlODkxJTgwJTA0JUZGJTExLSVGOCUxNyU5QkolRTIlMDUlQjFaRCU4MXYlMjZ0JUU3JTgwJUY4JUEzJTgyaCVBMTIlMUElMjAlQTMlMDElMDIlMEYlMDElQkElMjUlMDYlMDAlMTklQzAlMEQlQUVGJUQ1JTNFUyUwMCUwMCUwMCUwMElFTkQlQUVCJTYwJTgyXCIpO1xuIiArCiAgIiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0LCByZXBlYXQteDtcbiIgKwogICIgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlciwgdG9wIGxlZnQ7XG4iICsKICAiICAgIGNvbG9yOiB0cmFuc3BhcmVudDtcbiIgKwogICJcbiIgKwogICIgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7XG4iICsKICAiICAgIC1tb3otYm9yZGVyLXJhZGl1czogMnB4O1xuIiArCiAgIiAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDJweDtcbiIgKwogICIgICAgYm9yZGVyLXJhZGl1czogMnB4O1xuIiArCiAgIiAgICBcbiIgKwogICIgICAgY3Vyc29yOiBwb2ludGVyO1xuIiArCiAgIiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiIgKwogICJ9XG4iICsKICAiXG4iICsKICAiLmFjZV9kYXJrIC5hY2VfZm9sZCB7XG4iICsKICAifVxuIiArCiAgIlxuIiArCiAgIi5hY2VfZm9sZDpob3ZlcntcbiIgKwogICIgICAgYmFja2dyb3VuZC1pbWFnZTogXG4iICsKICAiICAgICAgICB1cmwoXCJkYXRhOmltYWdlL3BuZywlODlQTkclMEQlMEElMUElMEElMDAlMDAlMDAlMERJSERSJTAwJTAwJTAwJTExJTAwJTAwJTAwJTA5JTA4JTA2JTAwJTAwJTAwJUQ0JUU4JUM3JTBDJTAwJTAwJTAzJTFFaUNDUElDQyUyMFByb2ZpbGUlMDAlMDB4JTAxJTg1VCVERmslRDNQJTE0JUZFJURBZSU5RCVCMCVFMSU4QiUzQWclMTElMDklM0VoJTkxbmRTdEMlOUMlQjZrVyVCQSVDRFolRUE2JUI3IUglOUIlQTZtJTVDJTlBJUM2JTI0JUVEfiVCMCUwNyVEOSU4Qm8lM0ElQzV3JUYxJTA3JTNFJUY5JTA3JTBDJUQ5JTgzbyU3QiU5MiUwRCVDNiUxNGElRjglQUMlODglMjJMJUY2JTIyJUIzJTlFJTlCNE0nUyUwMyVCOSVGNyVCQiVERiVGOSVFRTknJUU3JUU0JTVFJUEwJUY5cVolRDMlMTQlMkYlMEYlMTRVU08lQzUlQzIlRkMlQzQlRTQlMTQlREYlRjIlMDElNUUlMUNDJTJCJUZDaE0lOEIlODYlMTZKJTI2RyU0MCUwRiVEMyVCMnklRUYlQjMlRjMlMEUlMUUlQzZsdCVFRW8lREYlQUIlRkVjJUQ1JTlBJTk1JTBDJTExJUYwJTFDJTIwJUJFJTk0NSVDNCUyMiVFMVklQTBpJTVDJUQ0dCUxMyVFMCVENiU4OSVFRiU5RDE1JUMyJUNETHNYJUE3JTA0JTA5JTFGZzhvYyU4MSVFMSU4QyU4RCUyMyU5NmY0NSU0MCU5QSUwOSVDMiUwNyVDNUIlM0FLJUI4JTQwOCU5OGklRTAlRjMlMEQlRDglQ0UlODElMTQlRTQnJTI2JUE5JTkyLiU4QiUzQyVBQkVSJTJGJUU1ZEUlQjIlMEMlRjYlRjAlMUZzJTgzJUYyXyVCMCVBOCU5NCVFOSU5QiVBRCVFNyUxMCU4RG0lOUElMTlOJUQxJTdDJThBJURFJTFGOSU3RHAlOEMlRTYlMDAlRDUlQzElM0ZfJTE4JUJEQSVCOCU5RHBYNiVFMyVBMzV+QiVDRCUyNCVBRSUxMSUyNiVCRCVFNyVFRXRpJTk4JUVEZSU5QSU5N1kpJTEyJTI1JTFDJTI0JUJDYlQlQUUzbGklRTYlMEIlMDMlODklOUElRTYlRDMlRUQlRjRQJTkyJUIwJTlGNCVCRjQzWSVGMyVFMyVFRFAlOTUlMDQlRUIxJUM1JUY1JUY2S0YlRjQlQkElQkQlRDclREIlOTElOTMlMDclRTM1JTNFJUE3KSVENiU3RiU0MCVGRSVCRCVGNyVGNXIlOEElRTV5JTkyJUYwJUVCJUI0JTFFJThEJUQ1JUY0JTVCJTkyJTNBViVEQiVEQiVFNCVDRCVBNiUyMyVDMyVDNHdRJTNGJTAzSEIlODIlOEUlMUNkKCVFMCU5MUIlMENhJTlBYyVDNCVBQSVGOEwlMTYlMTklMjJKJUE0JUQyaXRUeSVCMjglRDYlM0IoJTkzJTk2JUVEJTFDR3glQzlfJTBFJUI4JTVFJTE2JUY1JTVCJUIyJUI4JUY2JUUwJUZCJTlFJUREJTI1JUQ3JThFJUJDJTE1JTg1JUM1JUI3JUEzJUQ4USVFRCVCNSU4MSVFOSVCQSVCMiUxMyU5QSUxQiU3RnVhJUE1JUEzbiVFMTclQjklRTUlOUIlMUJtJUFCJTBCJTA4USVGRSU4QSVFNSVCMUglNUVlJUNBTyU4MlElRDd1NiVFNiU5MFMlOTclRkN1JTBCJUNGMiU5NCVFRSUyNXYlMTJYJTBDJUJBJUFDJUYwJTVFJUY4KmwlMEFPJTg1JTE3JUMyJTk3JUJGJUQ0JUM4JUNFJURFJUFEJTExJUNCJTgwcSUyQyUzRSVBQiU5RVMlQ0QlQzYlRUMlMjUlRDJMJUQyJUVCZCVCOCVCRiU4QSVGNUIlQzYlMTglRjklOTAxQ1olOUQlQkUlMjRNJTlDJThBOSVGMiVEQVAlMEInJTA2dyU4MiVFQiVFNiVFMiU1QyUyRiVENyUwNyU5RSVCQiVDQyU1RCVFMSVGQSVCOSUwOCVBRC5yJTIzJThFJUMyJTE3JUY1RSU3QyElRjAlQkUzJUJFJTNFXyVCN28lODhhJUE3JURCJUJFJUQzZCVFQiVBMzFaJUVCJUJCJUQzJTkxJUJBJUEyJUIxeiU5NCU4RiVEQiclRjYlM0QlOEUlQUElMTMlMTklQjIlQjElQkUlQjF+ViUwOCUyQiVCNCVBMmNqSiVCM3RPJTAwJTAzJTI1bU4lOTclRjMlMDUlOTMlRUYlMTElODQlMEIlN0MlODglQUUtJTg5JThGJUFCYlclOTBPJTJCJTBBbyU5OSUwQyU1RSU5NyUwQ0klQUZIJUQ5LiVCMCUzQiU4RiVFRCUwMyVCNlMlRDYlNUQlRTZpX3M5JUYzKnAlRTklMUIlRkQlQzMlRUIuN1UlMDYlNUUlMTklQzAlRDFzLiUxNyVBMDN1JUU0JTA5JUIwJTdDJTVFJTJDJUVCJTE1JURCJTFGJTNDJTlFJUI3JTgwJTkxJTNCJURCYyVBRCUzRG1hJUJBJThCJTNFViVBQiVEQnQuJTVCJTFFJTAxJUJCJTBGJUFCJUQ1JTlGJUNGJUFBJUQ1JUREJUU3JUU0JTdGJTBCeCVBMyVGQyUwNiVBOSUyMyUwQSVENiVDMiVBMV8yJTAwJTAwJTAwJTA5cEhZcyUwMCUwMCUwQiUxMyUwMCUwMCUwQiUxMyUwMSUwMCU5QSU5QyUxOCUwMCUwMCUwMCVCNUlEQVQoJTE1JUE1JTkxJTNEJTBFJTAyISUxMCU4NWFjJUUxJTA1JUQ2JUNFJUQ2JUM2JUNFJUQyJUU4JUVEJUNEJURFJUMwJUM2JUQ2Ti4lRTBWJUY4JTNEJTlDYSU4OTFYSCVDMiVCRSVEOXklM0YlOTAhJUU2JTlDJUMzJUJGayVFNSUwMTElQzYtJUY1JUM4TiUwNCVERiVCRCVGRiU4OSVERnQlODNETiU2MCUzRSVGMyVBQiVBMCVERSUxQSU1RGclQkUlMTBRJTk3JTFCJTQwJTlDJUE4byUxMCU4RiU1RSU4MjglQjQlMUIlNjAlODclRjYlMDIlMjYlODUlMUNoJTFFJUMxJTJCJTVCayVGRiU4NiVFRSVCN2olMDklOUElREElOUIlQUNlJUEzJUY5JUVDJURBITklQjQlRDUlQTYlODElODYlODYlOTglQ0MlM0MlNUIlNDAlRkElODElQjMlRTklQ0IlMjMlOTQlQzE2QXpvJTA1JUQ0JUUxJUMxJTk1YSUzQiU4QSclQTAlRTglQ0MlMTclMjIlODUlMUQlQkElMDAlQTIlRkElREMlMEElOTQlRDElRDElOEQlOEIlM0ElODQlMTdCJUM3JTYwJTFBJTI1WiVGQyU4RCUwMCUwMCUwMCUwMElFTkQlQUVCJTYwJTgyXCIpLFxuIiArCiAgIiAgICAgICAgdXJsKFwiZGF0YTppbWFnZS9wbmcsJTg5UE5HJTBEJTBBJTFBJTBBJTAwJTAwJTAwJTBESUhEUiUwMCUwMCUwMCUwNSUwMCUwMCUwMDclMDglMDYlMDAlMDAlMDAlQzQlREQlODBDJTAwJTAwJTAzJTFFaUNDUElDQyUyMFByb2ZpbGUlMDAlMDB4JTAxJTg1VCVERmslRDNQJTE0JUZFJURBZSU5RCVCMCVFMSU4QiUzQWclMTElMDklM0VoJTkxbmRTdEMlOUMlQjZrVyVCQSVDRFolRUE2JUI3IUglOUIlQTZtJTVDJTlBJUM2JTI0JUVEfiVCMCUwNyVEOSU4Qm8lM0ElQzV3JUYxJTA3JTNFJUY5JTA3JTBDJUQ5JTgzbyU3QiU5MiUwRCVDNiUxNGElRjglQUMlODglMjJMJUY2JTIyJUIzJTlFJTlCNE0nUyUwMyVCOSVGNyVCQiVERiVGOSVFRTknJUU3JUU0JTVFJUEwJUY5cVolRDMlMTQlMkYlMEYlMTRVU08lQzUlQzIlRkMlQzQlRTQlMTQlREYlRjIlMDElNUUlMUNDJTJCJUZDaE0lOEIlODYlMTZKJTI2RyU0MCUwRiVEMyVCMnklRUYlQjMlRjMlMEUlMUUlQzZsdCVFRW8lREYlQUIlRkVjJUQ1JTlBJTk1JTBDJTExJUYwJTFDJTIwJUJFJTk0NSVDNCUyMiVFMVklQTBpJTVDJUQ0dCUxMyVFMCVENiU4OSVFRiU5RDE1JUMyJUNETHNYJUE3JTA0JTA5JTFGZzhvYyU4MSVFMSU4QyU4RCUyMyU5NmY0NSU0MCU5QSUwOSVDMiUwNyVDNUIlM0FLJUI4JTQwOCU5OGklRTAlRjMlMEQlRDglQ0UlODElMTQlRTQnJTI2JUE5JTkyLiU4QiUzQyVBQkVSJTJGJUU1ZEUlQjIlMEMlRjYlRjAlMUZzJTgzJUYyXyVCMCVBOCU5NCVFOSU5QiVBRCVFNyUxMCU4RG0lOUElMTlOJUQxJTdDJThBJURFJTFGOSU3RHAlOEMlRTYlMDAlRDUlQzElM0ZfJTE4JUJEQSVCOCU5RHBYNiVFMyVBMzV+QiVDRCUyNCVBRSUxMSUyNiVCRCVFNyVFRXRpJTk4JUVEZSU5QSU5N1kpJTEyJTI1JTFDJTI0JUJDYlQlQUUzbGklRTYlMEIlMDMlODklOUElRTYlRDMlRUQlRjRQJTkyJUIwJTlGNCVCRjQzWSVGMyVFMyVFRFAlOTUlMDQlRUIxJUM1JUY1JUY2S0YlRjQlQkElQkQlRDclREIlOTElOTMlMDclRTM1JTNFJUE3KSVENiU3RiU0MCVGRSVCRCVGNyVGNXIlOEElRTV5JTkyJUYwJUVCJUI0JTFFJThEJUQ1JUY0JTVCJTkyJTNBViVEQiVEQiVFNCVDRCVBNiUyMyVDMyVDNHdRJTNGJTAzSEIlODIlOEUlMUNkKCVFMCU5MUIlMENhJTlBYyVDNCVBQSVGOEwlMTYlMTklMjJKJUE0JUQyaXRUeSVCMjglRDYlM0IoJTkzJTk2JUVEJTFDR3glQzlfJTBFJUI4JTVFJTE2JUY1JTVCJUIyJUI4JUY2JUUwJUZCJTlFJUREJTI1JUQ3JThFJUJDJTE1JTg1JUM1JUI3JUEzJUQ4USVFRCVCNSU4MSVFOSVCQSVCMiUxMyU5QSUxQiU3RnVhJUE1JUEzbiVFMTclQjklRTUlOUIlMUJtJUFCJTBCJTA4USVGRSU4QSVFNSVCMUglNUVlJUNBTyU4MlElRDd1NiVFNiU5MFMlOTclRkN1JTBCJUNGMiU5NCVFRSUyNXYlMTJYJTBDJUJBJUFDJUYwJTVFJUY4KmwlMEFPJTg1JTE3JUMyJTk3JUJGJUQ0JUM4JUNFJURFJUFEJTExJUNCJTgwcSUyQyUzRSVBQiU5RVMlQ0QlQzYlRUMlMjUlRDJMJUQyJUVCZCVCOCVCRiU4QSVGNUIlQzYlMTglRjklOTAxQ1olOUQlQkUlMjRNJTlDJThBOSVGMiVEQVAlMEInJTA2dyU4MiVFQiVFNiVFMiU1QyUyRiVENyUwNyU5RSVCQiVDQyU1RCVFMSVGQSVCOSUwOCVBRC5yJTIzJThFJUMyJTE3JUY1RSU3QyElRjAlQkUzJUJFJTNFXyVCN28lODhhJUE3JURCJUJFJUQzZCVFQiVBMzFaJUVCJUJCJUQzJTkxJUJBJUEyJUIxeiU5NCU4RiVEQiclRjYlM0QlOEUlQUElMTMlMTklQjIlQjElQkUlQjF+ViUwOCUyQiVCNCVBMmNqSiVCM3RPJTAwJTAzJTI1bU4lOTclRjMlMDUlOTMlRUYlMTElODQlMEIlN0MlODglQUUtJTg5JThGJUFCYlclOTBPJTJCJTBBbyU5OSUwQyU1RSU5NyUwQ0klQUZIJUQ5LiVCMCUzQiU4RiVFRCUwMyVCNlMlRDYlNUQlRTZpX3M5JUYzKnAlRTklMUIlRkQlQzMlRUIuN1UlMDYlNUUlMTklQzAlRDFzLiUxNyVBMDN1JUU0JTA5JUIwJTdDJTVFJTJDJUVCJTE1JURCJTFGJTNDJTlFJUI3JTgwJTkxJTNCJURCYyVBRCUzRG1hJUJBJThCJTNFViVBQiVEQnQuJTVCJTFFJTAxJUJCJTBGJUFCJUQ1JTlGJUNGJUFBJUQ1JUREJUU3JUU0JTdGJTBCeCVBMyVGQyUwNiVBOSUyMyUwQSVENiVDMiVBMV8yJTAwJTAwJTAwJTA5cEhZcyUwMCUwMCUwQiUxMyUwMCUwMCUwQiUxMyUwMSUwMCU5QSU5QyUxOCUwMCUwMCUwMDNJREFUOCUxMWMlRkMlRkYlRkYlN0YlM0UlMDMlMUElNjAlMDElRjIlM0YlQTMlODkxJTgwJTA0JUZGUSUyNiVGOHclQzAlQjQzJUExJURCJTBDJUUyJThGJTBBJUEyJTg1JUNBaCU4MCU4QyUwNiUwOCUzQyUwNCVFOCU5NiUxOCUwMCVBM1MlMEQlQ0QlQ0YlRDglQzElOUQlMDAlMDAlMDAlMDBJRU5EJUFFQiU2MCU4MlwiKTtcbiIgKwogICIgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdCwgcmVwZWF0LXg7XG4iICsKICAiICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXIsIHRvcCBsZWZ0O1xuIiArCiAgIn1cbiIgKwogICJcbiIgKwogICIuYWNlX2RyYWdnaW5nIC5hY2VfY29udGVudCB7XG4iICsKICAiICAgIGN1cnNvcjogbW92ZTtcbiIgKwogICJ9XG4iICsKICAiXG4iICsKICAiLmFjZV9mb2xkaW5nLWVuYWJsZWQgLmFjZV9ndXR0ZXItY2VsbCB7XG4iICsKICAiICAgIHBhZGRpbmctcmlnaHQ6IDEzcHg7XG4iICsKICAifVxuIiArCiAgIlxuIiArCiAgIi5hY2VfZm9sZC13aWRnZXQge1xuIiArCiAgIiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuIiArCiAgIiAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4iICsKICAiICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiIgKwogICJcbiIgKwogICIgICAgbWFyZ2luOiAwIC0xMnB4IDFweCAxcHg7XG4iICsKICAiICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiIgKwogICIgICAgaGVpZ2h0OiAxNHB4O1xuIiArCiAgIiAgICB3aWR0aDogMTFweDtcbiIgKwogICIgICAgdmVydGljYWwtYWxpZ246IHRleHQtYm90dG9tO1xuIiArCiAgIiAgICBcbiIgKwogICIgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9wbmcsJTg5UE5HJTBEJTBBJTFBJTBBJTAwJTAwJTAwJTBESUhEUiUwMCUwMCUwMCUwNSUwMCUwMCUwMCUwNSUwOCUwNiUwMCUwMCUwMCU4RG8lMjYlRTUlMDAlMDAlMDA0SURBVHglREFlJThBJUIxJTBEJTAwMCUwQyVDMiVGMiUyQ0slOTYlQkMlRDAlOEY5JTgxJTg4SCVFOSVEMCUwRSU5NiVDMCUxMCU5MiUzRSUwMiU4MCU1RSU4MiVFNCVBOSotJUVFc3clQzglQ0MlMTElRUUlOTZ3JUQ4JURDJUU5KkVoJTBDJTE1MSglMDAlMDAlMDAlMDBJRU5EJUFFQiU2MCU4MlwiKTtcbiIgKwogICIgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiIgKwogICIgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIDVweDtcbiIgKwogICJcbiIgKwogICIgICAgYm9yZGVyLXJhZGl1czogM3B4O1xuIiArCiAgIn1cbiIgKwogICJcbiIgKwogICIuYWNlX2ZvbGQtd2lkZ2V0LmVuZCB7XG4iICsKICAiICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcImRhdGE6aW1hZ2UvcG5nLCU4OVBORyUwRCUwQSUxQSUwQSUwMCUwMCUwMCUwRElIRFIlMDAlMDAlMDAlMDUlMDAlMDAlMDAlMDUlMDglMDYlMDAlMDAlMDAlOERvJTI2JUU1JTAwJTAwJTAwNElEQVR4JURBbSVDNyVDMSUwOSUwMDAlMDhDJUQxJThDJUVDRSVDOEUoJThFJUVDJTAyKSUxRVpKJUYxJUMxJyUwNCUwN0klRTElRTUlRUUlQ0FMJUY1JUEyJTk5JTk5JTIyJUUyJUQ2JTFGVSVCNSVGRTAlRDl4JUE3JTI2V3o1JTBFJUQ1JTAwJTAwJTAwJTAwSUVORCVBRUIlNjAlODJcIik7XG4iICsKICAifVxuIiArCiAgIlxuIiArCiAgIi5hY2VfZm9sZC13aWRnZXQuY2xvc2VkIHtcbiIgKwogICIgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9wbmcsJTg5UE5HJTBEJTBBJTFBJTBBJTAwJTAwJTAwJTBESUhEUiUwMCUwMCUwMCUwMyUwMCUwMCUwMCUwNiUwOCUwNiUwMCUwMCUwMCUwNiVFNSUyNCUwQyUwMCUwMCUwMDlJREFUeCVEQTUlQ0ElQzElMDklMDAwJTA4JTAzJUMwJUFDKiglM0UlMDQlQzElMEQlQkElQjElMjMlQTRVaCVFMCUyMCU4MSVDMCVDQyVGOCU4MiU4MSVBQSVBMiVBQXJHZnIlODglMDglMTElMTElMUMlREQlN0QlRTAlRUUlNUIlRjYlRjYlQ0IlQjglMDVRJTJGJUU5dGFpJUQ5JTAwJTAwJTAwJTAwSUVORCVBRUIlNjAlODJcIik7XG4iICsKICAifVxuIiArCiAgIlxuIiArCiAgIi5hY2VfZm9sZC13aWRnZXQ6aG92ZXIge1xuIiArCiAgIiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMyk7XG4iICsKICAiICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTtcbiIgKwogICIgICAgLW1vei1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyk7XG4iICsKICAiICAgIC1tb3otYm94LXNoYWRvdzogMCAxcHggMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTtcbiIgKwogICIgICAgLXdlYmtpdC1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyk7XG4iICsKICAiICAgIC13ZWJraXQtYm94LXNoYWRvdzogMCAxcHggMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTtcbiIgKwogICIgICAgYm94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpO1xuIiArCiAgIiAgICBib3gtc2hhZG93OiAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpO1xuIiArCiAgIiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgNHB4O1xuIiArCiAgIn1cbiIgKwogICJcbiIgKwogICIuYWNlX2ZvbGQtd2lkZ2V0OmFjdGl2ZSB7XG4iICsKICAiICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC40KTtcbiIgKwogICIgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjA1KTtcbiIgKwogICIgICAgLW1vei1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUpO1xuIiArCiAgIiAgICAtbW96LWJveC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCk7XG4iICsKICAiICAgIC13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1KTtcbiIgKwogICIgICAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpO1xuIiArCiAgIiAgICBib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUpO1xuIiArCiAgIiAgICBib3gtc2hhZG93OiAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpO1xuIiArCiAgIn1cbiIgKwogICJcbiIgKwogICIuYWNlX2ZvbGQtd2lkZ2V0LmludmFsaWQge1xuIiArCiAgIiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZCNEI0O1xuIiArCiAgIiAgICBib3JkZXItY29sb3I6ICNERTU1NTU7XG4iICsKICAifVxuIiArCiAgIiIpOwoKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvdGhlbWUvdGV4dG1hdGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvZG9tJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7CgpleHBvcnRzLmlzRGFyayA9IGZhbHNlOwpleHBvcnRzLmNzc0NsYXNzID0gImFjZS10bSI7CmV4cG9ydHMuY3NzVGV4dCA9ICIuYWNlLXRtIC5hY2VfZWRpdG9yIHtcCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wKfVwKXAouYWNlLXRtIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7XAogIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7XAp9XApcCi5hY2UtdG0gLmFjZV9ndXR0ZXIge1wKICBiYWNrZ3JvdW5kOiAjZThlOGU4O1wKICBjb2xvcjogIzMzMztcCn1cClwKLmFjZS10bSAuYWNlX3ByaW50X21hcmdpbiB7XAogIHdpZHRoOiAxcHg7XAogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XAp9XApcCi5hY2UtdG0gLmFjZV9mb2xkIHtcCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMEEyO1wKfVwKXAouYWNlLXRtIC5hY2VfdGV4dC1sYXllciB7XAogIGN1cnNvcjogdGV4dDtcCn1cClwKLmFjZS10bSAuYWNlX2N1cnNvciB7XAogIGJvcmRlci1sZWZ0OiAycHggc29saWQgYmxhY2s7XAp9XApcCi5hY2UtdG0gLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7XAogIGJvcmRlci1sZWZ0OiAwcHg7XAogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjaztcCn1cCiAgICAgICAgXAouYWNlLXRtIC5hY2VfbGluZSAuYWNlX2ludmlzaWJsZSB7XAogIGNvbG9yOiByZ2IoMTkxLCAxOTEsIDE5MSk7XAp9XApcCi5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfa2V5d29yZCB7XAogIGNvbG9yOiBibHVlO1wKfVwKXAouYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9idWlsZGluIHtcCiAgY29sb3I6IHJnYig4OCwgNzIsIDI0Nik7XAp9XApcCi5hY2UtdG0gLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX2xhbmd1YWdlIHtcCiAgY29sb3I6IHJnYig4OCwgOTIsIDI0Nik7XAp9XApcCi5hY2UtdG0gLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX2xpYnJhcnkge1wKICBjb2xvcjogcmdiKDYsIDE1MCwgMTQpO1wKfVwKXAouYWNlLXRtIC5hY2VfbGluZSAuYWNlX2ludmFsaWQge1wKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTUzLCAwLCAwKTtcCiAgY29sb3I6IHdoaXRlO1wKfVwKXAouYWNlLXRtIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHtcCiAgY29sb3I6IHJnYig2MCwgNzYsIDExNCk7XAp9XApcCi5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfY29uc3RhbnQge1wKICBjb2xvcjogcmdiKDYsIDE1MCwgMTQpO1wKfVwKXAouYWNlLXRtIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX3R5cGUsXAouYWNlLXRtIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX2NsYXNzIHtcCiAgY29sb3I6IHJnYigxMDksIDEyMSwgMjIyKTtcCn1cClwKLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7XAogIGNvbG9yOiByZ2IoMTA0LCAxMTgsIDEzNSk7XAp9XApcCi5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfc3RyaW5nIHtcCiAgY29sb3I6IHJnYigzLCAxMDYsIDcpO1wKfVwKXAouYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQge1wKICBjb2xvcjogcmdiKDc2LCAxMzYsIDEwNyk7XAp9XApcCi5hY2UtdG0gLmFjZV9saW5lIC5hY2VfY29tbWVudC5hY2VfZG9jIHtcCiAgY29sb3I6IHJnYigwLCAxMDIsIDI1NSk7XAp9XApcCi5hY2UtdG0gLmFjZV9saW5lIC5hY2VfY29tbWVudC5hY2VfZG9jLmFjZV90YWcge1wKICBjb2xvcjogcmdiKDEyOCwgMTU5LCAxOTEpO1wKfVwKXAouYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHtcCiAgY29sb3I6IHJnYigwLCAwLCAyMDUpO1wKfVwKXAouYWNlLXRtIC5hY2VfbGluZSAuYWNlX3ZhcmlhYmxlIHtcCiAgY29sb3I6IHJnYig0OSwgMTMyLCAxNDkpO1wKfVwKXAouYWNlLXRtIC5hY2VfbGluZSAuYWNlX3htbF9wZSB7XAogIGNvbG9yOiByZ2IoMTA0LCAxMDQsIDkxKTtcCn1cClwKLmFjZS10bSAuYWNlX2VudGl0eS5hY2VfbmFtZS5hY2VfZnVuY3Rpb24ge1wKICBjb2xvcjogIzAwMDBBMjtcCn1cClwKLmFjZS10bSAuYWNlX21hcmt1cC5hY2VfbWFya3VwaW5lIHtcCiAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wKfVwKXAouYWNlLXRtIC5hY2VfbWFya3VwLmFjZV9oZWFkaW5nIHtcCiAgY29sb3I6IHJnYigxMiwgNywgMjU1KTtcCn1cClwKLmFjZS10bSAuYWNlX21hcmt1cC5hY2VfbGlzdCB7XAogIGNvbG9yOnJnYigxODUsIDYsIDE0NCk7XAp9XApcCi5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wKICBiYWNrZ3JvdW5kOiByZ2IoMTgxLCAyMTMsIDI1NSk7XAp9XApcCi5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwIHtcCiAgYmFja2dyb3VuZDogcmdiKDI1MiwgMjU1LCAwKTtcCn1cClwKLmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0YWNrIHtcCiAgYmFja2dyb3VuZDogcmdiKDE2NCwgMjI5LCAxMDEpO1wKfVwKXAouYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7XAogIG1hcmdpbjogLTFweCAwIDAgLTFweDtcCiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE5MiwgMTkyLCAxOTIpO1wKfVwKXAouYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wKICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDcpO1wKfVwKXAouYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7XAogIGJhY2tncm91bmQ6IHJnYigyNTAsIDI1MCwgMjU1KTtcCiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDIwMCwgMjAwLCAyNTApO1wKfVwKXAouYWNlLXRtIC5hY2VfbWV0YS5hY2VfdGFnIHtcCiAgY29sb3I6cmdiKDI4LCAyLCAyNTUpO1wKfVwKXAouYWNlLXRtIC5hY2Vfc3RyaW5nLmFjZV9yZWdleCB7XAogIGNvbG9yOiByZ2IoMjU1LCAwLCAwKVwKfSI7Cgp2YXIgZG9tID0gcmVxdWlyZSgiLi4vbGliL2RvbSIpOwpkb20uaW1wb3J0Q3NzU3RyaW5nKGV4cG9ydHMuY3NzVGV4dCwgZXhwb3J0cy5jc3NDbGFzcyk7Cn0pOwo7CiAgICAgICAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAg]]></data>
	</file>
	<file>
	  <filename>/ace/src/ace.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZyhhKXt2YXIgZT1mdW5jdGlvbihhLGIpe3JldHVybiBkKCIiLGEsYil9O2UucGFja2FnZWQ9ITA7dmFyIGY9YjthJiYoYlthXXx8KGJbYV09e30pLGY9YlthXSksZi5kZWZpbmUmJihjLm9yaWdpbmFsPWYuZGVmaW5lKSxmLmRlZmluZT1jLGYucmVxdWlyZSYmKGQub3JpZ2luYWw9Zi5yZXF1aXJlKSxmLnJlcXVpcmU9ZX12YXIgYT0iIixiPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCk7aWYodHlwZW9mIHJlcXVpcmVqcyE9InVuZGVmaW5lZCIpcmV0dXJuO3ZhciBjPWZ1bmN0aW9uKGEsYixkKXtpZih0eXBlb2YgYSE9InN0cmluZyIpe2Mub3JpZ2luYWw/Yy5vcmlnaW5hbC5hcHBseSh3aW5kb3csYXJndW1lbnRzKTooY29uc29sZS5lcnJvcigiZHJvcHBpbmcgbW9kdWxlIGJlY2F1c2UgZGVmaW5lIHdhc24ndCBhIHN0cmluZy4iKSxjb25zb2xlLnRyYWNlKCkpO3JldHVybn1hcmd1bWVudHMubGVuZ3RoPT0yJiYoZD1iKSxjLm1vZHVsZXN8fChjLm1vZHVsZXM9e30pLGMubW9kdWxlc1thXT1kfSxkPWZ1bmN0aW9uKGEsYixjKXtpZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYik9PT0iW29iamVjdCBBcnJheV0iKXt2YXIgZT1bXTtmb3IodmFyIGc9MCxoPWIubGVuZ3RoO2c8aDsrK2cpe3ZhciBpPWYoYSxiW2ddKTtpZighaSYmZC5vcmlnaW5hbClyZXR1cm4gZC5vcmlnaW5hbC5hcHBseSh3aW5kb3csYXJndW1lbnRzKTtlLnB1c2goaSl9YyYmYy5hcHBseShudWxsLGUpfWVsc2V7aWYodHlwZW9mIGI9PSJzdHJpbmciKXt2YXIgaj1mKGEsYik7cmV0dXJuIWomJmQub3JpZ2luYWw/ZC5vcmlnaW5hbC5hcHBseSh3aW5kb3csYXJndW1lbnRzKTooYyYmYygpLGopfWlmKGQub3JpZ2luYWwpcmV0dXJuIGQub3JpZ2luYWwuYXBwbHkod2luZG93LGFyZ3VtZW50cyl9fSxlPWZ1bmN0aW9uKGEsYil7aWYoYi5pbmRleE9mKCIhIikhPT0tMSl7dmFyIGM9Yi5zcGxpdCgiISIpO3JldHVybiBlKGEsY1swXSkrIiEiK2UoYSxjWzFdKX1pZihiLmNoYXJBdCgwKT09Ii4iKXt2YXIgZD1hLnNwbGl0KCIvIikuc2xpY2UoMCwtMSkuam9pbigiLyIpO2I9ZCsiLyIrYjt3aGlsZShiLmluZGV4T2YoIi4iKSE9PS0xJiZmIT1iKXt2YXIgZj1iO2I9Yi5yZXBsYWNlKC9cL1wuXC8vLCIvIikucmVwbGFjZSgvW15cL10rXC9cLlwuXC8vLCIiKX19cmV0dXJuIGJ9LGY9ZnVuY3Rpb24oYSxiKXtiPWUoYSxiKTt2YXIgZj1jLm1vZHVsZXNbYl07aWYoIWYpcmV0dXJuIG51bGw7aWYodHlwZW9mIGY9PSJmdW5jdGlvbiIpe3ZhciBnPXt9LGg9e2lkOmIsdXJpOiIiLGV4cG9ydHM6ZyxwYWNrYWdlZDohMH0saT1mdW5jdGlvbihhLGMpe3JldHVybiBkKGIsYSxjKX0saj1mKGksZyxoKTtyZXR1cm4gZz1qfHxoLmV4cG9ydHMsYy5tb2R1bGVzW2JdPWcsZ31yZXR1cm4gZn07ZyhhKX0pKCksZGVmaW5lKCJhY2UvYWNlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9maXhvbGRicm93c2VycyIsImFjZS9saWIvZG9tIiwiYWNlL2xpYi9ldmVudCIsImFjZS9lZGl0b3IiLCJhY2UvZWRpdF9zZXNzaW9uIiwiYWNlL3VuZG9tYW5hZ2VyIiwiYWNlL3ZpcnR1YWxfcmVuZGVyZXIiLCJhY2UvdGhlbWUvdGV4dG1hdGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiLGEoIi4vbGliL2ZpeG9sZGJyb3dzZXJzIik7dmFyIGQ9YSgiLi9saWIvZG9tIiksZT1hKCIuL2xpYi9ldmVudCIpLGY9YSgiLi9lZGl0b3IiKS5FZGl0b3IsZz1hKCIuL2VkaXRfc2Vzc2lvbiIpLkVkaXRTZXNzaW9uLGg9YSgiLi91bmRvbWFuYWdlciIpLlVuZG9NYW5hZ2VyLGk9YSgiLi92aXJ0dWFsX3JlbmRlcmVyIikuVmlydHVhbFJlbmRlcmVyO2IuZWRpdD1mdW5jdGlvbihiKXt0eXBlb2YgYj09InN0cmluZyImJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt2YXIgYz1uZXcgZyhkLmdldElubmVyVGV4dChiKSk7Yy5zZXRVbmRvTWFuYWdlcihuZXcgaCksYi5pbm5lckhUTUw9IiI7dmFyIGo9bmV3IGYobmV3IGkoYixhKCIuL3RoZW1lL3RleHRtYXRlIikpKTtqLnNldFNlc3Npb24oYyk7dmFyIGs9e307cmV0dXJuIGsuZG9jdW1lbnQ9YyxrLmVkaXRvcj1qLGoucmVzaXplKCksZS5hZGRMaXN0ZW5lcih3aW5kb3csInJlc2l6ZSIsZnVuY3Rpb24oKXtqLnJlc2l6ZSgpfSksYi5lbnY9ayxqLmVudj1rLGp9fSksZGVmaW5lKCJhY2UvbGliL2ZpeG9sZGJyb3dzZXJzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9yZWdleHAiLCJhY2UvbGliL2VzNS1zaGltIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0IixhKCIuL3JlZ2V4cCIpLGEoIi4vZXM1LXNoaW0iKX0pLGRlZmluZSgiYWNlL2xpYi9yZWdleHAiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZyhhKXtyZXR1cm4oYS5nbG9iYWw/ImciOiIiKSsoYS5pZ25vcmVDYXNlPyJpIjoiIikrKGEubXVsdGlsaW5lPyJtIjoiIikrKGEuZXh0ZW5kZWQ/IngiOiIiKSsoYS5zdGlja3k/InkiOiIiKX1mdW5jdGlvbiBoKGEsYixjKXtpZihBcnJheS5wcm90b3R5cGUuaW5kZXhPZilyZXR1cm4gYS5pbmRleE9mKGIsYyk7Zm9yKHZhciBkPWN8fDA7ZDxhLmxlbmd0aDtkKyspaWYoYVtkXT09PWIpcmV0dXJuIGQ7cmV0dXJuLTF9InVzZSBzdHJpY3QiO3ZhciBkPXtleGVjOlJlZ0V4cC5wcm90b3R5cGUuZXhlYyx0ZXN0OlJlZ0V4cC5wcm90b3R5cGUudGVzdCxtYXRjaDpTdHJpbmcucHJvdG90eXBlLm1hdGNoLHJlcGxhY2U6U3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlLHNwbGl0OlN0cmluZy5wcm90b3R5cGUuc3BsaXR9LGU9ZC5leGVjLmNhbGwoLygpPz8vLCIiKVsxXT09PXVuZGVmaW5lZCxmPWZ1bmN0aW9uKCl7dmFyIGE9L14vZztyZXR1cm4gZC50ZXN0LmNhbGwoYSwiIiksIWEubGFzdEluZGV4fSgpO1JlZ0V4cC5wcm90b3R5cGUuZXhlYz1mdW5jdGlvbihhKXt2YXIgYj1kLmV4ZWMuYXBwbHkodGhpcyxhcmd1bWVudHMpLGMsaTtpZihiKXshZSYmYi5sZW5ndGg+MSYmaChiLCIiKT4tMSYmKGk9UmVnRXhwKHRoaXMuc291cmNlLGQucmVwbGFjZS5jYWxsKGcodGhpcyksImciLCIiKSksZC5yZXBsYWNlLmNhbGwoYS5zbGljZShiLmluZGV4KSxpLGZ1bmN0aW9uKCl7Zm9yKHZhciBhPTE7YTxhcmd1bWVudHMubGVuZ3RoLTI7YSsrKWFyZ3VtZW50c1thXT09PXVuZGVmaW5lZCYmKGJbYV09dW5kZWZpbmVkKX0pKTtpZih0aGlzLl94cmVnZXhwJiZ0aGlzLl94cmVnZXhwLmNhcHR1cmVOYW1lcylmb3IodmFyIGo9MTtqPGIubGVuZ3RoO2orKyljPXRoaXMuX3hyZWdleHAuY2FwdHVyZU5hbWVzW2otMV0sYyYmKGJbY109YltqXSk7IWYmJnRoaXMuZ2xvYmFsJiYhYlswXS5sZW5ndGgmJnRoaXMubGFzdEluZGV4PmIuaW5kZXgmJnRoaXMubGFzdEluZGV4LS19cmV0dXJuIGJ9LGZ8fChSZWdFeHAucHJvdG90eXBlLnRlc3Q9ZnVuY3Rpb24oYSl7dmFyIGI9ZC5leGVjLmNhbGwodGhpcyxhKTtyZXR1cm4gYiYmdGhpcy5nbG9iYWwmJiFiWzBdLmxlbmd0aCYmdGhpcy5sYXN0SW5kZXg+Yi5pbmRleCYmdGhpcy5sYXN0SW5kZXgtLSwhIWJ9KX0pLGRlZmluZSgiYWNlL2xpYi9lczUtc2hpbSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBwKGEpe3RyeXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsInNlbnRpbmVsIix7fSksInNlbnRpbmVsImluIGF9Y2F0Y2goYil7fX1GdW5jdGlvbi5wcm90b3R5cGUuYmluZHx8KEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7aWYodHlwZW9mIGIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcjt2YXIgYz1nLmNhbGwoYXJndW1lbnRzLDEpLGQ9ZnVuY3Rpb24oKXtpZih0aGlzIGluc3RhbmNlb2YgZCl7dmFyIGU9ZnVuY3Rpb24oKXt9O2UucHJvdG90eXBlPWIucHJvdG90eXBlO3ZhciBmPW5ldyBlLGg9Yi5hcHBseShmLGMuY29uY2F0KGcuY2FsbChhcmd1bWVudHMpKSk7cmV0dXJuIGghPT1udWxsJiZPYmplY3QoaCk9PT1oP2g6Zn1yZXR1cm4gYi5hcHBseShhLGMuY29uY2F0KGcuY2FsbChhcmd1bWVudHMpKSl9O3JldHVybiBkfSk7dmFyIGQ9RnVuY3Rpb24ucHJvdG90eXBlLmNhbGwsZT1BcnJheS5wcm90b3R5cGUsZj1PYmplY3QucHJvdG90eXBlLGc9ZS5zbGljZSxoPWQuYmluZChmLnRvU3RyaW5nKSxpPWQuYmluZChmLmhhc093blByb3BlcnR5KSxqLGssbCxtLG47aWYobj1pKGYsIl9fZGVmaW5lR2V0dGVyX18iKSlqPWQuYmluZChmLl9fZGVmaW5lR2V0dGVyX18pLGs9ZC5iaW5kKGYuX19kZWZpbmVTZXR0ZXJfXyksbD1kLmJpbmQoZi5fX2xvb2t1cEdldHRlcl9fKSxtPWQuYmluZChmLl9fbG9va3VwU2V0dGVyX18pO0FycmF5LmlzQXJyYXl8fChBcnJheS5pc0FycmF5PWZ1bmN0aW9uKGEpe3JldHVybiBoKGEpPT0iW29iamVjdCBBcnJheV0ifSksQXJyYXkucHJvdG90eXBlLmZvckVhY2h8fChBcnJheS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihhKXt2YXIgYj1HKHRoaXMpLGM9YXJndW1lbnRzWzFdLGQ9MCxlPWIubGVuZ3RoPj4+MDtpZihoKGEpIT0iW29iamVjdCBGdW5jdGlvbl0iKXRocm93IG5ldyBUeXBlRXJyb3I7d2hpbGUoZDxlKWQgaW4gYiYmYS5jYWxsKGMsYltkXSxkLGIpLGQrK30pLEFycmF5LnByb3RvdHlwZS5tYXB8fChBcnJheS5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKGEpe3ZhciBiPUcodGhpcyksYz1iLmxlbmd0aD4+PjAsZD1BcnJheShjKSxlPWFyZ3VtZW50c1sxXTtpZihoKGEpIT0iW29iamVjdCBGdW5jdGlvbl0iKXRocm93IG5ldyBUeXBlRXJyb3I7Zm9yKHZhciBmPTA7ZjxjO2YrKylmIGluIGImJihkW2ZdPWEuY2FsbChlLGJbZl0sZixiKSk7cmV0dXJuIGR9KSxBcnJheS5wcm90b3R5cGUuZmlsdGVyfHwoQXJyYXkucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbihhKXt2YXIgYj1HKHRoaXMpLGM9Yi5sZW5ndGg+Pj4wLGQ9W10sZT1hcmd1bWVudHNbMV07aWYoaChhKSE9IltvYmplY3QgRnVuY3Rpb25dIil0aHJvdyBuZXcgVHlwZUVycm9yO2Zvcih2YXIgZj0wO2Y8YztmKyspZiBpbiBiJiZhLmNhbGwoZSxiW2ZdLGYsYikmJmQucHVzaChiW2ZdKTtyZXR1cm4gZH0pLEFycmF5LnByb3RvdHlwZS5ldmVyeXx8KEFycmF5LnByb3RvdHlwZS5ldmVyeT1mdW5jdGlvbihhKXt2YXIgYj1HKHRoaXMpLGM9Yi5sZW5ndGg+Pj4wLGQ9YXJndW1lbnRzWzFdO2lmKGgoYSkhPSJbb2JqZWN0IEZ1bmN0aW9uXSIpdGhyb3cgbmV3IFR5cGVFcnJvcjtmb3IodmFyIGU9MDtlPGM7ZSsrKWlmKGUgaW4gYiYmIWEuY2FsbChkLGJbZV0sZSxiKSlyZXR1cm4hMTtyZXR1cm4hMH0pLEFycmF5LnByb3RvdHlwZS5zb21lfHwoQXJyYXkucHJvdG90eXBlLnNvbWU9ZnVuY3Rpb24oYSl7dmFyIGI9Ryh0aGlzKSxjPWIubGVuZ3RoPj4+MCxkPWFyZ3VtZW50c1sxXTtpZihoKGEpIT0iW29iamVjdCBGdW5jdGlvbl0iKXRocm93IG5ldyBUeXBlRXJyb3I7Zm9yKHZhciBlPTA7ZTxjO2UrKylpZihlIGluIGImJmEuY2FsbChkLGJbZV0sZSxiKSlyZXR1cm4hMDtyZXR1cm4hMX0pLEFycmF5LnByb3RvdHlwZS5yZWR1Y2V8fChBcnJheS5wcm90b3R5cGUucmVkdWNlPWZ1bmN0aW9uKGEpe3ZhciBiPUcodGhpcyksYz1iLmxlbmd0aD4+PjA7aWYoaChhKSE9IltvYmplY3QgRnVuY3Rpb25dIil0aHJvdyBuZXcgVHlwZUVycm9yO2lmKCFjJiZhcmd1bWVudHMubGVuZ3RoPT0xKXRocm93IG5ldyBUeXBlRXJyb3I7dmFyIGQ9MCxlO2lmKGFyZ3VtZW50cy5sZW5ndGg+PTIpZT1hcmd1bWVudHNbMV07ZWxzZSBkb3tpZihkIGluIGIpe2U9YltkKytdO2JyZWFrfWlmKCsrZD49Yyl0aHJvdyBuZXcgVHlwZUVycm9yfXdoaWxlKCEwKTtmb3IoO2Q8YztkKyspZCBpbiBiJiYoZT1hLmNhbGwodm9pZCAwLGUsYltkXSxkLGIpKTtyZXR1cm4gZX0pLEFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodHx8KEFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodD1mdW5jdGlvbihhKXt2YXIgYj1HKHRoaXMpLGM9Yi5sZW5ndGg+Pj4wO2lmKGgoYSkhPSJbb2JqZWN0IEZ1bmN0aW9uXSIpdGhyb3cgbmV3IFR5cGVFcnJvcjtpZighYyYmYXJndW1lbnRzLmxlbmd0aD09MSl0aHJvdyBuZXcgVHlwZUVycm9yO3ZhciBkLGU9Yy0xO2lmKGFyZ3VtZW50cy5sZW5ndGg+PTIpZD1hcmd1bWVudHNbMV07ZWxzZSBkb3tpZihlIGluIGIpe2Q9YltlLS1dO2JyZWFrfWlmKC0tZTwwKXRocm93IG5ldyBUeXBlRXJyb3J9d2hpbGUoITApO2RvIGUgaW4gdGhpcyYmKGQ9YS5jYWxsKHZvaWQgMCxkLGJbZV0sZSxiKSk7d2hpbGUoZS0tKTtyZXR1cm4gZH0pLEFycmF5LnByb3RvdHlwZS5pbmRleE9mfHwoQXJyYXkucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24oYSl7dmFyIGI9Ryh0aGlzKSxjPWIubGVuZ3RoPj4+MDtpZighYylyZXR1cm4tMTt2YXIgZD0wO2FyZ3VtZW50cy5sZW5ndGg+MSYmKGQ9RShhcmd1bWVudHNbMV0pKSxkPWQ+PTA/ZDpNYXRoLm1heCgwLGMrZCk7Zm9yKDtkPGM7ZCsrKWlmKGQgaW4gYiYmYltkXT09PWEpcmV0dXJuIGQ7cmV0dXJuLTF9KSxBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2Z8fChBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24oYSl7dmFyIGI9Ryh0aGlzKSxjPWIubGVuZ3RoPj4+MDtpZighYylyZXR1cm4tMTt2YXIgZD1jLTE7YXJndW1lbnRzLmxlbmd0aD4xJiYoZD1NYXRoLm1pbihkLEUoYXJndW1lbnRzWzFdKSkpLGQ9ZD49MD9kOmMtTWF0aC5hYnMoZCk7Zm9yKDtkPj0wO2QtLSlpZihkIGluIGImJmE9PT1iW2RdKXJldHVybiBkO3JldHVybi0xfSksT2JqZWN0LmdldFByb3RvdHlwZU9mfHwoT2JqZWN0LmdldFByb3RvdHlwZU9mPWZ1bmN0aW9uKGEpe3JldHVybiBhLl9fcHJvdG9fX3x8KGEuY29uc3RydWN0b3I/YS5jb25zdHJ1Y3Rvci5wcm90b3R5cGU6Zil9KTtpZighT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcil7dmFyIG89Ik9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgY2FsbGVkIG9uIGEgbm9uLW9iamVjdDogIjtPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yPWZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGEhPSJvYmplY3QiJiZ0eXBlb2YgYSE9ImZ1bmN0aW9uInx8YT09PW51bGwpdGhyb3cgbmV3IFR5cGVFcnJvcihvK2EpO2lmKCFpKGEsYikpcmV0dXJuO3ZhciBjLGQsZTtjPXtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH07aWYobil7dmFyIGc9YS5fX3Byb3RvX187YS5fX3Byb3RvX189Zjt2YXIgZD1sKGEsYiksZT1tKGEsYik7YS5fX3Byb3RvX189ZztpZihkfHxlKXJldHVybiBkJiYoYy5nZXQ9ZCksZSYmKGMuc2V0PWUpLGN9cmV0dXJuIGMudmFsdWU9YVtiXSxjfX1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc3x8KE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3Qua2V5cyhhKX0pLE9iamVjdC5jcmVhdGV8fChPYmplY3QuY3JlYXRlPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYT09PW51bGwpYz17Il9fcHJvdG9fXyI6bnVsbH07ZWxzZXtpZih0eXBlb2YgYSE9Im9iamVjdCIpdGhyb3cgbmV3IFR5cGVFcnJvcigidHlwZW9mIHByb3RvdHlwZVsiK3R5cGVvZiBhKyJdICE9ICdvYmplY3QnIik7dmFyIGQ9ZnVuY3Rpb24oKXt9O2QucHJvdG90eXBlPWEsYz1uZXcgZCxjLl9fcHJvdG9fXz1hfXJldHVybiBiIT09dm9pZCAwJiZPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjLGIpLGN9KTtpZihPYmplY3QuZGVmaW5lUHJvcGVydHkpe3ZhciBxPXAoe30pLHI9dHlwZW9mIGRvY3VtZW50PT0idW5kZWZpbmVkInx8cChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSk7aWYoIXF8fCFyKXZhciBzPU9iamVjdC5kZWZpbmVQcm9wZXJ0eX1pZighT2JqZWN0LmRlZmluZVByb3BlcnR5fHxzKXt2YXIgdD0iUHJvcGVydHkgZGVzY3JpcHRpb24gbXVzdCBiZSBhbiBvYmplY3Q6ICIsdT0iT2JqZWN0LmRlZmluZVByb3BlcnR5IGNhbGxlZCBvbiBub24tb2JqZWN0OiAiLHY9ImdldHRlcnMgJiBzZXR0ZXJzIGNhbiBub3QgYmUgZGVmaW5lZCBvbiB0aGlzIGphdmFzY3JpcHQgZW5naW5lIjtPYmplY3QuZGVmaW5lUHJvcGVydHk9ZnVuY3Rpb24oYSxiLGMpe2lmKHR5cGVvZiBhIT0ib2JqZWN0IiYmdHlwZW9mIGEhPSJmdW5jdGlvbiJ8fGE9PT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IodSthKTtpZih0eXBlb2YgYyE9Im9iamVjdCImJnR5cGVvZiBjIT0iZnVuY3Rpb24ifHxjPT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKHQrYyk7aWYocyl0cnl7cmV0dXJuIHMuY2FsbChPYmplY3QsYSxiLGMpfWNhdGNoKGQpe31pZihpKGMsInZhbHVlIikpaWYobiYmKGwoYSxiKXx8bShhLGIpKSl7dmFyIGU9YS5fX3Byb3RvX187YS5fX3Byb3RvX189ZixkZWxldGUgYVtiXSxhW2JdPWMudmFsdWUsYS5fX3Byb3RvX189ZX1lbHNlIGFbYl09Yy52YWx1ZTtlbHNle2lmKCFuKXRocm93IG5ldyBUeXBlRXJyb3Iodik7aShjLCJnZXQiKSYmaihhLGIsYy5nZXQpLGkoYywic2V0IikmJmsoYSxiLGMuc2V0KX1yZXR1cm4gYX19T2JqZWN0LmRlZmluZVByb3BlcnRpZXN8fChPYmplY3QuZGVmaW5lUHJvcGVydGllcz1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyBpbiBiKWkoYixjKSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsYyxiW2NdKTtyZXR1cm4gYX0pLE9iamVjdC5zZWFsfHwoT2JqZWN0LnNlYWw9ZnVuY3Rpb24oYSl7cmV0dXJuIGF9KSxPYmplY3QuZnJlZXplfHwoT2JqZWN0LmZyZWV6ZT1mdW5jdGlvbihhKXtyZXR1cm4gYX0pO3RyeXtPYmplY3QuZnJlZXplKGZ1bmN0aW9uKCl7fSl9Y2F0Y2godyl7T2JqZWN0LmZyZWV6ZT1mdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24gYihiKXtyZXR1cm4gdHlwZW9mIGI9PSJmdW5jdGlvbiI/YjphKGIpfX0oT2JqZWN0LmZyZWV6ZSl9T2JqZWN0LnByZXZlbnRFeHRlbnNpb25zfHwoT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zPWZ1bmN0aW9uKGEpe3JldHVybiBhfSksT2JqZWN0LmlzU2VhbGVkfHwoT2JqZWN0LmlzU2VhbGVkPWZ1bmN0aW9uKGEpe3JldHVybiExfSksT2JqZWN0LmlzRnJvemVufHwoT2JqZWN0LmlzRnJvemVuPWZ1bmN0aW9uKGEpe3JldHVybiExfSksT2JqZWN0LmlzRXh0ZW5zaWJsZXx8KE9iamVjdC5pc0V4dGVuc2libGU9ZnVuY3Rpb24oYSl7aWYoT2JqZWN0KGEpPT09YSl0aHJvdyBuZXcgVHlwZUVycm9yO3ZhciBiPSIiO3doaWxlKGkoYSxiKSliKz0iPyI7YVtiXT0hMDt2YXIgYz1pKGEsYik7cmV0dXJuIGRlbGV0ZSBhW2JdLGN9KTtpZighT2JqZWN0LmtleXMpe3ZhciB4PSEwLHk9WyJ0b1N0cmluZyIsInRvTG9jYWxlU3RyaW5nIiwidmFsdWVPZiIsImhhc093blByb3BlcnR5IiwiaXNQcm90b3R5cGVPZiIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwiY29uc3RydWN0b3IiXSx6PXkubGVuZ3RoO2Zvcih2YXIgQSBpbnt0b1N0cmluZzpudWxsfSl4PSExO09iamVjdC5rZXlzPWZ1bmN0aW9uIGJkKGEpe2lmKHR5cGVvZiBhIT0ib2JqZWN0IiYmdHlwZW9mIGEhPSJmdW5jdGlvbiJ8fGE9PT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdC5rZXlzIGNhbGxlZCBvbiBhIG5vbi1vYmplY3QiKTt2YXIgYmQ9W107Zm9yKHZhciBiIGluIGEpaShhLGIpJiZiZC5wdXNoKGIpO2lmKHgpZm9yKHZhciBjPTAsZD16O2M8ZDtjKyspe3ZhciBlPXlbY107aShhLGUpJiZiZC5wdXNoKGUpfXJldHVybiBiZH19aWYoIURhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nfHwobmV3IERhdGUoLTYyMTk4NzU1MmU1KSkudG9JU09TdHJpbmcoKS5pbmRleE9mKCItMDAwMDAxIik9PT0tMSlEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZz1mdW5jdGlvbigpe3ZhciBhLGIsYyxkO2lmKCFpc0Zpbml0ZSh0aGlzKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcjthPVt0aGlzLmdldFVUQ01vbnRoKCkrMSx0aGlzLmdldFVUQ0RhdGUoKSx0aGlzLmdldFVUQ0hvdXJzKCksdGhpcy5nZXRVVENNaW51dGVzKCksdGhpcy5nZXRVVENTZWNvbmRzKCldLGQ9dGhpcy5nZXRVVENGdWxsWWVhcigpLGQ9KGQ8MD8iLSI6ZD45OTk5PyIrIjoiIikrKCIwMDAwMCIrTWF0aC5hYnMoZCkpLnNsaWNlKDA8PWQmJmQ8PTk5OTk/LTQ6LTYpLGI9YS5sZW5ndGg7d2hpbGUoYi0tKWM9YVtiXSxjPDEwJiYoYVtiXT0iMCIrYyk7cmV0dXJuIGQrIi0iK2Euc2xpY2UoMCwyKS5qb2luKCItIikrIlQiK2Euc2xpY2UoMikuam9pbigiOiIpKyIuIisoIjAwMCIrdGhpcy5nZXRVVENNaWxsaXNlY29uZHMoKSkuc2xpY2UoLTMpKyJaIn07RGF0ZS5ub3d8fChEYXRlLm5vdz1mdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfSksRGF0ZS5wcm90b3R5cGUudG9KU09OfHwoRGF0ZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKGEpe2lmKHR5cGVvZiB0aGlzLnRvSVNPU3RyaW5nIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3I7cmV0dXJuIHRoaXMudG9JU09TdHJpbmcoKX0pLERhdGUucGFyc2UoIisyNzU3NjAtMDktMTNUMDA6MDA6MDAuMDAwWiIpIT09ODY0ZTEzJiYoRGF0ZT1mdW5jdGlvbihhKXt2YXIgYj1mdW5jdGlvbiBlKGIsYyxkLGYsZyxoLGkpe3ZhciBqPWFyZ3VtZW50cy5sZW5ndGg7aWYodGhpcyBpbnN0YW5jZW9mIGEpe3ZhciBrPWo9PTEmJlN0cmluZyhiKT09PWI/bmV3IGEoZS5wYXJzZShiKSk6aj49Nz9uZXcgYShiLGMsZCxmLGcsaCxpKTpqPj02P25ldyBhKGIsYyxkLGYsZyxoKTpqPj01P25ldyBhKGIsYyxkLGYsZyk6aj49ND9uZXcgYShiLGMsZCxmKTpqPj0zP25ldyBhKGIsYyxkKTpqPj0yP25ldyBhKGIsYyk6aj49MT9uZXcgYShiKTpuZXcgYTtyZXR1cm4gay5jb25zdHJ1Y3Rvcj1lLGt9cmV0dXJuIGEuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxjPW5ldyBSZWdFeHAoIl4oXFxkezR9fFsrLV1cXGR7Nn0pKD86LShcXGR7Mn0pKD86LShcXGR7Mn0pKD86VChcXGR7Mn0pOihcXGR7Mn0pKD86OihcXGR7Mn0pKD86XFwuKFxcZHszfSkpPyk/KD86WnwoPzooWy0rXSkoXFxkezJ9KTooXFxkezJ9KSkpPyk/KT8pPyQiKTtmb3IodmFyIGQgaW4gYSliW2RdPWFbZF07cmV0dXJuIGIubm93PWEubm93LGIuVVRDPWEuVVRDLGIucHJvdG90eXBlPWEucHJvdG90eXBlLGIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWIsYi5wYXJzZT1mdW5jdGlvbiBmKGIpe3ZhciBkPWMuZXhlYyhiKTtpZihkKXtkLnNoaWZ0KCk7Zm9yKHZhciBlPTE7ZTw3O2UrKylkW2VdPSsoZFtlXXx8KGU8Mz8xOjApKSxlPT0xJiZkW2VdLS07dmFyIGY9K2QucG9wKCksZz0rZC5wb3AoKSxoPWQucG9wKCksaT0wO2lmKGgpe2lmKGc+MjN8fGY+NTkpcmV0dXJuIE5hTjtpPShnKjYwK2YpKjZlNCooaD09IisiPy0xOjEpfXZhciBqPStkWzBdO3JldHVybiAwPD1qJiZqPD05OT8oZFswXT1qKzQwMCxhLlVUQy5hcHBseSh0aGlzLGQpK2ktMTI2MjI3ODA4ZTUpOmEuVVRDLmFwcGx5KHRoaXMsZCkraX1yZXR1cm4gYS5wYXJzZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGJ9KERhdGUpKTt2YXIgQj0iXHRcbgtcZlxyIMKg4ZqA4aCO4oCA4oCB4oCC4oCD4oCE4oCF4oCG4oCH4oCI4oCJ4oCK4oCv4oGf44CAXHUyMDI4XHUyMDI577u/IjtpZighU3RyaW5nLnByb3RvdHlwZS50cmltfHxCLnRyaW0oKSl7Qj0iWyIrQisiXSI7dmFyIEM9bmV3IFJlZ0V4cCgiXiIrQitCKyIqIiksRD1uZXcgUmVnRXhwKEIrQisiKiQiKTtTdHJpbmcucHJvdG90eXBlLnRyaW09ZnVuY3Rpb24oKXtyZXR1cm4gU3RyaW5nKHRoaXMpLnJlcGxhY2UoQywiIikucmVwbGFjZShELCIiKX19dmFyIEU9ZnVuY3Rpb24oYSl7cmV0dXJuIGE9K2EsYSE9PWE/YT0wOmEhPT0wJiZhIT09MS8wJiZhIT09LUluZmluaXR5JiYoYT0oYT4wfHwtMSkqTWF0aC5mbG9vcihNYXRoLmFicyhhKSkpLGF9LEY9ImEiWzBdIT0iYSIsRz1mdW5jdGlvbihhKXtpZihhPT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3I7cmV0dXJuIEYmJnR5cGVvZiBhPT0ic3RyaW5nIiYmYT9hLnNwbGl0KCIiKTpPYmplY3QoYSl9fSksZGVmaW5lKCJhY2UvbGliL2RvbSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiO2IuY3JlYXRlRWxlbWVudD1mdW5jdGlvbihhLGIpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlM/ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGJ8fGQsYSk6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChhKX0sYi5zZXRUZXh0PWZ1bmN0aW9uKGEsYil7YS5pbm5lclRleHQhPT11bmRlZmluZWQmJihhLmlubmVyVGV4dD1iKSxhLnRleHRDb250ZW50IT09dW5kZWZpbmVkJiYoYS50ZXh0Q29udGVudD1iKX0sYi5oYXNDc3NDbGFzcz1mdW5jdGlvbihhLGIpe3ZhciBjPWEuY2xhc3NOYW1lLnNwbGl0KC9ccysvZyk7cmV0dXJuIGMuaW5kZXhPZihiKSE9PS0xfSxiLmFkZENzc0NsYXNzPWZ1bmN0aW9uKGEsYyl7Yi5oYXNDc3NDbGFzcyhhLGMpfHwoYS5jbGFzc05hbWUrPSIgIitjKX0sYi5yZW1vdmVDc3NDbGFzcz1mdW5jdGlvbihhLGIpe3ZhciBjPWEuY2xhc3NOYW1lLnNwbGl0KC9ccysvZyk7Zm9yKDs7KXt2YXIgZD1jLmluZGV4T2YoYik7aWYoZD09LTEpYnJlYWs7Yy5zcGxpY2UoZCwxKX1hLmNsYXNzTmFtZT1jLmpvaW4oIiAiKX0sYi50b2dnbGVDc3NDbGFzcz1mdW5jdGlvbihhLGIpe3ZhciBjPWEuY2xhc3NOYW1lLnNwbGl0KC9ccysvZyksZD0hMDtmb3IoOzspe3ZhciBlPWMuaW5kZXhPZihiKTtpZihlPT0tMSlicmVhaztkPSExLGMuc3BsaWNlKGUsMSl9cmV0dXJuIGQmJmMucHVzaChiKSxhLmNsYXNzTmFtZT1jLmpvaW4oIiAiKSxkfSxiLnNldENzc0NsYXNzPWZ1bmN0aW9uKGEsYyxkKXtkP2IuYWRkQ3NzQ2xhc3MoYSxjKTpiLnJlbW92ZUNzc0NsYXNzKGEsYyl9LGIuaGFzQ3NzU3RyaW5nPWZ1bmN0aW9uKGEsYil7dmFyIGM9MCxkO2I9Ynx8ZG9jdW1lbnQ7aWYoYi5jcmVhdGVTdHlsZVNoZWV0JiYoZD1iLnN0eWxlU2hlZXRzKSl7d2hpbGUoYzxkLmxlbmd0aClpZihkW2MrK10udGl0bGU9PT1hKXJldHVybiEwfWVsc2UgaWYoZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzdHlsZSIpKXdoaWxlKGM8ZC5sZW5ndGgpaWYoZFtjKytdLmlkPT09YSlyZXR1cm4hMDtyZXR1cm4hMX0sYi5pbXBvcnRDc3NTdHJpbmc9ZnVuY3Rpb24gZShhLGMsZSl7ZT1lfHxkb2N1bWVudDtpZihjJiZiLmhhc0Nzc1N0cmluZyhjLGUpKXJldHVybiBudWxsO3ZhciBmO2lmKGUuY3JlYXRlU3R5bGVTaGVldClmPWUuY3JlYXRlU3R5bGVTaGVldCgpLGYuY3NzVGV4dD1hLGMmJihmLnRpdGxlPWMpO2Vsc2V7Zj1lLmNyZWF0ZUVsZW1lbnROUz9lLmNyZWF0ZUVsZW1lbnROUyhkLCJzdHlsZSIpOmUuY3JlYXRlRWxlbWVudCgic3R5bGUiKSxmLmFwcGVuZENoaWxkKGUuY3JlYXRlVGV4dE5vZGUoYSkpLGMmJihmLmlkPWMpO3ZhciBnPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8ZS5kb2N1bWVudEVsZW1lbnQ7Zy5hcHBlbmRDaGlsZChmKX19LGIuaW1wb3J0Q3NzU3R5bHNoZWV0PWZ1bmN0aW9uKGEsYyl7aWYoYy5jcmVhdGVTdHlsZVNoZWV0KWMuY3JlYXRlU3R5bGVTaGVldChhKTtlbHNle3ZhciBkPWIuY3JlYXRlRWxlbWVudCgibGluayIpO2QucmVsPSJzdHlsZXNoZWV0IixkLmhyZWY9YTt2YXIgZT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGMuZG9jdW1lbnRFbGVtZW50O2UuYXBwZW5kQ2hpbGQoZCl9fSxiLmdldElubmVyV2lkdGg9ZnVuY3Rpb24oYSl7cmV0dXJuIHBhcnNlSW50KGIuY29tcHV0ZWRTdHlsZShhLCJwYWRkaW5nTGVmdCIpLDEwKStwYXJzZUludChiLmNvbXB1dGVkU3R5bGUoYSwicGFkZGluZ1JpZ2h0IiksMTApK2EuY2xpZW50V2lkdGh9LGIuZ2V0SW5uZXJIZWlnaHQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHBhcnNlSW50KGIuY29tcHV0ZWRTdHlsZShhLCJwYWRkaW5nVG9wIiksMTApK3BhcnNlSW50KGIuY29tcHV0ZWRTdHlsZShhLCJwYWRkaW5nQm90dG9tIiksMTApK2EuY2xpZW50SGVpZ2h0fSx3aW5kb3cucGFnZVlPZmZzZXQhPT11bmRlZmluZWQ/KGIuZ2V0UGFnZVNjcm9sbFRvcD1mdW5jdGlvbigpe3JldHVybiB3aW5kb3cucGFnZVlPZmZzZXR9LGIuZ2V0UGFnZVNjcm9sbExlZnQ9ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LnBhZ2VYT2Zmc2V0fSk6KGIuZ2V0UGFnZVNjcm9sbFRvcD1mdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcH0sYi5nZXRQYWdlU2Nyb2xsTGVmdD1mdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnR9KSx3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZT9iLmNvbXB1dGVkU3R5bGU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj8od2luZG93LmdldENvbXB1dGVkU3R5bGUoYSwiIil8fHt9KVtiXXx8IiI6d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSwiIil8fHt9fTpiLmNvbXB1dGVkU3R5bGU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj9hLmN1cnJlbnRTdHlsZVtiXTphLmN1cnJlbnRTdHlsZX0sYi5zY3JvbGxiYXJXaWR0aD1mdW5jdGlvbihhKXt2YXIgYz1iLmNyZWF0ZUVsZW1lbnQoInAiKTtjLnN0eWxlLndpZHRoPSIxMDAlIixjLnN0eWxlLm1pbldpZHRoPSIwcHgiLGMuc3R5bGUuaGVpZ2h0PSIyMDBweCI7dmFyIGQ9Yi5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWQuc3R5bGU7ZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGUubGVmdD0iLTEwMDAwcHgiLGUub3ZlcmZsb3c9ImhpZGRlbiIsZS53aWR0aD0iMjAwcHgiLGUubWluV2lkdGg9IjBweCIsZS5oZWlnaHQ9IjE1MHB4IixkLmFwcGVuZENoaWxkKGMpO3ZhciBmPWEuYm9keXx8YS5kb2N1bWVudEVsZW1lbnQ7Zi5hcHBlbmRDaGlsZChkKTt2YXIgZz1jLm9mZnNldFdpZHRoO2Uub3ZlcmZsb3c9InNjcm9sbCI7dmFyIGg9Yy5vZmZzZXRXaWR0aDtyZXR1cm4gZz09aCYmKGg9ZC5jbGllbnRXaWR0aCksZi5yZW1vdmVDaGlsZChkKSxnLWh9LGIuc2V0SW5uZXJIdG1sPWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5jbG9uZU5vZGUoITEpO3JldHVybiBjLmlubmVySFRNTD1iLGEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoYyxhKSxjfSxiLnNldElubmVyVGV4dD1mdW5jdGlvbihhLGIpe3ZhciBjPWEub3duZXJEb2N1bWVudDtjLmJvZHkmJiJ0ZXh0Q29udGVudCJpbiBjLmJvZHk/YS50ZXh0Q29udGVudD1iOmEuaW5uZXJUZXh0PWJ9LGIuZ2V0SW5uZXJUZXh0PWZ1bmN0aW9uKGEpe3ZhciBiPWEub3duZXJEb2N1bWVudDtyZXR1cm4gYi5ib2R5JiYidGV4dENvbnRlbnQiaW4gYi5ib2R5P2EudGV4dENvbnRlbnQ6YS5pbm5lclRleHR8fGEudGV4dENvbnRlbnR8fCIifSxiLmdldFBhcmVudFdpbmRvdz1mdW5jdGlvbihhKXtyZXR1cm4gYS5kZWZhdWx0Vmlld3x8YS5wYXJlbnRXaW5kb3d9fSksZGVmaW5lKCJhY2UvbGliL2V2ZW50IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9rZXlzIiwiYWNlL2xpYi91c2VyYWdlbnQiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBnKGEsYixjKXt2YXIgZj0wO2UuaXNPcGVyYSYmZS5pc01hYz9mPTB8KGIubWV0YUtleT8xOjApfChiLmFsdEtleT8yOjApfChiLnNoaWZ0S2V5PzQ6MCl8KGIuY3RybEtleT84OjApOmY9MHwoYi5jdHJsS2V5PzE6MCl8KGIuYWx0S2V5PzI6MCl8KGIuc2hpZnRLZXk/NDowKXwoYi5tZXRhS2V5Pzg6MCk7aWYoYyBpbiBkLk1PRElGSUVSX0tFWVMpe3N3aXRjaChkLk1PRElGSUVSX0tFWVNbY10pe2Nhc2UiQWx0IjpmPTI7YnJlYWs7Y2FzZSJTaGlmdCI6Zj00O2JyZWFrO2Nhc2UiQ3RybCI6Zj0xO2JyZWFrO2RlZmF1bHQ6Zj04fWM9MH1yZXR1cm4gZiY4JiYoYz09OTF8fGM9PTkzKSYmKGM9MCksISFmfHxjIGluIGQuRlVOQ1RJT05fS0VZU3x8YyBpbiBkLlBSSU5UQUJMRV9LRVlTP2EoYixmLGMpOiExfSJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuL2tleXMiKSxlPWEoIi4vdXNlcmFnZW50IiksZj1hKCIuL2RvbSIpO2IuYWRkTGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe2lmKGEuYWRkRXZlbnRMaXN0ZW5lcilyZXR1cm4gYS5hZGRFdmVudExpc3RlbmVyKGIsYywhMSk7aWYoYS5hdHRhY2hFdmVudCl7dmFyIGQ9ZnVuY3Rpb24oKXtjKHdpbmRvdy5ldmVudCl9O2MuX3dyYXBwZXI9ZCxhLmF0dGFjaEV2ZW50KCJvbiIrYixkKX19LGIucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucmVtb3ZlRXZlbnRMaXN0ZW5lcilyZXR1cm4gYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYywhMSk7YS5kZXRhY2hFdmVudCYmYS5kZXRhY2hFdmVudCgib24iK2IsYy5fd3JhcHBlcnx8Yyl9LGIuc3RvcEV2ZW50PWZ1bmN0aW9uKGEpe3JldHVybiBiLnN0b3BQcm9wYWdhdGlvbihhKSxiLnByZXZlbnREZWZhdWx0KGEpLCExfSxiLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbj9hLnN0b3BQcm9wYWdhdGlvbigpOmEuY2FuY2VsQnViYmxlPSEwfSxiLnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKGEpe2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9LGIuZ2V0RG9jdW1lbnRYPWZ1bmN0aW9uKGEpe3JldHVybiBhLmNsaWVudFg/YS5jbGllbnRYK2YuZ2V0UGFnZVNjcm9sbExlZnQoKTphLnBhZ2VYfSxiLmdldERvY3VtZW50WT1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGllbnRZP2EuY2xpZW50WStmLmdldFBhZ2VTY3JvbGxUb3AoKTphLnBhZ2VZfSxiLmdldEJ1dHRvbj1mdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT0iZGJsY2xpY2siPzA6YS50eXBlPT0iY29udGV4dG1lbnUiPzI6YS5wcmV2ZW50RGVmYXVsdD9hLmJ1dHRvbjp7MTowLDI6Miw0OjF9W2EuYnV0dG9uXX0sZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNldENhcHR1cmU/Yi5jYXB0dXJlPWZ1bmN0aW9uKGEsYyxkKXtmdW5jdGlvbiBlKGEpe3JldHVybiBjKGEpLGIuc3RvcFByb3BhZ2F0aW9uKGEpfWZ1bmN0aW9uIGcoZSl7YyhlKSxmfHwoZj0hMCxkKGUpKSxiLnJlbW92ZUxpc3RlbmVyKGEsIm1vdXNlbW92ZSIsYyksYi5yZW1vdmVMaXN0ZW5lcihhLCJtb3VzZXVwIixnKSxiLnJlbW92ZUxpc3RlbmVyKGEsImxvc2VjYXB0dXJlIixnKSxhLnJlbGVhc2VDYXB0dXJlKCl9dmFyIGY9ITE7Yi5hZGRMaXN0ZW5lcihhLCJtb3VzZW1vdmUiLGMpLGIuYWRkTGlzdGVuZXIoYSwibW91c2V1cCIsZyksYi5hZGRMaXN0ZW5lcihhLCJsb3NlY2FwdHVyZSIsZyksYS5zZXRDYXB0dXJlKCl9OmIuY2FwdHVyZT1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXtiKGEpLGEuc3RvcFByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gZShhKXtiJiZiKGEpLGMmJmMoYSksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixkLCEwKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIixlLCEwKSxhLnN0b3BQcm9wYWdhdGlvbigpfWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsZCwhMCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsZSwhMCl9LGIuYWRkTW91c2VXaGVlbExpc3RlbmVyPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9MCxlPWZ1bmN0aW9uKGEpe2lmKGEud2hlZWxEZWx0YSE9PXVuZGVmaW5lZCl7TWF0aC5hYnMoYS53aGVlbERlbHRhWSk+ZCYmKGQ9TWF0aC5hYnMoYS53aGVlbERlbHRhWSkpO2lmKGQ+NWUzKXZhciBiPTQwMDtlbHNlIHZhciBiPTg7YS53aGVlbERlbHRhWCE9PXVuZGVmaW5lZD8oYS53aGVlbFg9LWEud2hlZWxEZWx0YVgvYixhLndoZWVsWT0tYS53aGVlbERlbHRhWS9iKTooYS53aGVlbFg9MCxhLndoZWVsWT0tYS53aGVlbERlbHRhL2IpfWVsc2UgYS5heGlzJiZhLmF4aXM9PWEuSE9SSVpPTlRBTF9BWElTPyhhLndoZWVsWD0oYS5kZXRhaWx8fDApKjUsYS53aGVlbFk9MCk6KGEud2hlZWxYPTAsYS53aGVlbFk9KGEuZGV0YWlsfHwwKSo1KTtjKGEpfTtiLmFkZExpc3RlbmVyKGEsIkRPTU1vdXNlU2Nyb2xsIixlKSxiLmFkZExpc3RlbmVyKGEsIm1vdXNld2hlZWwiLGUpfSxiLmFkZE11bHRpTW91c2VEb3duTGlzdGVuZXI9ZnVuY3Rpb24oYSxjLGQsZixnKXt2YXIgaD0wLGksaixrPWZ1bmN0aW9uKGEpe2grPTEsaD09MSYmKGk9YS5jbGllbnRYLGo9YS5jbGllbnRZLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtoPTB9LGZ8fDYwMCkpO3ZhciBlPWIuZ2V0QnV0dG9uKGEpPT1jO2lmKCFlfHxNYXRoLmFicyhhLmNsaWVudFgtaSk+NXx8TWF0aC5hYnMoYS5jbGllbnRZLWopPjUpaD0wO2g9PWQmJihoPTAsZyhhKSk7aWYoZSlyZXR1cm4gYi5wcmV2ZW50RGVmYXVsdChhKX07Yi5hZGRMaXN0ZW5lcihhLCJtb3VzZWRvd24iLGspLGUuaXNPbGRJRSYmYi5hZGRMaXN0ZW5lcihhLCJkYmxjbGljayIsayl9LGIuYWRkQ29tbWFuZEtleUxpc3RlbmVyPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9Yi5hZGRMaXN0ZW5lcjtpZihlLmlzT2xkR2Vja298fGUuaXNPcGVyYSl7dmFyIGY9bnVsbDtkKGEsImtleWRvd24iLGZ1bmN0aW9uKGEpe2Y9YS5rZXlDb2RlfSksZChhLCJrZXlwcmVzcyIsZnVuY3Rpb24oYSl7cmV0dXJuIGcoYyxhLGYpfSl9ZWxzZXt2YXIgaD1udWxsO2QoYSwia2V5ZG93biIsZnVuY3Rpb24oYSl7cmV0dXJuIGg9YS5rZXlJZGVudGlmaWVyfHxhLmtleUNvZGUsZyhjLGEsYS5rZXlDb2RlKX0pfX07aWYod2luZG93LnBvc3RNZXNzYWdlKXt2YXIgaD0xO2IubmV4dFRpY2s9ZnVuY3Rpb24oYSxjKXtjPWN8fHdpbmRvdzt2YXIgZD0iemVyby10aW1lb3V0LW1lc3NhZ2UtIitoO2IuYWRkTGlzdGVuZXIoYywibWVzc2FnZSIsZnVuY3Rpb24gZShmKXtmLmRhdGE9PWQmJihiLnN0b3BQcm9wYWdhdGlvbihmKSxiLnJlbW92ZUxpc3RlbmVyKGMsIm1lc3NhZ2UiLGUpLGEoKSl9KSxjLnBvc3RNZXNzYWdlKGQsIioiKX19ZWxzZSBiLm5leHRUaWNrPWZ1bmN0aW9uKGEsYil7Yj1ifHx3aW5kb3csd2luZG93LnNldFRpbWVvdXQoYSwwKX19KSxkZWZpbmUoImFjZS9saWIva2V5cyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuL29vcCIpLGU9ZnVuY3Rpb24oKXt2YXIgYT17TU9ESUZJRVJfS0VZUzp7MTY6IlNoaWZ0IiwxNzoiQ3RybCIsMTg6IkFsdCIsMjI0OiJNZXRhIn0sS0VZX01PRFM6e2N0cmw6MSxhbHQ6MixvcHRpb246MixzaGlmdDo0LG1ldGE6OCxjb21tYW5kOjh9LEZVTkNUSU9OX0tFWVM6ezg6IkJhY2tzcGFjZSIsOToiVGFiIiwxMzoiUmV0dXJuIiwxOToiUGF1c2UiLDI3OiJFc2MiLDMyOiJTcGFjZSIsMzM6IlBhZ2VVcCIsMzQ6IlBhZ2VEb3duIiwzNToiRW5kIiwzNjoiSG9tZSIsMzc6IkxlZnQiLDM4OiJVcCIsMzk6IlJpZ2h0Iiw0MDoiRG93biIsNDQ6IlByaW50Iiw0NToiSW5zZXJ0Iiw0NjoiRGVsZXRlIiw5NjoiTnVtcGFkMCIsOTc6Ik51bXBhZDEiLDk4OiJOdW1wYWQyIiw5OToiTnVtcGFkMyIsMTAwOiJOdW1wYWQ0IiwxMDE6Ik51bXBhZDUiLDEwMjoiTnVtcGFkNiIsMTAzOiJOdW1wYWQ3IiwxMDQ6Ik51bXBhZDgiLDEwNToiTnVtcGFkOSIsMTEyOiJGMSIsMTEzOiJGMiIsMTE0OiJGMyIsMTE1OiJGNCIsMTE2OiJGNSIsMTE3OiJGNiIsMTE4OiJGNyIsMTE5OiJGOCIsMTIwOiJGOSIsMTIxOiJGMTAiLDEyMjoiRjExIiwxMjM6IkYxMiIsMTQ0OiJOdW1sb2NrIiwxNDU6IlNjcm9sbGxvY2sifSxQUklOVEFCTEVfS0VZUzp7MzI6IiAiLDQ4OiIwIiw0OToiMSIsNTA6IjIiLDUxOiIzIiw1MjoiNCIsNTM6IjUiLDU0OiI2Iiw1NToiNyIsNTY6IjgiLDU3OiI5Iiw1OToiOyIsNjE6Ij0iLDY1OiJhIiw2NjoiYiIsNjc6ImMiLDY4OiJkIiw2OToiZSIsNzA6ImYiLDcxOiJnIiw3MjoiaCIsNzM6ImkiLDc0OiJqIiw3NToiayIsNzY6ImwiLDc3OiJtIiw3ODoibiIsNzk6Im8iLDgwOiJwIiw4MToicSIsODI6InIiLDgzOiJzIiw4NDoidCIsODU6InUiLDg2OiJ2Iiw4NzoidyIsODg6IngiLDg5OiJ5Iiw5MDoieiIsMTA3OiIrIiwxMDk6Ii0iLDExMDoiLiIsMTg4OiIsIiwxOTA6Ii4iLDE5MToiLyIsMTkyOiJgIiwyMTk6IlsiLDIyMDoiXFwiLDIyMToiXSIsMjIyOiciJ319O2Zvcih2YXIgYiBpbiBhLkZVTkNUSU9OX0tFWVMpe3ZhciBjPWEuRlVOQ1RJT05fS0VZU1tiXS50b1VwcGVyQ2FzZSgpO2FbY109cGFyc2VJbnQoYiwxMCl9cmV0dXJuIGQubWl4aW4oYSxhLk1PRElGSUVSX0tFWVMpLGQubWl4aW4oYSxhLlBSSU5UQUJMRV9LRVlTKSxkLm1peGluKGEsYS5GVU5DVElPTl9LRVlTKSxhfSgpO2QubWl4aW4oYixlKSxiLmtleUNvZGVUb1N0cmluZz1mdW5jdGlvbihhKXtyZXR1cm4oZVthXXx8U3RyaW5nLmZyb21DaGFyQ29kZShhKSkudG9Mb3dlckNhc2UoKX19KSxkZWZpbmUoImFjZS9saWIvb29wIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0IixiLmluaGVyaXRzPWZ1bmN0aW9uKCl7dmFyIGE9ZnVuY3Rpb24oKXt9O3JldHVybiBmdW5jdGlvbihiLGMpe2EucHJvdG90eXBlPWMucHJvdG90eXBlLGIuc3VwZXJfPWMucHJvdG90eXBlLGIucHJvdG90eXBlPW5ldyBhLGIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWJ9fSgpLGIubWl4aW49ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGMgaW4gYilhW2NdPWJbY119LGIuaW1wbGVtZW50PWZ1bmN0aW9uKGEsYyl7Yi5taXhpbihhLGMpfX0pLGRlZmluZSgiYWNlL2xpYi91c2VyYWdlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPShuYXZpZ2F0b3IucGxhdGZvcm0ubWF0Y2goL21hY3x3aW58bGludXgvaSl8fFsib3RoZXIiXSlbMF0udG9Mb3dlckNhc2UoKSxlPW5hdmlnYXRvci51c2VyQWdlbnQ7Yi5pc1dpbj1kPT0id2luIixiLmlzTWFjPWQ9PSJtYWMiLGIuaXNMaW51eD1kPT0ibGludXgiLGIuaXNJRT1uYXZpZ2F0b3IuYXBwTmFtZT09Ik1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciImJnBhcnNlRmxvYXQobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTVNJRSAoWzAtOV0rW1wuMC05XSspLylbMV0pLGIuaXNPbGRJRT1iLmlzSUUmJmIuaXNJRTw5LGIuaXNHZWNrbz1iLmlzTW96aWxsYT13aW5kb3cuY29udHJvbGxlcnMmJndpbmRvdy5uYXZpZ2F0b3IucHJvZHVjdD09PSJHZWNrbyIsYi5pc09sZEdlY2tvPWIuaXNHZWNrbyYmcGFyc2VJbnQoKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL3J2XDooXGQrKS8pfHxbXSlbMV0sMTApPDQsYi5pc09wZXJhPXdpbmRvdy5vcGVyYSYmT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdpbmRvdy5vcGVyYSk9PSJbb2JqZWN0IE9wZXJhXSIsYi5pc1dlYktpdD1wYXJzZUZsb2F0KGUuc3BsaXQoIldlYktpdC8iKVsxXSl8fHVuZGVmaW5lZCxiLmlzQ2hyb21lPXBhcnNlRmxvYXQoZS5zcGxpdCgiIENocm9tZS8iKVsxXSl8fHVuZGVmaW5lZCxiLmlzQUlSPWUuaW5kZXhPZigiQWRvYmVBSVIiKT49MCxiLmlzSVBhZD1lLmluZGV4T2YoImlQYWQiKT49MCxiLmlzVG91Y2hQYWQ9ZS5pbmRleE9mKCJUb3VjaFBhZCIpPj0wLGIuT1M9e0xJTlVYOiJMSU5VWCIsTUFDOiJNQUMiLFdJTkRPV1M6IldJTkRPV1MifSxiLmdldE9TPWZ1bmN0aW9uKCl7cmV0dXJuIGIuaXNNYWM/Yi5PUy5NQUM6Yi5pc0xpbnV4P2IuT1MuTElOVVg6Yi5PUy5XSU5ET1dTfX0pLGRlZmluZSgiYWNlL2VkaXRvciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZml4b2xkYnJvd3NlcnMiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9saWIvdXNlcmFnZW50IiwiYWNlL2tleWJvYXJkL3RleHRpbnB1dCIsImFjZS9tb3VzZS9tb3VzZV9oYW5kbGVyIiwiYWNlL21vdXNlL2ZvbGRfaGFuZGxlciIsImFjZS9rZXlib2FyZC9rZXliaW5kaW5nIiwiYWNlL2VkaXRfc2Vzc2lvbiIsImFjZS9zZWFyY2giLCJhY2UvcmFuZ2UiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiLCJhY2UvY29tbWFuZHMvY29tbWFuZF9tYW5hZ2VyIiwiYWNlL2NvbW1hbmRzL2RlZmF1bHRfY29tbWFuZHMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiLGEoIi4vbGliL2ZpeG9sZGJyb3dzZXJzIik7dmFyIGQ9YSgiLi9saWIvb29wIiksZT1hKCIuL2xpYi9sYW5nIiksZj1hKCIuL2xpYi91c2VyYWdlbnQiKSxnPWEoIi4va2V5Ym9hcmQvdGV4dGlucHV0IikuVGV4dElucHV0LGg9YSgiLi9tb3VzZS9tb3VzZV9oYW5kbGVyIikuTW91c2VIYW5kbGVyLGk9YSgiLi9tb3VzZS9mb2xkX2hhbmRsZXIiKS5Gb2xkSGFuZGxlcixqPWEoIi4va2V5Ym9hcmQva2V5YmluZGluZyIpLktleUJpbmRpbmcsaz1hKCIuL2VkaXRfc2Vzc2lvbiIpLkVkaXRTZXNzaW9uLGw9YSgiLi9zZWFyY2giKS5TZWFyY2gsbT1hKCIuL3JhbmdlIikuUmFuZ2Usbj1hKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLG89YSgiLi9jb21tYW5kcy9jb21tYW5kX21hbmFnZXIiKS5Db21tYW5kTWFuYWdlcixwPWEoIi4vY29tbWFuZHMvZGVmYXVsdF9jb21tYW5kcyIpLmNvbW1hbmRzLHE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldENvbnRhaW5lckVsZW1lbnQoKTt0aGlzLmNvbnRhaW5lcj1jLHRoaXMucmVuZGVyZXI9YSx0aGlzLnRleHRJbnB1dD1uZXcgZyhhLmdldFRleHRBcmVhQ29udGFpbmVyKCksdGhpcyksdGhpcy5rZXlCaW5kaW5nPW5ldyBqKHRoaXMpLGYuaXNJUGFkfHwodGhpcy4kbW91c2VIYW5kbGVyPW5ldyBoKHRoaXMpLG5ldyBpKHRoaXMpKSx0aGlzLiRibG9ja1Njcm9sbGluZz0wLHRoaXMuJHNlYXJjaD0obmV3IGwpLnNldCh7d3JhcDohMH0pLHRoaXMuY29tbWFuZHM9bmV3IG8oZi5pc01hYz8ibWFjIjoid2luIixwKSx0aGlzLnNldFNlc3Npb24oYnx8bmV3IGsoIiIpKX07KChmdW5jdGlvbigpe2QuaW1wbGVtZW50KHRoaXMsbiksdGhpcy5zZXRLZXlib2FyZEhhbmRsZXI9ZnVuY3Rpb24oYSl7dGhpcy5rZXlCaW5kaW5nLnNldEtleWJvYXJkSGFuZGxlcihhKX0sdGhpcy5nZXRLZXlib2FyZEhhbmRsZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rZXlCaW5kaW5nLmdldEtleWJvYXJkSGFuZGxlcigpfSx0aGlzLnNldFNlc3Npb249ZnVuY3Rpb24oYSl7aWYodGhpcy5zZXNzaW9uPT1hKXJldHVybjtpZih0aGlzLnNlc3Npb24pe3ZhciBiPXRoaXMuc2Vzc2lvbjt0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix0aGlzLiRvbkRvY3VtZW50Q2hhbmdlKSx0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlTW9kZSIsdGhpcy4kb25DaGFuZ2VNb2RlKSx0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG9rZW5pemVyVXBkYXRlIix0aGlzLiRvblRva2VuaXplclVwZGF0ZSksdGhpcy5zZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZVRhYlNpemUiLHRoaXMuJG9uQ2hhbmdlVGFiU2l6ZSksdGhpcy5zZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZVdyYXBMaW1pdCIsdGhpcy4kb25DaGFuZ2VXcmFwTGltaXQpLHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VXcmFwTW9kZSIsdGhpcy4kb25DaGFuZ2VXcmFwTW9kZSksdGhpcy5zZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm9uQ2hhbmdlRm9sZCIsdGhpcy4kb25DaGFuZ2VGb2xkKSx0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlRnJvbnRNYXJrZXIiLHRoaXMuJG9uQ2hhbmdlRnJvbnRNYXJrZXIpLHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VCYWNrTWFya2VyIix0aGlzLiRvbkNoYW5nZUJhY2tNYXJrZXIpLHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VCcmVha3BvaW50Iix0aGlzLiRvbkNoYW5nZUJyZWFrcG9pbnQpLHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VBbm5vdGF0aW9uIix0aGlzLiRvbkNoYW5nZUFubm90YXRpb24pLHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VPdmVyd3JpdGUiLHRoaXMuJG9uQ3Vyc29yQ2hhbmdlKSx0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlU2Nyb2xsVG9wIix0aGlzLiRvblNjcm9sbFRvcENoYW5nZSksdGhpcy5zZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZUxlZnRUb3AiLHRoaXMuJG9uU2Nyb2xsTGVmdENoYW5nZSk7dmFyIGM9dGhpcy5zZXNzaW9uLmdldFNlbGVjdGlvbigpO2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlQ3Vyc29yIix0aGlzLiRvbkN1cnNvckNoYW5nZSksYy5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VTZWxlY3Rpb24iLHRoaXMuJG9uU2VsZWN0aW9uQ2hhbmdlKX10aGlzLnNlc3Npb249YSx0aGlzLiRvbkRvY3VtZW50Q2hhbmdlPXRoaXMub25Eb2N1bWVudENoYW5nZS5iaW5kKHRoaXMpLGEuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix0aGlzLiRvbkRvY3VtZW50Q2hhbmdlKSx0aGlzLnJlbmRlcmVyLnNldFNlc3Npb24oYSksdGhpcy4kb25DaGFuZ2VNb2RlPXRoaXMub25DaGFuZ2VNb2RlLmJpbmQodGhpcyksYS5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VNb2RlIix0aGlzLiRvbkNoYW5nZU1vZGUpLHRoaXMuJG9uVG9rZW5pemVyVXBkYXRlPXRoaXMub25Ub2tlbml6ZXJVcGRhdGUuYmluZCh0aGlzKSxhLmFkZEV2ZW50TGlzdGVuZXIoInRva2VuaXplclVwZGF0ZSIsdGhpcy4kb25Ub2tlbml6ZXJVcGRhdGUpLHRoaXMuJG9uQ2hhbmdlVGFiU2l6ZT10aGlzLnJlbmRlcmVyLnVwZGF0ZVRleHQuYmluZCh0aGlzLnJlbmRlcmVyKSxhLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZVRhYlNpemUiLHRoaXMuJG9uQ2hhbmdlVGFiU2l6ZSksdGhpcy4kb25DaGFuZ2VXcmFwTGltaXQ9dGhpcy5vbkNoYW5nZVdyYXBMaW1pdC5iaW5kKHRoaXMpLGEuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlV3JhcExpbWl0Iix0aGlzLiRvbkNoYW5nZVdyYXBMaW1pdCksdGhpcy4kb25DaGFuZ2VXcmFwTW9kZT10aGlzLm9uQ2hhbmdlV3JhcE1vZGUuYmluZCh0aGlzKSxhLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZVdyYXBNb2RlIix0aGlzLiRvbkNoYW5nZVdyYXBNb2RlKSx0aGlzLiRvbkNoYW5nZUZvbGQ9dGhpcy5vbkNoYW5nZUZvbGQuYmluZCh0aGlzKSxhLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZUZvbGQiLHRoaXMuJG9uQ2hhbmdlRm9sZCksdGhpcy4kb25DaGFuZ2VGcm9udE1hcmtlcj10aGlzLm9uQ2hhbmdlRnJvbnRNYXJrZXIuYmluZCh0aGlzKSx0aGlzLnNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlRnJvbnRNYXJrZXIiLHRoaXMuJG9uQ2hhbmdlRnJvbnRNYXJrZXIpLHRoaXMuJG9uQ2hhbmdlQmFja01hcmtlcj10aGlzLm9uQ2hhbmdlQmFja01hcmtlci5iaW5kKHRoaXMpLHRoaXMuc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VCYWNrTWFya2VyIix0aGlzLiRvbkNoYW5nZUJhY2tNYXJrZXIpLHRoaXMuJG9uQ2hhbmdlQnJlYWtwb2ludD10aGlzLm9uQ2hhbmdlQnJlYWtwb2ludC5iaW5kKHRoaXMpLHRoaXMuc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VCcmVha3BvaW50Iix0aGlzLiRvbkNoYW5nZUJyZWFrcG9pbnQpLHRoaXMuJG9uQ2hhbmdlQW5ub3RhdGlvbj10aGlzLm9uQ2hhbmdlQW5ub3RhdGlvbi5iaW5kKHRoaXMpLHRoaXMuc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VBbm5vdGF0aW9uIix0aGlzLiRvbkNoYW5nZUFubm90YXRpb24pLHRoaXMuJG9uQ3Vyc29yQ2hhbmdlPXRoaXMub25DdXJzb3JDaGFuZ2UuYmluZCh0aGlzKSx0aGlzLnNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlT3ZlcndyaXRlIix0aGlzLiRvbkN1cnNvckNoYW5nZSksdGhpcy4kb25TY3JvbGxUb3BDaGFuZ2U9dGhpcy5vblNjcm9sbFRvcENoYW5nZS5iaW5kKHRoaXMpLHRoaXMuc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VTY3JvbGxUb3AiLHRoaXMuJG9uU2Nyb2xsVG9wQ2hhbmdlKSx0aGlzLiRvblNjcm9sbExlZnRDaGFuZ2U9dGhpcy5vblNjcm9sbExlZnRDaGFuZ2UuYmluZCh0aGlzKSx0aGlzLnNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlU2Nyb2xsTGVmdCIsdGhpcy4kb25TY3JvbGxMZWZ0Q2hhbmdlKSx0aGlzLnNlbGVjdGlvbj1hLmdldFNlbGVjdGlvbigpLHRoaXMuc2VsZWN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZUN1cnNvciIsdGhpcy4kb25DdXJzb3JDaGFuZ2UpLHRoaXMuJG9uU2VsZWN0aW9uQ2hhbmdlPXRoaXMub25TZWxlY3Rpb25DaGFuZ2UuYmluZCh0aGlzKSx0aGlzLnNlbGVjdGlvbi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VTZWxlY3Rpb24iLHRoaXMuJG9uU2VsZWN0aW9uQ2hhbmdlKSx0aGlzLm9uQ2hhbmdlTW9kZSgpLHRoaXMuJGJsb2NrU2Nyb2xsaW5nKz0xLHRoaXMub25DdXJzb3JDaGFuZ2UoKSx0aGlzLiRibG9ja1Njcm9sbGluZy09MSx0aGlzLm9uU2Nyb2xsVG9wQ2hhbmdlKCksdGhpcy5vblNjcm9sbExlZnRDaGFuZ2UoKSx0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKCksdGhpcy5vbkNoYW5nZUZyb250TWFya2VyKCksdGhpcy5vbkNoYW5nZUJhY2tNYXJrZXIoKSx0aGlzLm9uQ2hhbmdlQnJlYWtwb2ludCgpLHRoaXMub25DaGFuZ2VBbm5vdGF0aW9uKCksdGhpcy5zZXNzaW9uLmdldFVzZVdyYXBNb2RlKCkmJnRoaXMucmVuZGVyZXIuYWRqdXN0V3JhcExpbWl0KCksdGhpcy5yZW5kZXJlci51cGRhdGVGdWxsKCksdGhpcy5fZW1pdCgiY2hhbmdlU2Vzc2lvbiIse3Nlc3Npb246YSxvbGRTZXNzaW9uOmJ9KX0sdGhpcy5nZXRTZXNzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbn0sdGhpcy5nZXRTZWxlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb259LHRoaXMucmVzaXplPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci5vblJlc2l6ZSgpfSx0aGlzLnNldFRoZW1lPWZ1bmN0aW9uKGEpe3RoaXMucmVuZGVyZXIuc2V0VGhlbWUoYSl9LHRoaXMuZ2V0VGhlbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRUaGVtZSgpfSx0aGlzLnNldFN0eWxlPWZ1bmN0aW9uKGEpe3RoaXMucmVuZGVyZXIuc2V0U3R5bGUoYSl9LHRoaXMudW5zZXRTdHlsZT1mdW5jdGlvbihhKXt0aGlzLnJlbmRlcmVyLnVuc2V0U3R5bGUoYSl9LHRoaXMuc2V0Rm9udFNpemU9ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXIuc3R5bGUuZm9udFNpemU9YSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUZvbnRTaXplKCl9LHRoaXMuJGhpZ2hsaWdodEJyYWNrZXRzPWZ1bmN0aW9uKCl7dGhpcy5zZXNzaW9uLiRicmFja2V0SGlnaGxpZ2h0JiYodGhpcy5zZXNzaW9uLnJlbW92ZU1hcmtlcih0aGlzLnNlc3Npb24uJGJyYWNrZXRIaWdobGlnaHQpLHRoaXMuc2Vzc2lvbi4kYnJhY2tldEhpZ2hsaWdodD1udWxsKTtpZih0aGlzLiRoaWdobGlnaHRQZW5kaW5nKXJldHVybjt2YXIgYT10aGlzO3RoaXMuJGhpZ2hsaWdodFBlbmRpbmc9ITAsc2V0VGltZW91dChmdW5jdGlvbigpe2EuJGhpZ2hsaWdodFBlbmRpbmc9ITE7dmFyIGI9YS5zZXNzaW9uLmZpbmRNYXRjaGluZ0JyYWNrZXQoYS5nZXRDdXJzb3JQb3NpdGlvbigpKTtpZihiKXt2YXIgYz1uZXcgbShiLnJvdyxiLmNvbHVtbixiLnJvdyxiLmNvbHVtbisxKTthLnNlc3Npb24uJGJyYWNrZXRIaWdobGlnaHQ9YS5zZXNzaW9uLmFkZE1hcmtlcihjLCJhY2VfYnJhY2tldCIsInRleHQiKX19LDEwKX0sdGhpcy5mb2N1cz1mdW5jdGlvbigpe3ZhciBhPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2EudGV4dElucHV0LmZvY3VzKCl9KSx0aGlzLnRleHRJbnB1dC5mb2N1cygpfSx0aGlzLmlzRm9jdXNlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRleHRJbnB1dC5pc0ZvY3VzZWQoKX0sdGhpcy5ibHVyPWZ1bmN0aW9uKCl7dGhpcy50ZXh0SW5wdXQuYmx1cigpfSx0aGlzLm9uRm9jdXM9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLnNob3dDdXJzb3IoKSx0aGlzLnJlbmRlcmVyLnZpc3VhbGl6ZUZvY3VzKCksdGhpcy5fZW1pdCgiZm9jdXMiKX0sdGhpcy5vbkJsdXI9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLmhpZGVDdXJzb3IoKSx0aGlzLnJlbmRlcmVyLnZpc3VhbGl6ZUJsdXIoKSx0aGlzLl9lbWl0KCJibHVyIil9LHRoaXMub25Eb2N1bWVudENoYW5nZT1mdW5jdGlvbihhKXt2YXIgYj1hLmRhdGEsYz1iLnJhbmdlLGQ7Yy5zdGFydC5yb3c9PWMuZW5kLnJvdyYmYi5hY3Rpb24hPSJpbnNlcnRMaW5lcyImJmIuYWN0aW9uIT0icmVtb3ZlTGluZXMiP2Q9Yy5lbmQucm93OmQ9SW5maW5pdHksdGhpcy5yZW5kZXJlci51cGRhdGVMaW5lcyhjLnN0YXJ0LnJvdyxkKSx0aGlzLl9lbWl0KCJjaGFuZ2UiLGEpLHRoaXMub25DdXJzb3JDaGFuZ2UoKX0sdGhpcy5vblRva2VuaXplclVwZGF0ZT1mdW5jdGlvbihhKXt2YXIgYj1hLmRhdGE7dGhpcy5yZW5kZXJlci51cGRhdGVMaW5lcyhiLmZpcnN0LGIubGFzdCl9LHRoaXMub25TY3JvbGxUb3BDaGFuZ2U9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLnNjcm9sbFRvWSh0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCkpfSx0aGlzLm9uU2Nyb2xsTGVmdENoYW5nZT1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIuc2Nyb2xsVG9YKHRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxMZWZ0KCkpfSx0aGlzLm9uQ3Vyc29yQ2hhbmdlPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci51cGRhdGVDdXJzb3IoKSx0aGlzLiRibG9ja1Njcm9sbGluZ3x8dGhpcy5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldygpLHRoaXMucmVuZGVyZXIubW92ZVRleHRBcmVhVG9DdXJzb3IodGhpcy50ZXh0SW5wdXQuZ2V0RWxlbWVudCgpKSx0aGlzLiRoaWdobGlnaHRCcmFja2V0cygpLHRoaXMuJHVwZGF0ZUhpZ2hsaWdodEFjdGl2ZUxpbmUoKX0sdGhpcy4kdXBkYXRlSGlnaGxpZ2h0QWN0aXZlTGluZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0U2Vzc2lvbigpO2EuJGhpZ2hsaWdodExpbmVNYXJrZXImJmEucmVtb3ZlTWFya2VyKGEuJGhpZ2hsaWdodExpbmVNYXJrZXIpLGEuJGhpZ2hsaWdodExpbmVNYXJrZXI9bnVsbDtpZih0aGlzLmdldEhpZ2hsaWdodEFjdGl2ZUxpbmUoKSYmKHRoaXMuZ2V0U2VsZWN0aW9uU3R5bGUoKSE9ImxpbmUifHwhdGhpcy5zZWxlY3Rpb24uaXNNdWx0aUxpbmUoKSkpe3ZhciBiPXRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxjPXRoaXMuc2Vzc2lvbi5nZXRGb2xkTGluZShiLnJvdyksZDtjP2Q9bmV3IG0oYy5zdGFydC5yb3csMCxjLmVuZC5yb3crMSwwKTpkPW5ldyBtKGIucm93LDAsYi5yb3crMSwwKSxhLiRoaWdobGlnaHRMaW5lTWFya2VyPWEuYWRkTWFya2VyKGQsImFjZV9hY3RpdmVfbGluZSIsImJhY2tncm91bmQiKX19LHRoaXMub25TZWxlY3Rpb25DaGFuZ2U9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRTZXNzaW9uKCk7Yi4kc2VsZWN0aW9uTWFya2VyJiZiLnJlbW92ZU1hcmtlcihiLiRzZWxlY3Rpb25NYXJrZXIpLGIuJHNlbGVjdGlvbk1hcmtlcj1udWxsO2lmKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpe3ZhciBjPXRoaXMuc2VsZWN0aW9uLmdldFJhbmdlKCksZD10aGlzLmdldFNlbGVjdGlvblN0eWxlKCk7Yi4kc2VsZWN0aW9uTWFya2VyPWIuYWRkTWFya2VyKGMsImFjZV9zZWxlY3Rpb24iLGQpfWVsc2UgdGhpcy4kdXBkYXRlSGlnaGxpZ2h0QWN0aXZlTGluZSgpO3RoaXMuJGhpZ2hsaWdodFNlbGVjdGVkV29yZCYmdGhpcy5zZXNzaW9uLmdldE1vZGUoKS5oaWdobGlnaHRTZWxlY3Rpb24odGhpcyl9LHRoaXMub25DaGFuZ2VGcm9udE1hcmtlcj1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIudXBkYXRlRnJvbnRNYXJrZXJzKCl9LHRoaXMub25DaGFuZ2VCYWNrTWFya2VyPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci51cGRhdGVCYWNrTWFya2VycygpfSx0aGlzLm9uQ2hhbmdlQnJlYWtwb2ludD1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIuc2V0QnJlYWtwb2ludHModGhpcy5zZXNzaW9uLmdldEJyZWFrcG9pbnRzKCkpfSx0aGlzLm9uQ2hhbmdlQW5ub3RhdGlvbj1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIuc2V0QW5ub3RhdGlvbnModGhpcy5zZXNzaW9uLmdldEFubm90YXRpb25zKCkpfSx0aGlzLm9uQ2hhbmdlTW9kZT1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIudXBkYXRlVGV4dCgpfSx0aGlzLm9uQ2hhbmdlV3JhcExpbWl0PWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci51cGRhdGVGdWxsKCl9LHRoaXMub25DaGFuZ2VXcmFwTW9kZT1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIub25SZXNpemUoITApfSx0aGlzLm9uQ2hhbmdlRm9sZD1mdW5jdGlvbigpe3RoaXMuJHVwZGF0ZUhpZ2hsaWdodEFjdGl2ZUxpbmUoKSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUZ1bGwoKX0sdGhpcy5nZXRDb3B5VGV4dD1mdW5jdGlvbigpe3ZhciBhPSIiO3JldHVybiB0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCl8fChhPXRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2UodGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpKSksdGhpcy5fZW1pdCgiY29weSIsYSksYX0sdGhpcy5vbkN1dD1mdW5jdGlvbigpe2lmKHRoaXMuJHJlYWRPbmx5KXJldHVybjt2YXIgYT10aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7dGhpcy5fZW1pdCgiY3V0IixhKSx0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCl8fCh0aGlzLnNlc3Npb24ucmVtb3ZlKGEpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKSl9LHRoaXMuaW5zZXJ0PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuc2Vzc2lvbixjPWIuZ2V0TW9kZSgpLGQ9dGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpO2lmKHRoaXMuZ2V0QmVoYXZpb3Vyc0VuYWJsZWQoKSl7dmFyIGU9Yy50cmFuc2Zvcm1BY3Rpb24oYi5nZXRTdGF0ZShkLnJvdyksImluc2VydGlvbiIsdGhpcyxiLGEpO2UmJihhPWUudGV4dCl9YT1hLnJlcGxhY2UoIlx0Iix0aGlzLnNlc3Npb24uZ2V0VGFiU3RyaW5nKCkpO2lmKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpZD10aGlzLnNlc3Npb24ucmVtb3ZlKHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSksdGhpcy5jbGVhclNlbGVjdGlvbigpO2Vsc2UgaWYodGhpcy5zZXNzaW9uLmdldE92ZXJ3cml0ZSgpKXt2YXIgZj1uZXcgbS5mcm9tUG9pbnRzKGQsZCk7Zi5lbmQuY29sdW1uKz1hLmxlbmd0aCx0aGlzLnNlc3Npb24ucmVtb3ZlKGYpfXRoaXMuY2xlYXJTZWxlY3Rpb24oKTt2YXIgZz1kLmNvbHVtbixoPWIuZ2V0U3RhdGUoZC5yb3cpLGk9Yy5jaGVja091dGRlbnQoaCxiLmdldExpbmUoZC5yb3cpLGEpLGo9Yi5nZXRMaW5lKGQucm93KSxrPWMuZ2V0TmV4dExpbmVJbmRlbnQoaCxqLnNsaWNlKDAsZC5jb2x1bW4pLGIuZ2V0VGFiU3RyaW5nKCkpLGw9Yi5pbnNlcnQoZCxhKTtlJiZlLnNlbGVjdGlvbiYmKGUuc2VsZWN0aW9uLmxlbmd0aD09Mj90aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShuZXcgbShkLnJvdyxnK2Uuc2VsZWN0aW9uWzBdLGQucm93LGcrZS5zZWxlY3Rpb25bMV0pKTp0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShuZXcgbShkLnJvdytlLnNlbGVjdGlvblswXSxlLnNlbGVjdGlvblsxXSxkLnJvdytlLnNlbGVjdGlvblsyXSxlLnNlbGVjdGlvblszXSkpKTt2YXIgaD1iLmdldFN0YXRlKGQucm93KTtpZihiLmdldERvY3VtZW50KCkuaXNOZXdMaW5lKGEpKXt0aGlzLm1vdmVDdXJzb3JUbyhkLnJvdysxLDApO3ZhciBuPWIuZ2V0VGFiU2l6ZSgpLG89TnVtYmVyLk1BWF9WQUxVRTtmb3IodmFyIHA9ZC5yb3crMTtwPD1sLnJvdzsrK3Ape3ZhciBxPTA7aj1iLmdldExpbmUocCk7Zm9yKHZhciByPTA7cjxqLmxlbmd0aDsrK3IpaWYoai5jaGFyQXQocik9PSJcdCIpcSs9bjtlbHNlIGlmKGouY2hhckF0KHIpPT0iICIpcSs9MTtlbHNlIGJyZWFrOy9bXlxzXS8udGVzdChqKSYmKG89TWF0aC5taW4ocSxvKSl9Zm9yKHZhciBwPWQucm93KzE7cDw9bC5yb3c7KytwKXt2YXIgcz1vO2o9Yi5nZXRMaW5lKHApO2Zvcih2YXIgcj0wO3I8ai5sZW5ndGgmJnM+MDsrK3Ipai5jaGFyQXQocik9PSJcdCI/cy09bjpqLmNoYXJBdChyKT09IiAiJiYocy09MSk7Yi5yZW1vdmUobmV3IG0ocCwwLHAscikpfWIuaW5kZW50Um93cyhkLnJvdysxLGwucm93LGspfWkmJmMuYXV0b091dGRlbnQoaCxiLGQucm93KX0sdGhpcy5vblRleHRJbnB1dD1mdW5jdGlvbihhLGIpe2ImJnRoaXMuX2VtaXQoInBhc3RlIixhKSx0aGlzLmtleUJpbmRpbmcub25UZXh0SW5wdXQoYSxiKX0sdGhpcy5vbkNvbW1hbmRLZXk9ZnVuY3Rpb24oYSxiLGMpe3RoaXMua2V5QmluZGluZy5vbkNvbW1hbmRLZXkoYSxiLGMpfSx0aGlzLnNldE92ZXJ3cml0ZT1mdW5jdGlvbihhKXt0aGlzLnNlc3Npb24uc2V0T3ZlcndyaXRlKGEpfSx0aGlzLmdldE92ZXJ3cml0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlc3Npb24uZ2V0T3ZlcndyaXRlKCl9LHRoaXMudG9nZ2xlT3ZlcndyaXRlPWZ1bmN0aW9uKCl7dGhpcy5zZXNzaW9uLnRvZ2dsZU92ZXJ3cml0ZSgpfSx0aGlzLnNldFNjcm9sbFNwZWVkPWZ1bmN0aW9uKGEpe3RoaXMuJG1vdXNlSGFuZGxlci5zZXRTY3JvbGxTcGVlZChhKX0sdGhpcy5nZXRTY3JvbGxTcGVlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRtb3VzZUhhbmRsZXIuZ2V0U2Nyb2xsU3BlZWQoKX0sdGhpcy5zZXREcmFnRGVsYXk9ZnVuY3Rpb24oYSl7dGhpcy4kbW91c2VIYW5kbGVyLnNldERyYWdEZWxheShhKX0sdGhpcy5nZXREcmFnRGVsYXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kbW91c2VIYW5kbGVyLmdldERyYWdEZWxheSgpfSx0aGlzLiRzZWxlY3Rpb25TdHlsZT0ibGluZSIsdGhpcy5zZXRTZWxlY3Rpb25TdHlsZT1mdW5jdGlvbihhKXtpZih0aGlzLiRzZWxlY3Rpb25TdHlsZT09YSlyZXR1cm47dGhpcy4kc2VsZWN0aW9uU3R5bGU9YSx0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKCksdGhpcy5fZW1pdCgiY2hhbmdlU2VsZWN0aW9uU3R5bGUiLHtkYXRhOmF9KX0sdGhpcy5nZXRTZWxlY3Rpb25TdHlsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRzZWxlY3Rpb25TdHlsZX0sdGhpcy4kaGlnaGxpZ2h0QWN0aXZlTGluZT0hMCx0aGlzLnNldEhpZ2hsaWdodEFjdGl2ZUxpbmU9ZnVuY3Rpb24oYSl7aWYodGhpcy4kaGlnaGxpZ2h0QWN0aXZlTGluZT09YSlyZXR1cm47dGhpcy4kaGlnaGxpZ2h0QWN0aXZlTGluZT1hLHRoaXMuJHVwZGF0ZUhpZ2hsaWdodEFjdGl2ZUxpbmUoKX0sdGhpcy5nZXRIaWdobGlnaHRBY3RpdmVMaW5lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGhpZ2hsaWdodEFjdGl2ZUxpbmV9LHRoaXMuJGhpZ2hsaWdodFNlbGVjdGVkV29yZD0hMCx0aGlzLnNldEhpZ2hsaWdodFNlbGVjdGVkV29yZD1mdW5jdGlvbihhKXtpZih0aGlzLiRoaWdobGlnaHRTZWxlY3RlZFdvcmQ9PWEpcmV0dXJuO3RoaXMuJGhpZ2hsaWdodFNlbGVjdGVkV29yZD1hLGE/dGhpcy5zZXNzaW9uLmdldE1vZGUoKS5oaWdobGlnaHRTZWxlY3Rpb24odGhpcyk6dGhpcy5zZXNzaW9uLmdldE1vZGUoKS5jbGVhclNlbGVjdGlvbkhpZ2hsaWdodCh0aGlzKX0sdGhpcy5nZXRIaWdobGlnaHRTZWxlY3RlZFdvcmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kaGlnaGxpZ2h0U2VsZWN0ZWRXb3JkfSx0aGlzLnNldFNob3dJbnZpc2libGVzPWZ1bmN0aW9uKGEpe2lmKHRoaXMuZ2V0U2hvd0ludmlzaWJsZXMoKT09YSlyZXR1cm47dGhpcy5yZW5kZXJlci5zZXRTaG93SW52aXNpYmxlcyhhKX0sdGhpcy5nZXRTaG93SW52aXNpYmxlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcmVyLmdldFNob3dJbnZpc2libGVzKCl9LHRoaXMuc2V0U2hvd1ByaW50TWFyZ2luPWZ1bmN0aW9uKGEpe3RoaXMucmVuZGVyZXIuc2V0U2hvd1ByaW50TWFyZ2luKGEpfSx0aGlzLmdldFNob3dQcmludE1hcmdpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcmVyLmdldFNob3dQcmludE1hcmdpbigpfSx0aGlzLnNldFByaW50TWFyZ2luQ29sdW1uPWZ1bmN0aW9uKGEpe3RoaXMucmVuZGVyZXIuc2V0UHJpbnRNYXJnaW5Db2x1bW4oYSl9LHRoaXMuZ2V0UHJpbnRNYXJnaW5Db2x1bW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRQcmludE1hcmdpbkNvbHVtbigpfSx0aGlzLiRyZWFkT25seT0hMSx0aGlzLnNldFJlYWRPbmx5PWZ1bmN0aW9uKGEpe3RoaXMuJHJlYWRPbmx5PWF9LHRoaXMuZ2V0UmVhZE9ubHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcmVhZE9ubHl9LHRoaXMuJG1vZGVCZWhhdmlvdXJzPSEwLHRoaXMuc2V0QmVoYXZpb3Vyc0VuYWJsZWQ9ZnVuY3Rpb24oYSl7dGhpcy4kbW9kZUJlaGF2aW91cnM9YX0sdGhpcy5nZXRCZWhhdmlvdXJzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRtb2RlQmVoYXZpb3Vyc30sdGhpcy5zZXRTaG93Rm9sZFdpZGdldHM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5yZW5kZXJlci4kZ3V0dGVyTGF5ZXI7aWYoYi5nZXRTaG93Rm9sZFdpZGdldHMoKT09YSlyZXR1cm47dGhpcy5yZW5kZXJlci4kZ3V0dGVyTGF5ZXIuc2V0U2hvd0ZvbGRXaWRnZXRzKGEpLHRoaXMuJHNob3dGb2xkV2lkZ2V0cz1hLHRoaXMucmVuZGVyZXIudXBkYXRlRnVsbCgpfSx0aGlzLmdldFNob3dGb2xkV2lkZ2V0cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcmVyLiRndXR0ZXJMYXllci5nZXRTaG93Rm9sZFdpZGdldHMoKX0sdGhpcy5yZW1vdmU9ZnVuY3Rpb24oYSl7dGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpJiYoYT09ImxlZnQiP3RoaXMuc2VsZWN0aW9uLnNlbGVjdExlZnQoKTp0aGlzLnNlbGVjdGlvbi5zZWxlY3RSaWdodCgpKTt2YXIgYj10aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7aWYodGhpcy5nZXRCZWhhdmlvdXJzRW5hYmxlZCgpKXt2YXIgYz10aGlzLnNlc3Npb24sZD1jLmdldFN0YXRlKGIuc3RhcnQucm93KSxlPWMuZ2V0TW9kZSgpLnRyYW5zZm9ybUFjdGlvbihkLCJkZWxldGlvbiIsdGhpcyxjLGIpO2UmJihiPWUpfXRoaXMuc2Vzc2lvbi5yZW1vdmUoYiksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLnJlbW92ZVdvcmRSaWdodD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSYmdGhpcy5zZWxlY3Rpb24uc2VsZWN0V29yZFJpZ2h0KCksdGhpcy5zZXNzaW9uLnJlbW92ZSh0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5yZW1vdmVXb3JkTGVmdD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSYmdGhpcy5zZWxlY3Rpb24uc2VsZWN0V29yZExlZnQoKSx0aGlzLnNlc3Npb24ucmVtb3ZlKHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLnJlbW92ZVRvTGluZVN0YXJ0PWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpJiZ0aGlzLnNlbGVjdGlvbi5zZWxlY3RMaW5lU3RhcnQoKSx0aGlzLnNlc3Npb24ucmVtb3ZlKHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLnJlbW92ZVRvTGluZUVuZD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSYmdGhpcy5zZWxlY3Rpb24uc2VsZWN0TGluZUVuZCgpO3ZhciBhPXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTthLnN0YXJ0LmNvbHVtbj09YS5lbmQuY29sdW1uJiZhLnN0YXJ0LnJvdz09YS5lbmQucm93JiYoYS5lbmQuY29sdW1uPTAsYS5lbmQucm93KyspLHRoaXMuc2Vzc2lvbi5yZW1vdmUoYSksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLnNwbGl0TGluZT1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKXx8KHRoaXMuc2Vzc2lvbi5yZW1vdmUodGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCkpO3ZhciBhPXRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKTt0aGlzLmluc2VydCgiXG4iKSx0aGlzLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKGEpfSx0aGlzLnRyYW5zcG9zZUxldHRlcnM9ZnVuY3Rpb24oKXtpZighdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKXJldHVybjt2YXIgYT10aGlzLmdldEN1cnNvclBvc2l0aW9uKCksYj1hLmNvbHVtbjtpZihiPT09MClyZXR1cm47dmFyIGM9dGhpcy5zZXNzaW9uLmdldExpbmUoYS5yb3cpLGQsZTtiPGMubGVuZ3RoPyhkPWMuY2hhckF0KGIpK2MuY2hhckF0KGItMSksZT1uZXcgbShhLnJvdyxiLTEsYS5yb3csYisxKSk6KGQ9Yy5jaGFyQXQoYi0xKStjLmNoYXJBdChiLTIpLGU9bmV3IG0oYS5yb3csYi0yLGEucm93LGIpKSx0aGlzLnNlc3Npb24ucmVwbGFjZShlLGQpfSx0aGlzLnRvTG93ZXJDYXNlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpO3RoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSYmdGhpcy5zZWxlY3Rpb24uc2VsZWN0V29yZCgpO3ZhciBiPXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxjPXRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2UoYik7dGhpcy5zZXNzaW9uLnJlcGxhY2UoYixjLnRvTG93ZXJDYXNlKCkpLHRoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKGEpfSx0aGlzLnRvVXBwZXJDYXNlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpO3RoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSYmdGhpcy5zZWxlY3Rpb24uc2VsZWN0V29yZCgpO3ZhciBiPXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxjPXRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2UoYik7dGhpcy5zZXNzaW9uLnJlcGxhY2UoYixjLnRvVXBwZXJDYXNlKCkpLHRoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKGEpfSx0aGlzLmluZGVudD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuc2Vzc2lvbixiPXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTtpZighKGIuc3RhcnQucm93PGIuZW5kLnJvd3x8Yi5zdGFydC5jb2x1bW48Yi5lbmQuY29sdW1uKSl7dmFyIGQ7aWYodGhpcy5zZXNzaW9uLmdldFVzZVNvZnRUYWJzKCkpe3ZhciBmPWEuZ2V0VGFiU2l6ZSgpLGc9dGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpLGg9YS5kb2N1bWVudFRvU2NyZWVuQ29sdW1uKGcucm93LGcuY29sdW1uKSxpPWYtaCVmO2Q9ZS5zdHJpbmdSZXBlYXQoIiAiLGkpfWVsc2UgZD0iXHQiO3JldHVybiB0aGlzLmluc2VydChkKX12YXIgYz10aGlzLiRnZXRTZWxlY3RlZFJvd3MoKTthLmluZGVudFJvd3MoYy5maXJzdCxjLmxhc3QsIlx0Iil9LHRoaXMuYmxvY2tPdXRkZW50PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zZXNzaW9uLmdldFNlbGVjdGlvbigpO3RoaXMuc2Vzc2lvbi5vdXRkZW50Um93cyhhLmdldFJhbmdlKCkpfSx0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuc2Vzc2lvbi5nZXRTdGF0ZSh0aGlzLmdldEN1cnNvclBvc2l0aW9uKCkucm93KSxiPXRoaXMuJGdldFNlbGVjdGVkUm93cygpO3RoaXMuc2Vzc2lvbi5nZXRNb2RlKCkudG9nZ2xlQ29tbWVudExpbmVzKGEsdGhpcy5zZXNzaW9uLGIuZmlyc3QsYi5sYXN0KX0sdGhpcy5yZW1vdmVMaW5lcz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuJGdldFNlbGVjdGVkUm93cygpLGI7YS5maXJzdD09PTB8fGEubGFzdCsxPHRoaXMuc2Vzc2lvbi5nZXRMZW5ndGgoKT9iPW5ldyBtKGEuZmlyc3QsMCxhLmxhc3QrMSwwKTpiPW5ldyBtKGEuZmlyc3QtMSx0aGlzLnNlc3Npb24uZ2V0TGluZShhLmZpcnN0LTEpLmxlbmd0aCxhLmxhc3QsdGhpcy5zZXNzaW9uLmdldExpbmUoYS5sYXN0KS5sZW5ndGgpLHRoaXMuc2Vzc2lvbi5yZW1vdmUoYiksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLm1vdmVMaW5lc0Rvd249ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlTGluZXMoZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5zZXNzaW9uLm1vdmVMaW5lc0Rvd24oYSxiKX0pfSx0aGlzLm1vdmVMaW5lc1VwPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZUxpbmVzKGZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuc2Vzc2lvbi5tb3ZlTGluZXNVcChhLGIpfSl9LHRoaXMubW92ZVRleHQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy4kcmVhZE9ubHk/bnVsbDp0aGlzLnNlc3Npb24ubW92ZVRleHQoYSxiKX0sdGhpcy5jb3B5TGluZXNVcD1mdW5jdGlvbigpe3RoaXMuJG1vdmVMaW5lcyhmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnNlc3Npb24uZHVwbGljYXRlTGluZXMoYSxiKSwwfSl9LHRoaXMuY29weUxpbmVzRG93bj1mdW5jdGlvbigpe3RoaXMuJG1vdmVMaW5lcyhmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnNlc3Npb24uZHVwbGljYXRlTGluZXMoYSxiKX0pfSx0aGlzLiRtb3ZlTGluZXM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy4kZ2V0U2VsZWN0ZWRSb3dzKCksYz10aGlzLnNlbGVjdGlvbjtpZighYy5pc011bHRpTGluZSgpKXZhciBkPWMuZ2V0UmFuZ2UoKSxlPWMuaXNCYWNrd2FyZHMoKTt2YXIgZj1hLmNhbGwodGhpcyxiLmZpcnN0LGIubGFzdCk7ZD8oZC5zdGFydC5yb3crPWYsZC5lbmQucm93Kz1mLGMuc2V0U2VsZWN0aW9uUmFuZ2UoZCxlKSk6KGMuc2V0U2VsZWN0aW9uQW5jaG9yKGIubGFzdCtmKzEsMCksYy4kbW92ZVNlbGVjdGlvbihmdW5jdGlvbigpe2MubW92ZUN1cnNvclRvKGIuZmlyc3QrZiwwKX0pKX0sdGhpcy4kZ2V0U2VsZWN0ZWRSb3dzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpLmNvbGxhcHNlUm93cygpO3JldHVybntmaXJzdDphLnN0YXJ0LnJvdyxsYXN0OmEuZW5kLnJvd319LHRoaXMub25Db21wb3NpdGlvblN0YXJ0PWZ1bmN0aW9uKGEpe3RoaXMucmVuZGVyZXIuc2hvd0NvbXBvc2l0aW9uKHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKSl9LHRoaXMub25Db21wb3NpdGlvblVwZGF0ZT1mdW5jdGlvbihhKXt0aGlzLnJlbmRlcmVyLnNldENvbXBvc2l0aW9uVGV4dChhKX0sdGhpcy5vbkNvbXBvc2l0aW9uRW5kPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci5oaWRlQ29tcG9zaXRpb24oKX0sdGhpcy5nZXRGaXJzdFZpc2libGVSb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRGaXJzdFZpc2libGVSb3coKX0sdGhpcy5nZXRMYXN0VmlzaWJsZVJvdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcmVyLmdldExhc3RWaXNpYmxlUm93KCl9LHRoaXMuaXNSb3dWaXNpYmxlPWZ1bmN0aW9uKGEpe3JldHVybiBhPj10aGlzLmdldEZpcnN0VmlzaWJsZVJvdygpJiZhPD10aGlzLmdldExhc3RWaXNpYmxlUm93KCl9LHRoaXMuaXNSb3dGdWxseVZpc2libGU9ZnVuY3Rpb24oYSl7cmV0dXJuIGE+PXRoaXMucmVuZGVyZXIuZ2V0Rmlyc3RGdWxseVZpc2libGVSb3coKSYmYTw9dGhpcy5yZW5kZXJlci5nZXRMYXN0RnVsbHlWaXNpYmxlUm93KCl9LHRoaXMuJGdldFZpc2libGVSb3dDb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcmVyLmdldFNjcm9sbEJvdHRvbVJvdygpLXRoaXMucmVuZGVyZXIuZ2V0U2Nyb2xsVG9wUm93KCkrMX0sdGhpcy4kZ2V0UGFnZURvd25Sb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRTY3JvbGxCb3R0b21Sb3coKX0sdGhpcy4kZ2V0UGFnZVVwUm93PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5yZW5kZXJlci5nZXRTY3JvbGxUb3BSb3coKSxiPXRoaXMucmVuZGVyZXIuZ2V0U2Nyb2xsQm90dG9tUm93KCk7cmV0dXJuIGEtKGItYSl9LHRoaXMuc2VsZWN0UGFnZURvd249ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRnZXRQYWdlRG93blJvdygpK01hdGguZmxvb3IodGhpcy4kZ2V0VmlzaWJsZVJvd0NvdW50KCkvMik7dGhpcy5zY3JvbGxQYWdlRG93bigpO3ZhciBiPXRoaXMuZ2V0U2VsZWN0aW9uKCksYz10aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKGIuZ2V0U2VsZWN0aW9uTGVhZCgpKSxkPXRoaXMuc2Vzc2lvbi5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24oYSxjLmNvbHVtbik7Yi5zZWxlY3RUbyhkLnJvdyxkLmNvbHVtbil9LHRoaXMuc2VsZWN0UGFnZVVwPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5yZW5kZXJlci5nZXRTY3JvbGxUb3BSb3coKS10aGlzLnJlbmRlcmVyLmdldFNjcm9sbEJvdHRvbVJvdygpLGI9dGhpcy4kZ2V0UGFnZVVwUm93KCkrTWF0aC5yb3VuZChhLzIpO3RoaXMuc2Nyb2xsUGFnZVVwKCk7dmFyIGM9dGhpcy5nZXRTZWxlY3Rpb24oKSxkPXRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24oYy5nZXRTZWxlY3Rpb25MZWFkKCkpLGU9dGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihiLGQuY29sdW1uKTtjLnNlbGVjdFRvKGUucm93LGUuY29sdW1uKX0sdGhpcy5nb3RvUGFnZURvd249ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRnZXRQYWdlRG93blJvdygpLGI9dGhpcy5nZXRDdXJzb3JQb3NpdGlvblNjcmVlbigpLmNvbHVtbjt0aGlzLnNjcm9sbFRvUm93KGEpLHRoaXMuZ2V0U2VsZWN0aW9uKCkubW92ZUN1cnNvclRvU2NyZWVuKGEsYil9LHRoaXMuZ290b1BhZ2VVcD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuJGdldFBhZ2VVcFJvdygpLGI9dGhpcy5nZXRDdXJzb3JQb3NpdGlvblNjcmVlbigpLmNvbHVtbjt0aGlzLnNjcm9sbFRvUm93KGEpLHRoaXMuZ2V0U2VsZWN0aW9uKCkubW92ZUN1cnNvclRvU2NyZWVuKGEsYil9LHRoaXMuc2Nyb2xsUGFnZURvd249ZnVuY3Rpb24oKXt0aGlzLnNjcm9sbFRvUm93KHRoaXMuJGdldFBhZ2VEb3duUm93KCkpfSx0aGlzLnNjcm9sbFBhZ2VVcD1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIuc2Nyb2xsVG9Sb3codGhpcy4kZ2V0UGFnZVVwUm93KCkpfSx0aGlzLnNjcm9sbFRvUm93PWZ1bmN0aW9uKGEpe3RoaXMucmVuZGVyZXIuc2Nyb2xsVG9Sb3coYSl9LHRoaXMuc2Nyb2xsVG9MaW5lPWZ1bmN0aW9uKGEsYil7dGhpcy5yZW5kZXJlci5zY3JvbGxUb0xpbmUoYSxiKX0sdGhpcy5jZW50ZXJTZWxlY3Rpb249ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFNlbGVjdGlvblJhbmdlKCksYj1NYXRoLmZsb29yKGEuc3RhcnQucm93KyhhLmVuZC5yb3ctYS5zdGFydC5yb3cpLzIpO3RoaXMucmVuZGVyZXIuc2Nyb2xsVG9MaW5lKGIsITApfSx0aGlzLmdldEN1cnNvclBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0aW9uLmdldEN1cnNvcigpfSx0aGlzLmdldEN1cnNvclBvc2l0aW9uU2NyZWVuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24odGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpKX0sdGhpcy5nZXRTZWxlY3Rpb25SYW5nZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGlvbi5nZXRSYW5nZSgpfSx0aGlzLnNlbGVjdEFsbD1mdW5jdGlvbigpe3RoaXMuJGJsb2NrU2Nyb2xsaW5nKz0xLHRoaXMuc2VsZWN0aW9uLnNlbGVjdEFsbCgpLHRoaXMuJGJsb2NrU2Nyb2xsaW5nLT0xfSx0aGlzLmNsZWFyU2VsZWN0aW9uPWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24uY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5tb3ZlQ3Vyc29yVG89ZnVuY3Rpb24oYSxiKXt0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yVG8oYSxiKX0sdGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbj1mdW5jdGlvbihhKXt0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihhKX0sdGhpcy5qdW1wVG9NYXRjaGluZz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxiPXRoaXMuc2Vzc2lvbi5maW5kTWF0Y2hpbmdCcmFja2V0KGEpO2J8fChhLmNvbHVtbis9MSxiPXRoaXMuc2Vzc2lvbi5maW5kTWF0Y2hpbmdCcmFja2V0KGEpKSxifHwoYS5jb2x1bW4tPTIsYj10aGlzLnNlc3Npb24uZmluZE1hdGNoaW5nQnJhY2tldChhKSksYiYmKHRoaXMuY2xlYXJTZWxlY3Rpb24oKSx0aGlzLm1vdmVDdXJzb3JUbyhiLnJvdyxiLmNvbHVtbikpfSx0aGlzLmdvdG9MaW5lPWZ1bmN0aW9uKGEsYil7dGhpcy5zZWxlY3Rpb24uY2xlYXJTZWxlY3Rpb24oKSx0aGlzLnNlc3Npb24udW5mb2xkKHtyb3c6YS0xLGNvbHVtbjpifHwwfSksdGhpcy4kYmxvY2tTY3JvbGxpbmcrPTEsdGhpcy5tb3ZlQ3Vyc29yVG8oYS0xLGJ8fDApLHRoaXMuJGJsb2NrU2Nyb2xsaW5nLT0xLHRoaXMuaXNSb3dGdWxseVZpc2libGUodGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpLnJvdyl8fHRoaXMuc2Nyb2xsVG9MaW5lKGEsITApfSx0aGlzLm5hdmlnYXRlVG89ZnVuY3Rpb24oYSxiKXt0aGlzLmNsZWFyU2VsZWN0aW9uKCksdGhpcy5tb3ZlQ3Vyc29yVG8oYSxiKX0sdGhpcy5uYXZpZ2F0ZVVwPWZ1bmN0aW9uKGEpe3RoaXMuc2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKCksYT1hfHwxLHRoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JCeSgtYSwwKX0sdGhpcy5uYXZpZ2F0ZURvd249ZnVuY3Rpb24oYSl7dGhpcy5zZWxlY3Rpb24uY2xlYXJTZWxlY3Rpb24oKSxhPWF8fDEsdGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvckJ5KGEsMCl9LHRoaXMubmF2aWdhdGVMZWZ0PWZ1bmN0aW9uKGEpe2lmKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpe3ZhciBiPXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKS5zdGFydDt0aGlzLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKGIpfWVsc2V7YT1hfHwxO3doaWxlKGEtLSl0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yTGVmdCgpfXRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5uYXZpZ2F0ZVJpZ2h0PWZ1bmN0aW9uKGEpe2lmKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpe3ZhciBiPXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKS5lbmQ7dGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihiKX1lbHNle2E9YXx8MTt3aGlsZShhLS0pdGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvclJpZ2h0KCl9dGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLm5hdmlnYXRlTGluZVN0YXJ0PWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvckxpbmVTdGFydCgpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5uYXZpZ2F0ZUxpbmVFbmQ9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yTGluZUVuZCgpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5uYXZpZ2F0ZUZpbGVFbmQ9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yRmlsZUVuZCgpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5uYXZpZ2F0ZUZpbGVTdGFydD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JGaWxlU3RhcnQoKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMubmF2aWdhdGVXb3JkUmlnaHQ9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yV29yZFJpZ2h0KCksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLm5hdmlnYXRlV29yZExlZnQ9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yV29yZExlZnQoKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMucmVwbGFjZT1mdW5jdGlvbihhLGIpe2ImJnRoaXMuJHNlYXJjaC5zZXQoYik7dmFyIGM9dGhpcy4kc2VhcmNoLmZpbmQodGhpcy5zZXNzaW9uKTtpZighYylyZXR1cm47dGhpcy4kdHJ5UmVwbGFjZShjLGEpLGMhPT1udWxsJiZ0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShjKX0sdGhpcy5yZXBsYWNlQWxsPWZ1bmN0aW9uKGEsYil7YiYmdGhpcy4kc2VhcmNoLnNldChiKTt2YXIgYz10aGlzLiRzZWFyY2guZmluZEFsbCh0aGlzLnNlc3Npb24pO2lmKCFjLmxlbmd0aClyZXR1cm47dmFyIGQ9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpO3RoaXMuY2xlYXJTZWxlY3Rpb24oKSx0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yVG8oMCwwKSx0aGlzLiRibG9ja1Njcm9sbGluZys9MTtmb3IodmFyIGU9Yy5sZW5ndGgtMTtlPj0wOy0tZSl0aGlzLiR0cnlSZXBsYWNlKGNbZV0sYSk7dGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UoZCksdGhpcy4kYmxvY2tTY3JvbGxpbmctPTF9LHRoaXMuJHRyeVJlcGxhY2U9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLnNlc3Npb24uZ2V0VGV4dFJhbmdlKGEpO3JldHVybiBiPXRoaXMuJHNlYXJjaC5yZXBsYWNlKGMsYiksYiE9PW51bGw/KGEuZW5kPXRoaXMuc2Vzc2lvbi5yZXBsYWNlKGEsYiksYSk6bnVsbH0sdGhpcy5nZXRMYXN0U2VhcmNoT3B0aW9ucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRzZWFyY2guZ2V0T3B0aW9ucygpfSx0aGlzLmZpbmQ9ZnVuY3Rpb24oYSxiKXt0aGlzLmNsZWFyU2VsZWN0aW9uKCksYj1ifHx7fSxiLm5lZWRsZT1hLHRoaXMuJHNlYXJjaC5zZXQoYiksdGhpcy4kZmluZCgpfSx0aGlzLmZpbmROZXh0PWZ1bmN0aW9uKGEpe2E9YXx8e30sdHlwZW9mIGEuYmFja3dhcmRzPT0idW5kZWZpbmVkIiYmKGEuYmFja3dhcmRzPSExKSx0aGlzLiRzZWFyY2guc2V0KGEpLHRoaXMuJGZpbmQoKX0sdGhpcy5maW5kUHJldmlvdXM9ZnVuY3Rpb24oYSl7YT1hfHx7fSx0eXBlb2YgYS5iYWNrd2FyZHM9PSJ1bmRlZmluZWQiJiYoYS5iYWNrd2FyZHM9ITApLHRoaXMuJHNlYXJjaC5zZXQoYSksdGhpcy4kZmluZCgpfSx0aGlzLiRmaW5kPWZ1bmN0aW9uKGEpe3RoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKXx8dGhpcy4kc2VhcmNoLnNldCh7bmVlZGxlOnRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2UodGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpKX0pLHR5cGVvZiBhIT0idW5kZWZpbmVkIiYmdGhpcy4kc2VhcmNoLnNldCh7YmFja3dhcmRzOmF9KTt2YXIgYj10aGlzLiRzZWFyY2guZmluZCh0aGlzLnNlc3Npb24pO2ImJih0aGlzLnNlc3Npb24udW5mb2xkKGIpLHRoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKGIpKX0sdGhpcy51bmRvPWZ1bmN0aW9uKCl7dGhpcy5zZXNzaW9uLmdldFVuZG9NYW5hZ2VyKCkudW5kbygpfSx0aGlzLnJlZG89ZnVuY3Rpb24oKXt0aGlzLnNlc3Npb24uZ2V0VW5kb01hbmFnZXIoKS5yZWRvKCl9LHRoaXMuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIuZGVzdHJveSgpfX0pKS5jYWxsKHEucHJvdG90eXBlKSxiLkVkaXRvcj1xfSksZGVmaW5lKCJhY2UvbGliL2xhbmciLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiLGIuc3RyaW5nUmV2ZXJzZT1mdW5jdGlvbihhKXtyZXR1cm4gYS5zcGxpdCgiIikucmV2ZXJzZSgpLmpvaW4oIiIpfSxiLnN0cmluZ1JlcGVhdD1mdW5jdGlvbihhLGIpe3JldHVybihuZXcgQXJyYXkoYisxKSkuam9pbihhKX07dmFyIGQ9L15cc1xzKi8sZT0vXHNccyokLztiLnN0cmluZ1RyaW1MZWZ0PWZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoZCwiIil9LGIuc3RyaW5nVHJpbVJpZ2h0PWZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoZSwiIil9LGIuY29weU9iamVjdD1mdW5jdGlvbihhKXt2YXIgYj17fTtmb3IodmFyIGMgaW4gYSliW2NdPWFbY107cmV0dXJuIGJ9LGIuY29weUFycmF5PWZ1bmN0aW9uKGEpe3ZhciBiPVtdO2Zvcih2YXIgYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKylhW2NdJiZ0eXBlb2YgYVtjXT09Im9iamVjdCI/YltjXT10aGlzLmNvcHlPYmplY3QoYVtjXSk6YltjXT1hW2NdO3JldHVybiBifSxiLmRlZXBDb3B5PWZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhIT0ib2JqZWN0IilyZXR1cm4gYTt2YXIgYj1hLmNvbnN0cnVjdG9yKCk7Zm9yKHZhciBjIGluIGEpdHlwZW9mIGFbY109PSJvYmplY3QiP2JbY109dGhpcy5kZWVwQ29weShhW2NdKTpiW2NdPWFbY107cmV0dXJuIGJ9LGIuYXJyYXlUb01hcD1mdW5jdGlvbihhKXt2YXIgYj17fTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliW2FbY11dPTE7cmV0dXJuIGJ9LGIuYXJyYXlSZW1vdmU9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MDtjPD1hLmxlbmd0aDtjKyspYj09PWFbY10mJmEuc3BsaWNlKGMsMSl9LGIuZXNjYXBlUmVnRXhwPWZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoLyhbLiorP14ke30oKXxbXF1cL1xcXSkvZywiXFwkMSIpfSxiLmRlZmVycmVkQ2FsbD1mdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9ZnVuY3Rpb24oKXtiPW51bGwsYSgpfSxkPWZ1bmN0aW9uKGEpe3JldHVybiBkLmNhbmNlbCgpLGI9c2V0VGltZW91dChjLGF8fDApLGR9O3JldHVybiBkLnNjaGVkdWxlPWQsZC5jYWxsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FuY2VsKCksYSgpLGR9LGQuY2FuY2VsPWZ1bmN0aW9uKCl7cmV0dXJuIGNsZWFyVGltZW91dChiKSxiPW51bGwsZH0sZH19KSxkZWZpbmUoImFjZS9rZXlib2FyZC90ZXh0aW5wdXQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2V2ZW50IiwiYWNlL2xpYi91c2VyYWdlbnQiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL2V2ZW50IiksZT1hKCIuLi9saWIvdXNlcmFnZW50IiksZj1hKCIuLi9saWIvZG9tIiksZz1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGwoKXt0cnl7Yy5zZWxlY3QoKX1jYXRjaChhKXt9fWZ1bmN0aW9uIG0oYSl7aWYoIWkpe3ZhciBkPWF8fGMudmFsdWU7aWYoZCl7ZC5jaGFyQ29kZUF0KGQubGVuZ3RoLTEpPT1nLmNoYXJDb2RlQXQoMCk/KGQ9ZC5zbGljZSgwLC0xKSxkJiZiLm9uVGV4dElucHV0KGQsaikpOmIub25UZXh0SW5wdXQoZCxqKTtpZighdigpKXJldHVybiExfX1pPSExLGo9ITEsYy52YWx1ZT1nLGwoKX1mdW5jdGlvbiB2KCl7cmV0dXJuIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT1jfXZhciBjPWYuY3JlYXRlRWxlbWVudCgidGV4dGFyZWEiKTtlLmlzVG91Y2hQYWQmJmMuc2V0QXR0cmlidXRlKCJ4LXBhbG0tZGlzYWJsZS1hdXRvLWNhcCIsITApLGMuc3R5bGUubGVmdD0iLTEwMDAwcHgiLGMuc3R5bGUucG9zaXRpb249ImZpeGVkIixhLmluc2VydEJlZm9yZShjLGEuZmlyc3RDaGlsZCk7dmFyIGc9U3RyaW5nLmZyb21DaGFyQ29kZSgwKTttKCk7dmFyIGg9ITEsaT0hMSxqPSExLGs9IiIsbj1mdW5jdGlvbihhKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aHx8bShhLmRhdGEpfSwwKX0sbz1mdW5jdGlvbihhKXtpZihlLmlzT2xkSUUmJmMudmFsdWUuY2hhckNvZGVBdCgwKT4xMjgpcmV0dXJuO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtofHxtKCl9LDApfSxwPWZ1bmN0aW9uKGEpe2g9ITAsYi5vbkNvbXBvc2l0aW9uU3RhcnQoKSxlLmlzR2Vja298fHNldFRpbWVvdXQocSwwKX0scT1mdW5jdGlvbigpe2lmKCFoKXJldHVybjtiLm9uQ29tcG9zaXRpb25VcGRhdGUoYy52YWx1ZSl9LHI9ZnVuY3Rpb24oYSl7aD0hMSxiLm9uQ29tcG9zaXRpb25FbmQoKX0scz1mdW5jdGlvbihhKXtpPSEwO3ZhciBkPWIuZ2V0Q29weVRleHQoKTtkP2MudmFsdWU9ZDphLnByZXZlbnREZWZhdWx0KCksbCgpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXttKCl9LDApfSx0PWZ1bmN0aW9uKGEpe2k9ITA7dmFyIGQ9Yi5nZXRDb3B5VGV4dCgpO2Q/KGMudmFsdWU9ZCxiLm9uQ3V0KCkpOmEucHJldmVudERlZmF1bHQoKSxsKCksc2V0VGltZW91dChmdW5jdGlvbigpe20oKX0sMCl9O2QuYWRkQ29tbWFuZEtleUxpc3RlbmVyKGMsYi5vbkNvbW1hbmRLZXkuYmluZChiKSk7aWYoZS5pc09sZElFKXt2YXIgdT17MTM6MSwyNzoxfTtkLmFkZExpc3RlbmVyKGMsImtleXVwIixmdW5jdGlvbihhKXtoJiYoIWMudmFsdWV8fHVbYS5rZXlDb2RlXSkmJnNldFRpbWVvdXQociwwKTtpZigoYy52YWx1ZS5jaGFyQ29kZUF0KDApfDApPDEyOSlyZXR1cm47aD9xKCk6cCgpfSl9Im9ucHJvcGVydHljaGFuZ2UiaW4gYyYmISgib25pbnB1dCJpbiBjKT9kLmFkZExpc3RlbmVyKGMsInByb3BlcnR5Y2hhbmdlIixvKTpkLmFkZExpc3RlbmVyKGMsImlucHV0IixuKSxkLmFkZExpc3RlbmVyKGMsInBhc3RlIixmdW5jdGlvbihhKXtqPSEwLGEuY2xpcGJvYXJkRGF0YSYmYS5jbGlwYm9hcmREYXRhLmdldERhdGE/KG0oYS5jbGlwYm9hcmREYXRhLmdldERhdGEoInRleHQvcGxhaW4iKSksYS5wcmV2ZW50RGVmYXVsdCgpKTpvKCl9KSwib25iZWZvcmVjb3B5ImluIGMmJnR5cGVvZiBjbGlwYm9hcmREYXRhIT0idW5kZWZpbmVkIj8oZC5hZGRMaXN0ZW5lcihjLCJiZWZvcmVjb3B5IixmdW5jdGlvbihhKXt2YXIgYz1iLmdldENvcHlUZXh0KCk7Yz9jbGlwYm9hcmREYXRhLnNldERhdGEoIlRleHQiLGMpOmEucHJldmVudERlZmF1bHQoKX0pLGQuYWRkTGlzdGVuZXIoYSwia2V5ZG93biIsZnVuY3Rpb24oYSl7aWYoYS5jdHJsS2V5JiZhLmtleUNvZGU9PTg4KXt2YXIgYz1iLmdldENvcHlUZXh0KCk7YyYmKGNsaXBib2FyZERhdGEuc2V0RGF0YSgiVGV4dCIsYyksYi5vbkN1dCgpKSxkLnByZXZlbnREZWZhdWx0KGEpfX0pKTooZC5hZGRMaXN0ZW5lcihjLCJjb3B5IixzKSxkLmFkZExpc3RlbmVyKGMsImN1dCIsdCkpLGQuYWRkTGlzdGVuZXIoYywiY29tcG9zaXRpb25zdGFydCIscCksZS5pc0dlY2tvJiZkLmFkZExpc3RlbmVyKGMsInRleHQiLHEpLGUuaXNXZWJLaXQmJmQuYWRkTGlzdGVuZXIoYywia2V5dXAiLHEpLGQuYWRkTGlzdGVuZXIoYywiY29tcG9zaXRpb25lbmQiLHIpLGQuYWRkTGlzdGVuZXIoYywiYmx1ciIsZnVuY3Rpb24oKXtiLm9uQmx1cigpfSksZC5hZGRMaXN0ZW5lcihjLCJmb2N1cyIsZnVuY3Rpb24oKXtiLm9uRm9jdXMoKSxsKCl9KSx0aGlzLmZvY3VzPWZ1bmN0aW9uKCl7Yi5vbkZvY3VzKCksbCgpLGMuZm9jdXMoKX0sdGhpcy5ibHVyPWZ1bmN0aW9uKCl7Yy5ibHVyKCl9LHRoaXMuaXNGb2N1c2VkPXYsdGhpcy5nZXRFbGVtZW50PWZ1bmN0aW9uKCl7cmV0dXJuIGN9LHRoaXMub25Db250ZXh0TWVudT1mdW5jdGlvbihhLGIpe2EmJihrfHwoaz1jLnN0eWxlLmNzc1RleHQpLGMuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246Zml4ZWQ7IHotaW5kZXg6MTAwMDtsZWZ0OiIrKGEueC0yKSsicHg7IHRvcDoiKyhhLnktMikrInB4OyIpLGImJihjLnZhbHVlPSIiKX0sdGhpcy5vbkNvbnRleHRNZW51Q2xvc2U9ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ayYmKGMuc3R5bGUuY3NzVGV4dD1rLGs9IiIpLG0oKX0sMCl9fTtiLlRleHRJbnB1dD1nfSksZGVmaW5lKCJhY2UvbW91c2UvbW91c2VfaGFuZGxlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZXZlbnQiLCJhY2UvbW91c2UvZGVmYXVsdF9oYW5kbGVycyIsImFjZS9tb3VzZS9kZWZhdWx0X2d1dHRlcl9oYW5kbGVyIiwiYWNlL21vdXNlL21vdXNlX2V2ZW50Il0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvZXZlbnQiKSxlPWEoIi4vZGVmYXVsdF9oYW5kbGVycyIpLkRlZmF1bHRIYW5kbGVycyxmPWEoIi4vZGVmYXVsdF9ndXR0ZXJfaGFuZGxlciIpLkd1dHRlckhhbmRsZXIsZz1hKCIuL21vdXNlX2V2ZW50IikuTW91c2VFdmVudCxoPWZ1bmN0aW9uKGEpe3RoaXMuZWRpdG9yPWEsbmV3IGUoYSksbmV3IGYoYSksZC5hZGRMaXN0ZW5lcihhLmNvbnRhaW5lciwibW91c2Vkb3duIixmdW5jdGlvbihiKXtyZXR1cm4gYS5mb2N1cygpLGQucHJldmVudERlZmF1bHQoYil9KSxkLmFkZExpc3RlbmVyKGEuY29udGFpbmVyLCJzZWxlY3RzdGFydCIsZnVuY3Rpb24oYSl7cmV0dXJuIGQucHJldmVudERlZmF1bHQoYSl9KTt2YXIgYj1hLnJlbmRlcmVyLmdldE1vdXNlRXZlbnRUYXJnZXQoKTtkLmFkZExpc3RlbmVyKGIsIm1vdXNlZG93biIsdGhpcy5vbk1vdXNlRXZlbnQuYmluZCh0aGlzLCJtb3VzZWRvd24iKSksZC5hZGRMaXN0ZW5lcihiLCJjbGljayIsdGhpcy5vbk1vdXNlRXZlbnQuYmluZCh0aGlzLCJjbGljayIpKSxkLmFkZExpc3RlbmVyKGIsIm1vdXNlbW92ZSIsdGhpcy5vbk1vdXNlTW92ZS5iaW5kKHRoaXMsIm1vdXNlbW92ZSIpKSxkLmFkZE11bHRpTW91c2VEb3duTGlzdGVuZXIoYiwwLDIsNTAwLHRoaXMub25Nb3VzZUV2ZW50LmJpbmQodGhpcywiZGJsY2xpY2siKSksZC5hZGRNdWx0aU1vdXNlRG93bkxpc3RlbmVyKGIsMCwzLDYwMCx0aGlzLm9uTW91c2VFdmVudC5iaW5kKHRoaXMsInRyaXBsZWNsaWNrIikpLGQuYWRkTXVsdGlNb3VzZURvd25MaXN0ZW5lcihiLDAsNCw2MDAsdGhpcy5vbk1vdXNlRXZlbnQuYmluZCh0aGlzLCJxdWFkY2xpY2siKSksZC5hZGRNb3VzZVdoZWVsTGlzdGVuZXIoYS5jb250YWluZXIsdGhpcy5vbk1vdXNlV2hlZWwuYmluZCh0aGlzLCJtb3VzZXdoZWVsIikpO3ZhciBjPWEucmVuZGVyZXIuJGd1dHRlcjtkLmFkZExpc3RlbmVyKGMsIm1vdXNlZG93biIsdGhpcy5vbk1vdXNlRXZlbnQuYmluZCh0aGlzLCJndXR0ZXJtb3VzZWRvd24iKSksZC5hZGRMaXN0ZW5lcihjLCJjbGljayIsdGhpcy5vbk1vdXNlRXZlbnQuYmluZCh0aGlzLCJndXR0ZXJjbGljayIpKSxkLmFkZExpc3RlbmVyKGMsImRibGNsaWNrIix0aGlzLm9uTW91c2VFdmVudC5iaW5kKHRoaXMsImd1dHRlcmRibGNsaWNrIikpLGQuYWRkTGlzdGVuZXIoYywibW91c2Vtb3ZlIix0aGlzLm9uTW91c2VNb3ZlLmJpbmQodGhpcywiZ3V0dGVyIikpfTsoKGZ1bmN0aW9uKCl7dGhpcy4kc2Nyb2xsU3BlZWQ9MSx0aGlzLnNldFNjcm9sbFNwZWVkPWZ1bmN0aW9uKGEpe3RoaXMuJHNjcm9sbFNwZWVkPWF9LHRoaXMuZ2V0U2Nyb2xsU3BlZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc2Nyb2xsU3BlZWR9LHRoaXMub25Nb3VzZUV2ZW50PWZ1bmN0aW9uKGEsYil7dGhpcy5lZGl0b3IuX2VtaXQoYSxuZXcgZyhiLHRoaXMuZWRpdG9yKSl9LHRoaXMuJGRyYWdEZWxheT0yNTAsdGhpcy5zZXREcmFnRGVsYXk9ZnVuY3Rpb24oYSl7dGhpcy4kZHJhZ0RlbGF5PWF9LHRoaXMuZ2V0RHJhZ0RlbGF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGRyYWdEZWxheX0sdGhpcy5vbk1vdXNlTW92ZT1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuZWRpdG9yLl9ldmVudFJlZ2lzdHJ5JiZ0aGlzLmVkaXRvci5fZXZlbnRSZWdpc3RyeS5tb3VzZW1vdmU7aWYoIWN8fCFjLmxlbmd0aClyZXR1cm47dGhpcy5lZGl0b3IuX2VtaXQoYSxuZXcgZyhiLHRoaXMuZWRpdG9yKSl9LHRoaXMub25Nb3VzZVdoZWVsPWZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IGcoYix0aGlzLmVkaXRvcik7Yy5zcGVlZD10aGlzLiRzY3JvbGxTcGVlZCoyLGMud2hlZWxYPWIud2hlZWxYLGMud2hlZWxZPWIud2hlZWxZLHRoaXMuZWRpdG9yLl9lbWl0KGEsYyl9fSkpLmNhbGwoaC5wcm90b3R5cGUpLGIuTW91c2VIYW5kbGVyPWh9KSxkZWZpbmUoImFjZS9tb3VzZS9kZWZhdWx0X2hhbmRsZXJzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9ldmVudCIsImFjZS9saWIvZG9tIiwiYWNlL2xpYi9icm93c2VyX2ZvY3VzIl0sZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGsoYSl7dGhpcy5lZGl0b3I9YSx0aGlzLiRjbGlja1NlbGVjdGlvbj1udWxsLHRoaXMuYnJvd3NlckZvY3VzPW5ldyBmLGEuc2V0RGVmYXVsdEhhbmRsZXIoIm1vdXNlZG93biIsdGhpcy5vbk1vdXNlRG93bi5iaW5kKHRoaXMpKSxhLnNldERlZmF1bHRIYW5kbGVyKCJkYmxjbGljayIsdGhpcy5vbkRvdWJsZUNsaWNrLmJpbmQodGhpcykpLGEuc2V0RGVmYXVsdEhhbmRsZXIoInRyaXBsZWNsaWNrIix0aGlzLm9uVHJpcGxlQ2xpY2suYmluZCh0aGlzKSksYS5zZXREZWZhdWx0SGFuZGxlcigicXVhZGNsaWNrIix0aGlzLm9uUXVhZENsaWNrLmJpbmQodGhpcykpLGEuc2V0RGVmYXVsdEhhbmRsZXIoIm1vdXNld2hlZWwiLHRoaXMub25TY3JvbGwuYmluZCh0aGlzKSl9ZnVuY3Rpb24gbChhLGIsYyxkKXtyZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KGMtYSwyKStNYXRoLnBvdyhkLWIsMikpfSJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvZXZlbnQiKSxlPWEoIi4uL2xpYi9kb20iKSxmPWEoIi4uL2xpYi9icm93c2VyX2ZvY3VzIikuQnJvd3NlckZvY3VzLGc9MCxoPTEsaT0yLGo9NTsoKGZ1bmN0aW9uKCl7dGhpcy5vbk1vdXNlRG93bj1mdW5jdGlvbihhKXtmdW5jdGlvbiBDKGIpe2EuZ2V0U2hpZnRLZXkoKT9tLnNlbGVjdGlvbi5zZWxlY3RUb1Bvc2l0aW9uKGIpOm4uJGNsaWNrU2VsZWN0aW9ufHwobS5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihiKSxtLnNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbihiLnJvdyxiLmNvbHVtbikpLHE9aH12YXIgYj1hLmluU2VsZWN0aW9uKCksYz1hLnBhZ2VYLGY9YS5wYWdlWSxrPWEuZ2V0RG9jdW1lbnRQb3NpdGlvbigpLG09dGhpcy5lZGl0b3Isbj10aGlzLG89bS5nZXRTZWxlY3Rpb25SYW5nZSgpLHA9by5pc0VtcHR5KCkscT1nO2lmKGImJighdGhpcy5icm93c2VyRm9jdXMuaXNGb2N1c2VkKCl8fChuZXcgRGF0ZSkuZ2V0VGltZSgpLXRoaXMuYnJvd3NlckZvY3VzLmxhc3RGb2N1czwyMHx8IW0uaXNGb2N1c2VkKCkpKXttLmZvY3VzKCk7cmV0dXJufXZhciByPWEuZ2V0QnV0dG9uKCk7aWYociE9PTApe3AmJm0ubW92ZUN1cnNvclRvUG9zaXRpb24oaykscj09MiYmKG0udGV4dElucHV0Lm9uQ29udGV4dE1lbnUoe3g6YS5jbGllbnRYLHk6YS5jbGllbnRZfSxwKSxkLmNhcHR1cmUobS5jb250YWluZXIsZnVuY3Rpb24oKXt9LG0udGV4dElucHV0Lm9uQ29udGV4dE1lbnVDbG9zZSkpO3JldHVybn1ifHxDKGspO3ZhciBzPWMsdD1mLHU9KG5ldyBEYXRlKS5nZXRUaW1lKCksdix3LHgseT1mdW5jdGlvbihhKXtzPWQuZ2V0RG9jdW1lbnRYKGEpLHQ9ZC5nZXREb2N1bWVudFkoYSl9LHo9ZnVuY3Rpb24oYSl7Y2xlYXJJbnRlcnZhbChGKSxxPT1nP0Moayk6cT09aSYmQShhKSxuLiRjbGlja1NlbGVjdGlvbj1udWxsLHE9Z30sQT1mdW5jdGlvbihhKXtlLnJlbW92ZUNzc0NsYXNzKG0uY29udGFpbmVyLCJhY2VfZHJhZ2dpbmciKSxtLnNlc3Npb24ucmVtb3ZlTWFya2VyKHgpLG0uJG1vdXNlSGFuZGxlci4kY2xpY2tTZWxlY3Rpb258fHZ8fChtLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKGspLG0uc2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKGsucm93LGsuY29sdW1uKSk7aWYoIXYpcmV0dXJuO2lmKHcuY29udGFpbnModi5yb3csdi5jb2x1bW4pKXt2PW51bGw7cmV0dXJufW0uY2xlYXJTZWxlY3Rpb24oKTtpZihhJiYoYS5jdHJsS2V5fHxhLmFsdEtleSkpdmFyIGI9bS5zZXNzaW9uLGM9Yi5pbnNlcnQodixiLmdldFRleHRSYW5nZSh3KSk7ZWxzZSB2YXIgYz1tLm1vdmVUZXh0KHcsdik7aWYoIWMpe3Y9bnVsbDtyZXR1cm59bS5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UoYyl9LEI9ZnVuY3Rpb24oKXtpZihxPT1nKXt2YXIgYT1sKGMsZixzLHQpLGI9KG5ldyBEYXRlKS5nZXRUaW1lKCk7aWYoYT5qKXtxPWg7dmFyIGQ9bS5yZW5kZXJlci5zY3JlZW5Ub1RleHRDb29yZGluYXRlcyhzLHQpO2Qucm93PU1hdGgubWF4KDAsTWF0aC5taW4oZC5yb3csbS5zZXNzaW9uLmdldExlbmd0aCgpLTEpKSxDKGQpfWVsc2UgaWYoYi11Pm0uZ2V0RHJhZ0RlbGF5KCkpe3E9aSx3PW0uZ2V0U2VsZWN0aW9uUmFuZ2UoKTt2YXIgaz1tLmdldFNlbGVjdGlvblN0eWxlKCk7eD1tLnNlc3Npb24uYWRkTWFya2VyKHcsImFjZV9zZWxlY3Rpb24iLGspLG0uY2xlYXJTZWxlY3Rpb24oKSxlLmFkZENzc0NsYXNzKG0uY29udGFpbmVyLCJhY2VfZHJhZ2dpbmciKX19cT09aT9FKCk6cT09aCYmRCgpfSxEPWZ1bmN0aW9uKCl7dmFyIGEsYj1tLnJlbmRlcmVyLnNjcmVlblRvVGV4dENvb3JkaW5hdGVzKHMsdCk7Yi5yb3c9TWF0aC5tYXgoMCxNYXRoLm1pbihiLnJvdyxtLnNlc3Npb24uZ2V0TGVuZ3RoKCktMSkpLG4uJGNsaWNrU2VsZWN0aW9uP24uJGNsaWNrU2VsZWN0aW9uLmNvbnRhaW5zKGIucm93LGIuY29sdW1uKT9tLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShuLiRjbGlja1NlbGVjdGlvbik6KG4uJGNsaWNrU2VsZWN0aW9uLmNvbXBhcmUoYi5yb3csYi5jb2x1bW4pPT0tMT9hPW4uJGNsaWNrU2VsZWN0aW9uLmVuZDphPW4uJGNsaWNrU2VsZWN0aW9uLnN0YXJ0LG0uc2VsZWN0aW9uLnNldFNlbGVjdGlvbkFuY2hvcihhLnJvdyxhLmNvbHVtbiksbS5zZWxlY3Rpb24uc2VsZWN0VG9Qb3NpdGlvbihiKSk6bS5zZWxlY3Rpb24uc2VsZWN0VG9Qb3NpdGlvbihiKSxtLnJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KCl9LEU9ZnVuY3Rpb24oKXt2PW0ucmVuZGVyZXIuc2NyZWVuVG9UZXh0Q29vcmRpbmF0ZXMocyx0KSx2LnJvdz1NYXRoLm1heCgwLE1hdGgubWluKHYucm93LG0uc2Vzc2lvbi5nZXRMZW5ndGgoKS0xKSksbS5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbih2KX07ZC5jYXB0dXJlKG0uY29udGFpbmVyLHkseik7dmFyIEY9c2V0SW50ZXJ2YWwoQiwyMCk7cmV0dXJuIGEucHJldmVudERlZmF1bHQoKX0sdGhpcy5vbkRvdWJsZUNsaWNrPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0RG9jdW1lbnRQb3NpdGlvbigpLGM9dGhpcy5lZGl0b3I7Yy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihiKSxjLnNlbGVjdGlvbi5zZWxlY3RXb3JkKCksdGhpcy4kY2xpY2tTZWxlY3Rpb249Yy5nZXRTZWxlY3Rpb25SYW5nZSgpfSx0aGlzLm9uVHJpcGxlQ2xpY2s9ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXREb2N1bWVudFBvc2l0aW9uKCksYz10aGlzLmVkaXRvcjtjLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKGIpLGMuc2VsZWN0aW9uLnNlbGVjdExpbmUoKSx0aGlzLiRjbGlja1NlbGVjdGlvbj1jLmdldFNlbGVjdGlvblJhbmdlKCl9LHRoaXMub25RdWFkQ2xpY2s9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lZGl0b3I7Yi5zZWxlY3RBbGwoKSx0aGlzLiRjbGlja1NlbGVjdGlvbj1iLmdldFNlbGVjdGlvblJhbmdlKCl9LHRoaXMub25TY3JvbGw9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lZGl0b3I7Yi5yZW5kZXJlci5zY3JvbGxCeShhLndoZWVsWCphLnNwZWVkLGEud2hlZWxZKmEuc3BlZWQpO2lmKGIucmVuZGVyZXIuaXNTY3JvbGxhYmxlQnkoYS53aGVlbFgqYS5zcGVlZCxhLndoZWVsWSphLnNwZWVkKSlyZXR1cm4gYS5wcmV2ZW50RGVmYXVsdCgpfX0pKS5jYWxsKGsucHJvdG90eXBlKSxiLkRlZmF1bHRIYW5kbGVycz1rfSksZGVmaW5lKCJhY2UvbGliL2Jyb3dzZXJfZm9jdXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvZXZlbnQiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4vb29wIiksZT1hKCIuL2V2ZW50IiksZj1hKCIuL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsZz1mdW5jdGlvbihhKXthPWF8fHdpbmRvdyx0aGlzLmxhc3RGb2N1cz0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLl9pc0ZvY3VzZWQ9ITA7dmFyIGI9dGhpczsib25mb2N1c2luImluIGEuZG9jdW1lbnQ/KGUuYWRkTGlzdGVuZXIoYS5kb2N1bWVudCwiZm9jdXNpbiIsZnVuY3Rpb24oYSl7Yi5fc2V0Rm9jdXNlZCghMCl9KSxlLmFkZExpc3RlbmVyKGEuZG9jdW1lbnQsImZvY3Vzb3V0IixmdW5jdGlvbihhKXtiLl9zZXRGb2N1c2VkKCEhYS50b0VsZW1lbnQpfSkpOihlLmFkZExpc3RlbmVyKGEsImJsdXIiLGZ1bmN0aW9uKGEpe2IuX3NldEZvY3VzZWQoITEpfSksZS5hZGRMaXN0ZW5lcihhLCJmb2N1cyIsZnVuY3Rpb24oYSl7Yi5fc2V0Rm9jdXNlZCghMCl9KSl9OygoZnVuY3Rpb24oKXtkLmltcGxlbWVudCh0aGlzLGYpLHRoaXMuaXNGb2N1c2VkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzRm9jdXNlZH0sdGhpcy5fc2V0Rm9jdXNlZD1mdW5jdGlvbihhKXtpZih0aGlzLl9pc0ZvY3VzZWQ9PWEpcmV0dXJuO2EmJih0aGlzLmxhc3RGb2N1cz0obmV3IERhdGUpLmdldFRpbWUoKSksdGhpcy5faXNGb2N1c2VkPWEsdGhpcy5fZW1pdCgiY2hhbmdlRm9jdXMiKX19KSkuY2FsbChnLnByb3RvdHlwZSksYi5Ccm93c2VyRm9jdXM9Z30pLGRlZmluZSgiYWNlL2xpYi9ldmVudF9lbWl0dGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD17fTtkLl9lbWl0PWQuX2Rpc3BhdGNoRXZlbnQ9ZnVuY3Rpb24oYSxiKXt0aGlzLl9ldmVudFJlZ2lzdHJ5PXRoaXMuX2V2ZW50UmVnaXN0cnl8fHt9LHRoaXMuX2RlZmF1bHRIYW5kbGVycz10aGlzLl9kZWZhdWx0SGFuZGxlcnN8fHt9O3ZhciBjPXRoaXMuX2V2ZW50UmVnaXN0cnlbYV18fFtdLGQ9dGhpcy5fZGVmYXVsdEhhbmRsZXJzW2FdO2lmKCFjLmxlbmd0aCYmIWQpcmV0dXJuO2I9Ynx8e30sYi50eXBlPWEsYi5zdG9wUHJvcGFnYXRpb258fChiLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbigpe3RoaXMucHJvcGFnYXRpb25TdG9wcGVkPSEwfSksYi5wcmV2ZW50RGVmYXVsdHx8KGIucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITB9KTtmb3IodmFyIGU9MDtlPGMubGVuZ3RoO2UrKyl7Y1tlXShiKTtpZihiLnByb3BhZ2F0aW9uU3RvcHBlZClicmVha31kJiYhYi5kZWZhdWx0UHJldmVudGVkJiZkKGIpfSxkLnNldERlZmF1bHRIYW5kbGVyPWZ1bmN0aW9uKGEsYil7dGhpcy5fZGVmYXVsdEhhbmRsZXJzPXRoaXMuX2RlZmF1bHRIYW5kbGVyc3x8e307aWYodGhpcy5fZGVmYXVsdEhhbmRsZXJzW2FdKXRocm93IG5ldyBFcnJvcigiVGhlIGRlZmF1bHQgaGFuZGxlciBmb3IgJyIrYSsiJyBpcyBhbHJlYWR5IHNldCIpO3RoaXMuX2RlZmF1bHRIYW5kbGVyc1thXT1ifSxkLm9uPWQuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIpe3RoaXMuX2V2ZW50UmVnaXN0cnk9dGhpcy5fZXZlbnRSZWdpc3RyeXx8e307dmFyIGM9dGhpcy5fZXZlbnRSZWdpc3RyeVthXTtpZighYyl2YXIgYz10aGlzLl9ldmVudFJlZ2lzdHJ5W2FdPVtdO2MuaW5kZXhPZihiKT09LTEmJmMucHVzaChiKX0sZC5yZW1vdmVMaXN0ZW5lcj1kLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiKXt0aGlzLl9ldmVudFJlZ2lzdHJ5PXRoaXMuX2V2ZW50UmVnaXN0cnl8fHt9O3ZhciBjPXRoaXMuX2V2ZW50UmVnaXN0cnlbYV07aWYoIWMpcmV0dXJuO3ZhciBkPWMuaW5kZXhPZihiKTtkIT09LTEmJmMuc3BsaWNlKGQsMSl9LGQucmVtb3ZlQWxsTGlzdGVuZXJzPWZ1bmN0aW9uKGEpe3RoaXMuX2V2ZW50UmVnaXN0cnkmJih0aGlzLl9ldmVudFJlZ2lzdHJ5W2FdPVtdKX0sYi5FdmVudEVtaXR0ZXI9ZH0pLGRlZmluZSgiYWNlL21vdXNlL2RlZmF1bHRfZ3V0dGVyX2hhbmRsZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXthLnNldERlZmF1bHRIYW5kbGVyKCJndXR0ZXJjbGljayIsZnVuY3Rpb24oYil7dmFyIGM9Yi5nZXREb2N1bWVudFBvc2l0aW9uKCkucm93LGQ9YS5zZXNzaW9uLnNlbGVjdGlvbjtkLm1vdmVDdXJzb3JUbyhjLDApLGQuc2VsZWN0TGluZSgpfSl9InVzZSBzdHJpY3QiLGIuR3V0dGVySGFuZGxlcj1kfSksZGVmaW5lKCJhY2UvbW91c2UvbW91c2VfZXZlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2V2ZW50Il0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvZXZlbnQiKSxlPWIuTW91c2VFdmVudD1mdW5jdGlvbihhLGIpe3RoaXMuZG9tRXZlbnQ9YSx0aGlzLmVkaXRvcj1iLHRoaXMucGFnZVg9ZC5nZXREb2N1bWVudFgoYSksdGhpcy5wYWdlWT1kLmdldERvY3VtZW50WShhKSx0aGlzLmNsaWVudFg9YS5jbGllbnRYLHRoaXMuY2xpZW50WT1hLmNsaWVudFksdGhpcy4kcG9zPW51bGwsdGhpcy4kaW5TZWxlY3Rpb249bnVsbCx0aGlzLnByb3BhZ2F0aW9uU3RvcHBlZD0hMSx0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITF9OygoZnVuY3Rpb24oKXt0aGlzLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbigpe2Quc3RvcFByb3BhZ2F0aW9uKHRoaXMuZG9tRXZlbnQpLHRoaXMucHJvcGFnYXRpb25TdG9wcGVkPSEwfSx0aGlzLnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKCl7ZC5wcmV2ZW50RGVmYXVsdCh0aGlzLmRvbUV2ZW50KSx0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITB9LHRoaXMuc3RvcD1mdW5jdGlvbigpe3RoaXMuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5wcmV2ZW50RGVmYXVsdCgpfSx0aGlzLmdldERvY3VtZW50UG9zaXRpb249ZnVuY3Rpb24oKXtpZih0aGlzLiRwb3MpcmV0dXJuIHRoaXMuJHBvczt2YXIgYT1kLmdldERvY3VtZW50WCh0aGlzLmRvbUV2ZW50KSxiPWQuZ2V0RG9jdW1lbnRZKHRoaXMuZG9tRXZlbnQpO3JldHVybiB0aGlzLiRwb3M9dGhpcy5lZGl0b3IucmVuZGVyZXIuc2NyZWVuVG9UZXh0Q29vcmRpbmF0ZXMoYSxiKSx0aGlzLiRwb3Mucm93PU1hdGgubWF4KDAsTWF0aC5taW4odGhpcy4kcG9zLnJvdyx0aGlzLmVkaXRvci5zZXNzaW9uLmdldExlbmd0aCgpLTEpKSx0aGlzLiRwb3N9LHRoaXMuaW5TZWxlY3Rpb249ZnVuY3Rpb24oKXtpZih0aGlzLiRpblNlbGVjdGlvbiE9PW51bGwpcmV0dXJuIHRoaXMuJGluU2VsZWN0aW9uO3ZhciBhPXRoaXMuZWRpdG9yO2lmKGEuZ2V0UmVhZE9ubHkoKSl0aGlzLiRpblNlbGVjdGlvbj0hMTtlbHNle3ZhciBiPWEuZ2V0U2VsZWN0aW9uUmFuZ2UoKTtpZihiLmlzRW1wdHkoKSl0aGlzLiRpblNlbGVjdGlvbj0hMTtlbHNle3ZhciBjPXRoaXMuZ2V0RG9jdW1lbnRQb3NpdGlvbigpO3RoaXMuJGluU2VsZWN0aW9uPWIuY29udGFpbnMoYy5yb3csYy5jb2x1bW4pfX1yZXR1cm4gdGhpcy4kaW5TZWxlY3Rpb259LHRoaXMuZ2V0QnV0dG9uPWZ1bmN0aW9uKCl7cmV0dXJuIGQuZ2V0QnV0dG9uKHRoaXMuZG9tRXZlbnQpfSx0aGlzLmdldFNoaWZ0S2V5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tRXZlbnQuc2hpZnRLZXl9LHRoaXMuZ2V0QWNjZWxLZXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21FdmVudC5jdHJsS2V5fHx0aGlzLmRvbUV2ZW50Lm1ldGFLZXl9fSkpLmNhbGwoZS5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW91c2UvZm9sZF9oYW5kbGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7YS5vbigiY2xpY2siLGZ1bmN0aW9uKGIpe3ZhciBjPWIuZ2V0RG9jdW1lbnRQb3NpdGlvbigpLGQ9YS5zZXNzaW9uLGU9ZC5nZXRGb2xkQXQoYy5yb3csYy5jb2x1bW4sMSk7ZSYmKGIuZ2V0QWNjZWxLZXkoKT9kLnJlbW92ZUZvbGQoZSk6ZC5leHBhbmRGb2xkKGUpLGIuc3RvcCgpKX0pLGEub24oImd1dHRlcmNsaWNrIixmdW5jdGlvbihiKXtpZihiLmRvbUV2ZW50LnRhcmdldC5jbGFzc05hbWUuaW5kZXhPZigiYWNlX2ZvbGQtd2lkZ2V0IikhPS0xKXt2YXIgYz1iLmdldERvY3VtZW50UG9zaXRpb24oKS5yb3c7YS5zZXNzaW9uLm9uRm9sZFdpZGdldENsaWNrKGMsYi5kb21FdmVudCksYi5zdG9wKCl9fSl9InVzZSBzdHJpY3QiLGIuRm9sZEhhbmRsZXI9ZH0pLGRlZmluZSgiYWNlL2tleWJvYXJkL2tleWJpbmRpbmciLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2tleXMiLCJhY2UvbGliL2V2ZW50IiwiYWNlL2NvbW1hbmRzL2RlZmF1bHRfY29tbWFuZHMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9rZXlzIiksZT1hKCIuLi9saWIvZXZlbnQiKTthKCIuLi9jb21tYW5kcy9kZWZhdWx0X2NvbW1hbmRzIik7dmFyIGY9ZnVuY3Rpb24oYSl7dGhpcy4kZWRpdG9yPWEsdGhpcy4kZGF0YT17fSx0aGlzLiRoYW5kbGVycz1bdGhpc119OygoZnVuY3Rpb24oKXt0aGlzLnNldEtleWJvYXJkSGFuZGxlcj1mdW5jdGlvbihhKXtpZih0aGlzLiRoYW5kbGVyc1t0aGlzLiRoYW5kbGVycy5sZW5ndGgtMV09PWEpcmV0dXJuO3RoaXMuJGRhdGE9e30sdGhpcy4kaGFuZGxlcnM9YT9bdGhpcyxhXTpbdGhpc119LHRoaXMuYWRkS2V5Ym9hcmRIYW5kbGVyPWZ1bmN0aW9uKGEpe3RoaXMucmVtb3ZlS2V5Ym9hcmRIYW5kbGVyKGEpLHRoaXMuJGhhbmRsZXJzLnB1c2goYSl9LHRoaXMucmVtb3ZlS2V5Ym9hcmRIYW5kbGVyPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuJGhhbmRsZXJzLmluZGV4T2YoYSk7cmV0dXJuIGI9PS0xPyExOih0aGlzLiRoYW5kbGVycy5zcGxpY2UoYiwxKSwhMCl9LHRoaXMuZ2V0S2V5Ym9hcmRIYW5kbGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGhhbmRsZXJzW3RoaXMuJGhhbmRsZXJzLmxlbmd0aC0xXX0sdGhpcy4kY2FsbEtleWJvYXJkSGFuZGxlcnM9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGY7Zm9yKHZhciBnPXRoaXMuJGhhbmRsZXJzLmxlbmd0aDtnLS07KXtmPXRoaXMuJGhhbmRsZXJzW2ddLmhhbmRsZUtleWJvYXJkKHRoaXMuJGRhdGEsYSxiLGMsZCk7aWYoZiYmZi5jb21tYW5kKWJyZWFrfWlmKCFmfHwhZi5jb21tYW5kKXJldHVybiExO3ZhciBoPSExLGk9dGhpcy4kZWRpdG9yLmNvbW1hbmRzO3JldHVybiBmLmNvbW1hbmQhPSJudWxsIj9oPWkuZXhlYyhmLmNvbW1hbmQsdGhpcy4kZWRpdG9yLGYuYXJncyk6aD0hMCxoJiZkJiZlLnN0b3BFdmVudChkKSxofSx0aGlzLmhhbmRsZUtleWJvYXJkPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm57Y29tbWFuZDp0aGlzLiRlZGl0b3IuY29tbWFuZHMuZmluZEtleUNvbW1hbmQoYixjKX19LHRoaXMub25Db21tYW5kS2V5PWZ1bmN0aW9uKGEsYixjKXt2YXIgZT1kLmtleUNvZGVUb1N0cmluZyhjKTt0aGlzLiRjYWxsS2V5Ym9hcmRIYW5kbGVycyhiLGUsYyxhKX0sdGhpcy5vblRleHRJbnB1dD1mdW5jdGlvbihhLGIpe3ZhciBjPSExOyFiJiZhLmxlbmd0aD09MSYmKGM9dGhpcy4kY2FsbEtleWJvYXJkSGFuZGxlcnMoMCxhKSksY3x8dGhpcy4kZWRpdG9yLmNvbW1hbmRzLmV4ZWMoImluc2VydHN0cmluZyIsdGhpcy4kZWRpdG9yLGEpfX0pKS5jYWxsKGYucHJvdG90eXBlKSxiLktleUJpbmRpbmc9Zn0pLGRlZmluZSgiYWNlL2NvbW1hbmRzL2RlZmF1bHRfY29tbWFuZHMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2xhbmciXSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZShhLGIpe3JldHVybnt3aW46YSxtYWM6Yn19InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9sYW5nIik7Yi5jb21tYW5kcz1be25hbWU6InNlbGVjdGFsbCIsYmluZEtleTplKCJDdHJsLUEiLCJDb21tYW5kLUEiKSxleGVjOmZ1bmN0aW9uKGEpe2Euc2VsZWN0QWxsKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToiY2VudGVyc2VsZWN0aW9uIixiaW5kS2V5OmUobnVsbCwiQ3RybC1MIiksZXhlYzpmdW5jdGlvbihhKXthLmNlbnRlclNlbGVjdGlvbigpfSxyZWFkT25seTohMH0se25hbWU6ImdvdG9saW5lIixiaW5kS2V5OmUoIkN0cmwtTCIsIkNvbW1hbmQtTCIpLGV4ZWM6ZnVuY3Rpb24oYSl7dmFyIGI9cGFyc2VJbnQocHJvbXB0KCJFbnRlciBsaW5lIG51bWJlcjoiKSwxMCk7aXNOYU4oYil8fGEuZ290b0xpbmUoYil9LHJlYWRPbmx5OiEwfSx7bmFtZToiZm9sZCIsYmluZEtleTplKCJBbHQtTCIsIkFsdC1MIiksZXhlYzpmdW5jdGlvbihhKXthLnNlc3Npb24udG9nZ2xlRm9sZCghMSl9LHJlYWRPbmx5OiEwfSx7bmFtZToidW5mb2xkIixiaW5kS2V5OmUoIkFsdC1TaGlmdC1MIiwiQWx0LVNoaWZ0LUwiKSxleGVjOmZ1bmN0aW9uKGEpe2Euc2Vzc2lvbi50b2dnbGVGb2xkKCEwKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJmb2xkYWxsIixiaW5kS2V5OmUoIkFsdC0wIiwiQWx0LTAiKSxleGVjOmZ1bmN0aW9uKGEpe2Euc2Vzc2lvbi5mb2xkQWxsKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToidW5mb2xkYWxsIixiaW5kS2V5OmUoIkFsdC1TaGlmdC0wIiwiQWx0LVNoaWZ0LTAiKSxleGVjOmZ1bmN0aW9uKGEpe2Euc2Vzc2lvbi51bmZvbGQoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJmaW5kbmV4dCIsYmluZEtleTplKCJDdHJsLUsiLCJDb21tYW5kLUciKSxleGVjOmZ1bmN0aW9uKGEpe2EuZmluZE5leHQoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJmaW5kcHJldmlvdXMiLGJpbmRLZXk6ZSgiQ3RybC1TaGlmdC1LIiwiQ29tbWFuZC1TaGlmdC1HIiksZXhlYzpmdW5jdGlvbihhKXthLmZpbmRQcmV2aW91cygpfSxyZWFkT25seTohMH0se25hbWU6ImZpbmQiLGJpbmRLZXk6ZSgiQ3RybC1GIiwiQ29tbWFuZC1GIiksZXhlYzpmdW5jdGlvbihhKXt2YXIgYj1wcm9tcHQoIkZpbmQ6IixhLmdldENvcHlUZXh0KCkpO2EuZmluZChiKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJvdmVyd3JpdGUiLGJpbmRLZXk6ZSgiSW5zZXJ0IiwiSW5zZXJ0IiksZXhlYzpmdW5jdGlvbihhKXthLnRvZ2dsZU92ZXJ3cml0ZSgpfSxyZWFkT25seTohMH0se25hbWU6InNlbGVjdHRvc3RhcnQiLGJpbmRLZXk6ZSgiQ3RybC1TaGlmdC1Ib21lfEFsdC1TaGlmdC1VcCIsIkNvbW1hbmQtU2hpZnQtVXAiKSxleGVjOmZ1bmN0aW9uKGEpe2EuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0RmlsZVN0YXJ0KCl9LHJlYWRPbmx5OiEwfSx7bmFtZToiZ290b3N0YXJ0IixiaW5kS2V5OmUoIkN0cmwtSG9tZXxDdHJsLVVwIiwiQ29tbWFuZC1Ib21lfENvbW1hbmQtVXAiKSxleGVjOmZ1bmN0aW9uKGEpe2EubmF2aWdhdGVGaWxlU3RhcnQoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3R1cCIsYmluZEtleTplKCJTaGlmdC1VcCIsIlNoaWZ0LVVwIiksZXhlYzpmdW5jdGlvbihhKXthLmdldFNlbGVjdGlvbigpLnNlbGVjdFVwKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToiZ29saW5ldXAiLGJpbmRLZXk6ZSgiVXAiLCJVcHxDdHJsLVAiKSxleGVjOmZ1bmN0aW9uKGEsYil7YS5uYXZpZ2F0ZVVwKGIudGltZXMpfSxyZWFkT25seTohMH0se25hbWU6InNlbGVjdHRvZW5kIixiaW5kS2V5OmUoIkN0cmwtU2hpZnQtRW5kfEFsdC1TaGlmdC1Eb3duIiwiQ29tbWFuZC1TaGlmdC1Eb3duIiksZXhlYzpmdW5jdGlvbihhKXthLmdldFNlbGVjdGlvbigpLnNlbGVjdEZpbGVFbmQoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJnb3RvZW5kIixiaW5kS2V5OmUoIkN0cmwtRW5kfEN0cmwtRG93biIsIkNvbW1hbmQtRW5kfENvbW1hbmQtRG93biIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5uYXZpZ2F0ZUZpbGVFbmQoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3Rkb3duIixiaW5kS2V5OmUoIlNoaWZ0LURvd24iLCJTaGlmdC1Eb3duIiksZXhlYzpmdW5jdGlvbihhKXthLmdldFNlbGVjdGlvbigpLnNlbGVjdERvd24oKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJnb2xpbmVkb3duIixiaW5kS2V5OmUoIkRvd24iLCJEb3dufEN0cmwtTiIpLGV4ZWM6ZnVuY3Rpb24oYSxiKXthLm5hdmlnYXRlRG93bihiLnRpbWVzKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3R3b3JkbGVmdCIsYmluZEtleTplKCJDdHJsLVNoaWZ0LUxlZnQiLCJPcHRpb24tU2hpZnQtTGVmdCIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RXb3JkTGVmdCgpfSxyZWFkT25seTohMH0se25hbWU6ImdvdG93b3JkbGVmdCIsYmluZEtleTplKCJDdHJsLUxlZnQiLCJPcHRpb24tTGVmdCIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5uYXZpZ2F0ZVdvcmRMZWZ0KCl9LHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0dG9saW5lc3RhcnQiLGJpbmRLZXk6ZSgiQWx0LVNoaWZ0LUxlZnQiLCJDb21tYW5kLVNoaWZ0LUxlZnQiKSxleGVjOmZ1bmN0aW9uKGEpe2EuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0TGluZVN0YXJ0KCl9LHJlYWRPbmx5OiEwfSx7bmFtZToiZ290b2xpbmVzdGFydCIsYmluZEtleTplKCJBbHQtTGVmdHxIb21lIiwiQ29tbWFuZC1MZWZ0fEhvbWV8Q3RybC1BIiksZXhlYzpmdW5jdGlvbihhKXthLm5hdmlnYXRlTGluZVN0YXJ0KCl9LHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0bGVmdCIsYmluZEtleTplKCJTaGlmdC1MZWZ0IiwiU2hpZnQtTGVmdCIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RMZWZ0KCl9LHJlYWRPbmx5OiEwfSx7bmFtZToiZ290b2xlZnQiLGJpbmRLZXk6ZSgiTGVmdCIsIkxlZnR8Q3RybC1CIiksZXhlYzpmdW5jdGlvbihhLGIpe2EubmF2aWdhdGVMZWZ0KGIudGltZXMpfSxyZWFkT25seTohMH0se25hbWU6InNlbGVjdHdvcmRyaWdodCIsYmluZEtleTplKCJDdHJsLVNoaWZ0LVJpZ2h0IiwiT3B0aW9uLVNoaWZ0LVJpZ2h0IiksZXhlYzpmdW5jdGlvbihhKXthLmdldFNlbGVjdGlvbigpLnNlbGVjdFdvcmRSaWdodCgpfSxyZWFkT25seTohMH0se25hbWU6ImdvdG93b3JkcmlnaHQiLGJpbmRLZXk6ZSgiQ3RybC1SaWdodCIsIk9wdGlvbi1SaWdodCIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5uYXZpZ2F0ZVdvcmRSaWdodCgpfSxyZWFkT25seTohMH0se25hbWU6InNlbGVjdHRvbGluZWVuZCIsYmluZEtleTplKCJBbHQtU2hpZnQtUmlnaHQiLCJDb21tYW5kLVNoaWZ0LVJpZ2h0IiksZXhlYzpmdW5jdGlvbihhKXthLmdldFNlbGVjdGlvbigpLnNlbGVjdExpbmVFbmQoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJnb3RvbGluZWVuZCIsYmluZEtleTplKCJBbHQtUmlnaHR8RW5kIiwiQ29tbWFuZC1SaWdodHxFbmR8Q3RybC1FIiksZXhlYzpmdW5jdGlvbihhKXthLm5hdmlnYXRlTGluZUVuZCgpfSxyZWFkT25seTohMH0se25hbWU6InNlbGVjdHJpZ2h0IixiaW5kS2V5OmUoIlNoaWZ0LVJpZ2h0IiwiU2hpZnQtUmlnaHQiKSxleGVjOmZ1bmN0aW9uKGEpe2EuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0UmlnaHQoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJnb3RvcmlnaHQiLGJpbmRLZXk6ZSgiUmlnaHQiLCJSaWdodHxDdHJsLUYiKSxleGVjOmZ1bmN0aW9uKGEsYil7YS5uYXZpZ2F0ZVJpZ2h0KGIudGltZXMpfSxyZWFkT25seTohMH0se25hbWU6InNlbGVjdHBhZ2Vkb3duIixiaW5kS2V5OmUoIlNoaWZ0LVBhZ2VEb3duIiwiU2hpZnQtUGFnZURvd24iKSxleGVjOmZ1bmN0aW9uKGEpe2Euc2VsZWN0UGFnZURvd24oKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJwYWdlZG93biIsYmluZEtleTplKG51bGwsIlBhZ2VEb3duIiksZXhlYzpmdW5jdGlvbihhKXthLnNjcm9sbFBhZ2VEb3duKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToiZ290b3BhZ2Vkb3duIixiaW5kS2V5OmUoIlBhZ2VEb3duIiwiT3B0aW9uLVBhZ2VEb3dufEN0cmwtViIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5nb3RvUGFnZURvd24oKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3RwYWdldXAiLGJpbmRLZXk6ZSgiU2hpZnQtUGFnZVVwIiwiU2hpZnQtUGFnZVVwIiksZXhlYzpmdW5jdGlvbihhKXthLnNlbGVjdFBhZ2VVcCgpfSxyZWFkT25seTohMH0se25hbWU6InBhZ2V1cCIsYmluZEtleTplKG51bGwsIlBhZ2VVcCIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5zY3JvbGxQYWdlVXAoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJnb3RvcGFnZXVwIixiaW5kS2V5OmUoIlBhZ2VVcCIsIk9wdGlvbi1QYWdlVXAiKSxleGVjOmZ1bmN0aW9uKGEpe2EuZ290b1BhZ2VVcCgpfSxyZWFkT25seTohMH0se25hbWU6InNlbGVjdGxpbmVzdGFydCIsYmluZEtleTplKCJTaGlmdC1Ib21lIiwiU2hpZnQtSG9tZSIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RMaW5lU3RhcnQoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3RsaW5lZW5kIixiaW5kS2V5OmUoIlNoaWZ0LUVuZCIsIlNoaWZ0LUVuZCIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RMaW5lRW5kKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToidG9nZ2xlcmVjb3JkaW5nIixiaW5kS2V5OmUoIkN0cmwtQWx0LUUiLCJDb21tYW5kLU9wdGlvbi1FIiksZXhlYzpmdW5jdGlvbihhKXthLmNvbW1hbmRzLnRvZ2dsZVJlY29yZGluZygpfSxyZWFkT25seTohMH0se25hbWU6InJlcGxheW1hY3JvIixiaW5kS2V5OmUoIkN0cmwtU2hpZnQtRSIsIkNvbW1hbmQtU2hpZnQtRSIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5jb21tYW5kcy5yZXBsYXkoYSl9LHJlYWRPbmx5OiEwfSx7bmFtZToianVtcHRvbWF0Y2hpbmciLGJpbmRLZXk6ZSgiQ3RybC1TaGlmdC1QIiwiQ3RybC1TaGlmdC1QIiksZXhlYzpmdW5jdGlvbihhKXthLmp1bXBUb01hdGNoaW5nKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToicmVtb3ZlbGluZSIsYmluZEtleTplKCJDdHJsLUQiLCJDb21tYW5kLUQiKSxleGVjOmZ1bmN0aW9uKGEpe2EucmVtb3ZlTGluZXMoKX19LHtuYW1lOiJ0b2dnbGVjb21tZW50IixiaW5kS2V5OmUoIkN0cmwtNyIsIkNvbW1hbmQtNyIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS50b2dnbGVDb21tZW50TGluZXMoKX19LHtuYW1lOiJyZXBsYWNlIixiaW5kS2V5OmUoIkN0cmwtUiIsIkNvbW1hbmQtT3B0aW9uLUYiKSxleGVjOmZ1bmN0aW9uKGEpe3ZhciBiPXByb21wdCgiRmluZDoiLGEuZ2V0Q29weVRleHQoKSk7aWYoIWIpcmV0dXJuO3ZhciBjPXByb21wdCgiUmVwbGFjZW1lbnQ6Iik7aWYoIWMpcmV0dXJuO2EucmVwbGFjZShjLHtuZWVkbGU6Yn0pfX0se25hbWU6InJlcGxhY2VhbGwiLGJpbmRLZXk6ZSgiQ3RybC1TaGlmdC1SIiwiQ29tbWFuZC1TaGlmdC1PcHRpb24tRiIpLGV4ZWM6ZnVuY3Rpb24oYSl7dmFyIGI9cHJvbXB0KCJGaW5kOiIpO2lmKCFiKXJldHVybjt2YXIgYz1wcm9tcHQoIlJlcGxhY2VtZW50OiIpO2lmKCFjKXJldHVybjthLnJlcGxhY2VBbGwoYyx7bmVlZGxlOmJ9KX19LHtuYW1lOiJ1bmRvIixiaW5kS2V5OmUoIkN0cmwtWiIsIkNvbW1hbmQtWiIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS51bmRvKCl9fSx7bmFtZToicmVkbyIsYmluZEtleTplKCJDdHJsLVNoaWZ0LVp8Q3RybC1ZIiwiQ29tbWFuZC1TaGlmdC1afENvbW1hbmQtWSIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5yZWRvKCl9fSx7bmFtZToiY29weWxpbmVzdXAiLGJpbmRLZXk6ZSgiQ3RybC1BbHQtVXAiLCJDb21tYW5kLU9wdGlvbi1VcCIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5jb3B5TGluZXNVcCgpfX0se25hbWU6Im1vdmVsaW5lc3VwIixiaW5kS2V5OmUoIkFsdC1VcCIsIk9wdGlvbi1VcCIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5tb3ZlTGluZXNVcCgpfX0se25hbWU6ImNvcHlsaW5lc2Rvd24iLGJpbmRLZXk6ZSgiQ3RybC1BbHQtRG93biIsIkNvbW1hbmQtT3B0aW9uLURvd24iKSxleGVjOmZ1bmN0aW9uKGEpe2EuY29weUxpbmVzRG93bigpfX0se25hbWU6Im1vdmVsaW5lc2Rvd24iLGJpbmRLZXk6ZSgiQWx0LURvd24iLCJPcHRpb24tRG93biIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5tb3ZlTGluZXNEb3duKCl9fSx7bmFtZToiZGVsIixiaW5kS2V5OmUoIkRlbGV0ZSIsIkRlbGV0ZXxDdHJsLUQiKSxleGVjOmZ1bmN0aW9uKGEpe2EucmVtb3ZlKCJyaWdodCIpfX0se25hbWU6ImJhY2tzcGFjZSIsYmluZEtleTplKCJDdHJsLUJhY2tzcGFjZXxDb21tYW5kLUJhY2tzcGFjZXxPcHRpb24tQmFja3NwYWNlfFNoaWZ0LUJhY2tzcGFjZXxCYWNrc3BhY2UiLCJDdHJsLUJhY2tzcGFjZXxDb21tYW5kLUJhY2tzcGFjZXxTaGlmdC1CYWNrc3BhY2V8QmFja3NwYWNlfEN0cmwtSCIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5yZW1vdmUoImxlZnQiKX19LHtuYW1lOiJyZW1vdmV0b2xpbmVzdGFydCIsYmluZEtleTplKCJBbHQtQmFja3NwYWNlIiwiT3B0aW9uLUJhY2tzcGFjZSIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5yZW1vdmVUb0xpbmVTdGFydCgpfX0se25hbWU6InJlbW92ZXRvbGluZWVuZCIsYmluZEtleTplKCJBbHQtRGVsZXRlIiwiQ3RybC1LIiksZXhlYzpmdW5jdGlvbihhKXthLnJlbW92ZVRvTGluZUVuZCgpfX0se25hbWU6InJlbW92ZXdvcmRsZWZ0IixiaW5kS2V5OmUoIkN0cmwtQmFja3NwYWNlIiwiQWx0LUJhY2tzcGFjZXxDdHJsLUFsdC1CYWNrc3BhY2UiKSxleGVjOmZ1bmN0aW9uKGEpe2EucmVtb3ZlV29yZExlZnQoKX19LHtuYW1lOiJyZW1vdmV3b3JkcmlnaHQiLGJpbmRLZXk6ZSgiQ3RybC1EZWxldGUiLCJBbHQtRGVsZXRlIiksZXhlYzpmdW5jdGlvbihhKXthLnJlbW92ZVdvcmRSaWdodCgpfX0se25hbWU6Im91dGRlbnQiLGJpbmRLZXk6ZSgiU2hpZnQtVGFiIiwiU2hpZnQtVGFiIiksZXhlYzpmdW5jdGlvbihhKXthLmJsb2NrT3V0ZGVudCgpfX0se25hbWU6ImluZGVudCIsYmluZEtleTplKCJUYWIiLCJUYWIiKSxleGVjOmZ1bmN0aW9uKGEpe2EuaW5kZW50KCl9fSx7bmFtZToiaW5zZXJ0c3RyaW5nIixleGVjOmZ1bmN0aW9uKGEsYil7YS5pbnNlcnQoYil9fSx7bmFtZToiaW5zZXJ0dGV4dCIsZXhlYzpmdW5jdGlvbihhLGIpe2EuaW5zZXJ0KGQuc3RyaW5nUmVwZWF0KGIudGV4dHx8IiIsYi50aW1lc3x8MSkpfX0se25hbWU6InNwbGl0bGluZSIsYmluZEtleTplKG51bGwsIkN0cmwtTyIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS5zcGxpdExpbmUoKX19LHtuYW1lOiJ0cmFuc3Bvc2VsZXR0ZXJzIixiaW5kS2V5OmUoIkN0cmwtVCIsIkN0cmwtVCIpLGV4ZWM6ZnVuY3Rpb24oYSl7YS50cmFuc3Bvc2VMZXR0ZXJzKCl9fSx7bmFtZToidG91cHBlcmNhc2UiLGJpbmRLZXk6ZSgiQ3RybC1VIiwiQ3RybC1VIiksZXhlYzpmdW5jdGlvbihhKXthLnRvVXBwZXJDYXNlKCl9fSx7bmFtZToidG9sb3dlcmNhc2UiLGJpbmRLZXk6ZSgiQ3RybC1TaGlmdC1VIiwiQ3RybC1TaGlmdC1VIiksZXhlYzpmdW5jdGlvbihhKXthLnRvTG93ZXJDYXNlKCl9fV19KSxkZWZpbmUoImFjZS9lZGl0X3Nlc3Npb24iLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9saWIvZXZlbnRfZW1pdHRlciIsImFjZS9zZWxlY3Rpb24iLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3JhbmdlIiwiYWNlL2RvY3VtZW50IiwiYWNlL2JhY2tncm91bmRfdG9rZW5pemVyIiwiYWNlL2VkaXRfc2Vzc2lvbi9mb2xkaW5nIiwiYWNlL2VkaXRfc2Vzc2lvbi9icmFja2V0X21hdGNoIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuL2xpYi9vb3AiKSxlPWEoIi4vbGliL2xhbmciKSxmPWEoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsZz1hKCIuL3NlbGVjdGlvbiIpLlNlbGVjdGlvbixoPWEoIi4vbW9kZS90ZXh0IikuTW9kZSxpPWEoIi4vcmFuZ2UiKS5SYW5nZSxqPWEoIi4vZG9jdW1lbnQiKS5Eb2N1bWVudCxrPWEoIi4vYmFja2dyb3VuZF90b2tlbml6ZXIiKS5CYWNrZ3JvdW5kVG9rZW5pemVyLGw9ZnVuY3Rpb24oYSxiKXt0aGlzLiRtb2RpZmllZD0hMCx0aGlzLiRicmVha3BvaW50cz1bXSx0aGlzLiRmcm9udE1hcmtlcnM9e30sdGhpcy4kYmFja01hcmtlcnM9e30sdGhpcy4kbWFya2VySWQ9MSx0aGlzLiRyb3dDYWNoZT1bXSx0aGlzLiR3cmFwRGF0YT1bXSx0aGlzLiRmb2xkRGF0YT1bXSx0aGlzLiR1bmRvU2VsZWN0PSEwLHRoaXMuJGZvbGREYXRhLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGE9IiI7cmV0dXJuIHRoaXMuZm9yRWFjaChmdW5jdGlvbihiKXthKz0iXG4iK2IudG9TdHJpbmcoKX0pLGF9LGEgaW5zdGFuY2VvZiBqP3RoaXMuc2V0RG9jdW1lbnQoYSk6dGhpcy5zZXREb2N1bWVudChuZXcgaihhKSksdGhpcy5zZWxlY3Rpb249bmV3IGcodGhpcyksYj90aGlzLnNldE1vZGUoYik6dGhpcy5zZXRNb2RlKG5ldyBoKX07KChmdW5jdGlvbigpe2Z1bmN0aW9uIG8oYSl7cmV0dXJuIGE8NDM1Mj8hMTphPj00MzUyJiZhPD00NDQ3fHxhPj00NTE1JiZhPD00NTE5fHxhPj00NjAyJiZhPD00NjA3fHxhPj05MDAxJiZhPD05MDAyfHxhPj0xMTkwNCYmYTw9MTE5Mjl8fGE+PTExOTMxJiZhPD0xMjAxOXx8YT49MTIwMzImJmE8PTEyMjQ1fHxhPj0xMjI3MiYmYTw9MTIyODN8fGE+PTEyMjg4JiZhPD0xMjM1MHx8YT49MTIzNTMmJmE8PTEyNDM4fHxhPj0xMjQ0MSYmYTw9MTI1NDN8fGE+PTEyNTQ5JiZhPD0xMjU4OXx8YT49MTI1OTMmJmE8PTEyNjg2fHxhPj0xMjY4OCYmYTw9MTI3MzB8fGE+PTEyNzM2JiZhPD0xMjc3MXx8YT49MTI3ODQmJmE8PTEyODMwfHxhPj0xMjgzMiYmYTw9MTI4NzF8fGE+PTEyODgwJiZhPD0xMzA1NHx8YT49MTMwNTYmJmE8PTE5OTAzfHxhPj0xOTk2OCYmYTw9NDIxMjR8fGE+PTQyMTI4JiZhPD00MjE4Mnx8YT49NDMzNjAmJmE8PTQzMzg4fHxhPj00NDAzMiYmYTw9NTUyMDN8fGE+PTU1MjE2JiZhPD01NTIzOHx8YT49NTUyNDMmJmE8PTU1MjkxfHxhPj02Mzc0NCYmYTw9NjQyNTV8fGE+PTY1MDQwJiZhPD02NTA0OXx8YT49NjUwNzImJmE8PTY1MTA2fHxhPj02NTEwOCYmYTw9NjUxMjZ8fGE+PTY1MTI4JiZhPD02NTEzMXx8YT49NjUyODEmJmE8PTY1Mzc2fHxhPj02NTUwNCYmYTw9NjU1MTB9ZC5pbXBsZW1lbnQodGhpcyxmKSx0aGlzLnNldERvY3VtZW50PWZ1bmN0aW9uKGEpe2lmKHRoaXMuZG9jKXRocm93IG5ldyBFcnJvcigiRG9jdW1lbnQgaXMgYWxyZWFkeSBzZXQiKTt0aGlzLmRvYz1hLGEub24oImNoYW5nZSIsdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpKSx0aGlzLm9uKCJjaGFuZ2VGb2xkIix0aGlzLm9uQ2hhbmdlRm9sZC5iaW5kKHRoaXMpKSx0aGlzLmJnVG9rZW5pemVyJiYodGhpcy5iZ1Rva2VuaXplci5zZXREb2N1bWVudCh0aGlzLmdldERvY3VtZW50KCkpLHRoaXMuYmdUb2tlbml6ZXIuc3RhcnQoMCkpfSx0aGlzLmdldERvY3VtZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9jfSx0aGlzLiRyZXNldFJvd0NhY2hlPWZ1bmN0aW9uKGEpe2lmKGE9PTApe3RoaXMuJHJvd0NhY2hlPVtdO3JldHVybn12YXIgYj10aGlzLiRyb3dDYWNoZTtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylpZihiW2NdLmRvY1Jvdz49YSl7Yi5zcGxpY2UoYyxiLmxlbmd0aCk7cmV0dXJufX0sdGhpcy5vbkNoYW5nZUZvbGQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5kYXRhO3RoaXMuJHJlc2V0Um93Q2FjaGUoYi5zdGFydC5yb3cpfSx0aGlzLm9uQ2hhbmdlPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZGF0YTt0aGlzLiRtb2RpZmllZD0hMCx0aGlzLiRyZXNldFJvd0NhY2hlKGIucmFuZ2Uuc3RhcnQucm93KTt2YXIgYz10aGlzLiR1cGRhdGVJbnRlcm5hbERhdGFPbkNoYW5nZShhKTshdGhpcy4kZnJvbVVuZG8mJnRoaXMuJHVuZG9NYW5hZ2VyJiYhYi5pZ25vcmUmJih0aGlzLiRkZWx0YXNEb2MucHVzaChiKSxjJiZjLmxlbmd0aCE9MCYmdGhpcy4kZGVsdGFzRm9sZC5wdXNoKHthY3Rpb246InJlbW92ZUZvbGRzIixmb2xkczpjfSksdGhpcy4kaW5mb3JtVW5kb01hbmFnZXIuc2NoZWR1bGUoKSksdGhpcy5iZ1Rva2VuaXplci5zdGFydChiLnJhbmdlLnN0YXJ0LnJvdyksdGhpcy5fZW1pdCgiY2hhbmdlIixhKX0sdGhpcy5zZXRWYWx1ZT1mdW5jdGlvbihhKXt0aGlzLmRvYy5zZXRWYWx1ZShhKSx0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yVG8oMCwwKSx0aGlzLnNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbigpLHRoaXMuJHJlc2V0Um93Q2FjaGUoMCksdGhpcy4kZGVsdGFzPVtdLHRoaXMuJGRlbHRhc0RvYz1bXSx0aGlzLiRkZWx0YXNGb2xkPVtdLHRoaXMuZ2V0VW5kb01hbmFnZXIoKS5yZXNldCgpfSx0aGlzLmdldFZhbHVlPXRoaXMudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb2MuZ2V0VmFsdWUoKX0sdGhpcy5nZXRTZWxlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb259LHRoaXMuZ2V0U3RhdGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYmdUb2tlbml6ZXIuZ2V0U3RhdGUoYSl9LHRoaXMuZ2V0VG9rZW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYmdUb2tlbml6ZXIuZ2V0VG9rZW5zKGEsYil9LHRoaXMuZ2V0VG9rZW5BdD1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuYmdUb2tlbml6ZXIuZ2V0VG9rZW5zKGEsYSlbMF0udG9rZW5zLGQsZT0wO2lmKGI9PW51bGwpZj1jLmxlbmd0aC0xLGU9dGhpcy5nZXRMaW5lKGEpLmxlbmd0aDtlbHNlIGZvcih2YXIgZj0wO2Y8Yy5sZW5ndGg7ZisrKXtlKz1jW2ZdLnZhbHVlLmxlbmd0aDtpZihlPj1iKWJyZWFrfXJldHVybiBkPWNbZl0sZD8oZC5pbmRleD1mLGQuc3RhcnQ9ZS1kLnZhbHVlLmxlbmd0aCxkKTpudWxsfSx0aGlzLnNldFVuZG9NYW5hZ2VyPWZ1bmN0aW9uKGEpe3RoaXMuJHVuZG9NYW5hZ2VyPWEsdGhpcy4kcmVzZXRSb3dDYWNoZSgwKSx0aGlzLiRkZWx0YXM9W10sdGhpcy4kZGVsdGFzRG9jPVtdLHRoaXMuJGRlbHRhc0ZvbGQ9W10sdGhpcy4kaW5mb3JtVW5kb01hbmFnZXImJnRoaXMuJGluZm9ybVVuZG9NYW5hZ2VyLmNhbmNlbCgpO2lmKGEpe3ZhciBiPXRoaXM7dGhpcy4kc3luY0luZm9ybVVuZG9NYW5hZ2VyPWZ1bmN0aW9uKCl7Yi4kaW5mb3JtVW5kb01hbmFnZXIuY2FuY2VsKCksYi4kZGVsdGFzRm9sZC5sZW5ndGgmJihiLiRkZWx0YXMucHVzaCh7Z3JvdXA6ImZvbGQiLGRlbHRhczpiLiRkZWx0YXNGb2xkfSksYi4kZGVsdGFzRm9sZD1bXSksYi4kZGVsdGFzRG9jLmxlbmd0aCYmKGIuJGRlbHRhcy5wdXNoKHtncm91cDoiZG9jIixkZWx0YXM6Yi4kZGVsdGFzRG9jfSksYi4kZGVsdGFzRG9jPVtdKSxiLiRkZWx0YXMubGVuZ3RoPjAmJmEuZXhlY3V0ZSh7YWN0aW9uOiJhY2V1cGRhdGUiLGFyZ3M6W2IuJGRlbHRhcyxiXX0pLGIuJGRlbHRhcz1bXX0sdGhpcy4kaW5mb3JtVW5kb01hbmFnZXI9ZS5kZWZlcnJlZENhbGwodGhpcy4kc3luY0luZm9ybVVuZG9NYW5hZ2VyKX19LHRoaXMuJGRlZmF1bHRVbmRvTWFuYWdlcj17dW5kbzpmdW5jdGlvbigpe30scmVkbzpmdW5jdGlvbigpe30scmVzZXQ6ZnVuY3Rpb24oKXt9fSx0aGlzLmdldFVuZG9NYW5hZ2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHVuZG9NYW5hZ2VyfHx0aGlzLiRkZWZhdWx0VW5kb01hbmFnZXJ9LHRoaXMuZ2V0VGFiU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0VXNlU29mdFRhYnMoKT9lLnN0cmluZ1JlcGVhdCgiICIsdGhpcy5nZXRUYWJTaXplKCkpOiJcdCJ9LHRoaXMuJHVzZVNvZnRUYWJzPSEwLHRoaXMuc2V0VXNlU29mdFRhYnM9ZnVuY3Rpb24oYSl7aWYodGhpcy4kdXNlU29mdFRhYnM9PT1hKXJldHVybjt0aGlzLiR1c2VTb2Z0VGFicz1hfSx0aGlzLmdldFVzZVNvZnRUYWJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHVzZVNvZnRUYWJzfSx0aGlzLiR0YWJTaXplPTQsdGhpcy5zZXRUYWJTaXplPWZ1bmN0aW9uKGEpe2lmKGlzTmFOKGEpfHx0aGlzLiR0YWJTaXplPT09YSlyZXR1cm47dGhpcy4kbW9kaWZpZWQ9ITAsdGhpcy4kdGFiU2l6ZT1hLHRoaXMuX2VtaXQoImNoYW5nZVRhYlNpemUiKX0sdGhpcy5nZXRUYWJTaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHRhYlNpemV9LHRoaXMuaXNUYWJTdG9wPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLiR1c2VTb2Z0VGFicyYmYS5jb2x1bW4ldGhpcy4kdGFiU2l6ZT09MH0sdGhpcy4kb3ZlcndyaXRlPSExLHRoaXMuc2V0T3ZlcndyaXRlPWZ1bmN0aW9uKGEpe2lmKHRoaXMuJG92ZXJ3cml0ZT09YSlyZXR1cm47dGhpcy4kb3ZlcndyaXRlPWEsdGhpcy5fZW1pdCgiY2hhbmdlT3ZlcndyaXRlIil9LHRoaXMuZ2V0T3ZlcndyaXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJG92ZXJ3cml0ZX0sdGhpcy50b2dnbGVPdmVyd3JpdGU9ZnVuY3Rpb24oKXt0aGlzLnNldE92ZXJ3cml0ZSghdGhpcy4kb3ZlcndyaXRlKX0sdGhpcy5nZXRCcmVha3BvaW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRicmVha3BvaW50c30sdGhpcy5zZXRCcmVha3BvaW50cz1mdW5jdGlvbihhKXt0aGlzLiRicmVha3BvaW50cz1bXTtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLiRicmVha3BvaW50c1thW2JdXT0hMDt0aGlzLl9lbWl0KCJjaGFuZ2VCcmVha3BvaW50Iix7fSl9LHRoaXMuY2xlYXJCcmVha3BvaW50cz1mdW5jdGlvbigpe3RoaXMuJGJyZWFrcG9pbnRzPVtdLHRoaXMuX2VtaXQoImNoYW5nZUJyZWFrcG9pbnQiLHt9KX0sdGhpcy5zZXRCcmVha3BvaW50PWZ1bmN0aW9uKGEpe3RoaXMuJGJyZWFrcG9pbnRzW2FdPSEwLHRoaXMuX2VtaXQoImNoYW5nZUJyZWFrcG9pbnQiLHt9KX0sdGhpcy5jbGVhckJyZWFrcG9pbnQ9ZnVuY3Rpb24oYSl7ZGVsZXRlIHRoaXMuJGJyZWFrcG9pbnRzW2FdLHRoaXMuX2VtaXQoImNoYW5nZUJyZWFrcG9pbnQiLHt9KX0sdGhpcy5nZXRCcmVha3BvaW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRicmVha3BvaW50c30sdGhpcy5hZGRNYXJrZXI9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9dGhpcy4kbWFya2VySWQrKyxmPXtyYW5nZTphLHR5cGU6Y3x8ImxpbmUiLHJlbmRlcmVyOnR5cGVvZiBjPT0iZnVuY3Rpb24iP2M6bnVsbCxjbGF6ejpiLGluRnJvbnQ6ISFkfTtyZXR1cm4gZD8odGhpcy4kZnJvbnRNYXJrZXJzW2VdPWYsdGhpcy5fZW1pdCgiY2hhbmdlRnJvbnRNYXJrZXIiKSk6KHRoaXMuJGJhY2tNYXJrZXJzW2VdPWYsdGhpcy5fZW1pdCgiY2hhbmdlQmFja01hcmtlciIpKSxlfSx0aGlzLnJlbW92ZU1hcmtlcj1mdW5jdGlvbihhKXt2YXIgYj10aGlzLiRmcm9udE1hcmtlcnNbYV18fHRoaXMuJGJhY2tNYXJrZXJzW2FdO2lmKCFiKXJldHVybjt2YXIgYz1iLmluRnJvbnQ/dGhpcy4kZnJvbnRNYXJrZXJzOnRoaXMuJGJhY2tNYXJrZXJzO2ImJihkZWxldGUgY1thXSx0aGlzLl9lbWl0KGIuaW5Gcm9udD8iY2hhbmdlRnJvbnRNYXJrZXIiOiJjaGFuZ2VCYWNrTWFya2VyIikpfSx0aGlzLmdldE1hcmtlcnM9ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy4kZnJvbnRNYXJrZXJzOnRoaXMuJGJhY2tNYXJrZXJzfSx0aGlzLnNldEFubm90YXRpb25zPWZ1bmN0aW9uKGEpe3RoaXMuJGFubm90YXRpb25zPXt9O2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1hW2JdLGQ9Yy5yb3c7dGhpcy4kYW5ub3RhdGlvbnNbZF0/dGhpcy4kYW5ub3RhdGlvbnNbZF0ucHVzaChjKTp0aGlzLiRhbm5vdGF0aW9uc1tkXT1bY119dGhpcy5fZW1pdCgiY2hhbmdlQW5ub3RhdGlvbiIse30pfSx0aGlzLmdldEFubm90YXRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGFubm90YXRpb25zfHx7fX0sdGhpcy5jbGVhckFubm90YXRpb25zPWZ1bmN0aW9uKCl7dGhpcy4kYW5ub3RhdGlvbnM9e30sdGhpcy5fZW1pdCgiY2hhbmdlQW5ub3RhdGlvbiIse30pfSx0aGlzLiRkZXRlY3ROZXdMaW5lPWZ1bmN0aW9uKGEpe3ZhciBiPWEubWF0Y2goL14uKj8oXHI/XG4pL20pO2I/dGhpcy4kYXV0b05ld0xpbmU9YlsxXTp0aGlzLiRhdXRvTmV3TGluZT0iXG4ifSx0aGlzLmdldFdvcmRSYW5nZT1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuZ2V0TGluZShhKSxkPSExO2I+MCYmKGQ9ISFjLmNoYXJBdChiLTEpLm1hdGNoKHRoaXMudG9rZW5SZSkpLGR8fChkPSEhYy5jaGFyQXQoYikubWF0Y2godGhpcy50b2tlblJlKSk7dmFyIGU9ZD90aGlzLnRva2VuUmU6dGhpcy5ub25Ub2tlblJlLGY9YjtpZihmPjApe2RvIGYtLTt3aGlsZShmPj0wJiZjLmNoYXJBdChmKS5tYXRjaChlKSk7ZisrfXZhciBnPWI7d2hpbGUoZzxjLmxlbmd0aCYmYy5jaGFyQXQoZykubWF0Y2goZSkpZysrO3JldHVybiBuZXcgaShhLGYsYSxnKX0sdGhpcy5nZXRBV29yZFJhbmdlPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5nZXRXb3JkUmFuZ2UoYSxiKSxkPXRoaXMuZ2V0TGluZShjLmVuZC5yb3cpO3doaWxlKGQuY2hhckF0KGMuZW5kLmNvbHVtbikubWF0Y2goL1sgXHRdLykpYy5lbmQuY29sdW1uKz0xO3JldHVybiBjfSx0aGlzLnNldE5ld0xpbmVNb2RlPWZ1bmN0aW9uKGEpe3RoaXMuZG9jLnNldE5ld0xpbmVNb2RlKGEpfSx0aGlzLmdldE5ld0xpbmVNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9jLmdldE5ld0xpbmVNb2RlKCl9LHRoaXMuJHVzZVdvcmtlcj0hMCx0aGlzLnNldFVzZVdvcmtlcj1mdW5jdGlvbihhKXtpZih0aGlzLiR1c2VXb3JrZXI9PWEpcmV0dXJuO3RoaXMuJHVzZVdvcmtlcj1hLHRoaXMuJHN0b3BXb3JrZXIoKSxhJiZ0aGlzLiRzdGFydFdvcmtlcigpfSx0aGlzLmdldFVzZVdvcmtlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiR1c2VXb3JrZXJ9LHRoaXMub25SZWxvYWRUb2tlbml6ZXI9ZnVuY3Rpb24oYSl7dmFyIGI9YS5kYXRhO3RoaXMuYmdUb2tlbml6ZXIuc3RhcnQoYi5maXJzdCksdGhpcy5fZW1pdCgidG9rZW5pemVyVXBkYXRlIixhKX0sdGhpcy4kbW9kZT1udWxsLHRoaXMuc2V0TW9kZT1mdW5jdGlvbihhKXtpZih0aGlzLiRtb2RlPT09YSlyZXR1cm47dGhpcy4kbW9kZT1hLHRoaXMuJHN0b3BXb3JrZXIoKSx0aGlzLiR1c2VXb3JrZXImJnRoaXMuJHN0YXJ0V29ya2VyKCk7dmFyIGI9YS5nZXRUb2tlbml6ZXIoKTtpZihiLmFkZEV2ZW50TGlzdGVuZXIhPT11bmRlZmluZWQpe3ZhciBjPXRoaXMub25SZWxvYWRUb2tlbml6ZXIuYmluZCh0aGlzKTtiLmFkZEV2ZW50TGlzdGVuZXIoInVwZGF0ZSIsYyl9aWYoIXRoaXMuYmdUb2tlbml6ZXIpe3RoaXMuYmdUb2tlbml6ZXI9bmV3IGsoYik7dmFyIGQ9dGhpczt0aGlzLmJnVG9rZW5pemVyLmFkZEV2ZW50TGlzdGVuZXIoInVwZGF0ZSIsZnVuY3Rpb24oYSl7ZC5fZW1pdCgidG9rZW5pemVyVXBkYXRlIixhKX0pfWVsc2UgdGhpcy5iZ1Rva2VuaXplci5zZXRUb2tlbml6ZXIoYik7dGhpcy5iZ1Rva2VuaXplci5zZXREb2N1bWVudCh0aGlzLmdldERvY3VtZW50KCkpLHRoaXMuYmdUb2tlbml6ZXIuc3RhcnQoMCksdGhpcy50b2tlblJlPWEudG9rZW5SZSx0aGlzLm5vblRva2VuUmU9YS5ub25Ub2tlblJlLHRoaXMuJHNldEZvbGRpbmcoYS5mb2xkaW5nUnVsZXMpLHRoaXMuX2VtaXQoImNoYW5nZU1vZGUiKX0sdGhpcy4kc3RvcFdvcmtlcj1mdW5jdGlvbigpe3RoaXMuJHdvcmtlciYmdGhpcy4kd29ya2VyLnRlcm1pbmF0ZSgpLHRoaXMuJHdvcmtlcj1udWxsfSx0aGlzLiRzdGFydFdvcmtlcj1mdW5jdGlvbigpe2lmKHR5cGVvZiBXb3JrZXIhPSJ1bmRlZmluZWQiJiYhYS5ub1dvcmtlcil0cnl7dGhpcy4kd29ya2VyPXRoaXMuJG1vZGUuY3JlYXRlV29ya2VyKHRoaXMpfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJDb3VsZCBub3QgbG9hZCB3b3JrZXIiKSxjb25zb2xlLmxvZyhiKSx0aGlzLiR3b3JrZXI9bnVsbH1lbHNlIHRoaXMuJHdvcmtlcj1udWxsfSx0aGlzLmdldE1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kbW9kZX0sdGhpcy4kc2Nyb2xsVG9wPTAsdGhpcy5zZXRTY3JvbGxUb3A9ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKE1hdGgubWF4KDAsYSkpO2lmKHRoaXMuJHNjcm9sbFRvcD09PWEpcmV0dXJuO3RoaXMuJHNjcm9sbFRvcD1hLHRoaXMuX2VtaXQoImNoYW5nZVNjcm9sbFRvcCIsYSl9LHRoaXMuZ2V0U2Nyb2xsVG9wPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHNjcm9sbFRvcH0sdGhpcy4kc2Nyb2xsTGVmdD0wLHRoaXMuc2V0U2Nyb2xsTGVmdD1mdW5jdGlvbihhKXthPU1hdGgucm91bmQoTWF0aC5tYXgoMCxhKSk7aWYodGhpcy4kc2Nyb2xsTGVmdD09PWEpcmV0dXJuO3RoaXMuJHNjcm9sbExlZnQ9YSx0aGlzLl9lbWl0KCJjaGFuZ2VTY3JvbGxMZWZ0IixhKX0sdGhpcy5nZXRTY3JvbGxMZWZ0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHNjcm9sbExlZnR9LHRoaXMuZ2V0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kY29tcHV0ZVdpZHRoKCksdGhpcy53aWR0aH0sdGhpcy5nZXRTY3JlZW5XaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRjb21wdXRlV2lkdGgoKSx0aGlzLnNjcmVlbldpZHRofSx0aGlzLiRjb21wdXRlV2lkdGg9ZnVuY3Rpb24oYSl7aWYodGhpcy4kbW9kaWZpZWR8fGEpe3RoaXMuJG1vZGlmaWVkPSExO3ZhciBiPXRoaXMuZG9jLmdldEFsbExpbmVzKCksYz0wLGQ9MDtmb3IodmFyIGU9MDtlPGIubGVuZ3RoO2UrKyl7dmFyIGY9dGhpcy5nZXRGb2xkTGluZShlKSxnLGg7Zz1iW2VdO2lmKGYpe3ZhciBpPWYucmFuZ2UuZW5kO2c9dGhpcy5nZXRGb2xkRGlzcGxheUxpbmUoZiksZT1pLnJvd31oPWcubGVuZ3RoLGM9TWF0aC5tYXgoYyxoKSx0aGlzLiR1c2VXcmFwTW9kZXx8KGQ9TWF0aC5tYXgoZCx0aGlzLiRnZXRTdHJpbmdTY3JlZW5XaWR0aChnKVswXSkpfXRoaXMud2lkdGg9Yyx0aGlzLiR1c2VXcmFwTW9kZT90aGlzLnNjcmVlbldpZHRoPXRoaXMuJHdyYXBMaW1pdDp0aGlzLnNjcmVlbldpZHRoPWR9fSx0aGlzLmdldExpbmU9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZG9jLmdldExpbmUoYSl9LHRoaXMuZ2V0TGluZXM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5kb2MuZ2V0TGluZXMoYSxiKX0sdGhpcy5nZXRMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb2MuZ2V0TGVuZ3RoKCl9LHRoaXMuZ2V0VGV4dFJhbmdlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRvYy5nZXRUZXh0UmFuZ2UoYSl9LHRoaXMuaW5zZXJ0PWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZG9jLmluc2VydChhLGIpfSx0aGlzLnJlbW92ZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kb2MucmVtb3ZlKGEpfSx0aGlzLnVuZG9DaGFuZ2VzPWZ1bmN0aW9uKGEsYil7aWYoIWEubGVuZ3RoKXJldHVybjt0aGlzLiRmcm9tVW5kbz0hMDt2YXIgYz1udWxsO2Zvcih2YXIgZD1hLmxlbmd0aC0xO2QhPS0xO2QtLSl7dmFyIGU9YVtkXTtlLmdyb3VwPT0iZG9jIj8odGhpcy5kb2MucmV2ZXJ0RGVsdGFzKGUuZGVsdGFzKSxjPXRoaXMuJGdldFVuZG9TZWxlY3Rpb24oZS5kZWx0YXMsITAsYykpOmUuZGVsdGFzLmZvckVhY2goZnVuY3Rpb24oYSl7dGhpcy5hZGRGb2xkcyhhLmZvbGRzKX0sdGhpcyl9cmV0dXJuIHRoaXMuJGZyb21VbmRvPSExLGMmJnRoaXMuJHVuZG9TZWxlY3QmJiFiJiZ0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShjKSxjfSx0aGlzLnJlZG9DaGFuZ2VzPWZ1bmN0aW9uKGEsYil7aWYoIWEubGVuZ3RoKXJldHVybjt0aGlzLiRmcm9tVW5kbz0hMDt2YXIgYz1udWxsO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZT1hW2RdO2UuZ3JvdXA9PSJkb2MiJiYodGhpcy5kb2MuYXBwbHlEZWx0YXMoZS5kZWx0YXMpLGM9dGhpcy4kZ2V0VW5kb1NlbGVjdGlvbihlLmRlbHRhcywhMSxjKSl9cmV0dXJuIHRoaXMuJGZyb21VbmRvPSExLGMmJnRoaXMuJHVuZG9TZWxlY3QmJiFiJiZ0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShjKSxjfSx0aGlzLnNldFVuZG9TZWxlY3Q9ZnVuY3Rpb24oYSl7dGhpcy4kdW5kb1NlbGVjdD1hfSx0aGlzLiRnZXRVbmRvU2VsZWN0aW9uPWZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe3ZhciBjPWEuYWN0aW9uPT0iaW5zZXJ0VGV4dCJ8fGEuYWN0aW9uPT0iaW5zZXJ0TGluZXMiO3JldHVybiBiPyFjOmN9dmFyIGU9YVswXSxmLGcsaD0hMTtkKGUpPyhmPWUucmFuZ2UuY2xvbmUoKSxoPSEwKTooZj1pLmZyb21Qb2ludHMoZS5yYW5nZS5zdGFydCxlLnJhbmdlLnN0YXJ0KSxoPSExKTtmb3IodmFyIGo9MTtqPGEubGVuZ3RoO2orKyllPWFbal0sZChlKT8oZz1lLnJhbmdlLnN0YXJ0LGYuY29tcGFyZShnLnJvdyxnLmNvbHVtbik9PS0xJiZmLnNldFN0YXJ0KGUucmFuZ2Uuc3RhcnQpLGc9ZS5yYW5nZS5lbmQsZi5jb21wYXJlKGcucm93LGcuY29sdW1uKT09MSYmZi5zZXRFbmQoZS5yYW5nZS5lbmQpLGg9ITApOihnPWUucmFuZ2Uuc3RhcnQsZi5jb21wYXJlKGcucm93LGcuY29sdW1uKT09LTEmJihmPWkuZnJvbVBvaW50cyhlLnJhbmdlLnN0YXJ0LGUucmFuZ2Uuc3RhcnQpKSxoPSExKTtpZihjIT1udWxsKXt2YXIgaz1jLmNvbXBhcmVSYW5nZShmKTtrPT0xP2Yuc2V0U3RhcnQoYy5zdGFydCk6az09LTEmJmYuc2V0RW5kKGMuZW5kKX1yZXR1cm4gZn0sdGhpcy5yZXBsYWNlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZG9jLnJlcGxhY2UoYSxiKX0sdGhpcy5tb3ZlVGV4dD1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuZ2V0VGV4dFJhbmdlKGEpO3RoaXMucmVtb3ZlKGEpO3ZhciBkPWIucm93LGU9Yi5jb2x1bW47IWEuaXNNdWx0aUxpbmUoKSYmYS5zdGFydC5yb3c9PWQmJmEuZW5kLmNvbHVtbjxlJiYoZS09Yy5sZW5ndGgpO2lmKGEuaXNNdWx0aUxpbmUoKSYmYS5lbmQucm93PGQpe3ZhciBmPXRoaXMuZG9jLiRzcGxpdChjKTtkLT1mLmxlbmd0aC0xfXZhciBnPWQrYS5lbmQucm93LWEuc3RhcnQucm93LGg9YS5pc011bHRpTGluZSgpP2EuZW5kLmNvbHVtbjplK2EuZW5kLmNvbHVtbi1hLnN0YXJ0LmNvbHVtbixqPW5ldyBpKGQsZSxnLGgpO3JldHVybiB0aGlzLmluc2VydChqLnN0YXJ0LGMpLGp9LHRoaXMuaW5kZW50Um93cz1mdW5jdGlvbihhLGIsYyl7Yz1jLnJlcGxhY2UoL1x0L2csdGhpcy5nZXRUYWJTdHJpbmcoKSk7Zm9yKHZhciBkPWE7ZDw9YjtkKyspdGhpcy5pbnNlcnQoe3JvdzpkLGNvbHVtbjowfSxjKX0sdGhpcy5vdXRkZW50Um93cz1mdW5jdGlvbihhKXt2YXIgYj1hLmNvbGxhcHNlUm93cygpLGM9bmV3IGkoMCwwLDAsMCksZD10aGlzLmdldFRhYlNpemUoKTtmb3IodmFyIGU9Yi5zdGFydC5yb3c7ZTw9Yi5lbmQucm93OysrZSl7dmFyIGY9dGhpcy5nZXRMaW5lKGUpO2Muc3RhcnQucm93PWUsYy5lbmQucm93PWU7Zm9yKHZhciBnPTA7ZzxkOysrZylpZihmLmNoYXJBdChnKSE9IiAiKWJyZWFrO2c8ZCYmZi5jaGFyQXQoZyk9PSJcdCI/KGMuc3RhcnQuY29sdW1uPWcsYy5lbmQuY29sdW1uPWcrMSk6KGMuc3RhcnQuY29sdW1uPTAsYy5lbmQuY29sdW1uPWcpLHRoaXMucmVtb3ZlKGMpfX0sdGhpcy5tb3ZlTGluZXNVcD1mdW5jdGlvbihhLGIpe2lmKGE8PTApcmV0dXJuIDA7dmFyIGM9dGhpcy5kb2MucmVtb3ZlTGluZXMoYSxiKTtyZXR1cm4gdGhpcy5kb2MuaW5zZXJ0TGluZXMoYS0xLGMpLC0xfSx0aGlzLm1vdmVMaW5lc0Rvd249ZnVuY3Rpb24oYSxiKXtpZihiPj10aGlzLmRvYy5nZXRMZW5ndGgoKS0xKXJldHVybiAwO3ZhciBjPXRoaXMuZG9jLnJlbW92ZUxpbmVzKGEsYik7cmV0dXJuIHRoaXMuZG9jLmluc2VydExpbmVzKGErMSxjKSwxfSx0aGlzLmR1cGxpY2F0ZUxpbmVzPWZ1bmN0aW9uKGEsYil7dmFyIGE9dGhpcy4kY2xpcFJvd1RvRG9jdW1lbnQoYSksYj10aGlzLiRjbGlwUm93VG9Eb2N1bWVudChiKSxjPXRoaXMuZ2V0TGluZXMoYSxiKTt0aGlzLmRvYy5pbnNlcnRMaW5lcyhhLGMpO3ZhciBkPWItYSsxO3JldHVybiBkfSx0aGlzLiRjbGlwUm93VG9Eb2N1bWVudD1mdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1pbihhLHRoaXMuZG9jLmdldExlbmd0aCgpLTEpKX0sdGhpcy4kY2xpcENvbHVtblRvUm93PWZ1bmN0aW9uKGEsYil7cmV0dXJuIGI8MD8wOk1hdGgubWluKHRoaXMuZG9jLmdldExpbmUoYSkubGVuZ3RoLGIpfSx0aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50PWZ1bmN0aW9uKGEsYil7Yj1NYXRoLm1heCgwLGIpO2lmKGE8MClhPTAsYj0wO2Vsc2V7dmFyIGM9dGhpcy5kb2MuZ2V0TGVuZ3RoKCk7YT49Yz8oYT1jLTEsYj10aGlzLmRvYy5nZXRMaW5lKGMtMSkubGVuZ3RoKTpiPU1hdGgubWluKHRoaXMuZG9jLmdldExpbmUoYSkubGVuZ3RoLGIpfXJldHVybntyb3c6YSxjb2x1bW46Yn19LHRoaXMuJGNsaXBSYW5nZVRvRG9jdW1lbnQ9ZnVuY3Rpb24oYSl7YS5zdGFydC5yb3c8MD8oYS5zdGFydC5yb3c9MCxhLnN0YXJ0LmNvbHVtbj0wKTphLnN0YXJ0LmNvbHVtbj10aGlzLiRjbGlwQ29sdW1uVG9Sb3coYS5zdGFydC5yb3csYS5zdGFydC5jb2x1bW4pO3ZhciBiPXRoaXMuZG9jLmdldExlbmd0aCgpLTE7cmV0dXJuIGEuZW5kLnJvdz5iPyhhLmVuZC5yb3c9YixhLmVuZC5jb2x1bW49dGhpcy5kb2MuZ2V0TGluZShiKS5sZW5ndGgpOmEuZW5kLmNvbHVtbj10aGlzLiRjbGlwQ29sdW1uVG9Sb3coYS5lbmQucm93LGEuZW5kLmNvbHVtbiksYX0sdGhpcy4kd3JhcExpbWl0PTgwLHRoaXMuJHVzZVdyYXBNb2RlPSExLHRoaXMuJHdyYXBMaW1pdFJhbmdlPXttaW46bnVsbCxtYXg6bnVsbH0sdGhpcy5zZXRVc2VXcmFwTW9kZT1mdW5jdGlvbihhKXtpZihhIT10aGlzLiR1c2VXcmFwTW9kZSl7dGhpcy4kdXNlV3JhcE1vZGU9YSx0aGlzLiRtb2RpZmllZD0hMCx0aGlzLiRyZXNldFJvd0NhY2hlKDApO2lmKGEpe3ZhciBiPXRoaXMuZ2V0TGVuZ3RoKCk7dGhpcy4kd3JhcERhdGE9W107Zm9yKHZhciBjPTA7YzxiO2MrKyl0aGlzLiR3cmFwRGF0YS5wdXNoKFtdKTt0aGlzLiR1cGRhdGVXcmFwRGF0YSgwLGItMSl9dGhpcy5fZW1pdCgiY2hhbmdlV3JhcE1vZGUiKX19LHRoaXMuZ2V0VXNlV3JhcE1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdXNlV3JhcE1vZGV9LHRoaXMuc2V0V3JhcExpbWl0UmFuZ2U9ZnVuY3Rpb24oYSxiKXtpZih0aGlzLiR3cmFwTGltaXRSYW5nZS5taW4hPT1hfHx0aGlzLiR3cmFwTGltaXRSYW5nZS5tYXghPT1iKXRoaXMuJHdyYXBMaW1pdFJhbmdlLm1pbj1hLHRoaXMuJHdyYXBMaW1pdFJhbmdlLm1heD1iLHRoaXMuJG1vZGlmaWVkPSEwLHRoaXMuX2VtaXQoImNoYW5nZVdyYXBNb2RlIil9LHRoaXMuYWRqdXN0V3JhcExpbWl0PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuJGNvbnN0cmFpbldyYXBMaW1pdChhKTtyZXR1cm4gYiE9dGhpcy4kd3JhcExpbWl0JiZiPjA/KHRoaXMuJHdyYXBMaW1pdD1iLHRoaXMuJG1vZGlmaWVkPSEwLHRoaXMuJHVzZVdyYXBNb2RlJiYodGhpcy4kdXBkYXRlV3JhcERhdGEoMCx0aGlzLmdldExlbmd0aCgpLTEpLHRoaXMuJHJlc2V0Um93Q2FjaGUoMCksdGhpcy5fZW1pdCgiY2hhbmdlV3JhcExpbWl0IikpLCEwKTohMX0sdGhpcy4kY29uc3RyYWluV3JhcExpbWl0PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuJHdyYXBMaW1pdFJhbmdlLm1pbjtiJiYoYT1NYXRoLm1heChiLGEpKTt2YXIgYz10aGlzLiR3cmFwTGltaXRSYW5nZS5tYXg7cmV0dXJuIGMmJihhPU1hdGgubWluKGMsYSkpLE1hdGgubWF4KDEsYSl9LHRoaXMuZ2V0V3JhcExpbWl0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHdyYXBMaW1pdH0sdGhpcy5nZXRXcmFwTGltaXRSYW5nZT1mdW5jdGlvbigpe3JldHVybnttaW46dGhpcy4kd3JhcExpbWl0UmFuZ2UubWluLG1heDp0aGlzLiR3cmFwTGltaXRSYW5nZS5tYXh9fSx0aGlzLiR1cGRhdGVJbnRlcm5hbERhdGFPbkNoYW5nZT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLiR1c2VXcmFwTW9kZSxjLGQ9YS5kYXRhLmFjdGlvbixlPWEuZGF0YS5yYW5nZS5zdGFydC5yb3csZj1hLmRhdGEucmFuZ2UuZW5kLnJvdyxnPWEuZGF0YS5yYW5nZS5zdGFydCxoPWEuZGF0YS5yYW5nZS5lbmQsaT1udWxsO2QuaW5kZXhPZigiTGluZXMiKSE9LTE/KGQ9PSJpbnNlcnRMaW5lcyI/Zj1lK2EuZGF0YS5saW5lcy5sZW5ndGg6Zj1lLGM9YS5kYXRhLmxpbmVzP2EuZGF0YS5saW5lcy5sZW5ndGg6Zi1lKTpjPWYtZTtpZihjIT0wKWlmKGQuaW5kZXhPZigicmVtb3ZlIikhPS0xKXtiJiZ0aGlzLiR3cmFwRGF0YS5zcGxpY2UoZSxjKTt2YXIgaj10aGlzLiRmb2xkRGF0YTtpPXRoaXMuZ2V0Rm9sZHNJblJhbmdlKGEuZGF0YS5yYW5nZSksdGhpcy5yZW1vdmVGb2xkcyhpKTt2YXIgaz10aGlzLmdldEZvbGRMaW5lKGgucm93KSxsPTA7aWYoayl7ay5hZGRSZW1vdmVDaGFycyhoLnJvdyxoLmNvbHVtbixnLmNvbHVtbi1oLmNvbHVtbiksay5zaGlmdFJvdygtYyk7dmFyIG09dGhpcy5nZXRGb2xkTGluZShlKTttJiZtIT09ayYmKG0ubWVyZ2Uoayksaz1tKSxsPWouaW5kZXhPZihrKSsxfWZvcihsO2w8ai5sZW5ndGg7bCsrKXt2YXIgaz1qW2xdO2suc3RhcnQucm93Pj1oLnJvdyYmay5zaGlmdFJvdygtYyl9Zj1lfWVsc2V7dmFyIG47aWYoYil7bj1bZSwwXTtmb3IodmFyIG89MDtvPGM7bysrKW4ucHVzaChbXSk7dGhpcy4kd3JhcERhdGEuc3BsaWNlLmFwcGx5KHRoaXMuJHdyYXBEYXRhLG4pfXZhciBqPXRoaXMuJGZvbGREYXRhLGs9dGhpcy5nZXRGb2xkTGluZShlKSxsPTA7aWYoayl7dmFyIHA9ay5yYW5nZS5jb21wYXJlSW5zaWRlKGcucm93LGcuY29sdW1uKTtwPT0wPyhrPWsuc3BsaXQoZy5yb3csZy5jb2x1bW4pLGsuc2hpZnRSb3coYyksay5hZGRSZW1vdmVDaGFycyhmLDAsaC5jb2x1bW4tZy5jb2x1bW4pKTpwPT0tMSYmKGsuYWRkUmVtb3ZlQ2hhcnMoZSwwLGguY29sdW1uLWcuY29sdW1uKSxrLnNoaWZ0Um93KGMpKSxsPWouaW5kZXhPZihrKSsxfWZvcihsO2w8ai5sZW5ndGg7bCsrKXt2YXIgaz1qW2xdO2suc3RhcnQucm93Pj1lJiZrLnNoaWZ0Um93KGMpfX1lbHNle2M9TWF0aC5hYnMoYS5kYXRhLnJhbmdlLnN0YXJ0LmNvbHVtbi1hLmRhdGEucmFuZ2UuZW5kLmNvbHVtbiksZC5pbmRleE9mKCJyZW1vdmUiKSE9LTEmJihpPXRoaXMuZ2V0Rm9sZHNJblJhbmdlKGEuZGF0YS5yYW5nZSksdGhpcy5yZW1vdmVGb2xkcyhpKSxjPS1jKTt2YXIgaz10aGlzLmdldEZvbGRMaW5lKGUpO2smJmsuYWRkUmVtb3ZlQ2hhcnMoZSxnLmNvbHVtbixjKX1yZXR1cm4gYiYmdGhpcy4kd3JhcERhdGEubGVuZ3RoIT10aGlzLmRvYy5nZXRMZW5ndGgoKSYmY29uc29sZS5lcnJvcigiZG9jLmdldExlbmd0aCgpIGFuZCAkd3JhcERhdGEubGVuZ3RoIGhhdmUgdG8gYmUgdGhlIHNhbWUhIiksYiYmdGhpcy4kdXBkYXRlV3JhcERhdGEoZSxmKSxpfSx0aGlzLiR1cGRhdGVXcmFwRGF0YT1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuZG9jLmdldEFsbExpbmVzKCksZD10aGlzLmdldFRhYlNpemUoKSxmPXRoaXMuJHdyYXBEYXRhLGk9dGhpcy4kd3JhcExpbWl0LGosayxtPWE7Yj1NYXRoLm1pbihiLGMubGVuZ3RoLTEpO3doaWxlKG08PWIpe2s9dGhpcy5nZXRGb2xkTGluZShtLGspO2lmKCFrKWo9dGhpcy4kZ2V0RGlzcGxheVRva2VucyhlLnN0cmluZ1RyaW1SaWdodChjW21dKSksZlttXT10aGlzLiRjb21wdXRlV3JhcFNwbGl0cyhqLGksZCksbSsrO2Vsc2V7aj1bXSxrLndhbGsoZnVuY3Rpb24oYSxiLGQsZSl7dmFyIGY7aWYoYSl7Zj10aGlzLiRnZXREaXNwbGF5VG9rZW5zKGEsai5sZW5ndGgpLGZbMF09Zztmb3IodmFyIGk9MTtpPGYubGVuZ3RoO2krKylmW2ldPWh9ZWxzZSBmPXRoaXMuJGdldERpc3BsYXlUb2tlbnMoY1tiXS5zdWJzdHJpbmcoZSxkKSxqLmxlbmd0aCk7aj1qLmNvbmNhdChmKX0uYmluZCh0aGlzKSxrLmVuZC5yb3csY1trLmVuZC5yb3ddLmxlbmd0aCsxKTt3aGlsZShqLmxlbmd0aCE9MCYmaltqLmxlbmd0aC0xXT49bClqLnBvcCgpO2Zbay5zdGFydC5yb3ddPXRoaXMuJGNvbXB1dGVXcmFwU3BsaXRzKGosaSxkKSxtPWsuZW5kLnJvdysxfX19O3ZhciBiPTEsYz0yLGc9MyxoPTQsaj05LGw9MTAsbT0xMSxuPTEyO3RoaXMuJGNvbXB1dGVXcmFwU3BsaXRzPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gaShiKXt2YXIgZD1hLnNsaWNlKGUsYiksZz1kLmxlbmd0aDtkLmpvaW4oIiIpLnJlcGxhY2UoLzEyL2csZnVuY3Rpb24oKXtnLT0xfSkucmVwbGFjZSgvMi9nLGZ1bmN0aW9uKCl7Zy09MX0pLGYrPWcsYy5wdXNoKGYpLGU9Yn1pZihhLmxlbmd0aD09MClyZXR1cm5bXTt2YXIgYz1bXSxkPWEubGVuZ3RoLGU9MCxmPTA7d2hpbGUoZC1lPmIpe3ZhciBrPWUrYjtpZihhW2tdPj1sKXt3aGlsZShhW2tdPj1sKWsrKztpKGspO2NvbnRpbnVlfWlmKGFba109PWd8fGFba109PWgpe2ZvcihrO2shPWUtMTtrLS0paWYoYVtrXT09ZylicmVhaztpZihrPmUpe2koayk7Y29udGludWV9az1lK2I7Zm9yKGs7azxhLmxlbmd0aDtrKyspaWYoYVtrXSE9aClicmVhaztpZihrPT1hLmxlbmd0aClicmVhaztpKGspO2NvbnRpbnVlfXZhciBtPU1hdGgubWF4KGstMTAsZS0xKTt3aGlsZShrPm0mJmFba108ZylrLS07d2hpbGUoaz5tJiZhW2tdPT1qKWstLTtpZihrPm0pe2koKytrKTtjb250aW51ZX1rPWUrYixpKGspfXJldHVybiBjfSx0aGlzLiRnZXREaXNwbGF5VG9rZW5zPWZ1bmN0aW9uKGEsZCl7dmFyIGU9W10sZjtkPWR8fDA7Zm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspe3ZhciBoPWEuY2hhckNvZGVBdChnKTtpZihoPT05KXtmPXRoaXMuZ2V0U2NyZWVuVGFiU2l6ZShlLmxlbmd0aCtkKSxlLnB1c2gobSk7Zm9yKHZhciBpPTE7aTxmO2krKyllLnB1c2gobil9ZWxzZSBoPT0zMj9lLnB1c2gobCk6aD4zOSYmaDw0OHx8aD41NyYmaDw2ND9lLnB1c2goaik6aD49NDM1MiYmbyhoKT9lLnB1c2goYixjKTplLnB1c2goYil9cmV0dXJuIGV9LHRoaXMuJGdldFN0cmluZ1NjcmVlbldpZHRoPWZ1bmN0aW9uKGEsYixjKXtpZihiPT0wKXJldHVyblswLDBdO2I9PW51bGwmJihiPWMrYS5sZW5ndGgqTWF0aC5tYXgodGhpcy5nZXRUYWJTaXplKCksMikpLGM9Y3x8MDt2YXIgZCxlO2ZvcihlPTA7ZTxhLmxlbmd0aDtlKyspe2Q9YS5jaGFyQ29kZUF0KGUpLGQ9PTk/Yys9dGhpcy5nZXRTY3JlZW5UYWJTaXplKGMpOmQ+PTQzNTImJm8oZCk/Yys9MjpjKz0xO2lmKGM+YilicmVha31yZXR1cm5bYyxlXX0sdGhpcy5nZXRSb3dMZW5ndGg9ZnVuY3Rpb24oYSl7cmV0dXJuIXRoaXMuJHVzZVdyYXBNb2RlfHwhdGhpcy4kd3JhcERhdGFbYV0/MTp0aGlzLiR3cmFwRGF0YVthXS5sZW5ndGgrMX0sdGhpcy5nZXRSb3dIZWlnaHQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5nZXRSb3dMZW5ndGgoYikqYS5saW5lSGVpZ2h0fSx0aGlzLmdldFNjcmVlbkxhc3RSb3dDb2x1bW49ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZG9jdW1lbnRUb1NjcmVlbkNvbHVtbihhLHRoaXMuZG9jLmdldExpbmUoYSkubGVuZ3RoKX0sdGhpcy5nZXREb2N1bWVudExhc3RSb3dDb2x1bW49ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmRvY3VtZW50VG9TY3JlZW5Sb3coYSxiKTtyZXR1cm4gdGhpcy5nZXRTY3JlZW5MYXN0Um93Q29sdW1uKGMpfSx0aGlzLmdldERvY3VtZW50TGFzdFJvd0NvbHVtblBvc2l0aW9uPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5kb2N1bWVudFRvU2NyZWVuUm93KGEsYik7cmV0dXJuIHRoaXMuc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKGMsTnVtYmVyLk1BWF9WQUxVRS8xMCl9LHRoaXMuZ2V0Um93U3BsaXREYXRhPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLiR1c2VXcmFwTW9kZT90aGlzLiR3cmFwRGF0YVthXTp1bmRlZmluZWR9LHRoaXMuZ2V0U2NyZWVuVGFiU2l6ZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy4kdGFiU2l6ZS1hJXRoaXMuJHRhYlNpemV9LHRoaXMuc2NyZWVuVG9Eb2N1bWVudFJvdz1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihhLGIpLnJvd30sdGhpcy5zY3JlZW5Ub0RvY3VtZW50Q29sdW1uPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKGEsYikuY29sdW1ufSx0aGlzLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbj1mdW5jdGlvbihhLGIpe2lmKGE8MClyZXR1cm57cm93OjAsY29sdW1uOjB9O3ZhciBjLGQ9MCxlPTAsZixnPTAsaD0wLGk9dGhpcy4kcm93Q2FjaGU7Zm9yKHZhciBqPTA7ajxpLmxlbmd0aDtqKyspaWYoaVtqXS5zY3JlZW5Sb3c8YSlnPWlbal0uc2NyZWVuUm93LGQ9aVtqXS5kb2NSb3c7ZWxzZSBicmVhazt2YXIgaz0haS5sZW5ndGh8fGo9PWkubGVuZ3RoLGw9dGhpcy5nZXRMZW5ndGgoKS0xLG09dGhpcy5nZXROZXh0Rm9sZExpbmUoZCksbj1tP20uc3RhcnQucm93OkluZmluaXR5O3doaWxlKGc8PWEpe2g9dGhpcy5nZXRSb3dMZW5ndGgoZCk7aWYoZytoLTE+PWF8fGQ+PWwpYnJlYWs7Zys9aCxkKyssZD5uJiYoZD1tLmVuZC5yb3crMSxtPXRoaXMuZ2V0TmV4dEZvbGRMaW5lKGQsbSksbj1tP20uc3RhcnQucm93OkluZmluaXR5KSxrJiZpLnB1c2goe2RvY1JvdzpkLHNjcmVlblJvdzpnfSl9aWYobSYmbS5zdGFydC5yb3c8PWQpYz10aGlzLmdldEZvbGREaXNwbGF5TGluZShtKSxkPW0uc3RhcnQucm93O2Vsc2V7aWYoZytoPD1hfHxkPmwpcmV0dXJue3JvdzpsLGNvbHVtbjp0aGlzLmdldExpbmUobCkubGVuZ3RofTtjPXRoaXMuZ2V0TGluZShkKSxtPW51bGx9aWYodGhpcy4kdXNlV3JhcE1vZGUpe3ZhciBvPXRoaXMuJHdyYXBEYXRhW2RdO28mJihmPW9bYS1nXSxhPmcmJm8ubGVuZ3RoJiYoZT1vW2EtZy0xXXx8b1tvLmxlbmd0aC0xXSxjPWMuc3Vic3RyaW5nKGUpKSl9cmV0dXJuIGUrPXRoaXMuJGdldFN0cmluZ1NjcmVlbldpZHRoKGMsYilbMV0sdGhpcy4kdXNlV3JhcE1vZGU/ZT49ZiYmKGU9Zi0xKTplPU1hdGgubWluKGUsYy5sZW5ndGgpLG0/bS5pZHhUb1Bvc2l0aW9uKGUpOntyb3c6ZCxjb2x1bW46ZX19LHRoaXMuZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uPWZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGI9PSJ1bmRlZmluZWQiKXZhciBjPXRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQoYS5yb3csYS5jb2x1bW4pO2Vsc2UgYz10aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50KGEsYik7YT1jLnJvdyxiPWMuY29sdW1uO3ZhciBkO2lmKHRoaXMuJHVzZVdyYXBNb2RlKXtkPXRoaXMuJHdyYXBEYXRhO2lmKGE+ZC5sZW5ndGgtMSlyZXR1cm57cm93OnRoaXMuZ2V0U2NyZWVuTGVuZ3RoKCksY29sdW1uOmQubGVuZ3RoPT0wPzA6ZFtkLmxlbmd0aC0xXS5sZW5ndGgtMX19dmFyIGU9MCxmPW51bGwsZz1udWxsO2c9dGhpcy5nZXRGb2xkQXQoYSxiLDEpLGcmJihhPWcuc3RhcnQucm93LGI9Zy5zdGFydC5jb2x1bW4pO3ZhciBoLGk9MCxqPXRoaXMuJHJvd0NhY2hlO2Zvcih2YXIgaz0wO2s8ai5sZW5ndGg7aysrKWlmKGpba10uZG9jUm93PGEpZT1qW2tdLnNjcmVlblJvdyxpPWpba10uZG9jUm93O2Vsc2UgYnJlYWs7dmFyIGw9IWoubGVuZ3RofHxrPT1qLmxlbmd0aCxtPXRoaXMuZ2V0TmV4dEZvbGRMaW5lKGkpLG49bT9tLnN0YXJ0LnJvdzpJbmZpbml0eTt3aGlsZShpPGEpe2lmKGk+PW4pe2g9bS5lbmQucm93KzE7aWYoaD5hKWJyZWFrO209dGhpcy5nZXROZXh0Rm9sZExpbmUoaCxtKSxuPW0/bS5zdGFydC5yb3c6SW5maW5pdHl9ZWxzZSBoPWkrMTtlKz10aGlzLmdldFJvd0xlbmd0aChpKSxpPWgsbCYmai5wdXNoKHtkb2NSb3c6aSxzY3JlZW5Sb3c6ZX0pfXZhciBvPSIiO20mJmk+PW4/KG89dGhpcy5nZXRGb2xkRGlzcGxheUxpbmUobSxhLGIpLGY9bS5zdGFydC5yb3cpOihvPXRoaXMuZ2V0TGluZShhKS5zdWJzdHJpbmcoMCxiKSxmPWEpO2lmKHRoaXMuJHVzZVdyYXBNb2RlKXt2YXIgcD1kW2ZdLHE9MDt3aGlsZShvLmxlbmd0aD49cFtxXSllKysscSsrO289by5zdWJzdHJpbmcocFtxLTFdfHwwLG8ubGVuZ3RoKX1yZXR1cm57cm93OmUsY29sdW1uOnRoaXMuJGdldFN0cmluZ1NjcmVlbldpZHRoKG8pWzBdfX0sdGhpcy5kb2N1bWVudFRvU2NyZWVuQ29sdW1uPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKGEsYikuY29sdW1ufSx0aGlzLmRvY3VtZW50VG9TY3JlZW5Sb3c9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24oYSxiKS5yb3d9LHRoaXMuZ2V0U2NyZWVuTGVuZ3RoPWZ1bmN0aW9uKCl7dmFyIGE9MCxiPW51bGw7aWYoIXRoaXMuJHVzZVdyYXBNb2RlKXthPXRoaXMuZ2V0TGVuZ3RoKCk7dmFyIGM9dGhpcy4kZm9sZERhdGE7Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspYj1jW2RdLGEtPWIuZW5kLnJvdy1iLnN0YXJ0LnJvd31lbHNle3ZhciBlPXRoaXMuJHdyYXBEYXRhLmxlbmd0aCxmPTAsZD0wLGI9dGhpcy4kZm9sZERhdGFbZCsrXSxnPWI/Yi5zdGFydC5yb3c6SW5maW5pdHk7d2hpbGUoZjxlKWErPXRoaXMuJHdyYXBEYXRhW2ZdLmxlbmd0aCsxLGYrKyxmPmcmJihmPWIuZW5kLnJvdysxLGI9dGhpcy4kZm9sZERhdGFbZCsrXSxnPWI/Yi5zdGFydC5yb3c6SW5maW5pdHkpfXJldHVybiBhfX0pKS5jYWxsKGwucHJvdG90eXBlKSxhKCIuL2VkaXRfc2Vzc2lvbi9mb2xkaW5nIikuRm9sZGluZy5jYWxsKGwucHJvdG90eXBlKSxhKCIuL2VkaXRfc2Vzc2lvbi9icmFja2V0X21hdGNoIikuQnJhY2tldE1hdGNoLmNhbGwobC5wcm90b3R5cGUpLGIuRWRpdFNlc3Npb249bH0pLGRlZmluZSgiYWNlL3NlbGVjdGlvbiIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9sYW5nIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuL2xpYi9vb3AiKSxlPWEoIi4vbGliL2xhbmciKSxmPWEoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsZz1hKCIuL3JhbmdlIikuUmFuZ2UsaD1mdW5jdGlvbihhKXt0aGlzLnNlc3Npb249YSx0aGlzLmRvYz1hLmdldERvY3VtZW50KCksdGhpcy5jbGVhclNlbGVjdGlvbigpLHRoaXMuc2VsZWN0aW9uTGVhZD10aGlzLmRvYy5jcmVhdGVBbmNob3IoMCwwKSx0aGlzLnNlbGVjdGlvbkFuY2hvcj10aGlzLmRvYy5jcmVhdGVBbmNob3IoMCwwKTt2YXIgYj10aGlzO3RoaXMuc2VsZWN0aW9uTGVhZC5vbigiY2hhbmdlIixmdW5jdGlvbihhKXtiLl9lbWl0KCJjaGFuZ2VDdXJzb3IiKSxiLiRpc0VtcHR5fHxiLl9lbWl0KCJjaGFuZ2VTZWxlY3Rpb24iKSwhYi4kcHJldmVudFVwZGF0ZURlc2lyZWRDb2x1bW5PbkNoYW5nZSYmYS5vbGQuY29sdW1uIT1hLnZhbHVlLmNvbHVtbiYmYi4kdXBkYXRlRGVzaXJlZENvbHVtbigpfSksdGhpcy5zZWxlY3Rpb25BbmNob3Iub24oImNoYW5nZSIsZnVuY3Rpb24oKXtiLiRpc0VtcHR5fHxiLl9lbWl0KCJjaGFuZ2VTZWxlY3Rpb24iKX0pfTsoKGZ1bmN0aW9uKCl7ZC5pbXBsZW1lbnQodGhpcyxmKSx0aGlzLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kaXNFbXB0eXx8dGhpcy5zZWxlY3Rpb25BbmNob3Iucm93PT10aGlzLnNlbGVjdGlvbkxlYWQucm93JiZ0aGlzLnNlbGVjdGlvbkFuY2hvci5jb2x1bW49PXRoaXMuc2VsZWN0aW9uTGVhZC5jb2x1bW59LHRoaXMuaXNNdWx0aUxpbmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/ITE6dGhpcy5nZXRSYW5nZSgpLmlzTXVsdGlMaW5lKCl9LHRoaXMuZ2V0Q3Vyc29yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0aW9uTGVhZC5nZXRQb3NpdGlvbigpfSx0aGlzLnNldFNlbGVjdGlvbkFuY2hvcj1mdW5jdGlvbihhLGIpe3RoaXMuc2VsZWN0aW9uQW5jaG9yLnNldFBvc2l0aW9uKGEsYiksdGhpcy4kaXNFbXB0eSYmKHRoaXMuJGlzRW1wdHk9ITEsdGhpcy5fZW1pdCgiY2hhbmdlU2VsZWN0aW9uIikpfSx0aGlzLmdldFNlbGVjdGlvbkFuY2hvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRpc0VtcHR5P3RoaXMuZ2V0U2VsZWN0aW9uTGVhZCgpOnRoaXMuc2VsZWN0aW9uQW5jaG9yLmdldFBvc2l0aW9uKCl9LHRoaXMuZ2V0U2VsZWN0aW9uTGVhZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGlvbkxlYWQuZ2V0UG9zaXRpb24oKX0sdGhpcy5zaGlmdFNlbGVjdGlvbj1mdW5jdGlvbihhKXtpZih0aGlzLiRpc0VtcHR5KXt0aGlzLm1vdmVDdXJzb3JUbyh0aGlzLnNlbGVjdGlvbkxlYWQucm93LHRoaXMuc2VsZWN0aW9uTGVhZC5jb2x1bW4rYSk7cmV0dXJufXZhciBiPXRoaXMuZ2V0U2VsZWN0aW9uQW5jaG9yKCksYz10aGlzLmdldFNlbGVjdGlvbkxlYWQoKSxkPXRoaXMuaXNCYWNrd2FyZHMoKTsoIWR8fGIuY29sdW1uIT09MCkmJnRoaXMuc2V0U2VsZWN0aW9uQW5jaG9yKGIucm93LGIuY29sdW1uK2EpLChkfHxjLmNvbHVtbiE9PTApJiZ0aGlzLiRtb3ZlU2VsZWN0aW9uKGZ1bmN0aW9uKCl7dGhpcy5tb3ZlQ3Vyc29yVG8oYy5yb3csYy5jb2x1bW4rYSl9KX0sdGhpcy5pc0JhY2t3YXJkcz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuc2VsZWN0aW9uQW5jaG9yLGI9dGhpcy5zZWxlY3Rpb25MZWFkO3JldHVybiBhLnJvdz5iLnJvd3x8YS5yb3c9PWIucm93JiZhLmNvbHVtbj5iLmNvbHVtbn0sdGhpcy5nZXRSYW5nZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuc2VsZWN0aW9uQW5jaG9yLGI9dGhpcy5zZWxlY3Rpb25MZWFkO3JldHVybiB0aGlzLmlzRW1wdHkoKT9nLmZyb21Qb2ludHMoYixiKTp0aGlzLmlzQmFja3dhcmRzKCk/Zy5mcm9tUG9pbnRzKGIsYSk6Zy5mcm9tUG9pbnRzKGEsYil9LHRoaXMuY2xlYXJTZWxlY3Rpb249ZnVuY3Rpb24oKXt0aGlzLiRpc0VtcHR5fHwodGhpcy4kaXNFbXB0eT0hMCx0aGlzLl9lbWl0KCJjaGFuZ2VTZWxlY3Rpb24iKSl9LHRoaXMuc2VsZWN0QWxsPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kb2MuZ2V0TGVuZ3RoKCktMTt0aGlzLnNldFNlbGVjdGlvbkFuY2hvcihhLHRoaXMuZG9jLmdldExpbmUoYSkubGVuZ3RoKSx0aGlzLm1vdmVDdXJzb3JUbygwLDApfSx0aGlzLnNldFNlbGVjdGlvblJhbmdlPWZ1bmN0aW9uKGEsYil7Yj8odGhpcy5zZXRTZWxlY3Rpb25BbmNob3IoYS5lbmQucm93LGEuZW5kLmNvbHVtbiksdGhpcy5zZWxlY3RUbyhhLnN0YXJ0LnJvdyxhLnN0YXJ0LmNvbHVtbikpOih0aGlzLnNldFNlbGVjdGlvbkFuY2hvcihhLnN0YXJ0LnJvdyxhLnN0YXJ0LmNvbHVtbiksdGhpcy5zZWxlY3RUbyhhLmVuZC5yb3csYS5lbmQuY29sdW1uKSksdGhpcy4kdXBkYXRlRGVzaXJlZENvbHVtbigpfSx0aGlzLiR1cGRhdGVEZXNpcmVkQ29sdW1uPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJzb3IoKTt0aGlzLiRkZXNpcmVkQ29sdW1uPXRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuQ29sdW1uKGEucm93LGEuY29sdW1uKX0sdGhpcy4kbW92ZVNlbGVjdGlvbj1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnNlbGVjdGlvbkxlYWQ7dGhpcy4kaXNFbXB0eSYmdGhpcy5zZXRTZWxlY3Rpb25BbmNob3IoYi5yb3csYi5jb2x1bW4pLGEuY2FsbCh0aGlzKX0sdGhpcy5zZWxlY3RUbz1mdW5jdGlvbihhLGIpe3RoaXMuJG1vdmVTZWxlY3Rpb24oZnVuY3Rpb24oKXt0aGlzLm1vdmVDdXJzb3JUbyhhLGIpfSl9LHRoaXMuc2VsZWN0VG9Qb3NpdGlvbj1mdW5jdGlvbihhKXt0aGlzLiRtb3ZlU2VsZWN0aW9uKGZ1bmN0aW9uKCl7dGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihhKX0pfSx0aGlzLnNlbGVjdFVwPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JVcCl9LHRoaXMuc2VsZWN0RG93bj1mdW5jdGlvbigpe3RoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yRG93bil9LHRoaXMuc2VsZWN0UmlnaHQ9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvclJpZ2h0KX0sdGhpcy5zZWxlY3RMZWZ0PWZ1bmN0aW9uKCl7dGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JMZWZ0KX0sdGhpcy5zZWxlY3RMaW5lU3RhcnQ9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvckxpbmVTdGFydCl9LHRoaXMuc2VsZWN0TGluZUVuZD1mdW5jdGlvbigpe3RoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yTGluZUVuZCl9LHRoaXMuc2VsZWN0RmlsZUVuZD1mdW5jdGlvbigpe3RoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yRmlsZUVuZCl9LHRoaXMuc2VsZWN0RmlsZVN0YXJ0PWZ1bmN0aW9uKCl7dGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JGaWxlU3RhcnQpfSx0aGlzLnNlbGVjdFdvcmRSaWdodD1mdW5jdGlvbigpe3RoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yV29yZFJpZ2h0KX0sdGhpcy5zZWxlY3RXb3JkTGVmdD1mdW5jdGlvbigpe3RoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yV29yZExlZnQpfSx0aGlzLnNlbGVjdFdvcmQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnNvcigpLGI9dGhpcy5zZXNzaW9uLmdldFdvcmRSYW5nZShhLnJvdyxhLmNvbHVtbik7dGhpcy5zZXRTZWxlY3Rpb25SYW5nZShiKX0sdGhpcy5zZWxlY3RBV29yZD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3Vyc29yKCksYj10aGlzLnNlc3Npb24uZ2V0QVdvcmRSYW5nZShhLnJvdyxhLmNvbHVtbik7dGhpcy5zZXRTZWxlY3Rpb25SYW5nZShiKX0sdGhpcy5zZWxlY3RMaW5lPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zZWxlY3Rpb25MZWFkLnJvdyxiLGM9dGhpcy5zZXNzaW9uLmdldEZvbGRMaW5lKGEpO2M/KGE9Yy5zdGFydC5yb3csYj1jLmVuZC5yb3cpOmI9YSx0aGlzLnNldFNlbGVjdGlvbkFuY2hvcihhLDApLHRoaXMuJG1vdmVTZWxlY3Rpb24oZnVuY3Rpb24oKXt0aGlzLm1vdmVDdXJzb3JUbyhiKzEsMCl9KX0sdGhpcy5tb3ZlQ3Vyc29yVXA9ZnVuY3Rpb24oKXt0aGlzLm1vdmVDdXJzb3JCeSgtMSwwKX0sdGhpcy5tb3ZlQ3Vyc29yRG93bj1mdW5jdGlvbigpe3RoaXMubW92ZUN1cnNvckJ5KDEsMCl9LHRoaXMubW92ZUN1cnNvckxlZnQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnNlbGVjdGlvbkxlYWQuZ2V0UG9zaXRpb24oKSxiO2lmKGI9dGhpcy5zZXNzaW9uLmdldEZvbGRBdChhLnJvdyxhLmNvbHVtbiwtMSkpdGhpcy5tb3ZlQ3Vyc29yVG8oYi5zdGFydC5yb3csYi5zdGFydC5jb2x1bW4pO2Vsc2UgaWYoYS5jb2x1bW49PTApYS5yb3c+MCYmdGhpcy5tb3ZlQ3Vyc29yVG8oYS5yb3ctMSx0aGlzLmRvYy5nZXRMaW5lKGEucm93LTEpLmxlbmd0aCk7ZWxzZXt2YXIgYz10aGlzLnNlc3Npb24uZ2V0VGFiU2l6ZSgpO3RoaXMuc2Vzc2lvbi5pc1RhYlN0b3AoYSkmJnRoaXMuZG9jLmdldExpbmUoYS5yb3cpLnNsaWNlKGEuY29sdW1uLWMsYS5jb2x1bW4pLnNwbGl0KCIgIikubGVuZ3RoLTE9PWM/dGhpcy5tb3ZlQ3Vyc29yQnkoMCwtYyk6dGhpcy5tb3ZlQ3Vyc29yQnkoMCwtMSl9fSx0aGlzLm1vdmVDdXJzb3JSaWdodD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuc2VsZWN0aW9uTGVhZC5nZXRQb3NpdGlvbigpLGI7aWYoYj10aGlzLnNlc3Npb24uZ2V0Rm9sZEF0KGEucm93LGEuY29sdW1uLDEpKXRoaXMubW92ZUN1cnNvclRvKGIuZW5kLnJvdyxiLmVuZC5jb2x1bW4pO2Vsc2UgaWYodGhpcy5zZWxlY3Rpb25MZWFkLmNvbHVtbj09dGhpcy5kb2MuZ2V0TGluZSh0aGlzLnNlbGVjdGlvbkxlYWQucm93KS5sZW5ndGgpdGhpcy5zZWxlY3Rpb25MZWFkLnJvdzx0aGlzLmRvYy5nZXRMZW5ndGgoKS0xJiZ0aGlzLm1vdmVDdXJzb3JUbyh0aGlzLnNlbGVjdGlvbkxlYWQucm93KzEsMCk7ZWxzZXt2YXIgYz10aGlzLnNlc3Npb24uZ2V0VGFiU2l6ZSgpLGE9dGhpcy5zZWxlY3Rpb25MZWFkO3RoaXMuc2Vzc2lvbi5pc1RhYlN0b3AoYSkmJnRoaXMuZG9jLmdldExpbmUoYS5yb3cpLnNsaWNlKGEuY29sdW1uLGEuY29sdW1uK2MpLnNwbGl0KCIgIikubGVuZ3RoLTE9PWM/dGhpcy5tb3ZlQ3Vyc29yQnkoMCxjKTp0aGlzLm1vdmVDdXJzb3JCeSgwLDEpfX0sdGhpcy5tb3ZlQ3Vyc29yTGluZVN0YXJ0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zZWxlY3Rpb25MZWFkLnJvdyxiPXRoaXMuc2VsZWN0aW9uTGVhZC5jb2x1bW4sYz10aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblJvdyhhLGIpLGQ9dGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihjLDApLGU9dGhpcy5zZXNzaW9uLmdldERpc3BsYXlMaW5lKGEsbnVsbCxkLnJvdyxkLmNvbHVtbiksZj1lLm1hdGNoKC9eXHMqLyk7ZlswXS5sZW5ndGg9PWI/dGhpcy5tb3ZlQ3Vyc29yVG8oZC5yb3csZC5jb2x1bW4pOnRoaXMubW92ZUN1cnNvclRvKGQucm93LGQuY29sdW1uK2ZbMF0ubGVuZ3RoKX0sdGhpcy5tb3ZlQ3Vyc29yTGluZUVuZD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuc2VsZWN0aW9uTGVhZCxiPXRoaXMuc2Vzc2lvbi5nZXREb2N1bWVudExhc3RSb3dDb2x1bW5Qb3NpdGlvbihhLnJvdyxhLmNvbHVtbik7dGhpcy5tb3ZlQ3Vyc29yVG8oYi5yb3csYi5jb2x1bW4pfSx0aGlzLm1vdmVDdXJzb3JGaWxlRW5kPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kb2MuZ2V0TGVuZ3RoKCktMSxiPXRoaXMuZG9jLmdldExpbmUoYSkubGVuZ3RoO3RoaXMubW92ZUN1cnNvclRvKGEsYil9LHRoaXMubW92ZUN1cnNvckZpbGVTdGFydD1mdW5jdGlvbigpe3RoaXMubW92ZUN1cnNvclRvKDAsMCl9LHRoaXMubW92ZUN1cnNvcldvcmRSaWdodD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuc2VsZWN0aW9uTGVhZC5yb3csYj10aGlzLnNlbGVjdGlvbkxlYWQuY29sdW1uLGM9dGhpcy5kb2MuZ2V0TGluZShhKSxkPWMuc3Vic3RyaW5nKGIpLGU7dGhpcy5zZXNzaW9uLm5vblRva2VuUmUubGFzdEluZGV4PTAsdGhpcy5zZXNzaW9uLnRva2VuUmUubGFzdEluZGV4PTA7dmFyIGY9dGhpcy5zZXNzaW9uLmdldEZvbGRBdChhLGIsMSk7aWYoZil7dGhpcy5tb3ZlQ3Vyc29yVG8oZi5lbmQucm93LGYuZW5kLmNvbHVtbik7cmV0dXJufWlmKGU9dGhpcy5zZXNzaW9uLm5vblRva2VuUmUuZXhlYyhkKSliKz10aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXgsdGhpcy5zZXNzaW9uLm5vblRva2VuUmUubGFzdEluZGV4PTAsZD1jLnN1YnN0cmluZyhiKTtpZihiPj1jLmxlbmd0aCl7dGhpcy5tb3ZlQ3Vyc29yVG8oYSxjLmxlbmd0aCksdGhpcy5tb3ZlQ3Vyc29yUmlnaHQoKSxhPHRoaXMuZG9jLmdldExlbmd0aCgpLTEmJnRoaXMubW92ZUN1cnNvcldvcmRSaWdodCgpO3JldHVybn1pZihlPXRoaXMuc2Vzc2lvbi50b2tlblJlLmV4ZWMoZCkpYis9dGhpcy5zZXNzaW9uLnRva2VuUmUubGFzdEluZGV4LHRoaXMuc2Vzc2lvbi50b2tlblJlLmxhc3RJbmRleD0wO3RoaXMubW92ZUN1cnNvclRvKGEsYil9LHRoaXMubW92ZUN1cnNvcldvcmRMZWZ0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zZWxlY3Rpb25MZWFkLnJvdyxiPXRoaXMuc2VsZWN0aW9uTGVhZC5jb2x1bW4sYztpZihjPXRoaXMuc2Vzc2lvbi5nZXRGb2xkQXQoYSxiLC0xKSl7dGhpcy5tb3ZlQ3Vyc29yVG8oYy5zdGFydC5yb3csYy5zdGFydC5jb2x1bW4pO3JldHVybn12YXIgZD10aGlzLnNlc3Npb24uZ2V0Rm9sZFN0cmluZ0F0KGEsYiwtMSk7ZD09bnVsbCYmKGQ9dGhpcy5kb2MuZ2V0TGluZShhKS5zdWJzdHJpbmcoMCxiKSk7dmFyIGY9ZS5zdHJpbmdSZXZlcnNlKGQpLGc7dGhpcy5zZXNzaW9uLm5vblRva2VuUmUubGFzdEluZGV4PTAsdGhpcy5zZXNzaW9uLnRva2VuUmUubGFzdEluZGV4PTA7aWYoZz10aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5leGVjKGYpKWItPXRoaXMuc2Vzc2lvbi5ub25Ub2tlblJlLmxhc3RJbmRleCxmPWYuc2xpY2UodGhpcy5zZXNzaW9uLm5vblRva2VuUmUubGFzdEluZGV4KSx0aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXg9MDtpZihiPD0wKXt0aGlzLm1vdmVDdXJzb3JUbyhhLDApLHRoaXMubW92ZUN1cnNvckxlZnQoKSxhPjAmJnRoaXMubW92ZUN1cnNvcldvcmRMZWZ0KCk7cmV0dXJufWlmKGc9dGhpcy5zZXNzaW9uLnRva2VuUmUuZXhlYyhmKSliLT10aGlzLnNlc3Npb24udG9rZW5SZS5sYXN0SW5kZXgsdGhpcy5zZXNzaW9uLnRva2VuUmUubGFzdEluZGV4PTA7dGhpcy5tb3ZlQ3Vyc29yVG8oYSxiKX0sdGhpcy5tb3ZlQ3Vyc29yQnk9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHRoaXMuc2VsZWN0aW9uTGVhZC5yb3csdGhpcy5zZWxlY3Rpb25MZWFkLmNvbHVtbiksZD1iPT09MCYmdGhpcy4kZGVzaXJlZENvbHVtbnx8Yy5jb2x1bW4sZT10aGlzLnNlc3Npb24uc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKGMucm93K2EsZCk7dGhpcy5tb3ZlQ3Vyc29yVG8oZS5yb3csZS5jb2x1bW4rYixiPT09MCl9LHRoaXMubW92ZUN1cnNvclRvUG9zaXRpb249ZnVuY3Rpb24oYSl7dGhpcy5tb3ZlQ3Vyc29yVG8oYS5yb3csYS5jb2x1bW4pfSx0aGlzLm1vdmVDdXJzb3JUbz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5zZXNzaW9uLmdldEZvbGRBdChhLGIsMSk7ZCYmKGE9ZC5zdGFydC5yb3csYj1kLnN0YXJ0LmNvbHVtbiksdGhpcy4kcHJldmVudFVwZGF0ZURlc2lyZWRDb2x1bW5PbkNoYW5nZT0hMCx0aGlzLnNlbGVjdGlvbkxlYWQuc2V0UG9zaXRpb24oYSxiKSx0aGlzLiRwcmV2ZW50VXBkYXRlRGVzaXJlZENvbHVtbk9uQ2hhbmdlPSExLGN8fHRoaXMuJHVwZGF0ZURlc2lyZWRDb2x1bW4odGhpcy5zZWxlY3Rpb25MZWFkLmNvbHVtbil9LHRoaXMubW92ZUN1cnNvclRvU2NyZWVuPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLnNlc3Npb24uc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKGEsYik7YT1kLnJvdyxiPWQuY29sdW1uLHRoaXMubW92ZUN1cnNvclRvKGEsYixjKX19KSkuY2FsbChoLnByb3RvdHlwZSksYi5TZWxlY3Rpb249aH0pLGRlZmluZSgiYWNlL3JhbmdlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1mdW5jdGlvbihhLGIsYyxkKXt0aGlzLnN0YXJ0PXtyb3c6YSxjb2x1bW46Yn0sdGhpcy5lbmQ9e3JvdzpjLGNvbHVtbjpkfX07KChmdW5jdGlvbigpe3RoaXMuaXNFZXF1YWw9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc3RhcnQucm93PT1hLnN0YXJ0LnJvdyYmdGhpcy5lbmQucm93PT1hLmVuZC5yb3cmJnRoaXMuc3RhcnQuY29sdW1uPT1hLnN0YXJ0LmNvbHVtbiYmdGhpcy5lbmQuY29sdW1uPT1hLmVuZC5jb2x1bW59LHRoaXMudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iUmFuZ2U6IFsiK3RoaXMuc3RhcnQucm93KyIvIit0aGlzLnN0YXJ0LmNvbHVtbisiXSAtPiBbIit0aGlzLmVuZC5yb3crIi8iK3RoaXMuZW5kLmNvbHVtbisiXSJ9LHRoaXMuY29udGFpbnM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5jb21wYXJlKGEsYik9PTB9LHRoaXMuY29tcGFyZVJhbmdlPWZ1bmN0aW9uKGEpe3ZhciBiLGM9YS5lbmQsZD1hLnN0YXJ0O3JldHVybiBiPXRoaXMuY29tcGFyZShjLnJvdyxjLmNvbHVtbiksYj09MT8oYj10aGlzLmNvbXBhcmUoZC5yb3csZC5jb2x1bW4pLGI9PTE/MjpiPT0wPzE6MCk6Yj09LTE/LTI6KGI9dGhpcy5jb21wYXJlKGQucm93LGQuY29sdW1uKSxiPT0tMT8tMTpiPT0xPzQyOjApfSx0aGlzLmNvbXBhcmVQb2ludD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5jb21wYXJlKGEucm93LGEuY29sdW1uKX0sdGhpcy5jb250YWluc1JhbmdlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmNvbXBhcmVQb2ludChhLnN0YXJ0KT09MCYmdGhpcy5jb21wYXJlUG9pbnQoYS5lbmQpPT0wfSx0aGlzLmlzRW5kPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZW5kLnJvdz09YSYmdGhpcy5lbmQuY29sdW1uPT1ifSx0aGlzLmlzU3RhcnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5zdGFydC5yb3c9PWEmJnRoaXMuc3RhcnQuY29sdW1uPT1ifSx0aGlzLnNldFN0YXJ0PWZ1bmN0aW9uKGEsYil7dHlwZW9mIGE9PSJvYmplY3QiPyh0aGlzLnN0YXJ0LmNvbHVtbj1hLmNvbHVtbix0aGlzLnN0YXJ0LnJvdz1hLnJvdyk6KHRoaXMuc3RhcnQucm93PWEsdGhpcy5zdGFydC5jb2x1bW49Yil9LHRoaXMuc2V0RW5kPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGE9PSJvYmplY3QiPyh0aGlzLmVuZC5jb2x1bW49YS5jb2x1bW4sdGhpcy5lbmQucm93PWEucm93KToodGhpcy5lbmQucm93PWEsdGhpcy5lbmQuY29sdW1uPWIpfSx0aGlzLmluc2lkZT1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmNvbXBhcmUoYSxiKT09MD90aGlzLmlzRW5kKGEsYil8fHRoaXMuaXNTdGFydChhLGIpPyExOiEwOiExfSx0aGlzLmluc2lkZVN0YXJ0PWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuY29tcGFyZShhLGIpPT0wP3RoaXMuaXNFbmQoYSxiKT8hMTohMDohMX0sdGhpcy5pbnNpZGVFbmQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5jb21wYXJlKGEsYik9PTA/dGhpcy5pc1N0YXJ0KGEsYik/ITE6ITA6ITF9LHRoaXMuY29tcGFyZT1mdW5jdGlvbihhLGIpe3JldHVybiF0aGlzLmlzTXVsdGlMaW5lKCkmJmE9PT10aGlzLnN0YXJ0LnJvdz9iPHRoaXMuc3RhcnQuY29sdW1uPy0xOmI+dGhpcy5lbmQuY29sdW1uPzE6MDphPHRoaXMuc3RhcnQucm93Py0xOmE+dGhpcy5lbmQucm93PzE6dGhpcy5zdGFydC5yb3c9PT1hP2I+PXRoaXMuc3RhcnQuY29sdW1uPzA6LTE6dGhpcy5lbmQucm93PT09YT9iPD10aGlzLmVuZC5jb2x1bW4/MDoxOjB9LHRoaXMuY29tcGFyZVN0YXJ0PWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuc3RhcnQucm93PT1hJiZ0aGlzLnN0YXJ0LmNvbHVtbj09Yj8tMTp0aGlzLmNvbXBhcmUoYSxiKX0sdGhpcy5jb21wYXJlRW5kPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZW5kLnJvdz09YSYmdGhpcy5lbmQuY29sdW1uPT1iPzE6dGhpcy5jb21wYXJlKGEsYil9LHRoaXMuY29tcGFyZUluc2lkZT1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmVuZC5yb3c9PWEmJnRoaXMuZW5kLmNvbHVtbj09Yj8xOnRoaXMuc3RhcnQucm93PT1hJiZ0aGlzLnN0YXJ0LmNvbHVtbj09Yj8tMTp0aGlzLmNvbXBhcmUoYSxiKX0sdGhpcy5jbGlwUm93cz1mdW5jdGlvbihhLGIpe2lmKHRoaXMuZW5kLnJvdz5iKXZhciBjPXtyb3c6YisxLGNvbHVtbjowfTtpZih0aGlzLnN0YXJ0LnJvdz5iKXZhciBlPXtyb3c6YisxLGNvbHVtbjowfTtpZih0aGlzLnN0YXJ0LnJvdzxhKXZhciBlPXtyb3c6YSxjb2x1bW46MH07aWYodGhpcy5lbmQucm93PGEpdmFyIGM9e3JvdzphLGNvbHVtbjowfTtyZXR1cm4gZC5mcm9tUG9pbnRzKGV8fHRoaXMuc3RhcnQsY3x8dGhpcy5lbmQpfSx0aGlzLmV4dGVuZD1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuY29tcGFyZShhLGIpO2lmKGM9PTApcmV0dXJuIHRoaXM7aWYoYz09LTEpdmFyIGU9e3JvdzphLGNvbHVtbjpifTtlbHNlIHZhciBmPXtyb3c6YSxjb2x1bW46Yn07cmV0dXJuIGQuZnJvbVBvaW50cyhlfHx0aGlzLnN0YXJ0LGZ8fHRoaXMuZW5kKX0sdGhpcy5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhcnQucm93PT10aGlzLmVuZC5yb3cmJnRoaXMuc3RhcnQuY29sdW1uPT10aGlzLmVuZC5jb2x1bW59LHRoaXMuaXNNdWx0aUxpbmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFydC5yb3chPT10aGlzLmVuZC5yb3d9LHRoaXMuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gZC5mcm9tUG9pbnRzKHRoaXMuc3RhcnQsdGhpcy5lbmQpfSx0aGlzLmNvbGxhcHNlUm93cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVuZC5jb2x1bW49PTA/bmV3IGQodGhpcy5zdGFydC5yb3csMCxNYXRoLm1heCh0aGlzLnN0YXJ0LnJvdyx0aGlzLmVuZC5yb3ctMSksMCk6bmV3IGQodGhpcy5zdGFydC5yb3csMCx0aGlzLmVuZC5yb3csMCl9LHRoaXMudG9TY3JlZW5SYW5nZT1mdW5jdGlvbihhKXt2YXIgYj1hLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbih0aGlzLnN0YXJ0KSxjPWEuZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHRoaXMuZW5kKTtyZXR1cm4gbmV3IGQoYi5yb3csYi5jb2x1bW4sYy5yb3csYy5jb2x1bW4pfX0pKS5jYWxsKGQucHJvdG90eXBlKSxkLmZyb21Qb2ludHM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IGQoYS5yb3csYS5jb2x1bW4sYi5yb3csYi5jb2x1bW4pfSxiLlJhbmdlPWR9KSxkZWZpbmUoImFjZS9tb2RlL3RleHQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS9iZWhhdmlvdXIiLCJhY2UvdW5pY29kZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGU9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxmPWEoIi4vYmVoYXZpb3VyIikuQmVoYXZpb3VyLGc9YSgiLi4vdW5pY29kZSIpLGg9ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbml6ZXI9bmV3IGQoKG5ldyBlKS5nZXRSdWxlcygpKSx0aGlzLiRiZWhhdmlvdXI9bmV3IGZ9OygoZnVuY3Rpb24oKXt0aGlzLnRva2VuUmU9bmV3IFJlZ0V4cCgiXlsiK2cucGFja2FnZXMuTCtnLnBhY2thZ2VzLk1uK2cucGFja2FnZXMuTWMrZy5wYWNrYWdlcy5OZCtnLnBhY2thZ2VzLlBjKyJcXCRfXSsiLCJnIiksdGhpcy5ub25Ub2tlblJlPW5ldyBSZWdFeHAoIl4oPzpbXiIrZy5wYWNrYWdlcy5MK2cucGFja2FnZXMuTW4rZy5wYWNrYWdlcy5NYytnLnBhY2thZ2VzLk5kK2cucGFja2FnZXMuUGMrIlxcJF9dfHNdKSsiLCJnIiksdGhpcy5nZXRUb2tlbml6ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdG9rZW5pemVyfSx0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcz1mdW5jdGlvbihhLGIsYyxkKXt9LHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiIifSx0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuITF9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe30sdGhpcy4kZ2V0SW5kZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEubWF0Y2goL14oXHMrKS8pO3JldHVybiBiP2JbMV06IiJ9LHRoaXMuY3JlYXRlV29ya2VyPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsfSx0aGlzLmhpZ2hsaWdodFNlbGVjdGlvbj1mdW5jdGlvbihhKXt2YXIgYj1hLnNlc3Npb247Yi4kc2VsZWN0aW9uT2NjdXJyZW5jZXN8fChiLiRzZWxlY3Rpb25PY2N1cnJlbmNlcz1bXSksYi4kc2VsZWN0aW9uT2NjdXJyZW5jZXMubGVuZ3RoJiZ0aGlzLmNsZWFyU2VsZWN0aW9uSGlnaGxpZ2h0KGEpO3ZhciBjPWEuZ2V0U2VsZWN0aW9uUmFuZ2UoKTtpZihjLmlzRW1wdHkoKXx8Yy5pc011bHRpTGluZSgpKXJldHVybjt2YXIgZD1jLnN0YXJ0LmNvbHVtbi0xLGU9Yy5lbmQuY29sdW1uKzEsZj1iLmdldExpbmUoYy5zdGFydC5yb3cpLGc9Zi5sZW5ndGgsaD1mLnN1YnN0cmluZyhNYXRoLm1heChkLDApLE1hdGgubWluKGUsZykpO2lmKGQ+PTAmJi9eW1x3XGRdLy50ZXN0KGgpfHxlPD1nJiYvW1x3XGRdJC8udGVzdChoKSlyZXR1cm47aD1mLnN1YnN0cmluZyhjLnN0YXJ0LmNvbHVtbixjLmVuZC5jb2x1bW4pO2lmKCEvXltcd1xkXSskLy50ZXN0KGgpKXJldHVybjt2YXIgaT1hLmdldEN1cnNvclBvc2l0aW9uKCksaj17d3JhcDohMCx3aG9sZVdvcmQ6ITAsY2FzZVNlbnNpdGl2ZTohMCxuZWVkbGU6aH0saz1hLiRzZWFyY2guZ2V0T3B0aW9ucygpO2EuJHNlYXJjaC5zZXQoaik7dmFyIGw9YS4kc2VhcmNoLmZpbmRBbGwoYik7bC5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKCFhLmNvbnRhaW5zKGkucm93LGkuY29sdW1uKSl7dmFyIGM9Yi5hZGRNYXJrZXIoYSwiYWNlX3NlbGVjdGVkX3dvcmQiLCJ0ZXh0Iik7Yi4kc2VsZWN0aW9uT2NjdXJyZW5jZXMucHVzaChjKX19KSxhLiRzZWFyY2guc2V0KGspfSx0aGlzLmNsZWFyU2VsZWN0aW9uSGlnaGxpZ2h0PWZ1bmN0aW9uKGEpe2lmKCFhLnNlc3Npb24uJHNlbGVjdGlvbk9jY3VycmVuY2VzKXJldHVybjthLnNlc3Npb24uJHNlbGVjdGlvbk9jY3VycmVuY2VzLmZvckVhY2goZnVuY3Rpb24oYil7YS5zZXNzaW9uLnJlbW92ZU1hcmtlcihiKX0pLGEuc2Vzc2lvbi4kc2VsZWN0aW9uT2NjdXJyZW5jZXM9W119LHRoaXMuY3JlYXRlTW9kZURlbGVnYXRlcz1mdW5jdGlvbihhKXtpZighdGhpcy4kZW1iZWRzKXJldHVybjt0aGlzLiRtb2Rlcz17fTtmb3IodmFyIGI9MDtiPHRoaXMuJGVtYmVkcy5sZW5ndGg7YisrKWFbdGhpcy4kZW1iZWRzW2JdXSYmKHRoaXMuJG1vZGVzW3RoaXMuJGVtYmVkc1tiXV09bmV3IGFbdGhpcy4kZW1iZWRzW2JdXSk7dmFyIGM9WyJ0b2dnbGVDb21tZW50TGluZXMiLCJnZXROZXh0TGluZUluZGVudCIsImNoZWNrT3V0ZGVudCIsImF1dG9PdXRkZW50IiwidHJhbnNmb3JtQWN0aW9uIl07Zm9yKHZhciBiPTA7YjxjLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEpe3ZhciBkPWNbYl0sZT1hW2RdO2FbY1tiXV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZGVsZWdhdG9yKGQsYXJndW1lbnRzLGUpfX0pKHRoaXMpfSx0aGlzLiRkZWxlZ2F0b3I9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWJbMF07Zm9yKHZhciBlPTA7ZTx0aGlzLiRlbWJlZHMubGVuZ3RoO2UrKyl7aWYoIXRoaXMuJG1vZGVzW3RoaXMuJGVtYmVkc1tlXV0pY29udGludWU7dmFyIGY9ZC5zcGxpdCh0aGlzLiRlbWJlZHNbZV0pO2lmKCFmWzBdJiZmWzFdKXtiWzBdPWZbMV07dmFyIGc9dGhpcy4kbW9kZXNbdGhpcy4kZW1iZWRzW2VdXTtyZXR1cm4gZ1thXS5hcHBseShnLGIpfX12YXIgaD1jLmFwcGx5KHRoaXMsYik7cmV0dXJuIGM/aDp1bmRlZmluZWR9LHRoaXMudHJhbnNmb3JtQWN0aW9uPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYodGhpcy4kYmVoYXZpb3VyKXt2YXIgZj10aGlzLiRiZWhhdmlvdXIuZ2V0QmVoYXZpb3VycygpO2Zvcih2YXIgZyBpbiBmKWlmKGZbZ11bYl0pe3ZhciBoPWZbZ11bYl0uYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKGgpcmV0dXJuIGh9fX19KSkuY2FsbChoLnByb3RvdHlwZSksYi5Nb2RlPWh9KSxkZWZpbmUoImFjZS90b2tlbml6ZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWZ1bmN0aW9uKGEsYil7Yj1iPyJnIitiOiJnIix0aGlzLnJ1bGVzPWEsdGhpcy5yZWdFeHBzPXt9LHRoaXMubWF0Y2hNYXBwaW5ncz17fTtmb3IodmFyIGMgaW4gdGhpcy5ydWxlcyl7dmFyIGQ9dGhpcy5ydWxlc1tjXSxlPWQsZj1bXSxnPTAsaD10aGlzLm1hdGNoTWFwcGluZ3NbY109e307Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBqPShuZXcgUmVnRXhwKCIoPzooIitlW2ldLnJlZ2V4KyIpfCguKSkiKSkuZXhlYygiYSIpLmxlbmd0aC0yLGs9ZVtpXS5yZWdleC5yZXBsYWNlKC9cXChbMC05XSspL2csZnVuY3Rpb24oYSxiKXtyZXR1cm4iXFwiKyhwYXJzZUludChiLDEwKStnKzEpfSk7aFtnXT17cnVsZTppLGxlbjpqfSxnKz1qLGYucHVzaChrKX10aGlzLnJlZ0V4cHNbY109bmV3IFJlZ0V4cCgiKD86KCIrZi5qb2luKCIpfCgiKSsiKXwoLikpIixiKX19OygoZnVuY3Rpb24oKXt0aGlzLmdldExpbmVUb2tlbnM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLGQ9dGhpcy5ydWxlc1tjXSxlPXRoaXMubWF0Y2hNYXBwaW5nc1tjXSxmPXRoaXMucmVnRXhwc1tjXTtmLmxhc3RJbmRleD0wO3ZhciBnLGg9W10saT0wLGo9e3R5cGU6bnVsbCx2YWx1ZToiIn07d2hpbGUoZz1mLmV4ZWMoYSkpe3ZhciBrPSJ0ZXh0IixsPW51bGwsbT1bZ1swXV07Zm9yKHZhciBuPTA7bjxnLmxlbmd0aC0yO24rKylpZihnW24rMV0hPT11bmRlZmluZWQpe2w9ZFtlW25dLnJ1bGVdLGVbbl0ubGVuPjEmJihtPWcuc2xpY2UobisyLG4rMStlW25dLmxlbikpLHR5cGVvZiBsLnRva2VuPT0iZnVuY3Rpb24iP2s9bC50b2tlbi5hcHBseSh0aGlzLG0pOms9bC50b2tlbjt2YXIgbz1sLm5leHQ7byYmbyE9PWMmJihjPW8sZD10aGlzLnJ1bGVzW2NdLGU9dGhpcy5tYXRjaE1hcHBpbmdzW2NdLGk9Zi5sYXN0SW5kZXgsZj10aGlzLnJlZ0V4cHNbY10sZi5sYXN0SW5kZXg9aSk7YnJlYWt9aWYobVswXSl7dHlwZW9mIGs9PSJzdHJpbmciJiYobT1bbS5qb2luKCIiKV0saz1ba10pO2Zvcih2YXIgbj0wO248bS5sZW5ndGg7bisrKSghbHx8bC5tZXJnZXx8a1tuXT09PSJ0ZXh0IikmJmoudHlwZT09PWtbbl0/ai52YWx1ZSs9bVtuXTooai50eXBlJiZoLnB1c2goaiksaj17dHlwZTprW25dLHZhbHVlOm1bbl19KX1pZihpPT1hLmxlbmd0aClicmVhaztpPWYubGFzdEluZGV4fXJldHVybiBqLnR5cGUmJmgucHVzaChqKSx7dG9rZW5zOmgsc3RhdGU6Y319fSkpLmNhbGwoZC5wcm90b3R5cGUpLGIuVG9rZW5pemVyPWR9KSxkZWZpbmUoImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9sYW5nIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvbGFuZyIpLGU9ZnVuY3Rpb24oKXt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoiZW1wdHlfbGluZSIscmVnZXg6Il4kIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiLisifV19fTsoKGZ1bmN0aW9uKCl7dGhpcy5hZGRSdWxlcz1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyBpbiBhKXt2YXIgZD1hW2NdO2Zvcih2YXIgZT0wO2U8ZC5sZW5ndGg7ZSsrKXt2YXIgZj1kW2VdO2YubmV4dD9mLm5leHQ9YitmLm5leHQ6Zi5uZXh0PWIrY310aGlzLiRydWxlc1tiK2NdPWR9fSx0aGlzLmdldFJ1bGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHJ1bGVzfSx0aGlzLmVtYmVkUnVsZXM9ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGY9KG5ldyBhKS5nZXRSdWxlcygpO2lmKGUpZm9yKHZhciBnPTA7ZzxlLmxlbmd0aDtnKyspZVtnXT1iK2VbZ107ZWxzZXtlPVtdO2Zvcih2YXIgaCBpbiBmKWUucHVzaChiK2gpfXRoaXMuYWRkUnVsZXMoZixiKTtmb3IodmFyIGc9MDtnPGUubGVuZ3RoO2crKylBcnJheS5wcm90b3R5cGUudW5zaGlmdC5hcHBseSh0aGlzLiRydWxlc1tlW2ddXSxkLmRlZXBDb3B5KGMpKTt0aGlzLiRlbWJlZHN8fCh0aGlzLiRlbWJlZHM9W10pLHRoaXMuJGVtYmVkcy5wdXNoKGIpfSx0aGlzLmdldEVtYmVkcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRlbWJlZHN9fSkpLmNhbGwoZS5wcm90b3R5cGUpLGIuVGV4dEhpZ2hsaWdodFJ1bGVzPWV9KSxkZWZpbmUoImFjZS9tb2RlL2JlaGF2aW91ciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9ZnVuY3Rpb24oKXt0aGlzLiRiZWhhdmlvdXJzPXt9fTsoKGZ1bmN0aW9uKCl7dGhpcy5hZGQ9ZnVuY3Rpb24oYSxiLGMpe3N3aXRjaCh1bmRlZmluZWQpe2Nhc2UgdGhpcy4kYmVoYXZpb3Vyczp0aGlzLiRiZWhhdmlvdXJzPXt9O2Nhc2UgdGhpcy4kYmVoYXZpb3Vyc1thXTp0aGlzLiRiZWhhdmlvdXJzW2FdPXt9fXRoaXMuJGJlaGF2aW91cnNbYV1bYl09Y30sdGhpcy5hZGRCZWhhdmlvdXJzPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYiBpbiBhKWZvcih2YXIgYyBpbiBhW2JdKXRoaXMuYWRkKGIsYyxhW2JdW2NdKX0sdGhpcy5yZW1vdmU9ZnVuY3Rpb24oYSl7dGhpcy4kYmVoYXZpb3VycyYmdGhpcy4kYmVoYXZpb3Vyc1thXSYmZGVsZXRlIHRoaXMuJGJlaGF2aW91cnNbYV19LHRoaXMuaW5oZXJpdD1mdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXZhciBjPShuZXcgYSkuZ2V0QmVoYXZpb3VycyhiKTtlbHNlIHZhciBjPWEuZ2V0QmVoYXZpb3VycyhiKTt0aGlzLmFkZEJlaGF2aW91cnMoYyl9LHRoaXMuZ2V0QmVoYXZpb3Vycz1mdW5jdGlvbihhKXtpZighYSlyZXR1cm4gdGhpcy4kYmVoYXZpb3Vyczt2YXIgYj17fTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyl0aGlzLiRiZWhhdmlvdXJzW2FbY11dJiYoYlthW2NdXT10aGlzLiRiZWhhdmlvdXJzW2FbY11dKTtyZXR1cm4gYn19KSkuY2FsbChkLnByb3RvdHlwZSksYi5CZWhhdmlvdXI9ZH0pLGRlZmluZSgiYWNlL3VuaWNvZGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXt2YXIgYz0vXHd7NH0vZztmb3IodmFyIGQgaW4gYSliLnBhY2thZ2VzW2RdPWFbZF0ucmVwbGFjZShjLCJcXHUkJiIpfSJ1c2Ugc3RyaWN0IixiLnBhY2thZ2VzPXt9LGQoe0w6IjAwNDEtMDA1QTAwNjEtMDA3QTAwQUEwMEI1MDBCQTAwQzAtMDBENjAwRDgtMDBGNjAwRjgtMDJDMTAyQzYtMDJEMTAyRTAtMDJFNDAyRUMwMkVFMDM3MC0wMzc0MDM3NjAzNzcwMzdBLTAzN0QwMzg2MDM4OC0wMzhBMDM4QzAzOEUtMDNBMTAzQTMtMDNGNTAzRjctMDQ4MTA0OEEtMDUyNTA1MzEtMDU1NjA1NTkwNTYxLTA1ODcwNUQwLTA1RUEwNUYwLTA1RjIwNjIxLTA2NEEwNjZFMDY2RjA2NzEtMDZEMzA2RDUwNkU1MDZFNjA2RUUwNkVGMDZGQS0wNkZDMDZGRjA3MTAwNzEyLTA3MkYwNzRELTA3QTUwN0IxMDdDQS0wN0VBMDdGNDA3RjUwN0ZBMDgwMC0wODE1MDgxQTA4MjQwODI4MDkwNC0wOTM5MDkzRDA5NTAwOTU4LTA5NjEwOTcxMDk3MjA5NzktMDk3RjA5ODUtMDk4QzA5OEYwOTkwMDk5My0wOUE4MDlBQS0wOUIwMDlCMjA5QjYtMDlCOTA5QkQwOUNFMDlEQzA5REQwOURGLTA5RTEwOUYwMDlGMTBBMDUtMEEwQTBBMEYwQTEwMEExMy0wQTI4MEEyQS0wQTMwMEEzMjBBMzMwQTM1MEEzNjBBMzgwQTM5MEE1OS0wQTVDMEE1RTBBNzItMEE3NDBBODUtMEE4RDBBOEYtMEE5MTBBOTMtMEFBODBBQUEtMEFCMDBBQjIwQUIzMEFCNS0wQUI5MEFCRDBBRDAwQUUwMEFFMTBCMDUtMEIwQzBCMEYwQjEwMEIxMy0wQjI4MEIyQS0wQjMwMEIzMjBCMzMwQjM1LTBCMzkwQjNEMEI1QzBCNUQwQjVGLTBCNjEwQjcxMEI4MzBCODUtMEI4QTBCOEUtMEI5MDBCOTItMEI5NTBCOTkwQjlBMEI5QzBCOUUwQjlGMEJBMzBCQTQwQkE4LTBCQUEwQkFFLTBCQjkwQkQwMEMwNS0wQzBDMEMwRS0wQzEwMEMxMi0wQzI4MEMyQS0wQzMzMEMzNS0wQzM5MEMzRDBDNTgwQzU5MEM2MDBDNjEwQzg1LTBDOEMwQzhFLTBDOTAwQzkyLTBDQTgwQ0FBLTBDQjMwQ0I1LTBDQjkwQ0JEMENERTBDRTAwQ0UxMEQwNS0wRDBDMEQwRS0wRDEwMEQxMi0wRDI4MEQyQS0wRDM5MEQzRDBENjAwRDYxMEQ3QS0wRDdGMEQ4NS0wRDk2MEQ5QS0wREIxMERCMy0wREJCMERCRDBEQzAtMERDNjBFMDEtMEUzMDBFMzIwRTMzMEU0MC0wRTQ2MEU4MTBFODIwRTg0MEU4NzBFODgwRThBMEU4RDBFOTQtMEU5NzBFOTktMEU5RjBFQTEtMEVBMzBFQTUwRUE3MEVBQTBFQUIwRUFELTBFQjAwRUIyMEVCMzBFQkQwRUMwLTBFQzQwRUM2MEVEQzBFREQwRjAwMEY0MC0wRjQ3MEY0OS0wRjZDMEY4OC0wRjhCMTAwMC0xMDJBMTAzRjEwNTAtMTA1NTEwNUEtMTA1RDEwNjExMDY1MTA2NjEwNkUtMTA3MDEwNzUtMTA4MTEwOEUxMEEwLTEwQzUxMEQwLTEwRkExMEZDMTEwMC0xMjQ4MTI0QS0xMjREMTI1MC0xMjU2MTI1ODEyNUEtMTI1RDEyNjAtMTI4ODEyOEEtMTI4RDEyOTAtMTJCMDEyQjItMTJCNTEyQjgtMTJCRTEyQzAxMkMyLTEyQzUxMkM4LTEyRDYxMkQ4LTEzMTAxMzEyLTEzMTUxMzE4LTEzNUExMzgwLTEzOEYxM0EwLTEzRjQxNDAxLTE2NkMxNjZGLTE2N0YxNjgxLTE2OUExNkEwLTE2RUExNzAwLTE3MEMxNzBFLTE3MTExNzIwLTE3MzExNzQwLTE3NTExNzYwLTE3NkMxNzZFLTE3NzAxNzgwLTE3QjMxN0Q3MTdEQzE4MjAtMTg3NzE4ODAtMThBODE4QUExOEIwLTE4RjUxOTAwLTE5MUMxOTUwLTE5NkQxOTcwLTE5NzQxOTgwLTE5QUIxOUMxLTE5QzcxQTAwLTFBMTYxQTIwLTFBNTQxQUE3MUIwNS0xQjMzMUI0NS0xQjRCMUI4My0xQkEwMUJBRTFCQUYxQzAwLTFDMjMxQzRELTFDNEYxQzVBLTFDN0QxQ0U5LTFDRUMxQ0VFLTFDRjExRDAwLTFEQkYxRTAwLTFGMTUxRjE4LTFGMUQxRjIwLTFGNDUxRjQ4LTFGNEQxRjUwLTFGNTcxRjU5MUY1QjFGNUQxRjVGLTFGN0QxRjgwLTFGQjQxRkI2LTFGQkMxRkJFMUZDMi0xRkM0MUZDNi0xRkNDMUZEMC0xRkQzMUZENi0xRkRCMUZFMC0xRkVDMUZGMi0xRkY0MUZGNi0xRkZDMjA3MTIwN0YyMDkwLTIwOTQyMTAyMjEwNzIxMEEtMjExMzIxMTUyMTE5LTIxMUQyMTI0MjEyNjIxMjgyMTJBLTIxMkQyMTJGLTIxMzkyMTNDLTIxM0YyMTQ1LTIxNDkyMTRFMjE4MzIxODQyQzAwLTJDMkUyQzMwLTJDNUUyQzYwLTJDRTQyQ0VCLTJDRUUyRDAwLTJEMjUyRDMwLTJENjUyRDZGMkQ4MC0yRDk2MkRBMC0yREE2MkRBOC0yREFFMkRCMC0yREI2MkRCOC0yREJFMkRDMC0yREM2MkRDOC0yRENFMkREMC0yREQ2MkREOC0yRERFMkUyRjMwMDUzMDA2MzAzMS0zMDM1MzAzQjMwM0MzMDQxLTMwOTYzMDlELTMwOUYzMEExLTMwRkEzMEZDLTMwRkYzMTA1LTMxMkQzMTMxLTMxOEUzMUEwLTMxQjczMUYwLTMxRkYzNDAwLTREQjU0RTAwLTlGQ0JBMDAwLUE0OENBNEQwLUE0RkRBNTAwLUE2MENBNjEwLUE2MUZBNjJBQTYyQkE2NDAtQTY1RkE2NjItQTY2RUE2N0YtQTY5N0E2QTAtQTZFNUE3MTctQTcxRkE3MjItQTc4OEE3OEJBNzhDQTdGQi1BODAxQTgwMy1BODA1QTgwNy1BODBBQTgwQy1BODIyQTg0MC1BODczQTg4Mi1BOEIzQThGMi1BOEY3QThGQkE5MEEtQTkyNUE5MzAtQTk0NkE5NjAtQTk3Q0E5ODQtQTlCMkE5Q0ZBQTAwLUFBMjhBQTQwLUFBNDJBQTQ0LUFBNEJBQTYwLUFBNzZBQTdBQUE4MC1BQUFGQUFCMUFBQjVBQUI2QUFCOS1BQUJEQUFDMEFBQzJBQURCLUFBRERBQkMwLUFCRTJBQzAwLUQ3QTNEN0IwLUQ3QzZEN0NCLUQ3RkJGOTAwLUZBMkRGQTMwLUZBNkRGQTcwLUZBRDlGQjAwLUZCMDZGQjEzLUZCMTdGQjFERkIxRi1GQjI4RkIyQS1GQjM2RkIzOC1GQjNDRkIzRUZCNDBGQjQxRkI0M0ZCNDRGQjQ2LUZCQjFGQkQzLUZEM0RGRDUwLUZEOEZGRDkyLUZEQzdGREYwLUZERkJGRTcwLUZFNzRGRTc2LUZFRkNGRjIxLUZGM0FGRjQxLUZGNUFGRjY2LUZGQkVGRkMyLUZGQzdGRkNBLUZGQ0ZGRkQyLUZGRDdGRkRBLUZGREMiLExsOiIwMDYxLTAwN0EwMEFBMDBCNTAwQkEwMERGLTAwRjYwMEY4LTAwRkYwMTAxMDEwMzAxMDUwMTA3MDEwOTAxMEIwMTBEMDEwRjAxMTEwMTEzMDExNTAxMTcwMTE5MDExQjAxMUQwMTFGMDEyMTAxMjMwMTI1MDEyNzAxMjkwMTJCMDEyRDAxMkYwMTMxMDEzMzAxMzUwMTM3MDEzODAxM0EwMTNDMDEzRTAxNDAwMTQyMDE0NDAxNDYwMTQ4MDE0OTAxNEIwMTREMDE0RjAxNTEwMTUzMDE1NTAxNTcwMTU5MDE1QjAxNUQwMTVGMDE2MTAxNjMwMTY1MDE2NzAxNjkwMTZCMDE2RDAxNkYwMTcxMDE3MzAxNzUwMTc3MDE3QTAxN0MwMTdFLTAxODAwMTgzMDE4NTAxODgwMThDMDE4RDAxOTIwMTk1MDE5OS0wMTlCMDE5RTAxQTEwMUEzMDFBNTAxQTgwMUFBMDFBQjAxQUQwMUIwMDFCNDAxQjYwMUI5MDFCQTAxQkQtMDFCRjAxQzYwMUM5MDFDQzAxQ0UwMUQwMDFEMjAxRDQwMUQ2MDFEODAxREEwMURDMDFERDAxREYwMUUxMDFFMzAxRTUwMUU3MDFFOTAxRUIwMUVEMDFFRjAxRjAwMUYzMDFGNTAxRjkwMUZCMDFGRDAxRkYwMjAxMDIwMzAyMDUwMjA3MDIwOTAyMEIwMjBEMDIwRjAyMTEwMjEzMDIxNTAyMTcwMjE5MDIxQjAyMUQwMjFGMDIyMTAyMjMwMjI1MDIyNzAyMjkwMjJCMDIyRDAyMkYwMjMxMDIzMy0wMjM5MDIzQzAyM0YwMjQwMDI0MjAyNDcwMjQ5MDI0QjAyNEQwMjRGLTAyOTMwMjk1LTAyQUYwMzcxMDM3MzAzNzcwMzdCLTAzN0QwMzkwMDNBQy0wM0NFMDNEMDAzRDEwM0Q1LTAzRDcwM0Q5MDNEQjAzREQwM0RGMDNFMTAzRTMwM0U1MDNFNzAzRTkwM0VCMDNFRDAzRUYtMDNGMzAzRjUwM0Y4MDNGQjAzRkMwNDMwLTA0NUYwNDYxMDQ2MzA0NjUwNDY3MDQ2OTA0NkIwNDZEMDQ2RjA0NzEwNDczMDQ3NTA0NzcwNDc5MDQ3QjA0N0QwNDdGMDQ4MTA0OEIwNDhEMDQ4RjA0OTEwNDkzMDQ5NTA0OTcwNDk5MDQ5QjA0OUQwNDlGMDRBMTA0QTMwNEE1MDRBNzA0QTkwNEFCMDRBRDA0QUYwNEIxMDRCMzA0QjUwNEI3MDRCOTA0QkIwNEJEMDRCRjA0QzIwNEM0MDRDNjA0QzgwNENBMDRDQzA0Q0UwNENGMDREMTA0RDMwNEQ1MDRENzA0RDkwNERCMDRERDA0REYwNEUxMDRFMzA0RTUwNEU3MDRFOTA0RUIwNEVEMDRFRjA0RjEwNEYzMDRGNTA0RjcwNEY5MDRGQjA0RkQwNEZGMDUwMTA1MDMwNTA1MDUwNzA1MDkwNTBCMDUwRDA1MEYwNTExMDUxMzA1MTUwNTE3MDUxOTA1MUIwNTFEMDUxRjA1MjEwNTIzMDUyNTA1NjEtMDU4NzFEMDAtMUQyQjFENjItMUQ3NzFENzktMUQ5QTFFMDExRTAzMUUwNTFFMDcxRTA5MUUwQjFFMEQxRTBGMUUxMTFFMTMxRTE1MUUxNzFFMTkxRTFCMUUxRDFFMUYxRTIxMUUyMzFFMjUxRTI3MUUyOTFFMkIxRTJEMUUyRjFFMzExRTMzMUUzNTFFMzcxRTM5MUUzQjFFM0QxRTNGMUU0MTFFNDMxRTQ1MUU0NzFFNDkxRTRCMUU0RDFFNEYxRTUxMUU1MzFFNTUxRTU3MUU1OTFFNUIxRTVEMUU1RjFFNjExRTYzMUU2NTFFNjcxRTY5MUU2QjFFNkQxRTZGMUU3MTFFNzMxRTc1MUU3NzFFNzkxRTdCMUU3RDFFN0YxRTgxMUU4MzFFODUxRTg3MUU4OTFFOEIxRThEMUU4RjFFOTExRTkzMUU5NS0xRTlEMUU5RjFFQTExRUEzMUVBNTFFQTcxRUE5MUVBQjFFQUQxRUFGMUVCMTFFQjMxRUI1MUVCNzFFQjkxRUJCMUVCRDFFQkYxRUMxMUVDMzFFQzUxRUM3MUVDOTFFQ0IxRUNEMUVDRjFFRDExRUQzMUVENTFFRDcxRUQ5MUVEQjFFREQxRURGMUVFMTFFRTMxRUU1MUVFNzFFRTkxRUVCMUVFRDFFRUYxRUYxMUVGMzFFRjUxRUY3MUVGOTFFRkIxRUZEMUVGRi0xRjA3MUYxMC0xRjE1MUYyMC0xRjI3MUYzMC0xRjM3MUY0MC0xRjQ1MUY1MC0xRjU3MUY2MC0xRjY3MUY3MC0xRjdEMUY4MC0xRjg3MUY5MC0xRjk3MUZBMC0xRkE3MUZCMC0xRkI0MUZCNjFGQjcxRkJFMUZDMi0xRkM0MUZDNjFGQzcxRkQwLTFGRDMxRkQ2MUZENzFGRTAtMUZFNzFGRjItMUZGNDFGRjYxRkY3MjEwQTIxMEUyMTBGMjExMzIxMkYyMTM0MjEzOTIxM0MyMTNEMjE0Ni0yMTQ5MjE0RTIxODQyQzMwLTJDNUUyQzYxMkM2NTJDNjYyQzY4MkM2QTJDNkMyQzcxMkM3MzJDNzQyQzc2LTJDN0MyQzgxMkM4MzJDODUyQzg3MkM4OTJDOEIyQzhEMkM4RjJDOTEyQzkzMkM5NTJDOTcyQzk5MkM5QjJDOUQyQzlGMkNBMTJDQTMyQ0E1MkNBNzJDQTkyQ0FCMkNBRDJDQUYyQ0IxMkNCMzJDQjUyQ0I3MkNCOTJDQkIyQ0JEMkNCRjJDQzEyQ0MzMkNDNTJDQzcyQ0M5MkNDQjJDQ0QyQ0NGMkNEMTJDRDMyQ0Q1MkNENzJDRDkyQ0RCMkNERDJDREYyQ0UxMkNFMzJDRTQyQ0VDMkNFRTJEMDAtMkQyNUE2NDFBNjQzQTY0NUE2NDdBNjQ5QTY0QkE2NERBNjRGQTY1MUE2NTNBNjU1QTY1N0E2NTlBNjVCQTY1REE2NUZBNjYzQTY2NUE2NjdBNjY5QTY2QkE2NkRBNjgxQTY4M0E2ODVBNjg3QTY4OUE2OEJBNjhEQTY4RkE2OTFBNjkzQTY5NUE2OTdBNzIzQTcyNUE3MjdBNzI5QTcyQkE3MkRBNzJGLUE3MzFBNzMzQTczNUE3MzdBNzM5QTczQkE3M0RBNzNGQTc0MUE3NDNBNzQ1QTc0N0E3NDlBNzRCQTc0REE3NEZBNzUxQTc1M0E3NTVBNzU3QTc1OUE3NUJBNzVEQTc1RkE3NjFBNzYzQTc2NUE3NjdBNzY5QTc2QkE3NkRBNzZGQTc3MS1BNzc4QTc3QUE3N0NBNzdGQTc4MUE3ODNBNzg1QTc4N0E3OENGQjAwLUZCMDZGQjEzLUZCMTdGRjQxLUZGNUEiLEx1OiIwMDQxLTAwNUEwMEMwLTAwRDYwMEQ4LTAwREUwMTAwMDEwMjAxMDQwMTA2MDEwODAxMEEwMTBDMDEwRTAxMTAwMTEyMDExNDAxMTYwMTE4MDExQTAxMUMwMTFFMDEyMDAxMjIwMTI0MDEyNjAxMjgwMTJBMDEyQzAxMkUwMTMwMDEzMjAxMzQwMTM2MDEzOTAxM0IwMTNEMDEzRjAxNDEwMTQzMDE0NTAxNDcwMTRBMDE0QzAxNEUwMTUwMDE1MjAxNTQwMTU2MDE1ODAxNUEwMTVDMDE1RTAxNjAwMTYyMDE2NDAxNjYwMTY4MDE2QTAxNkMwMTZFMDE3MDAxNzIwMTc0MDE3NjAxNzgwMTc5MDE3QjAxN0QwMTgxMDE4MjAxODQwMTg2MDE4NzAxODktMDE4QjAxOEUtMDE5MTAxOTMwMTk0MDE5Ni0wMTk4MDE5QzAxOUQwMTlGMDFBMDAxQTIwMUE0MDFBNjAxQTcwMUE5MDFBQzAxQUUwMUFGMDFCMS0wMUIzMDFCNTAxQjcwMUI4MDFCQzAxQzQwMUM3MDFDQTAxQ0QwMUNGMDFEMTAxRDMwMUQ1MDFENzAxRDkwMURCMDFERTAxRTAwMUUyMDFFNDAxRTYwMUU4MDFFQTAxRUMwMUVFMDFGMTAxRjQwMUY2LTAxRjgwMUZBMDFGQzAxRkUwMjAwMDIwMjAyMDQwMjA2MDIwODAyMEEwMjBDMDIwRTAyMTAwMjEyMDIxNDAyMTYwMjE4MDIxQTAyMUMwMjFFMDIyMDAyMjIwMjI0MDIyNjAyMjgwMjJBMDIyQzAyMkUwMjMwMDIzMjAyM0EwMjNCMDIzRDAyM0UwMjQxMDI0My0wMjQ2MDI0ODAyNEEwMjRDMDI0RTAzNzAwMzcyMDM3NjAzODYwMzg4LTAzOEEwMzhDMDM4RTAzOEYwMzkxLTAzQTEwM0EzLTAzQUIwM0NGMDNEMi0wM0Q0MDNEODAzREEwM0RDMDNERTAzRTAwM0UyMDNFNDAzRTYwM0U4MDNFQTAzRUMwM0VFMDNGNDAzRjcwM0Y5MDNGQTAzRkQtMDQyRjA0NjAwNDYyMDQ2NDA0NjYwNDY4MDQ2QTA0NkMwNDZFMDQ3MDA0NzIwNDc0MDQ3NjA0NzgwNDdBMDQ3QzA0N0UwNDgwMDQ4QTA0OEMwNDhFMDQ5MDA0OTIwNDk0MDQ5NjA0OTgwNDlBMDQ5QzA0OUUwNEEwMDRBMjA0QTQwNEE2MDRBODA0QUEwNEFDMDRBRTA0QjAwNEIyMDRCNDA0QjYwNEI4MDRCQTA0QkMwNEJFMDRDMDA0QzEwNEMzMDRDNTA0QzcwNEM5MDRDQjA0Q0QwNEQwMDREMjA0RDQwNEQ2MDREODA0REEwNERDMDRERTA0RTAwNEUyMDRFNDA0RTYwNEU4MDRFQTA0RUMwNEVFMDRGMDA0RjIwNEY0MDRGNjA0RjgwNEZBMDRGQzA0RkUwNTAwMDUwMjA1MDQwNTA2MDUwODA1MEEwNTBDMDUwRTA1MTAwNTEyMDUxNDA1MTYwNTE4MDUxQTA1MUMwNTFFMDUyMDA1MjIwNTI0MDUzMS0wNTU2MTBBMC0xMEM1MUUwMDFFMDIxRTA0MUUwNjFFMDgxRTBBMUUwQzFFMEUxRTEwMUUxMjFFMTQxRTE2MUUxODFFMUExRTFDMUUxRTFFMjAxRTIyMUUyNDFFMjYxRTI4MUUyQTFFMkMxRTJFMUUzMDFFMzIxRTM0MUUzNjFFMzgxRTNBMUUzQzFFM0UxRTQwMUU0MjFFNDQxRTQ2MUU0ODFFNEExRTRDMUU0RTFFNTAxRTUyMUU1NDFFNTYxRTU4MUU1QTFFNUMxRTVFMUU2MDFFNjIxRTY0MUU2NjFFNjgxRTZBMUU2QzFFNkUxRTcwMUU3MjFFNzQxRTc2MUU3ODFFN0ExRTdDMUU3RTFFODAxRTgyMUU4NDFFODYxRTg4MUU4QTFFOEMxRThFMUU5MDFFOTIxRTk0MUU5RTFFQTAxRUEyMUVBNDFFQTYxRUE4MUVBQTFFQUMxRUFFMUVCMDFFQjIxRUI0MUVCNjFFQjgxRUJBMUVCQzFFQkUxRUMwMUVDMjFFQzQxRUM2MUVDODFFQ0ExRUNDMUVDRTFFRDAxRUQyMUVENDFFRDYxRUQ4MUVEQTFFREMxRURFMUVFMDFFRTIxRUU0MUVFNjFFRTgxRUVBMUVFQzFFRUUxRUYwMUVGMjFFRjQxRUY2MUVGODFFRkExRUZDMUVGRTFGMDgtMUYwRjFGMTgtMUYxRDFGMjgtMUYyRjFGMzgtMUYzRjFGNDgtMUY0RDFGNTkxRjVCMUY1RDFGNUYxRjY4LTFGNkYxRkI4LTFGQkIxRkM4LTFGQ0IxRkQ4LTFGREIxRkU4LTFGRUMxRkY4LTFGRkIyMTAyMjEwNzIxMEItMjEwRDIxMTAtMjExMjIxMTUyMTE5LTIxMUQyMTI0MjEyNjIxMjgyMTJBLTIxMkQyMTMwLTIxMzMyMTNFMjEzRjIxNDUyMTgzMkMwMC0yQzJFMkM2MDJDNjItMkM2NDJDNjcyQzY5MkM2QjJDNkQtMkM3MDJDNzIyQzc1MkM3RS0yQzgwMkM4MjJDODQyQzg2MkM4ODJDOEEyQzhDMkM4RTJDOTAyQzkyMkM5NDJDOTYyQzk4MkM5QTJDOUMyQzlFMkNBMDJDQTIyQ0E0MkNBNjJDQTgyQ0FBMkNBQzJDQUUyQ0IwMkNCMjJDQjQyQ0I2MkNCODJDQkEyQ0JDMkNCRTJDQzAyQ0MyMkNDNDJDQzYyQ0M4MkNDQTJDQ0MyQ0NFMkNEMDJDRDIyQ0Q0MkNENjJDRDgyQ0RBMkNEQzJDREUyQ0UwMkNFMjJDRUIyQ0VEQTY0MEE2NDJBNjQ0QTY0NkE2NDhBNjRBQTY0Q0E2NEVBNjUwQTY1MkE2NTRBNjU2QTY1OEE2NUFBNjVDQTY1RUE2NjJBNjY0QTY2NkE2NjhBNjZBQTY2Q0E2ODBBNjgyQTY4NEE2ODZBNjg4QTY4QUE2OENBNjhFQTY5MEE2OTJBNjk0QTY5NkE3MjJBNzI0QTcyNkE3MjhBNzJBQTcyQ0E3MkVBNzMyQTczNEE3MzZBNzM4QTczQUE3M0NBNzNFQTc0MEE3NDJBNzQ0QTc0NkE3NDhBNzRBQTc0Q0E3NEVBNzUwQTc1MkE3NTRBNzU2QTc1OEE3NUFBNzVDQTc1RUE3NjBBNzYyQTc2NEE3NjZBNzY4QTc2QUE3NkNBNzZFQTc3OUE3N0JBNzdEQTc3RUE3ODBBNzgyQTc4NEE3ODZBNzhCRkYyMS1GRjNBIixMdDoiMDFDNTAxQzgwMUNCMDFGMjFGODgtMUY4RjFGOTgtMUY5RjFGQTgtMUZBRjFGQkMxRkNDMUZGQyIsTG06IjAyQjAtMDJDMTAyQzYtMDJEMTAyRTAtMDJFNDAyRUMwMkVFMDM3NDAzN0EwNTU5MDY0MDA2RTUwNkU2MDdGNDA3RjUwN0ZBMDgxQTA4MjQwODI4MDk3MTBFNDYwRUM2MTBGQzE3RDcxODQzMUFBNzFDNzgtMUM3RDFEMkMtMUQ2MTFENzgxRDlCLTFEQkYyMDcxMjA3RjIwOTAtMjA5NDJDN0QyRDZGMkUyRjMwMDUzMDMxLTMwMzUzMDNCMzA5RDMwOUUzMEZDLTMwRkVBMDE1QTRGOC1BNEZEQTYwQ0E2N0ZBNzE3LUE3MUZBNzcwQTc4OEE5Q0ZBQTcwQUFEREZGNzBGRjlFRkY5RiIsTG86IjAxQkIwMUMwLTAxQzMwMjk0MDVEMC0wNUVBMDVGMC0wNUYyMDYyMS0wNjNGMDY0MS0wNjRBMDY2RTA2NkYwNjcxLTA2RDMwNkQ1MDZFRTA2RUYwNkZBLTA2RkMwNkZGMDcxMDA3MTItMDcyRjA3NEQtMDdBNTA3QjEwN0NBLTA3RUEwODAwLTA4MTUwOTA0LTA5MzkwOTNEMDk1MDA5NTgtMDk2MTA5NzIwOTc5LTA5N0YwOTg1LTA5OEMwOThGMDk5MDA5OTMtMDlBODA5QUEtMDlCMDA5QjIwOUI2LTA5QjkwOUJEMDlDRTA5REMwOUREMDlERi0wOUUxMDlGMDA5RjEwQTA1LTBBMEEwQTBGMEExMDBBMTMtMEEyODBBMkEtMEEzMDBBMzIwQTMzMEEzNTBBMzYwQTM4MEEzOTBBNTktMEE1QzBBNUUwQTcyLTBBNzQwQTg1LTBBOEQwQThGLTBBOTEwQTkzLTBBQTgwQUFBLTBBQjAwQUIyMEFCMzBBQjUtMEFCOTBBQkQwQUQwMEFFMDBBRTEwQjA1LTBCMEMwQjBGMEIxMDBCMTMtMEIyODBCMkEtMEIzMDBCMzIwQjMzMEIzNS0wQjM5MEIzRDBCNUMwQjVEMEI1Ri0wQjYxMEI3MTBCODMwQjg1LTBCOEEwQjhFLTBCOTAwQjkyLTBCOTUwQjk5MEI5QTBCOUMwQjlFMEI5RjBCQTMwQkE0MEJBOC0wQkFBMEJBRS0wQkI5MEJEMDBDMDUtMEMwQzBDMEUtMEMxMDBDMTItMEMyODBDMkEtMEMzMzBDMzUtMEMzOTBDM0QwQzU4MEM1OTBDNjAwQzYxMEM4NS0wQzhDMEM4RS0wQzkwMEM5Mi0wQ0E4MENBQS0wQ0IzMENCNS0wQ0I5MENCRDBDREUwQ0UwMENFMTBEMDUtMEQwQzBEMEUtMEQxMDBEMTItMEQyODBEMkEtMEQzOTBEM0QwRDYwMEQ2MTBEN0EtMEQ3RjBEODUtMEQ5NjBEOUEtMERCMTBEQjMtMERCQjBEQkQwREMwLTBEQzYwRTAxLTBFMzAwRTMyMEUzMzBFNDAtMEU0NTBFODEwRTgyMEU4NDBFODcwRTg4MEU4QTBFOEQwRTk0LTBFOTcwRTk5LTBFOUYwRUExLTBFQTMwRUE1MEVBNzBFQUEwRUFCMEVBRC0wRUIwMEVCMjBFQjMwRUJEMEVDMC0wRUM0MEVEQzBFREQwRjAwMEY0MC0wRjQ3MEY0OS0wRjZDMEY4OC0wRjhCMTAwMC0xMDJBMTAzRjEwNTAtMTA1NTEwNUEtMTA1RDEwNjExMDY1MTA2NjEwNkUtMTA3MDEwNzUtMTA4MTEwOEUxMEQwLTEwRkExMTAwLTEyNDgxMjRBLTEyNEQxMjUwLTEyNTYxMjU4MTI1QS0xMjVEMTI2MC0xMjg4MTI4QS0xMjhEMTI5MC0xMkIwMTJCMi0xMkI1MTJCOC0xMkJFMTJDMDEyQzItMTJDNTEyQzgtMTJENjEyRDgtMTMxMDEzMTItMTMxNTEzMTgtMTM1QTEzODAtMTM4RjEzQTAtMTNGNDE0MDEtMTY2QzE2NkYtMTY3RjE2ODEtMTY5QTE2QTAtMTZFQTE3MDAtMTcwQzE3MEUtMTcxMTE3MjAtMTczMTE3NDAtMTc1MTE3NjAtMTc2QzE3NkUtMTc3MDE3ODAtMTdCMzE3REMxODIwLTE4NDIxODQ0LTE4NzcxODgwLTE4QTgxOEFBMThCMC0xOEY1MTkwMC0xOTFDMTk1MC0xOTZEMTk3MC0xOTc0MTk4MC0xOUFCMTlDMS0xOUM3MUEwMC0xQTE2MUEyMC0xQTU0MUIwNS0xQjMzMUI0NS0xQjRCMUI4My0xQkEwMUJBRTFCQUYxQzAwLTFDMjMxQzRELTFDNEYxQzVBLTFDNzcxQ0U5LTFDRUMxQ0VFLTFDRjEyMTM1LTIxMzgyRDMwLTJENjUyRDgwLTJEOTYyREEwLTJEQTYyREE4LTJEQUUyREIwLTJEQjYyREI4LTJEQkUyREMwLTJEQzYyREM4LTJEQ0UyREQwLTJERDYyREQ4LTJEREUzMDA2MzAzQzMwNDEtMzA5NjMwOUYzMEExLTMwRkEzMEZGMzEwNS0zMTJEMzEzMS0zMThFMzFBMC0zMUI3MzFGMC0zMUZGMzQwMC00REI1NEUwMC05RkNCQTAwMC1BMDE0QTAxNi1BNDhDQTREMC1BNEY3QTUwMC1BNjBCQTYxMC1BNjFGQTYyQUE2MkJBNjZFQTZBMC1BNkU1QTdGQi1BODAxQTgwMy1BODA1QTgwNy1BODBBQTgwQy1BODIyQTg0MC1BODczQTg4Mi1BOEIzQThGMi1BOEY3QThGQkE5MEEtQTkyNUE5MzAtQTk0NkE5NjAtQTk3Q0E5ODQtQTlCMkFBMDAtQUEyOEFBNDAtQUE0MkFBNDQtQUE0QkFBNjAtQUE2RkFBNzEtQUE3NkFBN0FBQTgwLUFBQUZBQUIxQUFCNUFBQjZBQUI5LUFBQkRBQUMwQUFDMkFBREJBQURDQUJDMC1BQkUyQUMwMC1EN0EzRDdCMC1EN0M2RDdDQi1EN0ZCRjkwMC1GQTJERkEzMC1GQTZERkE3MC1GQUQ5RkIxREZCMUYtRkIyOEZCMkEtRkIzNkZCMzgtRkIzQ0ZCM0VGQjQwRkI0MUZCNDNGQjQ0RkI0Ni1GQkIxRkJEMy1GRDNERkQ1MC1GRDhGRkQ5Mi1GREM3RkRGMC1GREZCRkU3MC1GRTc0RkU3Ni1GRUZDRkY2Ni1GRjZGRkY3MS1GRjlERkZBMC1GRkJFRkZDMi1GRkM3RkZDQS1GRkNGRkZEMi1GRkQ3RkZEQS1GRkRDIixNOiIwMzAwLTAzNkYwNDgzLTA0ODkwNTkxLTA1QkQwNUJGMDVDMTA1QzIwNUM0MDVDNTA1QzcwNjEwLTA2MUEwNjRCLTA2NUUwNjcwMDZENi0wNkRDMDZERS0wNkU0MDZFNzA2RTgwNkVBLTA2RUQwNzExMDczMC0wNzRBMDdBNi0wN0IwMDdFQi0wN0YzMDgxNi0wODE5MDgxQi0wODIzMDgyNS0wODI3MDgyOS0wODJEMDkwMC0wOTAzMDkzQzA5M0UtMDk0RTA5NTEtMDk1NTA5NjIwOTYzMDk4MS0wOTgzMDlCQzA5QkUtMDlDNDA5QzcwOUM4MDlDQi0wOUNEMDlENzA5RTIwOUUzMEEwMS0wQTAzMEEzQzBBM0UtMEE0MjBBNDcwQTQ4MEE0Qi0wQTREMEE1MTBBNzAwQTcxMEE3NTBBODEtMEE4MzBBQkMwQUJFLTBBQzUwQUM3LTBBQzkwQUNCLTBBQ0QwQUUyMEFFMzBCMDEtMEIwMzBCM0MwQjNFLTBCNDQwQjQ3MEI0ODBCNEItMEI0RDBCNTYwQjU3MEI2MjBCNjMwQjgyMEJCRS0wQkMyMEJDNi0wQkM4MEJDQS0wQkNEMEJENzBDMDEtMEMwMzBDM0UtMEM0NDBDNDYtMEM0ODBDNEEtMEM0RDBDNTUwQzU2MEM2MjBDNjMwQzgyMEM4MzBDQkMwQ0JFLTBDQzQwQ0M2LTBDQzgwQ0NBLTBDQ0QwQ0Q1MENENjBDRTIwQ0UzMEQwMjBEMDMwRDNFLTBENDQwRDQ2LTBENDgwRDRBLTBENEQwRDU3MEQ2MjBENjMwRDgyMEQ4MzBEQ0EwRENGLTBERDQwREQ2MEREOC0wRERGMERGMjBERjMwRTMxMEUzNC0wRTNBMEU0Ny0wRTRFMEVCMTBFQjQtMEVCOTBFQkIwRUJDMEVDOC0wRUNEMEYxODBGMTkwRjM1MEYzNzBGMzkwRjNFMEYzRjBGNzEtMEY4NDBGODYwRjg3MEY5MC0wRjk3MEY5OS0wRkJDMEZDNjEwMkItMTAzRTEwNTYtMTA1OTEwNUUtMTA2MDEwNjItMTA2NDEwNjctMTA2RDEwNzEtMTA3NDEwODItMTA4RDEwOEYxMDlBLTEwOUQxMzVGMTcxMi0xNzE0MTczMi0xNzM0MTc1MjE3NTMxNzcyMTc3MzE3QjYtMTdEMzE3REQxODBCLTE4MEQxOEE5MTkyMC0xOTJCMTkzMC0xOTNCMTlCMC0xOUMwMTlDODE5QzkxQTE3LTFBMUIxQTU1LTFBNUUxQTYwLTFBN0MxQTdGMUIwMC0xQjA0MUIzNC0xQjQ0MUI2Qi0xQjczMUI4MC0xQjgyMUJBMS0xQkFBMUMyNC0xQzM3MUNEMC0xQ0QyMUNENC0xQ0U4MUNFRDFDRjIxREMwLTFERTYxREZELTFERkYyMEQwLTIwRjAyQ0VGLTJDRjEyREUwLTJERkYzMDJBLTMwMkYzMDk5MzA5QUE2NkYtQTY3MkE2N0NBNjdEQTZGMEE2RjFBODAyQTgwNkE4MEJBODIzLUE4MjdBODgwQTg4MUE4QjQtQThDNEE4RTAtQThGMUE5MjYtQTkyREE5NDctQTk1M0E5ODAtQTk4M0E5QjMtQTlDMEFBMjktQUEzNkFBNDNBQTRDQUE0REFBN0JBQUIwQUFCMi1BQUI0QUFCN0FBQjhBQUJFQUFCRkFBQzFBQkUzLUFCRUFBQkVDQUJFREZCMUVGRTAwLUZFMEZGRTIwLUZFMjYiLE1uOiIwMzAwLTAzNkYwNDgzLTA0ODcwNTkxLTA1QkQwNUJGMDVDMTA1QzIwNUM0MDVDNTA1QzcwNjEwLTA2MUEwNjRCLTA2NUUwNjcwMDZENi0wNkRDMDZERi0wNkU0MDZFNzA2RTgwNkVBLTA2RUQwNzExMDczMC0wNzRBMDdBNi0wN0IwMDdFQi0wN0YzMDgxNi0wODE5MDgxQi0wODIzMDgyNS0wODI3MDgyOS0wODJEMDkwMC0wOTAyMDkzQzA5NDEtMDk0ODA5NEQwOTUxLTA5NTUwOTYyMDk2MzA5ODEwOUJDMDlDMS0wOUM0MDlDRDA5RTIwOUUzMEEwMTBBMDIwQTNDMEE0MTBBNDIwQTQ3MEE0ODBBNEItMEE0RDBBNTEwQTcwMEE3MTBBNzUwQTgxMEE4MjBBQkMwQUMxLTBBQzUwQUM3MEFDODBBQ0QwQUUyMEFFMzBCMDEwQjNDMEIzRjBCNDEtMEI0NDBCNEQwQjU2MEI2MjBCNjMwQjgyMEJDMDBCQ0QwQzNFLTBDNDAwQzQ2LTBDNDgwQzRBLTBDNEQwQzU1MEM1NjBDNjIwQzYzMENCQzBDQkYwQ0M2MENDQzBDQ0QwQ0UyMENFMzBENDEtMEQ0NDBENEQwRDYyMEQ2MzBEQ0EwREQyLTBERDQwREQ2MEUzMTBFMzQtMEUzQTBFNDctMEU0RTBFQjEwRUI0LTBFQjkwRUJCMEVCQzBFQzgtMEVDRDBGMTgwRjE5MEYzNTBGMzcwRjM5MEY3MS0wRjdFMEY4MC0wRjg0MEY4NjBGODcwRjkwLTBGOTcwRjk5LTBGQkMwRkM2MTAyRC0xMDMwMTAzMi0xMDM3MTAzOTEwM0ExMDNEMTAzRTEwNTgxMDU5MTA1RS0xMDYwMTA3MS0xMDc0MTA4MjEwODUxMDg2MTA4RDEwOUQxMzVGMTcxMi0xNzE0MTczMi0xNzM0MTc1MjE3NTMxNzcyMTc3MzE3QjctMTdCRDE3QzYxN0M5LTE3RDMxN0REMTgwQi0xODBEMThBOTE5MjAtMTkyMjE5MjcxOTI4MTkzMjE5MzktMTkzQjFBMTcxQTE4MUE1NjFBNTgtMUE1RTFBNjAxQTYyMUE2NS0xQTZDMUE3My0xQTdDMUE3RjFCMDAtMUIwMzFCMzQxQjM2LTFCM0ExQjNDMUI0MjFCNkItMUI3MzFCODAxQjgxMUJBMi0xQkE1MUJBODFCQTkxQzJDLTFDMzMxQzM2MUMzNzFDRDAtMUNEMjFDRDQtMUNFMDFDRTItMUNFODFDRUQxREMwLTFERTYxREZELTFERkYyMEQwLTIwREMyMEUxMjBFNS0yMEYwMkNFRi0yQ0YxMkRFMC0yREZGMzAyQS0zMDJGMzA5OTMwOUFBNjZGQTY3Q0E2N0RBNkYwQTZGMUE4MDJBODA2QTgwQkE4MjVBODI2QThDNEE4RTAtQThGMUE5MjYtQTkyREE5NDctQTk1MUE5ODAtQTk4MkE5QjNBOUI2LUE5QjlBOUJDQUEyOS1BQTJFQUEzMUFBMzJBQTM1QUEzNkFBNDNBQTRDQUFCMEFBQjItQUFCNEFBQjdBQUI4QUFCRUFBQkZBQUMxQUJFNUFCRThBQkVERkIxRUZFMDAtRkUwRkZFMjAtRkUyNiIsTWM6IjA5MDMwOTNFLTA5NDAwOTQ5LTA5NEMwOTRFMDk4MjA5ODMwOUJFLTA5QzAwOUM3MDlDODA5Q0IwOUNDMDlENzBBMDMwQTNFLTBBNDAwQTgzMEFCRS0wQUMwMEFDOTBBQ0IwQUNDMEIwMjBCMDMwQjNFMEI0MDBCNDcwQjQ4MEI0QjBCNEMwQjU3MEJCRTBCQkYwQkMxMEJDMjBCQzYtMEJDODBCQ0EtMEJDQzBCRDcwQzAxLTBDMDMwQzQxLTBDNDQwQzgyMEM4MzBDQkUwQ0MwLTBDQzQwQ0M3MENDODBDQ0EwQ0NCMENENTBDRDYwRDAyMEQwMzBEM0UtMEQ0MDBENDYtMEQ0ODBENEEtMEQ0QzBENTcwRDgyMEQ4MzBEQ0YtMEREMTBERDgtMERERjBERjIwREYzMEYzRTBGM0YwRjdGMTAyQjEwMkMxMDMxMTAzODEwM0IxMDNDMTA1NjEwNTcxMDYyLTEwNjQxMDY3LTEwNkQxMDgzMTA4NDEwODctMTA4QzEwOEYxMDlBLTEwOUMxN0I2MTdCRS0xN0M1MTdDNzE3QzgxOTIzLTE5MjYxOTI5LTE5MkIxOTMwMTkzMTE5MzMtMTkzODE5QjAtMTlDMDE5QzgxOUM5MUExOS0xQTFCMUE1NTFBNTcxQTYxMUE2MzFBNjQxQTZELTFBNzIxQjA0MUIzNTFCM0IxQjNELTFCNDExQjQzMUI0NDFCODIxQkExMUJBNjFCQTcxQkFBMUMyNC0xQzJCMUMzNDFDMzUxQ0UxMUNGMkE4MjNBODI0QTgyN0E4ODBBODgxQThCNC1BOEMzQTk1MkE5NTNBOTgzQTlCNEE5QjVBOUJBQTlCQkE5QkQtQTlDMEFBMkZBQTMwQUEzM0FBMzRBQTREQUE3QkFCRTNBQkU0QUJFNkFCRTdBQkU5QUJFQUFCRUMiLE1lOiIwNDg4MDQ4OTA2REUyMERELTIwRTAyMEUyLTIwRTRBNjcwLUE2NzIiLE46IjAwMzAtMDAzOTAwQjIwMEIzMDBCOTAwQkMtMDBCRTA2NjAtMDY2OTA2RjAtMDZGOTA3QzAtMDdDOTA5NjYtMDk2RjA5RTYtMDlFRjA5RjQtMDlGOTBBNjYtMEE2RjBBRTYtMEFFRjBCNjYtMEI2RjBCRTYtMEJGMjBDNjYtMEM2RjBDNzgtMEM3RTBDRTYtMENFRjBENjYtMEQ3NTBFNTAtMEU1OTBFRDAtMEVEOTBGMjAtMEYzMzEwNDAtMTA0OTEwOTAtMTA5OTEzNjktMTM3QzE2RUUtMTZGMDE3RTAtMTdFOTE3RjAtMTdGOTE4MTAtMTgxOTE5NDYtMTk0RjE5RDAtMTlEQTFBODAtMUE4OTFBOTAtMUE5OTFCNTAtMUI1OTFCQjAtMUJCOTFDNDAtMUM0OTFDNTAtMUM1OTIwNzAyMDc0LTIwNzkyMDgwLTIwODkyMTUwLTIxODIyMTg1LTIxODkyNDYwLTI0OUIyNEVBLTI0RkYyNzc2LTI3OTMyQ0ZEMzAwNzMwMjEtMzAyOTMwMzgtMzAzQTMxOTItMzE5NTMyMjAtMzIyOTMyNTEtMzI1RjMyODAtMzI4OTMyQjEtMzJCRkE2MjAtQTYyOUE2RTYtQTZFRkE4MzAtQTgzNUE4RDAtQThEOUE5MDAtQTkwOUE5RDAtQTlEOUFBNTAtQUE1OUFCRjAtQUJGOUZGMTAtRkYxOSIsTmQ6IjAwMzAtMDAzOTA2NjAtMDY2OTA2RjAtMDZGOTA3QzAtMDdDOTA5NjYtMDk2RjA5RTYtMDlFRjBBNjYtMEE2RjBBRTYtMEFFRjBCNjYtMEI2RjBCRTYtMEJFRjBDNjYtMEM2RjBDRTYtMENFRjBENjYtMEQ2RjBFNTAtMEU1OTBFRDAtMEVEOTBGMjAtMEYyOTEwNDAtMTA0OTEwOTAtMTA5OTE3RTAtMTdFOTE4MTAtMTgxOTE5NDYtMTk0RjE5RDAtMTlEQTFBODAtMUE4OTFBOTAtMUE5OTFCNTAtMUI1OTFCQjAtMUJCOTFDNDAtMUM0OTFDNTAtMUM1OUE2MjAtQTYyOUE4RDAtQThEOUE5MDAtQTkwOUE5RDAtQTlEOUFBNTAtQUE1OUFCRjAtQUJGOUZGMTAtRkYxOSIsTmw6IjE2RUUtMTZGMDIxNjAtMjE4MjIxODUtMjE4ODMwMDczMDIxLTMwMjkzMDM4LTMwM0FBNkU2LUE2RUYiLE5vOiIwMEIyMDBCMzAwQjkwMEJDLTAwQkUwOUY0LTA5RjkwQkYwLTBCRjIwQzc4LTBDN0UwRDcwLTBENzUwRjJBLTBGMzMxMzY5LTEzN0MxN0YwLTE3RjkyMDcwMjA3NC0yMDc5MjA4MC0yMDg5MjE1MC0yMTVGMjE4OTI0NjAtMjQ5QjI0RUEtMjRGRjI3NzYtMjc5MzJDRkQzMTkyLTMxOTUzMjIwLTMyMjkzMjUxLTMyNUYzMjgwLTMyODkzMkIxLTMyQkZBODMwLUE4MzUiLFA6IjAwMjEtMDAyMzAwMjUtMDAyQTAwMkMtMDAyRjAwM0EwMDNCMDAzRjAwNDAwMDVCLTAwNUQwMDVGMDA3QjAwN0QwMEExMDBBQjAwQjcwMEJCMDBCRjAzN0UwMzg3MDU1QS0wNTVGMDU4OTA1OEEwNUJFMDVDMDA1QzMwNUM2MDVGMzA1RjQwNjA5MDYwQTA2MEMwNjBEMDYxQjA2MUUwNjFGMDY2QS0wNjZEMDZENDA3MDAtMDcwRDA3RjctMDdGOTA4MzAtMDgzRTA5NjQwOTY1MDk3MDBERjQwRTRGMEU1QTBFNUIwRjA0LTBGMTIwRjNBLTBGM0QwRjg1MEZEMC0wRkQ0MTA0QS0xMDRGMTBGQjEzNjEtMTM2ODE0MDAxNjZEMTY2RTE2OUIxNjlDMTZFQi0xNkVEMTczNTE3MzYxN0Q0LTE3RDYxN0Q4LTE3REExODAwLTE4MEExOTQ0MTk0NTE5REUxOURGMUExRTFBMUYxQUEwLTFBQTYxQUE4LTFBQUQxQjVBLTFCNjAxQzNCLTFDM0YxQzdFMUM3RjFDRDMyMDEwLTIwMjcyMDMwLTIwNDMyMDQ1LTIwNTEyMDUzLTIwNUUyMDdEMjA3RTIwOEQyMDhFMjMyOTIzMkEyNzY4LTI3NzUyN0M1MjdDNjI3RTYtMjdFRjI5ODMtMjk5ODI5RDgtMjlEQjI5RkMyOUZEMkNGOS0yQ0ZDMkNGRTJDRkYyRTAwLTJFMkUyRTMwMkUzMTMwMDEtMzAwMzMwMDgtMzAxMTMwMTQtMzAxRjMwMzAzMDNEMzBBMDMwRkJBNEZFQTRGRkE2MEQtQTYwRkE2NzNBNjdFQTZGMi1BNkY3QTg3NC1BODc3QThDRUE4Q0ZBOEY4LUE4RkFBOTJFQTkyRkE5NUZBOUMxLUE5Q0RBOURFQTlERkFBNUMtQUE1RkFBREVBQURGQUJFQkZEM0VGRDNGRkUxMC1GRTE5RkUzMC1GRTUyRkU1NC1GRTYxRkU2M0ZFNjhGRTZBRkU2QkZGMDEtRkYwM0ZGMDUtRkYwQUZGMEMtRkYwRkZGMUFGRjFCRkYxRkZGMjBGRjNCLUZGM0RGRjNGRkY1QkZGNURGRjVGLUZGNjUiLFBkOiIwMDJEMDU4QTA1QkUxNDAwMTgwNjIwMTAtMjAxNTJFMTcyRTFBMzAxQzMwMzAzMEEwRkUzMUZFMzJGRTU4RkU2M0ZGMEQiLFBzOiIwMDI4MDA1QjAwN0IwRjNBMEYzQzE2OUIyMDFBMjAxRTIwNDUyMDdEMjA4RDIzMjkyNzY4Mjc2QTI3NkMyNzZFMjc3MDI3NzIyNzc0MjdDNTI3RTYyN0U4MjdFQTI3RUMyN0VFMjk4MzI5ODUyOTg3Mjk4OTI5OEIyOThEMjk4RjI5OTEyOTkzMjk5NTI5OTcyOUQ4MjlEQTI5RkMyRTIyMkUyNDJFMjYyRTI4MzAwODMwMEEzMDBDMzAwRTMwMTAzMDE0MzAxNjMwMTgzMDFBMzAxREZEM0VGRTE3RkUzNUZFMzdGRTM5RkUzQkZFM0RGRTNGRkU0MUZFNDNGRTQ3RkU1OUZFNUJGRTVERkYwOEZGM0JGRjVCRkY1RkZGNjIiLFBlOiIwMDI5MDA1RDAwN0QwRjNCMEYzRDE2OUMyMDQ2MjA3RTIwOEUyMzJBMjc2OTI3NkIyNzZEMjc2RjI3NzEyNzczMjc3NTI3QzYyN0U3MjdFOTI3RUIyN0VEMjdFRjI5ODQyOTg2Mjk4ODI5OEEyOThDMjk4RTI5OTAyOTkyMjk5NDI5OTYyOTk4MjlEOTI5REIyOUZEMkUyMzJFMjUyRTI3MkUyOTMwMDkzMDBCMzAwRDMwMEYzMDExMzAxNTMwMTczMDE5MzAxQjMwMUUzMDFGRkQzRkZFMThGRTM2RkUzOEZFM0FGRTNDRkUzRUZFNDBGRTQyRkU0NEZFNDhGRTVBRkU1Q0ZFNUVGRjA5RkYzREZGNURGRjYwRkY2MyIsUGk6IjAwQUIyMDE4MjAxQjIwMUMyMDFGMjAzOTJFMDIyRTA0MkUwOTJFMEMyRTFDMkUyMCIsUGY6IjAwQkIyMDE5MjAxRDIwM0EyRTAzMkUwNTJFMEEyRTBEMkUxRDJFMjEiLFBjOiIwMDVGMjAzRjIwNDAyMDU0RkUzM0ZFMzRGRTRELUZFNEZGRjNGIixQbzoiMDAyMS0wMDIzMDAyNS0wMDI3MDAyQTAwMkMwMDJFMDAyRjAwM0EwMDNCMDAzRjAwNDAwMDVDMDBBMTAwQjcwMEJGMDM3RTAzODcwNTVBLTA1NUYwNTg5MDVDMDA1QzMwNUM2MDVGMzA1RjQwNjA5MDYwQTA2MEMwNjBEMDYxQjA2MUUwNjFGMDY2QS0wNjZEMDZENDA3MDAtMDcwRDA3RjctMDdGOTA4MzAtMDgzRTA5NjQwOTY1MDk3MDBERjQwRTRGMEU1QTBFNUIwRjA0LTBGMTIwRjg1MEZEMC0wRkQ0MTA0QS0xMDRGMTBGQjEzNjEtMTM2ODE2NkQxNjZFMTZFQi0xNkVEMTczNTE3MzYxN0Q0LTE3RDYxN0Q4LTE3REExODAwLTE4MDUxODA3LTE4MEExOTQ0MTk0NTE5REUxOURGMUExRTFBMUYxQUEwLTFBQTYxQUE4LTFBQUQxQjVBLTFCNjAxQzNCLTFDM0YxQzdFMUM3RjFDRDMyMDE2MjAxNzIwMjAtMjAyNzIwMzAtMjAzODIwM0ItMjAzRTIwNDEtMjA0MzIwNDctMjA1MTIwNTMyMDU1LTIwNUUyQ0Y5LTJDRkMyQ0ZFMkNGRjJFMDAyRTAxMkUwNi0yRTA4MkUwQjJFMEUtMkUxNjJFMTgyRTE5MkUxQjJFMUUyRTFGMkUyQS0yRTJFMkUzMDJFMzEzMDAxLTMwMDMzMDNEMzBGQkE0RkVBNEZGQTYwRC1BNjBGQTY3M0E2N0VBNkYyLUE2RjdBODc0LUE4NzdBOENFQThDRkE4RjgtQThGQUE5MkVBOTJGQTk1RkE5QzEtQTlDREE5REVBOURGQUE1Qy1BQTVGQUFERUFBREZBQkVCRkUxMC1GRTE2RkUxOUZFMzBGRTQ1RkU0NkZFNDktRkU0Q0ZFNTAtRkU1MkZFNTQtRkU1N0ZFNUYtRkU2MUZFNjhGRTZBRkU2QkZGMDEtRkYwM0ZGMDUtRkYwN0ZGMEFGRjBDRkYwRUZGMEZGRjFBRkYxQkZGMUZGRjIwRkYzQ0ZGNjFGRjY0RkY2NSIsUzoiMDAyNDAwMkIwMDNDLTAwM0UwMDVFMDA2MDAwN0MwMDdFMDBBMi0wMEE5MDBBQzAwQUUtMDBCMTAwQjQwMEI2MDBCODAwRDcwMEY3MDJDMi0wMkM1MDJEMi0wMkRGMDJFNS0wMkVCMDJFRDAyRUYtMDJGRjAzNzUwMzg0MDM4NTAzRjYwNDgyMDYwNi0wNjA4MDYwQjA2MEUwNjBGMDZFOTA2RkQwNkZFMDdGNjA5RjIwOUYzMDlGQTA5RkIwQUYxMEI3MDBCRjMtMEJGQTBDN0YwQ0YxMENGMjBENzkwRTNGMEYwMS0wRjAzMEYxMy0wRjE3MEYxQS0wRjFGMEYzNDBGMzYwRjM4MEZCRS0wRkM1MEZDNy0wRkNDMEZDRTBGQ0YwRkQ1LTBGRDgxMDlFMTA5RjEzNjAxMzkwLTEzOTkxN0RCMTk0MDE5RTAtMTlGRjFCNjEtMUI2QTFCNzQtMUI3QzFGQkQxRkJGLTFGQzExRkNELTFGQ0YxRkRELTFGREYxRkVELTFGRUYxRkZEMUZGRTIwNDQyMDUyMjA3QS0yMDdDMjA4QS0yMDhDMjBBMC0yMEI4MjEwMDIxMDEyMTAzLTIxMDYyMTA4MjEwOTIxMTQyMTE2LTIxMTgyMTFFLTIxMjMyMTI1MjEyNzIxMjkyMTJFMjEzQTIxM0IyMTQwLTIxNDQyMTRBLTIxNEQyMTRGMjE5MC0yMzI4MjMyQi0yM0U4MjQwMC0yNDI2MjQ0MC0yNDRBMjQ5Qy0yNEU5MjUwMC0yNkNEMjZDRi0yNkUxMjZFMzI2RTgtMjZGRjI3MDEtMjcwNDI3MDYtMjcwOTI3MEMtMjcyNzI3MjktMjc0QjI3NEQyNzRGLTI3NTIyNzU2LTI3NUUyNzYxLTI3NjcyNzk0Mjc5OC0yN0FGMjdCMS0yN0JFMjdDMC0yN0M0MjdDNy0yN0NBMjdDQzI3RDAtMjdFNTI3RjAtMjk4MjI5OTktMjlENzI5REMtMjlGQjI5RkUtMkI0QzJCNTAtMkI1OTJDRTUtMkNFQTJFODAtMkU5OTJFOUItMkVGMzJGMDAtMkZENTJGRjAtMkZGQjMwMDQzMDEyMzAxMzMwMjAzMDM2MzAzNzMwM0UzMDNGMzA5QjMwOUMzMTkwMzE5MTMxOTYtMzE5RjMxQzAtMzFFMzMyMDAtMzIxRTMyMkEtMzI1MDMyNjAtMzI3RjMyOEEtMzJCMDMyQzAtMzJGRTMzMDAtMzNGRjREQzAtNERGRkE0OTAtQTRDNkE3MDAtQTcxNkE3MjBBNzIxQTc4OUE3OEFBODI4LUE4MkJBODM2LUE4MzlBQTc3LUFBNzlGQjI5RkRGQ0ZERkRGRTYyRkU2NC1GRTY2RkU2OUZGMDRGRjBCRkYxQy1GRjFFRkYzRUZGNDBGRjVDRkY1RUZGRTAtRkZFNkZGRTgtRkZFRUZGRkNGRkZEIixTbToiMDAyQjAwM0MtMDAzRTAwN0MwMDdFMDBBQzAwQjEwMEQ3MDBGNzAzRjYwNjA2LTA2MDgyMDQ0MjA1MjIwN0EtMjA3QzIwOEEtMjA4QzIxNDAtMjE0NDIxNEIyMTkwLTIxOTQyMTlBMjE5QjIxQTAyMUEzMjFBNjIxQUUyMUNFMjFDRjIxRDIyMUQ0MjFGNC0yMkZGMjMwOC0yMzBCMjMyMDIzMjEyMzdDMjM5Qi0yM0IzMjNEQy0yM0UxMjVCNzI1QzEyNUY4LTI1RkYyNjZGMjdDMC0yN0M0MjdDNy0yN0NBMjdDQzI3RDAtMjdFNTI3RjAtMjdGRjI5MDAtMjk4MjI5OTktMjlENzI5REMtMjlGQjI5RkUtMkFGRjJCMzAtMkI0NDJCNDctMkI0Q0ZCMjlGRTYyRkU2NC1GRTY2RkYwQkZGMUMtRkYxRUZGNUNGRjVFRkZFMkZGRTktRkZFQyIsU2M6IjAwMjQwMEEyLTAwQTUwNjBCMDlGMjA5RjMwOUZCMEFGMTBCRjkwRTNGMTdEQjIwQTAtMjBCOEE4MzhGREZDRkU2OUZGMDRGRkUwRkZFMUZGRTVGRkU2IixTazoiMDA1RTAwNjAwMEE4MDBBRjAwQjQwMEI4MDJDMi0wMkM1MDJEMi0wMkRGMDJFNS0wMkVCMDJFRDAyRUYtMDJGRjAzNzUwMzg0MDM4NTFGQkQxRkJGLTFGQzExRkNELTFGQ0YxRkRELTFGREYxRkVELTFGRUYxRkZEMUZGRTMwOUIzMDlDQTcwMC1BNzE2QTcyMEE3MjFBNzg5QTc4QUZGM0VGRjQwRkZFMyIsU286IjAwQTYwMEE3MDBBOTAwQUUwMEIwMDBCNjA0ODIwNjBFMDYwRjA2RTkwNkZEMDZGRTA3RjYwOUZBMEI3MDBCRjMtMEJGODBCRkEwQzdGMENGMTBDRjIwRDc5MEYwMS0wRjAzMEYxMy0wRjE3MEYxQS0wRjFGMEYzNDBGMzYwRjM4MEZCRS0wRkM1MEZDNy0wRkNDMEZDRTBGQ0YwRkQ1LTBGRDgxMDlFMTA5RjEzNjAxMzkwLTEzOTkxOTQwMTlFMC0xOUZGMUI2MS0xQjZBMUI3NC0xQjdDMjEwMDIxMDEyMTAzLTIxMDYyMTA4MjEwOTIxMTQyMTE2LTIxMTgyMTFFLTIxMjMyMTI1MjEyNzIxMjkyMTJFMjEzQTIxM0IyMTRBMjE0QzIxNEQyMTRGMjE5NS0yMTk5MjE5Qy0yMTlGMjFBMTIxQTIyMUE0MjFBNTIxQTctMjFBRDIxQUYtMjFDRDIxRDAyMUQxMjFEMzIxRDUtMjFGMzIzMDAtMjMwNzIzMEMtMjMxRjIzMjItMjMyODIzMkItMjM3QjIzN0QtMjM5QTIzQjQtMjNEQjIzRTItMjNFODI0MDAtMjQyNjI0NDAtMjQ0QTI0OUMtMjRFOTI1MDAtMjVCNjI1QjgtMjVDMDI1QzItMjVGNzI2MDAtMjY2RTI2NzAtMjZDRDI2Q0YtMjZFMTI2RTMyNkU4LTI2RkYyNzAxLTI3MDQyNzA2LTI3MDkyNzBDLTI3MjcyNzI5LTI3NEIyNzREMjc0Ri0yNzUyMjc1Ni0yNzVFMjc2MS0yNzY3Mjc5NDI3OTgtMjdBRjI3QjEtMjdCRTI4MDAtMjhGRjJCMDAtMkIyRjJCNDUyQjQ2MkI1MC0yQjU5MkNFNS0yQ0VBMkU4MC0yRTk5MkU5Qi0yRUYzMkYwMC0yRkQ1MkZGMC0yRkZCMzAwNDMwMTIzMDEzMzAyMDMwMzYzMDM3MzAzRTMwM0YzMTkwMzE5MTMxOTYtMzE5RjMxQzAtMzFFMzMyMDAtMzIxRTMyMkEtMzI1MDMyNjAtMzI3RjMyOEEtMzJCMDMyQzAtMzJGRTMzMDAtMzNGRjREQzAtNERGRkE0OTAtQTRDNkE4MjgtQTgyQkE4MzZBODM3QTgzOUFBNzctQUE3OUZERkRGRkU0RkZFOEZGRURGRkVFRkZGQ0ZGRkQiLFo6IjAwMjAwMEEwMTY4MDE4MEUyMDAwLTIwMEEyMDI4MjAyOTIwMkYyMDVGMzAwMCIsWnM6IjAwMjAwMEEwMTY4MDE4MEUyMDAwLTIwMEEyMDJGMjA1RjMwMDAiLFpsOiIyMDI4IixacDoiMjAyOSIsQzoiMDAwMC0wMDFGMDA3Ri0wMDlGMDBBRDAzNzgwMzc5MDM3Ri0wMzgzMDM4QjAzOEQwM0EyMDUyNi0wNTMwMDU1NzA1NTgwNTYwMDU4ODA1OEItMDU5MDA1QzgtMDVDRjA1RUItMDVFRjA1RjUtMDYwNTA2MUMwNjFEMDYyMDA2NUYwNkREMDcwRTA3MEYwNzRCMDc0QzA3QjItMDdCRjA3RkItMDdGRjA4MkUwODJGMDgzRi0wOEZGMDkzQTA5M0IwOTRGMDk1NjA5NTcwOTczLTA5NzgwOTgwMDk4NDA5OEQwOThFMDk5MTA5OTIwOUE5MDlCMTA5QjMtMDlCNTA5QkEwOUJCMDlDNTA5QzYwOUM5MDlDQTA5Q0YtMDlENjA5RDgtMDlEQjA5REUwOUU0MDlFNTA5RkMtMEEwMDBBMDQwQTBCLTBBMEUwQTExMEExMjBBMjkwQTMxMEEzNDBBMzcwQTNBMEEzQjBBM0QwQTQzLTBBNDYwQTQ5MEE0QTBBNEUtMEE1MDBBNTItMEE1ODBBNUQwQTVGLTBBNjUwQTc2LTBBODAwQTg0MEE4RTBBOTIwQUE5MEFCMTBBQjQwQUJBMEFCQjBBQzYwQUNBMEFDRTBBQ0YwQUQxLTBBREYwQUU0MEFFNTBBRjAwQUYyLTBCMDAwQjA0MEIwRDBCMEUwQjExMEIxMjBCMjkwQjMxMEIzNDBCM0EwQjNCMEI0NTBCNDYwQjQ5MEI0QTBCNEUtMEI1NTBCNTgtMEI1QjBCNUUwQjY0MEI2NTBCNzItMEI4MTBCODQwQjhCLTBCOEQwQjkxMEI5Ni0wQjk4MEI5QjBCOUQwQkEwLTBCQTIwQkE1LTBCQTcwQkFCLTBCQUQwQkJBLTBCQkQwQkMzLTBCQzUwQkM5MEJDRTBCQ0YwQkQxLTBCRDYwQkQ4LTBCRTUwQkZCLTBDMDAwQzA0MEMwRDBDMTEwQzI5MEMzNDBDM0EtMEMzQzBDNDUwQzQ5MEM0RS0wQzU0MEM1NzBDNUEtMEM1RjBDNjQwQzY1MEM3MC0wQzc3MEM4MDBDODEwQzg0MEM4RDBDOTEwQ0E5MENCNDBDQkEwQ0JCMENDNTBDQzkwQ0NFLTBDRDQwQ0Q3LTBDREQwQ0RGMENFNDBDRTUwQ0YwMENGMy0wRDAxMEQwNDBEMEQwRDExMEQyOTBEM0EtMEQzQzBENDUwRDQ5MEQ0RS0wRDU2MEQ1OC0wRDVGMEQ2NDBENjUwRDc2LTBENzgwRDgwMEQ4MTBEODQwRDk3LTBEOTkwREIyMERCQzBEQkUwREJGMERDNy0wREM5MERDQi0wRENFMERENTBERDcwREUwLTBERjEwREY1LTBFMDAwRTNCLTBFM0UwRTVDLTBFODAwRTgzMEU4NTBFODYwRTg5MEU4QjBFOEMwRThFLTBFOTMwRTk4MEVBMDBFQTQwRUE2MEVBODBFQTkwRUFDMEVCQTBFQkUwRUJGMEVDNTBFQzcwRUNFMEVDRjBFREEwRURCMEVERS0wRUZGMEY0ODBGNkQtMEY3MDBGOEMtMEY4RjBGOTgwRkJEMEZDRDBGRDktMEZGRjEwQzYtMTBDRjEwRkQtMTBGRjEyNDkxMjRFMTI0RjEyNTcxMjU5MTI1RTEyNUYxMjg5MTI4RTEyOEYxMkIxMTJCNjEyQjcxMkJGMTJDMTEyQzYxMkM3MTJENzEzMTExMzE2MTMxNzEzNUItMTM1RTEzN0QtMTM3RjEzOUEtMTM5RjEzRjUtMTNGRjE2OUQtMTY5RjE2RjEtMTZGRjE3MEQxNzE1LTE3MUYxNzM3LTE3M0YxNzU0LTE3NUYxNzZEMTc3MTE3NzQtMTc3RjE3QjQxN0I1MTdERTE3REYxN0VBLTE3RUYxN0ZBLTE3RkYxODBGMTgxQS0xODFGMTg3OC0xODdGMThBQi0xOEFGMThGNi0xOEZGMTkxRC0xOTFGMTkyQy0xOTJGMTkzQy0xOTNGMTk0MS0xOTQzMTk2RTE5NkYxOTc1LTE5N0YxOUFDLTE5QUYxOUNBLTE5Q0YxOURCLTE5REQxQTFDMUExRDFBNUYxQTdEMUE3RTFBOEEtMUE4RjFBOUEtMUE5RjFBQUUtMUFGRjFCNEMtMUI0RjFCN0QtMUI3RjFCQUItMUJBRDFCQkEtMUJGRjFDMzgtMUMzQTFDNEEtMUM0QzFDODAtMUNDRjFDRjMtMUNGRjFERTctMURGQzFGMTYxRjE3MUYxRTFGMUYxRjQ2MUY0NzFGNEUxRjRGMUY1ODFGNUExRjVDMUY1RTFGN0UxRjdGMUZCNTFGQzUxRkQ0MUZENTFGREMxRkYwMUZGMTFGRjUxRkZGMjAwQi0yMDBGMjAyQS0yMDJFMjA2MC0yMDZGMjA3MjIwNzMyMDhGMjA5NS0yMDlGMjBCOS0yMENGMjBGMS0yMEZGMjE4QS0yMThGMjNFOS0yM0ZGMjQyNy0yNDNGMjQ0Qi0yNDVGMjZDRTI2RTIyNkU0LTI2RTcyNzAwMjcwNTI3MEEyNzBCMjcyODI3NEMyNzRFMjc1My0yNzU1Mjc1RjI3NjAyNzk1LTI3OTcyN0IwMjdCRjI3Q0IyN0NELTI3Q0YyQjRELTJCNEYyQjVBLTJCRkYyQzJGMkM1RjJDRjItMkNGODJEMjYtMkQyRjJENjYtMkQ2RTJENzAtMkQ3RjJEOTctMkQ5RjJEQTcyREFGMkRCNzJEQkYyREM3MkRDRjJERDcyRERGMkUzMi0yRTdGMkU5QTJFRjQtMkVGRjJGRDYtMkZFRjJGRkMtMkZGRjMwNDAzMDk3MzA5ODMxMDAtMzEwNDMxMkUtMzEzMDMxOEYzMUI4LTMxQkYzMUU0LTMxRUYzMjFGMzJGRjREQjYtNERCRjlGQ0MtOUZGRkE0OEQtQTQ4RkE0QzctQTRDRkE2MkMtQTYzRkE2NjBBNjYxQTY3NC1BNjdCQTY5OC1BNjlGQTZGOC1BNkZGQTc4RC1BN0ZBQTgyQy1BODJGQTgzQS1BODNGQTg3OC1BODdGQThDNS1BOENEQThEQS1BOERGQThGQy1BOEZGQTk1NC1BOTVFQTk3RC1BOTdGQTlDRUE5REEtQTlEREE5RTAtQTlGRkFBMzctQUEzRkFBNEVBQTRGQUE1QUFBNUJBQTdDLUFBN0ZBQUMzLUFBREFBQUUwLUFCQkZBQkVFQUJFRkFCRkEtQUJGRkQ3QTQtRDdBRkQ3QzctRDdDQUQ3RkMtRjhGRkZBMkVGQTJGRkE2RUZBNkZGQURBLUZBRkZGQjA3LUZCMTJGQjE4LUZCMUNGQjM3RkIzREZCM0ZGQjQyRkI0NUZCQjItRkJEMkZENDAtRkQ0RkZEOTBGRDkxRkRDOC1GREVGRkRGRUZERkZGRTFBLUZFMUZGRTI3LUZFMkZGRTUzRkU2N0ZFNkMtRkU2RkZFNzVGRUZELUZGMDBGRkJGLUZGQzFGRkM4RkZDOUZGRDBGRkQxRkZEOEZGRDlGRkRELUZGREZGRkU3RkZFRi1GRkZCRkZGRUZGRkYiLENjOiIwMDAwLTAwMUYwMDdGLTAwOUYiLENmOiIwMEFEMDYwMC0wNjAzMDZERDA3MEYxN0I0MTdCNTIwMEItMjAwRjIwMkEtMjAyRTIwNjAtMjA2NDIwNkEtMjA2RkZFRkZGRkY5LUZGRkIiLENvOiJFMDAwLUY4RkYiLENzOiJEODAwLURGRkYiLENuOiIwMzc4MDM3OTAzN0YtMDM4MzAzOEIwMzhEMDNBMjA1MjYtMDUzMDA1NTcwNTU4MDU2MDA1ODgwNThCLTA1OTAwNUM4LTA1Q0YwNUVCLTA1RUYwNUY1LTA1RkYwNjA0MDYwNTA2MUMwNjFEMDYyMDA2NUYwNzBFMDc0QjA3NEMwN0IyLTA3QkYwN0ZCLTA3RkYwODJFMDgyRjA4M0YtMDhGRjA5M0EwOTNCMDk0RjA5NTYwOTU3MDk3My0wOTc4MDk4MDA5ODQwOThEMDk4RTA5OTEwOTkyMDlBOTA5QjEwOUIzLTA5QjUwOUJBMDlCQjA5QzUwOUM2MDlDOTA5Q0EwOUNGLTA5RDYwOUQ4LTA5REIwOURFMDlFNDA5RTUwOUZDLTBBMDAwQTA0MEEwQi0wQTBFMEExMTBBMTIwQTI5MEEzMTBBMzQwQTM3MEEzQTBBM0IwQTNEMEE0My0wQTQ2MEE0OTBBNEEwQTRFLTBBNTAwQTUyLTBBNTgwQTVEMEE1Ri0wQTY1MEE3Ni0wQTgwMEE4NDBBOEUwQTkyMEFBOTBBQjEwQUI0MEFCQTBBQkIwQUM2MEFDQTBBQ0UwQUNGMEFEMS0wQURGMEFFNDBBRTUwQUYwMEFGMi0wQjAwMEIwNDBCMEQwQjBFMEIxMTBCMTIwQjI5MEIzMTBCMzQwQjNBMEIzQjBCNDUwQjQ2MEI0OTBCNEEwQjRFLTBCNTUwQjU4LTBCNUIwQjVFMEI2NDBCNjUwQjcyLTBCODEwQjg0MEI4Qi0wQjhEMEI5MTBCOTYtMEI5ODBCOUIwQjlEMEJBMC0wQkEyMEJBNS0wQkE3MEJBQi0wQkFEMEJCQS0wQkJEMEJDMy0wQkM1MEJDOTBCQ0UwQkNGMEJEMS0wQkQ2MEJEOC0wQkU1MEJGQi0wQzAwMEMwNDBDMEQwQzExMEMyOTBDMzQwQzNBLTBDM0MwQzQ1MEM0OTBDNEUtMEM1NDBDNTcwQzVBLTBDNUYwQzY0MEM2NTBDNzAtMEM3NzBDODAwQzgxMEM4NDBDOEQwQzkxMENBOTBDQjQwQ0JBMENCQjBDQzUwQ0M5MENDRS0wQ0Q0MENENy0wQ0REMENERjBDRTQwQ0U1MENGMDBDRjMtMEQwMTBEMDQwRDBEMEQxMTBEMjkwRDNBLTBEM0MwRDQ1MEQ0OTBENEUtMEQ1NjBENTgtMEQ1RjBENjQwRDY1MEQ3Ni0wRDc4MEQ4MDBEODEwRDg0MEQ5Ny0wRDk5MERCMjBEQkMwREJFMERCRjBEQzctMERDOTBEQ0ItMERDRTBERDUwREQ3MERFMC0wREYxMERGNS0wRTAwMEUzQi0wRTNFMEU1Qy0wRTgwMEU4MzBFODUwRTg2MEU4OTBFOEIwRThDMEU4RS0wRTkzMEU5ODBFQTAwRUE0MEVBNjBFQTgwRUE5MEVBQzBFQkEwRUJFMEVCRjBFQzUwRUM3MEVDRTBFQ0YwRURBMEVEQjBFREUtMEVGRjBGNDgwRjZELTBGNzAwRjhDLTBGOEYwRjk4MEZCRDBGQ0QwRkQ5LTBGRkYxMEM2LTEwQ0YxMEZELTEwRkYxMjQ5MTI0RTEyNEYxMjU3MTI1OTEyNUUxMjVGMTI4OTEyOEUxMjhGMTJCMTEyQjYxMkI3MTJCRjEyQzExMkM2MTJDNzEyRDcxMzExMTMxNjEzMTcxMzVCLTEzNUUxMzdELTEzN0YxMzlBLTEzOUYxM0Y1LTEzRkYxNjlELTE2OUYxNkYxLTE2RkYxNzBEMTcxNS0xNzFGMTczNy0xNzNGMTc1NC0xNzVGMTc2RDE3NzExNzc0LTE3N0YxN0RFMTdERjE3RUEtMTdFRjE3RkEtMTdGRjE4MEYxODFBLTE4MUYxODc4LTE4N0YxOEFCLTE4QUYxOEY2LTE4RkYxOTFELTE5MUYxOTJDLTE5MkYxOTNDLTE5M0YxOTQxLTE5NDMxOTZFMTk2RjE5NzUtMTk3RjE5QUMtMTlBRjE5Q0EtMTlDRjE5REItMTlERDFBMUMxQTFEMUE1RjFBN0QxQTdFMUE4QS0xQThGMUE5QS0xQTlGMUFBRS0xQUZGMUI0Qy0xQjRGMUI3RC0xQjdGMUJBQi0xQkFEMUJCQS0xQkZGMUMzOC0xQzNBMUM0QS0xQzRDMUM4MC0xQ0NGMUNGMy0xQ0ZGMURFNy0xREZDMUYxNjFGMTcxRjFFMUYxRjFGNDYxRjQ3MUY0RTFGNEYxRjU4MUY1QTFGNUMxRjVFMUY3RTFGN0YxRkI1MUZDNTFGRDQxRkQ1MUZEQzFGRjAxRkYxMUZGNTFGRkYyMDY1LTIwNjkyMDcyMjA3MzIwOEYyMDk1LTIwOUYyMEI5LTIwQ0YyMEYxLTIwRkYyMThBLTIxOEYyM0U5LTIzRkYyNDI3LTI0M0YyNDRCLTI0NUYyNkNFMjZFMjI2RTQtMjZFNzI3MDAyNzA1MjcwQTI3MEIyNzI4Mjc0QzI3NEUyNzUzLTI3NTUyNzVGMjc2MDI3OTUtMjc5NzI3QjAyN0JGMjdDQjI3Q0QtMjdDRjJCNEQtMkI0RjJCNUEtMkJGRjJDMkYyQzVGMkNGMi0yQ0Y4MkQyNi0yRDJGMkQ2Ni0yRDZFMkQ3MC0yRDdGMkQ5Ny0yRDlGMkRBNzJEQUYyREI3MkRCRjJEQzcyRENGMkRENzJEREYyRTMyLTJFN0YyRTlBMkVGNC0yRUZGMkZENi0yRkVGMkZGQy0yRkZGMzA0MDMwOTczMDk4MzEwMC0zMTA0MzEyRS0zMTMwMzE4RjMxQjgtMzFCRjMxRTQtMzFFRjMyMUYzMkZGNERCNi00REJGOUZDQy05RkZGQTQ4RC1BNDhGQTRDNy1BNENGQTYyQy1BNjNGQTY2MEE2NjFBNjc0LUE2N0JBNjk4LUE2OUZBNkY4LUE2RkZBNzhELUE3RkFBODJDLUE4MkZBODNBLUE4M0ZBODc4LUE4N0ZBOEM1LUE4Q0RBOERBLUE4REZBOEZDLUE4RkZBOTU0LUE5NUVBOTdELUE5N0ZBOUNFQTlEQS1BOUREQTlFMC1BOUZGQUEzNy1BQTNGQUE0RUFBNEZBQTVBQUE1QkFBN0MtQUE3RkFBQzMtQUFEQUFBRTAtQUJCRkFCRUVBQkVGQUJGQS1BQkZGRDdBNC1EN0FGRDdDNy1EN0NBRDdGQy1EN0ZGRkEyRUZBMkZGQTZFRkE2RkZBREEtRkFGRkZCMDctRkIxMkZCMTgtRkIxQ0ZCMzdGQjNERkIzRkZCNDJGQjQ1RkJCMi1GQkQyRkQ0MC1GRDRGRkQ5MEZEOTFGREM4LUZERUZGREZFRkRGRkZFMUEtRkUxRkZFMjctRkUyRkZFNTNGRTY3RkU2Qy1GRTZGRkU3NUZFRkRGRUZFRkYwMEZGQkYtRkZDMUZGQzhGRkM5RkZEMEZGRDFGRkQ4RkZEOUZGREQtRkZERkZGRTdGRkVGLUZGRjhGRkZFRkZGRiJ9KX0pLGRlZmluZSgiYWNlL2RvY3VtZW50IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiLCJhY2UvcmFuZ2UiLCJhY2UvYW5jaG9yIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuL2xpYi9vb3AiKSxlPWEoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsZj1hKCIuL3JhbmdlIikuUmFuZ2UsZz1hKCIuL2FuY2hvciIpLkFuY2hvcixoPWZ1bmN0aW9uKGEpe3RoaXMuJGxpbmVzPVtdLEFycmF5LmlzQXJyYXkoYSk/dGhpcy5pbnNlcnRMaW5lcygwLGEpOmEubGVuZ3RoPT0wP3RoaXMuJGxpbmVzPVsiIl06dGhpcy5pbnNlcnQoe3JvdzowLGNvbHVtbjowfSxhKX07KChmdW5jdGlvbigpe2QuaW1wbGVtZW50KHRoaXMsZSksdGhpcy5zZXRWYWx1ZT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldExlbmd0aCgpO3RoaXMucmVtb3ZlKG5ldyBmKDAsMCxiLHRoaXMuZ2V0TGluZShiLTEpLmxlbmd0aCkpLHRoaXMuaW5zZXJ0KHtyb3c6MCxjb2x1bW46MH0sYSl9LHRoaXMuZ2V0VmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRBbGxMaW5lcygpLmpvaW4odGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkpfSx0aGlzLmNyZWF0ZUFuY2hvcj1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgZyh0aGlzLGEsYil9LCJhYWEiLnNwbGl0KC9hLykubGVuZ3RoPT0wP3RoaXMuJHNwbGl0PWZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoL1xyXG58XHIvZywiXG4iKS5zcGxpdCgiXG4iKX06dGhpcy4kc3BsaXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc3BsaXQoL1xyXG58XHJ8XG4vKX0sdGhpcy4kZGV0ZWN0TmV3TGluZT1mdW5jdGlvbihhKXt2YXIgYj1hLm1hdGNoKC9eLio/KFxyXG58XHJ8XG4pL20pO2I/dGhpcy4kYXV0b05ld0xpbmU9YlsxXTp0aGlzLiRhdXRvTmV3TGluZT0iXG4ifSx0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXI9ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy4kbmV3TGluZU1vZGUpe2Nhc2Uid2luZG93cyI6cmV0dXJuIlxyXG4iO2Nhc2UidW5peCI6cmV0dXJuIlxuIjtjYXNlImF1dG8iOnJldHVybiB0aGlzLiRhdXRvTmV3TGluZX19LHRoaXMuJGF1dG9OZXdMaW5lPSJcbiIsdGhpcy4kbmV3TGluZU1vZGU9ImF1dG8iLHRoaXMuc2V0TmV3TGluZU1vZGU9ZnVuY3Rpb24oYSl7aWYodGhpcy4kbmV3TGluZU1vZGU9PT1hKXJldHVybjt0aGlzLiRuZXdMaW5lTW9kZT1hfSx0aGlzLmdldE5ld0xpbmVNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJG5ld0xpbmVNb2RlfSx0aGlzLmlzTmV3TGluZT1mdW5jdGlvbihhKXtyZXR1cm4gYT09IlxyXG4ifHxhPT0iXHIifHxhPT0iXG4ifSx0aGlzLmdldExpbmU9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuJGxpbmVzW2FdfHwiIn0sdGhpcy5nZXRMaW5lcz1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLiRsaW5lcy5zbGljZShhLGIrMSl9LHRoaXMuZ2V0QWxsTGluZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRMaW5lcygwLHRoaXMuZ2V0TGVuZ3RoKCkpfSx0aGlzLmdldExlbmd0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRsaW5lcy5sZW5ndGh9LHRoaXMuZ2V0VGV4dFJhbmdlPWZ1bmN0aW9uKGEpe2lmKGEuc3RhcnQucm93PT1hLmVuZC5yb3cpcmV0dXJuIHRoaXMuJGxpbmVzW2Euc3RhcnQucm93XS5zdWJzdHJpbmcoYS5zdGFydC5jb2x1bW4sYS5lbmQuY29sdW1uKTt2YXIgYj1bXTtyZXR1cm4gYi5wdXNoKHRoaXMuJGxpbmVzW2Euc3RhcnQucm93XS5zdWJzdHJpbmcoYS5zdGFydC5jb2x1bW4pKSxiLnB1c2guYXBwbHkoYix0aGlzLmdldExpbmVzKGEuc3RhcnQucm93KzEsYS5lbmQucm93LTEpKSxiLnB1c2godGhpcy4kbGluZXNbYS5lbmQucm93XS5zdWJzdHJpbmcoMCxhLmVuZC5jb2x1bW4pKSxiLmpvaW4odGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkpfSx0aGlzLiRjbGlwUG9zaXRpb249ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRMZW5ndGgoKTtyZXR1cm4gYS5yb3c+PWImJihhLnJvdz1NYXRoLm1heCgwLGItMSksYS5jb2x1bW49dGhpcy5nZXRMaW5lKGItMSkubGVuZ3RoKSxhfSx0aGlzLmluc2VydD1mdW5jdGlvbihhLGIpe2lmKGIubGVuZ3RoPT0wKXJldHVybiBhO2E9dGhpcy4kY2xpcFBvc2l0aW9uKGEpLHRoaXMuZ2V0TGVuZ3RoKCk8PTEmJnRoaXMuJGRldGVjdE5ld0xpbmUoYik7dmFyIGM9dGhpcy4kc3BsaXQoYiksZD1jLnNwbGljZSgwLDEpWzBdLGU9Yy5sZW5ndGg9PTA/bnVsbDpjLnNwbGljZShjLmxlbmd0aC0xLDEpWzBdO3JldHVybiBhPXRoaXMuaW5zZXJ0SW5MaW5lKGEsZCksZSE9PW51bGwmJihhPXRoaXMuaW5zZXJ0TmV3TGluZShhKSxhPXRoaXMuaW5zZXJ0TGluZXMoYS5yb3csYyksYT10aGlzLmluc2VydEluTGluZShhLGV8fCIiKSksYX0sdGhpcy5pbnNlcnRMaW5lcz1mdW5jdGlvbihhLGIpe2lmKGIubGVuZ3RoPT0wKXJldHVybntyb3c6YSxjb2x1bW46MH07dmFyIGM9W2EsMF07Yy5wdXNoLmFwcGx5KGMsYiksdGhpcy4kbGluZXMuc3BsaWNlLmFwcGx5KHRoaXMuJGxpbmVzLGMpO3ZhciBkPW5ldyBmKGEsMCxhK2IubGVuZ3RoLDApLGU9e2FjdGlvbjoiaW5zZXJ0TGluZXMiLHJhbmdlOmQsbGluZXM6Yn07cmV0dXJuIHRoaXMuX2VtaXQoImNoYW5nZSIse2RhdGE6ZX0pLGQuZW5kfSx0aGlzLmluc2VydE5ld0xpbmU9ZnVuY3Rpb24oYSl7YT10aGlzLiRjbGlwUG9zaXRpb24oYSk7dmFyIGI9dGhpcy4kbGluZXNbYS5yb3ddfHwiIjt0aGlzLiRsaW5lc1thLnJvd109Yi5zdWJzdHJpbmcoMCxhLmNvbHVtbiksdGhpcy4kbGluZXMuc3BsaWNlKGEucm93KzEsMCxiLnN1YnN0cmluZyhhLmNvbHVtbixiLmxlbmd0aCkpO3ZhciBjPXtyb3c6YS5yb3crMSxjb2x1bW46MH0sZD17YWN0aW9uOiJpbnNlcnRUZXh0IixyYW5nZTpmLmZyb21Qb2ludHMoYSxjKSx0ZXh0OnRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpfTtyZXR1cm4gdGhpcy5fZW1pdCgiY2hhbmdlIix7ZGF0YTpkfSksY30sdGhpcy5pbnNlcnRJbkxpbmU9ZnVuY3Rpb24oYSxiKXtpZihiLmxlbmd0aD09MClyZXR1cm4gYTt2YXIgYz10aGlzLiRsaW5lc1thLnJvd118fCIiO3RoaXMuJGxpbmVzW2Eucm93XT1jLnN1YnN0cmluZygwLGEuY29sdW1uKStiK2Muc3Vic3RyaW5nKGEuY29sdW1uKTt2YXIgZD17cm93OmEucm93LGNvbHVtbjphLmNvbHVtbitiLmxlbmd0aH0sZT17YWN0aW9uOiJpbnNlcnRUZXh0IixyYW5nZTpmLmZyb21Qb2ludHMoYSxkKSx0ZXh0OmJ9O3JldHVybiB0aGlzLl9lbWl0KCJjaGFuZ2UiLHtkYXRhOmV9KSxkfSx0aGlzLnJlbW92ZT1mdW5jdGlvbihhKXthLnN0YXJ0PXRoaXMuJGNsaXBQb3NpdGlvbihhLnN0YXJ0KSxhLmVuZD10aGlzLiRjbGlwUG9zaXRpb24oYS5lbmQpO2lmKGEuaXNFbXB0eSgpKXJldHVybiBhLnN0YXJ0O3ZhciBiPWEuc3RhcnQucm93LGM9YS5lbmQucm93O2lmKGEuaXNNdWx0aUxpbmUoKSl7dmFyIGQ9YS5zdGFydC5jb2x1bW49PTA/YjpiKzEsZT1jLTE7YS5lbmQuY29sdW1uPjAmJnRoaXMucmVtb3ZlSW5MaW5lKGMsMCxhLmVuZC5jb2x1bW4pLGU+PWQmJnRoaXMucmVtb3ZlTGluZXMoZCxlKSxkIT1iJiYodGhpcy5yZW1vdmVJbkxpbmUoYixhLnN0YXJ0LmNvbHVtbix0aGlzLmdldExpbmUoYikubGVuZ3RoKSx0aGlzLnJlbW92ZU5ld0xpbmUoYS5zdGFydC5yb3cpKX1lbHNlIHRoaXMucmVtb3ZlSW5MaW5lKGIsYS5zdGFydC5jb2x1bW4sYS5lbmQuY29sdW1uKTtyZXR1cm4gYS5zdGFydH0sdGhpcy5yZW1vdmVJbkxpbmU9ZnVuY3Rpb24oYSxiLGMpe2lmKGI9PWMpcmV0dXJuO3ZhciBkPW5ldyBmKGEsYixhLGMpLGU9dGhpcy5nZXRMaW5lKGEpLGc9ZS5zdWJzdHJpbmcoYixjKSxoPWUuc3Vic3RyaW5nKDAsYikrZS5zdWJzdHJpbmcoYyxlLmxlbmd0aCk7dGhpcy4kbGluZXMuc3BsaWNlKGEsMSxoKTt2YXIgaT17YWN0aW9uOiJyZW1vdmVUZXh0IixyYW5nZTpkLHRleHQ6Z307cmV0dXJuIHRoaXMuX2VtaXQoImNoYW5nZSIse2RhdGE6aX0pLGQuc3RhcnR9LHRoaXMucmVtb3ZlTGluZXM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgZihhLDAsYisxLDApLGQ9dGhpcy4kbGluZXMuc3BsaWNlKGEsYi1hKzEpLGU9e2FjdGlvbjoicmVtb3ZlTGluZXMiLHJhbmdlOmMsbmw6dGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCksbGluZXM6ZH07cmV0dXJuIHRoaXMuX2VtaXQoImNoYW5nZSIse2RhdGE6ZX0pLGR9LHRoaXMucmVtb3ZlTmV3TGluZT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldExpbmUoYSksYz10aGlzLmdldExpbmUoYSsxKSxkPW5ldyBmKGEsYi5sZW5ndGgsYSsxLDApLGU9YitjO3RoaXMuJGxpbmVzLnNwbGljZShhLDIsZSk7dmFyIGc9e2FjdGlvbjoicmVtb3ZlVGV4dCIscmFuZ2U6ZCx0ZXh0OnRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpfTt0aGlzLl9lbWl0KCJjaGFuZ2UiLHtkYXRhOmd9KX0sdGhpcy5yZXBsYWNlPWZ1bmN0aW9uKGEsYil7aWYoYi5sZW5ndGg9PTAmJmEuaXNFbXB0eSgpKXJldHVybiBhLnN0YXJ0O2lmKGI9PXRoaXMuZ2V0VGV4dFJhbmdlKGEpKXJldHVybiBhLmVuZDt0aGlzLnJlbW92ZShhKTtpZihiKXZhciBjPXRoaXMuaW5zZXJ0KGEuc3RhcnQsYik7ZWxzZSBjPWEuc3RhcnQ7cmV0dXJuIGN9LHRoaXMuYXBwbHlEZWx0YXM9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBjPWFbYl0sZD1mLmZyb21Qb2ludHMoYy5yYW5nZS5zdGFydCxjLnJhbmdlLmVuZCk7Yy5hY3Rpb249PSJpbnNlcnRMaW5lcyI/dGhpcy5pbnNlcnRMaW5lcyhkLnN0YXJ0LnJvdyxjLmxpbmVzKTpjLmFjdGlvbj09Imluc2VydFRleHQiP3RoaXMuaW5zZXJ0KGQuc3RhcnQsYy50ZXh0KTpjLmFjdGlvbj09InJlbW92ZUxpbmVzIj90aGlzLnJlbW92ZUxpbmVzKGQuc3RhcnQucm93LGQuZW5kLnJvdy0xKTpjLmFjdGlvbj09InJlbW92ZVRleHQiJiZ0aGlzLnJlbW92ZShkKX19LHRoaXMucmV2ZXJ0RGVsdGFzPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1hLmxlbmd0aC0xO2I+PTA7Yi0tKXt2YXIgYz1hW2JdLGQ9Zi5mcm9tUG9pbnRzKGMucmFuZ2Uuc3RhcnQsYy5yYW5nZS5lbmQpO2MuYWN0aW9uPT0iaW5zZXJ0TGluZXMiP3RoaXMucmVtb3ZlTGluZXMoZC5zdGFydC5yb3csZC5lbmQucm93LTEpOmMuYWN0aW9uPT0iaW5zZXJ0VGV4dCI/dGhpcy5yZW1vdmUoZCk6Yy5hY3Rpb249PSJyZW1vdmVMaW5lcyI/dGhpcy5pbnNlcnRMaW5lcyhkLnN0YXJ0LnJvdyxjLmxpbmVzKTpjLmFjdGlvbj09InJlbW92ZVRleHQiJiZ0aGlzLmluc2VydChkLnN0YXJ0LGMudGV4dCl9fX0pKS5jYWxsKGgucHJvdG90eXBlKSxiLkRvY3VtZW50PWh9KSxkZWZpbmUoImFjZS9hbmNob3IiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvZXZlbnRfZW1pdHRlciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi9saWIvb29wIiksZT1hKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLGY9Yi5BbmNob3I9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuZG9jdW1lbnQ9YSx0eXBlb2YgYz09InVuZGVmaW5lZCI/dGhpcy5zZXRQb3NpdGlvbihiLnJvdyxiLmNvbHVtbik6dGhpcy5zZXRQb3NpdGlvbihiLGMpLHRoaXMuJG9uQ2hhbmdlPXRoaXMub25DaGFuZ2UuYmluZCh0aGlzKSxhLm9uKCJjaGFuZ2UiLHRoaXMuJG9uQ2hhbmdlKX07KChmdW5jdGlvbigpe2QuaW1wbGVtZW50KHRoaXMsZSksdGhpcy5nZXRQb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50KHRoaXMucm93LHRoaXMuY29sdW1uKX0sdGhpcy5nZXREb2N1bWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvY3VtZW50fSx0aGlzLm9uQ2hhbmdlPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZGF0YSxjPWIucmFuZ2U7aWYoYy5zdGFydC5yb3c9PWMuZW5kLnJvdyYmYy5zdGFydC5yb3chPXRoaXMucm93KXJldHVybjtpZihjLnN0YXJ0LnJvdz50aGlzLnJvdylyZXR1cm47aWYoYy5zdGFydC5yb3c9PXRoaXMucm93JiZjLnN0YXJ0LmNvbHVtbj50aGlzLmNvbHVtbilyZXR1cm47dmFyIGQ9dGhpcy5yb3csZT10aGlzLmNvbHVtbjtiLmFjdGlvbj09PSJpbnNlcnRUZXh0Ij9jLnN0YXJ0LnJvdz09PWQmJmMuc3RhcnQuY29sdW1uPD1lP2Muc3RhcnQucm93PT09Yy5lbmQucm93P2UrPWMuZW5kLmNvbHVtbi1jLnN0YXJ0LmNvbHVtbjooZS09Yy5zdGFydC5jb2x1bW4sZCs9Yy5lbmQucm93LWMuc3RhcnQucm93KTpjLnN0YXJ0LnJvdyE9PWMuZW5kLnJvdyYmYy5zdGFydC5yb3c8ZCYmKGQrPWMuZW5kLnJvdy1jLnN0YXJ0LnJvdyk6Yi5hY3Rpb249PT0iaW5zZXJ0TGluZXMiP2Muc3RhcnQucm93PD1kJiYoZCs9Yy5lbmQucm93LWMuc3RhcnQucm93KTpiLmFjdGlvbj09InJlbW92ZVRleHQiP2Muc3RhcnQucm93PT1kJiZjLnN0YXJ0LmNvbHVtbjxlP2MuZW5kLmNvbHVtbj49ZT9lPWMuc3RhcnQuY29sdW1uOmU9TWF0aC5tYXgoMCxlLShjLmVuZC5jb2x1bW4tYy5zdGFydC5jb2x1bW4pKTpjLnN0YXJ0LnJvdyE9PWMuZW5kLnJvdyYmYy5zdGFydC5yb3c8ZD8oYy5lbmQucm93PT1kJiYoZT1NYXRoLm1heCgwLGUtYy5lbmQuY29sdW1uKStjLnN0YXJ0LmNvbHVtbiksZC09Yy5lbmQucm93LWMuc3RhcnQucm93KTpjLmVuZC5yb3c9PWQmJihkLT1jLmVuZC5yb3ctYy5zdGFydC5yb3csZT1NYXRoLm1heCgwLGUtYy5lbmQuY29sdW1uKStjLnN0YXJ0LmNvbHVtbik6Yi5hY3Rpb249PSJyZW1vdmVMaW5lcyImJmMuc3RhcnQucm93PD1kJiYoYy5lbmQucm93PD1kP2QtPWMuZW5kLnJvdy1jLnN0YXJ0LnJvdzooZD1jLnN0YXJ0LnJvdyxlPTApKSx0aGlzLnNldFBvc2l0aW9uKGQsZSwhMCl9LHRoaXMuc2V0UG9zaXRpb249ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2M/ZD17cm93OmEsY29sdW1uOmJ9OmQ9dGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudChhLGIpO2lmKHRoaXMucm93PT1kLnJvdyYmdGhpcy5jb2x1bW49PWQuY29sdW1uKXJldHVybjt2YXIgZT17cm93OnRoaXMucm93LGNvbHVtbjp0aGlzLmNvbHVtbn07dGhpcy5yb3c9ZC5yb3csdGhpcy5jb2x1bW49ZC5jb2x1bW4sdGhpcy5fZW1pdCgiY2hhbmdlIix7b2xkOmUsdmFsdWU6ZH0pfSx0aGlzLmRldGFjaD1mdW5jdGlvbigpe3RoaXMuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix0aGlzLiRvbkNoYW5nZSl9LHRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz17fTtyZXR1cm4gYT49dGhpcy5kb2N1bWVudC5nZXRMZW5ndGgoKT8oYy5yb3c9TWF0aC5tYXgoMCx0aGlzLmRvY3VtZW50LmdldExlbmd0aCgpLTEpLGMuY29sdW1uPXRoaXMuZG9jdW1lbnQuZ2V0TGluZShjLnJvdykubGVuZ3RoKTphPDA/KGMucm93PTAsYy5jb2x1bW49MCk6KGMucm93PWEsYy5jb2x1bW49TWF0aC5taW4odGhpcy5kb2N1bWVudC5nZXRMaW5lKGMucm93KS5sZW5ndGgsTWF0aC5tYXgoMCxiKSkpLGI8MCYmKGMuY29sdW1uPTApLGN9fSkpLmNhbGwoZi5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvYmFja2dyb3VuZF90b2tlbml6ZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvZXZlbnRfZW1pdHRlciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi9saWIvb29wIiksZT1hKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLGY9ZnVuY3Rpb24oYSxiKXt0aGlzLnJ1bm5pbmc9ITEsdGhpcy5saW5lcz1bXSx0aGlzLmN1cnJlbnRMaW5lPTAsdGhpcy50b2tlbml6ZXI9YTt2YXIgYz10aGlzO3RoaXMuJHdvcmtlcj1mdW5jdGlvbigpe2lmKCFjLnJ1bm5pbmcpcmV0dXJuO3ZhciBhPW5ldyBEYXRlLGI9Yy5jdXJyZW50TGluZSxkPWMuZG9jLGU9MCxmPWQuZ2V0TGVuZ3RoKCk7d2hpbGUoYy5jdXJyZW50TGluZTxmKXtjLmxpbmVzW2MuY3VycmVudExpbmVdPWMuJHRva2VuaXplUm93cyhjLmN1cnJlbnRMaW5lLGMuY3VycmVudExpbmUpWzBdLGMuY3VycmVudExpbmUrKyxlKz0xO2lmKGUlNT09MCYmbmV3IERhdGUtYT4yMCl7Yy5maXJlVXBkYXRlRXZlbnQoYixjLmN1cnJlbnRMaW5lLTEpLGMucnVubmluZz1zZXRUaW1lb3V0KGMuJHdvcmtlciwyMCk7cmV0dXJufX1jLnJ1bm5pbmc9ITEsYy5maXJlVXBkYXRlRXZlbnQoYixmLTEpfX07KChmdW5jdGlvbigpe2QuaW1wbGVtZW50KHRoaXMsZSksdGhpcy5zZXRUb2tlbml6ZXI9ZnVuY3Rpb24oYSl7dGhpcy50b2tlbml6ZXI9YSx0aGlzLmxpbmVzPVtdLHRoaXMuc3RhcnQoMCl9LHRoaXMuc2V0RG9jdW1lbnQ9ZnVuY3Rpb24oYSl7dGhpcy5kb2M9YSx0aGlzLmxpbmVzPVtdLHRoaXMuc3RvcCgpfSx0aGlzLmZpcmVVcGRhdGVFdmVudD1mdW5jdGlvbihhLGIpe3ZhciBjPXtmaXJzdDphLGxhc3Q6Yn07dGhpcy5fZW1pdCgidXBkYXRlIix7ZGF0YTpjfSl9LHRoaXMuc3RhcnQ9ZnVuY3Rpb24oYSl7dGhpcy5jdXJyZW50TGluZT1NYXRoLm1pbihhfHwwLHRoaXMuY3VycmVudExpbmUsdGhpcy5kb2MuZ2V0TGVuZ3RoKCkpLHRoaXMubGluZXMuc3BsaWNlKHRoaXMuY3VycmVudExpbmUsdGhpcy5saW5lcy5sZW5ndGgpLHRoaXMuc3RvcCgpLHRoaXMucnVubmluZz1zZXRUaW1lb3V0KHRoaXMuJHdvcmtlciw3MDApfSx0aGlzLnN0b3A9ZnVuY3Rpb24oKXt0aGlzLnJ1bm5pbmcmJmNsZWFyVGltZW91dCh0aGlzLnJ1bm5pbmcpLHRoaXMucnVubmluZz0hMX0sdGhpcy5nZXRUb2tlbnM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy4kdG9rZW5pemVSb3dzKGEsYil9LHRoaXMuZ2V0U3RhdGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuJHRva2VuaXplUm93cyhhLGEpWzBdLnN0YXRlfSx0aGlzLiR0b2tlbml6ZVJvd3M9ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5kb2N8fGlzTmFOKGEpfHxpc05hTihiKSlyZXR1cm5be3N0YXRlOiJzdGFydCIsdG9rZW5zOltdfV07dmFyIGM9W10sZD0ic3RhcnQiLGU9ITE7YT4wJiZ0aGlzLmxpbmVzW2EtMV0/KGQ9dGhpcy5saW5lc1thLTFdLnN0YXRlLGU9ITApOmE9PTA/KGQ9InN0YXJ0IixlPSEwKTp0aGlzLmxpbmVzLmxlbmd0aD4wJiYoZD10aGlzLmxpbmVzW3RoaXMubGluZXMubGVuZ3RoLTFdLnN0YXRlKTt2YXIgZj10aGlzLmRvYy5nZXRMaW5lcyhhLGIpO2Zvcih2YXIgZz1hO2c8PWI7ZysrKWlmKCF0aGlzLmxpbmVzW2ddKXt2YXIgaD10aGlzLnRva2VuaXplci5nZXRMaW5lVG9rZW5zKGZbZy1hXXx8IiIsZCksZD1oLnN0YXRlO2MucHVzaChoKSxlJiYodGhpcy5saW5lc1tnXT1oKX1lbHNle3ZhciBoPXRoaXMubGluZXNbZ107ZD1oLnN0YXRlLGMucHVzaChoKX1yZXR1cm4gY319KSkuY2FsbChmLnByb3RvdHlwZSksYi5CYWNrZ3JvdW5kVG9rZW5pemVyPWZ9KSxkZWZpbmUoImFjZS9lZGl0X3Nlc3Npb24vZm9sZGluZyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSIsImFjZS9lZGl0X3Nlc3Npb24vZm9sZF9saW5lIiwiYWNlL2VkaXRfc2Vzc2lvbi9mb2xkIiwiYWNlL3Rva2VuX2l0ZXJhdG9yIl0sZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGgoKXt0aGlzLmdldEZvbGRBdD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5nZXRGb2xkTGluZShhKTtpZighZClyZXR1cm4gbnVsbDt2YXIgZT1kLmZvbGRzO2Zvcih2YXIgZj0wO2Y8ZS5sZW5ndGg7ZisrKXt2YXIgZz1lW2ZdO2lmKGcucmFuZ2UuY29udGFpbnMoYSxiKSl7aWYoYz09MSYmZy5yYW5nZS5pc0VuZChhLGIpKWNvbnRpbnVlO2lmKGM9PS0xJiZnLnJhbmdlLmlzU3RhcnQoYSxiKSljb250aW51ZTtyZXR1cm4gZ319fSx0aGlzLmdldEZvbGRzSW5SYW5nZT1mdW5jdGlvbihhKXthPWEuY2xvbmUoKTt2YXIgYj1hLnN0YXJ0LGM9YS5lbmQsZD10aGlzLiRmb2xkRGF0YSxlPVtdO2IuY29sdW1uKz0xLGMuY29sdW1uLT0xO2Zvcih2YXIgZj0wO2Y8ZC5sZW5ndGg7ZisrKXt2YXIgZz1kW2ZdLnJhbmdlLmNvbXBhcmVSYW5nZShhKTtpZihnPT0yKWNvbnRpbnVlO2lmKGc9PS0yKWJyZWFrO3ZhciBoPWRbZl0uZm9sZHM7Zm9yKHZhciBpPTA7aTxoLmxlbmd0aDtpKyspe3ZhciBqPWhbaV07Zz1qLnJhbmdlLmNvbXBhcmVSYW5nZShhKTtpZihnPT0tMilicmVhaztpZihnPT0yKWNvbnRpbnVlO2lmKGc9PTQyKWJyZWFrO2UucHVzaChqKX19cmV0dXJuIGV9LHRoaXMuZ2V0QWxsRm9sZHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBjKGIpe2EucHVzaChiKTtpZighYi5zdWJGb2xkcylyZXR1cm47Zm9yKHZhciBkPTA7ZDxiLnN1YkZvbGRzLmxlbmd0aDtkKyspYyhiLnN1YkZvbGRzW2RdKX12YXIgYT1bXSxiPXRoaXMuJGZvbGREYXRhO2Zvcih2YXIgZD0wO2Q8Yi5sZW5ndGg7ZCsrKWZvcih2YXIgZT0wO2U8YltkXS5mb2xkcy5sZW5ndGg7ZSsrKWMoYltkXS5mb2xkc1tlXSk7cmV0dXJuIGF9LHRoaXMuZ2V0Rm9sZFN0cmluZ0F0PWZ1bmN0aW9uKGEsYixjLGQpe2Q9ZHx8dGhpcy5nZXRGb2xkTGluZShhKTtpZighZClyZXR1cm4gbnVsbDt2YXIgZT17ZW5kOntjb2x1bW46MH19LGYsZztmb3IodmFyIGg9MDtoPGQuZm9sZHMubGVuZ3RoO2grKyl7Zz1kLmZvbGRzW2hdO3ZhciBpPWcucmFuZ2UuY29tcGFyZUVuZChhLGIpO2lmKGk9PS0xKXtmPXRoaXMuZ2V0TGluZShnLnN0YXJ0LnJvdykuc3Vic3RyaW5nKGUuZW5kLmNvbHVtbixnLnN0YXJ0LmNvbHVtbik7YnJlYWt9aWYoaT09PTApcmV0dXJuIG51bGw7ZT1nfXJldHVybiBmfHwoZj10aGlzLmdldExpbmUoZy5zdGFydC5yb3cpLnN1YnN0cmluZyhlLmVuZC5jb2x1bW4pKSxjPT0tMT9mLnN1YnN0cmluZygwLGItZS5lbmQuY29sdW1uKTpjPT0xP2Yuc3Vic3RyaW5nKGItZS5lbmQuY29sdW1uKTpmfSx0aGlzLmdldEZvbGRMaW5lPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy4kZm9sZERhdGEsZD0wO2ImJihkPWMuaW5kZXhPZihiKSksZD09LTEmJihkPTApO2ZvcihkO2Q8Yy5sZW5ndGg7ZCsrKXt2YXIgZT1jW2RdO2lmKGUuc3RhcnQucm93PD1hJiZlLmVuZC5yb3c+PWEpcmV0dXJuIGU7aWYoZS5lbmQucm93PmEpcmV0dXJuIG51bGx9cmV0dXJuIG51bGx9LHRoaXMuZ2V0TmV4dEZvbGRMaW5lPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy4kZm9sZERhdGEsZD0wO2ImJihkPWMuaW5kZXhPZihiKSksZD09LTEmJihkPTApO2ZvcihkO2Q8Yy5sZW5ndGg7ZCsrKXt2YXIgZT1jW2RdO2lmKGUuZW5kLnJvdz49YSlyZXR1cm4gZX1yZXR1cm4gbnVsbH0sdGhpcy5nZXRGb2xkZWRSb3dDb3VudD1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuJGZvbGREYXRhLGQ9Yi1hKzE7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWNbZV0sZz1mLmVuZC5yb3csaD1mLnN0YXJ0LnJvdztpZihnPj1iKXtoPGImJihoPj1hP2QtPWItaDpkPTApO2JyZWFrfWc+PWEmJihoPj1hP2QtPWctaDpkLT1nLWErMSl9cmV0dXJuIGR9LHRoaXMuJGFkZEZvbGRMaW5lPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLiRmb2xkRGF0YS5wdXNoKGEpLHRoaXMuJGZvbGREYXRhLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5zdGFydC5yb3ctYi5zdGFydC5yb3d9KSxhfSx0aGlzLmFkZEZvbGQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLiRmb2xkRGF0YSxkPSExLGc7YSBpbnN0YW5jZW9mIGY/Zz1hOmc9bmV3IGYoYixhKSx0aGlzLiRjbGlwUmFuZ2VUb0RvY3VtZW50KGcucmFuZ2UpO3ZhciBoPWcuc3RhcnQucm93LGk9Zy5zdGFydC5jb2x1bW4saj1nLmVuZC5yb3csaz1nLmVuZC5jb2x1bW47aWYoZy5wbGFjZWhvbGRlci5sZW5ndGg8Mil0aHJvdyJQbGFjZWhvbGRlciBoYXMgdG8gYmUgYXQgbGVhc3QgMiBjaGFyYWN0ZXJzIjtpZihoPT1qJiZrLWk8Mil0aHJvdyJUaGUgcmFuZ2UgaGFzIHRvIGJlIGF0IGxlYXN0IDIgY2hhcmFjdGVycyB3aWR0aCI7dmFyIGw9dGhpcy5nZXRGb2xkQXQoaCxpLDEpLG09dGhpcy5nZXRGb2xkQXQoaixrLC0xKTtpZihsJiZtPT1sKXJldHVybiBsLmFkZFN1YkZvbGQoZyk7aWYobCYmIWwucmFuZ2UuaXNTdGFydChoLGkpfHxtJiYhbS5yYW5nZS5pc0VuZChqLGspKXRocm93IkEgZm9sZCBjYW4ndCBpbnRlcnNlY3QgYWxyZWFkeSBleGlzdGluZyBmb2xkIitnLnJhbmdlK2wucmFuZ2U7dmFyIG49dGhpcy5nZXRGb2xkc0luUmFuZ2UoZy5yYW5nZSk7bi5sZW5ndGg+MCYmKHRoaXMucmVtb3ZlRm9sZHMobiksZy5zdWJGb2xkcz1uKTtmb3IodmFyIG89MDtvPGMubGVuZ3RoO28rKyl7dmFyIHA9Y1tvXTtpZihqPT1wLnN0YXJ0LnJvdyl7cC5hZGRGb2xkKGcpLGQ9ITA7YnJlYWt9aWYoaD09cC5lbmQucm93KXtwLmFkZEZvbGQoZyksZD0hMDtpZighZy5zYW1lUm93KXt2YXIgcT1jW28rMV07aWYocSYmcS5zdGFydC5yb3c9PWope3AubWVyZ2UocSk7YnJlYWt9fWJyZWFrfWlmKGo8PXAuc3RhcnQucm93KWJyZWFrfXJldHVybiBkfHwocD10aGlzLiRhZGRGb2xkTGluZShuZXcgZSh0aGlzLiRmb2xkRGF0YSxnKSkpLHRoaXMuJHVzZVdyYXBNb2RlJiZ0aGlzLiR1cGRhdGVXcmFwRGF0YShwLnN0YXJ0LnJvdyxwLnN0YXJ0LnJvdyksdGhpcy4kbW9kaWZpZWQ9ITAsdGhpcy5fZW1pdCgiY2hhbmdlRm9sZCIse2RhdGE6Z30pLGd9LHRoaXMuYWRkRm9sZHM9ZnVuY3Rpb24oYSl7YS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3RoaXMuYWRkRm9sZChhKX0sdGhpcyl9LHRoaXMucmVtb3ZlRm9sZD1mdW5jdGlvbihhKXt2YXIgYj1hLmZvbGRMaW5lLGM9Yi5zdGFydC5yb3csZD1iLmVuZC5yb3csZT10aGlzLiRmb2xkRGF0YSxmPWIuZm9sZHM7aWYoZi5sZW5ndGg9PTEpZS5zcGxpY2UoZS5pbmRleE9mKGIpLDEpO2Vsc2UgaWYoYi5yYW5nZS5pc0VuZChhLmVuZC5yb3csYS5lbmQuY29sdW1uKSlmLnBvcCgpLGIuZW5kLnJvdz1mW2YubGVuZ3RoLTFdLmVuZC5yb3csYi5lbmQuY29sdW1uPWZbZi5sZW5ndGgtMV0uZW5kLmNvbHVtbjtlbHNlIGlmKGIucmFuZ2UuaXNTdGFydChhLnN0YXJ0LnJvdyxhLnN0YXJ0LmNvbHVtbikpZi5zaGlmdCgpLGIuc3RhcnQucm93PWZbMF0uc3RhcnQucm93LGIuc3RhcnQuY29sdW1uPWZbMF0uc3RhcnQuY29sdW1uO2Vsc2UgaWYoYS5zYW1lUm93KWYuc3BsaWNlKGYuaW5kZXhPZihhKSwxKTtlbHNle3ZhciBnPWIuc3BsaXQoYS5zdGFydC5yb3csYS5zdGFydC5jb2x1bW4pO2Y9Zy5mb2xkcyxmLnNoaWZ0KCksZy5zdGFydC5yb3c9ZlswXS5zdGFydC5yb3csZy5zdGFydC5jb2x1bW49ZlswXS5zdGFydC5jb2x1bW59dGhpcy4kdXNlV3JhcE1vZGUmJnRoaXMuJHVwZGF0ZVdyYXBEYXRhKGMsZCksdGhpcy4kbW9kaWZpZWQ9ITAsdGhpcy5fZW1pdCgiY2hhbmdlRm9sZCIse2RhdGE6YX0pfSx0aGlzLnJlbW92ZUZvbGRzPWZ1bmN0aW9uKGEpe3ZhciBiPVtdO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTtiLmZvckVhY2goZnVuY3Rpb24oYSl7dGhpcy5yZW1vdmVGb2xkKGEpfSx0aGlzKSx0aGlzLiRtb2RpZmllZD0hMH0sdGhpcy5leHBhbmRGb2xkPWZ1bmN0aW9uKGEpe3RoaXMucmVtb3ZlRm9sZChhKSxhLnN1YkZvbGRzLmZvckVhY2goZnVuY3Rpb24oYSl7dGhpcy5hZGRGb2xkKGEpfSx0aGlzKSxhLnN1YkZvbGRzPVtdfSx0aGlzLmV4cGFuZEZvbGRzPWZ1bmN0aW9uKGEpe2EuZm9yRWFjaChmdW5jdGlvbihhKXt0aGlzLmV4cGFuZEZvbGQoYSl9LHRoaXMpfSx0aGlzLnVuZm9sZD1mdW5jdGlvbihhLGIpe3ZhciBjLGU7YT09bnVsbD9jPW5ldyBkKDAsMCx0aGlzLmdldExlbmd0aCgpLDApOnR5cGVvZiBhPT0ibnVtYmVyIj9jPW5ldyBkKGEsMCxhLHRoaXMuZ2V0TGluZShhKS5sZW5ndGgpOiJyb3ciaW4gYT9jPWQuZnJvbVBvaW50cyhhLGEpOmM9YSxlPXRoaXMuZ2V0Rm9sZHNJblJhbmdlKGMpO2lmKGIpdGhpcy5yZW1vdmVGb2xkcyhlKTtlbHNlIHdoaWxlKGUubGVuZ3RoKXRoaXMuZXhwYW5kRm9sZHMoZSksZT10aGlzLmdldEZvbGRzSW5SYW5nZShjKX0sdGhpcy5pc1Jvd0ZvbGRlZD1mdW5jdGlvbihhLGIpe3JldHVybiEhdGhpcy5nZXRGb2xkTGluZShhLGIpfSx0aGlzLmdldFJvd0ZvbGRFbmQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmdldEZvbGRMaW5lKGEsYik7cmV0dXJuIGM/Yy5lbmQucm93OmF9LHRoaXMuZ2V0Rm9sZERpc3BsYXlMaW5lPWZ1bmN0aW9uKGEsYixjLGQsZSl7ZD09bnVsbCYmKGQ9YS5zdGFydC5yb3csZT0wKSxiPT1udWxsJiYoYj1hLmVuZC5yb3csYz10aGlzLmdldExpbmUoYikubGVuZ3RoKTt2YXIgZj10aGlzLmRvYyxnPSIiO3JldHVybiBhLndhbGsoZnVuY3Rpb24oYSxiLGMsaCl7aWYoYjxkKXJldHVybjtpZihiPT1kKXtpZihjPGUpcmV0dXJuO2g9TWF0aC5tYXgoZSxoKX1hP2crPWE6Zys9Zi5nZXRMaW5lKGIpLnN1YnN0cmluZyhoLGMpfS5iaW5kKHRoaXMpLGIsYyksZ30sdGhpcy5nZXREaXNwbGF5TGluZT1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT10aGlzLmdldEZvbGRMaW5lKGEpO2lmKCFlKXt2YXIgZjtyZXR1cm4gZj10aGlzLmRvYy5nZXRMaW5lKGEpLGYuc3Vic3RyaW5nKGR8fDAsYnx8Zi5sZW5ndGgpfXJldHVybiB0aGlzLmdldEZvbGREaXNwbGF5TGluZShlLGEsYixjLGQpfSx0aGlzLiRjbG9uZUZvbGREYXRhPWZ1bmN0aW9uKCl7dmFyIGE9W107cmV0dXJuIGE9dGhpcy4kZm9sZERhdGEubWFwKGZ1bmN0aW9uKGIpe3ZhciBjPWIuZm9sZHMubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhLmNsb25lKCl9KTtyZXR1cm4gbmV3IGUoYSxjKX0pLGF9LHRoaXMudG9nZ2xlRm9sZD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnNlbGVjdGlvbixjPWIuZ2V0UmFuZ2UoKSxkLGU7aWYoYy5pc0VtcHR5KCkpe3ZhciBmPWMuc3RhcnQ7ZD10aGlzLmdldEZvbGRBdChmLnJvdyxmLmNvbHVtbik7aWYoZCl7dGhpcy5leHBhbmRGb2xkKGQpO3JldHVybn0oZT10aGlzLmZpbmRNYXRjaGluZ0JyYWNrZXQoZikpP2MuY29tcGFyZVBvaW50KGUpPT0xP2MuZW5kPWU6KGMuc3RhcnQ9ZSxjLnN0YXJ0LmNvbHVtbisrLGMuZW5kLmNvbHVtbi0tKTooZT10aGlzLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzpmLnJvdyxjb2x1bW46Zi5jb2x1bW4rMX0pKT8oYy5jb21wYXJlUG9pbnQoZSk9PTE/Yy5lbmQ9ZTpjLnN0YXJ0PWUsYy5zdGFydC5jb2x1bW4rKyk6Yz10aGlzLmdldENvbW1lbnRGb2xkUmFuZ2UoZi5yb3csZi5jb2x1bW4pfHxjfWVsc2V7dmFyIGc9dGhpcy5nZXRGb2xkc0luUmFuZ2UoYyk7aWYoYSYmZy5sZW5ndGgpe3RoaXMuZXhwYW5kRm9sZHMoZyk7cmV0dXJufWcubGVuZ3RoPT0xJiYoZD1nWzBdKX1kfHwoZD10aGlzLmdldEZvbGRBdChjLnN0YXJ0LnJvdyxjLnN0YXJ0LmNvbHVtbikpO2lmKGQmJmQucmFuZ2UudG9TdHJpbmcoKT09Yy50b1N0cmluZygpKXt0aGlzLmV4cGFuZEZvbGQoZCk7cmV0dXJufXZhciBoPSIuLi4iO2lmKCFjLmlzTXVsdGlMaW5lKCkpe2g9dGhpcy5nZXRUZXh0UmFuZ2UoYyk7aWYoaC5sZW5ndGg8NClyZXR1cm47aD1oLnRyaW0oKS5zdWJzdHJpbmcoMCwyKSsiLi4ifXRoaXMuYWRkRm9sZChoLGMpfSx0aGlzLmdldENvbW1lbnRGb2xkUmFuZ2U9ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgZyh0aGlzLGEsYiksZT1jLmdldEN1cnJlbnRUb2tlbigpO2lmKGUmJi9eY29tbWVudHxzdHJpbmcvLnRlc3QoZS50eXBlKSl7dmFyIGY9bmV3IGQsaD1uZXcgUmVnRXhwKGUudHlwZS5yZXBsYWNlKC9cLi4qLywiXFwuIikpO2RvIGU9Yy5zdGVwQmFja3dhcmQoKTt3aGlsZShlJiZoLnRlc3QoZS50eXBlKSk7Yy5zdGVwRm9yd2FyZCgpLGYuc3RhcnQucm93PWMuZ2V0Q3VycmVudFRva2VuUm93KCksZi5zdGFydC5jb2x1bW49Yy5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKSsyLGM9bmV3IGcodGhpcyxhLGIpO2RvIGU9Yy5zdGVwRm9yd2FyZCgpO3doaWxlKGUmJmgudGVzdChlLnR5cGUpKTtyZXR1cm4gZT1jLnN0ZXBCYWNrd2FyZCgpLGYuZW5kLnJvdz1jLmdldEN1cnJlbnRUb2tlblJvdygpLGYuZW5kLmNvbHVtbj1jLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpK2UudmFsdWUubGVuZ3RoLGZ9fSx0aGlzLmZvbGRBbGw9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmZvbGRXaWRnZXRzO2I9Ynx8dGhpcy5nZXRMZW5ndGgoKTtmb3IodmFyIGQ9YXx8MDtkPGI7ZCsrKXtjW2RdPT1udWxsJiYoY1tkXT10aGlzLmdldEZvbGRXaWRnZXQoZCkpO2lmKGNbZF0hPSJzdGFydCIpY29udGludWU7dmFyIGU9dGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UoZCk7aWYoZSYmZS5lbmQucm93PGIpdHJ5e3RoaXMuYWRkRm9sZCgiLi4uIixlKX1jYXRjaChmKXt9fX0sdGhpcy4kZm9sZFN0eWxlcz17bWFudWFsOjEsbWFya2JlZ2luOjEsbWFya2JlZ2luZW5kOjF9LHRoaXMuJGZvbGRTdHlsZT0ibWFya2JlZ2luIix0aGlzLnNldEZvbGRTdHlsZT1mdW5jdGlvbihhKXtpZighdGhpcy4kZm9sZFN0eWxlc1thXSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZm9sZCBzdHlsZTogIithKyJbIitPYmplY3Qua2V5cyh0aGlzLiRmb2xkU3R5bGVzKS5qb2luKCIsICIpKyJdIik7aWYodGhpcy4kZm9sZFN0eWxlPT1hKXJldHVybjt0aGlzLiRmb2xkU3R5bGU9YSxhPT0ibWFudWFsIiYmdGhpcy51bmZvbGQoKTt2YXIgYj10aGlzLiRmb2xkTW9kZTt0aGlzLiRzZXRGb2xkaW5nKG51bGwpLHRoaXMuJHNldEZvbGRpbmcoYil9LHRoaXMuJHNldEZvbGRpbmc9ZnVuY3Rpb24oYSl7aWYodGhpcy4kZm9sZE1vZGU9PWEpcmV0dXJuO3RoaXMuJGZvbGRNb2RlPWEsdGhpcy5yZW1vdmVMaXN0ZW5lcigiY2hhbmdlIix0aGlzLiR1cGRhdGVGb2xkV2lkZ2V0cyksdGhpcy5fZW1pdCgiY2hhbmdlQW5ub3RhdGlvbiIpO2lmKCFhfHx0aGlzLiRmb2xkU3R5bGU9PSJtYW51YWwiKXt0aGlzLmZvbGRXaWRnZXRzPW51bGw7cmV0dXJufXRoaXMuZm9sZFdpZGdldHM9W10sdGhpcy5nZXRGb2xkV2lkZ2V0PWEuZ2V0Rm9sZFdpZGdldC5iaW5kKGEsdGhpcyx0aGlzLiRmb2xkU3R5bGUpLHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWEuZ2V0Rm9sZFdpZGdldFJhbmdlLmJpbmQoYSx0aGlzLHRoaXMuJGZvbGRTdHlsZSksdGhpcy4kdXBkYXRlRm9sZFdpZGdldHM9dGhpcy51cGRhdGVGb2xkV2lkZ2V0cy5iaW5kKHRoaXMpLHRoaXMub24oImNoYW5nZSIsdGhpcy4kdXBkYXRlRm9sZFdpZGdldHMpfSx0aGlzLm9uRm9sZFdpZGdldENsaWNrPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5nZXRGb2xkV2lkZ2V0KGEpLGQ9dGhpcy5nZXRMaW5lKGEpLGU9Yi5zaGlmdEtleSxmPWV8fGIuY3RybEtleXx8Yi5hbHRLZXl8fGIubWV0YUtleSxnO2M9PSJlbmQiP2c9dGhpcy5nZXRGb2xkQXQoYSwwLC0xKTpnPXRoaXMuZ2V0Rm9sZEF0KGEsZC5sZW5ndGgsMSk7aWYoZyl7Zj90aGlzLnJlbW92ZUZvbGQoZyk6dGhpcy5leHBhbmRGb2xkKGcpO3JldHVybn12YXIgaD10aGlzLmdldEZvbGRXaWRnZXRSYW5nZShhKTtpZihoKXtpZighaC5pc011bHRpTGluZSgpKXtnPXRoaXMuZ2V0Rm9sZEF0KGguc3RhcnQucm93LGguc3RhcnQuY29sdW1uLDEpO2lmKGcmJmguaXNFZXF1YWwoZy5yYW5nZSkpe3RoaXMucmVtb3ZlRm9sZChnKTtyZXR1cm59fWV8fHRoaXMuYWRkRm9sZCgiLi4uIixoKSxmJiZ0aGlzLmZvbGRBbGwoaC5zdGFydC5yb3crMSxoLmVuZC5yb3cpfWVsc2UgZiYmdGhpcy5mb2xkQWxsKGErMSx0aGlzLmdldExlbmd0aCgpKSxiLnRhcmdldC5jbGFzc05hbWUrPSIgaW52YWxpZCJ9LHRoaXMudXBkYXRlRm9sZFdpZGdldHM9ZnVuY3Rpb24oYSl7dmFyIGI9YS5kYXRhLGM9Yi5yYW5nZSxkPWMuc3RhcnQucm93LGU9Yy5lbmQucm93LWQ7aWYoZT09PTApdGhpcy5mb2xkV2lkZ2V0c1tkXT1udWxsO2Vsc2UgaWYoYi5hY3Rpb249PSJyZW1vdmVUZXh0Inx8Yi5hY3Rpb249PSJyZW1vdmVMaW5lcyIpdGhpcy5mb2xkV2lkZ2V0cy5zcGxpY2UoZCxlKzEsbnVsbCk7ZWxzZXt2YXIgZj1BcnJheShlKzEpO2YudW5zaGlmdChkLDEpLHRoaXMuZm9sZFdpZGdldHMuc3BsaWNlLmFwcGx5KHRoaXMuZm9sZFdpZGdldHMsZil9fX0idXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vcmFuZ2UiKS5SYW5nZSxlPWEoIi4vZm9sZF9saW5lIikuRm9sZExpbmUsZj1hKCIuL2ZvbGQiKS5Gb2xkLGc9YSgiLi4vdG9rZW5faXRlcmF0b3IiKS5Ub2tlbkl0ZXJhdG9yO2IuRm9sZGluZz1ofSksZGVmaW5lKCJhY2UvZWRpdF9zZXNzaW9uL2ZvbGRfbGluZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBlKGEsYil7dGhpcy5mb2xkRGF0YT1hLEFycmF5LmlzQXJyYXkoYik/dGhpcy5mb2xkcz1iOmI9dGhpcy5mb2xkcz1bYl07dmFyIGM9YltiLmxlbmd0aC0xXTt0aGlzLnJhbmdlPW5ldyBkKGJbMF0uc3RhcnQucm93LGJbMF0uc3RhcnQuY29sdW1uLGMuZW5kLnJvdyxjLmVuZC5jb2x1bW4pLHRoaXMuc3RhcnQ9dGhpcy5yYW5nZS5zdGFydCx0aGlzLmVuZD10aGlzLnJhbmdlLmVuZCx0aGlzLmZvbGRzLmZvckVhY2goZnVuY3Rpb24oYSl7YS5zZXRGb2xkTGluZSh0aGlzKX0sdGhpcyl9InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3JhbmdlIikuUmFuZ2U7KChmdW5jdGlvbigpe3RoaXMuc2hpZnRSb3c9ZnVuY3Rpb24oYSl7dGhpcy5zdGFydC5yb3crPWEsdGhpcy5lbmQucm93Kz1hLHRoaXMuZm9sZHMuZm9yRWFjaChmdW5jdGlvbihiKXtiLnN0YXJ0LnJvdys9YSxiLmVuZC5yb3crPWF9KX0sdGhpcy5hZGRGb2xkPWZ1bmN0aW9uKGEpe2lmKGEuc2FtZVJvdyl7aWYoYS5zdGFydC5yb3c8dGhpcy5zdGFydFJvd3x8YS5lbmRSb3c+dGhpcy5lbmRSb3cpdGhyb3ciQ2FuJ3QgYWRkIGEgZm9sZCB0byB0aGlzIEZvbGRMaW5lIGFzIGl0IGhhcyBubyBjb25uZWN0aW9uIjt0aGlzLmZvbGRzLnB1c2goYSksdGhpcy5mb2xkcy5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuLWEucmFuZ2UuY29tcGFyZUVuZChiLnN0YXJ0LnJvdyxiLnN0YXJ0LmNvbHVtbil9KSx0aGlzLnJhbmdlLmNvbXBhcmVFbmQoYS5zdGFydC5yb3csYS5zdGFydC5jb2x1bW4pPjA/KHRoaXMuZW5kLnJvdz1hLmVuZC5yb3csdGhpcy5lbmQuY29sdW1uPWEuZW5kLmNvbHVtbik6dGhpcy5yYW5nZS5jb21wYXJlU3RhcnQoYS5lbmQucm93LGEuZW5kLmNvbHVtbik8MCYmKHRoaXMuc3RhcnQucm93PWEuc3RhcnQucm93LHRoaXMuc3RhcnQuY29sdW1uPWEuc3RhcnQuY29sdW1uKX1lbHNlIGlmKGEuc3RhcnQucm93PT10aGlzLmVuZC5yb3cpdGhpcy5mb2xkcy5wdXNoKGEpLHRoaXMuZW5kLnJvdz1hLmVuZC5yb3csdGhpcy5lbmQuY29sdW1uPWEuZW5kLmNvbHVtbjtlbHNlIGlmKGEuZW5kLnJvdz09dGhpcy5zdGFydC5yb3cpdGhpcy5mb2xkcy51bnNoaWZ0KGEpLHRoaXMuc3RhcnQucm93PWEuc3RhcnQucm93LHRoaXMuc3RhcnQuY29sdW1uPWEuc3RhcnQuY29sdW1uO2Vsc2UgdGhyb3ciVHJ5aW5nIHRvIGFkZCBmb2xkIHRvIEZvbGRSb3cgdGhhdCBkb2Vzbid0IGhhdmUgYSBtYXRjaGluZyByb3ciO2EuZm9sZExpbmU9dGhpc30sdGhpcy5jb250YWluc1Jvdz1mdW5jdGlvbihhKXtyZXR1cm4gYT49dGhpcy5zdGFydC5yb3cmJmE8PXRoaXMuZW5kLnJvd30sdGhpcy53YWxrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD0wLGU9dGhpcy5mb2xkcyxmLGcsaCxpPSEwO2I9PW51bGwmJihiPXRoaXMuZW5kLnJvdyxjPXRoaXMuZW5kLmNvbHVtbik7Zm9yKHZhciBqPTA7ajxlLmxlbmd0aDtqKyspe2Y9ZVtqXSxnPWYucmFuZ2UuY29tcGFyZVN0YXJ0KGIsYyk7aWYoZz09LTEpe2EobnVsbCxiLGMsZCxpKTtyZXR1cm59aD1hKG51bGwsZi5zdGFydC5yb3csZi5zdGFydC5jb2x1bW4sZCxpKSxoPSFoJiZhKGYucGxhY2Vob2xkZXIsZi5zdGFydC5yb3csZi5zdGFydC5jb2x1bW4sZCk7aWYoaHx8Zz09MClyZXR1cm47aT0hZi5zYW1lUm93LGQ9Zi5lbmQuY29sdW1ufWEobnVsbCxiLGMsZCxpKX0sdGhpcy5nZXROZXh0Rm9sZFRvPWZ1bmN0aW9uKGEsYil7dmFyIGMsZDtmb3IodmFyIGU9MDtlPHRoaXMuZm9sZHMubGVuZ3RoO2UrKyl7Yz10aGlzLmZvbGRzW2VdLGQ9Yy5yYW5nZS5jb21wYXJlRW5kKGEsYik7aWYoZD09LTEpcmV0dXJue2ZvbGQ6YyxraW5kOiJhZnRlciJ9O2lmKGQ9PTApcmV0dXJue2ZvbGQ6YyxraW5kOiJpbnNpZGUifX1yZXR1cm4gbnVsbH0sdGhpcy5hZGRSZW1vdmVDaGFycz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5nZXROZXh0Rm9sZFRvKGEsYiksZSxmO2lmKGQpe2U9ZC5mb2xkO2lmKGQua2luZD09Imluc2lkZSImJmUuc3RhcnQuY29sdW1uIT1iJiZlLnN0YXJ0LnJvdyE9YSl0aHJvdyJNb3ZpbmcgY2hhcmFjdGVycyBpbnNpZGUgb2YgYSBmb2xkIHNob3VsZCBuZXZlciBiZSByZWFjaGVkIjtpZihlLnN0YXJ0LnJvdz09YSl7Zj10aGlzLmZvbGRzO3ZhciBnPWYuaW5kZXhPZihlKTtnPT0wJiYodGhpcy5zdGFydC5jb2x1bW4rPWMpO2ZvcihnO2c8Zi5sZW5ndGg7ZysrKXtlPWZbZ10sZS5zdGFydC5jb2x1bW4rPWM7aWYoIWUuc2FtZVJvdylyZXR1cm47ZS5lbmQuY29sdW1uKz1jfXRoaXMuZW5kLmNvbHVtbis9Y319fSx0aGlzLnNwbGl0PWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5nZXROZXh0Rm9sZFRvKGEsYikuZm9sZCxkPXRoaXMuZm9sZHMsZj10aGlzLmZvbGREYXRhO2lmKCFjKXJldHVybiBudWxsO3ZhciBnPWQuaW5kZXhPZihjKSxoPWRbZy0xXTt0aGlzLmVuZC5yb3c9aC5lbmQucm93LHRoaXMuZW5kLmNvbHVtbj1oLmVuZC5jb2x1bW4sZD1kLnNwbGljZShnLGQubGVuZ3RoLWcpO3ZhciBpPW5ldyBlKGYsZCk7cmV0dXJuIGYuc3BsaWNlKGYuaW5kZXhPZih0aGlzKSsxLDAsaSksaX0sdGhpcy5tZXJnZT1mdW5jdGlvbihhKXt2YXIgYj1hLmZvbGRzO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMuYWRkRm9sZChiW2NdKTt2YXIgZD10aGlzLmZvbGREYXRhO2Quc3BsaWNlKGQuaW5kZXhPZihhKSwxKX0sdGhpcy50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBhPVt0aGlzLnJhbmdlLnRvU3RyaW5nKCkrIjogWyJdO3JldHVybiB0aGlzLmZvbGRzLmZvckVhY2goZnVuY3Rpb24oYil7YS5wdXNoKCIgICIrYi50b1N0cmluZygpKX0pLGEucHVzaCgiXSIpLGEuam9pbigiXG4iKX0sdGhpcy5pZHhUb1Bvc2l0aW9uPWZ1bmN0aW9uKGEpe3ZhciBiPTAsYztmb3IodmFyIGQ9MDtkPHRoaXMuZm9sZHMubGVuZ3RoO2QrKyl7dmFyIGM9dGhpcy5mb2xkc1tkXTthLT1jLnN0YXJ0LmNvbHVtbi1iO2lmKGE8MClyZXR1cm57cm93OmMuc3RhcnQucm93LGNvbHVtbjpjLnN0YXJ0LmNvbHVtbithfTthLT1jLnBsYWNlaG9sZGVyLmxlbmd0aDtpZihhPDApcmV0dXJuIGMuc3RhcnQ7Yj1jLmVuZC5jb2x1bW59cmV0dXJue3Jvdzp0aGlzLmVuZC5yb3csY29sdW1uOnRoaXMuZW5kLmNvbHVtbithfX19KSkuY2FsbChlLnByb3RvdHlwZSksYi5Gb2xkTGluZT1lfSksZGVmaW5lKCJhY2UvZWRpdF9zZXNzaW9uL2ZvbGQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWIuRm9sZD1mdW5jdGlvbihhLGIpe3RoaXMuZm9sZExpbmU9bnVsbCx0aGlzLnBsYWNlaG9sZGVyPWIsdGhpcy5yYW5nZT1hLHRoaXMuc3RhcnQ9YS5zdGFydCx0aGlzLmVuZD1hLmVuZCx0aGlzLnNhbWVSb3c9YS5zdGFydC5yb3c9PWEuZW5kLnJvdyx0aGlzLnN1YkZvbGRzPVtdfTsoKGZ1bmN0aW9uKCl7dGhpcy50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiciJyt0aGlzLnBsYWNlaG9sZGVyKyciICcrdGhpcy5yYW5nZS50b1N0cmluZygpfSx0aGlzLnNldEZvbGRMaW5lPWZ1bmN0aW9uKGEpe3RoaXMuZm9sZExpbmU9YSx0aGlzLnN1YkZvbGRzLmZvckVhY2goZnVuY3Rpb24oYil7Yi5zZXRGb2xkTGluZShhKX0pfSx0aGlzLmNsb25lPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5yYW5nZS5jbG9uZSgpLGI9bmV3IGQoYSx0aGlzLnBsYWNlaG9sZGVyKTtyZXR1cm4gdGhpcy5zdWJGb2xkcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2Iuc3ViRm9sZHMucHVzaChhLmNsb25lKCkpfSksYn0sdGhpcy5hZGRTdWJGb2xkPWZ1bmN0aW9uKGEpe2lmKHRoaXMucmFuZ2UuaXNFZXF1YWwoYSkpcmV0dXJuIHRoaXM7aWYoIXRoaXMucmFuZ2UuY29udGFpbnNSYW5nZShhKSl0aHJvdyJBIGZvbGQgY2FuJ3QgaW50ZXJzZWN0IGFscmVhZHkgZXhpc3RpbmcgZm9sZCIrYS5yYW5nZSt0aGlzLnJhbmdlO3ZhciBiPWEucmFuZ2Uuc3RhcnQucm93LGM9YS5yYW5nZS5zdGFydC5jb2x1bW47Zm9yKHZhciBkPTAsZT0tMTtkPHRoaXMuc3ViRm9sZHMubGVuZ3RoO2QrKyl7ZT10aGlzLnN1YkZvbGRzW2RdLnJhbmdlLmNvbXBhcmUoYixjKTtpZihlIT0xKWJyZWFrfXZhciBmPXRoaXMuc3ViRm9sZHNbZF07aWYoZT09MClyZXR1cm4gZi5hZGRTdWJGb2xkKGEpO3ZhciBiPWEucmFuZ2UuZW5kLnJvdyxjPWEucmFuZ2UuZW5kLmNvbHVtbjtmb3IodmFyIGc9ZCxlPS0xO2c8dGhpcy5zdWJGb2xkcy5sZW5ndGg7ZysrKXtlPXRoaXMuc3ViRm9sZHNbZ10ucmFuZ2UuY29tcGFyZShiLGMpO2lmKGUhPTEpYnJlYWt9dmFyIGg9dGhpcy5zdWJGb2xkc1tnXTtpZihlPT0wKXRocm93IkEgZm9sZCBjYW4ndCBpbnRlcnNlY3QgYWxyZWFkeSBleGlzdGluZyBmb2xkIithLnJhbmdlK3RoaXMucmFuZ2U7dmFyIGk9dGhpcy5zdWJGb2xkcy5zcGxpY2UoZCxnLWQsYSk7cmV0dXJuIGEuc2V0Rm9sZExpbmUodGhpcy5mb2xkTGluZSksYX19KSkuY2FsbChkLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS90b2tlbl9pdGVyYXRvciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJHNlc3Npb249YSx0aGlzLiRyb3c9Yix0aGlzLiRyb3dUb2tlbnM9YS5nZXRUb2tlbnMoYixiKVswXS50b2tlbnM7dmFyIGQ9YS5nZXRUb2tlbkF0KGIsYyk7dGhpcy4kdG9rZW5JbmRleD1kP2QuaW5kZXg6LTF9OygoZnVuY3Rpb24oKXt0aGlzLnN0ZXBCYWNrd2FyZD1mdW5jdGlvbigpe3RoaXMuJHRva2VuSW5kZXgtPTE7d2hpbGUodGhpcy4kdG9rZW5JbmRleDwwKXt0aGlzLiRyb3ctPTE7aWYodGhpcy4kcm93PDApcmV0dXJuIHRoaXMuJHJvdz0wLG51bGw7dGhpcy4kcm93VG9rZW5zPXRoaXMuJHNlc3Npb24uZ2V0VG9rZW5zKHRoaXMuJHJvdyx0aGlzLiRyb3cpWzBdLnRva2Vucyx0aGlzLiR0b2tlbkluZGV4PXRoaXMuJHJvd1Rva2Vucy5sZW5ndGgtMX1yZXR1cm4gdGhpcy4kcm93VG9rZW5zW3RoaXMuJHRva2VuSW5kZXhdfSx0aGlzLnN0ZXBGb3J3YXJkPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kc2Vzc2lvbi5nZXRMZW5ndGgoKTt0aGlzLiR0b2tlbkluZGV4Kz0xO3doaWxlKHRoaXMuJHRva2VuSW5kZXg+PXRoaXMuJHJvd1Rva2Vucy5sZW5ndGgpe3RoaXMuJHJvdys9MTtpZih0aGlzLiRyb3c+PWEpcmV0dXJuIHRoaXMuJHJvdz1hLTEsbnVsbDt0aGlzLiRyb3dUb2tlbnM9dGhpcy4kc2Vzc2lvbi5nZXRUb2tlbnModGhpcy4kcm93LHRoaXMuJHJvdylbMF0udG9rZW5zLHRoaXMuJHRva2VuSW5kZXg9MH1yZXR1cm4gdGhpcy4kcm93VG9rZW5zW3RoaXMuJHRva2VuSW5kZXhdfSx0aGlzLmdldEN1cnJlbnRUb2tlbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRyb3dUb2tlbnNbdGhpcy4kdG9rZW5JbmRleF19LHRoaXMuZ2V0Q3VycmVudFRva2VuUm93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHJvd30sdGhpcy5nZXRDdXJyZW50VG9rZW5Db2x1bW49ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRyb3dUb2tlbnMsYj10aGlzLiR0b2tlbkluZGV4LGM9YVtiXS5zdGFydDtpZihjIT09dW5kZWZpbmVkKXJldHVybiBjO2M9MDt3aGlsZShiPjApYi09MSxjKz1hW2JdLnZhbHVlLmxlbmd0aDtyZXR1cm4gY319KSkuY2FsbChkLnByb3RvdHlwZSksYi5Ub2tlbkl0ZXJhdG9yPWR9KSxkZWZpbmUoImFjZS9lZGl0X3Nlc3Npb24vYnJhY2tldF9tYXRjaCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS90b2tlbl9pdGVyYXRvciJdLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBlKCl7dGhpcy5maW5kTWF0Y2hpbmdCcmFja2V0PWZ1bmN0aW9uKGEpe2lmKGEuY29sdW1uPT0wKXJldHVybiBudWxsO3ZhciBiPXRoaXMuZ2V0TGluZShhLnJvdykuY2hhckF0KGEuY29sdW1uLTEpO2lmKGI9PSIiKXJldHVybiBudWxsO3ZhciBjPWIubWF0Y2goLyhbXChcW1x7XSl8KFtcKVxdXH1dKS8pO3JldHVybiBjP2NbMV0/dGhpcy4kZmluZENsb3NpbmdCcmFja2V0KGNbMV0sYSk6dGhpcy4kZmluZE9wZW5pbmdCcmFja2V0KGNbMl0sYSk6bnVsbH0sdGhpcy4kYnJhY2tldHM9eyIpIjoiKCIsIigiOiIpIiwiXSI6IlsiLCJbIjoiXSIsInsiOiJ9IiwifSI6InsifSx0aGlzLiRmaW5kT3BlbmluZ0JyYWNrZXQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLiRicmFja2V0c1thXSxlPTEsZj1uZXcgZCh0aGlzLGIucm93LGIuY29sdW1uKSxnPWYuZ2V0Q3VycmVudFRva2VuKCk7aWYoIWcpcmV0dXJuIG51bGw7dmFyIGg9bmV3IFJlZ0V4cCgiKFxcLj8iK2cudHlwZS5yZXBsYWNlKCIuIiwifCIpLnJlcGxhY2UoInJwYXJlbiIsImxwYXJlbnxycGFyZW4iKSsiKSsiKSxpPWIuY29sdW1uLWYuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCktMixqPWcudmFsdWU7Zm9yKDs7KXt3aGlsZShpPj0wKXt2YXIgaz1qLmNoYXJBdChpKTtpZihrPT1jKXtlLT0xO2lmKGU9PTApcmV0dXJue3JvdzpmLmdldEN1cnJlbnRUb2tlblJvdygpLGNvbHVtbjppK2YuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCl9fWVsc2Ugaz09YSYmKGUrPTEpO2ktPTF9ZG8gZz1mLnN0ZXBCYWNrd2FyZCgpO3doaWxlKGcmJiFoLnRlc3QoZy50eXBlKSk7aWYoZz09bnVsbClicmVhaztqPWcudmFsdWUsaT1qLmxlbmd0aC0xfXJldHVybiBudWxsfSx0aGlzLiRmaW5kQ2xvc2luZ0JyYWNrZXQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLiRicmFja2V0c1thXSxlPTEsZj1uZXcgZCh0aGlzLGIucm93LGIuY29sdW1uKSxnPWYuZ2V0Q3VycmVudFRva2VuKCk7aWYoIWcpcmV0dXJuIG51bGw7dmFyIGg9bmV3IFJlZ0V4cCgiKFxcLj8iK2cudHlwZS5yZXBsYWNlKCIuIiwifCIpLnJlcGxhY2UoImxwYXJlbiIsImxwYXJlbnxycGFyZW4iKSsiKSsiKSxpPWIuY29sdW1uLWYuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCk7Zm9yKDs7KXt2YXIgaj1nLnZhbHVlLGs9ai5sZW5ndGg7d2hpbGUoaTxrKXt2YXIgbD1qLmNoYXJBdChpKTtpZihsPT1jKXtlLT0xO2lmKGU9PTApcmV0dXJue3JvdzpmLmdldEN1cnJlbnRUb2tlblJvdygpLGNvbHVtbjppK2YuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCl9fWVsc2UgbD09YSYmKGUrPTEpO2krPTF9ZG8gZz1mLnN0ZXBGb3J3YXJkKCk7d2hpbGUoZyYmIWgudGVzdChnLnR5cGUpKTtpZihnPT1udWxsKWJyZWFrO2k9MH1yZXR1cm4gbnVsbH19InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3Rva2VuX2l0ZXJhdG9yIikuVG9rZW5JdGVyYXRvcjtiLkJyYWNrZXRNYXRjaD1lfSksZGVmaW5lKCJhY2Uvc2VhcmNoIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9sYW5nIiwiYWNlL2xpYi9vb3AiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4vbGliL2xhbmciKSxlPWEoIi4vbGliL29vcCIpLGY9YSgiLi9yYW5nZSIpLlJhbmdlLGc9ZnVuY3Rpb24oKXt0aGlzLiRvcHRpb25zPXtuZWVkbGU6IiIsYmFja3dhcmRzOiExLHdyYXA6ITEsY2FzZVNlbnNpdGl2ZTohMSx3aG9sZVdvcmQ6ITEsc2NvcGU6Zy5BTEwscmVnRXhwOiExfX07Zy5BTEw9MSxnLlNFTEVDVElPTj0yLGZ1bmN0aW9uKCl7dGhpcy5zZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGUubWl4aW4odGhpcy4kb3B0aW9ucyxhKSx0aGlzfSx0aGlzLmdldE9wdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gZC5jb3B5T2JqZWN0KHRoaXMuJG9wdGlvbnMpfSx0aGlzLmZpbmQ9ZnVuY3Rpb24oYSl7aWYoIXRoaXMuJG9wdGlvbnMubmVlZGxlKXJldHVybiBudWxsO2lmKHRoaXMuJG9wdGlvbnMuYmFja3dhcmRzKXZhciBiPXRoaXMuJGJhY2t3YXJkTWF0Y2hJdGVyYXRvcihhKTtlbHNlIGI9dGhpcy4kZm9yd2FyZE1hdGNoSXRlcmF0b3IoYSk7dmFyIGM9bnVsbDtyZXR1cm4gYi5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JldHVybiBjPWEsITB9KSxjfSx0aGlzLmZpbmRBbGw9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy4kb3B0aW9ucztpZighYi5uZWVkbGUpcmV0dXJuW107aWYoYi5iYWNrd2FyZHMpdmFyIGM9dGhpcy4kYmFja3dhcmRNYXRjaEl0ZXJhdG9yKGEpO2Vsc2UgYz10aGlzLiRmb3J3YXJkTWF0Y2hJdGVyYXRvcihhKTt2YXIgZD0hYi5zdGFydCYmYi53cmFwJiZiLnNjb3BlPT1nLkFMTDtkJiYoYi5zdGFydD17cm93OjAsY29sdW1uOjB9KTt2YXIgZT1bXTtyZXR1cm4gYy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2UucHVzaChhKX0pLGQmJihiLnN0YXJ0PW51bGwpLGV9LHRoaXMucmVwbGFjZT1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuJGFzc2VtYmxlUmVnRXhwKCksZD1jLmV4ZWMoYSk7cmV0dXJuIGQmJmRbMF0ubGVuZ3RoPT1hLmxlbmd0aD90aGlzLiRvcHRpb25zLnJlZ0V4cD9hLnJlcGxhY2UoYyxiKTpiOm51bGx9LHRoaXMuJGZvcndhcmRNYXRjaEl0ZXJhdG9yPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuJGFzc2VtYmxlUmVnRXhwKCksYz10aGlzO3JldHVybntmb3JFYWNoOmZ1bmN0aW9uKGQpe2MuJGZvcndhcmRMaW5lSXRlcmF0b3IoYSkuZm9yRWFjaChmdW5jdGlvbihhLGUsZil7ZSYmKGE9YS5zdWJzdHJpbmcoZSkpO3ZhciBnPVtdO2EucmVwbGFjZShiLGZ1bmN0aW9uKGEpe3ZhciBiPWFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoLTJdO3JldHVybiBnLnB1c2goe3N0cjphLG9mZnNldDplK2J9KSxhfSk7Zm9yKHZhciBoPTA7aDxnLmxlbmd0aDtoKyspe3ZhciBpPWdbaF0saj1jLiRyYW5nZUZyb21NYXRjaChmLGkub2Zmc2V0LGkuc3RyLmxlbmd0aCk7aWYoZChqKSlyZXR1cm4hMH19KX19fSx0aGlzLiRiYWNrd2FyZE1hdGNoSXRlcmF0b3I9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy4kYXNzZW1ibGVSZWdFeHAoKSxjPXRoaXM7cmV0dXJue2ZvckVhY2g6ZnVuY3Rpb24oZCl7Yy4kYmFja3dhcmRMaW5lSXRlcmF0b3IoYSkuZm9yRWFjaChmdW5jdGlvbihhLGUsZil7ZSYmKGE9YS5zdWJzdHJpbmcoZSkpO3ZhciBnPVtdO2EucmVwbGFjZShiLGZ1bmN0aW9uKGEsYil7cmV0dXJuIGcucHVzaCh7c3RyOmEsb2Zmc2V0OmUrYn0pLGF9KTtmb3IodmFyIGg9Zy5sZW5ndGgtMTtoPj0wO2gtLSl7dmFyIGk9Z1toXSxqPWMuJHJhbmdlRnJvbU1hdGNoKGYsaS5vZmZzZXQsaS5zdHIubGVuZ3RoKTtpZihkKGopKXJldHVybiEwfX0pfX19LHRoaXMuJHJhbmdlRnJvbU1hdGNoPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IGYoYSxiLGEsYitjKX0sdGhpcy4kYXNzZW1ibGVSZWdFeHA9ZnVuY3Rpb24oKXtpZih0aGlzLiRvcHRpb25zLnJlZ0V4cCl2YXIgYT10aGlzLiRvcHRpb25zLm5lZWRsZTtlbHNlIGE9ZC5lc2NhcGVSZWdFeHAodGhpcy4kb3B0aW9ucy5uZWVkbGUpO3RoaXMuJG9wdGlvbnMud2hvbGVXb3JkJiYoYT0iXFxiIithKyJcXGIiKTt2YXIgYj0iZyI7dGhpcy4kb3B0aW9ucy5jYXNlU2Vuc2l0aXZlfHwoYis9ImkiKTt2YXIgYz1uZXcgUmVnRXhwKGEsYik7cmV0dXJuIGN9LHRoaXMuJGZvcndhcmRMaW5lSXRlcmF0b3I9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gayhlKXt2YXIgZj1hLmdldExpbmUoZSk7cmV0dXJuIGImJmU9PWMuZW5kLnJvdyYmKGY9Zi5zdWJzdHJpbmcoMCxjLmVuZC5jb2x1bW4pKSxqJiZlPT1kLnJvdyYmKGY9Zi5zdWJzdHJpbmcoMCxkLmNvbHVtbikpLGZ9dmFyIGI9dGhpcy4kb3B0aW9ucy5zY29wZT09Zy5TRUxFQ1RJT04sYz10aGlzLiRvcHRpb25zLnJhbmdlfHxhLmdldFNlbGVjdGlvbigpLmdldFJhbmdlKCksZD10aGlzLiRvcHRpb25zLnN0YXJ0fHxjW2I/InN0YXJ0IjoiZW5kIl0sZT1iP2Muc3RhcnQucm93OjAsZj1iP2Muc3RhcnQuY29sdW1uOjAsaD1iP2MuZW5kLnJvdzphLmdldExlbmd0aCgpLTEsaT10aGlzLiRvcHRpb25zLndyYXAsaj0hMTtyZXR1cm57Zm9yRWFjaDpmdW5jdGlvbihhKXt2YXIgYj1kLnJvdyxjPWsoYiksZz1kLmNvbHVtbixsPSExO2o9ITE7d2hpbGUoIWEoYyxnLGIpKXtpZihsKXJldHVybjtiKyssZz0wO2lmKGI+aClpZihpKWI9ZSxnPWYsaj0hMDtlbHNlIHJldHVybjtiPT1kLnJvdyYmKGw9ITApLGM9ayhiKX19fX0sdGhpcy4kYmFja3dhcmRMaW5lSXRlcmF0b3I9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy4kb3B0aW9ucy5zY29wZT09Zy5TRUxFQ1RJT04sYz10aGlzLiRvcHRpb25zLnJhbmdlfHxhLmdldFNlbGVjdGlvbigpLmdldFJhbmdlKCksZD10aGlzLiRvcHRpb25zLnN0YXJ0fHxjW2I/ImVuZCI6InN0YXJ0Il0sZT1iP2Muc3RhcnQucm93OjAsZj1iP2Muc3RhcnQuY29sdW1uOjAsaD1iP2MuZW5kLnJvdzphLmdldExlbmd0aCgpLTEsaT10aGlzLiRvcHRpb25zLndyYXA7cmV0dXJue2ZvckVhY2g6ZnVuY3Rpb24oZyl7dmFyIGo9ZC5yb3csaz1hLmdldExpbmUoaikuc3Vic3RyaW5nKDAsZC5jb2x1bW4pLGw9MCxtPSExLG49ITE7d2hpbGUoIWcoayxsLGopKXtpZihtKXJldHVybjtqLS0sbD0wO2lmKGo8ZSlpZihpKWo9aCxuPSEwO2Vsc2UgcmV0dXJuO2o9PWQucm93JiYobT0hMCksaz1hLmdldExpbmUoaiksYiYmKGo9PWU/bD1mOmo9PWgmJihrPWsuc3Vic3RyaW5nKDAsYy5lbmQuY29sdW1uKSkpLG4mJmo9PWQucm93JiYobD1kLmNvbHVtbil9fX19fS5jYWxsKGcucHJvdG90eXBlKSxiLlNlYXJjaD1nfSksZGVmaW5lKCJhY2UvY29tbWFuZHMvY29tbWFuZF9tYW5hZ2VyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9rZXlzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIva2V5cyIpLGU9ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYSE9InN0cmluZyIpdGhyb3cgbmV3IFR5cGVFcnJvcigiJ3BsYXRmb3JtJyBhcmd1bWVudCBtdXN0IGJlIGVpdGhlciAnbWFjJyBvciAnd2luJyIpO3RoaXMucGxhdGZvcm09YSx0aGlzLmNvbW1hbmRzPXt9LHRoaXMuY29tbW1hbmRLZXlCaW5kaW5nPXt9LGImJmIuZm9yRWFjaCh0aGlzLmFkZENvbW1hbmQsdGhpcyl9OygoZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsYyxlKXt2YXIgZixnPTAsaD1iKGEpO2Zvcih2YXIgaT0wLGo9aC5sZW5ndGg7aTxqO2krKylkLktFWV9NT0RTW2hbaV1dP2d8PWQuS0VZX01PRFNbaFtpXV06Zj1oW2ldfHwiLSI7cmV0dXJue2tleTpmLGhhc2hJZDpnfX1mdW5jdGlvbiBiKGEsYil7cmV0dXJuIGEudG9Mb3dlckNhc2UoKS50cmltKCkuc3BsaXQobmV3IFJlZ0V4cCgiW1xccyBdKlxcLVtcXHMgXSoiLCJnIiksOTk5KX10aGlzLmFkZENvbW1hbmQ9ZnVuY3Rpb24oYSl7dGhpcy5jb21tYW5kc1thLm5hbWVdJiZ0aGlzLnJlbW92ZUNvbW1hbmQoYSksdGhpcy5jb21tYW5kc1thLm5hbWVdPWEsYS5iaW5kS2V5JiZ0aGlzLl9idWlsZEtleUhhc2goYSl9LHRoaXMucmVtb3ZlQ29tbWFuZD1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYT09InN0cmluZyI/YTphLm5hbWU7YT10aGlzLmNvbW1hbmRzW2JdLGRlbGV0ZSB0aGlzLmNvbW1hbmRzW2JdO3ZhciBjPXRoaXMuY29tbW1hbmRLZXlCaW5kaW5nO2Zvcih2YXIgZCBpbiBjKWZvcih2YXIgZSBpbiBjW2RdKWNbZF1bZV09PWEmJmRlbGV0ZSBjW2RdW2VdfSx0aGlzLmFkZENvbW1hbmRzPWZ1bmN0aW9uKGEpe09iamVjdC5rZXlzKGEpLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGM9YVtiXTtpZih0eXBlb2YgYz09InN0cmluZyIpcmV0dXJuIHRoaXMuYmluZEtleShjLGIpO3R5cGVvZiBjPT0iZnVuY3Rpb24iJiYoYz17ZXhlYzpjfSksYy5uYW1lfHwoYy5uYW1lPWIpLHRoaXMuYWRkQ29tbWFuZChjKX0sdGhpcyl9LHRoaXMucmVtb3ZlQ29tbWFuZHM9ZnVuY3Rpb24oYSl7T2JqZWN0LmtleXMoYSkuZm9yRWFjaChmdW5jdGlvbihiKXt0aGlzLnJlbW92ZUNvbW1hbmQoYVtiXSl9LHRoaXMpfSx0aGlzLmJpbmRLZXk9ZnVuY3Rpb24oYixjKXtpZighYilyZXR1cm47dmFyIGQ9dGhpcy5jb21tbWFuZEtleUJpbmRpbmc7Yi5zcGxpdCgifCIpLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGU9YShiLGMpLGY9ZS5oYXNoSWQ7KGRbZl18fChkW2ZdPXt9KSlbZS5rZXldPWN9KX0sdGhpcy5iaW5kS2V5cz1mdW5jdGlvbihhKXtPYmplY3Qua2V5cyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe3RoaXMuYmluZEtleShiLGFbYl0pfSx0aGlzKX0sdGhpcy5fYnVpbGRLZXlIYXNoPWZ1bmN0aW9uKGEpe3ZhciBiPWEuYmluZEtleTtpZighYilyZXR1cm47dmFyIGM9dHlwZW9mIGI9PSJzdHJpbmciP2I6Ylt0aGlzLnBsYXRmb3JtXTt0aGlzLmJpbmRLZXkoYyxhKX0sdGhpcy5maW5kS2V5Q29tbWFuZD1mdW5jdGlvbiBjKGEsYil7dHlwZW9mIGI9PSJudW1iZXIiJiYoYj1kLmtleUNvZGVUb1N0cmluZyhiKSk7dmFyIGM9dGhpcy5jb21tbWFuZEtleUJpbmRpbmc7cmV0dXJuIGNbYV0mJmNbYV1bYi50b0xvd2VyQ2FzZSgpXX0sdGhpcy5leGVjPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdHlwZW9mIGE9PSJzdHJpbmciJiYoYT10aGlzLmNvbW1hbmRzW2FdKSxhP2ImJmIuJHJlYWRPbmx5JiYhYS5yZWFkT25seT8hMTooYS5leGVjKGIsY3x8e30pLCEwKTohMX0sdGhpcy50b2dnbGVSZWNvcmRpbmc9ZnVuY3Rpb24oKXtpZih0aGlzLiRpblJlcGxheSlyZXR1cm47cmV0dXJuIHRoaXMucmVjb3JkaW5nPyh0aGlzLm1hY3JvLnBvcCgpLHRoaXMuZXhlYz10aGlzLm5vcm1hbF9leGVjLHRoaXMubWFjcm8ubGVuZ3RofHwodGhpcy5tYWNybz10aGlzLm9sZE1hY3JvKSx0aGlzLnJlY29yZGluZz0hMSk6KHRoaXMub2xkTWFjcm89dGhpcy5tYWNybyx0aGlzLm1hY3JvPVtdLHRoaXMubm9ybWFsX2V4ZWM9dGhpcy5leGVjLHRoaXMuZXhlYz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMubWFjcm8ucHVzaChbYSxjXSksdGhpcy5ub3JtYWxfZXhlYyhhLGIsYyl9LHRoaXMucmVjb3JkaW5nPSEwKX0sdGhpcy5yZXBsYXk9ZnVuY3Rpb24oYSl7aWYodGhpcy4kaW5SZXBsYXl8fCF0aGlzLm1hY3JvKXJldHVybjtpZih0aGlzLnJlY29yZGluZylyZXR1cm4gdGhpcy50b2dnbGVSZWNvcmRpbmcoKTt0cnl7dGhpcy4kaW5SZXBsYXk9ITAsdGhpcy5tYWNyby5mb3JFYWNoKGZ1bmN0aW9uKGIpe3R5cGVvZiBiPT0ic3RyaW5nIj90aGlzLmV4ZWMoYixhKTp0aGlzLmV4ZWMoYlswXSxhLGJbMV0pfSx0aGlzKX1maW5hbGx5e3RoaXMuJGluUmVwbGF5PSExfX0sdGhpcy50cmltTWFjcm89ZnVuY3Rpb24oYSl7cmV0dXJuIGEubWFwKGZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgYVswXSE9InN0cmluZyImJihhWzBdPWFbMF0ubmFtZSksYVsxXXx8KGE9YVswXSksYX0pfX0pKS5jYWxsKGUucHJvdG90eXBlKSxiLkNvbW1hbmRNYW5hZ2VyPWV9KSxkZWZpbmUoImFjZS91bmRvbWFuYWdlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9ZnVuY3Rpb24oKXt0aGlzLnJlc2V0KCl9OygoZnVuY3Rpb24oKXt0aGlzLmV4ZWN1dGU9ZnVuY3Rpb24oYSl7dmFyIGI9YS5hcmdzWzBdO3RoaXMuJGRvYz1hLmFyZ3NbMV0sdGhpcy4kdW5kb1N0YWNrLnB1c2goYiksdGhpcy4kcmVkb1N0YWNrPVtdfSx0aGlzLnVuZG89ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy4kdW5kb1N0YWNrLnBvcCgpLGM9bnVsbDtyZXR1cm4gYiYmKGM9dGhpcy4kZG9jLnVuZG9DaGFuZ2VzKGIsYSksdGhpcy4kcmVkb1N0YWNrLnB1c2goYikpLGN9LHRoaXMucmVkbz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLiRyZWRvU3RhY2sucG9wKCksYz1udWxsO3JldHVybiBiJiYoYz10aGlzLiRkb2MucmVkb0NoYW5nZXMoYixhKSx0aGlzLiR1bmRvU3RhY2sucHVzaChiKSksY30sdGhpcy5yZXNldD1mdW5jdGlvbigpe3RoaXMuJHVuZG9TdGFjaz1bXSx0aGlzLiRyZWRvU3RhY2s9W119LHRoaXMuaGFzVW5kbz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiR1bmRvU3RhY2subGVuZ3RoPjB9LHRoaXMuaGFzUmVkbz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRyZWRvU3RhY2subGVuZ3RoPjB9fSkpLmNhbGwoZC5wcm90b3R5cGUpLGIuVW5kb01hbmFnZXI9ZH0pLGRlZmluZSgiYWNlL3ZpcnR1YWxfcmVuZGVyZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvZG9tIiwiYWNlL2xpYi9ldmVudCIsImFjZS9saWIvdXNlcmFnZW50IiwiYWNlL2xheWVyL2d1dHRlciIsImFjZS9sYXllci9tYXJrZXIiLCJhY2UvbGF5ZXIvdGV4dCIsImFjZS9sYXllci9jdXJzb3IiLCJhY2Uvc2Nyb2xsYmFyIiwiYWNlL3JlbmRlcmxvb3AiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiLCJ0ZXh0IWFjZS9jc3MvZWRpdG9yLmNzcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi9saWIvb29wIiksZT1hKCIuL2xpYi9kb20iKSxmPWEoIi4vbGliL2V2ZW50IiksZz1hKCIuL2xpYi91c2VyYWdlbnQiKSxoPWEoIi4vbGF5ZXIvZ3V0dGVyIikuR3V0dGVyLGk9YSgiLi9sYXllci9tYXJrZXIiKS5NYXJrZXIsaj1hKCIuL2xheWVyL3RleHQiKS5UZXh0LGs9YSgiLi9sYXllci9jdXJzb3IiKS5DdXJzb3IsbD1hKCIuL3Njcm9sbGJhciIpLlNjcm9sbEJhcixtPWEoIi4vcmVuZGVybG9vcCIpLlJlbmRlckxvb3Asbj1hKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLG89YSgidGV4dCEuL2Nzcy9lZGl0b3IuY3NzIik7ZS5pbXBvcnRDc3NTdHJpbmcobywiYWNlX2VkaXRvciIpO3ZhciBwPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpczt0aGlzLmNvbnRhaW5lcj1hLGUuYWRkQ3NzQ2xhc3MoYSwiYWNlX2VkaXRvciIpLHRoaXMuc2V0VGhlbWUoYiksdGhpcy4kZ3V0dGVyPWUuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy4kZ3V0dGVyLmNsYXNzTmFtZT0iYWNlX2d1dHRlciIsdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy4kZ3V0dGVyKSx0aGlzLnNjcm9sbGVyPWUuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5zY3JvbGxlci5jbGFzc05hbWU9ImFjZV9zY3JvbGxlciIsdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5zY3JvbGxlciksdGhpcy5jb250ZW50PWUuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb250ZW50LmNsYXNzTmFtZT0iYWNlX2NvbnRlbnQiLHRoaXMuc2Nyb2xsZXIuYXBwZW5kQ2hpbGQodGhpcy5jb250ZW50KSx0aGlzLiRndXR0ZXJMYXllcj1uZXcgaCh0aGlzLiRndXR0ZXIpLHRoaXMuJGd1dHRlckxheWVyLm9uKCJjaGFuZ2VHdXR0ZXJXaWR0aCIsdGhpcy5vblJlc2l6ZS5iaW5kKHRoaXMsITApKSx0aGlzLiRtYXJrZXJCYWNrPW5ldyBpKHRoaXMuY29udGVudCk7dmFyIGQ9dGhpcy4kdGV4dExheWVyPW5ldyBqKHRoaXMuY29udGVudCk7dGhpcy5jYW52YXM9ZC5lbGVtZW50LHRoaXMuJG1hcmtlckZyb250PW5ldyBpKHRoaXMuY29udGVudCksdGhpcy5jaGFyYWN0ZXJXaWR0aD1kLmdldENoYXJhY3RlcldpZHRoKCksdGhpcy5saW5lSGVpZ2h0PWQuZ2V0TGluZUhlaWdodCgpLHRoaXMuJGN1cnNvckxheWVyPW5ldyBrKHRoaXMuY29udGVudCksdGhpcy4kY3Vyc29yUGFkZGluZz04LHRoaXMuJGhvcml6U2Nyb2xsPSEwLHRoaXMuJGhvcml6U2Nyb2xsQWx3YXlzVmlzaWJsZT0hMCx0aGlzLnNjcm9sbEJhcj1uZXcgbChhKSx0aGlzLnNjcm9sbEJhci5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLGZ1bmN0aW9uKGEpe2Muc2Vzc2lvbi5zZXRTY3JvbGxUb3AoYS5kYXRhKX0pLHRoaXMuc2Nyb2xsVG9wPTAsdGhpcy5zY3JvbGxMZWZ0PTAsZi5hZGRMaXN0ZW5lcih0aGlzLnNjcm9sbGVyLCJzY3JvbGwiLGZ1bmN0aW9uKCl7Yy5zZXNzaW9uLnNldFNjcm9sbExlZnQoYy5zY3JvbGxlci5zY3JvbGxMZWZ0KX0pLHRoaXMuY3Vyc29yUG9zPXtyb3c6MCxjb2x1bW46MH0sdGhpcy4kdGV4dExheWVyLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZUNoYXJhY3RlclNpemUiLGZ1bmN0aW9uKCl7Yy5jaGFyYWN0ZXJXaWR0aD1kLmdldENoYXJhY3RlcldpZHRoKCksYy5saW5lSGVpZ2h0PWQuZ2V0TGluZUhlaWdodCgpLGMuJHVwZGF0ZVByaW50TWFyZ2luKCksYy5vblJlc2l6ZSghMCksYy4kbG9vcC5zY2hlZHVsZShjLkNIQU5HRV9GVUxMKX0pLHRoaXMuJHNpemU9e3dpZHRoOjAsaGVpZ2h0OjAsc2Nyb2xsZXJIZWlnaHQ6MCxzY3JvbGxlcldpZHRoOjB9LHRoaXMubGF5ZXJDb25maWc9e3dpZHRoOjEscGFkZGluZzowLGZpcnN0Um93OjAsZmlyc3RSb3dTY3JlZW46MCxsYXN0Um93OjAsbGluZUhlaWdodDoxLGNoYXJhY3RlcldpZHRoOjEsbWluSGVpZ2h0OjEsbWF4SGVpZ2h0OjEsb2Zmc2V0OjAsaGVpZ2h0OjF9LHRoaXMuJGxvb3A9bmV3IG0odGhpcy4kcmVuZGVyQ2hhbmdlcy5iaW5kKHRoaXMpLHRoaXMuY29udGFpbmVyLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfRlVMTCksdGhpcy5zZXRQYWRkaW5nKDQpLHRoaXMuJHVwZGF0ZVByaW50TWFyZ2luKCl9OygoZnVuY3Rpb24oKXt0aGlzLnNob3dHdXR0ZXI9ITAsdGhpcy5DSEFOR0VfQ1VSU09SPTEsdGhpcy5DSEFOR0VfTUFSS0VSPTIsdGhpcy5DSEFOR0VfR1VUVEVSPTQsdGhpcy5DSEFOR0VfU0NST0xMPTgsdGhpcy5DSEFOR0VfTElORVM9MTYsdGhpcy5DSEFOR0VfVEVYVD0zMix0aGlzLkNIQU5HRV9TSVpFPTY0LHRoaXMuQ0hBTkdFX01BUktFUl9CQUNLPTEyOCx0aGlzLkNIQU5HRV9NQVJLRVJfRlJPTlQ9MjU2LHRoaXMuQ0hBTkdFX0ZVTEw9NTEyLHRoaXMuQ0hBTkdFX0hfU0NST0xMPTEwMjQsZC5pbXBsZW1lbnQodGhpcyxuKSx0aGlzLnNldFNlc3Npb249ZnVuY3Rpb24oYSl7dGhpcy5zZXNzaW9uPWEsdGhpcy4kY3Vyc29yTGF5ZXIuc2V0U2Vzc2lvbihhKSx0aGlzLiRtYXJrZXJCYWNrLnNldFNlc3Npb24oYSksdGhpcy4kbWFya2VyRnJvbnQuc2V0U2Vzc2lvbihhKSx0aGlzLiRndXR0ZXJMYXllci5zZXRTZXNzaW9uKGEpLHRoaXMuJHRleHRMYXllci5zZXRTZXNzaW9uKGEpLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfRlVMTCl9LHRoaXMudXBkYXRlTGluZXM9ZnVuY3Rpb24oYSxiKXtiPT09dW5kZWZpbmVkJiYoYj1JbmZpbml0eSksdGhpcy4kY2hhbmdlZExpbmVzPyh0aGlzLiRjaGFuZ2VkTGluZXMuZmlyc3RSb3c+YSYmKHRoaXMuJGNoYW5nZWRMaW5lcy5maXJzdFJvdz1hKSx0aGlzLiRjaGFuZ2VkTGluZXMubGFzdFJvdzxiJiYodGhpcy4kY2hhbmdlZExpbmVzLmxhc3RSb3c9YikpOnRoaXMuJGNoYW5nZWRMaW5lcz17Zmlyc3RSb3c6YSxsYXN0Um93OmJ9LHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfTElORVMpfSx0aGlzLnVwZGF0ZVRleHQ9ZnVuY3Rpb24oKXt0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX1RFWFQpfSx0aGlzLnVwZGF0ZUZ1bGw9ZnVuY3Rpb24oKXt0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0ZVTEwpfSx0aGlzLnVwZGF0ZUZvbnRTaXplPWZ1bmN0aW9uKCl7dGhpcy4kdGV4dExheWVyLmNoZWNrRm9yU2l6ZUNoYW5nZXMoKX0sdGhpcy5vblJlc2l6ZT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLkNIQU5HRV9TSVpFLGM9dGhpcy4kc2l6ZSxkPWUuZ2V0SW5uZXJIZWlnaHQodGhpcy5jb250YWluZXIpO2lmKGF8fGMuaGVpZ2h0IT1kKWMuaGVpZ2h0PWQsdGhpcy5zY3JvbGxlci5zdHlsZS5oZWlnaHQ9ZCsicHgiLGMuc2Nyb2xsZXJIZWlnaHQ9dGhpcy5zY3JvbGxlci5jbGllbnRIZWlnaHQsdGhpcy5zY3JvbGxCYXIuc2V0SGVpZ2h0KGMuc2Nyb2xsZXJIZWlnaHQpLHRoaXMuc2Vzc2lvbiYmKHRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3AodGhpcy5nZXRTY3JvbGxUb3AoKSksYnw9dGhpcy5DSEFOR0VfRlVMTCk7dmFyIGY9ZS5nZXRJbm5lcldpZHRoKHRoaXMuY29udGFpbmVyKTtpZihhfHxjLndpZHRoIT1mKXtjLndpZHRoPWY7dmFyIGc9dGhpcy5zaG93R3V0dGVyP3RoaXMuJGd1dHRlci5vZmZzZXRXaWR0aDowO3RoaXMuc2Nyb2xsZXIuc3R5bGUubGVmdD1nKyJweCIsYy5zY3JvbGxlcldpZHRoPU1hdGgubWF4KDAsZi1nLXRoaXMuc2Nyb2xsQmFyLmdldFdpZHRoKCkpLHRoaXMuc2Nyb2xsZXIuc3R5bGUud2lkdGg9Yy5zY3JvbGxlcldpZHRoKyJweCI7aWYodGhpcy5zZXNzaW9uLmdldFVzZVdyYXBNb2RlKCkmJnRoaXMuYWRqdXN0V3JhcExpbWl0KCl8fGEpYnw9dGhpcy5DSEFOR0VfRlVMTH10aGlzLiRsb29wLnNjaGVkdWxlKGIpfSx0aGlzLmFkanVzdFdyYXBMaW1pdD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuJHNpemUuc2Nyb2xsZXJXaWR0aC10aGlzLiRwYWRkaW5nKjIsYj1NYXRoLmZsb29yKGEvdGhpcy5jaGFyYWN0ZXJXaWR0aCk7cmV0dXJuIHRoaXMuc2Vzc2lvbi5hZGp1c3RXcmFwTGltaXQoYil9LHRoaXMuc2V0U2hvd0ludmlzaWJsZXM9ZnVuY3Rpb24oYSl7dGhpcy4kdGV4dExheWVyLnNldFNob3dJbnZpc2libGVzKGEpJiZ0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX1RFWFQpfSx0aGlzLmdldFNob3dJbnZpc2libGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHRleHRMYXllci5zaG93SW52aXNpYmxlc30sdGhpcy4kc2hvd1ByaW50TWFyZ2luPSEwLHRoaXMuc2V0U2hvd1ByaW50TWFyZ2luPWZ1bmN0aW9uKGEpe3RoaXMuJHNob3dQcmludE1hcmdpbj1hLHRoaXMuJHVwZGF0ZVByaW50TWFyZ2luKCl9LHRoaXMuZ2V0U2hvd1ByaW50TWFyZ2luPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHNob3dQcmludE1hcmdpbn0sdGhpcy4kcHJpbnRNYXJnaW5Db2x1bW49ODAsdGhpcy5zZXRQcmludE1hcmdpbkNvbHVtbj1mdW5jdGlvbihhKXt0aGlzLiRwcmludE1hcmdpbkNvbHVtbj1hLHRoaXMuJHVwZGF0ZVByaW50TWFyZ2luKCl9LHRoaXMuZ2V0UHJpbnRNYXJnaW5Db2x1bW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcHJpbnRNYXJnaW5Db2x1bW59LHRoaXMuZ2V0U2hvd0d1dHRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNob3dHdXR0ZXJ9LHRoaXMuc2V0U2hvd0d1dHRlcj1mdW5jdGlvbihhKXtpZih0aGlzLnNob3dHdXR0ZXI9PT1hKXJldHVybjt0aGlzLiRndXR0ZXIuc3R5bGUuZGlzcGxheT1hPyJibG9jayI6Im5vbmUiLHRoaXMuc2hvd0d1dHRlcj1hLHRoaXMub25SZXNpemUoITApfSx0aGlzLiR1cGRhdGVQcmludE1hcmdpbj1mdW5jdGlvbigpe3ZhciBhO2lmKCF0aGlzLiRzaG93UHJpbnRNYXJnaW4mJiF0aGlzLiRwcmludE1hcmdpbkVsKXJldHVybjt0aGlzLiRwcmludE1hcmdpbkVsfHwoYT1lLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGEuY2xhc3NOYW1lPSJhY2VfcHJpbnRfbWFyZ2luX2xheWVyIix0aGlzLiRwcmludE1hcmdpbkVsPWUuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy4kcHJpbnRNYXJnaW5FbC5jbGFzc05hbWU9ImFjZV9wcmludF9tYXJnaW4iLGEuYXBwZW5kQ2hpbGQodGhpcy4kcHJpbnRNYXJnaW5FbCksdGhpcy5jb250ZW50Lmluc2VydEJlZm9yZShhLHRoaXMuJHRleHRMYXllci5lbGVtZW50KSk7dmFyIGI9dGhpcy4kcHJpbnRNYXJnaW5FbC5zdHlsZTtiLmxlZnQ9dGhpcy5jaGFyYWN0ZXJXaWR0aCp0aGlzLiRwcmludE1hcmdpbkNvbHVtbit0aGlzLiRwYWRkaW5nKyJweCIsYi52aXNpYmlsaXR5PXRoaXMuJHNob3dQcmludE1hcmdpbj8idmlzaWJsZSI6ImhpZGRlbiJ9LHRoaXMuZ2V0Q29udGFpbmVyRWxlbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRhaW5lcn0sdGhpcy5nZXRNb3VzZUV2ZW50VGFyZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGVudH0sdGhpcy5nZXRUZXh0QXJlYUNvbnRhaW5lcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRhaW5lcn0sdGhpcy5tb3ZlVGV4dEFyZWFUb0N1cnNvcj1mdW5jdGlvbihhKXtpZihnLmlzSUUpcmV0dXJuO2lmKHRoaXMubGF5ZXJDb25maWcubGFzdFJvdz09PTApcmV0dXJuO3ZhciBiPXRoaXMuJGN1cnNvckxheWVyLmdldFBpeGVsUG9zaXRpb24oKTtpZighYilyZXR1cm47dmFyIGM9dGhpcy5jb250ZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9dGhpcy5sYXllckNvbmZpZy5vZmZzZXQ7YS5zdHlsZS5sZWZ0PWMubGVmdCtiLmxlZnQrInB4IixhLnN0eWxlLnRvcD1jLnRvcCtiLnRvcC10aGlzLnNjcm9sbFRvcCtkKyJweCJ9LHRoaXMuZ2V0Rmlyc3RWaXNpYmxlUm93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF5ZXJDb25maWcuZmlyc3RSb3d9LHRoaXMuZ2V0Rmlyc3RGdWxseVZpc2libGVSb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXllckNvbmZpZy5maXJzdFJvdysodGhpcy5sYXllckNvbmZpZy5vZmZzZXQ9PT0wPzA6MSl9LHRoaXMuZ2V0TGFzdEZ1bGx5VmlzaWJsZVJvdz1mdW5jdGlvbigpe3ZhciBhPU1hdGguZmxvb3IoKHRoaXMubGF5ZXJDb25maWcuaGVpZ2h0K3RoaXMubGF5ZXJDb25maWcub2Zmc2V0KS90aGlzLmxheWVyQ29uZmlnLmxpbmVIZWlnaHQpO3JldHVybiB0aGlzLmxheWVyQ29uZmlnLmZpcnN0Um93LTErYX0sdGhpcy5nZXRMYXN0VmlzaWJsZVJvdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxheWVyQ29uZmlnLmxhc3RSb3d9LHRoaXMuJHBhZGRpbmc9bnVsbCx0aGlzLnNldFBhZGRpbmc9ZnVuY3Rpb24oYSl7dGhpcy4kcGFkZGluZz1hLHRoaXMuJHRleHRMYXllci5zZXRQYWRkaW5nKGEpLHRoaXMuJGN1cnNvckxheWVyLnNldFBhZGRpbmcoYSksdGhpcy4kbWFya2VyRnJvbnQuc2V0UGFkZGluZyhhKSx0aGlzLiRtYXJrZXJCYWNrLnNldFBhZGRpbmcoYSksdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9GVUxMKSx0aGlzLiR1cGRhdGVQcmludE1hcmdpbigpfSx0aGlzLmdldEhTY3JvbGxCYXJBbHdheXNWaXNpYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGhvcml6U2Nyb2xsQWx3YXlzVmlzaWJsZX0sdGhpcy5zZXRIU2Nyb2xsQmFyQWx3YXlzVmlzaWJsZT1mdW5jdGlvbihhKXt0aGlzLiRob3JpelNjcm9sbEFsd2F5c1Zpc2libGUhPWEmJih0aGlzLiRob3JpelNjcm9sbEFsd2F5c1Zpc2libGU9YSwoIXRoaXMuJGhvcml6U2Nyb2xsQWx3YXlzVmlzaWJsZXx8IXRoaXMuJGhvcml6U2Nyb2xsKSYmdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9TQ1JPTEwpKX0sdGhpcy4kdXBkYXRlU2Nyb2xsQmFyPWZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxCYXIuc2V0SW5uZXJIZWlnaHQodGhpcy5sYXllckNvbmZpZy5tYXhIZWlnaHQpLHRoaXMuc2Nyb2xsQmFyLnNldFNjcm9sbFRvcCh0aGlzLnNjcm9sbFRvcCl9LHRoaXMuJHJlbmRlckNoYW5nZXM9ZnVuY3Rpb24oYSl7aWYoIWF8fCF0aGlzLnNlc3Npb24pcmV0dXJuOyhhJnRoaXMuQ0hBTkdFX0ZVTEx8fGEmdGhpcy5DSEFOR0VfU0laRXx8YSZ0aGlzLkNIQU5HRV9URVhUfHxhJnRoaXMuQ0hBTkdFX0xJTkVTfHxhJnRoaXMuQ0hBTkdFX1NDUk9MTCkmJnRoaXMuJGNvbXB1dGVMYXllckNvbmZpZygpO2lmKGEmdGhpcy5DSEFOR0VfRlVMTCl7dGhpcy4kdGV4dExheWVyLnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKSx0aGlzLnNob3dHdXR0ZXImJnRoaXMuJGd1dHRlckxheWVyLnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKSx0aGlzLiRtYXJrZXJCYWNrLnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKSx0aGlzLiRtYXJrZXJGcm9udC51cGRhdGUodGhpcy5sYXllckNvbmZpZyksdGhpcy4kY3Vyc29yTGF5ZXIudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpLHRoaXMuJHVwZGF0ZVNjcm9sbEJhcigpO3JldHVybn1pZihhJnRoaXMuQ0hBTkdFX1NDUk9MTCl7YSZ0aGlzLkNIQU5HRV9URVhUfHxhJnRoaXMuQ0hBTkdFX0xJTkVTP3RoaXMuJHRleHRMYXllci51cGRhdGUodGhpcy5sYXllckNvbmZpZyk6dGhpcy4kdGV4dExheWVyLnNjcm9sbExpbmVzKHRoaXMubGF5ZXJDb25maWcpLHRoaXMuc2hvd0d1dHRlciYmdGhpcy4kZ3V0dGVyTGF5ZXIudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpLHRoaXMuJG1hcmtlckJhY2sudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpLHRoaXMuJG1hcmtlckZyb250LnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKSx0aGlzLiRjdXJzb3JMYXllci51cGRhdGUodGhpcy5sYXllckNvbmZpZyksdGhpcy4kdXBkYXRlU2Nyb2xsQmFyKCk7cmV0dXJufWEmdGhpcy5DSEFOR0VfVEVYVD8odGhpcy4kdGV4dExheWVyLnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKSx0aGlzLnNob3dHdXR0ZXImJnRoaXMuJGd1dHRlckxheWVyLnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKSk6YSZ0aGlzLkNIQU5HRV9MSU5FUz8odGhpcy4kdXBkYXRlTGluZXMoKSx0aGlzLiR1cGRhdGVTY3JvbGxCYXIoKSx0aGlzLnNob3dHdXR0ZXImJnRoaXMuJGd1dHRlckxheWVyLnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKSk6YSZ0aGlzLkNIQU5HRV9HVVRURVImJnRoaXMuc2hvd0d1dHRlciYmdGhpcy4kZ3V0dGVyTGF5ZXIudXBkYXRlKHRoaXMubGF5ZXJDb25maWcpLGEmdGhpcy5DSEFOR0VfQ1VSU09SJiZ0aGlzLiRjdXJzb3JMYXllci51cGRhdGUodGhpcy5sYXllckNvbmZpZyksYSYodGhpcy5DSEFOR0VfTUFSS0VSfHRoaXMuQ0hBTkdFX01BUktFUl9GUk9OVCkmJnRoaXMuJG1hcmtlckZyb250LnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKSxhJih0aGlzLkNIQU5HRV9NQVJLRVJ8dGhpcy5DSEFOR0VfTUFSS0VSX0JBQ0spJiZ0aGlzLiRtYXJrZXJCYWNrLnVwZGF0ZSh0aGlzLmxheWVyQ29uZmlnKSxhJnRoaXMuQ0hBTkdFX1NJWkUmJnRoaXMuJHVwZGF0ZVNjcm9sbEJhcigpLGEmdGhpcy5DSEFOR0VfSF9TQ1JPTEwmJih0aGlzLnNjcm9sbGVyLnNjcm9sbExlZnQ9dGhpcy5zY3JvbGxMZWZ0KX0sdGhpcy4kY29tcHV0ZUxheWVyQ29uZmlnPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zZXNzaW9uLGI9dGhpcy5zY3JvbGxUb3AldGhpcy5saW5lSGVpZ2h0LGM9dGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodCt0aGlzLmxpbmVIZWlnaHQsZD10aGlzLiRnZXRMb25nZXN0TGluZSgpLGU9dGhpcy4kaG9yaXpTY3JvbGxBbHdheXNWaXNpYmxlfHx0aGlzLiRzaXplLnNjcm9sbGVyV2lkdGgtZDwwLGY9dGhpcy4kaG9yaXpTY3JvbGwhPT1lO3RoaXMuJGhvcml6U2Nyb2xsPWUsZiYmKHRoaXMuc2Nyb2xsZXIuc3R5bGUub3ZlcmZsb3dYPWU/InNjcm9sbCI6ImhpZGRlbiIpO3ZhciBnPXRoaXMuc2Vzc2lvbi5nZXRTY3JlZW5MZW5ndGgoKSp0aGlzLmxpbmVIZWlnaHQ7dGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcChNYXRoLm1heCgwLE1hdGgubWluKHRoaXMuc2Nyb2xsVG9wLGctdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodCkpKTt2YXIgaD1NYXRoLmNlaWwoYy90aGlzLmxpbmVIZWlnaHQpLTEsaT1NYXRoLm1heCgwLE1hdGgucm91bmQoKHRoaXMuc2Nyb2xsVG9wLWIpL3RoaXMubGluZUhlaWdodCkpLGo9aStoLGssbCxtPXtsaW5lSGVpZ2h0OnRoaXMubGluZUhlaWdodH07aT1hLnNjcmVlblRvRG9jdW1lbnRSb3coaSwwKTt2YXIgbj1hLmdldEZvbGRMaW5lKGkpO24mJihpPW4uc3RhcnQucm93KSxrPWEuZG9jdW1lbnRUb1NjcmVlblJvdyhpLDApLGw9YS5nZXRSb3dIZWlnaHQobSxpKSxqPU1hdGgubWluKGEuc2NyZWVuVG9Eb2N1bWVudFJvdyhqLDApLGEuZ2V0TGVuZ3RoKCktMSksYz10aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0K2EuZ2V0Um93SGVpZ2h0KG0saikrbCxiPXRoaXMuc2Nyb2xsVG9wLWsqdGhpcy5saW5lSGVpZ2h0LHRoaXMubGF5ZXJDb25maWc9e3dpZHRoOmQscGFkZGluZzp0aGlzLiRwYWRkaW5nLGZpcnN0Um93OmksZmlyc3RSb3dTY3JlZW46ayxsYXN0Um93OmosbGluZUhlaWdodDp0aGlzLmxpbmVIZWlnaHQsY2hhcmFjdGVyV2lkdGg6dGhpcy5jaGFyYWN0ZXJXaWR0aCxtaW5IZWlnaHQ6YyxtYXhIZWlnaHQ6ZyxvZmZzZXQ6YixoZWlnaHQ6dGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodH0sdGhpcy4kZ3V0dGVyTGF5ZXIuZWxlbWVudC5zdHlsZS5tYXJnaW5Ub3A9LWIrInB4Iix0aGlzLmNvbnRlbnQuc3R5bGUubWFyZ2luVG9wPS1iKyJweCIsdGhpcy5jb250ZW50LnN0eWxlLndpZHRoPWQrMip0aGlzLiRwYWRkaW5nKyJweCIsdGhpcy5jb250ZW50LnN0eWxlLmhlaWdodD1jKyJweCIsZiYmdGhpcy5vblJlc2l6ZSghMCl9LHRoaXMuJHVwZGF0ZUxpbmVzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kY2hhbmdlZExpbmVzLmZpcnN0Um93LGI9dGhpcy4kY2hhbmdlZExpbmVzLmxhc3RSb3c7dGhpcy4kY2hhbmdlZExpbmVzPW51bGw7dmFyIGM9dGhpcy5sYXllckNvbmZpZztpZihjLndpZHRoIT10aGlzLiRnZXRMb25nZXN0TGluZSgpKXJldHVybiB0aGlzLiR0ZXh0TGF5ZXIudXBkYXRlKGMpO2lmKGE+Yy5sYXN0Um93KzEpcmV0dXJuO2lmKGI8Yy5maXJzdFJvdylyZXR1cm47aWYoYj09PUluZmluaXR5KXt0aGlzLnNob3dHdXR0ZXImJnRoaXMuJGd1dHRlckxheWVyLnVwZGF0ZShjKSx0aGlzLiR0ZXh0TGF5ZXIudXBkYXRlKGMpO3JldHVybn10aGlzLiR0ZXh0TGF5ZXIudXBkYXRlTGluZXMoYyxhLGIpfSx0aGlzLiRnZXRMb25nZXN0TGluZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuc2Vzc2lvbi5nZXRTY3JlZW5XaWR0aCgpO3JldHVybiB0aGlzLiR0ZXh0TGF5ZXIuc2hvd0ludmlzaWJsZXMmJihhKz0xKSxNYXRoLm1heCh0aGlzLiRzaXplLnNjcm9sbGVyV2lkdGgtMip0aGlzLiRwYWRkaW5nLE1hdGgucm91bmQoYSp0aGlzLmNoYXJhY3RlcldpZHRoKSl9LHRoaXMudXBkYXRlRnJvbnRNYXJrZXJzPWZ1bmN0aW9uKCl7dGhpcy4kbWFya2VyRnJvbnQuc2V0TWFya2Vycyh0aGlzLnNlc3Npb24uZ2V0TWFya2VycyghMCkpLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfTUFSS0VSX0ZST05UKX0sdGhpcy51cGRhdGVCYWNrTWFya2Vycz1mdW5jdGlvbigpe3RoaXMuJG1hcmtlckJhY2suc2V0TWFya2Vycyh0aGlzLnNlc3Npb24uZ2V0TWFya2VycygpKSx0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX01BUktFUl9CQUNLKX0sdGhpcy5hZGRHdXR0ZXJEZWNvcmF0aW9uPWZ1bmN0aW9uKGEsYil7dGhpcy4kZ3V0dGVyTGF5ZXIuYWRkR3V0dGVyRGVjb3JhdGlvbihhLGIpLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfR1VUVEVSKX0sdGhpcy5yZW1vdmVHdXR0ZXJEZWNvcmF0aW9uPWZ1bmN0aW9uKGEsYil7dGhpcy4kZ3V0dGVyTGF5ZXIucmVtb3ZlR3V0dGVyRGVjb3JhdGlvbihhLGIpLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfR1VUVEVSKX0sdGhpcy5zZXRCcmVha3BvaW50cz1mdW5jdGlvbihhKXt0aGlzLiRndXR0ZXJMYXllci5zZXRCcmVha3BvaW50cyhhKSx0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0dVVFRFUil9LHRoaXMuc2V0QW5ub3RhdGlvbnM9ZnVuY3Rpb24oYSl7dGhpcy4kZ3V0dGVyTGF5ZXIuc2V0QW5ub3RhdGlvbnMoYSksdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9HVVRURVIpfSx0aGlzLnVwZGF0ZUN1cnNvcj1mdW5jdGlvbigpe3RoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfQ1VSU09SKX0sdGhpcy5oaWRlQ3Vyc29yPWZ1bmN0aW9uKCl7dGhpcy4kY3Vyc29yTGF5ZXIuaGlkZUN1cnNvcigpfSx0aGlzLnNob3dDdXJzb3I9ZnVuY3Rpb24oKXt0aGlzLiRjdXJzb3JMYXllci5zaG93Q3Vyc29yKCl9LHRoaXMuc2Nyb2xsQ3Vyc29ySW50b1ZpZXc9ZnVuY3Rpb24oKXtpZih0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0PT09MClyZXR1cm47dmFyIGE9dGhpcy4kY3Vyc29yTGF5ZXIuZ2V0UGl4ZWxQb3NpdGlvbigpLGI9YS5sZWZ0LGM9YS50b3A7dGhpcy5zY3JvbGxUb3A+YyYmdGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcChjKSx0aGlzLnNjcm9sbFRvcCt0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0PGMrdGhpcy5saW5lSGVpZ2h0JiZ0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKGMrdGhpcy5saW5lSGVpZ2h0LXRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQpO3ZhciBkPXRoaXMuc2Nyb2xsTGVmdDtkPmImJihiPHRoaXMuJHBhZGRpbmcrMip0aGlzLmxheWVyQ29uZmlnLmNoYXJhY3RlcldpZHRoJiYoYj0wKSx0aGlzLnNlc3Npb24uc2V0U2Nyb2xsTGVmdChiKSksZCt0aGlzLiRzaXplLnNjcm9sbGVyV2lkdGg8Yit0aGlzLmNoYXJhY3RlcldpZHRoJiZ0aGlzLnNlc3Npb24uc2V0U2Nyb2xsTGVmdChNYXRoLnJvdW5kKGIrdGhpcy5jaGFyYWN0ZXJXaWR0aC10aGlzLiRzaXplLnNjcm9sbGVyV2lkdGgpKX0sdGhpcy5nZXRTY3JvbGxUb3A9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXNzaW9uLmdldFNjcm9sbFRvcCgpfSx0aGlzLmdldFNjcm9sbExlZnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXNzaW9uLmdldFNjcm9sbFRvcCgpfSx0aGlzLmdldFNjcm9sbFRvcFJvdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNjcm9sbFRvcC90aGlzLmxpbmVIZWlnaHR9LHRoaXMuZ2V0U2Nyb2xsQm90dG9tUm93PWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5mbG9vcigodGhpcy5zY3JvbGxUb3ArdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodCkvdGhpcy5saW5lSGVpZ2h0KS0xKX0sdGhpcy5zY3JvbGxUb1Jvdz1mdW5jdGlvbihhKXt0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKGEqdGhpcy5saW5lSGVpZ2h0KX0sdGhpcy5zY3JvbGxUb0xpbmU9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLiRjdXJzb3JMYXllci5nZXRQaXhlbFBvc2l0aW9uKHtyb3c6YSxjb2x1bW46MH0pLGQ9Yy50b3A7YiYmKGQtPXRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQvMiksdGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcChkKX0sdGhpcy5zY3JvbGxUb1k9ZnVuY3Rpb24oYSl7dGhpcy5zY3JvbGxUb3AhPT1hJiYodGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9TQ1JPTEwpLHRoaXMuc2Nyb2xsVG9wPWEpfSx0aGlzLnNjcm9sbFRvWD1mdW5jdGlvbihhKXthPD10aGlzLiRwYWRkaW5nJiYoYT0wKSx0aGlzLnNjcm9sbExlZnQhPT1hJiYodGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9IX1NDUk9MTCksdGhpcy5zY3JvbGxMZWZ0PWEpfSx0aGlzLnNjcm9sbEJ5PWZ1bmN0aW9uKGEsYil7YiYmdGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcCh0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCkrYiksYSYmdGhpcy5zZXNzaW9uLnNldFNjcm9sbExlZnQodGhpcy5zZXNzaW9uLmdldFNjcm9sbExlZnQoKSthKX0sdGhpcy5pc1Njcm9sbGFibGVCeT1mdW5jdGlvbihhLGIpe2lmKGI8MCYmdGhpcy5zZXNzaW9uLmdldFNjcm9sbFRvcCgpPjApcmV0dXJuITA7aWYoYj4wJiZ0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCkrdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodDx0aGlzLmxheWVyQ29uZmlnLm1heEhlaWdodClyZXR1cm4hMH0sdGhpcy5zY3JlZW5Ub1RleHRDb29yZGluYXRlcz1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuc2Nyb2xsZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD1NYXRoLnJvdW5kKChhK3RoaXMuc2Nyb2xsTGVmdC1jLmxlZnQtdGhpcy4kcGFkZGluZy1lLmdldFBhZ2VTY3JvbGxMZWZ0KCkpL3RoaXMuY2hhcmFjdGVyV2lkdGgpLGY9TWF0aC5mbG9vcigoYit0aGlzLnNjcm9sbFRvcC1jLnRvcC1lLmdldFBhZ2VTY3JvbGxUb3AoKSkvdGhpcy5saW5lSGVpZ2h0KTtyZXR1cm4gdGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihmLE1hdGgubWF4KGQsMCkpfSx0aGlzLnRleHRUb1NjcmVlbkNvb3JkaW5hdGVzPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5zY3JvbGxlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxkPXRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24oYSxiKSxlPXRoaXMuJHBhZGRpbmcrTWF0aC5yb3VuZChkLmNvbHVtbip0aGlzLmNoYXJhY3RlcldpZHRoKSxmPWQucm93KnRoaXMubGluZUhlaWdodDtyZXR1cm57cGFnZVg6Yy5sZWZ0K2UtdGhpcy5zY3JvbGxMZWZ0LHBhZ2VZOmMudG9wK2YtdGhpcy5zY3JvbGxUb3B9fSx0aGlzLnZpc3VhbGl6ZUZvY3VzPWZ1bmN0aW9uKCl7ZS5hZGRDc3NDbGFzcyh0aGlzLmNvbnRhaW5lciwiYWNlX2ZvY3VzIil9LHRoaXMudmlzdWFsaXplQmx1cj1mdW5jdGlvbigpe2UucmVtb3ZlQ3NzQ2xhc3ModGhpcy5jb250YWluZXIsImFjZV9mb2N1cyIpfSx0aGlzLnNob3dDb21wb3NpdGlvbj1mdW5jdGlvbihhKXt0aGlzLiRjb21wb3NpdGlvbnx8KHRoaXMuJGNvbXBvc2l0aW9uPWUuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy4kY29tcG9zaXRpb24uY2xhc3NOYW1lPSJhY2VfY29tcG9zaXRpb24iLHRoaXMuY29udGVudC5hcHBlbmRDaGlsZCh0aGlzLiRjb21wb3NpdGlvbikpLHRoaXMuJGNvbXBvc2l0aW9uLmlubmVySFRNTD0iJiMxNjA7Ijt2YXIgYj10aGlzLiRjdXJzb3JMYXllci5nZXRQaXhlbFBvc2l0aW9uKCksYz10aGlzLiRjb21wb3NpdGlvbi5zdHlsZTtjLnRvcD1iLnRvcCsicHgiLGMubGVmdD1iLmxlZnQrdGhpcy4kcGFkZGluZysicHgiLGMuaGVpZ2h0PXRoaXMubGluZUhlaWdodCsicHgiLHRoaXMuaGlkZUN1cnNvcigpfSx0aGlzLnNldENvbXBvc2l0aW9uVGV4dD1mdW5jdGlvbihhKXtlLnNldElubmVyVGV4dCh0aGlzLiRjb21wb3NpdGlvbixhKX0sdGhpcy5oaWRlQ29tcG9zaXRpb249ZnVuY3Rpb24oKXt0aGlzLnNob3dDdXJzb3IoKTtpZighdGhpcy4kY29tcG9zaXRpb24pcmV0dXJuO3ZhciBhPXRoaXMuJGNvbXBvc2l0aW9uLnN0eWxlO2EudG9wPSItMTAwMDBweCIsYS5sZWZ0PSItMTAwMDBweCJ9LHRoaXMuc2V0VGhlbWU9ZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChhKXtlLmltcG9ydENzc1N0cmluZyhhLmNzc1RleHQsYS5jc3NDbGFzcyxjLmNvbnRhaW5lci5vd25lckRvY3VtZW50KSxjLiR0aGVtZSYmZS5yZW1vdmVDc3NDbGFzcyhjLmNvbnRhaW5lcixjLiR0aGVtZSksYy4kdGhlbWU9YT9hLmNzc0NsYXNzOm51bGwsYy4kdGhlbWUmJmUuYWRkQ3NzQ2xhc3MoYy5jb250YWluZXIsYy4kdGhlbWUpLGEmJmEuaXNEYXJrP2UuYWRkQ3NzQ2xhc3MoYy5jb250YWluZXIsImFjZV9kYXJrIik6ZS5yZW1vdmVDc3NDbGFzcyhjLmNvbnRhaW5lciwiYWNlX2RhcmsiKSxjLiRzaXplJiYoYy4kc2l6ZS53aWR0aD0wLGMub25SZXNpemUoKSl9dmFyIGM9dGhpczt0aGlzLiR0aGVtZVZhbHVlPWIsIWJ8fHR5cGVvZiBiPT0ic3RyaW5nIj8oYj1ifHwiYWNlL3RoZW1lL3RleHRtYXRlIixhKFtiXSxmdW5jdGlvbihhKXtkKGEpfSkpOmQoYil9LHRoaXMuZ2V0VGhlbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdGhlbWVWYWx1ZX0sdGhpcy5zZXRTdHlsZT1mdW5jdGlvbihhKXtlLmFkZENzc0NsYXNzKHRoaXMuY29udGFpbmVyLGEpfSx0aGlzLnVuc2V0U3R5bGU9ZnVuY3Rpb24oYSl7ZS5yZW1vdmVDc3NDbGFzcyh0aGlzLmNvbnRhaW5lcixhKX0sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy4kdGV4dExheWVyLmRlc3Ryb3koKSx0aGlzLiRjdXJzb3JMYXllci5kZXN0cm95KCl9fSkpLmNhbGwocC5wcm90b3R5cGUpLGIuVmlydHVhbFJlbmRlcmVyPXB9KSxkZWZpbmUoImFjZS9sYXllci9ndXR0ZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvZG9tIiksZT1hKCIuLi9saWIvb29wIiksZj1hKCIuLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixnPWZ1bmN0aW9uKGEpe3RoaXMuZWxlbWVudD1kLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZWxlbWVudC5jbGFzc05hbWU9ImFjZV9sYXllciBhY2VfZ3V0dGVyLWxheWVyIixhLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCksdGhpcy5zZXRTaG93Rm9sZFdpZGdldHModGhpcy4kc2hvd0ZvbGRXaWRnZXRzKSx0aGlzLmd1dHRlcldpZHRoPTAsdGhpcy4kYnJlYWtwb2ludHM9W10sdGhpcy4kYW5ub3RhdGlvbnM9W10sdGhpcy4kZGVjb3JhdGlvbnM9W119OygoZnVuY3Rpb24oKXtlLmltcGxlbWVudCh0aGlzLGYpLHRoaXMuc2V0U2Vzc2lvbj1mdW5jdGlvbihhKXt0aGlzLnNlc3Npb249YX0sdGhpcy5hZGRHdXR0ZXJEZWNvcmF0aW9uPWZ1bmN0aW9uKGEsYil7dGhpcy4kZGVjb3JhdGlvbnNbYV18fCh0aGlzLiRkZWNvcmF0aW9uc1thXT0iIiksdGhpcy4kZGVjb3JhdGlvbnNbYV0rPSIgYWNlXyIrYn0sdGhpcy5yZW1vdmVHdXR0ZXJEZWNvcmF0aW9uPWZ1bmN0aW9uKGEsYil7dGhpcy4kZGVjb3JhdGlvbnNbYV09dGhpcy4kZGVjb3JhdGlvbnNbYV0ucmVwbGFjZSgiIGFjZV8iK2IsIiIpfSx0aGlzLnNldEJyZWFrcG9pbnRzPWZ1bmN0aW9uKGEpe3RoaXMuJGJyZWFrcG9pbnRzPWEuY29uY2F0KCl9LHRoaXMuc2V0QW5ub3RhdGlvbnM9ZnVuY3Rpb24oYSl7dGhpcy4kYW5ub3RhdGlvbnM9W107Zm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXTtpZighYyljb250aW51ZTt2YXIgZD10aGlzLiRhbm5vdGF0aW9uc1tiXT17dGV4dDpbXX07Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWNbZV0sZz1mLnRleHQucmVwbGFjZSgvIi9nLCImcXVvdDsiKS5yZXBsYWNlKC8nL2csIiYjODIxNzsiKS5yZXBsYWNlKC88LywiJmx0OyIpO2QudGV4dC5pbmRleE9mKGcpPT09LTEmJmQudGV4dC5wdXNoKGcpO3ZhciBoPWYudHlwZTtoPT0iZXJyb3IiP2QuY2xhc3NOYW1lPSJhY2VfZXJyb3IiOmg9PSJ3YXJuaW5nIiYmZC5jbGFzc05hbWUhPSJhY2VfZXJyb3IiP2QuY2xhc3NOYW1lPSJhY2Vfd2FybmluZyI6aD09ImluZm8iJiYhZC5jbGFzc05hbWUmJihkLmNsYXNzTmFtZT0iYWNlX2luZm8iKX19fSx0aGlzLnVwZGF0ZT1mdW5jdGlvbihhKXt0aGlzLiRjb25maWc9YTt2YXIgYj17Y2xhc3NOYW1lOiIiLHRleHQ6W119LGM9W10sZT1hLmZpcnN0Um93LGY9YS5sYXN0Um93LGc9dGhpcy5zZXNzaW9uLmdldE5leHRGb2xkTGluZShlKSxoPWc/Zy5zdGFydC5yb3c6SW5maW5pdHksaT10aGlzLiRzaG93Rm9sZFdpZGdldHMmJnRoaXMuc2Vzc2lvbi5mb2xkV2lkZ2V0cztmb3IoOzspe2U+aCYmKGU9Zy5lbmQucm93KzEsZz10aGlzLnNlc3Npb24uZ2V0TmV4dEZvbGRMaW5lKGUsZyksaD1nP2cuc3RhcnQucm93OkluZmluaXR5KTtpZihlPmYpYnJlYWs7dmFyIGo9dGhpcy4kYW5ub3RhdGlvbnNbZV18fGI7Yy5wdXNoKCI8ZGl2IGNsYXNzPSdhY2VfZ3V0dGVyLWNlbGwiLHRoaXMuJGRlY29yYXRpb25zW2VdfHwiIix0aGlzLiRicmVha3BvaW50c1tlXT8iIGFjZV9icmVha3BvaW50ICI6IiAiLGouY2xhc3NOYW1lLCInIHRpdGxlPSciLGoudGV4dC5qb2luKCJcbiIpLCInIHN0eWxlPSdoZWlnaHQ6IixhLmxpbmVIZWlnaHQsInB4Oyc+IixlKzEpO2lmKGkpe3ZhciBrPWlbZV07az09bnVsbCYmKGs9aVtlXT10aGlzLnNlc3Npb24uZ2V0Rm9sZFdpZGdldChlKSksayYmYy5wdXNoKCI8c3BhbiBjbGFzcz0nYWNlX2ZvbGQtd2lkZ2V0ICIsayxrPT0ic3RhcnQiJiZlPT1oJiZlPGcuZW5kLnJvdz8iIGNsb3NlZCI6IiBvcGVuIiwiJz48L3NwYW4+Iil9dmFyIGw9dGhpcy5zZXNzaW9uLmdldFJvd0xlbmd0aChlKS0xO3doaWxlKGwtLSljLnB1c2goIjwvZGl2PjxkaXYgY2xhc3M9J2FjZV9ndXR0ZXItY2VsbCcgc3R5bGU9J2hlaWdodDoiLGEubGluZUhlaWdodCwicHgnPsKmIik7Yy5wdXNoKCI8L2Rpdj4iKSxlKyt9dGhpcy5lbGVtZW50PWQuc2V0SW5uZXJIdG1sKHRoaXMuZWxlbWVudCxjLmpvaW4oIiIpKSx0aGlzLmVsZW1lbnQuc3R5bGUuaGVpZ2h0PWEubWluSGVpZ2h0KyJweCI7dmFyIG09dGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoO20hPT10aGlzLmd1dHRlcldpZHRoJiYodGhpcy5ndXR0ZXJXaWR0aD1tLHRoaXMuX2VtaXQoImNoYW5nZUd1dHRlcldpZHRoIixtKSl9LHRoaXMuJHNob3dGb2xkV2lkZ2V0cz0hMCx0aGlzLnNldFNob3dGb2xkV2lkZ2V0cz1mdW5jdGlvbihhKXthP2QuYWRkQ3NzQ2xhc3ModGhpcy5lbGVtZW50LCJhY2VfZm9sZGluZy1lbmFibGVkIik6ZC5yZW1vdmVDc3NDbGFzcyh0aGlzLmVsZW1lbnQsImFjZV9mb2xkaW5nLWVuYWJsZWQiKSx0aGlzLiRzaG93Rm9sZFdpZGdldHM9YX0sdGhpcy5nZXRTaG93Rm9sZFdpZGdldHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc2hvd0ZvbGRXaWRnZXRzfX0pKS5jYWxsKGcucHJvdG90eXBlKSxiLkd1dHRlcj1nfSksZGVmaW5lKCJhY2UvbGF5ZXIvbWFya2VyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3JhbmdlIikuUmFuZ2UsZT1hKCIuLi9saWIvZG9tIiksZj1mdW5jdGlvbihhKXt0aGlzLmVsZW1lbnQ9ZS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmVsZW1lbnQuY2xhc3NOYW1lPSJhY2VfbGF5ZXIgYWNlX21hcmtlci1sYXllciIsYS5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpfTsoKGZ1bmN0aW9uKCl7dGhpcy4kcGFkZGluZz0wLHRoaXMuc2V0UGFkZGluZz1mdW5jdGlvbihhKXt0aGlzLiRwYWRkaW5nPWF9LHRoaXMuc2V0U2Vzc2lvbj1mdW5jdGlvbihhKXt0aGlzLnNlc3Npb249YX0sdGhpcy5zZXRNYXJrZXJzPWZ1bmN0aW9uKGEpe3RoaXMubWFya2Vycz1hfSx0aGlzLnVwZGF0ZT1mdW5jdGlvbihhKXt2YXIgYT1hfHx0aGlzLmNvbmZpZztpZighYSlyZXR1cm47dGhpcy5jb25maWc9YTt2YXIgYj1bXTtmb3IodmFyIGMgaW4gdGhpcy5tYXJrZXJzKXt2YXIgZD10aGlzLm1hcmtlcnNbY10sZj1kLnJhbmdlLmNsaXBSb3dzKGEuZmlyc3RSb3csYS5sYXN0Um93KTtpZihmLmlzRW1wdHkoKSljb250aW51ZTtmPWYudG9TY3JlZW5SYW5nZSh0aGlzLnNlc3Npb24pO2lmKGQucmVuZGVyZXIpe3ZhciBnPXRoaXMuJGdldFRvcChmLnN0YXJ0LnJvdyxhKSxoPU1hdGgucm91bmQodGhpcy4kcGFkZGluZytmLnN0YXJ0LmNvbHVtbiphLmNoYXJhY3RlcldpZHRoKTtkLnJlbmRlcmVyKGIsZixoLGcsYSl9ZWxzZSBmLmlzTXVsdGlMaW5lKCk/ZC50eXBlPT0idGV4dCI/dGhpcy5kcmF3VGV4dE1hcmtlcihiLGYsZC5jbGF6eixhKTp0aGlzLmRyYXdNdWx0aUxpbmVNYXJrZXIoYixmLGQuY2xhenosYSxkLnR5cGUpOnRoaXMuZHJhd1NpbmdsZUxpbmVNYXJrZXIoYixmLGQuY2xhenosYSxudWxsLGQudHlwZSl9dGhpcy5lbGVtZW50PWUuc2V0SW5uZXJIdG1sKHRoaXMuZWxlbWVudCxiLmpvaW4oIiIpKX0sdGhpcy4kZ2V0VG9wPWZ1bmN0aW9uKGEsYil7cmV0dXJuKGEtYi5maXJzdFJvd1NjcmVlbikqYi5saW5lSGVpZ2h0fSx0aGlzLmRyYXdUZXh0TWFya2VyPWZ1bmN0aW9uKGEsYixjLGUpe3ZhciBmPWIuc3RhcnQucm93LGc9bmV3IGQoZixiLnN0YXJ0LmNvbHVtbixmLHRoaXMuc2Vzc2lvbi5nZXRTY3JlZW5MYXN0Um93Q29sdW1uKGYpKTt0aGlzLmRyYXdTaW5nbGVMaW5lTWFya2VyKGEsZyxjLGUsMSwidGV4dCIpLGY9Yi5lbmQucm93LGc9bmV3IGQoZiwwLGYsYi5lbmQuY29sdW1uKSx0aGlzLmRyYXdTaW5nbGVMaW5lTWFya2VyKGEsZyxjLGUsMCwidGV4dCIpO2ZvcihmPWIuc3RhcnQucm93KzE7ZjxiLmVuZC5yb3c7ZisrKWcuc3RhcnQucm93PWYsZy5lbmQucm93PWYsZy5lbmQuY29sdW1uPXRoaXMuc2Vzc2lvbi5nZXRTY3JlZW5MYXN0Um93Q29sdW1uKGYpLHRoaXMuZHJhd1NpbmdsZUxpbmVNYXJrZXIoYSxnLGMsZSwxLCJ0ZXh0Iil9LHRoaXMuZHJhd011bHRpTGluZU1hcmtlcj1mdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWU9PT0iYmFja2dyb3VuZCI/MDp0aGlzLiRwYWRkaW5nLGc9ZC53aWR0aCsyKnRoaXMuJHBhZGRpbmctZixoPWQubGluZUhlaWdodCxpPU1hdGgucm91bmQoZy1iLnN0YXJ0LmNvbHVtbipkLmNoYXJhY3RlcldpZHRoKSxqPXRoaXMuJGdldFRvcChiLnN0YXJ0LnJvdyxkKSxrPU1hdGgucm91bmQoZitiLnN0YXJ0LmNvbHVtbipkLmNoYXJhY3RlcldpZHRoKTthLnB1c2goIjxkaXYgY2xhc3M9JyIsYywiJyBzdHlsZT0nIiwiaGVpZ2h0OiIsaCwicHg7Iiwid2lkdGg6IixpLCJweDsiLCJ0b3A6IixqLCJweDsiLCJsZWZ0OiIsaywicHg7Jz48L2Rpdj4iKSxqPXRoaXMuJGdldFRvcChiLmVuZC5yb3csZCksaT1NYXRoLnJvdW5kKGIuZW5kLmNvbHVtbipkLmNoYXJhY3RlcldpZHRoKSxhLnB1c2goIjxkaXYgY2xhc3M9JyIsYywiJyBzdHlsZT0nIiwiaGVpZ2h0OiIsaCwicHg7Iiwid2lkdGg6IixpLCJweDsiLCJ0b3A6IixqLCJweDsiLCJsZWZ0OiIsZiwicHg7Jz48L2Rpdj4iKSxoPShiLmVuZC5yb3ctYi5zdGFydC5yb3ctMSkqZC5saW5lSGVpZ2h0O2lmKGg8MClyZXR1cm47aj10aGlzLiRnZXRUb3AoYi5zdGFydC5yb3crMSxkKSxhLnB1c2goIjxkaXYgY2xhc3M9JyIsYywiJyBzdHlsZT0nIiwiaGVpZ2h0OiIsaCwicHg7Iiwid2lkdGg6IixnLCJweDsiLCJ0b3A6IixqLCJweDsiLCJsZWZ0OiIsZiwicHg7Jz48L2Rpdj4iKX0sdGhpcy5kcmF3U2luZ2xlTGluZU1hcmtlcj1mdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGc9Zj09PSJiYWNrZ3JvdW5kIj8wOnRoaXMuJHBhZGRpbmcsaD1kLmxpbmVIZWlnaHQ7aWYoZj09PSJiYWNrZ3JvdW5kIil2YXIgaT1kLndpZHRoO2Vsc2UgaT1NYXRoLnJvdW5kKChiLmVuZC5jb2x1bW4rKGV8fDApLWIuc3RhcnQuY29sdW1uKSpkLmNoYXJhY3RlcldpZHRoKTt2YXIgaj10aGlzLiRnZXRUb3AoYi5zdGFydC5yb3csZCksaz1NYXRoLnJvdW5kKGcrYi5zdGFydC5jb2x1bW4qZC5jaGFyYWN0ZXJXaWR0aCk7YS5wdXNoKCI8ZGl2IGNsYXNzPSciLGMsIicgc3R5bGU9JyIsImhlaWdodDoiLGgsInB4OyIsIndpZHRoOiIsaSwicHg7IiwidG9wOiIsaiwicHg7IiwibGVmdDoiLGssInB4Oyc+PC9kaXY+Iil9fSkpLmNhbGwoZi5wcm90b3R5cGUpLGIuTWFya2VyPWZ9KSxkZWZpbmUoImFjZS9sYXllci90ZXh0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2RvbSIsImFjZS9saWIvbGFuZyIsImFjZS9saWIvdXNlcmFnZW50IiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvZG9tIiksZj1hKCIuLi9saWIvbGFuZyIpLGc9YSgiLi4vbGliL3VzZXJhZ2VudCIpLGg9YSgiLi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsaT1mdW5jdGlvbihhKXt0aGlzLmVsZW1lbnQ9ZS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmVsZW1lbnQuY2xhc3NOYW1lPSJhY2VfbGF5ZXIgYWNlX3RleHQtbGF5ZXIiLGEuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KSx0aGlzLiRjaGFyYWN0ZXJTaXplPXRoaXMuJG1lYXN1cmVTaXplcygpfHx7d2lkdGg6MCxoZWlnaHQ6MH0sdGhpcy4kcG9sbFNpemVDaGFuZ2VzKCl9OygoZnVuY3Rpb24oKXtkLmltcGxlbWVudCh0aGlzLGgpLHRoaXMuRU9GX0NIQVI9IsK2Iix0aGlzLkVPTF9DSEFSPSLCrCIsdGhpcy5UQUJfQ0hBUj0i4oaSIix0aGlzLlNQQUNFX0NIQVI9IsK3Iix0aGlzLiRwYWRkaW5nPTAsdGhpcy5zZXRQYWRkaW5nPWZ1bmN0aW9uKGEpe3RoaXMuJHBhZGRpbmc9YSx0aGlzLmVsZW1lbnQuc3R5bGUucGFkZGluZz0iMCAiK2ErInB4In0sdGhpcy5nZXRMaW5lSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGNoYXJhY3RlclNpemUuaGVpZ2h0fHwxfSx0aGlzLmdldENoYXJhY3RlcldpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGNoYXJhY3RlclNpemUud2lkdGh8fDF9LHRoaXMuY2hlY2tGb3JTaXplQ2hhbmdlcz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuJG1lYXN1cmVTaXplcygpO2EmJih0aGlzLiRjaGFyYWN0ZXJTaXplLndpZHRoIT09YS53aWR0aHx8dGhpcy4kY2hhcmFjdGVyU2l6ZS5oZWlnaHQhPT1hLmhlaWdodCkmJih0aGlzLiRjaGFyYWN0ZXJTaXplPWEsdGhpcy5fZW1pdCgiY2hhbmdlQ2hhcmFjdGVyU2l6ZSIse2RhdGE6YX0pKX0sdGhpcy4kcG9sbFNpemVDaGFuZ2VzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLiRwb2xsU2l6ZUNoYW5nZXNUaW1lcj1zZXRJbnRlcnZhbChmdW5jdGlvbigpe2EuY2hlY2tGb3JTaXplQ2hhbmdlcygpfSw1MDApfSx0aGlzLiRmb250U3R5bGVzPXtmb250RmFtaWx5OjEsZm9udFNpemU6MSxmb250V2VpZ2h0OjEsZm9udFN0eWxlOjEsbGluZUhlaWdodDoxfSx0aGlzLiRtZWFzdXJlU2l6ZXM9ZnVuY3Rpb24oKXt2YXIgYT0xZTM7aWYoIXRoaXMuJG1lYXN1cmVOb2RlKXt2YXIgYj10aGlzLiRtZWFzdXJlTm9kZT1lLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9Yi5zdHlsZTtjLndpZHRoPWMuaGVpZ2h0PSJhdXRvIixjLmxlZnQ9Yy50b3A9LWEqNDArInB4IixjLnZpc2liaWxpdHk9ImhpZGRlbiIsYy5wb3NpdGlvbj0iYWJzb2x1dGUiLGMub3ZlcmZsb3c9InZpc2libGUiLGMud2hpdGVTcGFjZT0ibm93cmFwIixiLmlubmVySFRNTD1mLnN0cmluZ1JlcGVhdCgiWHkiLGEpO2lmKHRoaXMuZWxlbWVudC5vd25lckRvY3VtZW50LmJvZHkpdGhpcy5lbGVtZW50Lm93bmVyRG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTtlbHNle3ZhciBkPXRoaXMuZWxlbWVudC5wYXJlbnROb2RlO3doaWxlKCFlLmhhc0Nzc0NsYXNzKGQsImFjZV9lZGl0b3IiKSlkPWQucGFyZW50Tm9kZTtkLmFwcGVuZENoaWxkKGIpfX12YXIgYz10aGlzLiRtZWFzdXJlTm9kZS5zdHlsZSxnPWUuY29tcHV0ZWRTdHlsZSh0aGlzLmVsZW1lbnQpO2Zvcih2YXIgaCBpbiB0aGlzLiRmb250U3R5bGVzKWNbaF09Z1toXTt2YXIgaT17aGVpZ2h0OnRoaXMuJG1lYXN1cmVOb2RlLm9mZnNldEhlaWdodCx3aWR0aDp0aGlzLiRtZWFzdXJlTm9kZS5vZmZzZXRXaWR0aC8oYSoyKX07cmV0dXJuIGkud2lkdGg9PTAmJmkuaGVpZ2h0PT0wP251bGw6aX0sdGhpcy5zZXRTZXNzaW9uPWZ1bmN0aW9uKGEpe3RoaXMuc2Vzc2lvbj1hfSx0aGlzLnNob3dJbnZpc2libGVzPSExLHRoaXMuc2V0U2hvd0ludmlzaWJsZXM9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc2hvd0ludmlzaWJsZXM9PWE/ITE6KHRoaXMuc2hvd0ludmlzaWJsZXM9YSwhMCl9LHRoaXMuJHRhYlN0cmluZ3M9W10sdGhpcy4kY29tcHV0ZVRhYlN0cmluZz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuc2Vzc2lvbi5nZXRUYWJTaXplKCksYj10aGlzLiR0YWJTdHJpbmdzPVswXTtmb3IodmFyIGM9MTtjPGErMTtjKyspdGhpcy5zaG93SW52aXNpYmxlcz9iLnB1c2goIjxzcGFuIGNsYXNzPSdhY2VfaW52aXNpYmxlJz4iK3RoaXMuVEFCX0NIQVIrKG5ldyBBcnJheShjKSkuam9pbigiJiMxNjA7IikrIjwvc3Bhbj4iKTpiLnB1c2goKG5ldyBBcnJheShjKzEpKS5qb2luKCImIzE2MDsiKSl9LHRoaXMudXBkYXRlTGluZXM9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJGNvbXB1dGVUYWJTdHJpbmcoKSwodGhpcy5jb25maWcubGFzdFJvdyE9YS5sYXN0Um93fHx0aGlzLmNvbmZpZy5maXJzdFJvdyE9YS5maXJzdFJvdykmJnRoaXMuc2Nyb2xsTGluZXMoYSksdGhpcy5jb25maWc9YTt2YXIgZD1NYXRoLm1heChiLGEuZmlyc3RSb3cpLGY9TWF0aC5taW4oYyxhLmxhc3RSb3cpLGc9dGhpcy5lbGVtZW50LmNoaWxkTm9kZXMsaD0wO2Zvcih2YXIgaT1hLmZpcnN0Um93O2k8ZDtpKyspe3ZhciBqPXRoaXMuc2Vzc2lvbi5nZXRGb2xkTGluZShpKTtpZihqKXtpZihqLmNvbnRhaW5zUm93KGQpKXtkPWouc3RhcnQucm93O2JyZWFrfWk9ai5lbmQucm93fWgrK31mb3IodmFyIGs9ZDtrPD1mO2srKyl7dmFyIGw9Z1toKytdO2lmKCFsKWNvbnRpbnVlO3ZhciBtPVtdLG49dGhpcy5zZXNzaW9uLmdldFRva2VucyhrLGspO3RoaXMuJHJlbmRlckxpbmUobSxrLG5bMF0udG9rZW5zLCF0aGlzLiR1c2VMaW5lR3JvdXBzKCkpLGw9ZS5zZXRJbm5lckh0bWwobCxtLmpvaW4oIiIpKSxrPXRoaXMuc2Vzc2lvbi5nZXRSb3dGb2xkRW5kKGspfX0sdGhpcy5zY3JvbGxMaW5lcz1mdW5jdGlvbihhKXt0aGlzLiRjb21wdXRlVGFiU3RyaW5nKCk7dmFyIGI9dGhpcy5jb25maWc7dGhpcy5jb25maWc9YTtpZighYnx8Yi5sYXN0Um93PGEuZmlyc3RSb3cpcmV0dXJuIHRoaXMudXBkYXRlKGEpO2lmKGEubGFzdFJvdzxiLmZpcnN0Um93KXJldHVybiB0aGlzLnVwZGF0ZShhKTt2YXIgYz10aGlzLmVsZW1lbnQ7aWYoYi5maXJzdFJvdzxhLmZpcnN0Um93KWZvcih2YXIgZD10aGlzLnNlc3Npb24uZ2V0Rm9sZGVkUm93Q291bnQoYi5maXJzdFJvdyxhLmZpcnN0Um93LTEpO2Q+MDtkLS0pYy5yZW1vdmVDaGlsZChjLmZpcnN0Q2hpbGQpO2lmKGIubGFzdFJvdz5hLmxhc3RSb3cpZm9yKHZhciBkPXRoaXMuc2Vzc2lvbi5nZXRGb2xkZWRSb3dDb3VudChhLmxhc3RSb3crMSxiLmxhc3RSb3cpO2Q+MDtkLS0pYy5yZW1vdmVDaGlsZChjLmxhc3RDaGlsZCk7aWYoYS5maXJzdFJvdzxiLmZpcnN0Um93KXt2YXIgZT10aGlzLiRyZW5kZXJMaW5lc0ZyYWdtZW50KGEsYS5maXJzdFJvdyxiLmZpcnN0Um93LTEpO2MuZmlyc3RDaGlsZD9jLmluc2VydEJlZm9yZShlLGMuZmlyc3RDaGlsZCk6Yy5hcHBlbmRDaGlsZChlKX1pZihhLmxhc3RSb3c+Yi5sYXN0Um93KXt2YXIgZT10aGlzLiRyZW5kZXJMaW5lc0ZyYWdtZW50KGEsYi5sYXN0Um93KzEsYS5sYXN0Um93KTtjLmFwcGVuZENoaWxkKGUpfX0sdGhpcy4kcmVuZGVyTGluZXNGcmFnbWVudD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5lbGVtZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGY9YixnPXRoaXMuc2Vzc2lvbi5nZXROZXh0Rm9sZExpbmUoZiksaD1nP2cuc3RhcnQucm93OkluZmluaXR5O2Zvcig7Oyl7Zj5oJiYoZj1nLmVuZC5yb3crMSxnPXRoaXMuc2Vzc2lvbi5nZXROZXh0Rm9sZExpbmUoZixnKSxoPWc/Zy5zdGFydC5yb3c6SW5maW5pdHkpO2lmKGY+YylicmVhazt2YXIgaT1lLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGo9W10saz10aGlzLnNlc3Npb24uZ2V0VG9rZW5zKGYsZik7ay5sZW5ndGg9PTEmJnRoaXMuJHJlbmRlckxpbmUoaixmLGtbMF0udG9rZW5zLCExKSxpLmlubmVySFRNTD1qLmpvaW4oIiIpO2lmKHRoaXMuJHVzZUxpbmVHcm91cHMoKSlpLmNsYXNzTmFtZT0iYWNlX2xpbmVfZ3JvdXAiLGQuYXBwZW5kQ2hpbGQoaSk7ZWxzZXt2YXIgbD1pLmNoaWxkTm9kZXM7d2hpbGUobC5sZW5ndGgpZC5hcHBlbmRDaGlsZChsWzBdKX1mKyt9cmV0dXJuIGR9LHRoaXMudXBkYXRlPWZ1bmN0aW9uKGEpe3RoaXMuJGNvbXB1dGVUYWJTdHJpbmcoKSx0aGlzLmNvbmZpZz1hO3ZhciBiPVtdLGM9YS5maXJzdFJvdyxkPWEubGFzdFJvdyxmPWMsZz10aGlzLnNlc3Npb24uZ2V0TmV4dEZvbGRMaW5lKGYpLGg9Zz9nLnN0YXJ0LnJvdzpJbmZpbml0eTtmb3IoOzspe2Y+aCYmKGY9Zy5lbmQucm93KzEsZz10aGlzLnNlc3Npb24uZ2V0TmV4dEZvbGRMaW5lKGYsZyksaD1nP2cuc3RhcnQucm93OkluZmluaXR5KTtpZihmPmQpYnJlYWs7dGhpcy4kdXNlTGluZUdyb3VwcygpJiZiLnB1c2goIjxkaXYgY2xhc3M9J2FjZV9saW5lX2dyb3VwJz4iKTt2YXIgaT10aGlzLnNlc3Npb24uZ2V0VG9rZW5zKGYsZik7aS5sZW5ndGg9PTEmJnRoaXMuJHJlbmRlckxpbmUoYixmLGlbMF0udG9rZW5zLCExKSx0aGlzLiR1c2VMaW5lR3JvdXBzKCkmJmIucHVzaCgiPC9kaXY+IiksZisrfXRoaXMuZWxlbWVudD1lLnNldElubmVySHRtbCh0aGlzLmVsZW1lbnQsYi5qb2luKCIiKSl9LHRoaXMuJHRleHRUb2tlbj17dGV4dDohMCxycGFyZW46ITAsbHBhcmVuOiEwfSx0aGlzLiRyZW5kZXJUb2tlbj1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT10aGlzLGY9L1x0fCZ8PHwoICspfChbXHZcZiBcdTAwYTBcdTIwMDBcdTIwMDFcdTIwMDJcdTIwMDNcdTIwMDRcdTIwMDVcdTIwMDZcdTIwMDdcdTIwMDhcdTIwMDlcdTIwMGFcdTIwMGJcdTIwMjhcdTIwMjlcdTMwMDBdKXxbXHUxMTAwLVx1MTE1Rl18W1x1MTFBMy1cdTExQTddfFtcdTExRkEtXHUxMUZGXXxbXHUyMzI5LVx1MjMyQV18W1x1MkU4MC1cdTJFOTldfFtcdTJFOUItXHUyRUYzXXxbXHUyRjAwLVx1MkZENV18W1x1MkZGMC1cdTJGRkJdfFtcdTMwMDAtXHUzMDNFXXxbXHUzMDQxLVx1MzA5Nl18W1x1MzA5OS1cdTMwRkZdfFtcdTMxMDUtXHUzMTJEXXxbXHUzMTMxLVx1MzE4RV18W1x1MzE5MC1cdTMxQkFdfFtcdTMxQzAtXHUzMUUzXXxbXHUzMUYwLVx1MzIxRV18W1x1MzIyMC1cdTMyNDddfFtcdTMyNTAtXHUzMkZFXXxbXHUzMzAwLVx1NERCRl18W1x1NEUwMC1cdUE0OENdfFtcdUE0OTAtXHVBNEM2XXxbXHVBOTYwLVx1QTk3Q118W1x1QUMwMC1cdUQ3QTNdfFtcdUQ3QjAtXHVEN0M2XXxbXHVEN0NCLVx1RDdGQl18W1x1RjkwMC1cdUZBRkZdfFtcdUZFMTAtXHVGRTE5XXxbXHVGRTMwLVx1RkU1Ml18W1x1RkU1NC1cdUZFNjZdfFtcdUZFNjgtXHVGRTZCXXxbXHVGRjAxLVx1RkY2MF18W1x1RkZFMC1cdUZGRTZdL2csaD1mdW5jdGlvbihhLGMsZCxmLGgpe2lmKGEuY2hhckNvZGVBdCgwKT09MzIpcmV0dXJuKG5ldyBBcnJheShhLmxlbmd0aCsxKSkuam9pbigiJiMxNjA7Iik7aWYoYT09Ilx0Iil7dmFyIGk9ZS5zZXNzaW9uLmdldFNjcmVlblRhYlNpemUoYitmKTtyZXR1cm4gYis9aS0xLGUuJHRhYlN0cmluZ3NbaV19aWYoYT09IiYiKXJldHVybiBnLmlzT2xkR2Vja28/IiYiOiImYW1wOyI7aWYoYT09IjwiKXJldHVybiImbHQ7IjtpZihhPT0i44CAIil7dmFyIGo9ZS5zaG93SW52aXNpYmxlcz8iYWNlX2NqayBhY2VfaW52aXNpYmxlIjoiYWNlX2NqayIsaz1lLnNob3dJbnZpc2libGVzP2UuU1BBQ0VfQ0hBUjoiIjtyZXR1cm4gYis9MSwiPHNwYW4gY2xhc3M9JyIraisiJyBzdHlsZT0nd2lkdGg6IitlLmNvbmZpZy5jaGFyYWN0ZXJXaWR0aCoyKyJweCc+IitrKyI8L3NwYW4+In1pZihhLm1hdGNoKC9bXHZcZiBcdTAwYTBcdTIwMDBcdTIwMDFcdTIwMDJcdTIwMDNcdTIwMDRcdTIwMDVcdTIwMDZcdTIwMDdcdTIwMDhcdTIwMDlcdTIwMGFcdTIwMGJcdTIwMjhcdTIwMjlcdTMwMDBdLykpe2lmKGUuc2hvd0ludmlzaWJsZXMpe3ZhciBrPShuZXcgQXJyYXkoYS5sZW5ndGgrMSkpLmpvaW4oZS5TUEFDRV9DSEFSKTtyZXR1cm4iPHNwYW4gY2xhc3M9J2FjZV9pbnZpc2libGUnPiIraysiPC9zcGFuPiJ9cmV0dXJuIiYjMTYwOyJ9cmV0dXJuIGIrPTEsIjxzcGFuIGNsYXNzPSdhY2VfY2prJyBzdHlsZT0nd2lkdGg6IitlLmNvbmZpZy5jaGFyYWN0ZXJXaWR0aCoyKyJweCc+IithKyI8L3NwYW4+In0saT1kLnJlcGxhY2UoZixoKTtpZighdGhpcy4kdGV4dFRva2VuW2MudHlwZV0pe3ZhciBqPSJhY2VfIitjLnR5cGUucmVwbGFjZSgvXC4vZywiIGFjZV8iKSxrPSIiO2MudHlwZT09ImZvbGQiJiYoaz0iIHN0eWxlPSd3aWR0aDoiK2MudmFsdWUubGVuZ3RoKnRoaXMuY29uZmlnLmNoYXJhY3RlcldpZHRoKyJweDsnICIpLGEucHVzaCgiPHNwYW4gY2xhc3M9JyIsaiwiJyIsaywiPiIsaSwiPC9zcGFuPiIpfWVsc2UgYS5wdXNoKGkpO3JldHVybiBiK2QubGVuZ3RofSx0aGlzLiRyZW5kZXJMaW5lQ29yZT1mdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPTAsZz0wLGgsaT0wLGo9dGhpczshZHx8ZC5sZW5ndGg9PTA/aD1OdW1iZXIuTUFYX1ZBTFVFOmg9ZFswXSxlfHxhLnB1c2goIjxkaXYgY2xhc3M9J2FjZV9saW5lJyBzdHlsZT0naGVpZ2h0OiIsdGhpcy5jb25maWcubGluZUhlaWdodCwicHgiLCInPiIpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKXt2YXIgbD1jW2tdLG09bC52YWx1ZTtpZihmK20ubGVuZ3RoPGgpaT1qLiRyZW5kZXJUb2tlbihhLGksbCxtKSxmKz1tLmxlbmd0aDtlbHNle3doaWxlKGYrbS5sZW5ndGg+PWgpaT1qLiRyZW5kZXJUb2tlbihhLGksbCxtLnN1YnN0cmluZygwLGgtZikpLG09bS5zdWJzdHJpbmcoaC1mKSxmPWgsZXx8YS5wdXNoKCI8L2Rpdj4iLCI8ZGl2IGNsYXNzPSdhY2VfbGluZScgc3R5bGU9J2hlaWdodDoiLHRoaXMuY29uZmlnLmxpbmVIZWlnaHQsInB4IiwiJz4iKSxnKyssaT0wLGg9ZFtnXXx8TnVtYmVyLk1BWF9WQUxVRTttLmxlbmd0aCE9MCYmKGYrPW0ubGVuZ3RoLGk9ai4kcmVuZGVyVG9rZW4oYSxpLGwsbSkpfX10aGlzLnNob3dJbnZpc2libGVzJiYoYiE9PXRoaXMuc2Vzc2lvbi5nZXRMZW5ndGgoKS0xP2EucHVzaCgiPHNwYW4gY2xhc3M9J2FjZV9pbnZpc2libGUnPiIrdGhpcy5FT0xfQ0hBUisiPC9zcGFuPiIpOmEucHVzaCgiPHNwYW4gY2xhc3M9J2FjZV9pbnZpc2libGUnPiIrdGhpcy5FT0ZfQ0hBUisiPC9zcGFuPiIpKSxlfHxhLnB1c2goIjwvZGl2PiIpfSx0aGlzLiRyZW5kZXJMaW5lPWZ1bmN0aW9uKGEsYixjLGQpe2lmKCF0aGlzLnNlc3Npb24uaXNSb3dGb2xkZWQoYikpe3ZhciBlPXRoaXMuc2Vzc2lvbi5nZXRSb3dTcGxpdERhdGEoYik7dGhpcy4kcmVuZGVyTGluZUNvcmUoYSxiLGMsZSxkKX1lbHNlIHRoaXMuJHJlbmRlckZvbGRMaW5lKGEsYixjLGQpfSx0aGlzLiRyZW5kZXJGb2xkTGluZT1mdW5jdGlvbihhLGIsYyxkKXtmdW5jdGlvbiBoKGEsYixjKXt2YXIgZD0wLGU9MDt3aGlsZShlK2FbZF0udmFsdWUubGVuZ3RoPGIpe2UrPWFbZF0udmFsdWUubGVuZ3RoLGQrKztpZihkPT1hLmxlbmd0aClyZXR1cm59aWYoZSE9Yil7dmFyIGY9YVtkXS52YWx1ZS5zdWJzdHJpbmcoYi1lKTtmLmxlbmd0aD5jLWImJihmPWYuc3Vic3RyaW5nKDAsYy1iKSksZy5wdXNoKHt0eXBlOmFbZF0udHlwZSx2YWx1ZTpmfSksZT1iK2YubGVuZ3RoLGQrPTF9d2hpbGUoZTxjKXt2YXIgZj1hW2RdLnZhbHVlO2YubGVuZ3RoK2U+YyYmKGY9Zi5zdWJzdHJpbmcoMCxjLWUpKSxnLnB1c2goe3R5cGU6YVtkXS50eXBlLHZhbHVlOmZ9KSxlKz1mLmxlbmd0aCxkKz0xfX12YXIgZT10aGlzLnNlc3Npb24sZj1lLmdldEZvbGRMaW5lKGIpLGc9W107Zi53YWxrKGZ1bmN0aW9uKGEsYixkLGUsZil7YT9nLnB1c2goe3R5cGU6ImZvbGQiLHZhbHVlOmF9KTooZiYmKGM9dGhpcy5zZXNzaW9uLmdldFRva2VucyhiLGIpWzBdLnRva2VucyksYy5sZW5ndGghPTAmJmgoYyxlLGQpKX0uYmluZCh0aGlzKSxmLmVuZC5yb3csdGhpcy5zZXNzaW9uLmdldExpbmUoZi5lbmQucm93KS5sZW5ndGgpO3ZhciBpPXRoaXMuc2Vzc2lvbi4kdXNlV3JhcE1vZGU/dGhpcy5zZXNzaW9uLiR3cmFwRGF0YVtiXTpudWxsO3RoaXMuJHJlbmRlckxpbmVDb3JlKGEsYixnLGksZCl9LHRoaXMuJHVzZUxpbmVHcm91cHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXNzaW9uLmdldFVzZVdyYXBNb2RlKCl9LHRoaXMuZGVzdHJveT1mdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwodGhpcy4kcG9sbFNpemVDaGFuZ2VzVGltZXIpLHRoaXMuJG1lYXN1cmVOb2RlJiZ0aGlzLiRtZWFzdXJlTm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuJG1lYXN1cmVOb2RlKSxkZWxldGUgdGhpcy4kbWVhc3VyZU5vZGV9fSkpLmNhbGwoaS5wcm90b3R5cGUpLGIuVGV4dD1pfSksZGVmaW5lKCJhY2UvbGF5ZXIvY3Vyc29yIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9kb20iKSxlPWZ1bmN0aW9uKGEpe3RoaXMuZWxlbWVudD1kLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZWxlbWVudC5jbGFzc05hbWU9ImFjZV9sYXllciBhY2VfY3Vyc29yLWxheWVyIixhLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCksdGhpcy5jdXJzb3I9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmN1cnNvci5jbGFzc05hbWU9ImFjZV9jdXJzb3IgYWNlX2hpZGRlbiIsdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuY3Vyc29yKSx0aGlzLmlzVmlzaWJsZT0hMX07KChmdW5jdGlvbigpe3RoaXMuJHBhZGRpbmc9MCx0aGlzLnNldFBhZGRpbmc9ZnVuY3Rpb24oYSl7dGhpcy4kcGFkZGluZz1hfSx0aGlzLnNldFNlc3Npb249ZnVuY3Rpb24oYSl7dGhpcy5zZXNzaW9uPWF9LHRoaXMuaGlkZUN1cnNvcj1mdW5jdGlvbigpe3RoaXMuaXNWaXNpYmxlPSExLGQuYWRkQ3NzQ2xhc3ModGhpcy5jdXJzb3IsImFjZV9oaWRkZW4iKSxjbGVhckludGVydmFsKHRoaXMuYmxpbmtJZCl9LHRoaXMuc2hvd0N1cnNvcj1mdW5jdGlvbigpe3RoaXMuaXNWaXNpYmxlPSEwLGQucmVtb3ZlQ3NzQ2xhc3ModGhpcy5jdXJzb3IsImFjZV9oaWRkZW4iKSx0aGlzLmN1cnNvci5zdHlsZS52aXNpYmlsaXR5PSJ2aXNpYmxlIix0aGlzLnJlc3RhcnRUaW1lcigpfSx0aGlzLnJlc3RhcnRUaW1lcj1mdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwodGhpcy5ibGlua0lkKTtpZighdGhpcy5pc1Zpc2libGUpcmV0dXJuO3ZhciBhPXRoaXMuY3Vyc29yO3RoaXMuYmxpbmtJZD1zZXRJbnRlcnZhbChmdW5jdGlvbigpe2Euc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIixzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS5zdHlsZS52aXNpYmlsaXR5PSJ2aXNpYmxlIn0sNDAwKX0sMWUzKX0sdGhpcy5nZXRQaXhlbFBvc2l0aW9uPWZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuY29uZmlnfHwhdGhpcy5zZXNzaW9uKXJldHVybntsZWZ0OjAsdG9wOjB9O2F8fChhPXRoaXMuc2Vzc2lvbi5zZWxlY3Rpb24uZ2V0Q3Vyc29yKCkpO3ZhciBjPXRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24oYSksZD1NYXRoLnJvdW5kKHRoaXMuJHBhZGRpbmcrYy5jb2x1bW4qdGhpcy5jb25maWcuY2hhcmFjdGVyV2lkdGgpLGU9KGMucm93LShiP3RoaXMuY29uZmlnLmZpcnN0Um93U2NyZWVuOjApKSp0aGlzLmNvbmZpZy5saW5lSGVpZ2h0O3JldHVybntsZWZ0OmQsdG9wOmV9fSx0aGlzLnVwZGF0ZT1mdW5jdGlvbihhKXt0aGlzLmNvbmZpZz1hLHRoaXMucGl4ZWxQb3M9dGhpcy5nZXRQaXhlbFBvc2l0aW9uKG51bGwsITApLHRoaXMuY3Vyc29yLnN0eWxlLmxlZnQ9dGhpcy5waXhlbFBvcy5sZWZ0KyJweCIsdGhpcy5jdXJzb3Iuc3R5bGUudG9wPXRoaXMucGl4ZWxQb3MudG9wKyJweCIsdGhpcy5jdXJzb3Iuc3R5bGUud2lkdGg9YS5jaGFyYWN0ZXJXaWR0aCsicHgiLHRoaXMuY3Vyc29yLnN0eWxlLmhlaWdodD1hLmxpbmVIZWlnaHQrInB4Ijt2YXIgYj10aGlzLnNlc3Npb24uZ2V0T3ZlcndyaXRlKCk7YiE9dGhpcy5vdmVyd3JpdGUmJih0aGlzLm92ZXJ3cml0ZT1iLGI/ZC5hZGRDc3NDbGFzcyh0aGlzLmN1cnNvciwiYWNlX292ZXJ3cml0ZSIpOmQucmVtb3ZlQ3NzQ2xhc3ModGhpcy5jdXJzb3IsImFjZV9vdmVyd3JpdGUiKSksdGhpcy5yZXN0YXJ0VGltZXIoKX0sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbCh0aGlzLmJsaW5rSWQpfX0pKS5jYWxsKGUucHJvdG90eXBlKSxiLkN1cnNvcj1lfSksZGVmaW5lKCJhY2Uvc2Nyb2xsYmFyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2RvbSIsImFjZS9saWIvZXZlbnQiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4vbGliL29vcCIpLGU9YSgiLi9saWIvZG9tIiksZj1hKCIuL2xpYi9ldmVudCIpLGc9YSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixoPWZ1bmN0aW9uKGEpe3RoaXMuZWxlbWVudD1lLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZWxlbWVudC5jbGFzc05hbWU9ImFjZV9zYiIsdGhpcy5pbm5lcj1lLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmlubmVyKSxhLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCksdGhpcy53aWR0aD1lLnNjcm9sbGJhcldpZHRoKGEub3duZXJEb2N1bWVudCksdGhpcy5lbGVtZW50LnN0eWxlLndpZHRoPSh0aGlzLndpZHRofHwxNSkrNSsicHgiLGYuYWRkTGlzdGVuZXIodGhpcy5lbGVtZW50LCJzY3JvbGwiLHRoaXMub25TY3JvbGwuYmluZCh0aGlzKSl9OygoZnVuY3Rpb24oKXtkLmltcGxlbWVudCh0aGlzLGcpLHRoaXMub25TY3JvbGw9ZnVuY3Rpb24oKXt0aGlzLl9lbWl0KCJzY3JvbGwiLHtkYXRhOnRoaXMuZWxlbWVudC5zY3JvbGxUb3B9KX0sdGhpcy5nZXRXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLndpZHRofSx0aGlzLnNldEhlaWdodD1mdW5jdGlvbihhKXt0aGlzLmVsZW1lbnQuc3R5bGUuaGVpZ2h0PWErInB4In0sdGhpcy5zZXRJbm5lckhlaWdodD1mdW5jdGlvbihhKXt0aGlzLmlubmVyLnN0eWxlLmhlaWdodD1hKyJweCJ9LHRoaXMuc2V0U2Nyb2xsVG9wPWZ1bmN0aW9uKGEpe3RoaXMuZWxlbWVudC5zY3JvbGxUb3A9YX19KSkuY2FsbChoLnByb3RvdHlwZSksYi5TY3JvbGxCYXI9aH0pLGRlZmluZSgiYWNlL3JlbmRlcmxvb3AiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2V2ZW50Il0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuL2xpYi9ldmVudCIpLGU9ZnVuY3Rpb24oYSxiKXt0aGlzLm9uUmVuZGVyPWEsdGhpcy5wZW5kaW5nPSExLHRoaXMuY2hhbmdlcz0wLHRoaXMud2luZG93PWJ8fHdpbmRvd307KChmdW5jdGlvbigpe3RoaXMuc2NoZWR1bGU9ZnVuY3Rpb24oYSl7dGhpcy5jaGFuZ2VzPXRoaXMuY2hhbmdlc3xhO2lmKCF0aGlzLnBlbmRpbmcpe3RoaXMucGVuZGluZz0hMDt2YXIgYj10aGlzO2QubmV4dFRpY2soZnVuY3Rpb24oKXtiLnBlbmRpbmc9ITE7dmFyIGE7d2hpbGUoYT1iLmNoYW5nZXMpYi5jaGFuZ2VzPTAsYi5vblJlbmRlcihhKX0sdGhpcy53aW5kb3cpfX19KSkuY2FsbChlLnByb3RvdHlwZSksYi5SZW5kZXJMb29wPWV9KSxkZWZpbmUoInRleHQhYWNlL2Nzcy9lZGl0b3IuY3NzIixbXSwiQGltcG9ydCB1cmwoLy9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PURyb2lkK1NhbnMrTW9ubyk7XG5cblxuLmFjZV9lZGl0b3Ige1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGZvbnQtZmFtaWx5OiAnTW9uYWNvJywgJ01lbmxvJywgJ1VidW50dSBNb25vJywgJ0Ryb2lkIFNhbnMgTW9ubycsICdDb25zb2xhcycsIG1vbm9zcGFjZTtcbiAgICBmb250LXNpemU6IDEycHg7XG59XG5cbi5hY2Vfc2Nyb2xsZXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBvdmVyZmxvdy14OiBzY3JvbGw7XG4gICAgb3ZlcmZsb3cteTogaGlkZGVuO1xufVxuXG4uYWNlX2NvbnRlbnQge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgY3Vyc29yOiB0ZXh0O1xufVxuXG4vKiBzZXR0aW5nIHBvaW50ZXItZXZlbnRzOiBhdXRvOyBvbiBub2RlIHVuZGVyIHRoZSBtb3VzZSwgd2hpY2ggY2hhbmdlcyBkdXJpbmcgc2Nyb2xsLFxuICB3aWxsIGJyZWFrIG1vdXNlIHdoZWVsIHNjcm9sbGluZyBpbiBTYWZhcmkgKi9cbi5hY2VfY29udGVudCAqIHtcbiAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5hY2VfY29tcG9zaXRpb24ge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBiYWNrZ3JvdW5kOiAjNTU1O1xuICAgIGNvbG9yOiAjREREO1xuICAgIHotaW5kZXg6IDQ7XG59XG5cbi5hY2VfZ3V0dGVyIC5hY2VfbGF5ZXIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBtaW4td2lkdGg6IDU0cHg7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG59XG5cbi5hY2VfZ3V0dGVyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgb3ZlcmZsb3cgOiBoaWRkZW47XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIHdpZHRoOiBhdXRvO1xuICAgIGN1cnNvcjogZGVmYXVsdDtcbn1cblxuLmFjZV9ndXR0ZXItY2VsbCB7XG4gICAgcGFkZGluZy1sZWZ0OiAxOXB4O1xuICAgIHBhZGRpbmctcmlnaHQ6IDZweDtcbn1cblxuLmFjZV9ndXR0ZXItY2VsbC5hY2VfZXJyb3Ige1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcImRhdGE6aW1hZ2UvZ2lmLEdJRjg5YSUxMCUwMCUxMCUwMCVENSUwMCUwMCVGNW9yJUY1JTg3JTg4JUY1bnIlRjRucyVFQm1xJUY1eiU3RiVEREpUJURFS1MlREZPVyVGMVljJUYyYWglQ0UoNyVDRSk4JUQxOEUlREQlNDBNJUYyS1olRUJVJTYwJUY0JTYwbSVEQ2lyJUM4JTE2KCVDOCUxOSolQ0UlMjU1JUYxJTNGUiVGMSUzRlMlRTYlQUIlQjUlQ0ElNURJJUNFbiU1RSVGNyVBMiU5QSVDOUclM0UlRTBhJTVCJUY3JTg5JTg1JUY1eXklRjYlODIlODAlRUQlODIlODAlRkYlQkYlQkYlRTMlQzQlQzQlRkYlRkYlRkYlRkYlRkYlRkYlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAlMDAhJUY5JTA0JTAxJTAwJTAwJTI1JTAwJTJDJTAwJTAwJTAwJTAwJTEwJTAwJTEwJTAwJTAwJTA2cCVDMCU5MnBIJTJDJTFBJThGJUM4JUQySCU5MyVFMWQ0JTIzJUU0JTg4JUQzJTA5bUIlMUROJUI0OCVGNSU5MCU0MCU2MCU5MkclNUIlOTQlMjAlM0UlMjIlRDIlODclMjQlRkElMjAlMjQlQzUlMDZBJTAwJTIwJUIxJTA3JTAyQiVBMzglODlYLnYlMTclODIlMTElMTNxJTEwJTBGaSUyNCUwRiU4QiUxMCU3QkQlMTIlMEVpJTA5JTkyJTA5JTBFcEQlMTglMTUlMjQlMEElOUNpJTA1JTBDJTE4RiUxOCUwQiUwNyUwNCUwMSUwNCUwNiVBMEglMTglMTIlMEQlMTQlMEQlMTIlQTFJJUIzJUI0JUI1SUElMDAlM0JcIik7XG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAycHggY2VudGVyO1xufVxuXG4uYWNlX2d1dHRlci1jZWxsLmFjZV93YXJuaW5nIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL2dpZixHSUY4OWElMTAlMDAlMTAlMDAlRDUlMDAlMDAlRkYlREJyJUZGJURFJTgxJUZGJUUyJThEJUZGJUUyJThGJUZGJUU0JTk2JUZGJUUzJTk3JUZGJUU1JTlEJUZGJUU2JTlFJUZGJUVFJUMxJUZGJUM4WiVGRiVDRGslRkYlRDBzJUZGJUQ0JTgxJUZGJUQ1JTgyJUZGJUQ1JTgzJUZGJURDJTk3JUZGJURFJTlEJUZGJUU3JUI4JUZGJUNDbCU3QlElMTMlODBVJTE1JTgyVyUxNiU4MVUlMTYlODklNUIlMTglODclNUIlMTglOEMlNUUlMUElOTRkJTFEJUM1JTgzLSVDOSU4NyUyRiVDNiU4NC4lQzYlODUuJUNEJThCMiVDOSU4NzElQ0IlOEEzJUNEJThCNSVEQyU5OCUzRiVERiU5QkIlRTAlOUNDJUUxJUE1VSVDQiU4NzElQ0YlOEI1JUQxJThENiVEQiU5NyU0MCVERiU5QUIlREQlOTlCJUUzJUIwcCVFNyVDQyVBRSVGRiVGRiVGRiUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCUwMCElRjklMDQlMDElMDAlMDAlMkYlMDAlMkMlMDAlMDAlMDAlMDAlMTAlMDAlMTAlMDAlMDAlMDZhJUMwJTk3cEglMkMlMUElOEZIJUExJUFCVHIlMjUlODclMkIlMDQlODIlRjQlN0MlQjlYJTkxJTA4JUNCJTk5JTFDISUyNiUxMyU4NCppSjkoJTE1RyVDQSU4NCUxNCUwMSUxQSU5NyUwQyUwMyU4MCUzQSU5QSUzRSU4MSU4NCUzRSUxMSUwOCVCMSU4QiUyMCUwMiUxMiUwRiUxOCUxQSUwRiUwQSUwMydGJTFDJTA0JTBCJTEwJTE2JTE4JTEwJTBCJTA1JTFDRiUxRC0lMDYlMDclOUElOUEtJTFFRyUxQiVBMCVBMSVBMFUlQTQlQTUlQTZCQSUwMCUzQlwiKTtcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDJweCBjZW50ZXI7XG59XG5cbi5hY2VfZ3V0dGVyLWNlbGwuYWNlX2luZm8ge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEVBQVFBTVFBQUFBQUFFRkJRVkpTVWw1ZVhtUmtaR3RyYTM5L2Y0V0ZoWW1KaVpHUmthYW1wcnk4dk1QRHc4ek16TlhWMWR6YzNPVGs1T3JxNnZEdzhQLy8vd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ0g1QkFrQUFCUUFMQUFBQUFBUUFCQUFBQVV1SUNXT1pHbWVhQm1sNVhHd0ZDUVNCR3lYUlNBd3RxUUlpUnVpd0lNNUJvWVZiRUZJeUdDUW9lSkdyVnB0SVFBN1wiKTtcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDJweCBjZW50ZXI7XG59XG5cbi5hY2VfZWRpdG9yIC5hY2Vfc2Ige1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47XG4gICAgb3ZlcmZsb3cteTogc2Nyb2xsO1xuICAgIHJpZ2h0OiAwO1xufVxuXG4uYWNlX2VkaXRvciAuYWNlX3NiIGRpdiB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHdpZHRoOiAxcHg7XG4gICAgbGVmdDogMDtcbn1cblxuLmFjZV9lZGl0b3IgLmFjZV9wcmludF9tYXJnaW5fbGF5ZXIge1xuICAgIHotaW5kZXg6IDA7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgbWFyZ2luOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIHdpZHRoOiAxMDAlO1xufVxuXG4uYWNlX2VkaXRvciAuYWNlX3ByaW50X21hcmdpbiB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGhlaWdodDogMTAwJTtcbn1cblxuLmFjZV9lZGl0b3IgdGV4dGFyZWEge1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICB6LWluZGV4OiAwO1xuICAgIHdpZHRoOiAxMHB4O1xuICAgIGhlaWdodDogMzBweDtcbiAgICBvcGFjaXR5OiAwO1xuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gICAgLW1vei1hcHBlYXJhbmNlOiBub25lO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICByZXNpemU6IG5vbmU7XG4gICAgb3V0bGluZTogbm9uZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4uYWNlX2xheWVyIHtcbiAgICB6LWluZGV4OiAxO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cblxuLmFjZV90ZXh0LWxheWVyIHtcbiAgICBjb2xvcjogYmxhY2s7XG59XG5cbi5hY2VfY2prIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG4uYWNlX2N1cnNvci1sYXllciB7XG4gICAgei1pbmRleDogNDtcbn1cblxuLmFjZV9jdXJzb3Ige1xuICAgIHotaW5kZXg6IDQ7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xufVxuXG4uYWNlX2N1cnNvci5hY2VfaGlkZGVuIHtcbiAgICBvcGFjaXR5OiAwLjI7XG59XG5cbi5hY2VfbGluZSB7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgei1pbmRleDogMztcbn1cblxuLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB6LWluZGV4OiA0O1xufVxuXG4uYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB6LWluZGV4OiA1O1xufVxuXG4uYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgei1pbmRleDogMjtcbn1cblxuLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgei1pbmRleDogNjtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbi5hY2VfbGluZSAuYWNlX2ZvbGQge1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgaGVpZ2h0OiAxMXB4O1xuICAgIG1hcmdpbi10b3A6IC0ycHg7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcblxuICAgIGJhY2tncm91bmQtaW1hZ2U6IFxuICAgICAgICB1cmwoXCJkYXRhOmltYWdlL3BuZywlODlQTkclMEQlMEElMUElMEElMDAlMDAlMDAlMERJSERSJTAwJTAwJTAwJTExJTAwJTAwJTAwJTA5JTA4JTA2JTAwJTAwJTAwJUQ0JUU4JUM3JTBDJTAwJTAwJTAzJTFFaUNDUElDQyUyMFByb2ZpbGUlMDAlMDB4JTAxJTg1VCVERmslRDNQJTE0JUZFJURBZSU5RCVCMCVFMSU4QiUzQWclMTElMDklM0VoJTkxbmRTdEMlOUMlQjZrVyVCQSVDRFolRUE2JUI3IUglOUIlQTZtJTVDJTlBJUM2JTI0JUVEfiVCMCUwNyVEOSU4Qm8lM0ElQzV3JUYxJTA3JTNFJUY5JTA3JTBDJUQ5JTgzbyU3QiU5MiUwRCVDNiUxNGElRjglQUMlODglMjJMJUY2JTIyJUIzJTlFJTlCNE0nUyUwMyVCOSVGNyVCQiVERiVGOSVFRTknJUU3JUU0JTVFJUEwJUY5cVolRDMlMTQlMkYlMEYlMTRVU08lQzUlQzIlRkMlQzQlRTQlMTQlREYlRjIlMDElNUUlMUNDJTJCJUZDaE0lOEIlODYlMTZKJTI2RyU0MCUwRiVEMyVCMnklRUYlQjMlRjMlMEUlMUUlQzZsdCVFRW8lREYlQUIlRkVjJUQ1JTlBJTk1JTBDJTExJUYwJTFDJTIwJUJFJTk0NSVDNCUyMiVFMVklQTBpJTVDJUQ0dCUxMyVFMCVENiU4OSVFRiU5RDE1JUMyJUNETHNYJUE3JTA0JTA5JTFGZzhvYyU4MSVFMSU4QyU4RCUyMyU5NmY0NSU0MCU5QSUwOSVDMiUwNyVDNUIlM0FLJUI4JTQwOCU5OGklRTAlRjMlMEQlRDglQ0UlODElMTQlRTQnJTI2JUE5JTkyLiU4QiUzQyVBQkVSJTJGJUU1ZEUlQjIlMEMlRjYlRjAlMUZzJTgzJUYyXyVCMCVBOCU5NCVFOSU5QiVBRCVFNyUxMCU4RG0lOUElMTlOJUQxJTdDJThBJURFJTFGOSU3RHAlOEMlRTYlMDAlRDUlQzElM0ZfJTE4JUJEQSVCOCU5RHBYNiVFMyVBMzV+QiVDRCUyNCVBRSUxMSUyNiVCRCVFNyVFRXRpJTk4JUVEZSU5QSU5N1kpJTEyJTI1JTFDJTI0JUJDYlQlQUUzbGklRTYlMEIlMDMlODklOUElRTYlRDMlRUQlRjRQJTkyJUIwJTlGNCVCRjQzWSVGMyVFMyVFRFAlOTUlMDQlRUIxJUM1JUY1JUY2S0YlRjQlQkElQkQlRDclREIlOTElOTMlMDclRTM1JTNFJUE3KSVENiU3RiU0MCVGRSVCRCVGNyVGNXIlOEElRTV5JTkyJUYwJUVCJUI0JTFFJThEJUQ1JUY0JTVCJTkyJTNBViVEQiVEQiVFNCVDRCVBNiUyMyVDMyVDNHdRJTNGJTAzSEIlODIlOEUlMUNkKCVFMCU5MUIlMENhJTlBYyVDNCVBQSVGOEwlMTYlMTklMjJKJUE0JUQyaXRUeSVCMjglRDYlM0IoJTkzJTk2JUVEJTFDR3glQzlfJTBFJUI4JTVFJTE2JUY1JTVCJUIyJUI4JUY2JUUwJUZCJTlFJUREJTI1JUQ3JThFJUJDJTE1JTg1JUM1JUI3JUEzJUQ4USVFRCVCNSU4MSVFOSVCQSVCMiUxMyU5QSUxQiU3RnVhJUE1JUEzbiVFMTclQjklRTUlOUIlMUJtJUFCJTBCJTA4USVGRSU4QSVFNSVCMUglNUVlJUNBTyU4MlElRDd1NiVFNiU5MFMlOTclRkN1JTBCJUNGMiU5NCVFRSUyNXYlMTJYJTBDJUJBJUFDJUYwJTVFJUY4KmwlMEFPJTg1JTE3JUMyJTk3JUJGJUQ0JUM4JUNFJURFJUFEJTExJUNCJTgwcSUyQyUzRSVBQiU5RVMlQ0QlQzYlRUMlMjUlRDJMJUQyJUVCZCVCOCVCRiU4QSVGNUIlQzYlMTglRjklOTAxQ1olOUQlQkUlMjRNJTlDJThBOSVGMiVEQVAlMEInJTA2dyU4MiVFQiVFNiVFMiU1QyUyRiVENyUwNyU5RSVCQiVDQyU1RCVFMSVGQSVCOSUwOCVBRC5yJTIzJThFJUMyJTE3JUY1RSU3QyElRjAlQkUzJUJFJTNFXyVCN28lODhhJUE3JURCJUJFJUQzZCVFQiVBMzFaJUVCJUJCJUQzJTkxJUJBJUEyJUIxeiU5NCU4RiVEQiclRjYlM0QlOEUlQUElMTMlMTklQjIlQjElQkUlQjF+ViUwOCUyQiVCNCVBMmNqSiVCM3RPJTAwJTAzJTI1bU4lOTclRjMlMDUlOTMlRUYlMTElODQlMEIlN0MlODglQUUtJTg5JThGJUFCYlclOTBPJTJCJTBBbyU5OSUwQyU1RSU5NyUwQ0klQUZIJUQ5LiVCMCUzQiU4RiVFRCUwMyVCNlMlRDYlNUQlRTZpX3M5JUYzKnAlRTklMUIlRkQlQzMlRUIuN1UlMDYlNUUlMTklQzAlRDFzLiUxNyVBMDN1JUU0JTA5JUIwJTdDJTVFJTJDJUVCJTE1JURCJTFGJTNDJTlFJUI3JTgwJTkxJTNCJURCYyVBRCUzRG1hJUJBJThCJTNFViVBQiVEQnQuJTVCJTFFJTAxJUJCJTBGJUFCJUQ1JTlGJUNGJUFBJUQ1JUREJUU3JUU0JTdGJTBCeCVBMyVGQyUwNiVBOSUyMyUwQSVENiVDMiVBMV8yJTAwJTAwJTAwJTA5cEhZcyUwMCUwMCUwQiUxMyUwMCUwMCUwQiUxMyUwMSUwMCU5QSU5QyUxOCUwMCUwMCUwMCVCNUlEQVQoJTE1JUE1JTkxJTNEJTBFJTAyISUxMCU4NWFjJUUxJTA1JUQ2JUNFJUQ2JUM2JUNFJUQyJUU4JUVEJUNEJURFJUMwJUM2JUQ2Ti4lRTBWJUY4JTNEJTlDYSU4OTFYSCVDMiVCRSVEOXklM0YlOTAhJUU2JTlDJUMzJUJGayVFNSUwMTElQzYtJUY1JUM4TiUwNCVERiVCRCVGRiU4OSVERnQlODNETiU2MCUzRSVGMyVBQiVBMCVERSUxQSU1RGclQkUlMTBRJTk3JTFCJTQwJTlDJUE4byUxMCU4RiU1RSU4MjglQjQlMUIlNjAlODclRjYlMDIlMjYlODUlMUNoJTFFJUMxJTJCJTVCayVGRiU4NiVFRSVCN2olMDklOUElREElOUIlQUNlJUEzJUY5JUVDJURBITklQjQlRDUlQTYlODElODYlODYlOTglQ0MlM0MlNUIlNDAlRkElODElQjMlRTklQ0IlMjMlOTQlQzE2QXpvJTA1JUQ0JUUxJUMxJTk1YSUzQiU4QSclQTAlRTglQ0MlMTclMjIlODUlMUQlQkElMDAlQTIlRkElREMlMEElOTQlRDElRDElOEQlOEIlM0ElODQlMTdCJUM3JTYwJTFBJTI1WiVGQyU4RCUwMCUwMCUwMCUwMElFTkQlQUVCJTYwJTgyXCIpLFxuICAgICAgICB1cmwoXCJkYXRhOmltYWdlL3BuZywlODlQTkclMEQlMEElMUElMEElMDAlMDAlMDAlMERJSERSJTAwJTAwJTAwJTA1JTAwJTAwJTAwNyUwOCUwNiUwMCUwMCUwMCVDNCVERCU4MEMlMDAlMDAlMDMlMUVpQ0NQSUNDJTIwUHJvZmlsZSUwMCUwMHglMDElODVUJURGayVEM1AlMTQlRkUlREFlJTlEJUIwJUUxJThCJTNBZyUxMSUwOSUzRWglOTFuZFN0QyU5QyVCNmtXJUJBJUNEWiVFQTYlQjchSCU5QiVBNm0lNUMlOUElQzYlMjQlRUR+JUIwJTA3JUQ5JThCbyUzQSVDNXclRjElMDclM0UlRjklMDclMEMlRDklODNvJTdCJTkyJTBEJUM2JTE0YSVGOCVBQyU4OCUyMkwlRjYlMjIlQjMlOUUlOUI0TSdTJTAzJUI5JUY3JUJCJURGJUY5JUVFOSclRTclRTQlNUUlQTAlRjlxWiVEMyUxNCUyRiUwRiUxNFVTTyVDNSVDMiVGQyVDNCVFNCUxNCVERiVGMiUwMSU1RSUxQ0MlMkIlRkNoTSU4QiU4NiUxNkolMjZHJTQwJTBGJUQzJUIyeSVFRiVCMyVGMyUwRSUxRSVDNmx0JUVFbyVERiVBQiVGRWMlRDUlOUElOTUlMEMlMTElRjAlMUMlMjAlQkUlOTQ1JUM0JTIyJUUxWSVBMGklNUMlRDR0JTEzJUUwJUQ2JTg5JUVGJTlEMTUlQzIlQ0RMc1glQTclMDQlMDklMUZnOG9jJTgxJUUxJThDJThEJTIzJTk2ZjQ1JTQwJTlBJTA5JUMyJTA3JUM1QiUzQUslQjglNDA4JTk4aSVFMCVGMyUwRCVEOCVDRSU4MSUxNCVFNCclMjYlQTklOTIuJThCJTNDJUFCRVIlMkYlRTVkRSVCMiUwQyVGNiVGMCUxRnMlODMlRjJfJUIwJUE4JTk0JUU5JTlCJUFEJUU3JTEwJThEbSU5QSUxOU4lRDElN0MlOEElREUlMUY5JTdEcCU4QyVFNiUwMCVENSVDMSUzRl8lMTglQkRBJUI4JTlEcFg2JUUzJUEzNX5CJUNEJTI0JUFFJTExJTI2JUJEJUU3JUVFdGklOTglRURlJTlBJTk3WSklMTIlMjUlMUMlMjQlQkNiVCVBRTNsaSVFNiUwQiUwMyU4OSU5QSVFNiVEMyVFRCVGNFAlOTIlQjAlOUY0JUJGNDNZJUYzJUUzJUVEUCU5NSUwNCVFQjElQzUlRjUlRjZLRiVGNCVCQSVCRCVENyVEQiU5MSU5MyUwNyVFMzUlM0UlQTcpJUQ2JTdGJTQwJUZFJUJEJUY3JUY1ciU4QSVFNXklOTIlRjAlRUIlQjQlMUUlOEQlRDUlRjQlNUIlOTIlM0FWJURCJURCJUU0JUNEJUE2JTIzJUMzJUM0d1ElM0YlMDNIQiU4MiU4RSUxQ2QoJUUwJTkxQiUwQ2ElOUFjJUM0JUFBJUY4TCUxNiUxOSUyMkolQTQlRDJpdFR5JUIyOCVENiUzQiglOTMlOTYlRUQlMUNHeCVDOV8lMEUlQjglNUUlMTYlRjUlNUIlQjIlQjglRjYlRTAlRkIlOUUlREQlMjUlRDclOEUlQkMlMTUlODUlQzUlQjclQTMlRDhRJUVEJUI1JTgxJUU5JUJBJUIyJTEzJTlBJTFCJTdGdWElQTUlQTNuJUUxNyVCOSVFNSU5QiUxQm0lQUIlMEIlMDhRJUZFJThBJUU1JUIxSCU1RWUlQ0FPJTgyUSVEN3U2JUU2JTkwUyU5NyVGQ3UlMEIlQ0YyJTk0JUVFJTI1diUxMlglMEMlQkElQUMlRjAlNUUlRjgqbCUwQU8lODUlMTclQzIlOTclQkYlRDQlQzglQ0UlREUlQUQlMTElQ0IlODBxJTJDJTNFJUFCJTlFUyVDRCVDNiVFQyUyNSVEMkwlRDIlRUJkJUI4JUJGJThBJUY1QiVDNiUxOCVGOSU5MDFDWiU5RCVCRSUyNE0lOUMlOEE5JUYyJURBUCUwQiclMDZ3JTgyJUVCJUU2JUUyJTVDJTJGJUQ3JTA3JTlFJUJCJUNDJTVEJUUxJUZBJUI5JTA4JUFELnIlMjMlOEUlQzIlMTclRjVFJTdDISVGMCVCRTMlQkUlM0VfJUI3byU4OGElQTclREIlQkUlRDNkJUVCJUEzMVolRUIlQkIlRDMlOTElQkElQTIlQjF6JTk0JThGJURCJyVGNiUzRCU4RSVBQSUxMyUxOSVCMiVCMSVCRSVCMX5WJTA4JTJCJUI0JUEyY2pKJUIzdE8lMDAlMDMlMjVtTiU5NyVGMyUwNSU5MyVFRiUxMSU4NCUwQiU3QyU4OCVBRS0lODklOEYlQUJiVyU5ME8lMkIlMEFvJTk5JTBDJTVFJTk3JTBDSSVBRkglRDkuJUIwJTNCJThGJUVEJTAzJUI2UyVENiU1RCVFNmlfczklRjMqcCVFOSUxQiVGRCVDMyVFQi43VSUwNiU1RSUxOSVDMCVEMXMuJTE3JUEwM3UlRTQlMDklQjAlN0MlNUUlMkMlRUIlMTUlREIlMUYlM0MlOUUlQjclODAlOTElM0IlREJjJUFEJTNEbWElQkElOEIlM0VWJUFCJURCdC4lNUIlMUUlMDElQkIlMEYlQUIlRDUlOUYlQ0YlQUElRDUlREQlRTclRTQlN0YlMEJ4JUEzJUZDJTA2JUE5JTIzJTBBJUQ2JUMyJUExXzIlMDAlMDAlMDAlMDlwSFlzJTAwJTAwJTBCJTEzJTAwJTAwJTBCJTEzJTAxJTAwJTlBJTlDJTE4JTAwJTAwJTAwJTNBSURBVDglMTFjJUZDJUZGJUZGJTdGJTE4JTAzJTFBJTYwJTAxJUYyJTNGJUEwJTg5MSU4MCUwNCVGRiUxMS0lRjglMTclOUJKJUUyJTA1JUIxWkQlODF2JTI2dCVFNyU4MCVGOCVBMyU4MmglQTEyJTFBJTIwJUEzJTAxJTAyJTBGJTAxJUJBJTI1JTA2JTAwJTE5JUMwJTBEJUFFRiVENSUzRVMlMDAlMDAlMDAlMDBJRU5EJUFFQiU2MCU4MlwiKTtcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0LCByZXBlYXQteDtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyLCB0b3AgbGVmdDtcbiAgICBjb2xvcjogdHJhbnNwYXJlbnQ7XG5cbiAgICBib3JkZXI6IDFweCBzb2xpZCBibGFjaztcbiAgICAtbW96LWJvcmRlci1yYWRpdXM6IDJweDtcbiAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDJweDtcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgXG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xufVxuXG4uYWNlX2RhcmsgLmFjZV9mb2xkIHtcbn1cblxuLmFjZV9mb2xkOmhvdmVye1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IFxuICAgICAgICB1cmwoXCJkYXRhOmltYWdlL3BuZywlODlQTkclMEQlMEElMUElMEElMDAlMDAlMDAlMERJSERSJTAwJTAwJTAwJTExJTAwJTAwJTAwJTA5JTA4JTA2JTAwJTAwJTAwJUQ0JUU4JUM3JTBDJTAwJTAwJTAzJTFFaUNDUElDQyUyMFByb2ZpbGUlMDAlMDB4JTAxJTg1VCVERmslRDNQJTE0JUZFJURBZSU5RCVCMCVFMSU4QiUzQWclMTElMDklM0VoJTkxbmRTdEMlOUMlQjZrVyVCQSVDRFolRUE2JUI3IUglOUIlQTZtJTVDJTlBJUM2JTI0JUVEfiVCMCUwNyVEOSU4Qm8lM0ElQzV3JUYxJTA3JTNFJUY5JTA3JTBDJUQ5JTgzbyU3QiU5MiUwRCVDNiUxNGElRjglQUMlODglMjJMJUY2JTIyJUIzJTlFJTlCNE0nUyUwMyVCOSVGNyVCQiVERiVGOSVFRTknJUU3JUU0JTVFJUEwJUY5cVolRDMlMTQlMkYlMEYlMTRVU08lQzUlQzIlRkMlQzQlRTQlMTQlREYlRjIlMDElNUUlMUNDJTJCJUZDaE0lOEIlODYlMTZKJTI2RyU0MCUwRiVEMyVCMnklRUYlQjMlRjMlMEUlMUUlQzZsdCVFRW8lREYlQUIlRkVjJUQ1JTlBJTk1JTBDJTExJUYwJTFDJTIwJUJFJTk0NSVDNCUyMiVFMVklQTBpJTVDJUQ0dCUxMyVFMCVENiU4OSVFRiU5RDE1JUMyJUNETHNYJUE3JTA0JTA5JTFGZzhvYyU4MSVFMSU4QyU4RCUyMyU5NmY0NSU0MCU5QSUwOSVDMiUwNyVDNUIlM0FLJUI4JTQwOCU5OGklRTAlRjMlMEQlRDglQ0UlODElMTQlRTQnJTI2JUE5JTkyLiU4QiUzQyVBQkVSJTJGJUU1ZEUlQjIlMEMlRjYlRjAlMUZzJTgzJUYyXyVCMCVBOCU5NCVFOSU5QiVBRCVFNyUxMCU4RG0lOUElMTlOJUQxJTdDJThBJURFJTFGOSU3RHAlOEMlRTYlMDAlRDUlQzElM0ZfJTE4JUJEQSVCOCU5RHBYNiVFMyVBMzV+QiVDRCUyNCVBRSUxMSUyNiVCRCVFNyVFRXRpJTk4JUVEZSU5QSU5N1kpJTEyJTI1JTFDJTI0JUJDYlQlQUUzbGklRTYlMEIlMDMlODklOUElRTYlRDMlRUQlRjRQJTkyJUIwJTlGNCVCRjQzWSVGMyVFMyVFRFAlOTUlMDQlRUIxJUM1JUY1JUY2S0YlRjQlQkElQkQlRDclREIlOTElOTMlMDclRTM1JTNFJUE3KSVENiU3RiU0MCVGRSVCRCVGNyVGNXIlOEElRTV5JTkyJUYwJUVCJUI0JTFFJThEJUQ1JUY0JTVCJTkyJTNBViVEQiVEQiVFNCVDRCVBNiUyMyVDMyVDNHdRJTNGJTAzSEIlODIlOEUlMUNkKCVFMCU5MUIlMENhJTlBYyVDNCVBQSVGOEwlMTYlMTklMjJKJUE0JUQyaXRUeSVCMjglRDYlM0IoJTkzJTk2JUVEJTFDR3glQzlfJTBFJUI4JTVFJTE2JUY1JTVCJUIyJUI4JUY2JUUwJUZCJTlFJUREJTI1JUQ3JThFJUJDJTE1JTg1JUM1JUI3JUEzJUQ4USVFRCVCNSU4MSVFOSVCQSVCMiUxMyU5QSUxQiU3RnVhJUE1JUEzbiVFMTclQjklRTUlOUIlMUJtJUFCJTBCJTA4USVGRSU4QSVFNSVCMUglNUVlJUNBTyU4MlElRDd1NiVFNiU5MFMlOTclRkN1JTBCJUNGMiU5NCVFRSUyNXYlMTJYJTBDJUJBJUFDJUYwJTVFJUY4KmwlMEFPJTg1JTE3JUMyJTk3JUJGJUQ0JUM4JUNFJURFJUFEJTExJUNCJTgwcSUyQyUzRSVBQiU5RVMlQ0QlQzYlRUMlMjUlRDJMJUQyJUVCZCVCOCVCRiU4QSVGNUIlQzYlMTglRjklOTAxQ1olOUQlQkUlMjRNJTlDJThBOSVGMiVEQVAlMEInJTA2dyU4MiVFQiVFNiVFMiU1QyUyRiVENyUwNyU5RSVCQiVDQyU1RCVFMSVGQSVCOSUwOCVBRC5yJTIzJThFJUMyJTE3JUY1RSU3QyElRjAlQkUzJUJFJTNFXyVCN28lODhhJUE3JURCJUJFJUQzZCVFQiVBMzFaJUVCJUJCJUQzJTkxJUJBJUEyJUIxeiU5NCU4RiVEQiclRjYlM0QlOEUlQUElMTMlMTklQjIlQjElQkUlQjF+ViUwOCUyQiVCNCVBMmNqSiVCM3RPJTAwJTAzJTI1bU4lOTclRjMlMDUlOTMlRUYlMTElODQlMEIlN0MlODglQUUtJTg5JThGJUFCYlclOTBPJTJCJTBBbyU5OSUwQyU1RSU5NyUwQ0klQUZIJUQ5LiVCMCUzQiU4RiVFRCUwMyVCNlMlRDYlNUQlRTZpX3M5JUYzKnAlRTklMUIlRkQlQzMlRUIuN1UlMDYlNUUlMTklQzAlRDFzLiUxNyVBMDN1JUU0JTA5JUIwJTdDJTVFJTJDJUVCJTE1JURCJTFGJTNDJTlFJUI3JTgwJTkxJTNCJURCYyVBRCUzRG1hJUJBJThCJTNFViVBQiVEQnQuJTVCJTFFJTAxJUJCJTBGJUFCJUQ1JTlGJUNGJUFBJUQ1JUREJUU3JUU0JTdGJTBCeCVBMyVGQyUwNiVBOSUyMyUwQSVENiVDMiVBMV8yJTAwJTAwJTAwJTA5cEhZcyUwMCUwMCUwQiUxMyUwMCUwMCUwQiUxMyUwMSUwMCU5QSU5QyUxOCUwMCUwMCUwMCVCNUlEQVQoJTE1JUE1JTkxJTNEJTBFJTAyISUxMCU4NWFjJUUxJTA1JUQ2JUNFJUQ2JUM2JUNFJUQyJUU4JUVEJUNEJURFJUMwJUM2JUQ2Ti4lRTBWJUY4JTNEJTlDYSU4OTFYSCVDMiVCRSVEOXklM0YlOTAhJUU2JTlDJUMzJUJGayVFNSUwMTElQzYtJUY1JUM4TiUwNCVERiVCRCVGRiU4OSVERnQlODNETiU2MCUzRSVGMyVBQiVBMCVERSUxQSU1RGclQkUlMTBRJTk3JTFCJTQwJTlDJUE4byUxMCU4RiU1RSU4MjglQjQlMUIlNjAlODclRjYlMDIlMjYlODUlMUNoJTFFJUMxJTJCJTVCayVGRiU4NiVFRSVCN2olMDklOUElREElOUIlQUNlJUEzJUY5JUVDJURBITklQjQlRDUlQTYlODElODYlODYlOTglQ0MlM0MlNUIlNDAlRkElODElQjMlRTklQ0IlMjMlOTQlQzE2QXpvJTA1JUQ0JUUxJUMxJTk1YSUzQiU4QSclQTAlRTglQ0MlMTclMjIlODUlMUQlQkElMDAlQTIlRkElREMlMEElOTQlRDElRDElOEQlOEIlM0ElODQlMTdCJUM3JTYwJTFBJTI1WiVGQyU4RCUwMCUwMCUwMCUwMElFTkQlQUVCJTYwJTgyXCIpLFxuICAgICAgICB1cmwoXCJkYXRhOmltYWdlL3BuZywlODlQTkclMEQlMEElMUElMEElMDAlMDAlMDAlMERJSERSJTAwJTAwJTAwJTA1JTAwJTAwJTAwNyUwOCUwNiUwMCUwMCUwMCVDNCVERCU4MEMlMDAlMDAlMDMlMUVpQ0NQSUNDJTIwUHJvZmlsZSUwMCUwMHglMDElODVUJURGayVEM1AlMTQlRkUlREFlJTlEJUIwJUUxJThCJTNBZyUxMSUwOSUzRWglOTFuZFN0QyU5QyVCNmtXJUJBJUNEWiVFQTYlQjchSCU5QiVBNm0lNUMlOUElQzYlMjQlRUR+JUIwJTA3JUQ5JThCbyUzQSVDNXclRjElMDclM0UlRjklMDclMEMlRDklODNvJTdCJTkyJTBEJUM2JTE0YSVGOCVBQyU4OCUyMkwlRjYlMjIlQjMlOUUlOUI0TSdTJTAzJUI5JUY3JUJCJURGJUY5JUVFOSclRTclRTQlNUUlQTAlRjlxWiVEMyUxNCUyRiUwRiUxNFVTTyVDNSVDMiVGQyVDNCVFNCUxNCVERiVGMiUwMSU1RSUxQ0MlMkIlRkNoTSU4QiU4NiUxNkolMjZHJTQwJTBGJUQzJUIyeSVFRiVCMyVGMyUwRSUxRSVDNmx0JUVFbyVERiVBQiVGRWMlRDUlOUElOTUlMEMlMTElRjAlMUMlMjAlQkUlOTQ1JUM0JTIyJUUxWSVBMGklNUMlRDR0JTEzJUUwJUQ2JTg5JUVGJTlEMTUlQzIlQ0RMc1glQTclMDQlMDklMUZnOG9jJTgxJUUxJThDJThEJTIzJTk2ZjQ1JTQwJTlBJTA5JUMyJTA3JUM1QiUzQUslQjglNDA4JTk4aSVFMCVGMyUwRCVEOCVDRSU4MSUxNCVFNCclMjYlQTklOTIuJThCJTNDJUFCRVIlMkYlRTVkRSVCMiUwQyVGNiVGMCUxRnMlODMlRjJfJUIwJUE4JTk0JUU5JTlCJUFEJUU3JTEwJThEbSU5QSUxOU4lRDElN0MlOEElREUlMUY5JTdEcCU4QyVFNiUwMCVENSVDMSUzRl8lMTglQkRBJUI4JTlEcFg2JUUzJUEzNX5CJUNEJTI0JUFFJTExJTI2JUJEJUU3JUVFdGklOTglRURlJTlBJTk3WSklMTIlMjUlMUMlMjQlQkNiVCVBRTNsaSVFNiUwQiUwMyU4OSU5QSVFNiVEMyVFRCVGNFAlOTIlQjAlOUY0JUJGNDNZJUYzJUUzJUVEUCU5NSUwNCVFQjElQzUlRjUlRjZLRiVGNCVCQSVCRCVENyVEQiU5MSU5MyUwNyVFMzUlM0UlQTcpJUQ2JTdGJTQwJUZFJUJEJUY3JUY1ciU4QSVFNXklOTIlRjAlRUIlQjQlMUUlOEQlRDUlRjQlNUIlOTIlM0FWJURCJURCJUU0JUNEJUE2JTIzJUMzJUM0d1ElM0YlMDNIQiU4MiU4RSUxQ2QoJUUwJTkxQiUwQ2ElOUFjJUM0JUFBJUY4TCUxNiUxOSUyMkolQTQlRDJpdFR5JUIyOCVENiUzQiglOTMlOTYlRUQlMUNHeCVDOV8lMEUlQjglNUUlMTYlRjUlNUIlQjIlQjglRjYlRTAlRkIlOUUlREQlMjUlRDclOEUlQkMlMTUlODUlQzUlQjclQTMlRDhRJUVEJUI1JTgxJUU5JUJBJUIyJTEzJTlBJTFCJTdGdWElQTUlQTNuJUUxNyVCOSVFNSU5QiUxQm0lQUIlMEIlMDhRJUZFJThBJUU1JUIxSCU1RWUlQ0FPJTgyUSVEN3U2JUU2JTkwUyU5NyVGQ3UlMEIlQ0YyJTk0JUVFJTI1diUxMlglMEMlQkElQUMlRjAlNUUlRjgqbCUwQU8lODUlMTclQzIlOTclQkYlRDQlQzglQ0UlREUlQUQlMTElQ0IlODBxJTJDJTNFJUFCJTlFUyVDRCVDNiVFQyUyNSVEMkwlRDIlRUJkJUI4JUJGJThBJUY1QiVDNiUxOCVGOSU5MDFDWiU5RCVCRSUyNE0lOUMlOEE5JUYyJURBUCUwQiclMDZ3JTgyJUVCJUU2JUUyJTVDJTJGJUQ3JTA3JTlFJUJCJUNDJTVEJUUxJUZBJUI5JTA4JUFELnIlMjMlOEUlQzIlMTclRjVFJTdDISVGMCVCRTMlQkUlM0VfJUI3byU4OGElQTclREIlQkUlRDNkJUVCJUEzMVolRUIlQkIlRDMlOTElQkElQTIlQjF6JTk0JThGJURCJyVGNiUzRCU4RSVBQSUxMyUxOSVCMiVCMSVCRSVCMX5WJTA4JTJCJUI0JUEyY2pKJUIzdE8lMDAlMDMlMjVtTiU5NyVGMyUwNSU5MyVFRiUxMSU4NCUwQiU3QyU4OCVBRS0lODklOEYlQUJiVyU5ME8lMkIlMEFvJTk5JTBDJTVFJTk3JTBDSSVBRkglRDkuJUIwJTNCJThGJUVEJTAzJUI2UyVENiU1RCVFNmlfczklRjMqcCVFOSUxQiVGRCVDMyVFQi43VSUwNiU1RSUxOSVDMCVEMXMuJTE3JUEwM3UlRTQlMDklQjAlN0MlNUUlMkMlRUIlMTUlREIlMUYlM0MlOUUlQjclODAlOTElM0IlREJjJUFEJTNEbWElQkElOEIlM0VWJUFCJURCdC4lNUIlMUUlMDElQkIlMEYlQUIlRDUlOUYlQ0YlQUElRDUlREQlRTclRTQlN0YlMEJ4JUEzJUZDJTA2JUE5JTIzJTBBJUQ2JUMyJUExXzIlMDAlMDAlMDAlMDlwSFlzJTAwJTAwJTBCJTEzJTAwJTAwJTBCJTEzJTAxJTAwJTlBJTlDJTE4JTAwJTAwJTAwM0lEQVQ4JTExYyVGQyVGRiVGRiU3RiUzRSUwMyUxQSU2MCUwMSVGMiUzRiVBMyU4OTElODAlMDQlRkZRJTI2JUY4dyVDMCVCNDMlQTElREIlMEMlRTIlOEYlMEElQTIlODUlQ0FoJTgwJThDJTA2JTA4JTNDJTA0JUU4JTk2JTE4JTAwJUEzUyUwRCVDRCVDRiVEOCVDMSU5RCUwMCUwMCUwMCUwMElFTkQlQUVCJTYwJTgyXCIpO1xuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQsIHJlcGVhdC14O1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXIsIHRvcCBsZWZ0O1xufVxuXG4uYWNlX2RyYWdnaW5nIC5hY2VfY29udGVudCB7XG4gICAgY3Vyc29yOiBtb3ZlO1xufVxuXG4uYWNlX2ZvbGRpbmctZW5hYmxlZCAuYWNlX2d1dHRlci1jZWxsIHtcbiAgICBwYWRkaW5nLXJpZ2h0OiAxM3B4O1xufVxuXG4uYWNlX2ZvbGQtd2lkZ2V0IHtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cbiAgICBtYXJnaW46IDAgLTEycHggMXB4IDFweDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgaGVpZ2h0OiAxNHB4O1xuICAgIHdpZHRoOiAxMXB4O1xuICAgIHZlcnRpY2FsLWFsaWduOiB0ZXh0LWJvdHRvbTtcbiAgICBcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3BuZywlODlQTkclMEQlMEElMUElMEElMDAlMDAlMDAlMERJSERSJTAwJTAwJTAwJTA1JTAwJTAwJTAwJTA1JTA4JTA2JTAwJTAwJTAwJThEbyUyNiVFNSUwMCUwMCUwMDRJREFUeCVEQWUlOEElQjElMEQlMDAwJTBDJUMyJUYyJTJDSyU5NiVCQyVEMCU4RjklODElODhIJUU5JUQwJTBFJTk2JUMwJTEwJTkyJTNFJTAyJTgwJTVFJTgyJUU0JUE5Ki0lRUVzdyVDOCVDQyUxMSVFRSU5NnclRDglREMlRTkqRWglMEMlMTUxKCUwMCUwMCUwMCUwMElFTkQlQUVCJTYwJTgyXCIpO1xuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIDVweDtcblxuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbn1cblxuLmFjZV9mb2xkLXdpZGdldC5lbmQge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcImRhdGE6aW1hZ2UvcG5nLCU4OVBORyUwRCUwQSUxQSUwQSUwMCUwMCUwMCUwRElIRFIlMDAlMDAlMDAlMDUlMDAlMDAlMDAlMDUlMDglMDYlMDAlMDAlMDAlOERvJTI2JUU1JTAwJTAwJTAwNElEQVR4JURBbSVDNyVDMSUwOSUwMDAlMDhDJUQxJThDJUVDRSVDOEUoJThFJUVDJTAyKSUxRVpKJUYxJUMxJyUwNCUwN0klRTElRTUlRUUlQ0FMJUY1JUEyJTk5JTk5JTIyJUUyJUQ2JTFGVSVCNSVGRTAlRDl4JUE3JTI2V3o1JTBFJUQ1JTAwJTAwJTAwJTAwSUVORCVBRUIlNjAlODJcIik7XG59XG5cbi5hY2VfZm9sZC13aWRnZXQuY2xvc2VkIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3BuZywlODlQTkclMEQlMEElMUElMEElMDAlMDAlMDAlMERJSERSJTAwJTAwJTAwJTAzJTAwJTAwJTAwJTA2JTA4JTA2JTAwJTAwJTAwJTA2JUU1JTI0JTBDJTAwJTAwJTAwOUlEQVR4JURBNSVDQSVDMSUwOSUwMDAlMDglMDMlQzAlQUMqKCUzRSUwNCVDMSUwRCVCQSVCMSUyMyVBNFVoJUUwJTIwJTgxJUMwJUNDJUY4JTgyJTgxJUFBJUEyJUFBckdmciU4OCUwOCUxMSUxMSUxQyVERCU3RCVFMCVFRSU1QiVGNiVGNiVDQiVCOCUwNVElMkYlRTl0YWklRDklMDAlMDAlMDAlMDBJRU5EJUFFQiU2MCU4MlwiKTtcbn1cblxuLmFjZV9mb2xkLXdpZGdldDpob3ZlciB7XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjMpO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTtcbiAgICAtbW96LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTtcbiAgICAtbW96LWJveC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyk7XG4gICAgLXdlYmtpdC1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyk7XG4gICAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpO1xuICAgIGJveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTtcbiAgICBib3gtc2hhZG93OiAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpO1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciA0cHg7XG59XG5cbi5hY2VfZm9sZC13aWRnZXQ6YWN0aXZlIHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuNCk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjA1KTtcbiAgICAtbW96LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSk7XG4gICAgLW1vei1ib3gtc2hhZG93OiAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpO1xuICAgIC13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1KTtcbiAgICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCk7XG4gICAgYm94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1KTtcbiAgICBib3gtc2hhZG93OiAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpO1xufVxuXG4uYWNlX2ZvbGQtd2lkZ2V0LmludmFsaWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkI0QjQ7XG4gICAgYm9yZGVyLWNvbG9yOiAjREU1NTU1O1xufVxuIiksZGVmaW5lKCJhY2UvdGhlbWUvdGV4dG1hdGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCIsYi5pc0Rhcms9ITEsYi5jc3NDbGFzcz0iYWNlLXRtIixiLmNzc1RleHQ9Ii5hY2UtdG0gLmFjZV9lZGl0b3IgeyAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO30uYWNlLXRtIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7ICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO30uYWNlLXRtIC5hY2VfZ3V0dGVyIHsgIGJhY2tncm91bmQ6ICNlOGU4ZTg7ICBjb2xvcjogIzMzMzt9LmFjZS10bSAuYWNlX3ByaW50X21hcmdpbiB7ICB3aWR0aDogMXB4OyAgYmFja2dyb3VuZDogI2U4ZThlODt9LmFjZS10bSAuYWNlX2ZvbGQgeyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMEEyO30uYWNlLXRtIC5hY2VfdGV4dC1sYXllciB7ICBjdXJzb3I6IHRleHQ7fS5hY2UtdG0gLmFjZV9jdXJzb3IgeyAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCBibGFjazt9LmFjZS10bSAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHsgIGJvcmRlci1sZWZ0OiAwcHg7ICBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fSAgICAgICAgLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9pbnZpc2libGUgeyAgY29sb3I6IHJnYigxOTEsIDE5MSwgMTkxKTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9rZXl3b3JkIHsgIGNvbG9yOiBibHVlO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9idWlsZGluIHsgIGNvbG9yOiByZ2IoODgsIDcyLCAyNDYpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7ICBjb2xvcjogcmdiKDg4LCA5MiwgMjQ2KTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfbGlicmFyeSB7ICBjb2xvcjogcmdiKDYsIDE1MCwgMTQpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX2ludmFsaWQgeyAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDE1MywgMCwgMCk7ICBjb2xvcjogd2hpdGU7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24geyAgY29sb3I6IHJnYig2MCwgNzYsIDExNCk7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfY29uc3RhbnQgeyAgY29sb3I6IHJnYig2LCAxNTAsIDE0KTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV90eXBlLC5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfY2xhc3MgeyAgY29sb3I6IHJnYigxMDksIDEyMSwgMjIyKTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7ICBjb2xvcjogcmdiKDEwNCwgMTE4LCAxMzUpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX3N0cmluZyB7ICBjb2xvcjogcmdiKDMsIDEwNiwgNyk7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2VfY29tbWVudCB7ICBjb2xvcjogcmdiKDc2LCAxMzYsIDEwNyk7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2VfY29tbWVudC5hY2VfZG9jIHsgIGNvbG9yOiByZ2IoMCwgMTAyLCAyNTUpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQuYWNlX2RvYy5hY2VfdGFnIHsgIGNvbG9yOiByZ2IoMTI4LCAxNTksIDE5MSk7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMgeyAgY29sb3I6IHJnYigwLCAwLCAyMDUpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX3ZhcmlhYmxlIHsgIGNvbG9yOiByZ2IoNDksIDEzMiwgMTQ5KTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV94bWxfcGUgeyAgY29sb3I6IHJnYigxMDQsIDEwNCwgOTEpO30uYWNlLXRtIC5hY2VfZW50aXR5LmFjZV9uYW1lLmFjZV9mdW5jdGlvbiB7ICBjb2xvcjogIzAwMDBBMjt9LmFjZS10bSAuYWNlX21hcmt1cC5hY2VfbWFya3VwaW5lIHsgICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9LmFjZS10bSAuYWNlX21hcmt1cC5hY2VfaGVhZGluZyB7ICBjb2xvcjogcmdiKDEyLCA3LCAyNTUpO30uYWNlLXRtIC5hY2VfbWFya3VwLmFjZV9saXN0IHsgIGNvbG9yOnJnYigxODUsIDYsIDE0NCk7fS5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24geyAgYmFja2dyb3VuZDogcmdiKDE4MSwgMjEzLCAyNTUpO30uYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7ICBiYWNrZ3JvdW5kOiByZ2IoMjUyLCAyNTUsIDApO30uYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RhY2sgeyAgYmFja2dyb3VuZDogcmdiKDE2NCwgMjI5LCAxMDEpO30uYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7ICBtYXJnaW46IC0xcHggMCAwIC0xcHg7ICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTkyLCAxOTIsIDE5Mik7fS5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7ICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDcpO30uYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7ICBiYWNrZ3JvdW5kOiByZ2IoMjUwLCAyNTAsIDI1NSk7ICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMjAwLCAyMDAsIDI1MCk7fS5hY2UtdG0gLmFjZV9tZXRhLmFjZV90YWcgeyAgY29sb3I6cmdiKDI4LCAyLCAyNTUpO30uYWNlLXRtIC5hY2Vfc3RyaW5nLmFjZV9yZWdleCB7ICBjb2xvcjogcmdiKDI1NSwgMCwgMCl9Ijt2YXIgZD1hKCIuLi9saWIvZG9tIik7ZC5pbXBvcnRDc3NTdHJpbmcoYi5jc3NUZXh0LGIuY3NzQ2xhc3MpfSksZnVuY3Rpb24oKXt3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSxmdW5jdGlvbihhKXt3aW5kb3cuYWNlfHwod2luZG93LmFjZT17fSk7Zm9yKHZhciBiIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShiKSYmKGFjZVtiXT1hW2JdKX0pfSgp]]></data>
	</file>
	<file>
	  <filename>/ace/src/keybinding-emacs-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBTa3l3cml0ZXIuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBNb3ppbGxhLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDA5CiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgSnVsaWFuIFZpZXJlY2sgKGp1bGlhbi52aWVyZWNrQGdtYWlsLmNvbSkKICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL2tleWJvYXJkL2tleWJpbmRpbmcvZW1hY3MnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9rZXlib2FyZC9zdGF0ZV9oYW5kbGVyJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgU3RhdGVIYW5kbGVyID0gcmVxdWlyZSgiLi4vc3RhdGVfaGFuZGxlciIpLlN0YXRlSGFuZGxlcjsKdmFyIG1hdGNoQ2hhcmFjdGVyT25seSA9ICByZXF1aXJlKCIuLi9zdGF0ZV9oYW5kbGVyIikubWF0Y2hDaGFyYWN0ZXJPbmx5OwoKdmFyIGVtYWNzU3RhdGUgPSB7CiAgICBzdGFydDogWwogICAgICAgIHsKICAgICAgICAgICAga2V5OiAgICAiY3RybC14IiwKICAgICAgICAgICAgdGhlbjogICAiYy14IgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICByZWdleDogIFsgIig/OmNvbW1hbmQtKFswLTldKikpKiIsICIoZG93bnxjdHJsLW4pIiBdLAogICAgICAgICAgICBleGVjOiAgICJnb2xpbmVkb3duIiwKICAgICAgICAgICAgcGFyYW1zOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogInRpbWVzIiwKICAgICAgICAgICAgICAgICAgICBtYXRjaDogMSwKICAgICAgICAgICAgICAgICAgICB0eXBlOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IDEKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICByZWdleDogWyAiKD86Y29tbWFuZC0oWzAtOV0qKSkqIiwgIihyaWdodHxjdHJsLWYpIiBdLAogICAgICAgICAgICBleGVjOiAiZ290b3JpZ2h0IiwKICAgICAgICAgICAgcGFyYW1zOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogInRpbWVzIiwKICAgICAgICAgICAgICAgICAgICBtYXRjaDogMSwKICAgICAgICAgICAgICAgICAgICB0eXBlOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IDEKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICByZWdleDogWyAiKD86Y29tbWFuZC0oWzAtOV0qKSkqIiwgIih1cHxjdHJsLXApIiBdLAogICAgICAgICAgICBleGVjOiAiZ29saW5ldXAiLAogICAgICAgICAgICBwYXJhbXM6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiAidGltZXMiLAogICAgICAgICAgICAgICAgICAgIG1hdGNoOiAxLAogICAgICAgICAgICAgICAgICAgIHR5cGU6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogMQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIHJlZ2V4OiBbICIoPzpjb21tYW5kLShbMC05XSopKSoiLCAiKGxlZnR8Y3RybC1iKSIgXSwKICAgICAgICAgICAgZXhlYzogImdvdG9sZWZ0IiwKICAgICAgICAgICAgcGFyYW1zOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogInRpbWVzIiwKICAgICAgICAgICAgICAgICAgICBtYXRjaDogMSwKICAgICAgICAgICAgICAgICAgICB0eXBlOiAibnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IDEKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBjb21tZW50OiAiVGhpcyBiaW5kaW5nIG1hdGNoZXMgYWxsIHByaW50YWJsZSBjaGFyYWN0ZXJzIGV4Y2VwdCBudW1iZXJzIGFzIGxvbmcgYXMgdGhleSBhcmUgbm8gbnVtYmVycyBhbmQgcHJpbnQgdGhlbSBuIHRpbWVzLiIsCiAgICAgICAgICAgIHJlZ2V4OiAgWyAiKD86Y29tbWFuZC0oWzAtOV0qKSkiLCAiKFteMC05XSspKiIgXSwKICAgICAgICAgICAgbWF0Y2g6ICBtYXRjaENoYXJhY3Rlck9ubHksCiAgICAgICAgICAgIGV4ZWM6ICAgImluc2VydHRleHQiLAogICAgICAgICAgICBwYXJhbXM6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiAidGltZXMiLAogICAgICAgICAgICAgICAgICAgIG1hdGNoOiAxLAogICAgICAgICAgICAgICAgICAgIHR5cGU6ICJudW1iZXIiLAogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogIjEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgICAgICBtYXRjaDogMgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIGNvbW1lbnQ6ICJUaGlzIGJpbmRpbmcgbWF0Y2hlcyBudW1iZXJzIGFzIGxvbmcgYXMgdGhlcmUgaXMgbm8gbWV0YV9udW1iZXIgaW4gdGhlIGJ1ZmZlci4iLAogICAgICAgICAgICByZWdleDogIFsgIihjb21tYW5kLVswLTldKikqIiwgIihbMC05XSspIiBdLAogICAgICAgICAgICBtYXRjaDogIG1hdGNoQ2hhcmFjdGVyT25seSwKICAgICAgICAgICAgZGlzYWxsb3dNYXRjaGVzOiAgWyAxIF0sCiAgICAgICAgICAgIGV4ZWM6ICAgImluc2VydHRleHQiLAogICAgICAgICAgICBwYXJhbXM6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgbWF0Y2g6IDIsCiAgICAgICAgICAgICAgICAgICAgdHlwZTogInRleHQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgcmVnZXg6IFsgImNvbW1hbmQtKFswLTldKikiLCAiKGNvbW1hbmQtWzAtOV18WzAtOV0pIiBdLAogICAgICAgICAgICBjb21tZW50OiAiU3RvcHMgZXhlY3V0aW9uIGlmIHRoZSByZWdleCAvbWV0YV9bMC05XSsvIG1hdGNoZXMgdG8gYXZvaWQgcmVzZXR0aW5nIHRoZSBidWZmZXIuIgogICAgICAgIH0KICAgIF0sCiAgICAiYy14IjogWwogICAgICAgIHsKICAgICAgICAgICAga2V5OiAiY3RybC1nIiwKICAgICAgICAgICAgdGhlbjogInN0YXJ0IgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBrZXk6ICJjdHJsLXMiLAogICAgICAgICAgICBleGVjOiAic2F2ZSIsCiAgICAgICAgICAgIHRoZW46ICJzdGFydCIKICAgICAgICB9CiAgICBdCn07CgpleHBvcnRzLkVtYWNzID0gbmV3IFN0YXRlSGFuZGxlcihlbWFjc1N0YXRlKTsKCn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIFNreXdyaXRlci4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIE1vemlsbGEuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDkKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICBKdWxpYW4gVmllcmVjayAoanVsaWFuLnZpZXJlY2tAZ21haWwuY29tKQogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2Uva2V5Ym9hcmQvc3RhdGVfaGFuZGxlcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCi8vIElmIHlvdSdyZSBkZXZlbG9waW5nIGEgbmV3IGtleW1hcHBpbmcgYW5kIHdhbnQgdG8gZ2V0IGFuIGlkZWEgd2hhdCdzIGdvaW5nCi8vIG9uLCB0aGVuIGVuYWJsZSBkZWJ1Z2dpbmcuCnZhciBERUJVRyA9IGZhbHNlOwoKZnVuY3Rpb24gU3RhdGVIYW5kbGVyKGtleW1hcHBpbmcpIHsKICAgIHRoaXMua2V5bWFwcGluZyA9IHRoaXMuJGJ1aWxkS2V5bWFwcGluZ1JlZ2V4KGtleW1hcHBpbmcpOwp9CgpTdGF0ZUhhbmRsZXIucHJvdG90eXBlID0gewogICAgLyoqCiAgICAgKiBCdWlsZCB0aGUgUmVnRXhwIGZyb20gdGhlIGtleW1hcHBpbmcgYXMgUmVnRXhwIGNhbid0IHN0b3JlZCBkaXJlY3RseQogICAgICogaW4gdGhlIG1ldGFkYXRhIEpTT04gYW5kIGFzIHRoZSBSZWdFeHAgdXNlZCB0byBtYXRjaCB0aGUga2V5cy9idWZmZXIKICAgICAqIG5lZWQgdG8gYmUgYWRhcHRlZC4KICAgICAqLwogICAgJGJ1aWxkS2V5bWFwcGluZ1JlZ2V4OiBmdW5jdGlvbihrZXltYXBwaW5nKSB7CiAgICAgICAgZm9yICh2YXIgc3RhdGUgaW4ga2V5bWFwcGluZykgewogICAgICAgICAgICB0aGlzLiRidWlsZEJpbmRpbmdzUmVnZXgoa2V5bWFwcGluZ1tzdGF0ZV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4ga2V5bWFwcGluZzsKICAgIH0sCgogICAgJGJ1aWxkQmluZGluZ3NSZWdleDogZnVuY3Rpb24oYmluZGluZ3MpIHsKICAgICAgICAvLyBFc2NhcGUgYSBnaXZlbiBSZWdleCBzdHJpbmcuCiAgICAgICAgYmluZGluZ3MuZm9yRWFjaChmdW5jdGlvbihiaW5kaW5nKSB7CiAgICAgICAgICAgIGlmIChiaW5kaW5nLmtleSkgewogICAgICAgICAgICAgICAgYmluZGluZy5rZXkgPSBuZXcgUmVnRXhwKCdeJyArIGJpbmRpbmcua2V5ICsgJyQnKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGJpbmRpbmcucmVnZXgpKSB7CiAgICAgICAgICAgICAgICBpZiAoISgna2V5JyBpbiBiaW5kaW5nKSkKICAgICAgICAgICAgICAgICAgYmluZGluZy5rZXkgPSBuZXcgUmVnRXhwKCdeJyArIGJpbmRpbmcucmVnZXhbMV0gKyAnJCcpOwogICAgICAgICAgICAgICAgYmluZGluZy5yZWdleCA9IG5ldyBSZWdFeHAoYmluZGluZy5yZWdleC5qb2luKCcnKSArICckJyk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoYmluZGluZy5yZWdleCkgewogICAgICAgICAgICAgICAgYmluZGluZy5yZWdleCA9IG5ldyBSZWdFeHAoYmluZGluZy5yZWdleCArICckJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0sCgogICAgJGNvbXBvc2VCdWZmZXI6IGZ1bmN0aW9uKGRhdGEsIGhhc2hJZCwga2V5LCBlKSB7CiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZGF0YSBvYmplY3QuCiAgICAgICAgaWYgKGRhdGEuc3RhdGUgPT0gbnVsbCB8fCBkYXRhLmJ1ZmZlciA9PSBudWxsKSB7CiAgICAgICAgICAgIGRhdGEuc3RhdGUgPSAic3RhcnQiOwogICAgICAgICAgICBkYXRhLmJ1ZmZlciA9ICIiOwogICAgICAgIH0KCiAgICAgICAgdmFyIGtleUFycmF5ID0gW107CiAgICAgICAgaWYgKGhhc2hJZCAmIDEpIGtleUFycmF5LnB1c2goImN0cmwiKTsKICAgICAgICBpZiAoaGFzaElkICYgOCkga2V5QXJyYXkucHVzaCgiY29tbWFuZCIpOwogICAgICAgIGlmIChoYXNoSWQgJiAyKSBrZXlBcnJheS5wdXNoKCJvcHRpb24iKTsKICAgICAgICBpZiAoaGFzaElkICYgNCkga2V5QXJyYXkucHVzaCgic2hpZnQiKTsKICAgICAgICBpZiAoa2V5KSAgICAgICAga2V5QXJyYXkucHVzaChrZXkpOwoKICAgICAgICB2YXIgc3ltYm9saWNOYW1lID0ga2V5QXJyYXkuam9pbigiLSIpOwogICAgICAgIHZhciBidWZmZXJUb1VzZSA9IGRhdGEuYnVmZmVyICsgc3ltYm9saWNOYW1lOwoKICAgICAgICAvLyBEb24ndCBhZGQgdGhlIHN5bWJvbGljIG5hbWUgdG8gdGhlIGtleSBidWZmZXIgaWYgdGhlIGFsdF8ga2V5IGlzCiAgICAgICAgLy8gcGFydCBvZiB0aGUgc3ltYm9saWMgbmFtZS4gSWYgaXQgc3RhcnRzIHdpdGggYWx0XywgdGhpcyBtZWFucwogICAgICAgIC8vIHRoYXQgdGhlIHVzZXIgaGl0IGFuIGFsdCBrZXljb21ibyBhbmQgdGhlcmUgd2lsbCBiZSBhIHNpbmdsZSwKICAgICAgICAvLyBuZXcgY2hhcmFjdGVyIGRldGVjdGVkIGFmdGVyIHRoaXMgZXZlbnQsIHdoaWNoIHRoZW4gd2lsbCBiZQogICAgICAgIC8vIGFkZGVkIHRvIHRoZSBidWZmZXIgKGUuZy4gYWx0X2ogd2lsbCByZXN1bHQgaW4g4oiGKS4KICAgICAgICAvLwogICAgICAgIC8vIFdlIHRlc3QgZm9yIDIgYW5kIG5vdCBmb3IgJiAyIGFzIHdlIG9ubHkgd2FudCB0byBleGNsdWRlIHRoZSBjYXNlIHdoZXJlCiAgICAgICAgLy8gdGhlIG9wdGlvbiBrZXkgaXMgcHJlc3NlZCBhbG9uZS4KICAgICAgICBpZiAoaGFzaElkICE9IDIpIHsKICAgICAgICAgICAgZGF0YS5idWZmZXIgPSBidWZmZXJUb1VzZTsKICAgICAgICB9CgogICAgICAgIHZhciBidWZmZXJPYmogPSB7CiAgICAgICAgICAgIGJ1ZmZlclRvVXNlOiBidWZmZXJUb1VzZSwKICAgICAgICAgICAgc3ltYm9saWNOYW1lOiBzeW1ib2xpY05hbWUsCiAgICAgICAgfTsKCiAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgYnVmZmVyT2JqLmtleUlkZW50aWZpZXIgPSBlLmtleUlkZW50aWZpZXIKICAgICAgICB9CgogICAgICAgIHJldHVybiBidWZmZXJPYmo7CiAgICB9LAoKICAgICRmaW5kOiBmdW5jdGlvbihkYXRhLCBidWZmZXIsIHN5bWJvbGljTmFtZSwgaGFzaElkLCBrZXksIGtleUlkZW50aWZpZXIpIHsKICAgICAgICAvLyBIb2xkcyB0aGUgY29tbWFuZCB0byBleGVjdXRlIGFuZCB0aGUgYXJncyBpZiBhIGNvbW1hbmQgbWF0Y2hlZC4KICAgICAgICB2YXIgcmVzdWx0ID0ge307CgogICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGJpbmRpbmdzIG9mIHRoZSBrZXltYXAgdW50aWwgYSBtYXRjaCBpcyBmb3VuZC4KICAgICAgICB0aGlzLmtleW1hcHBpbmdbZGF0YS5zdGF0ZV0uc29tZShmdW5jdGlvbihiaW5kaW5nKSB7CiAgICAgICAgICAgIHZhciBtYXRjaDsKCiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBrZXkgbWF0Y2hlcy4KICAgICAgICAgICAgaWYgKGJpbmRpbmcua2V5ICYmICFiaW5kaW5nLmtleS50ZXN0KHN5bWJvbGljTmFtZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJlZ2V4IG1hdGNoZXMuCiAgICAgICAgICAgIGlmIChiaW5kaW5nLnJlZ2V4ICYmICEobWF0Y2ggPSBiaW5kaW5nLnJlZ2V4LmV4ZWMoYnVmZmVyKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIG1hdGNoIGZ1bmN0aW9uIG1hdGNoZXMuCiAgICAgICAgICAgIGlmIChiaW5kaW5nLm1hdGNoICYmICFiaW5kaW5nLm1hdGNoKGJ1ZmZlciwgaGFzaElkLCBrZXksIHN5bWJvbGljTmFtZSwga2V5SWRlbnRpZmllcikpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGRpc2FsbG93ZWQgbWF0Y2hlcy4KICAgICAgICAgICAgaWYgKGJpbmRpbmcuZGlzYWxsb3dNYXRjaGVzKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJpbmRpbmcuZGlzYWxsb3dNYXRjaGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEhbWF0Y2hbYmluZGluZy5kaXNhbGxvd01hdGNoZXNbaV1dKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgY29tbWFuZCB0byBleGVjdXRlLCB0aGVuIGZpZ3VyZSBvdXQgdGhlCiAgICAgICAgICAgIC8vIGNvbW1hbmQgYW5kIHRoZSBhcmd1bWVudHMuCiAgICAgICAgICAgIGlmIChiaW5kaW5nLmV4ZWMpIHsKICAgICAgICAgICAgICAgIHJlc3VsdC5jb21tYW5kID0gYmluZGluZy5leGVjOwoKICAgICAgICAgICAgICAgIC8vIEJ1aWxkIHRoZSBhcmd1bWVudHMuCiAgICAgICAgICAgICAgICBpZiAoYmluZGluZy5wYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFyZ3MgPSB7fTsKICAgICAgICAgICAgICAgICAgICBiaW5kaW5nLnBhcmFtcy5mb3JFYWNoKGZ1bmN0aW9uKHBhcmFtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbS5tYXRjaCAhPSBudWxsICYmIG1hdGNoICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbWF0Y2hbcGFyYW0ubWF0Y2hdIHx8IHBhcmFtLmRlZmF1bHRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGFyYW0uZGVmYXVsdFZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0udHlwZSA9PT0gJ251bWJlcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGFyc2VJbnQodmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXJnc1twYXJhbS5uYW1lXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGF0YS5idWZmZXIgPSAiIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gSGFuZGxlIHRoZSAndGhlbicgcHJvcGVydHkuCiAgICAgICAgICAgIGlmIChiaW5kaW5nLnRoZW4pIHsKICAgICAgICAgICAgICAgIGRhdGEuc3RhdGUgPSBiaW5kaW5nLnRoZW47CiAgICAgICAgICAgICAgICBkYXRhLmJ1ZmZlciA9ICIiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBJZiBubyBjb21tYW5kIGlzIHNldCwgdGhlbiBleGVjdXRlIHRoZSAibnVsbCIgZmFrZSBjb21tYW5kLgogICAgICAgICAgICBpZiAocmVzdWx0LmNvbW1hbmQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmVzdWx0LmNvbW1hbmQgPSAibnVsbCI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChERUJVRykgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coIktleWJvYXJkU3RhdGVNYXBwZXIjZmluZCIsIGJpbmRpbmcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0pOwoKICAgICAgICBpZiAocmVzdWx0LmNvbW1hbmQpIHsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkYXRhLmJ1ZmZlciA9ICIiOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGtleUJpbmRpbmcuCiAgICAgKi8KICAgIGhhbmRsZUtleWJvYXJkOiBmdW5jdGlvbihkYXRhLCBoYXNoSWQsIGtleSwga2V5Q29kZSwgZSkgewogICAgICAgIC8vIElmIHdlIHByZXNzZWQgYW55IGNvbW1hbmQga2V5IGJ1dCBubyBvdGhlciBrZXksIHRoZW4gaWdub3JlIHRoZSBpbnB1dC4KICAgICAgICAvLyBPdGhlcndpc2UgInNoaWZ0LSIgaXMgYWRkZWQgdG8gdGhlIGJ1ZmZlciwgYW5kIGxhdGVyIG9uICJzaGlmdC1nIgogICAgICAgIC8vIHdoaWNoIHJlc3VsdHMgaW4gInNoaWZ0LXNoaWZ0LWciIHdoaWNoIGRvZXNuJ3QgbWFrZSBzZW5zZS4KICAgICAgICBpZiAoaGFzaElkICE9IDAgJiYgKGtleSA9PSAiIiB8fCBrZXkgPT0gU3RyaW5nLmZyb21DaGFyQ29kZSgwKSkpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAvLyBDb21wdXRlIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBrZXlib2FyZCBpbnB1dCBidWZmZXIuCiAgICAgICAgdmFyIHIgPSB0aGlzLiRjb21wb3NlQnVmZmVyKGRhdGEsIGhhc2hJZCwga2V5LCBlKTsKICAgICAgICB2YXIgYnVmZmVyID0gci5idWZmZXJUb1VzZTsKICAgICAgICB2YXIgc3ltYm9saWNOYW1lID0gci5zeW1ib2xpY05hbWU7CiAgICAgICAgdmFyIGtleUlkID0gci5rZXlJZGVudGlmaWVyOwoKICAgICAgICByID0gdGhpcy4kZmluZChkYXRhLCBidWZmZXIsIHN5bWJvbGljTmFtZSwgaGFzaElkLCBrZXksIGtleUlkKTsKICAgICAgICBpZiAoREVCVUcpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coIktleWJvYXJkU3RhdGVNYXBwZXIjbWF0Y2giLCBidWZmZXIsIHN5bWJvbGljTmFtZSwgcik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcjsKICAgIH0KfQoKLyoqCiAqIFRoaXMgaXMgYSB1c2VmdWwgbWF0Y2hpbmcgZnVuY3Rpb24gYW5kIHRoZXJlZm9yZSBpcyBkZWZpbmVkIGhlcmUgc28gdGhhdAogKiB1c2VycyBvZiBLZXlib2FyZFN0YXRlTWFwcGVyIGNhbiB1c2UgaXQuCiAqCiAqIEByZXR1cm4gYm9vbGVhbgogKiAgICAgICAgICBJZiBubyBjb21tYW5kIGtleSAoQ29tbWFuZHxPcHRpb258U2hpZnR8Q3RybCkgaXMgcHJlc3NlZCwgaXQKICogICAgICAgICAgcmV0dXJucyB0cnVlLiBJZiB0aGUgb25seSB0aGUgU2hpZnQga2V5IGlzIHByZXNzZWQgKyBhIGNoYXJhY3RlcgogKiAgICAgICAgICB0cnVlIGlzIHJldHVybmVkIGFzIHdlbGwuIE90aGVyd2lzZSwgZmFsc2UgaXMgcmV0dXJuZWQuCiAqICAgICAgICAgIFN1bW1pbmcgdXAsIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbmV2ZXIgdGhlIHVzZXIgdHlwZWQKICogICAgICAgICAgYSBub3JtYWwgY2hhcmFjdGVyIG9uIHRoZSBrZXlib2FyZCBhbmQgbm8gc2hvcnRjdXQuCiAqLwpleHBvcnRzLm1hdGNoQ2hhcmFjdGVyT25seSA9IGZ1bmN0aW9uKGJ1ZmZlciwgaGFzaElkLCBrZXksIHN5bWJvbGljTmFtZSkgewogICAgLy8gSWYgbm8gY29tbWFuZCBrZXlzIGFyZSBwcmVzc2VkLCB0aGVuIGNhdGNoIHRoZSBpbnB1dC4KICAgIGlmIChoYXNoSWQgPT0gMCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgLy8gSWYgb25seSB0aGUgc2hpZnQga2V5IGlzIHByZXNzZWQgYW5kIGEgY2hhcmFjdGVyIGtleSwgdGhlbgogICAgLy8gY2F0Y2ggdGhhdCBpbnB1dCBhcyB3ZWxsLgogICAgZWxzZSBpZiAoKGhhc2hJZCA9PSA0KSAmJiBrZXkubGVuZ3RoID09IDEpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIC8vIE90aGVyd2lzZSwgd2UgbGV0IHRoZSBpbnB1dCBnb3QgdGhyb3VnaC4KICAgIGVsc2UgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KfTsKCmV4cG9ydHMuU3RhdGVIYW5kbGVyID0gU3RhdGVIYW5kbGVyOwp9KTsKOwogICAgICAgICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgewogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KSgpOwogICAgICAgIA==]]></data>
	</file>
	<file>
	  <filename>/ace/src/keybinding-emacs.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2Uva2V5Ym9hcmQva2V5YmluZGluZy9lbWFjcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9rZXlib2FyZC9zdGF0ZV9oYW5kbGVyIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9zdGF0ZV9oYW5kbGVyIikuU3RhdGVIYW5kbGVyLGU9YSgiLi4vc3RhdGVfaGFuZGxlciIpLm1hdGNoQ2hhcmFjdGVyT25seSxmPXtzdGFydDpbe2tleToiY3RybC14Iix0aGVuOiJjLXgifSx7cmVnZXg6WyIoPzpjb21tYW5kLShbMC05XSopKSoiLCIoZG93bnxjdHJsLW4pIl0sZXhlYzoiZ29saW5lZG93biIscGFyYW1zOlt7bmFtZToidGltZXMiLG1hdGNoOjEsdHlwZToibnVtYmVyIixkZWZhdWx0VmFsdWU6MX1dfSx7cmVnZXg6WyIoPzpjb21tYW5kLShbMC05XSopKSoiLCIocmlnaHR8Y3RybC1mKSJdLGV4ZWM6ImdvdG9yaWdodCIscGFyYW1zOlt7bmFtZToidGltZXMiLG1hdGNoOjEsdHlwZToibnVtYmVyIixkZWZhdWx0VmFsdWU6MX1dfSx7cmVnZXg6WyIoPzpjb21tYW5kLShbMC05XSopKSoiLCIodXB8Y3RybC1wKSJdLGV4ZWM6ImdvbGluZXVwIixwYXJhbXM6W3tuYW1lOiJ0aW1lcyIsbWF0Y2g6MSx0eXBlOiJudW1iZXIiLGRlZmF1bHRWYWx1ZToxfV19LHtyZWdleDpbIig/OmNvbW1hbmQtKFswLTldKikpKiIsIihsZWZ0fGN0cmwtYikiXSxleGVjOiJnb3RvbGVmdCIscGFyYW1zOlt7bmFtZToidGltZXMiLG1hdGNoOjEsdHlwZToibnVtYmVyIixkZWZhdWx0VmFsdWU6MX1dfSx7Y29tbWVudDoiVGhpcyBiaW5kaW5nIG1hdGNoZXMgYWxsIHByaW50YWJsZSBjaGFyYWN0ZXJzIGV4Y2VwdCBudW1iZXJzIGFzIGxvbmcgYXMgdGhleSBhcmUgbm8gbnVtYmVycyBhbmQgcHJpbnQgdGhlbSBuIHRpbWVzLiIscmVnZXg6WyIoPzpjb21tYW5kLShbMC05XSopKSIsIihbXjAtOV0rKSoiXSxtYXRjaDplLGV4ZWM6Imluc2VydHRleHQiLHBhcmFtczpbe25hbWU6InRpbWVzIixtYXRjaDoxLHR5cGU6Im51bWJlciIsZGVmYXVsdFZhbHVlOiIxIn0se25hbWU6InRleHQiLG1hdGNoOjJ9XX0se2NvbW1lbnQ6IlRoaXMgYmluZGluZyBtYXRjaGVzIG51bWJlcnMgYXMgbG9uZyBhcyB0aGVyZSBpcyBubyBtZXRhX251bWJlciBpbiB0aGUgYnVmZmVyLiIscmVnZXg6WyIoY29tbWFuZC1bMC05XSopKiIsIihbMC05XSspIl0sbWF0Y2g6ZSxkaXNhbGxvd01hdGNoZXM6WzFdLGV4ZWM6Imluc2VydHRleHQiLHBhcmFtczpbe25hbWU6InRleHQiLG1hdGNoOjIsdHlwZToidGV4dCJ9XX0se3JlZ2V4OlsiY29tbWFuZC0oWzAtOV0qKSIsIihjb21tYW5kLVswLTldfFswLTldKSJdLGNvbW1lbnQ6IlN0b3BzIGV4ZWN1dGlvbiBpZiB0aGUgcmVnZXggL21ldGFfWzAtOV0rLyBtYXRjaGVzIHRvIGF2b2lkIHJlc2V0dGluZyB0aGUgYnVmZmVyLiJ9XSwiYy14Ijpbe2tleToiY3RybC1nIix0aGVuOiJzdGFydCJ9LHtrZXk6ImN0cmwtcyIsZXhlYzoic2F2ZSIsdGhlbjoic3RhcnQifV19O2IuRW1hY3M9bmV3IGQoZil9KSxkZWZpbmUoImFjZS9rZXlib2FyZC9zdGF0ZV9oYW5kbGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGUoYSl7dGhpcy5rZXltYXBwaW5nPXRoaXMuJGJ1aWxkS2V5bWFwcGluZ1JlZ2V4KGEpfSJ1c2Ugc3RyaWN0Ijt2YXIgZD0hMTtlLnByb3RvdHlwZT17JGJ1aWxkS2V5bWFwcGluZ1JlZ2V4OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYiBpbiBhKXRoaXMuJGJ1aWxkQmluZGluZ3NSZWdleChhW2JdKTtyZXR1cm4gYX0sJGJ1aWxkQmluZGluZ3NSZWdleDpmdW5jdGlvbihhKXthLmZvckVhY2goZnVuY3Rpb24oYSl7YS5rZXk/YS5rZXk9bmV3IFJlZ0V4cCgiXiIrYS5rZXkrIiQiKTpBcnJheS5pc0FycmF5KGEucmVnZXgpPygia2V5ImluIGF8fChhLmtleT1uZXcgUmVnRXhwKCJeIithLnJlZ2V4WzFdKyIkIikpLGEucmVnZXg9bmV3IFJlZ0V4cChhLnJlZ2V4LmpvaW4oIiIpKyIkIikpOmEucmVnZXgmJihhLnJlZ2V4PW5ldyBSZWdFeHAoYS5yZWdleCsiJCIpKX0pfSwkY29tcG9zZUJ1ZmZlcjpmdW5jdGlvbihhLGIsYyxkKXtpZihhLnN0YXRlPT1udWxsfHxhLmJ1ZmZlcj09bnVsbClhLnN0YXRlPSJzdGFydCIsYS5idWZmZXI9IiI7dmFyIGU9W107YiYxJiZlLnB1c2goImN0cmwiKSxiJjgmJmUucHVzaCgiY29tbWFuZCIpLGImMiYmZS5wdXNoKCJvcHRpb24iKSxiJjQmJmUucHVzaCgic2hpZnQiKSxjJiZlLnB1c2goYyk7dmFyIGY9ZS5qb2luKCItIiksZz1hLmJ1ZmZlcitmO2IhPTImJihhLmJ1ZmZlcj1nKTt2YXIgaD17YnVmZmVyVG9Vc2U6ZyxzeW1ib2xpY05hbWU6Zn07cmV0dXJuIGQmJihoLmtleUlkZW50aWZpZXI9ZC5rZXlJZGVudGlmaWVyKSxofSwkZmluZDpmdW5jdGlvbihhLGIsYyxlLGYsZyl7dmFyIGg9e307cmV0dXJuIHRoaXMua2V5bWFwcGluZ1thLnN0YXRlXS5zb21lKGZ1bmN0aW9uKGkpe3ZhciBqO2lmKGkua2V5JiYhaS5rZXkudGVzdChjKSlyZXR1cm4hMTtpZihpLnJlZ2V4JiYhKGo9aS5yZWdleC5leGVjKGIpKSlyZXR1cm4hMTtpZihpLm1hdGNoJiYhaS5tYXRjaChiLGUsZixjLGcpKXJldHVybiExO2lmKGkuZGlzYWxsb3dNYXRjaGVzKWZvcih2YXIgaz0wO2s8aS5kaXNhbGxvd01hdGNoZXMubGVuZ3RoO2srKylpZighIWpbaS5kaXNhbGxvd01hdGNoZXNba11dKXJldHVybiExO2lmKGkuZXhlYyl7aC5jb21tYW5kPWkuZXhlYztpZihpLnBhcmFtcyl7dmFyIGw7aC5hcmdzPXt9LGkucGFyYW1zLmZvckVhY2goZnVuY3Rpb24oYSl7YS5tYXRjaCE9bnVsbCYmaiE9bnVsbD9sPWpbYS5tYXRjaF18fGEuZGVmYXVsdFZhbHVlOmw9YS5kZWZhdWx0VmFsdWUsYS50eXBlPT09Im51bWJlciImJihsPXBhcnNlSW50KGwpKSxoLmFyZ3NbYS5uYW1lXT1sfSl9YS5idWZmZXI9IiJ9cmV0dXJuIGkudGhlbiYmKGEuc3RhdGU9aS50aGVuLGEuYnVmZmVyPSIiKSxoLmNvbW1hbmQ9PW51bGwmJihoLmNvbW1hbmQ9Im51bGwiKSxkJiZjb25zb2xlLmxvZygiS2V5Ym9hcmRTdGF0ZU1hcHBlciNmaW5kIixpKSwhMH0pLGguY29tbWFuZD9oOihhLmJ1ZmZlcj0iIiwhMSl9LGhhbmRsZUtleWJvYXJkOmZ1bmN0aW9uKGEsYixjLGUsZil7aWYoYj09MHx8YyE9IiImJmMhPVN0cmluZy5mcm9tQ2hhckNvZGUoMCkpe3ZhciBnPXRoaXMuJGNvbXBvc2VCdWZmZXIoYSxiLGMsZiksaD1nLmJ1ZmZlclRvVXNlLGk9Zy5zeW1ib2xpY05hbWUsaj1nLmtleUlkZW50aWZpZXI7cmV0dXJuIGc9dGhpcy4kZmluZChhLGgsaSxiLGMsaiksZCYmY29uc29sZS5sb2coIktleWJvYXJkU3RhdGVNYXBwZXIjbWF0Y2giLGgsaSxnKSxnfXJldHVybiBudWxsfX0sYi5tYXRjaENoYXJhY3Rlck9ubHk9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGI9PTA/ITA6Yj09NCYmYy5sZW5ndGg9PTE/ITA6ITF9LGIuU3RhdGVIYW5kbGVyPWV9KSxmdW5jdGlvbigpe3dpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLGZ1bmN0aW9uKGEpe3dpbmRvdy5hY2V8fCh3aW5kb3cuYWNlPXt9KTtmb3IodmFyIGIgaW4gYSlhLmhhc093blByb3BlcnR5KGIpJiYoYWNlW2JdPWFbYl0pfSl9KCk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/keybinding-vim-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBTa3l3cml0ZXIuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBNb3ppbGxhLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDA5CiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgSnVsaWFuIFZpZXJlY2sgKGp1bGlhbi52aWVyZWNrQGdtYWlsLmNvbSkKICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL2tleWJvYXJkL2tleWJpbmRpbmcvdmltJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2Uva2V5Ym9hcmQvc3RhdGVfaGFuZGxlciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIFN0YXRlSGFuZGxlciA9IHJlcXVpcmUoIi4uL3N0YXRlX2hhbmRsZXIiKS5TdGF0ZUhhbmRsZXI7CnZhciBtYXRjaENoYXJhY3Rlck9ubHkgPSAgcmVxdWlyZSgiLi4vc3RhdGVfaGFuZGxlciIpLm1hdGNoQ2hhcmFjdGVyT25seTsKCnZhciB2aW1jb21tYW5kID0gZnVuY3Rpb24oa2V5LCBleGVjLCB0aGVuKSB7CiAgICByZXR1cm4gewogICAgICAgIHJlZ2V4OiAgWyAiKFswLTldKikiLCBrZXkgXSwKICAgICAgICBleGVjOiAgIGV4ZWMsCiAgICAgICAgcGFyYW1zOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5hbWU6ICAgICAidGltZXMiLAogICAgICAgICAgICAgICAgbWF0Y2g6ICAgIDEsCiAgICAgICAgICAgICAgICB0eXBlOiAgICAgIm51bWJlciIsCiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICAgICAxCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgIHRoZW46ICAgdGhlbgogICAgfQp9Cgp2YXIgdmltU3RhdGVzID0gewogICAgc3RhcnQ6IFsKICAgICAgICB7CiAgICAgICAgICAgIGtleTogICAgImkiLAogICAgICAgICAgICB0aGVuOiAgICJpbnNlcnRNb2RlIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBrZXk6ICAgICJkIiwKICAgICAgICAgICAgdGhlbjogICAiZGVsZXRlTW9kZSIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAga2V5OiAgICAiYSIsCiAgICAgICAgICAgIGV4ZWM6ICAgImdvdG9yaWdodCIsCiAgICAgICAgICAgIHRoZW46ICAgImluc2VydE1vZGUiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIGtleTogICAgInNoaWZ0LWkiLAogICAgICAgICAgICBleGVjOiAgICJnb3RvbGluZXN0YXJ0IiwKICAgICAgICAgICAgdGhlbjogICAiaW5zZXJ0TW9kZSIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAga2V5OiAgICAic2hpZnQtYSIsCiAgICAgICAgICAgIGV4ZWM6ICAgImdvdG9saW5lZW5kIiwKICAgICAgICAgICAgdGhlbjogICAiaW5zZXJ0TW9kZSIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAga2V5OiAgICAic2hpZnQtYyIsCiAgICAgICAgICAgIGV4ZWM6ICAgInJlbW92ZXRvbGluZWVuZCIsCiAgICAgICAgICAgIHRoZW46ICAgImluc2VydE1vZGUiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIGtleTogICAgInNoaWZ0LXIiLAogICAgICAgICAgICBleGVjOiAgICJvdmVyd3JpdGUiLAogICAgICAgICAgICB0aGVuOiAgICJyZXBsYWNlTW9kZSIKICAgICAgICB9LAogICAgICAgIHZpbWNvbW1hbmQoIihrfHVwKSIsICJnb2xpbmV1cCIpLAogICAgICAgIHZpbWNvbW1hbmQoIihqfGRvd24pIiwgImdvbGluZWRvd24iKSwKICAgICAgICB2aW1jb21tYW5kKCIobHxyaWdodCkiLCAiZ290b3JpZ2h0IiksCiAgICAgICAgdmltY29tbWFuZCgiKGh8bGVmdCkiLCAiZ290b2xlZnQiKSwKICAgICAgICB7CiAgICAgICAgICAgIGtleTogICAgInNoaWZ0LWciLAogICAgICAgICAgICBleGVjOiAgICJnb3RvZW5kIgogICAgICAgIH0sCiAgICAgICAgdmltY29tbWFuZCgiYiIsICJnb3Rvd29yZGxlZnQiKSwKICAgICAgICB2aW1jb21tYW5kKCJlIiwgImdvdG93b3JkcmlnaHQiKSwKICAgICAgICB2aW1jb21tYW5kKCJ4IiwgImRlbCIpLAogICAgICAgIHZpbWNvbW1hbmQoInNoaWZ0LXgiLCAiYmFja3NwYWNlIiksCiAgICAgICAgdmltY29tbWFuZCgic2hpZnQtZCIsICJyZW1vdmV0b2xpbmVlbmQiKSwKICAgICAgICB2aW1jb21tYW5kKCJ1IiwgInVuZG8iKSwgLy8gW2NvdW50XSBvbiB0aGlzIG1heS9tYXkgbm90IHdvcmssIGRlcGVuZGluZyBvbiBicm93c2VyIGltcGxlbWVudGF0aW9uLi4uCiAgICAgICAgewogICAgICAgICAgICBjb21tZW50OiAgICAiQ2F0Y2ggc29tZSBrZXlib2FyZCBpbnB1dCB0byBzdG9wIGl0IGhlcmUiLAogICAgICAgICAgICBtYXRjaDogICAgICBtYXRjaENoYXJhY3Rlck9ubHkKICAgICAgICB9CiAgICBdLAogICAgaW5zZXJ0TW9kZTogWwogICAgICAgIHsKICAgICAgICAgICAga2V5OiAgICAgICJlc2MiLAogICAgICAgICAgICB0aGVuOiAgICAgInN0YXJ0IgogICAgICAgIH0KICAgIF0sCiAgICByZXBsYWNlTW9kZTogWwogICAgICAgIHsKICAgICAgICAgICAga2V5OiAgICAgICJlc2MiLAogICAgICAgICAgICBleGVjOiAgICAgIm92ZXJ3cml0ZSIsCiAgICAgICAgICAgIHRoZW46ICAgICAic3RhcnQiCiAgICAgICAgfQogICAgXSwKICAgIGRlbGV0ZU1vZGU6IFsKICAgICAgICB7CiAgICAgICAgICAgIGtleTogICAgICAiZCIsCiAgICAgICAgICAgIGV4ZWM6ICAgICAicmVtb3ZlbGluZSIsCiAgICAgICAgICAgIHRoZW46ICAgICAic3RhcnQiCiAgICAgICAgfQogICAgXQp9OwoKZXhwb3J0cy5WaW0gPSBuZXcgU3RhdGVIYW5kbGVyKHZpbVN0YXRlcyk7Cgp9KTsKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBTa3l3cml0ZXIuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBNb3ppbGxhLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDA5CiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgSnVsaWFuIFZpZXJlY2sgKGp1bGlhbi52aWVyZWNrQGdtYWlsLmNvbSkKICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL2tleWJvYXJkL3N0YXRlX2hhbmRsZXInLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7CgovLyBJZiB5b3UncmUgZGV2ZWxvcGluZyBhIG5ldyBrZXltYXBwaW5nIGFuZCB3YW50IHRvIGdldCBhbiBpZGVhIHdoYXQncyBnb2luZwovLyBvbiwgdGhlbiBlbmFibGUgZGVidWdnaW5nLgp2YXIgREVCVUcgPSBmYWxzZTsKCmZ1bmN0aW9uIFN0YXRlSGFuZGxlcihrZXltYXBwaW5nKSB7CiAgICB0aGlzLmtleW1hcHBpbmcgPSB0aGlzLiRidWlsZEtleW1hcHBpbmdSZWdleChrZXltYXBwaW5nKTsKfQoKU3RhdGVIYW5kbGVyLnByb3RvdHlwZSA9IHsKICAgIC8qKgogICAgICogQnVpbGQgdGhlIFJlZ0V4cCBmcm9tIHRoZSBrZXltYXBwaW5nIGFzIFJlZ0V4cCBjYW4ndCBzdG9yZWQgZGlyZWN0bHkKICAgICAqIGluIHRoZSBtZXRhZGF0YSBKU09OIGFuZCBhcyB0aGUgUmVnRXhwIHVzZWQgdG8gbWF0Y2ggdGhlIGtleXMvYnVmZmVyCiAgICAgKiBuZWVkIHRvIGJlIGFkYXB0ZWQuCiAgICAgKi8KICAgICRidWlsZEtleW1hcHBpbmdSZWdleDogZnVuY3Rpb24oa2V5bWFwcGluZykgewogICAgICAgIGZvciAodmFyIHN0YXRlIGluIGtleW1hcHBpbmcpIHsKICAgICAgICAgICAgdGhpcy4kYnVpbGRCaW5kaW5nc1JlZ2V4KGtleW1hcHBpbmdbc3RhdGVdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGtleW1hcHBpbmc7CiAgICB9LAoKICAgICRidWlsZEJpbmRpbmdzUmVnZXg6IGZ1bmN0aW9uKGJpbmRpbmdzKSB7CiAgICAgICAgLy8gRXNjYXBlIGEgZ2l2ZW4gUmVnZXggc3RyaW5nLgogICAgICAgIGJpbmRpbmdzLmZvckVhY2goZnVuY3Rpb24oYmluZGluZykgewogICAgICAgICAgICBpZiAoYmluZGluZy5rZXkpIHsKICAgICAgICAgICAgICAgIGJpbmRpbmcua2V5ID0gbmV3IFJlZ0V4cCgnXicgKyBiaW5kaW5nLmtleSArICckJyk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShiaW5kaW5nLnJlZ2V4KSkgewogICAgICAgICAgICAgICAgaWYgKCEoJ2tleScgaW4gYmluZGluZykpCiAgICAgICAgICAgICAgICAgIGJpbmRpbmcua2V5ID0gbmV3IFJlZ0V4cCgnXicgKyBiaW5kaW5nLnJlZ2V4WzFdICsgJyQnKTsKICAgICAgICAgICAgICAgIGJpbmRpbmcucmVnZXggPSBuZXcgUmVnRXhwKGJpbmRpbmcucmVnZXguam9pbignJykgKyAnJCcpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGJpbmRpbmcucmVnZXgpIHsKICAgICAgICAgICAgICAgIGJpbmRpbmcucmVnZXggPSBuZXcgUmVnRXhwKGJpbmRpbmcucmVnZXggKyAnJCcpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9LAoKICAgICRjb21wb3NlQnVmZmVyOiBmdW5jdGlvbihkYXRhLCBoYXNoSWQsIGtleSwgZSkgewogICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGRhdGEgb2JqZWN0LgogICAgICAgIGlmIChkYXRhLnN0YXRlID09IG51bGwgfHwgZGF0YS5idWZmZXIgPT0gbnVsbCkgewogICAgICAgICAgICBkYXRhLnN0YXRlID0gInN0YXJ0IjsKICAgICAgICAgICAgZGF0YS5idWZmZXIgPSAiIjsKICAgICAgICB9CgogICAgICAgIHZhciBrZXlBcnJheSA9IFtdOwogICAgICAgIGlmIChoYXNoSWQgJiAxKSBrZXlBcnJheS5wdXNoKCJjdHJsIik7CiAgICAgICAgaWYgKGhhc2hJZCAmIDgpIGtleUFycmF5LnB1c2goImNvbW1hbmQiKTsKICAgICAgICBpZiAoaGFzaElkICYgMikga2V5QXJyYXkucHVzaCgib3B0aW9uIik7CiAgICAgICAgaWYgKGhhc2hJZCAmIDQpIGtleUFycmF5LnB1c2goInNoaWZ0Iik7CiAgICAgICAgaWYgKGtleSkgICAgICAgIGtleUFycmF5LnB1c2goa2V5KTsKCiAgICAgICAgdmFyIHN5bWJvbGljTmFtZSA9IGtleUFycmF5LmpvaW4oIi0iKTsKICAgICAgICB2YXIgYnVmZmVyVG9Vc2UgPSBkYXRhLmJ1ZmZlciArIHN5bWJvbGljTmFtZTsKCiAgICAgICAgLy8gRG9uJ3QgYWRkIHRoZSBzeW1ib2xpYyBuYW1lIHRvIHRoZSBrZXkgYnVmZmVyIGlmIHRoZSBhbHRfIGtleSBpcwogICAgICAgIC8vIHBhcnQgb2YgdGhlIHN5bWJvbGljIG5hbWUuIElmIGl0IHN0YXJ0cyB3aXRoIGFsdF8sIHRoaXMgbWVhbnMKICAgICAgICAvLyB0aGF0IHRoZSB1c2VyIGhpdCBhbiBhbHQga2V5Y29tYm8gYW5kIHRoZXJlIHdpbGwgYmUgYSBzaW5nbGUsCiAgICAgICAgLy8gbmV3IGNoYXJhY3RlciBkZXRlY3RlZCBhZnRlciB0aGlzIGV2ZW50LCB3aGljaCB0aGVuIHdpbGwgYmUKICAgICAgICAvLyBhZGRlZCB0byB0aGUgYnVmZmVyIChlLmcuIGFsdF9qIHdpbGwgcmVzdWx0IGluIOKIhikuCiAgICAgICAgLy8KICAgICAgICAvLyBXZSB0ZXN0IGZvciAyIGFuZCBub3QgZm9yICYgMiBhcyB3ZSBvbmx5IHdhbnQgdG8gZXhjbHVkZSB0aGUgY2FzZSB3aGVyZQogICAgICAgIC8vIHRoZSBvcHRpb24ga2V5IGlzIHByZXNzZWQgYWxvbmUuCiAgICAgICAgaWYgKGhhc2hJZCAhPSAyKSB7CiAgICAgICAgICAgIGRhdGEuYnVmZmVyID0gYnVmZmVyVG9Vc2U7CiAgICAgICAgfQoKICAgICAgICB2YXIgYnVmZmVyT2JqID0gewogICAgICAgICAgICBidWZmZXJUb1VzZTogYnVmZmVyVG9Vc2UsCiAgICAgICAgICAgIHN5bWJvbGljTmFtZTogc3ltYm9saWNOYW1lLAogICAgICAgIH07CgogICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgIGJ1ZmZlck9iai5rZXlJZGVudGlmaWVyID0gZS5rZXlJZGVudGlmaWVyCiAgICAgICAgfQoKICAgICAgICByZXR1cm4gYnVmZmVyT2JqOwogICAgfSwKCiAgICAkZmluZDogZnVuY3Rpb24oZGF0YSwgYnVmZmVyLCBzeW1ib2xpY05hbWUsIGhhc2hJZCwga2V5LCBrZXlJZGVudGlmaWVyKSB7CiAgICAgICAgLy8gSG9sZHMgdGhlIGNvbW1hbmQgdG8gZXhlY3V0ZSBhbmQgdGhlIGFyZ3MgaWYgYSBjb21tYW5kIG1hdGNoZWQuCiAgICAgICAgdmFyIHJlc3VsdCA9IHt9OwoKICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBiaW5kaW5ncyBvZiB0aGUga2V5bWFwIHVudGlsIGEgbWF0Y2ggaXMgZm91bmQuCiAgICAgICAgdGhpcy5rZXltYXBwaW5nW2RhdGEuc3RhdGVdLnNvbWUoZnVuY3Rpb24oYmluZGluZykgewogICAgICAgICAgICB2YXIgbWF0Y2g7CgogICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUga2V5IG1hdGNoZXMuCiAgICAgICAgICAgIGlmIChiaW5kaW5nLmtleSAmJiAhYmluZGluZy5rZXkudGVzdChzeW1ib2xpY05hbWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSByZWdleCBtYXRjaGVzLgogICAgICAgICAgICBpZiAoYmluZGluZy5yZWdleCAmJiAhKG1hdGNoID0gYmluZGluZy5yZWdleC5leGVjKGJ1ZmZlcikpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBtYXRjaCBmdW5jdGlvbiBtYXRjaGVzLgogICAgICAgICAgICBpZiAoYmluZGluZy5tYXRjaCAmJiAhYmluZGluZy5tYXRjaChidWZmZXIsIGhhc2hJZCwga2V5LCBzeW1ib2xpY05hbWUsIGtleUlkZW50aWZpZXIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIENoZWNrIGZvciBkaXNhbGxvd2VkIG1hdGNoZXMuCiAgICAgICAgICAgIGlmIChiaW5kaW5nLmRpc2FsbG93TWF0Y2hlcykgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiaW5kaW5nLmRpc2FsbG93TWF0Y2hlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGlmICghIW1hdGNoW2JpbmRpbmcuZGlzYWxsb3dNYXRjaGVzW2ldXSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIGNvbW1hbmQgdG8gZXhlY3V0ZSwgdGhlbiBmaWd1cmUgb3V0IHRoZQogICAgICAgICAgICAvLyBjb21tYW5kIGFuZCB0aGUgYXJndW1lbnRzLgogICAgICAgICAgICBpZiAoYmluZGluZy5leGVjKSB7CiAgICAgICAgICAgICAgICByZXN1bHQuY29tbWFuZCA9IGJpbmRpbmcuZXhlYzsKCiAgICAgICAgICAgICAgICAvLyBCdWlsZCB0aGUgYXJndW1lbnRzLgogICAgICAgICAgICAgICAgaWYgKGJpbmRpbmcucGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlOwogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcmdzID0ge307CiAgICAgICAgICAgICAgICAgICAgYmluZGluZy5wYXJhbXMuZm9yRWFjaChmdW5jdGlvbihwYXJhbSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0ubWF0Y2ggIT0gbnVsbCAmJiBtYXRjaCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1hdGNoW3BhcmFtLm1hdGNoXSB8fCBwYXJhbS5kZWZhdWx0VmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhcmFtLmRlZmF1bHRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtLnR5cGUgPT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhcnNlSW50KHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFyZ3NbcGFyYW0ubmFtZV0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRhdGEuYnVmZmVyID0gIiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgJ3RoZW4nIHByb3BlcnR5LgogICAgICAgICAgICBpZiAoYmluZGluZy50aGVuKSB7CiAgICAgICAgICAgICAgICBkYXRhLnN0YXRlID0gYmluZGluZy50aGVuOwogICAgICAgICAgICAgICAgZGF0YS5idWZmZXIgPSAiIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gSWYgbm8gY29tbWFuZCBpcyBzZXQsIHRoZW4gZXhlY3V0ZSB0aGUgIm51bGwiIGZha2UgY29tbWFuZC4KICAgICAgICAgICAgaWYgKHJlc3VsdC5jb21tYW5kID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJlc3VsdC5jb21tYW5kID0gIm51bGwiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoREVCVUcpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJLZXlib2FyZFN0YXRlTWFwcGVyI2ZpbmQiLCBiaW5kaW5nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9KTsKCiAgICAgICAgaWYgKHJlc3VsdC5jb21tYW5kKSB7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZGF0YS5idWZmZXIgPSAiIjsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBrZXlCaW5kaW5nLgogICAgICovCiAgICBoYW5kbGVLZXlib2FyZDogZnVuY3Rpb24oZGF0YSwgaGFzaElkLCBrZXksIGtleUNvZGUsIGUpIHsKICAgICAgICAvLyBJZiB3ZSBwcmVzc2VkIGFueSBjb21tYW5kIGtleSBidXQgbm8gb3RoZXIga2V5LCB0aGVuIGlnbm9yZSB0aGUgaW5wdXQuCiAgICAgICAgLy8gT3RoZXJ3aXNlICJzaGlmdC0iIGlzIGFkZGVkIHRvIHRoZSBidWZmZXIsIGFuZCBsYXRlciBvbiAic2hpZnQtZyIKICAgICAgICAvLyB3aGljaCByZXN1bHRzIGluICJzaGlmdC1zaGlmdC1nIiB3aGljaCBkb2Vzbid0IG1ha2Ugc2Vuc2UuCiAgICAgICAgaWYgKGhhc2hJZCAhPSAwICYmIChrZXkgPT0gIiIgfHwga2V5ID09IFN0cmluZy5mcm9tQ2hhckNvZGUoMCkpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgLy8gQ29tcHV0ZSB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUga2V5Ym9hcmQgaW5wdXQgYnVmZmVyLgogICAgICAgIHZhciByID0gdGhpcy4kY29tcG9zZUJ1ZmZlcihkYXRhLCBoYXNoSWQsIGtleSwgZSk7CiAgICAgICAgdmFyIGJ1ZmZlciA9IHIuYnVmZmVyVG9Vc2U7CiAgICAgICAgdmFyIHN5bWJvbGljTmFtZSA9IHIuc3ltYm9saWNOYW1lOwogICAgICAgIHZhciBrZXlJZCA9IHIua2V5SWRlbnRpZmllcjsKCiAgICAgICAgciA9IHRoaXMuJGZpbmQoZGF0YSwgYnVmZmVyLCBzeW1ib2xpY05hbWUsIGhhc2hJZCwga2V5LCBrZXlJZCk7CiAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJLZXlib2FyZFN0YXRlTWFwcGVyI21hdGNoIiwgYnVmZmVyLCBzeW1ib2xpY05hbWUsIHIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHI7CiAgICB9Cn0KCi8qKgogKiBUaGlzIGlzIGEgdXNlZnVsIG1hdGNoaW5nIGZ1bmN0aW9uIGFuZCB0aGVyZWZvcmUgaXMgZGVmaW5lZCBoZXJlIHNvIHRoYXQKICogdXNlcnMgb2YgS2V5Ym9hcmRTdGF0ZU1hcHBlciBjYW4gdXNlIGl0LgogKgogKiBAcmV0dXJuIGJvb2xlYW4KICogICAgICAgICAgSWYgbm8gY29tbWFuZCBrZXkgKENvbW1hbmR8T3B0aW9ufFNoaWZ0fEN0cmwpIGlzIHByZXNzZWQsIGl0CiAqICAgICAgICAgIHJldHVybnMgdHJ1ZS4gSWYgdGhlIG9ubHkgdGhlIFNoaWZ0IGtleSBpcyBwcmVzc2VkICsgYSBjaGFyYWN0ZXIKICogICAgICAgICAgdHJ1ZSBpcyByZXR1cm5lZCBhcyB3ZWxsLiBPdGhlcndpc2UsIGZhbHNlIGlzIHJldHVybmVkLgogKiAgICAgICAgICBTdW1taW5nIHVwLCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHdoZW5ldmVyIHRoZSB1c2VyIHR5cGVkCiAqICAgICAgICAgIGEgbm9ybWFsIGNoYXJhY3RlciBvbiB0aGUga2V5Ym9hcmQgYW5kIG5vIHNob3J0Y3V0LgogKi8KZXhwb3J0cy5tYXRjaENoYXJhY3Rlck9ubHkgPSBmdW5jdGlvbihidWZmZXIsIGhhc2hJZCwga2V5LCBzeW1ib2xpY05hbWUpIHsKICAgIC8vIElmIG5vIGNvbW1hbmQga2V5cyBhcmUgcHJlc3NlZCwgdGhlbiBjYXRjaCB0aGUgaW5wdXQuCiAgICBpZiAoaGFzaElkID09IDApIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIC8vIElmIG9ubHkgdGhlIHNoaWZ0IGtleSBpcyBwcmVzc2VkIGFuZCBhIGNoYXJhY3RlciBrZXksIHRoZW4KICAgIC8vIGNhdGNoIHRoYXQgaW5wdXQgYXMgd2VsbC4KICAgIGVsc2UgaWYgKChoYXNoSWQgPT0gNCkgJiYga2V5Lmxlbmd0aCA9PSAxKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAvLyBPdGhlcndpc2UsIHdlIGxldCB0aGUgaW5wdXQgZ290IHRocm91Z2guCiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9Cn07CgpleHBvcnRzLlN0YXRlSGFuZGxlciA9IFN0YXRlSGFuZGxlcjsKfSk7CjsKICAgICAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkKICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkoKTsKICAgICAgICA=]]></data>
	</file>
	<file>
	  <filename>/ace/src/keybinding-vim.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2Uva2V5Ym9hcmQva2V5YmluZGluZy92aW0iLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2Uva2V5Ym9hcmQvc3RhdGVfaGFuZGxlciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vc3RhdGVfaGFuZGxlciIpLlN0YXRlSGFuZGxlcixlPWEoIi4uL3N0YXRlX2hhbmRsZXIiKS5tYXRjaENoYXJhY3Rlck9ubHksZj1mdW5jdGlvbihhLGIsYyl7cmV0dXJue3JlZ2V4OlsiKFswLTldKikiLGFdLGV4ZWM6YixwYXJhbXM6W3tuYW1lOiJ0aW1lcyIsbWF0Y2g6MSx0eXBlOiJudW1iZXIiLGRlZmF1bHRWYWx1ZToxfV0sdGhlbjpjfX0sZz17c3RhcnQ6W3trZXk6ImkiLHRoZW46Imluc2VydE1vZGUifSx7a2V5OiJkIix0aGVuOiJkZWxldGVNb2RlIn0se2tleToiYSIsZXhlYzoiZ290b3JpZ2h0Iix0aGVuOiJpbnNlcnRNb2RlIn0se2tleToic2hpZnQtaSIsZXhlYzoiZ290b2xpbmVzdGFydCIsdGhlbjoiaW5zZXJ0TW9kZSJ9LHtrZXk6InNoaWZ0LWEiLGV4ZWM6ImdvdG9saW5lZW5kIix0aGVuOiJpbnNlcnRNb2RlIn0se2tleToic2hpZnQtYyIsZXhlYzoicmVtb3ZldG9saW5lZW5kIix0aGVuOiJpbnNlcnRNb2RlIn0se2tleToic2hpZnQtciIsZXhlYzoib3ZlcndyaXRlIix0aGVuOiJyZXBsYWNlTW9kZSJ9LGYoIihrfHVwKSIsImdvbGluZXVwIiksZigiKGp8ZG93bikiLCJnb2xpbmVkb3duIiksZigiKGx8cmlnaHQpIiwiZ290b3JpZ2h0IiksZigiKGh8bGVmdCkiLCJnb3RvbGVmdCIpLHtrZXk6InNoaWZ0LWciLGV4ZWM6ImdvdG9lbmQifSxmKCJiIiwiZ290b3dvcmRsZWZ0IiksZigiZSIsImdvdG93b3JkcmlnaHQiKSxmKCJ4IiwiZGVsIiksZigic2hpZnQteCIsImJhY2tzcGFjZSIpLGYoInNoaWZ0LWQiLCJyZW1vdmV0b2xpbmVlbmQiKSxmKCJ1IiwidW5kbyIpLHtjb21tZW50OiJDYXRjaCBzb21lIGtleWJvYXJkIGlucHV0IHRvIHN0b3AgaXQgaGVyZSIsbWF0Y2g6ZX1dLGluc2VydE1vZGU6W3trZXk6ImVzYyIsdGhlbjoic3RhcnQifV0scmVwbGFjZU1vZGU6W3trZXk6ImVzYyIsZXhlYzoib3ZlcndyaXRlIix0aGVuOiJzdGFydCJ9XSxkZWxldGVNb2RlOlt7a2V5OiJkIixleGVjOiJyZW1vdmVsaW5lIix0aGVuOiJzdGFydCJ9XX07Yi5WaW09bmV3IGQoZyl9KSxkZWZpbmUoImFjZS9rZXlib2FyZC9zdGF0ZV9oYW5kbGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGUoYSl7dGhpcy5rZXltYXBwaW5nPXRoaXMuJGJ1aWxkS2V5bWFwcGluZ1JlZ2V4KGEpfSJ1c2Ugc3RyaWN0Ijt2YXIgZD0hMTtlLnByb3RvdHlwZT17JGJ1aWxkS2V5bWFwcGluZ1JlZ2V4OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYiBpbiBhKXRoaXMuJGJ1aWxkQmluZGluZ3NSZWdleChhW2JdKTtyZXR1cm4gYX0sJGJ1aWxkQmluZGluZ3NSZWdleDpmdW5jdGlvbihhKXthLmZvckVhY2goZnVuY3Rpb24oYSl7YS5rZXk/YS5rZXk9bmV3IFJlZ0V4cCgiXiIrYS5rZXkrIiQiKTpBcnJheS5pc0FycmF5KGEucmVnZXgpPygia2V5ImluIGF8fChhLmtleT1uZXcgUmVnRXhwKCJeIithLnJlZ2V4WzFdKyIkIikpLGEucmVnZXg9bmV3IFJlZ0V4cChhLnJlZ2V4LmpvaW4oIiIpKyIkIikpOmEucmVnZXgmJihhLnJlZ2V4PW5ldyBSZWdFeHAoYS5yZWdleCsiJCIpKX0pfSwkY29tcG9zZUJ1ZmZlcjpmdW5jdGlvbihhLGIsYyxkKXtpZihhLnN0YXRlPT1udWxsfHxhLmJ1ZmZlcj09bnVsbClhLnN0YXRlPSJzdGFydCIsYS5idWZmZXI9IiI7dmFyIGU9W107YiYxJiZlLnB1c2goImN0cmwiKSxiJjgmJmUucHVzaCgiY29tbWFuZCIpLGImMiYmZS5wdXNoKCJvcHRpb24iKSxiJjQmJmUucHVzaCgic2hpZnQiKSxjJiZlLnB1c2goYyk7dmFyIGY9ZS5qb2luKCItIiksZz1hLmJ1ZmZlcitmO2IhPTImJihhLmJ1ZmZlcj1nKTt2YXIgaD17YnVmZmVyVG9Vc2U6ZyxzeW1ib2xpY05hbWU6Zn07cmV0dXJuIGQmJihoLmtleUlkZW50aWZpZXI9ZC5rZXlJZGVudGlmaWVyKSxofSwkZmluZDpmdW5jdGlvbihhLGIsYyxlLGYsZyl7dmFyIGg9e307cmV0dXJuIHRoaXMua2V5bWFwcGluZ1thLnN0YXRlXS5zb21lKGZ1bmN0aW9uKGkpe3ZhciBqO2lmKGkua2V5JiYhaS5rZXkudGVzdChjKSlyZXR1cm4hMTtpZihpLnJlZ2V4JiYhKGo9aS5yZWdleC5leGVjKGIpKSlyZXR1cm4hMTtpZihpLm1hdGNoJiYhaS5tYXRjaChiLGUsZixjLGcpKXJldHVybiExO2lmKGkuZGlzYWxsb3dNYXRjaGVzKWZvcih2YXIgaz0wO2s8aS5kaXNhbGxvd01hdGNoZXMubGVuZ3RoO2srKylpZighIWpbaS5kaXNhbGxvd01hdGNoZXNba11dKXJldHVybiExO2lmKGkuZXhlYyl7aC5jb21tYW5kPWkuZXhlYztpZihpLnBhcmFtcyl7dmFyIGw7aC5hcmdzPXt9LGkucGFyYW1zLmZvckVhY2goZnVuY3Rpb24oYSl7YS5tYXRjaCE9bnVsbCYmaiE9bnVsbD9sPWpbYS5tYXRjaF18fGEuZGVmYXVsdFZhbHVlOmw9YS5kZWZhdWx0VmFsdWUsYS50eXBlPT09Im51bWJlciImJihsPXBhcnNlSW50KGwpKSxoLmFyZ3NbYS5uYW1lXT1sfSl9YS5idWZmZXI9IiJ9cmV0dXJuIGkudGhlbiYmKGEuc3RhdGU9aS50aGVuLGEuYnVmZmVyPSIiKSxoLmNvbW1hbmQ9PW51bGwmJihoLmNvbW1hbmQ9Im51bGwiKSxkJiZjb25zb2xlLmxvZygiS2V5Ym9hcmRTdGF0ZU1hcHBlciNmaW5kIixpKSwhMH0pLGguY29tbWFuZD9oOihhLmJ1ZmZlcj0iIiwhMSl9LGhhbmRsZUtleWJvYXJkOmZ1bmN0aW9uKGEsYixjLGUsZil7aWYoYj09MHx8YyE9IiImJmMhPVN0cmluZy5mcm9tQ2hhckNvZGUoMCkpe3ZhciBnPXRoaXMuJGNvbXBvc2VCdWZmZXIoYSxiLGMsZiksaD1nLmJ1ZmZlclRvVXNlLGk9Zy5zeW1ib2xpY05hbWUsaj1nLmtleUlkZW50aWZpZXI7cmV0dXJuIGc9dGhpcy4kZmluZChhLGgsaSxiLGMsaiksZCYmY29uc29sZS5sb2coIktleWJvYXJkU3RhdGVNYXBwZXIjbWF0Y2giLGgsaSxnKSxnfXJldHVybiBudWxsfX0sYi5tYXRjaENoYXJhY3Rlck9ubHk9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGI9PTA/ITA6Yj09NCYmYy5sZW5ndGg9PTE/ITA6ITF9LGIuU3RhdGVIYW5kbGVyPWV9KSxmdW5jdGlvbigpe3dpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLGZ1bmN0aW9uKGEpe3dpbmRvdy5hY2V8fCh3aW5kb3cuYWNlPXt9KTtmb3IodmFyIGIgaW4gYSlhLmhhc093blByb3BlcnR5KGIpJiYoYWNlW2JdPWFbYl0pfSl9KCk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-clojure-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKiAgICAgIFNobG9tbyBaYWxtYW4gSGVpZ2ggPHNobG9tb3phbG1hbmhlaWdoIEFUIGdtYWlsIERPVCBjb20+CiAqICAgICAgQ2FyaW4gTWVpZXIKICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvY2xvanVyZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2Nsb2p1cmVfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX3BhcmVuc19vdXRkZW50JywgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsKdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsKdmFyIENsb2p1cmVIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vY2xvanVyZV9oaWdobGlnaHRfcnVsZXMiKS5DbG9qdXJlSGlnaGxpZ2h0UnVsZXM7CnZhciBNYXRjaGluZ1BhcmVuc091dGRlbnQgPSByZXF1aXJlKCIuL21hdGNoaW5nX3BhcmVuc19vdXRkZW50IikuTWF0Y2hpbmdQYXJlbnNPdXRkZW50Owp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOwoKdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IENsb2p1cmVIaWdobGlnaHRSdWxlcygpLmdldFJ1bGVzKCkpOwogICAgdGhpcy4kb3V0ZGVudCA9IG5ldyBNYXRjaGluZ1BhcmVuc091dGRlbnQoKTsKfTsKb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpIHsKICAgICAgICB2YXIgb3V0ZGVudCA9IHRydWU7CiAgICAgICAgdmFyIHJlID0gL14oXHMqKSMvOwoKICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspIHsKICAgICAgICAgICAgaWYgKCFyZS50ZXN0KGRvYy5nZXRMaW5lKGkpKSkgewogICAgICAgICAgICAgICAgb3V0ZGVudCA9IGZhbHNlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChvdXRkZW50KSB7CiAgICAgICAgICAgIHZhciBkZWxldGVSYW5nZSA9IG5ldyBSYW5nZSgwLCAwLCAwLCAwKTsKICAgICAgICAgICAgZm9yICh2YXIgaT1zdGFydFJvdzsgaTw9IGVuZFJvdzsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKGkpOwogICAgICAgICAgICAgICAgdmFyIG0gPSBsaW5lLm1hdGNoKHJlKTsKICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLnN0YXJ0LnJvdyA9IGk7CiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQucm93ID0gaTsKICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLmVuZC5jb2x1bW4gPSBtWzBdLmxlbmd0aDsKICAgICAgICAgICAgICAgIGRvYy5yZXBsYWNlKGRlbGV0ZVJhbmdlLCBtWzFdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZG9jLmluZGVudFJvd3Moc3RhcnRSb3csIGVuZFJvdywgIjsiKTsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7CiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsKCiAgICAgICAgdmFyIHRva2VuaXplZExpbmUgPSB0aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhsaW5lLCBzdGF0ZSk7CiAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplZExpbmUudG9rZW5zOwoKICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXS50eXBlID09ICJjb21tZW50IikgewogICAgICAgICAgICByZXR1cm4gaW5kZW50OwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoc3RhdGUgPT0gInN0YXJ0IikgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9bXChcW10vKTsKICAgICAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gIiAgIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBtYXRjaCA9IGxpbmUubWF0Y2goL1tcKV0vKTsKICAgICAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgICAgaW5kZW50ID0gIiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBpbmRlbnQ7CiAgICB9OwoKICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsKICAgIH07CgogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgewogICAgICAgIHRoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoZG9jLCByb3cpOwogICAgfTsKCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOwoKZXhwb3J0cy5Nb2RlID0gTW9kZTsKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICogICAgICBTaGxvbW8gWmFsbWFuIEhlaWdoIDxzaGxvbW96YWxtYW5oZWlnaCBBVCBnbWFpbCBET1QgY29tPgogKiAgICAgIENhcmluIE1laWVyCiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2Nsb2p1cmVfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsKdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7CgoKCnZhciBDbG9qdXJlSGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsKCiAgICAgICB2YXIgYnVpbHRpbkZ1bmN0aW9ucyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoJyogKjEgKjIgKjMgKmFnZW50KiAqYWxsb3ctdW5yZXNvbHZlZC12YXJzKiAqYXNzZXJ0KiAqY2xvanVyZS12ZXJzaW9uKiAnICsKICAgICAgICAgICAgJypjb21tYW5kLWxpbmUtYXJncyogKmNvbXBpbGUtZmlsZXMqICpjb21waWxlLXBhdGgqICplICplcnIqICpmaWxlKiAnICsKICAgICAgICAgICAgJypmbHVzaC1vbi1uZXdsaW5lKiAqaW4qICptYWNyby1tZXRhKiAqbWF0aC1jb250ZXh0KiAqbnMqICpvdXQqICcgKwogICAgICAgICAgICAnKnByaW50LWR1cCogKnByaW50LWxlbmd0aCogKnByaW50LWxldmVsKiAqcHJpbnQtbWV0YSogKnByaW50LXJlYWRhYmx5KiAnICsKICAgICAgICAgICAgJypyZWFkLWV2YWwqICpzb3VyY2UtcGF0aCogKnVzZS1jb250ZXh0LWNsYXNzbG9hZGVyKiAnICsKICAgICAgICAgICAgJyp3YXJuLW9uLXJlZmxlY3Rpb24qICsgLSAtPiAtJmd0OyAtPj4gLSZndDsmZ3Q7IC4uIC8gPCAmbHQ7IDw9ICZsdDs9ID0gJyArCiAgICAgICAgICAgICc9PSA+ICZndDsgPj0gJmd0Oz0gYWNjZXNzb3IgYWNsb25lICcgKwogICAgICAgICAgICAnYWRkLWNsYXNzcGF0aCBhZGQtd2F0Y2ggYWdlbnQgYWdlbnQtZXJyb3JzIGFnZXQgYWxlbmd0aCBhbGlhcyBhbGwtbnMgJyArCiAgICAgICAgICAgICdhbHRlciBhbHRlci1tZXRhISBhbHRlci12YXItcm9vdCBhbWFwIGFuY2VzdG9ycyBhbmQgYXBwbHkgYXJlZHVjZSAnICsKICAgICAgICAgICAgJ2FycmF5LW1hcCBhc2V0IGFzZXQtYm9vbGVhbiBhc2V0LWJ5dGUgYXNldC1jaGFyIGFzZXQtZG91YmxlIGFzZXQtZmxvYXQgJyArCiAgICAgICAgICAgICdhc2V0LWludCBhc2V0LWxvbmcgYXNldC1zaG9ydCBhc3NlcnQgYXNzb2MgYXNzb2MhIGFzc29jLWluIGFzc29jaWF0aXZlPyAnICsKICAgICAgICAgICAgJ2F0b20gYXdhaXQgYXdhaXQtZm9yIGF3YWl0MSBiYXNlcyBiZWFuIGJpZ2RlYyBiaWdpbnQgYmluZGluZyBiaXQtYW5kICcgKwogICAgICAgICAgICAnYml0LWFuZC1ub3QgYml0LWNsZWFyIGJpdC1mbGlwIGJpdC1ub3QgYml0LW9yIGJpdC1zZXQgYml0LXNoaWZ0LWxlZnQgJyArCiAgICAgICAgICAgICdiaXQtc2hpZnQtcmlnaHQgYml0LXRlc3QgYml0LXhvciBib29sZWFuIGJvb2xlYW4tYXJyYXkgYm9vbGVhbnMgJyArCiAgICAgICAgICAgICdib3VuZC1mbiBib3VuZC1mbiogYnV0bGFzdCBieXRlIGJ5dGUtYXJyYXkgYnl0ZXMgY2FzdCBjaGFyIGNoYXItYXJyYXkgJyArCiAgICAgICAgICAgICdjaGFyLWVzY2FwZS1zdHJpbmcgY2hhci1uYW1lLXN0cmluZyBjaGFyPyBjaGFycyBjaHVuayBjaHVuay1hcHBlbmQgJyArCiAgICAgICAgICAgICdjaHVuay1idWZmZXIgY2h1bmstY29ucyBjaHVuay1maXJzdCBjaHVuay1uZXh0IGNodW5rLXJlc3QgY2h1bmtlZC1zZXE/ICcgKwogICAgICAgICAgICAnY2xhc3MgY2xhc3M/IGNsZWFyLWFnZW50LWVycm9ycyBjbG9qdXJlLXZlcnNpb24gY29sbD8gY29tbWVudCBjb21tdXRlICcgKwogICAgICAgICAgICAnY29tcCBjb21wYXJhdG9yIGNvbXBhcmUgY29tcGFyZS1hbmQtc2V0ISBjb21waWxlIGNvbXBsZW1lbnQgY29uY2F0IGNvbmQgJyArCiAgICAgICAgICAgICdjb25kcCBjb25qIGNvbmohIGNvbnMgY29uc3RhbnRseSBjb25zdHJ1Y3QtcHJveHkgY29udGFpbnM/IGNvdW50ICcgKwogICAgICAgICAgICAnY291bnRlZD8gY3JlYXRlLW5zIGNyZWF0ZS1zdHJ1Y3QgY3ljbGUgZGVjIGRlY2ltYWw/IGRlY2xhcmUgZGVmaW5saW5lICcgKwogICAgICAgICAgICAnZGVmbWFjcm8gZGVmbWV0aG9kIGRlZm11bHRpIGRlZm4gZGVmbi0gZGVmb25jZSBkZWZzdHJ1Y3QgZGVsYXkgZGVsYXk/ICcgKwogICAgICAgICAgICAnZGVsaXZlciBkZXJlZiBkZXJpdmUgZGVzY2VuZGFudHMgZGVzdHJ1Y3R1cmUgZGlzaiBkaXNqISBkaXNzb2MgZGlzc29jISAnICsKICAgICAgICAgICAgJ2Rpc3RpbmN0IGRpc3RpbmN0PyBkb2FsbCBkb2MgZG9ydW4gZG9zZXEgZG9zeW5jIGRvdGltZXMgZG90byBkb3VibGUgJyArCiAgICAgICAgICAgICdkb3VibGUtYXJyYXkgZG91YmxlcyBkcm9wIGRyb3AtbGFzdCBkcm9wLXdoaWxlIGVtcHR5IGVtcHR5PyBlbnN1cmUgJyArCiAgICAgICAgICAgICdlbnVtZXJhdGlvbi1zZXEgZXZhbCBldmVuPyBldmVyeT8gZmFsc2U/IGZmaXJzdCBmaWxlLXNlcSBmaWx0ZXIgZmluZCAnICsKICAgICAgICAgICAgJ2ZpbmQtZG9jIGZpbmQtbnMgZmluZC12YXIgZmlyc3QgZmxvYXQgZmxvYXQtYXJyYXkgZmxvYXQ/IGZsb2F0cyBmbHVzaCAnICsKICAgICAgICAgICAgJ2ZuIGZuPyBmbmV4dCBmb3IgZm9yY2UgZm9ybWF0IGZ1dHVyZSBmdXR1cmUtY2FsbCBmdXR1cmUtY2FuY2VsICcgKwogICAgICAgICAgICAnZnV0dXJlLWNhbmNlbGxlZD8gZnV0dXJlLWRvbmU/IGZ1dHVyZT8gZ2VuLWNsYXNzIGdlbi1pbnRlcmZhY2UgZ2Vuc3ltICcgKwogICAgICAgICAgICAnZ2V0IGdldC1pbiBnZXQtbWV0aG9kIGdldC1wcm94eS1jbGFzcyBnZXQtdGhyZWFkLWJpbmRpbmdzIGdldC12YWxpZGF0b3IgJyArCiAgICAgICAgICAgICdoYXNoIGhhc2gtbWFwIGhhc2gtc2V0IGlkZW50aWNhbD8gaWRlbnRpdHkgaWYtbGV0IGlmLW5vdCBpZm4/IGltcG9ydCAnICsKICAgICAgICAgICAgJ2luLW5zIGluYyBpbml0LXByb3h5IGluc3RhbmNlPyBpbnQgaW50LWFycmF5IGludGVnZXI/IGludGVybGVhdmUgaW50ZXJuICcgKwogICAgICAgICAgICAnaW50ZXJwb3NlIGludG8gaW50by1hcnJheSBpbnRzIGlvISBpc2E/IGl0ZXJhdGUgaXRlcmF0b3Itc2VxIGp1eHQga2V5ICcgKwogICAgICAgICAgICAna2V5cyBrZXl3b3JkIGtleXdvcmQ/IGxhc3QgbGF6eS1jYXQgbGF6eS1zZXEgbGV0IGxldGZuIGxpbmUtc2VxIGxpc3QgJyArCiAgICAgICAgICAgICdsaXN0KiBsaXN0PyBsb2FkIGxvYWQtZmlsZSBsb2FkLXJlYWRlciBsb2FkLXN0cmluZyBsb2FkZWQtbGlicyBsb2NraW5nICcgKwogICAgICAgICAgICAnbG9uZyBsb25nLWFycmF5IGxvbmdzIGxvb3AgbWFjcm9leHBhbmQgbWFjcm9leHBhbmQtMSBtYWtlLWFycmF5ICcgKwogICAgICAgICAgICAnbWFrZS1oaWVyYXJjaHkgbWFwIG1hcD8gbWFwY2F0IG1heCBtYXgta2V5IG1lbWZuIG1lbW9pemUgbWVyZ2UgJyArCiAgICAgICAgICAgICdtZXJnZS13aXRoIG1ldGEgbWV0aG9kLXNpZyBtZXRob2RzIG1pbiBtaW4ta2V5IG1vZCBuYW1lIG5hbWVzcGFjZSBuZWc/ICcgKwogICAgICAgICAgICAnbmV3bGluZSBuZXh0IG5maXJzdCBuaWw/IG5uZXh0IG5vdCBub3QtYW55PyBub3QtZW1wdHkgbm90LWV2ZXJ5PyBub3Q9ICcgKwogICAgICAgICAgICAnbnMgbnMtYWxpYXNlcyBucy1pbXBvcnRzIG5zLWludGVybnMgbnMtbWFwIG5zLW5hbWUgbnMtcHVibGljcyAnICsKICAgICAgICAgICAgJ25zLXJlZmVycyBucy1yZXNvbHZlIG5zLXVuYWxpYXMgbnMtdW5tYXAgbnRoIG50aG5leHQgbnVtIG51bWJlcj8gb2RkPyAnICsKICAgICAgICAgICAgJ29yIHBhcmVudHMgcGFydGlhbCBwYXJ0aXRpb24gcGNhbGxzIHBlZWsgcGVyc2lzdGVudCEgcG1hcCBwb3AgcG9wISAnICsKICAgICAgICAgICAgJ3BvcC10aHJlYWQtYmluZGluZ3MgcG9zPyBwciBwci1zdHIgcHJlZmVyLW1ldGhvZCBwcmVmZXJzICcgKwogICAgICAgICAgICAncHJpbWl0aXZlcy1jbGFzc25hbWVzIHByaW50IHByaW50LWN0b3IgcHJpbnQtZG9jIHByaW50LWR1cCBwcmludC1tZXRob2QgJyArCiAgICAgICAgICAgICdwcmludC1uYW1lc3BhY2UtZG9jIHByaW50LXNpbXBsZSBwcmludC1zcGVjaWFsLWRvYyBwcmludC1zdHIgcHJpbnRmICcgKwogICAgICAgICAgICAncHJpbnRsbiBwcmludGxuLXN0ciBwcm4gcHJuLXN0ciBwcm9taXNlIHByb3h5IHByb3h5LWNhbGwtd2l0aC1zdXBlciAnICsKICAgICAgICAgICAgJ3Byb3h5LW1hcHBpbmdzIHByb3h5LW5hbWUgcHJveHktc3VwZXIgcHVzaC10aHJlYWQtYmluZGluZ3MgcHZhbHVlcyBxdW90ICcgKwogICAgICAgICAgICAncmFuZCByYW5kLWludCByYW5nZSByYXRpbz8gcmF0aW9uYWw/IHJhdGlvbmFsaXplIHJlLWZpbmQgcmUtZ3JvdXBzICcgKwogICAgICAgICAgICAncmUtbWF0Y2hlciByZS1tYXRjaGVzIHJlLXBhdHRlcm4gcmUtc2VxIHJlYWQgcmVhZC1saW5lIHJlYWQtc3RyaW5nICcgKwogICAgICAgICAgICAncmVkdWNlIHJlZiByZWYtaGlzdG9yeS1jb3VudCByZWYtbWF4LWhpc3RvcnkgcmVmLW1pbi1oaXN0b3J5IHJlZi1zZXQgJyArCiAgICAgICAgICAgICdyZWZlciByZWZlci1jbG9qdXJlIHJlbGVhc2UtcGVuZGluZy1zZW5kcyByZW0gcmVtb3ZlIHJlbW92ZS1tZXRob2QgJyArCiAgICAgICAgICAgICdyZW1vdmUtbnMgcmVtb3ZlLXdhdGNoIHJlcGVhdCByZXBlYXRlZGx5IHJlcGxhY2UgcmVwbGljYXRlIHJlcXVpcmUgJyArCiAgICAgICAgICAgICdyZXNldCEgcmVzZXQtbWV0YSEgcmVzb2x2ZSByZXN0IHJlc3VsdHNldC1zZXEgcmV2ZXJzZSByZXZlcnNpYmxlPyByc2VxICcgKwogICAgICAgICAgICAncnN1YnNlcSBzZWNvbmQgc2VsZWN0LWtleXMgc2VuZCBzZW5kLW9mZiBzZXEgc2VxPyBzZXF1ZSBzZXF1ZW5jZSAnICsKICAgICAgICAgICAgJ3NlcXVlbnRpYWw/IHNldCBzZXQtdmFsaWRhdG9yISBzZXQ/IHNob3J0IHNob3J0LWFycmF5IHNob3J0cyAnICsKICAgICAgICAgICAgJ3NodXRkb3duLWFnZW50cyBzbHVycCBzb21lIHNvcnQgc29ydC1ieSBzb3J0ZWQtbWFwIHNvcnRlZC1tYXAtYnkgJyArCiAgICAgICAgICAgICdzb3J0ZWQtc2V0IHNvcnRlZC1zZXQtYnkgc29ydGVkPyBzcGVjaWFsLWZvcm0tYW5jaG9yIHNwZWNpYWwtc3ltYm9sPyAnICsKICAgICAgICAgICAgJ3NwbGl0LWF0IHNwbGl0LXdpdGggc3RyIHN0cmVhbT8gc3RyaW5nPyBzdHJ1Y3Qgc3RydWN0LW1hcCBzdWJzIHN1YnNlcSAnICsKICAgICAgICAgICAgJ3N1YnZlYyBzdXBlcnMgc3dhcCEgc3ltYm9sIHN5bWJvbD8gc3luYyBzeW50YXgtc3ltYm9sLWFuY2hvciB0YWtlICcgKwogICAgICAgICAgICAndGFrZS1sYXN0IHRha2UtbnRoIHRha2Utd2hpbGUgdGVzdCB0aGUtbnMgdGltZSB0by1hcnJheSB0by1hcnJheS0yZCAnICsKICAgICAgICAgICAgJ3RyYW1wb2xpbmUgdHJhbnNpZW50IHRyZWUtc2VxIHRydWU/IHR5cGUgdW5jaGVja2VkLWFkZCB1bmNoZWNrZWQtZGVjICcgKwogICAgICAgICAgICAndW5jaGVja2VkLWRpdmlkZSB1bmNoZWNrZWQtaW5jIHVuY2hlY2tlZC1tdWx0aXBseSB1bmNoZWNrZWQtbmVnYXRlICcgKwogICAgICAgICAgICAndW5jaGVja2VkLXJlbWFpbmRlciB1bmNoZWNrZWQtc3VidHJhY3QgdW5kZXJpdmUgdW5xdW90ZSAnICsKICAgICAgICAgICAgJ3VucXVvdGUtc3BsaWNpbmcgdXBkYXRlLWluIHVwZGF0ZS1wcm94eSB1c2UgdmFsIHZhbHMgdmFyLWdldCB2YXItc2V0ICcgKwogICAgICAgICAgICAndmFyPyB2YXJ5LW1ldGEgdmVjIHZlY3RvciB2ZWN0b3I/IHdoZW4gd2hlbi1maXJzdCB3aGVuLWxldCB3aGVuLW5vdCAnICsKICAgICAgICAgICAgJ3doaWxlIHdpdGgtYmluZGluZ3Mgd2l0aC1iaW5kaW5ncyogd2l0aC1pbi1zdHIgd2l0aC1sb2FkaW5nLWNvbnRleHQgJyArCiAgICAgICAgICAgICd3aXRoLWxvY2FsLXZhcnMgd2l0aC1tZXRhIHdpdGgtb3BlbiB3aXRoLW91dC1zdHIgd2l0aC1wcmVjaXNpb24geG1sLXNlcSAnICsKICAgICAgICAgICAgJ3plcm8/IHppcG1hcCAnKS5zcGxpdCgiICIpCiAgICApOwoKICAgIHZhciBrZXl3b3JkcyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoJ2RlZiBkbyBmbiBpZiBsZXQgbG9vcCBtb25pdG9yLWVudGVyIG1vbml0b3ItZXhpdCBuZXcgcXVvdGUgcmVjdXIgc2V0ISAnICsKICAgICAgICAgICAgJ3Rocm93IHRyeSB2YXInKS5zcGxpdCgiICIpCiAgICApOwoKICAgIHZhciBidWlsZGluQ29uc3RhbnRzID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgidHJ1ZSBmYWxzZSBuaWwiKS5zcGxpdCgiICIpCiAgICApOwoKCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMuIFVzZSAoPzopIGluc3RlYWQuCiAgICAvLyByZWdleHBzIGFyZSBvcmRlcmVkIC0+IHRoZSBmaXJzdCBtYXRjaCBpcyB1c2VkCgogICAgdGhpcy4kcnVsZXMgPSB7CiAgICAgICAgInN0YXJ0IiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICI7LiokIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudAogICAgICAgICAgICAgICAgICAgIHJlZ2V4IDogIl5cPWJlZ2luJCIsCiAgICAgICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkIiwgLy9wYXJlbnMKICAgICAgICAgICAgICAgIHJlZ2V4IDogIltcXCh8XFwpXSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZCIsIC8vbGlzdHMKICAgICAgICAgICAgICAgIHJlZ2V4IDogIltcXCdcXChdIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkIiwgLy92ZWN0b3JzCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxbfFxcXV0iCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQiLCAvL3NldHMgYW5kIG1hcHMKICAgICAgICAgICAgICAgIHJlZ2V4IDogIltcXHt8XFx9fFxcI1xce3xcXCNcXH1dIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZCIsIC8vIGFtcGVyc2FuZHMKICAgICAgICAgICAgICAgICAgICByZWdleCA6ICdbXFwmXScKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQiLCAvLyBtZXRhZGF0YQogICAgICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1tcXCNcXF5cXHtdJwogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZCIsIC8vIGFub255bW91cyBmbiBzeW50YWN0aWMgc3VnYXIKICAgICAgICAgICAgICAgICAgICByZWdleCA6ICdbXFwlXScKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQiLCAvLyBkZXJlZiByZWFkZXIgbWFjcm8KICAgICAgICAgICAgICAgICAgICByZWdleCA6ICdbQF0nCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBoZXgKICAgICAgICAgICAgICAgIHJlZ2V4IDogIjBbeFhdWzAtOWEtZkEtRl0rXFxiIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5sYW5ndWFnZSIsCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fD18IT18PD18Pj18PD58PHw+fCF8JiZdJwogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGtleXdvcmRzLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsZGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWx0aW5GdW5jdGlvbnMuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuZnVuY3Rpb24iOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpZGVudGlmaWVyIjsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMKICAgICAgICAgICAgICAgIC8vIFRPRE86IFVuaWNvZGUgaWRlbnRpZmllcnMKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUKICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHN5bWJvbAogICAgICAgICAgICAgICAgcmVnZXggOiAiWzpdKD86W2EtekEtWl18XGQpKyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmcucmVnZXhwIiwgLy9SZWd1bGFyIEV4cHJlc3Npb25zCiAgICAgICAgICAgIHJlZ2V4IDogJy8jIig/OlwufChcXFwiKXxbXlwiIlxuXSkqIi9nJwogICAgICAgICAgICB9CiAgICAgICAgICAgICAgCiAgICAgICAgXSwKICAgICAgICAiY29tbWVudCIgOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQKICAgICAgICAgICAgICAgIHJlZ2V4IDogIl5cPWVuZCQiLAogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAiLisiCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9Owp9OwoKb29wLmluaGVyaXRzKENsb2p1cmVIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsKCmV4cG9ydHMuQ2xvanVyZUhpZ2hsaWdodFJ1bGVzID0gQ2xvanVyZUhpZ2hsaWdodFJ1bGVzOwp9KTsKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9tYXRjaGluZ19wYXJlbnNfb3V0ZGVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOwoKdmFyIE1hdGNoaW5nUGFyZW5zT3V0ZGVudCA9IGZ1bmN0aW9uKCkge307CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihsaW5lLCBpbnB1dCkgewogICAgICAgIGlmICghIC9eXHMrJC8udGVzdChsaW5lKSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgICByZXR1cm4gL15ccypcKS8udGVzdChpbnB1dCk7CiAgICB9OwoKICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihkb2MsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocm93KTsKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKlwpKS8pOwoKICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDsKCiAgICAgICAgdmFyIGNvbHVtbiA9IG1hdGNoWzFdLmxlbmd0aDsKICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gZG9jLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn0pOwoKICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcyB8fCBvcGVuQnJhY2VQb3Mucm93ID09IHJvdykgcmV0dXJuIDA7CgogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOwogICAgICAgIGRvYy5yZXBsYWNlKG5ldyBSYW5nZShyb3csIDAsIHJvdywgY29sdW1uLTEpLCBpbmRlbnQpOwogICAgfTsKCiAgICB0aGlzLiRnZXRJbmRlbnQgPSBmdW5jdGlvbihsaW5lKSB7CiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAiIjsKICAgIH07Cgp9KS5jYWxsKE1hdGNoaW5nUGFyZW5zT3V0ZGVudC5wcm90b3R5cGUpOwoKZXhwb3J0cy5NYXRjaGluZ1BhcmVuc091dGRlbnQgPSBNYXRjaGluZ1BhcmVuc091dGRlbnQ7Cn0pOwo7CiAgICAgICAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAg]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-clojure.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9jbG9qdXJlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL2Nsb2p1cmVfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvbWF0Y2hpbmdfcGFyZW5zX291dGRlbnQiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dCIpLk1vZGUsZj1hKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXIsZz1hKCIuL2Nsb2p1cmVfaGlnaGxpZ2h0X3J1bGVzIikuQ2xvanVyZUhpZ2hsaWdodFJ1bGVzLGg9YSgiLi9tYXRjaGluZ19wYXJlbnNfb3V0ZGVudCIpLk1hdGNoaW5nUGFyZW5zT3V0ZGVudCxpPWEoIi4uL3JhbmdlIikuUmFuZ2Usaj1mdW5jdGlvbigpe3RoaXMuJHRva2VuaXplcj1uZXcgZigobmV3IGcpLmdldFJ1bGVzKCkpLHRoaXMuJG91dGRlbnQ9bmV3IGh9O2QuaW5oZXJpdHMoaixlKSxmdW5jdGlvbigpe3RoaXMudG9nZ2xlQ29tbWVudExpbmVzPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSEwLGY9L14oXHMqKSMvO2Zvcih2YXIgZz1jO2c8PWQ7ZysrKWlmKCFmLnRlc3QoYi5nZXRMaW5lKGcpKSl7ZT0hMTticmVha31pZihlKXt2YXIgaD1uZXcgaSgwLDAsMCwwKTtmb3IodmFyIGc9YztnPD1kO2crKyl7dmFyIGo9Yi5nZXRMaW5lKGcpLGs9ai5tYXRjaChmKTtoLnN0YXJ0LnJvdz1nLGguZW5kLnJvdz1nLGguZW5kLmNvbHVtbj1rWzBdLmxlbmd0aCxiLnJlcGxhY2UoaCxrWzFdKX19ZWxzZSBiLmluZGVudFJvd3MoYyxkLCI7Iil9LHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuJGdldEluZGVudChiKSxlPXRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGIsYSksZj1lLnRva2VucztpZihmLmxlbmd0aCYmZltmLmxlbmd0aC0xXS50eXBlPT0iY29tbWVudCIpcmV0dXJuIGQ7aWYoYT09InN0YXJ0Iil7dmFyIGc9Yi5tYXRjaCgvW1woXFtdLyk7ZyYmKGQrPSIgICIpLGc9Yi5tYXRjaCgvW1wpXS8pLGcmJihkPSIiKX1yZXR1cm4gZH0sdGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChiLGMpfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGEsYixjKXt0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGIsYyl9fS5jYWxsKGoucHJvdG90eXBlKSxiLk1vZGU9an0pLGRlZmluZSgiYWNlL21vZGUvY2xvanVyZV9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxnPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKCIqICoxICoyICozICphZ2VudCogKmFsbG93LXVucmVzb2x2ZWQtdmFycyogKmFzc2VydCogKmNsb2p1cmUtdmVyc2lvbiogKmNvbW1hbmQtbGluZS1hcmdzKiAqY29tcGlsZS1maWxlcyogKmNvbXBpbGUtcGF0aCogKmUgKmVyciogKmZpbGUqICpmbHVzaC1vbi1uZXdsaW5lKiAqaW4qICptYWNyby1tZXRhKiAqbWF0aC1jb250ZXh0KiAqbnMqICpvdXQqICpwcmludC1kdXAqICpwcmludC1sZW5ndGgqICpwcmludC1sZXZlbCogKnByaW50LW1ldGEqICpwcmludC1yZWFkYWJseSogKnJlYWQtZXZhbCogKnNvdXJjZS1wYXRoKiAqdXNlLWNvbnRleHQtY2xhc3Nsb2FkZXIqICp3YXJuLW9uLXJlZmxlY3Rpb24qICsgLSAtPiAtJmd0OyAtPj4gLSZndDsmZ3Q7IC4uIC8gPCAmbHQ7IDw9ICZsdDs9ID0gPT0gPiAmZ3Q7ID49ICZndDs9IGFjY2Vzc29yIGFjbG9uZSBhZGQtY2xhc3NwYXRoIGFkZC13YXRjaCBhZ2VudCBhZ2VudC1lcnJvcnMgYWdldCBhbGVuZ3RoIGFsaWFzIGFsbC1ucyBhbHRlciBhbHRlci1tZXRhISBhbHRlci12YXItcm9vdCBhbWFwIGFuY2VzdG9ycyBhbmQgYXBwbHkgYXJlZHVjZSBhcnJheS1tYXAgYXNldCBhc2V0LWJvb2xlYW4gYXNldC1ieXRlIGFzZXQtY2hhciBhc2V0LWRvdWJsZSBhc2V0LWZsb2F0IGFzZXQtaW50IGFzZXQtbG9uZyBhc2V0LXNob3J0IGFzc2VydCBhc3NvYyBhc3NvYyEgYXNzb2MtaW4gYXNzb2NpYXRpdmU/IGF0b20gYXdhaXQgYXdhaXQtZm9yIGF3YWl0MSBiYXNlcyBiZWFuIGJpZ2RlYyBiaWdpbnQgYmluZGluZyBiaXQtYW5kIGJpdC1hbmQtbm90IGJpdC1jbGVhciBiaXQtZmxpcCBiaXQtbm90IGJpdC1vciBiaXQtc2V0IGJpdC1zaGlmdC1sZWZ0IGJpdC1zaGlmdC1yaWdodCBiaXQtdGVzdCBiaXQteG9yIGJvb2xlYW4gYm9vbGVhbi1hcnJheSBib29sZWFucyBib3VuZC1mbiBib3VuZC1mbiogYnV0bGFzdCBieXRlIGJ5dGUtYXJyYXkgYnl0ZXMgY2FzdCBjaGFyIGNoYXItYXJyYXkgY2hhci1lc2NhcGUtc3RyaW5nIGNoYXItbmFtZS1zdHJpbmcgY2hhcj8gY2hhcnMgY2h1bmsgY2h1bmstYXBwZW5kIGNodW5rLWJ1ZmZlciBjaHVuay1jb25zIGNodW5rLWZpcnN0IGNodW5rLW5leHQgY2h1bmstcmVzdCBjaHVua2VkLXNlcT8gY2xhc3MgY2xhc3M/IGNsZWFyLWFnZW50LWVycm9ycyBjbG9qdXJlLXZlcnNpb24gY29sbD8gY29tbWVudCBjb21tdXRlIGNvbXAgY29tcGFyYXRvciBjb21wYXJlIGNvbXBhcmUtYW5kLXNldCEgY29tcGlsZSBjb21wbGVtZW50IGNvbmNhdCBjb25kIGNvbmRwIGNvbmogY29uaiEgY29ucyBjb25zdGFudGx5IGNvbnN0cnVjdC1wcm94eSBjb250YWlucz8gY291bnQgY291bnRlZD8gY3JlYXRlLW5zIGNyZWF0ZS1zdHJ1Y3QgY3ljbGUgZGVjIGRlY2ltYWw/IGRlY2xhcmUgZGVmaW5saW5lIGRlZm1hY3JvIGRlZm1ldGhvZCBkZWZtdWx0aSBkZWZuIGRlZm4tIGRlZm9uY2UgZGVmc3RydWN0IGRlbGF5IGRlbGF5PyBkZWxpdmVyIGRlcmVmIGRlcml2ZSBkZXNjZW5kYW50cyBkZXN0cnVjdHVyZSBkaXNqIGRpc2ohIGRpc3NvYyBkaXNzb2MhIGRpc3RpbmN0IGRpc3RpbmN0PyBkb2FsbCBkb2MgZG9ydW4gZG9zZXEgZG9zeW5jIGRvdGltZXMgZG90byBkb3VibGUgZG91YmxlLWFycmF5IGRvdWJsZXMgZHJvcCBkcm9wLWxhc3QgZHJvcC13aGlsZSBlbXB0eSBlbXB0eT8gZW5zdXJlIGVudW1lcmF0aW9uLXNlcSBldmFsIGV2ZW4/IGV2ZXJ5PyBmYWxzZT8gZmZpcnN0IGZpbGUtc2VxIGZpbHRlciBmaW5kIGZpbmQtZG9jIGZpbmQtbnMgZmluZC12YXIgZmlyc3QgZmxvYXQgZmxvYXQtYXJyYXkgZmxvYXQ/IGZsb2F0cyBmbHVzaCBmbiBmbj8gZm5leHQgZm9yIGZvcmNlIGZvcm1hdCBmdXR1cmUgZnV0dXJlLWNhbGwgZnV0dXJlLWNhbmNlbCBmdXR1cmUtY2FuY2VsbGVkPyBmdXR1cmUtZG9uZT8gZnV0dXJlPyBnZW4tY2xhc3MgZ2VuLWludGVyZmFjZSBnZW5zeW0gZ2V0IGdldC1pbiBnZXQtbWV0aG9kIGdldC1wcm94eS1jbGFzcyBnZXQtdGhyZWFkLWJpbmRpbmdzIGdldC12YWxpZGF0b3IgaGFzaCBoYXNoLW1hcCBoYXNoLXNldCBpZGVudGljYWw/IGlkZW50aXR5IGlmLWxldCBpZi1ub3QgaWZuPyBpbXBvcnQgaW4tbnMgaW5jIGluaXQtcHJveHkgaW5zdGFuY2U/IGludCBpbnQtYXJyYXkgaW50ZWdlcj8gaW50ZXJsZWF2ZSBpbnRlcm4gaW50ZXJwb3NlIGludG8gaW50by1hcnJheSBpbnRzIGlvISBpc2E/IGl0ZXJhdGUgaXRlcmF0b3Itc2VxIGp1eHQga2V5IGtleXMga2V5d29yZCBrZXl3b3JkPyBsYXN0IGxhenktY2F0IGxhenktc2VxIGxldCBsZXRmbiBsaW5lLXNlcSBsaXN0IGxpc3QqIGxpc3Q/IGxvYWQgbG9hZC1maWxlIGxvYWQtcmVhZGVyIGxvYWQtc3RyaW5nIGxvYWRlZC1saWJzIGxvY2tpbmcgbG9uZyBsb25nLWFycmF5IGxvbmdzIGxvb3AgbWFjcm9leHBhbmQgbWFjcm9leHBhbmQtMSBtYWtlLWFycmF5IG1ha2UtaGllcmFyY2h5IG1hcCBtYXA/IG1hcGNhdCBtYXggbWF4LWtleSBtZW1mbiBtZW1vaXplIG1lcmdlIG1lcmdlLXdpdGggbWV0YSBtZXRob2Qtc2lnIG1ldGhvZHMgbWluIG1pbi1rZXkgbW9kIG5hbWUgbmFtZXNwYWNlIG5lZz8gbmV3bGluZSBuZXh0IG5maXJzdCBuaWw/IG5uZXh0IG5vdCBub3QtYW55PyBub3QtZW1wdHkgbm90LWV2ZXJ5PyBub3Q9IG5zIG5zLWFsaWFzZXMgbnMtaW1wb3J0cyBucy1pbnRlcm5zIG5zLW1hcCBucy1uYW1lIG5zLXB1YmxpY3MgbnMtcmVmZXJzIG5zLXJlc29sdmUgbnMtdW5hbGlhcyBucy11bm1hcCBudGggbnRobmV4dCBudW0gbnVtYmVyPyBvZGQ/IG9yIHBhcmVudHMgcGFydGlhbCBwYXJ0aXRpb24gcGNhbGxzIHBlZWsgcGVyc2lzdGVudCEgcG1hcCBwb3AgcG9wISBwb3AtdGhyZWFkLWJpbmRpbmdzIHBvcz8gcHIgcHItc3RyIHByZWZlci1tZXRob2QgcHJlZmVycyBwcmltaXRpdmVzLWNsYXNzbmFtZXMgcHJpbnQgcHJpbnQtY3RvciBwcmludC1kb2MgcHJpbnQtZHVwIHByaW50LW1ldGhvZCBwcmludC1uYW1lc3BhY2UtZG9jIHByaW50LXNpbXBsZSBwcmludC1zcGVjaWFsLWRvYyBwcmludC1zdHIgcHJpbnRmIHByaW50bG4gcHJpbnRsbi1zdHIgcHJuIHBybi1zdHIgcHJvbWlzZSBwcm94eSBwcm94eS1jYWxsLXdpdGgtc3VwZXIgcHJveHktbWFwcGluZ3MgcHJveHktbmFtZSBwcm94eS1zdXBlciBwdXNoLXRocmVhZC1iaW5kaW5ncyBwdmFsdWVzIHF1b3QgcmFuZCByYW5kLWludCByYW5nZSByYXRpbz8gcmF0aW9uYWw/IHJhdGlvbmFsaXplIHJlLWZpbmQgcmUtZ3JvdXBzIHJlLW1hdGNoZXIgcmUtbWF0Y2hlcyByZS1wYXR0ZXJuIHJlLXNlcSByZWFkIHJlYWQtbGluZSByZWFkLXN0cmluZyByZWR1Y2UgcmVmIHJlZi1oaXN0b3J5LWNvdW50IHJlZi1tYXgtaGlzdG9yeSByZWYtbWluLWhpc3RvcnkgcmVmLXNldCByZWZlciByZWZlci1jbG9qdXJlIHJlbGVhc2UtcGVuZGluZy1zZW5kcyByZW0gcmVtb3ZlIHJlbW92ZS1tZXRob2QgcmVtb3ZlLW5zIHJlbW92ZS13YXRjaCByZXBlYXQgcmVwZWF0ZWRseSByZXBsYWNlIHJlcGxpY2F0ZSByZXF1aXJlIHJlc2V0ISByZXNldC1tZXRhISByZXNvbHZlIHJlc3QgcmVzdWx0c2V0LXNlcSByZXZlcnNlIHJldmVyc2libGU/IHJzZXEgcnN1YnNlcSBzZWNvbmQgc2VsZWN0LWtleXMgc2VuZCBzZW5kLW9mZiBzZXEgc2VxPyBzZXF1ZSBzZXF1ZW5jZSBzZXF1ZW50aWFsPyBzZXQgc2V0LXZhbGlkYXRvciEgc2V0PyBzaG9ydCBzaG9ydC1hcnJheSBzaG9ydHMgc2h1dGRvd24tYWdlbnRzIHNsdXJwIHNvbWUgc29ydCBzb3J0LWJ5IHNvcnRlZC1tYXAgc29ydGVkLW1hcC1ieSBzb3J0ZWQtc2V0IHNvcnRlZC1zZXQtYnkgc29ydGVkPyBzcGVjaWFsLWZvcm0tYW5jaG9yIHNwZWNpYWwtc3ltYm9sPyBzcGxpdC1hdCBzcGxpdC13aXRoIHN0ciBzdHJlYW0/IHN0cmluZz8gc3RydWN0IHN0cnVjdC1tYXAgc3VicyBzdWJzZXEgc3VidmVjIHN1cGVycyBzd2FwISBzeW1ib2wgc3ltYm9sPyBzeW5jIHN5bnRheC1zeW1ib2wtYW5jaG9yIHRha2UgdGFrZS1sYXN0IHRha2UtbnRoIHRha2Utd2hpbGUgdGVzdCB0aGUtbnMgdGltZSB0by1hcnJheSB0by1hcnJheS0yZCB0cmFtcG9saW5lIHRyYW5zaWVudCB0cmVlLXNlcSB0cnVlPyB0eXBlIHVuY2hlY2tlZC1hZGQgdW5jaGVja2VkLWRlYyB1bmNoZWNrZWQtZGl2aWRlIHVuY2hlY2tlZC1pbmMgdW5jaGVja2VkLW11bHRpcGx5IHVuY2hlY2tlZC1uZWdhdGUgdW5jaGVja2VkLXJlbWFpbmRlciB1bmNoZWNrZWQtc3VidHJhY3QgdW5kZXJpdmUgdW5xdW90ZSB1bnF1b3RlLXNwbGljaW5nIHVwZGF0ZS1pbiB1cGRhdGUtcHJveHkgdXNlIHZhbCB2YWxzIHZhci1nZXQgdmFyLXNldCB2YXI/IHZhcnktbWV0YSB2ZWMgdmVjdG9yIHZlY3Rvcj8gd2hlbiB3aGVuLWZpcnN0IHdoZW4tbGV0IHdoZW4tbm90IHdoaWxlIHdpdGgtYmluZGluZ3Mgd2l0aC1iaW5kaW5ncyogd2l0aC1pbi1zdHIgd2l0aC1sb2FkaW5nLWNvbnRleHQgd2l0aC1sb2NhbC12YXJzIHdpdGgtbWV0YSB3aXRoLW9wZW4gd2l0aC1vdXQtc3RyIHdpdGgtcHJlY2lzaW9uIHhtbC1zZXEgemVybz8gemlwbWFwICIuc3BsaXQoIiAiKSksYj1lLmFycmF5VG9NYXAoImRlZiBkbyBmbiBpZiBsZXQgbG9vcCBtb25pdG9yLWVudGVyIG1vbml0b3ItZXhpdCBuZXcgcXVvdGUgcmVjdXIgc2V0ISB0aHJvdyB0cnkgdmFyIi5zcGxpdCgiICIpKSxjPWUuYXJyYXlUb01hcCgidHJ1ZSBmYWxzZSBuaWwiLnNwbGl0KCIgIikpO3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiOy4qJCJ9LHt0b2tlbjoiY29tbWVudCIscmVnZXg6Il49YmVnaW4kIixuZXh0OiJjb21tZW50In0se3Rva2VuOiJrZXl3b3JkIixyZWdleDoiW1xcKHxcXCldIn0se3Rva2VuOiJrZXl3b3JkIixyZWdleDoiW1xcJ1xcKF0ifSx7dG9rZW46ImtleXdvcmQiLHJlZ2V4OiJbXFxbfFxcXV0ifSx7dG9rZW46ImtleXdvcmQiLHJlZ2V4OiJbXFx7fFxcfXxcXCNcXHt8XFwjXFx9XSJ9LHt0b2tlbjoia2V5d29yZCIscmVnZXg6IltcXCZdIn0se3Rva2VuOiJrZXl3b3JkIixyZWdleDoiW1xcI1xcXlxce10ifSx7dG9rZW46ImtleXdvcmQiLHJlZ2V4OiJbXFwlXSJ9LHt0b2tlbjoia2V5d29yZCIscmVnZXg6IltAXSJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IjBbeFhdWzAtOWEtZkEtRl0rXFxiIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIifSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlIixyZWdleDoiWyF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfHw9fCE9fDw9fD49fDw+fDx8PnwhfCYmXSJ9LHt0b2tlbjpmdW5jdGlvbihkKXtyZXR1cm4gYi5oYXNPd25Qcm9wZXJ0eShkKT8ia2V5d29yZCI6Yy5oYXNPd25Qcm9wZXJ0eShkKT8iY29uc3RhbnQubGFuZ3VhZ2UiOmEuaGFzT3duUHJvcGVydHkoZCk/InN1cHBvcnQuZnVuY3Rpb24iOiJpZGVudGlmaWVyIn0scmVnZXg6IlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDonWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXSd9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiWzpdKD86W2EtekEtWl18ZCkrIn0se3Rva2VuOiJzdHJpbmcucmVnZXhwIixyZWdleDonLyMiKD86LnwoXFwiKXxbXiIiXG5dKSoiL2cnfV0sY29tbWVudDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiXj1lbmQkIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfX07ZC5pbmhlcml0cyhnLGYpLGIuQ2xvanVyZUhpZ2hsaWdodFJ1bGVzPWd9KSxkZWZpbmUoImFjZS9tb2RlL21hdGNoaW5nX3BhcmVuc19vdXRkZW50IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9yYW5nZSIpLlJhbmdlLGU9ZnVuY3Rpb24oKXt9OygoZnVuY3Rpb24oKXt0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihhLGIpe3JldHVybi9eXHMrJC8udGVzdChhKT8vXlxzKlwpLy50ZXN0KGIpOiExfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5nZXRMaW5lKGIpLGU9Yy5tYXRjaCgvXihccypcKSkvKTtpZighZSlyZXR1cm4gMDt2YXIgZj1lWzFdLmxlbmd0aCxnPWEuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OmIsY29sdW1uOmZ9KTtpZighZ3x8Zy5yb3c9PWIpcmV0dXJuIDA7dmFyIGg9dGhpcy4kZ2V0SW5kZW50KGEuZ2V0TGluZShnLnJvdykpO2EucmVwbGFjZShuZXcgZChiLDAsYixmLTEpLGgpfSx0aGlzLiRnZXRJbmRlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5tYXRjaCgvXihccyspLyk7cmV0dXJuIGI/YlsxXToiIn19KSkuY2FsbChlLnByb3RvdHlwZSksYi5NYXRjaGluZ1BhcmVuc091dGRlbnQ9ZX0pLGZ1bmN0aW9uKCl7d2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sZnVuY3Rpb24oYSl7d2luZG93LmFjZXx8KHdpbmRvdy5hY2U9e30pO2Zvcih2YXIgYiBpbiBhKWEuaGFzT3duUHJvcGVydHkoYikmJihhY2VbYl09YVtiXSl9KX0oKQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-coffee-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBTYXRvc2hpIE11cmFrYW1pIDxtdXJreS5zYXR5ciBBVCBnbWFpbCBET1QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9jb2ZmZWUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvY29mZmVlX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgJ2FjZS9tb2RlL2ZvbGRpbmcvcHl0aG9uaWMnLCAnYWNlL3JhbmdlJywgJ2FjZS9tb2RlL3RleHQnLCAnYWNlL3dvcmtlci93b3JrZXJfY2xpZW50JywgJ2FjZS9saWIvb29wJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOwp2YXIgUnVsZXMgPSByZXF1aXJlKCIuL2NvZmZlZV9oaWdobGlnaHRfcnVsZXMiKS5Db2ZmZWVIaWdobGlnaHRSdWxlczsKdmFyIE91dGRlbnQgPSByZXF1aXJlKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudDsKdmFyIFB5dGhvbkZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkaW5nL3B5dGhvbmljIikuRm9sZE1vZGU7CnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7CnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7CnZhciBXb3JrZXJDbGllbnQgPSByZXF1aXJlKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudDsKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKCmZ1bmN0aW9uIE1vZGUoKSB7CiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKG5ldyBSdWxlcygpLmdldFJ1bGVzKCkpOwogICAgdGhpcy4kb3V0ZGVudCAgID0gbmV3IE91dGRlbnQoKTsKICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IFB5dGhvbkZvbGRNb2RlKCI9fD0+fC0+fFxccypjbGFzcyBbXiNdKiIpOwp9Cgpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOwoKKGZ1bmN0aW9uKCkgewogICAgCiAgICB2YXIgaW5kZW50ZXIgPSAvKD86Wyh7Wz06XXxbLT1dPnxcYig/OmVsc2V8c3dpdGNofHRyeXxjYXRjaCg/OlxzKlskQS1aYS16X1x4N2YtXHVmZmZmXVskXHdceDdmLVx1ZmZmZl0qKT98ZmluYWxseSkpXHMqJC87CiAgICB2YXIgY29tbWVudExpbmUgPSAvXihccyopIy87CiAgICB2YXIgaGVyZUNvbW1lbnQgPSAvXlxzKiMjIyg/ISMpLzsKICAgIHZhciBpbmRlbnRhdGlvbiA9IC9eXHMqLzsKICAgIAogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsKICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGxpbmUpOwogICAgICAgIHZhciB0b2tlbnMgPSB0aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhsaW5lLCBzdGF0ZSkudG9rZW5zOwogICAgCiAgICAgICAgaWYgKCEodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdLnR5cGUgPT09ICdjb21tZW50JykgJiYKICAgICAgICAgICAgc3RhdGUgPT09ICdzdGFydCcgJiYgaW5kZW50ZXIudGVzdChsaW5lKSkKICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsKICAgICAgICByZXR1cm4gaW5kZW50OwogICAgfTsKICAgIAogICAgdGhpcy50b2dnbGVDb21tZW50TGluZXMgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCBzdGFydFJvdywgZW5kUm93KXsKICAgICAgICBjb25zb2xlLmxvZygidG9nZ2xlIik7CiAgICAgICAgdmFyIHJhbmdlID0gbmV3IFJhbmdlKDAsIDAsIDAsIDApOwogICAgICAgIGZvciAodmFyIGkgPSBzdGFydFJvdzsgaSA8PSBlbmRSb3c7ICsraSkgewogICAgICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKGkpOwogICAgICAgICAgICBpZiAoaGVyZUNvbW1lbnQudGVzdChsaW5lKSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChjb21tZW50TGluZS50ZXN0KGxpbmUpKQogICAgICAgICAgICAgICAgbGluZSA9IGxpbmUucmVwbGFjZShjb21tZW50TGluZSwgJyQxJyk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnJlcGxhY2UoaW5kZW50YXRpb24sICckJiMnKTsKICAgIAogICAgICAgICAgICByYW5nZS5lbmQucm93ID0gcmFuZ2Uuc3RhcnQucm93ID0gaTsKICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiA9IGxpbmUubGVuZ3RoICsgMTsKICAgICAgICAgICAgZG9jLnJlcGxhY2UocmFuZ2UsIGxpbmUpOwogICAgICAgIH0KICAgIH07CiAgICAKICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsKICAgIH07CiAgICAKICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCByb3cpIHsKICAgICAgICB0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGRvYywgcm93KTsKICAgIH07CiAgICAKICAgIHRoaXMuY3JlYXRlV29ya2VyID0gZnVuY3Rpb24oc2Vzc2lvbikgewogICAgICAgIHZhciB3b3JrZXIgPSBuZXcgV29ya2VyQ2xpZW50KFsiYWNlIl0sICJ3b3JrZXItY29mZmVlLmpzIiwgImFjZS9tb2RlL2NvZmZlZV93b3JrZXIiLCAiV29ya2VyIik7CiAgICAgICAgd29ya2VyLmF0dGFjaFRvRG9jdW1lbnQoc2Vzc2lvbi5nZXREb2N1bWVudCgpKTsKICAgICAgICAKICAgICAgICB3b3JrZXIub24oImVycm9yIiwgZnVuY3Rpb24oZSkgewogICAgICAgICAgICBzZXNzaW9uLnNldEFubm90YXRpb25zKFtlLmRhdGFdKTsKICAgICAgICB9KTsKICAgICAgICAKICAgICAgICB3b3JrZXIub24oIm9rIiwgZnVuY3Rpb24oZSkgewogICAgICAgICAgICBzZXNzaW9uLmNsZWFyQW5ub3RhdGlvbnMoKTsKICAgICAgICB9KTsKICAgICAgICAKICAgICAgICByZXR1cm4gd29ya2VyOwogICAgfTsKCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOwoKZXhwb3J0cy5Nb2RlID0gTW9kZTsKCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgU2F0b3NoaSBNdXJha2FtaSA8bXVya3kuc2F0eXIgQVQgZ21haWwgRE9UIGNvbT4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvY29mZmVlX2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9sYW5nJywgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7CgogICAgdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOwogICAgdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKICAgIHZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOwogICAgCiAgICBvb3AuaW5oZXJpdHMoQ29mZmVlSGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7CgogICAgZnVuY3Rpb24gQ29mZmVlSGlnaGxpZ2h0UnVsZXMoKSB7CiAgICAgICAgdmFyIGlkZW50aWZpZXIgPSAiWyRBLVphLXpfXFx4N2YtXFx1ZmZmZl1bJFxcd1xceDdmLVxcdWZmZmZdKiI7CiAgICAgICAgdmFyIHN0cmluZ2ZpbGwgPSB7CiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiLisiCiAgICAgICAgfTsKCiAgICAgICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKCgKICAgICAgICAgICAgInRoaXN8dGhyb3d8dGhlbnx0cnl8dHlwZW9mfHN1cGVyfHN3aXRjaHxyZXR1cm58YnJlYWt8YnkpfGNvbnRpbnVlfCIgKwogICAgICAgICAgICAiY2F0Y2h8Y2xhc3N8aW58aW5zdGFuY2VvZnxpc3xpc250fGlmfGVsc2V8ZXh0ZW5kc3xmb3J8Zm9yb3dufCIgKwogICAgICAgICAgICAiZmluYWxseXxmdW5jdGlvbnx3aGlsZXx3aGVufG5ld3xub3xub3R8ZGVsZXRlfGRlYnVnZ2VyfGRvfGxvb3B8b2Z8b2ZmfCIgKwogICAgICAgICAgICAib3J8b258dW5sZXNzfHVudGlsfGFuZHx5ZXMiKS5zcGxpdCgifCIpCiAgICAgICAgKTsKICAgICAgICAKICAgICAgICB2YXIgbGFuZ0NvbnN0YW50ID0gbGFuZy5hcnJheVRvTWFwKCgKICAgICAgICAgICAgInRydWV8ZmFsc2V8bnVsbHx1bmRlZmluZWQiKS5zcGxpdCgifCIpCiAgICAgICAgKTsKICAgICAgICAKICAgICAgICB2YXIgaWxsZWdhbCA9IGxhbmcuYXJyYXlUb01hcCgoCiAgICAgICAgICAgICJjYXNlfGNvbnN0fGRlZmF1bHR8ZnVuY3Rpb258dmFyfHZvaWR8d2l0aHxlbnVtfGV4cG9ydHxpbXBsZW1lbnRzfCIgKwogICAgICAgICAgICAiaW50ZXJmYWNlfGxldHxwYWNrYWdlfHByaXZhdGV8cHJvdGVjdGVkfHB1YmxpY3xzdGF0aWN8eWllbGR8IiArCiAgICAgICAgICAgICJfX2hhc1Byb3B8ZXh0ZW5kc3xzbGljZXxiaW5kfGluZGV4T2YiKS5zcGxpdCgifCIpCiAgICAgICAgKTsKICAgICAgICAKICAgICAgICB2YXIgc3VwcG9ydENsYXNzID0gbGFuZy5hcnJheVRvTWFwKCgKICAgICAgICAgICAgIkFycmF5fEJvb2xlYW58RGF0ZXxGdW5jdGlvbnxOdW1iZXJ8T2JqZWN0fFJlZ0V4cHxSZWZlcmVuY2VFcnJvcnwiICsKICAgICAgICAgICAgIlJhbmdlRXJyb3J8U3RyaW5nfFN5bnRheEVycm9yfEVycm9yfEV2YWxFcnJvcnxUeXBlRXJyb3J8VVJJRXJyb3IiKS5zcGxpdCgifCIpCiAgICAgICAgKTsKICAgICAgICAKICAgICAgICB2YXIgc3VwcG9ydEZ1bmN0aW9uID0gbGFuZy5hcnJheVRvTWFwKCgKICAgICAgICAgICAgIk1hdGh8SlNPTnxpc05hTnxpc0Zpbml0ZXxwYXJzZUludHxwYXJzZUZsb2F0fGVuY29kZVVSSXwiICsKICAgICAgICAgICAgImVuY29kZVVSSUNvbXBvbmVudHxkZWNvZGVVUkl8ZGVjb2RlVVJJQ29tcG9uZW50fFJhbmdlRXJyb3J8U3RyaW5nfCIgKwogICAgICAgICAgICAiU3ludGF4RXJyb3J8RXJyb3J8RXZhbEVycm9yfFR5cGVFcnJvcnxVUklFcnJvciIpLnNwbGl0KCJ8IikKICAgICAgICApOwoKICAgICAgICB0aGlzLiRydWxlcyA9IHsKICAgICAgICAgICAgc3RhcnQgOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gOiAiaWRlbnRpZmllciIsCiAgICAgICAgICAgICAgICAgICAgcmVnZXggOiAiKD86KD86XFwufDo6KVxccyopIiArIGlkZW50aWZpZXIKICAgICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICAgICB0b2tlbiA6ICJ2YXJpYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgcmVnZXggOiAiQCg/OiIgKyBpZGVudGlmaWVyICsgIik/IgogICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICAgIHRva2VuOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5d29yZHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobGFuZ0NvbnN0YW50Lmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpbGxlZ2FsLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5pbGxlZ2FsIjsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3VwcG9ydENsYXNzLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAibGFuZ3VhZ2Uuc3VwcG9ydC5jbGFzcyI7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN1cHBvcnRGdW5jdGlvbi5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImxhbmd1YWdlLnN1cHBvcnQuZnVuY3Rpb24iOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImlkZW50aWZpZXIiOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgcmVnZXggOiBpZGVudGlmaWVyCiAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsCiAgICAgICAgICAgICAgICAgICAgcmVnZXggOiAiKD86MHhbXFxkYS1mQS1GXSt8KD86XFxkKyg/OlxcLlxcZCspP3xcXC5cXGQrKSg/OltlRV1bKy1dP1xcZCspPykiCiAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgcmVnZXggOiAiJycnIiwKICAgICAgICAgICAgICAgICAgICBuZXh0IDogInFkb2MiCiAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgcmVnZXggOiAnIiIiJywKICAgICAgICAgICAgICAgICAgICBuZXh0IDogInFxZG9jIgogICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHJlZ2V4IDogIiciLAogICAgICAgICAgICAgICAgICAgIG5leHQgOiAicXN0cmluZyIKICAgICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICByZWdleCA6ICciJywKICAgICAgICAgICAgICAgICAgICBuZXh0IDogInFxc3RyaW5nIgogICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHJlZ2V4IDogImAiLAogICAgICAgICAgICAgICAgICAgIG5leHQgOiAianMiCiAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nLnJlZ2V4IiwKICAgICAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgcmVnZXggOiAiLy8vIiwKICAgICAgICAgICAgICAgICAgICBuZXh0IDogImhlcmVnZXgiCiAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nLnJlZ2V4IiwKICAgICAgICAgICAgICAgICAgICByZWdleCA6ICIvKD8hXFxzKVteWy9cXG5cXFxcXSooPzogKD86XFxcXC58XFxbW15cXF1cXG5cXFxcXSooPzpcXFxcLlteXFxdXFxuXFxcXF0qKSpcXF0pW15bL1xcblxcXFxdKikqL1tpbWd5XXswLDR9KD8hXFx3KSIKICAgICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwKICAgICAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgcmVnZXggOiAiIyMjKD8hIykiLAogICAgICAgICAgICAgICAgICAgIG5leHQgOiAiY29tbWVudCIKICAgICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwKICAgICAgICAgICAgICAgICAgICByZWdleCA6ICIjLioiCiAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gOiAicHVuY3R1YXRpb24ub3BlcmF0b3IiLAogICAgICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcP3xcXDp8XFwsfFxcLiIKICAgICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwKICAgICAgICAgICAgICAgICAgICByZWdleCA6ICIoPzpbXFwtPV0+fFstKyovJTw+JnxeIT89XT18Pj4+PT98XFwtXFwtfFxcK1xcK3w6OnwmJj18XFx8XFx8PXw8PD18Pj49fFxcP1xcLnxcXC57MiwzfXxcXCEpIgogICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLmxwYXJlbiIsCiAgICAgICAgICAgICAgICAgICAgcmVnZXggOiAiWyh7W10iCiAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwKICAgICAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdfSldIgogICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiCiAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgCiAgICAgICAgICAgIHFkb2MgOiBbewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qPycnJyIsCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0IgogICAgICAgICAgICB9LCBzdHJpbmdmaWxsXSwKICAgICAgICAgICAgCiAgICAgICAgICAgIHFxZG9jIDogW3sKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKj8iIiInLAogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCIKICAgICAgICAgICAgfSwgc3RyaW5nZmlsbF0sCiAgICAgICAgICAgIAogICAgICAgICAgICBxc3RyaW5nIDogW3sKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXlxcXFwnXSooPzpcXFxcLlteXFxcXCddKikqJyIsCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0IgogICAgICAgICAgICB9LCBzdHJpbmdmaWxsXSwKICAgICAgICAgICAgCiAgICAgICAgICAgIHFxc3RyaW5nIDogW3sKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgICAgICByZWdleCA6ICdbXlxcXFwiXSooPzpcXFxcLlteXFxcXCJdKikqIicsCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0IgogICAgICAgICAgICB9LCBzdHJpbmdmaWxsXSwKICAgICAgICAgICAgCiAgICAgICAgICAgIGpzIDogW3sKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXlxcXFxgXSooPzpcXFxcLlteXFxcXGBdKikqYCIsCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0IgogICAgICAgICAgICB9LCBzdHJpbmdmaWxsXSwKICAgICAgICAgICAgCiAgICAgICAgICAgIGhlcmVnZXggOiBbewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nLnJlZ2V4IiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4qPy8vL1tpbWd5XXswLDR9JywKICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQucmVnZXgiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFxzKyg/OiMuKik/IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmcucmVnZXgiLAogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFxTKyIKICAgICAgICAgICAgfV0sCiAgICAgICAgICAgIAogICAgICAgICAgICBjb21tZW50IDogW3sKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLAogICAgICAgICAgICAgICAgcmVnZXggOiAnLio/IyMjJywKICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLAogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAiLisiCiAgICAgICAgICAgIH1dCiAgICAgICAgfTsKICAgIH0KCiAgICBleHBvcnRzLkNvZmZlZUhpZ2hsaWdodFJ1bGVzID0gQ29mZmVlSGlnaGxpZ2h0UnVsZXM7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsKCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IGZ1bmN0aW9uKCkge307CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihsaW5lLCBpbnB1dCkgewogICAgICAgIGlmICghIC9eXHMrJC8udGVzdChsaW5lKSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgICByZXR1cm4gL15ccypcfS8udGVzdChpbnB1dCk7CiAgICB9OwoKICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihkb2MsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocm93KTsKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKlx9KS8pOwoKICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDsKCiAgICAgICAgdmFyIGNvbHVtbiA9IG1hdGNoWzFdLmxlbmd0aDsKICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gZG9jLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn0pOwoKICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcyB8fCBvcGVuQnJhY2VQb3Mucm93ID09IHJvdykgcmV0dXJuIDA7CgogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOwogICAgICAgIGRvYy5yZXBsYWNlKG5ldyBSYW5nZShyb3csIDAsIHJvdywgY29sdW1uLTEpLCBpbmRlbnQpOwogICAgfTsKCiAgICB0aGlzLiRnZXRJbmRlbnQgPSBmdW5jdGlvbihsaW5lKSB7CiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAiIjsKICAgIH07Cgp9KS5jYWxsKE1hdGNoaW5nQnJhY2VPdXRkZW50LnByb3RvdHlwZSk7CgpleHBvcnRzLk1hdGNoaW5nQnJhY2VPdXRkZW50ID0gTWF0Y2hpbmdCcmFjZU91dGRlbnQ7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvcHl0aG9uaWMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOwp2YXIgQmFzZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZTsKCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbihtYXJrZXJzKSB7CiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG5ldyBSZWdFeHAoIig/OihbXFxbe10pfCgiICsgbWFya2VycyArICIpKSg/OlxccyopKD86Iy4qKT8kIik7Cn07Cm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7CiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgaWYgKG1hdGNoWzFdKQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayhzZXNzaW9uLCBtYXRjaFsxXSwgcm93LCBtYXRjaC5pbmRleCk7CiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmluZGVudGF0aW9uQmxvY2soc2Vzc2lvbiwgcm93LCBtYXRjaC5pbmRleCArIG1hdGNoWzJdLmxlbmd0aCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmluZGVudGF0aW9uQmxvY2soc2Vzc2lvbiwgcm93KTsKICAgICAgICB9CiAgICB9Cgp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7Cgp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7Cgp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG51bGw7CiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gbnVsbDsKCiAgICAvLyBtdXN0IHJldHVybiAiIiBpZiB0aGVyZSdzIG5vIGZvbGQsIHRvIGVuYWJsZSBjYWNoaW5nCiAgICB0aGlzLmdldEZvbGRXaWRnZXQgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgaWYgKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QobGluZSkpCiAgICAgICAgICAgIHJldHVybiAic3RhcnQiOwogICAgICAgIGlmIChmb2xkU3R5bGUgPT0gIm1hcmtiZWdpbmVuZCIKICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIKICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChsaW5lKSkKICAgICAgICAgICAgcmV0dXJuICJlbmQiOwogICAgICAgIHJldHVybiAiIjsKICAgIH07CiAgICAKICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH07CgogICAgdGhpcy5pbmRlbnRhdGlvbkJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgcm93LCBjb2x1bW4pIHsKICAgICAgICB2YXIgcmUgPSAvXlxzKi87CiAgICAgICAgdmFyIHN0YXJ0Um93ID0gcm93OwogICAgICAgIHZhciBlbmRSb3cgPSByb3c7CiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSBjb2x1bW4gfHwgbGluZS5sZW5ndGg7CiAgICAgICAgdmFyIHN0YXJ0TGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7CiAgICAgICAgdmFyIG1heFJvdyA9IHNlc3Npb24uZ2V0TGVuZ3RoKCkKICAgICAgICAKICAgICAgICB3aGlsZSAoKytyb3cgPCBtYXhSb3cpIHsKICAgICAgICAgICAgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOwogICAgICAgICAgICB2YXIgbGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7CgogICAgICAgICAgICBpZiAobGV2ZWwgPT0gbGluZS5sZW5ndGgpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgIGlmIChsZXZlbCA8PSBzdGFydExldmVsKQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBlbmRSb3cgPSByb3c7CiAgICAgICAgfQoKICAgICAgICBpZiAoZW5kUm93ID4gc3RhcnRSb3cpIHsKICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmRSb3cpLmxlbmd0aDsKICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShzdGFydFJvdywgc3RhcnRDb2x1bW4sIGVuZFJvdywgZW5kQ29sdW1uKTsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIGJyYWNrZXQsIHJvdywgY29sdW1uKSB7CiAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbiArIDF9OwogICAgICAgIHZhciBlbmQgPSBzZXNzaW9uLiRmaW5kQ2xvc2luZ0JyYWNrZXQoYnJhY2tldCwgc3RhcnQpOwogICAgICAgIGlmICghZW5kKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIHZhciBmdyA9IHNlc3Npb24uZm9sZFdpZGdldHNbZW5kLnJvd107CiAgICAgICAgaWYgKGZ3ID09IG51bGwpCiAgICAgICAgICAgIGZ3ID0gdGhpcy5nZXRGb2xkV2lkZ2V0KHNlc3Npb24sIGVuZC5yb3cpOwoKICAgICAgICBpZiAoZncgPT0gInN0YXJ0IikgewogICAgICAgICAgICBlbmQucm93IC0tOwogICAgICAgICAgICBlbmQuY29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZC5yb3cpLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7CiAgICB9OwoKfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOwoKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL3dvcmtlci93b3JrZXJfY2xpZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2V2ZW50X2VtaXR0ZXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCIuLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsKCnZhciBXb3JrZXJDbGllbnQgPSBmdW5jdGlvbih0b3BMZXZlbE5hbWVzcGFjZXMsIHBhY2thZ2VkSnMsIG1vZCwgY2xhc3NuYW1lKSB7CgogICAgdGhpcy5jaGFuZ2VMaXN0ZW5lciA9IHRoaXMuY2hhbmdlTGlzdGVuZXIuYmluZCh0aGlzKTsKCiAgICBpZiAobW9kdWxlLnBhY2thZ2VkKSB7CiAgICAgICAgdmFyIGJhc2UgPSB0aGlzLiRndWVzc0Jhc2VQYXRoKCk7CiAgICAgICAgdGhpcy4kd29ya2VyID0gbmV3IFdvcmtlcihiYXNlICsgcGFja2FnZWRKcyk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICB2YXIgd29ya2VyVXJsID0gdGhpcy4kbm9ybWFsaXplUGF0aChyZXF1aXJlLm5hbWVUb1VybCgiYWNlL3dvcmtlci93b3JrZXIiLCBudWxsLCAiXyIpKTsKICAgICAgICB0aGlzLiR3b3JrZXIgPSBuZXcgV29ya2VyKHdvcmtlclVybCk7CgogICAgICAgIHZhciB0bG5zID0ge307CiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRvcExldmVsTmFtZXNwYWNlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgbnMgPSB0b3BMZXZlbE5hbWVzcGFjZXNbaV07CiAgICAgICAgICAgIHZhciBwYXRoID0gdGhpcy4kbm9ybWFsaXplUGF0aChyZXF1aXJlLm5hbWVUb1VybChucywgbnVsbCwgIl8iKS5yZXBsYWNlKC8uanMkLywgIiIpKTsKCiAgICAgICAgICAgIHRsbnNbbnNdID0gcGF0aDsKICAgICAgICB9CiAgICB9CgogICAgdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHsKICAgICAgICBpbml0IDogdHJ1ZSwKICAgICAgICB0bG5zOiB0bG5zLAogICAgICAgIG1vZHVsZTogbW9kLAogICAgICAgIGNsYXNzbmFtZTogY2xhc3NuYW1lCiAgICB9KTsKCiAgICB0aGlzLmNhbGxiYWNrSWQgPSAxOwogICAgdGhpcy5jYWxsYmFja3MgPSB7fTsKCiAgICB2YXIgX3NlbGYgPSB0aGlzOwogICAgdGhpcy4kd29ya2VyLm9uZXJyb3IgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgd2luZG93LmNvbnNvbGUgJiYgY29uc29sZS5sb2cgJiYgY29uc29sZS5sb2coZSk7CiAgICAgICAgdGhyb3cgZTsKICAgIH07CiAgICB0aGlzLiR3b3JrZXIub25tZXNzYWdlID0gZnVuY3Rpb24oZSkgewogICAgICAgIHZhciBtc2cgPSBlLmRhdGE7CiAgICAgICAgc3dpdGNoKG1zZy50eXBlKSB7CiAgICAgICAgICAgIGNhc2UgImxvZyI6CiAgICAgICAgICAgICAgICB3aW5kb3cuY29uc29sZSAmJiBjb25zb2xlLmxvZyAmJiBjb25zb2xlLmxvZyhtc2cuZGF0YSk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgImV2ZW50IjoKICAgICAgICAgICAgICAgIF9zZWxmLl9lbWl0KG1zZy5uYW1lLCB7ZGF0YTogbXNnLmRhdGF9KTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAiY2FsbCI6CiAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBfc2VsZi5jYWxsYmFja3NbbXNnLmlkXTsKICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1zZy5kYXRhKTsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgX3NlbGYuY2FsbGJhY2tzW21zZy5pZF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9Owp9OwoKKGZ1bmN0aW9uKCl7CgogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOwoKICAgIHRoaXMuJG5vcm1hbGl6ZVBhdGggPSBmdW5jdGlvbihwYXRoKSB7CiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXlthLXpdKzpcL1wvW15cL10rXC8vLCAiIik7IC8vIFJlbW92ZSBkb21haW4gbmFtZSBhbmQgcmVidWlsZCBpdAogICAgICAgIHBhdGggPSBsb2NhdGlvbi5wcm90b2NvbCArICIvLyIgKyBsb2NhdGlvbi5ob3N0CiAgICAgICAgICAgIC8vIHBhdGhzIHN0YXJ0aW5nIHdpdGggYSBzbGFzaCBhcmUgcmVsYXRpdmUgdG8gdGhlIHJvb3QgKGhvc3QpCiAgICAgICAgICAgICsgKHBhdGguY2hhckF0KDApID09ICIvIiA/ICIiIDogbG9jYXRpb24ucGF0aG5hbWUucmVwbGFjZSgvXC9bXlwvXSokLywgIiIpKQogICAgICAgICAgICArICIvIiArIHBhdGgucmVwbGFjZSgvXltcL10rLywgIiIpOwogICAgICAgIHJldHVybiBwYXRoOwogICAgfTsKCiAgICB0aGlzLiRndWVzc0Jhc2VQYXRoID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHJlcXVpcmUuYWNlQmFzZVVybCkKICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmUuYWNlQmFzZVVybDsKCiAgICAgICAgdmFyIHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7CiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHNjcmlwdHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIHNjcmlwdCA9IHNjcmlwdHNbaV07CgogICAgICAgICAgICB2YXIgYmFzZSA9IHNjcmlwdC5nZXRBdHRyaWJ1dGUoImRhdGEtYWNlLWJhc2UiKTsKICAgICAgICAgICAgaWYgKGJhc2UpCiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5yZXBsYWNlKC9cLyokLywgIi8iKTsKCiAgICAgICAgICAgIHZhciBzcmMgPSBzY3JpcHQuc3JjIHx8IHNjcmlwdC5nZXRBdHRyaWJ1dGUoInNyYyIpOwogICAgICAgICAgICBpZiAoIXNyYykgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIG0gPSBzcmMubWF0Y2goL14oPzooLipcLylhY2VcLmpzfCguKlwvKWFjZSgtdW5jb21wcmVzc2VkKT8oLW5vY29uZmxpY3QpP1wuanMpKD86XD98JCkvKTsKICAgICAgICAgICAgaWYgKG0pCiAgICAgICAgICAgICAgICByZXR1cm4gbVsxXSB8fCBtWzJdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gIiI7CiAgICB9OwoKICAgIHRoaXMudGVybWluYXRlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fZW1pdCgidGVybWluYXRlIiwge30pOwogICAgICAgIHRoaXMuJHdvcmtlci50ZXJtaW5hdGUoKTsKICAgICAgICB0aGlzLiR3b3JrZXIgPSBudWxsOwogICAgICAgIHRoaXMuJGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKICAgICAgICB0aGlzLiRkb2MgPSBudWxsOwogICAgfTsKCiAgICB0aGlzLnNlbmQgPSBmdW5jdGlvbihjbWQsIGFyZ3MpIHsKICAgICAgICB0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2NvbW1hbmQ6IGNtZCwgYXJnczogYXJnc30pOwogICAgfTsKCiAgICB0aGlzLmNhbGwgPSBmdW5jdGlvbihjbWQsIGFyZ3MsIGNhbGxiYWNrKSB7CiAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciBpZCA9IHRoaXMuY2FsbGJhY2tJZCsrOwogICAgICAgICAgICB0aGlzLmNhbGxiYWNrc1tpZF0gPSBjYWxsYmFjazsKICAgICAgICAgICAgYXJncy5wdXNoKGlkKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5zZW5kKGNtZCwgYXJncyk7CiAgICB9OwoKICAgIHRoaXMuZW1pdCA9IGZ1bmN0aW9uKGV2ZW50LCBkYXRhKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgLy8gZmlyZWZveCByZWZ1c2VzIHRvIGNsb25lIG9iamVjdHMgd2hpY2ggaGF2ZSBmdW5jdGlvbiBwcm9wZXJ0aWVzCiAgICAgICAgICAgIC8vIFRPRE86IGNsZWFudXAgZXZlbnQKICAgICAgICAgICAgdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtldmVudDogZXZlbnQsIGRhdGE6IHtkYXRhOiBkYXRhLmRhdGF9fSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoKGV4KSB7fQogICAgfTsKCiAgICB0aGlzLmF0dGFjaFRvRG9jdW1lbnQgPSBmdW5jdGlvbihkb2MpIHsKICAgICAgICBpZih0aGlzLiRkb2MpCiAgICAgICAgICAgIHRoaXMudGVybWluYXRlKCk7CgogICAgICAgIHRoaXMuJGRvYyA9IGRvYzsKICAgICAgICB0aGlzLmNhbGwoInNldFZhbHVlIiwgW2RvYy5nZXRWYWx1ZSgpXSk7CiAgICAgICAgZG9jLm9uKCJjaGFuZ2UiLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKICAgIH07CgogICAgdGhpcy5jaGFuZ2VMaXN0ZW5lciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICBlLnJhbmdlID0gewogICAgICAgICAgICBzdGFydDogZS5kYXRhLnJhbmdlLnN0YXJ0LAogICAgICAgICAgICBlbmQ6IGUuZGF0YS5yYW5nZS5lbmQKICAgICAgICB9OwogICAgICAgIHRoaXMuZW1pdCgiY2hhbmdlIiwgZSk7CiAgICB9OwoKfSkuY2FsbChXb3JrZXJDbGllbnQucHJvdG90eXBlKTsKCmV4cG9ydHMuV29ya2VyQ2xpZW50ID0gV29ya2VyQ2xpZW50OwoKfSk7CjsKICAgICAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkKICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkoKTsKICAgICAgICA=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-coffee.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9jb2ZmZWUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvY29mZmVlX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLCJhY2UvbW9kZS9mb2xkaW5nL3B5dGhvbmljIiwiYWNlL3JhbmdlIiwiYWNlL21vZGUvdGV4dCIsImFjZS93b3JrZXIvd29ya2VyX2NsaWVudCIsImFjZS9saWIvb29wIl0sZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGwoKXt0aGlzLiR0b2tlbml6ZXI9bmV3IGQoKG5ldyBlKS5nZXRSdWxlcygpKSx0aGlzLiRvdXRkZW50PW5ldyBmLHRoaXMuZm9sZGluZ1J1bGVzPW5ldyBnKCI9fD0+fC0+fFxccypjbGFzcyBbXiNdKiIpfSJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXIsZT1hKCIuL2NvZmZlZV9oaWdobGlnaHRfcnVsZXMiKS5Db2ZmZWVIaWdobGlnaHRSdWxlcyxmPWEoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50LGc9YSgiLi9mb2xkaW5nL3B5dGhvbmljIikuRm9sZE1vZGUsaD1hKCIuLi9yYW5nZSIpLlJhbmdlLGk9YSgiLi90ZXh0IikuTW9kZSxqPWEoIi4uL3dvcmtlci93b3JrZXJfY2xpZW50IikuV29ya2VyQ2xpZW50LGs9YSgiLi4vbGliL29vcCIpO2suaW5oZXJpdHMobCxpKSxmdW5jdGlvbigpe3ZhciBhPS8oPzpbKHtbPTpdfFstPV0+fFxiKD86ZWxzZXxzd2l0Y2h8dHJ5fGNhdGNoKD86XHMqWyRBLVphLXpfXHg3Zi1cdWZmZmZdWyRcd1x4N2YtXHVmZmZmXSopP3xmaW5hbGx5KSlccyokLyxiPS9eKFxzKikjLyxjPS9eXHMqIyMjKD8hIykvLGQ9L15ccyovO3RoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYixjLGQpe3ZhciBlPXRoaXMuJGdldEluZGVudChjKSxmPXRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGMsYikudG9rZW5zO3JldHVybighZi5sZW5ndGh8fGZbZi5sZW5ndGgtMV0udHlwZSE9PSJjb21tZW50IikmJmI9PT0ic3RhcnQiJiZhLnRlc3QoYykmJihlKz1kKSxlfSx0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcz1mdW5jdGlvbihhLGUsZixnKXtjb25zb2xlLmxvZygidG9nZ2xlIik7dmFyIGk9bmV3IGgoMCwwLDAsMCk7Zm9yKHZhciBqPWY7ajw9ZzsrK2ope3ZhciBrPWUuZ2V0TGluZShqKTtpZihjLnRlc3QoaykpY29udGludWU7Yi50ZXN0KGspP2s9ay5yZXBsYWNlKGIsIiQxIik6az1rLnJlcGxhY2UoZCwiJCYjIiksaS5lbmQucm93PWkuc3RhcnQucm93PWosaS5lbmQuY29sdW1uPWsubGVuZ3RoKzEsZS5yZXBsYWNlKGksayl9fSx0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGIsYyl9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoYixjKX0sdGhpcy5jcmVhdGVXb3JrZXI9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IGooWyJhY2UiXSwid29ya2VyLWNvZmZlZS5qcyIsImFjZS9tb2RlL2NvZmZlZV93b3JrZXIiLCJXb3JrZXIiKTtyZXR1cm4gYi5hdHRhY2hUb0RvY3VtZW50KGEuZ2V0RG9jdW1lbnQoKSksYi5vbigiZXJyb3IiLGZ1bmN0aW9uKGIpe2Euc2V0QW5ub3RhdGlvbnMoW2IuZGF0YV0pfSksYi5vbigib2siLGZ1bmN0aW9uKGIpe2EuY2xlYXJBbm5vdGF0aW9ucygpfSksYn19LmNhbGwobC5wcm90b3R5cGUpLGIuTW9kZT1sfSksZGVmaW5lKCJhY2UvbW9kZS9jb2ZmZWVfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9sYW5nIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBnKCl7dmFyIGE9IlskQS1aYS16X1xceDdmLVxcdWZmZmZdWyRcXHdcXHg3Zi1cXHVmZmZmXSoiLGI9e3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9LGM9ZC5hcnJheVRvTWFwKCJ0aGlzfHRocm93fHRoZW58dHJ5fHR5cGVvZnxzdXBlcnxzd2l0Y2h8cmV0dXJufGJyZWFrfGJ5KXxjb250aW51ZXxjYXRjaHxjbGFzc3xpbnxpbnN0YW5jZW9mfGlzfGlzbnR8aWZ8ZWxzZXxleHRlbmRzfGZvcnxmb3Jvd258ZmluYWxseXxmdW5jdGlvbnx3aGlsZXx3aGVufG5ld3xub3xub3R8ZGVsZXRlfGRlYnVnZ2VyfGRvfGxvb3B8b2Z8b2ZmfG9yfG9ufHVubGVzc3x1bnRpbHxhbmR8eWVzIi5zcGxpdCgifCIpKSxlPWQuYXJyYXlUb01hcCgidHJ1ZXxmYWxzZXxudWxsfHVuZGVmaW5lZCIuc3BsaXQoInwiKSksZj1kLmFycmF5VG9NYXAoImNhc2V8Y29uc3R8ZGVmYXVsdHxmdW5jdGlvbnx2YXJ8dm9pZHx3aXRofGVudW18ZXhwb3J0fGltcGxlbWVudHN8aW50ZXJmYWNlfGxldHxwYWNrYWdlfHByaXZhdGV8cHJvdGVjdGVkfHB1YmxpY3xzdGF0aWN8eWllbGR8X19oYXNQcm9wfGV4dGVuZHN8c2xpY2V8YmluZHxpbmRleE9mIi5zcGxpdCgifCIpKSxnPWQuYXJyYXlUb01hcCgiQXJyYXl8Qm9vbGVhbnxEYXRlfEZ1bmN0aW9ufE51bWJlcnxPYmplY3R8UmVnRXhwfFJlZmVyZW5jZUVycm9yfFJhbmdlRXJyb3J8U3RyaW5nfFN5bnRheEVycm9yfEVycm9yfEV2YWxFcnJvcnxUeXBlRXJyb3J8VVJJRXJyb3IiLnNwbGl0KCJ8IikpLGg9ZC5hcnJheVRvTWFwKCJNYXRofEpTT058aXNOYU58aXNGaW5pdGV8cGFyc2VJbnR8cGFyc2VGbG9hdHxlbmNvZGVVUkl8ZW5jb2RlVVJJQ29tcG9uZW50fGRlY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8UmFuZ2VFcnJvcnxTdHJpbmd8U3ludGF4RXJyb3J8RXJyb3J8RXZhbEVycm9yfFR5cGVFcnJvcnxVUklFcnJvciIuc3BsaXQoInwiKSk7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImlkZW50aWZpZXIiLHJlZ2V4OiIoPzooPzpcXC58OjopXFxzKikiK2F9LHt0b2tlbjoidmFyaWFibGUiLHJlZ2V4OiJAKD86IithKyIpPyJ9LHt0b2tlbjpmdW5jdGlvbihhKXtyZXR1cm4gYy5oYXNPd25Qcm9wZXJ0eShhKT8ia2V5d29yZCI6ZS5oYXNPd25Qcm9wZXJ0eShhKT8iY29uc3RhbnQubGFuZ3VhZ2UiOmYuaGFzT3duUHJvcGVydHkoYSk/ImludmFsaWQuaWxsZWdhbCI6Zy5oYXNPd25Qcm9wZXJ0eShhKT8ibGFuZ3VhZ2Uuc3VwcG9ydC5jbGFzcyI6aC5oYXNPd25Qcm9wZXJ0eShhKT8ibGFuZ3VhZ2Uuc3VwcG9ydC5mdW5jdGlvbiI6ImlkZW50aWZpZXIifSxyZWdleDphfSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIoPzoweFtcXGRhLWZBLUZdK3woPzpcXGQrKD86XFwuXFxkKyk/fFxcLlxcZCspKD86W2VFXVsrLV0/XFxkKyk/KSJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiJycnIixuZXh0OiJxZG9jIn0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiciIiInLG5leHQ6InFxZG9jIn0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiInIixuZXh0OiJxc3RyaW5nIn0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiciJyxuZXh0OiJxcXN0cmluZyJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiYCIsbmV4dDoianMifSx7dG9rZW46InN0cmluZy5yZWdleCIsbWVyZ2U6ITAscmVnZXg6Ii8vLyIsbmV4dDoiaGVyZWdleCJ9LHt0b2tlbjoic3RyaW5nLnJlZ2V4IixyZWdleDoiLyg/IVxccylbXlsvXFxuXFxcXF0qKD86ICg/OlxcXFwufFxcW1teXFxdXFxuXFxcXF0qKD86XFxcXC5bXlxcXVxcblxcXFxdKikqXFxdKVteWy9cXG5cXFxcXSopKi9baW1neV17MCw0fSg/IVxcdykifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIjIyMoPyEjKSIsbmV4dDoiY29tbWVudCJ9LHt0b2tlbjoiY29tbWVudCIscmVnZXg6IiMuKiJ9LHt0b2tlbjoicHVuY3R1YXRpb24ub3BlcmF0b3IiLHJlZ2V4OiJcXD98XFw6fFxcLHxcXC4ifSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiIoPzpbXFwtPV0+fFstKyovJTw+JnxeIT89XT18Pj4+PT98XFwtXFwtfFxcK1xcK3w6OnwmJj18XFx8XFx8PXw8PD18Pj49fFxcP1xcLnxcXC57MiwzfXxcXCEpIn0se3Rva2VuOiJwYXJlbi5scGFyZW4iLHJlZ2V4OiJbKHtbXSJ9LHt0b2tlbjoicGFyZW4ucnBhcmVuIixyZWdleDoiW1xcXX0pXSJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifV0scWRvYzpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OiIuKj8nJyciLG5leHQ6InN0YXJ0In0sYl0scXFkb2M6W3t0b2tlbjoic3RyaW5nIixyZWdleDonLio/IiIiJyxuZXh0OiJzdGFydCJ9LGJdLHFzdHJpbmc6W3t0b2tlbjoic3RyaW5nIixyZWdleDoiW15cXFxcJ10qKD86XFxcXC5bXlxcXFwnXSopKiciLG1lcmdlOiEwLG5leHQ6InN0YXJ0In0sYl0scXFzdHJpbmc6W3t0b2tlbjoic3RyaW5nIixyZWdleDonW15cXFxcIl0qKD86XFxcXC5bXlxcXFwiXSopKiInLG1lcmdlOiEwLG5leHQ6InN0YXJ0In0sYl0sanM6W3t0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiW15cXFxcYF0qKD86XFxcXC5bXlxcXFxgXSopKmAiLG5leHQ6InN0YXJ0In0sYl0saGVyZWdleDpbe3Rva2VuOiJzdHJpbmcucmVnZXgiLHJlZ2V4OiIuKj8vLy9baW1neV17MCw0fSIsbmV4dDoic3RhcnQifSx7dG9rZW46ImNvbW1lbnQucmVnZXgiLHJlZ2V4OiJcXHMrKD86Iy4qKT8ifSx7dG9rZW46InN0cmluZy5yZWdleCIsbWVyZ2U6ITAscmVnZXg6IlxcUysifV0sY29tbWVudDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/IyMjIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfX0idXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL2xhbmciKSxlPWEoIi4uL2xpYi9vb3AiKSxmPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7ZS5pbmhlcml0cyhnLGYpLGIuQ29mZmVlSGlnaGxpZ2h0UnVsZXM9Z30pLGRlZmluZSgiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vcmFuZ2UiKS5SYW5nZSxlPWZ1bmN0aW9uKCl7fTsoKGZ1bmN0aW9uKCl7dGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4vXlxzKyQvLnRlc3QoYSk/L15ccypcfS8udGVzdChiKTohMX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuZ2V0TGluZShiKSxlPWMubWF0Y2goL14oXHMqXH0pLyk7aWYoIWUpcmV0dXJuIDA7dmFyIGY9ZVsxXS5sZW5ndGgsZz1hLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzpiLGNvbHVtbjpmfSk7aWYoIWd8fGcucm93PT1iKXJldHVybiAwO3ZhciBoPXRoaXMuJGdldEluZGVudChhLmdldExpbmUoZy5yb3cpKTthLnJlcGxhY2UobmV3IGQoYiwwLGIsZi0xKSxoKX0sdGhpcy4kZ2V0SW5kZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEubWF0Y2goL14oXHMrKS8pO3JldHVybiBiP2JbMV06IiJ9fSkpLmNhbGwoZS5wcm90b3R5cGUpLGIuTWF0Y2hpbmdCcmFjZU91dGRlbnQ9ZX0pLGRlZmluZSgiYWNlL21vZGUvZm9sZGluZy9weXRob25pYyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGUsZj1iLkZvbGRNb2RlPWZ1bmN0aW9uKGEpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPW5ldyBSZWdFeHAoIig/OihbXFxbe10pfCgiK2ErIikpKD86XFxzKikoPzojLiopPyQiKX07ZC5pbmhlcml0cyhmLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKSxlPWQubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpO2lmKGUpcmV0dXJuIGVbMV0/dGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKGEsZVsxXSxjLGUuaW5kZXgpOmVbMl0/dGhpcy5pbmRlbnRhdGlvbkJsb2NrKGEsYyxlLmluZGV4K2VbMl0ubGVuZ3RoKTp0aGlzLmluZGVudGF0aW9uQmxvY2soYSxjKX19LmNhbGwoZi5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxlPWIuRm9sZE1vZGU9ZnVuY3Rpb24oKXt9OygoZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj1udWxsLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9bnVsbCx0aGlzLmdldEZvbGRXaWRnZXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKTtyZXR1cm4gdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChkKT8ic3RhcnQiOmI9PSJtYXJrYmVnaW5lbmQiJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QoZCk/ImVuZCI6IiJ9LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbnVsbH0sdGhpcy5pbmRlbnRhdGlvbkJsb2NrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZT0vXlxzKi8sZj1iLGc9YixoPWEuZ2V0TGluZShiKSxpPWN8fGgubGVuZ3RoLGo9aC5tYXRjaChlKVswXS5sZW5ndGgsaz1hLmdldExlbmd0aCgpO3doaWxlKCsrYjxrKXtoPWEuZ2V0TGluZShiKTt2YXIgbD1oLm1hdGNoKGUpWzBdLmxlbmd0aDtpZihsPT1oLmxlbmd0aCljb250aW51ZTtpZihsPD1qKWJyZWFrO2c9Yn1pZihnPmYpe3ZhciBtPWEuZ2V0TGluZShnKS5sZW5ndGg7cmV0dXJuIG5ldyBkKGYsaSxnLG0pfX0sdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrPWZ1bmN0aW9uKGEsYixjLGUpe3ZhciBmPXtyb3c6Yyxjb2x1bW46ZSsxfSxnPWEuJGZpbmRDbG9zaW5nQnJhY2tldChiLGYpO2lmKCFnKXJldHVybjt2YXIgaD1hLmZvbGRXaWRnZXRzW2cucm93XTtyZXR1cm4gaD09bnVsbCYmKGg9dGhpcy5nZXRGb2xkV2lkZ2V0KGEsZy5yb3cpKSxoPT0ic3RhcnQiJiYoZy5yb3ctLSxnLmNvbHVtbj1hLmdldExpbmUoZy5yb3cpLmxlbmd0aCksZC5mcm9tUG9pbnRzKGYsZyl9fSkpLmNhbGwoZS5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvZXZlbnRfZW1pdHRlciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsZj1mdW5jdGlvbihiLGQsZSxmKXt0aGlzLmNoYW5nZUxpc3RlbmVyPXRoaXMuY2hhbmdlTGlzdGVuZXIuYmluZCh0aGlzKTtpZihjLnBhY2thZ2VkKXt2YXIgZz10aGlzLiRndWVzc0Jhc2VQYXRoKCk7dGhpcy4kd29ya2VyPW5ldyBXb3JrZXIoZytkKX1lbHNle3ZhciBoPXRoaXMuJG5vcm1hbGl6ZVBhdGgoYS5uYW1lVG9VcmwoImFjZS93b3JrZXIvd29ya2VyIixudWxsLCJfIikpO3RoaXMuJHdvcmtlcj1uZXcgV29ya2VyKGgpO3ZhciBpPXt9O2Zvcih2YXIgaj0wO2o8Yi5sZW5ndGg7aisrKXt2YXIgaz1iW2pdLGw9dGhpcy4kbm9ybWFsaXplUGF0aChhLm5hbWVUb1VybChrLG51bGwsIl8iKS5yZXBsYWNlKC8uanMkLywiIikpO2lba109bH19dGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtpbml0OiEwLHRsbnM6aSxtb2R1bGU6ZSxjbGFzc25hbWU6Zn0pLHRoaXMuY2FsbGJhY2tJZD0xLHRoaXMuY2FsbGJhY2tzPXt9O3ZhciBtPXRoaXM7dGhpcy4kd29ya2VyLm9uZXJyb3I9ZnVuY3Rpb24oYSl7dGhyb3cgd2luZG93LmNvbnNvbGUmJmNvbnNvbGUubG9nJiZjb25zb2xlLmxvZyhhKSxhfSx0aGlzLiR3b3JrZXIub25tZXNzYWdlPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZGF0YTtzd2l0Y2goYi50eXBlKXtjYXNlImxvZyI6d2luZG93LmNvbnNvbGUmJmNvbnNvbGUubG9nJiZjb25zb2xlLmxvZyhiLmRhdGEpO2JyZWFrO2Nhc2UiZXZlbnQiOm0uX2VtaXQoYi5uYW1lLHtkYXRhOmIuZGF0YX0pO2JyZWFrO2Nhc2UiY2FsbCI6dmFyIGM9bS5jYWxsYmFja3NbYi5pZF07YyYmKGMoYi5kYXRhKSxkZWxldGUgbS5jYWxsYmFja3NbYi5pZF0pfX19OygoZnVuY3Rpb24oKXtkLmltcGxlbWVudCh0aGlzLGUpLHRoaXMuJG5vcm1hbGl6ZVBhdGg9ZnVuY3Rpb24oYSl7cmV0dXJuIGE9YS5yZXBsYWNlKC9eW2Etel0rOlwvXC9bXlwvXStcLy8sIiIpLGE9bG9jYXRpb24ucHJvdG9jb2wrIi8vIitsb2NhdGlvbi5ob3N0KyhhLmNoYXJBdCgwKT09Ii8iPyIiOmxvY2F0aW9uLnBhdGhuYW1lLnJlcGxhY2UoL1wvW15cL10qJC8sIiIpKSsiLyIrYS5yZXBsYWNlKC9eW1wvXSsvLCIiKSxhfSx0aGlzLiRndWVzc0Jhc2VQYXRoPWZ1bmN0aW9uKCl7aWYoYS5hY2VCYXNlVXJsKXJldHVybiBhLmFjZUJhc2VVcmw7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD1iW2NdLGU9ZC5nZXRBdHRyaWJ1dGUoImRhdGEtYWNlLWJhc2UiKTtpZihlKXJldHVybiBlLnJlcGxhY2UoL1wvKiQvLCIvIik7dmFyIGY9ZC5zcmN8fGQuZ2V0QXR0cmlidXRlKCJzcmMiKTtpZighZiljb250aW51ZTt2YXIgZz1mLm1hdGNoKC9eKD86KC4qXC8pYWNlXC5qc3woLipcLylhY2UoLXVuY29tcHJlc3NlZCk/KC1ub2NvbmZsaWN0KT9cLmpzKSg/Olw/fCQpLyk7aWYoZylyZXR1cm4gZ1sxXXx8Z1syXX1yZXR1cm4iIn0sdGhpcy50ZXJtaW5hdGU9ZnVuY3Rpb24oKXt0aGlzLl9lbWl0KCJ0ZXJtaW5hdGUiLHt9KSx0aGlzLiR3b3JrZXIudGVybWluYXRlKCksdGhpcy4kd29ya2VyPW51bGwsdGhpcy4kZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIsdGhpcy5jaGFuZ2VMaXN0ZW5lciksdGhpcy4kZG9jPW51bGx9LHRoaXMuc2VuZD1mdW5jdGlvbihhLGIpe3RoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7Y29tbWFuZDphLGFyZ3M6Yn0pfSx0aGlzLmNhbGw9ZnVuY3Rpb24oYSxiLGMpe2lmKGMpe3ZhciBkPXRoaXMuY2FsbGJhY2tJZCsrO3RoaXMuY2FsbGJhY2tzW2RdPWMsYi5wdXNoKGQpfXRoaXMuc2VuZChhLGIpfSx0aGlzLmVtaXQ9ZnVuY3Rpb24oYSxiKXt0cnl7dGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtldmVudDphLGRhdGE6e2RhdGE6Yi5kYXRhfX0pfWNhdGNoKGMpe319LHRoaXMuYXR0YWNoVG9Eb2N1bWVudD1mdW5jdGlvbihhKXt0aGlzLiRkb2MmJnRoaXMudGVybWluYXRlKCksdGhpcy4kZG9jPWEsdGhpcy5jYWxsKCJzZXRWYWx1ZSIsW2EuZ2V0VmFsdWUoKV0pLGEub24oImNoYW5nZSIsdGhpcy5jaGFuZ2VMaXN0ZW5lcil9LHRoaXMuY2hhbmdlTGlzdGVuZXI9ZnVuY3Rpb24oYSl7YS5yYW5nZT17c3RhcnQ6YS5kYXRhLnJhbmdlLnN0YXJ0LGVuZDphLmRhdGEucmFuZ2UuZW5kfSx0aGlzLmVtaXQoImNoYW5nZSIsYSl9fSkpLmNhbGwoZi5wcm90b3R5cGUpLGIuV29ya2VyQ2xpZW50PWZ9KSxmdW5jdGlvbigpe3dpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLGZ1bmN0aW9uKGEpe3dpbmRvdy5hY2V8fCh3aW5kb3cuYWNlPXt9KTtmb3IodmFyIGIgaW4gYSlhLmhhc093blByb3BlcnR5KGIpJiYoYWNlW2JdPWFbYl0pfSl9KCk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-coldfusion-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9jb2xkZnVzaW9uJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS94bWwnLCAnYWNlL21vZGUvamF2YXNjcmlwdCcsICdhY2UvbW9kZS9jc3MnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS9jb2xkZnVzaW9uX2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIFhtbE1vZGUgPSByZXF1aXJlKCIuL3htbCIpLk1vZGU7CnZhciBKYXZhU2NyaXB0TW9kZSA9IHJlcXVpcmUoIi4vamF2YXNjcmlwdCIpLk1vZGU7CnZhciBDc3NNb2RlID0gcmVxdWlyZSgiLi9jc3MiKS5Nb2RlOwp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOwp2YXIgQ29sZGZ1c2lvbkhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9jb2xkZnVzaW9uX2hpZ2hsaWdodF9ydWxlcyIpLkNvbGRmdXNpb25IaWdobGlnaHRSdWxlczsKCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7CiAgICBYbWxNb2RlLmNhbGwodGhpcyk7CiAgICAKICAgIHZhciBoaWdobGlnaHRlciA9IG5ldyBDb2xkZnVzaW9uSGlnaGxpZ2h0UnVsZXMoKTsKICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIoaGlnaGxpZ2h0ZXIuZ2V0UnVsZXMoKSk7CiAgICAKICAgIHRoaXMuJGVtYmVkcyA9IGhpZ2hsaWdodGVyLmdldEVtYmVkcygpOwogICAgdGhpcy5jcmVhdGVNb2RlRGVsZWdhdGVzKHsKICAgICAgImpzLSI6IEphdmFTY3JpcHRNb2RlLAogICAgICAiY3NzLSI6IENzc01vZGUKICAgIH0pOwp9Owpvb3AuaW5oZXJpdHMoTW9kZSwgWG1sTW9kZSk7CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsKICAgICAgICByZXR1cm4gdGhpcy4kZ2V0SW5kZW50KGxpbmUpOwogICAgfTsKCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOwoKZXhwb3J0cy5Nb2RlID0gTW9kZTsKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUveG1sJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUveG1sX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9iZWhhdmlvdXIveG1sJywgJ2FjZS9tb2RlL2ZvbGRpbmcveG1sJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOwp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOwp2YXIgWG1sSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3htbF9oaWdobGlnaHRfcnVsZXMiKS5YbWxIaWdobGlnaHRSdWxlczsKdmFyIFhtbEJlaGF2aW91ciA9IHJlcXVpcmUoIi4vYmVoYXZpb3VyL3htbCIpLlhtbEJlaGF2aW91cjsKdmFyIFhtbEZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkaW5nL3htbCIpLkZvbGRNb2RlOwoKdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IFhtbEhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7CiAgICB0aGlzLiRiZWhhdmlvdXIgPSBuZXcgWG1sQmVoYXZpb3VyKCk7CiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBYbWxGb2xkTW9kZSgpOwp9OwoKb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsKCihmdW5jdGlvbigpIHsKICAgIAogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsKICAgICAgICByZXR1cm4gdGhpcy4kZ2V0SW5kZW50KGxpbmUpOwogICAgfTsKCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOwoKZXhwb3J0cy5Nb2RlID0gTW9kZTsKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUveG1sX2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUveG1sX3V0aWwnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciB4bWxVdGlsID0gcmVxdWlyZSgiLi94bWxfdXRpbCIpOwp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsKCnZhciBYbWxIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgewoKICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcwogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZAogICAgdGhpcy4kcnVsZXMgPSB7CiAgICAgICAgc3RhcnQgOiBbewogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgcmVnZXggOiAiPFxcIVxcW0NEQVRBXFxbIiwKICAgICAgICAgICAgbmV4dCA6ICJjZGF0YSIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogInhtbF9wZSIsCiAgICAgICAgICAgIHJlZ2V4IDogIjxcXD8uKj9cXD8+IgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiPFxcIS0tIiwKICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50IgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAibWV0YS50YWciLCAvLyBvcGVuaW5nIHRhZwogICAgICAgICAgICByZWdleCA6ICI8XFwvPyIsCiAgICAgICAgICAgIG5leHQgOiAidGFnIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsCiAgICAgICAgICAgIHJlZ2V4IDogIlxccysiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgcmVnZXggOiAiW148XSsiCiAgICAgICAgfV0sCiAgICAgICAgCiAgICAgICAgY2RhdGEgOiBbewogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgcmVnZXggOiAiXFxdXFxdPiIsCiAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgcmVnZXggOiAiXFxzKyIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgICAgICByZWdleCA6ICIoPzpbXlxcXV18XFxdKD8hXFxdPikpKyIKICAgICAgICB9XSwKCiAgICAgICAgY29tbWVudCA6IFt7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLAogICAgICAgICAgICByZWdleCA6ICIuKj8tLT4iLAogICAgICAgICAgICBuZXh0IDogInN0YXJ0IgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiLisiCiAgICAgICAgfV0KICAgIH07CiAgICAKICAgIHhtbFV0aWwudGFnKHRoaXMuJHJ1bGVzLCAidGFnIiwgInN0YXJ0Iik7Cn07Cgpvb3AuaW5oZXJpdHMoWG1sSGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7CgpleHBvcnRzLlhtbEhpZ2hsaWdodFJ1bGVzID0gWG1sSGlnaGxpZ2h0UnVsZXM7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL3htbF91dGlsJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2xhbmcnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsKCnZhciBmb3JtVGFncyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICgiYnV0dG9ufGZvcm18aW5wdXR8bGFiZWx8c2VsZWN0fHRleHRhcmVhIikuc3BsaXQoInwiKQopOwoKdmFyIHRhYmxlVGFncyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICgidGFibGV8dGJvZHl8dGR8dGZvb3R8dGh8dHIiKS5zcGxpdCgifCIpCik7CgpmdW5jdGlvbiBzdHJpbmcoc3RhdGUpIHsKICAgIHJldHVybiBbewogICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgcmVnZXggOiAnIi4qPyInCiAgICB9LCB7CiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQKICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgcmVnZXggOiAnWyJdLionLAogICAgICAgIG5leHQgOiBzdGF0ZSArICItcXFzdHJpbmciCiAgICB9LCB7CiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICByZWdleCA6ICInLio/JyIKICAgIH0sIHsKICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydAogICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICByZWdleCA6ICJbJ10uKiIsCiAgICAgICAgbmV4dCA6IHN0YXRlICsgIi1xc3RyaW5nIgogICAgfV07Cn0KCmZ1bmN0aW9uIG11bHRpTGluZVN0cmluZyhxdW90ZSwgc3RhdGUpIHsKICAgIHJldHVybiBbewogICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgIHJlZ2V4IDogIi4qPyIgKyBxdW90ZSwKICAgICAgICBuZXh0IDogc3RhdGUKICAgIH0sIHsKICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICByZWdleCA6ICcuKycKICAgIH1dOwp9CgpleHBvcnRzLnRhZyA9IGZ1bmN0aW9uKHN0YXRlcywgbmFtZSwgbmV4dFN0YXRlKSB7CiAgICBzdGF0ZXNbbmFtZV0gPSBbewogICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgIHJlZ2V4IDogIlxccysiCiAgICB9LCB7CiAgICAgICAgLy90b2tlbiA6ICJtZXRhLnRhZyIsCiAgICAgICAgCiAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIGlmICggdmFsdWU9PT0nYScgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnLmFuY2hvciI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoIHZhbHVlPT09J2ltZycgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnLmltYWdlIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICggdmFsdWU9PT0nc2NyaXB0JyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAibWV0YS50YWcuc2NyaXB0IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICggdmFsdWU9PT0nc3R5bGUnICkgewogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy5zdHlsZSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZm9ybVRhZ3MuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAibWV0YS50YWcuZm9ybSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGFibGVUYWdzLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnLnRhYmxlIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAibWV0YS50YWciOwogICAgICAgICAgICB9CiAgICAgICAgfSwgICAgICAgIAogICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICByZWdleCA6ICJbLV9hLXpBLVowLTk6IV0rIiwKICAgICAgICBuZXh0IDogbmFtZSArICJlbWJlZC1hdHRyaWJ1dGUtbGlzdCIgCiAgICB9LCB7CiAgICAgICAgdG9rZW46ICJlbXB0eSIsCiAgICAgICAgcmVnZXg6ICIiLAogICAgICAgIG5leHQgOiBuYW1lICsgImVtYmVkLWF0dHJpYnV0ZS1saXN0IgogICAgfV07CgogICAgc3RhdGVzW25hbWUgKyAiLXFzdHJpbmciXSA9IG11bHRpTGluZVN0cmluZygiJyIsIG5hbWUgKyAiZW1iZWQtYXR0cmlidXRlLWxpc3QiKTsKICAgIHN0YXRlc1tuYW1lICsgIi1xcXN0cmluZyJdID0gbXVsdGlMaW5lU3RyaW5nKCJcIiIsIG5hbWUgKyAiZW1iZWQtYXR0cmlidXRlLWxpc3QiKTsKICAgIAogICAgc3RhdGVzW25hbWUgKyAiZW1iZWQtYXR0cmlidXRlLWxpc3QiXSA9IFt7CiAgICAgICAgdG9rZW4gOiAibWV0YS50YWciLAogICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICByZWdleCA6ICJcLz8+IiwKICAgICAgICBuZXh0IDogbmV4dFN0YXRlCiAgICB9LCB7CiAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsCiAgICAgICAgcmVnZXggOiAiPSIKICAgIH0sIHsKICAgICAgICB0b2tlbiA6ICJlbnRpdHkub3RoZXIuYXR0cmlidXRlLW5hbWUiLAogICAgICAgIHJlZ2V4IDogIlstX2EtekEtWjAtOTpdKyIKICAgIH0sIHsKICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQKICAgICAgICByZWdleCA6ICJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiIKICAgIH0sIHsKICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICByZWdleCA6ICJcXHMrIgogICAgfV0uY29uY2F0KHN0cmluZyhuYW1lKSk7Cn07Cgp9KTsKLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoKICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBDaHJpcyBTcGVuY2VyIDxjaHJpcy5hZy5zcGVuY2VyIEFUIGdvb2dsZW1haWwgRE9UIGNvbT4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvYmVoYXZpb3VyL3htbCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvYmVoYXZpb3VyJywgJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7CnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXI7CnZhciBDc3R5bGVCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cjsKCnZhciBYbWxCZWhhdmlvdXIgPSBmdW5jdGlvbiAoKSB7CiAgICAKICAgIHRoaXMuaW5oZXJpdChDc3R5bGVCZWhhdmlvdXIsIFsic3RyaW5nX2RxdW90ZXMiXSk7IC8vIEdldCBzdHJpbmcgYmVoYXZpb3VyCiAgICAKICAgIHRoaXMuYWRkKCJicmFja2V0cyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7CiAgICAgICAgaWYgKHRleHQgPT0gJzwnKSB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7CiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJzw+JywKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICc+JykgewogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsKICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsKICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnPicpIHsgLy8gbmVlZCBzb21lIGtpbmQgb2YgbWF0Y2hpbmcgY2hlY2sgaGVyZQogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICJcbiIpIHsKICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOwogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7CiAgICAgICAgICAgIHZhciByaWdodENoYXJzID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDIpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFycyA9PSAnPC8nKSB7CiAgICAgICAgICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdykpICsgc2Vzc2lvbi5nZXRUYWJTdHJpbmcoKTsKICAgICAgICAgICAgICAgIHZhciBuZXh0X2luZGVudCA9IHRoaXMuJGdldEluZGVudChzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICdcbicgKyBpbmRlbnQgKyAnXG4nICsgbmV4dF9pbmRlbnQsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgaW5kZW50Lmxlbmd0aCwgMSwgaW5kZW50Lmxlbmd0aF0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwogICAgCn0Kb29wLmluaGVyaXRzKFhtbEJlaGF2aW91ciwgQmVoYXZpb3VyKTsKCmV4cG9ydHMuWG1sQmVoYXZpb3VyID0gWG1sQmVoYXZpb3VyOwp9KTsvKiB2aW06dHM9NDpzdHM9NDpzdz00OgogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIENocmlzIFNwZW5jZXIgPGNocmlzLmFnLnNwZW5jZXIgQVQgZ29vZ2xlbWFpbCBET1QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9iZWhhdmlvdXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7CnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCcuLi9iZWhhdmlvdXInKS5CZWhhdmlvdXI7Cgp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gZnVuY3Rpb24gKCkgewoKICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgewogICAgICAgIGlmICh0ZXh0ID09ICd7JykgewogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7CiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7JyArIHNlbGVjdGVkICsgJ30nLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3t9JywKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICd9JykgewogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsKICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsKICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsKICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnfScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsKICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAiXG4iKSB7CiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9JykgewogICAgICAgICAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IHNlc3Npb24uZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiBjdXJzb3Iucm93LCBjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxfSk7CiAgICAgICAgICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcykKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CgogICAgICAgICAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQoc3RhdGUsIGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUubGVuZ3RoIC0gMSksIHNlc3Npb24uZ2V0VGFiU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgdmFyIG5leHRfaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOwoKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xuJyArIGluZGVudCArICdcbicgKyBuZXh0X2luZGVudCwKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCBpbmRlbnQubGVuZ3RoLCAxLCBpbmRlbnQubGVuZ3RoXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoImJyYWNlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7CiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsKICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJ3snKSB7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2UuZW5kLmNvbHVtbiwgcmFuZ2UuZW5kLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9JykgewogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOwogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoInBhcmVucyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7CiAgICAgICAgaWYgKHRleHQgPT0gJygnKSB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7CiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygnICsgc2VsZWN0ZWQgKyAnKScsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCknLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJyknKSB7CiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgewogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCcpJywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOwogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoInBhcmVucyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7CiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsKICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJygnKSB7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgewogICAgICAgIGlmICh0ZXh0ID09ICciJykgewogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7CiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICciJyArIHNlbGVjdGVkICsgJyInLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsKICAgICAgICAgICAgICAgIHZhciBsZWZ0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4tMSwgY3Vyc29yLmNvbHVtbik7CgogICAgICAgICAgICAgICAgLy8gV2UncmUgZXNjYXBlZC4KICAgICAgICAgICAgICAgIGlmIChsZWZ0Q2hhciA9PSAnXFwnKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gRmluZCB3aGF0IHRva2VuIHdlJ3JlIGluc2lkZS4KICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzZXNzaW9uLmdldFRva2VucyhzZWxlY3Rpb24uc3RhcnQucm93LCBzZWxlY3Rpb24uc3RhcnQucm93KVswXS50b2tlbnM7CiAgICAgICAgICAgICAgICB2YXIgY29sID0gMCwgdG9rZW47CiAgICAgICAgICAgICAgICB2YXIgcXVvdGVwb3MgPSAtMTsgLy8gVHJhY2sgd2hldGhlciB3ZSdyZSBpbnNpZGUgYW4gb3BlbiBxdW90ZS4KCiAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRva2Vucy5sZW5ndGg7IHgrKykgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW3hdOwogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IC0xOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocXVvdGVwb3MgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IHRva2VuLnZhbHVlLmluZGV4T2YoJyInKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0b2tlbi52YWx1ZS5sZW5ndGggKyBjb2wpID4gc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbikgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29sICs9IHRva2Vuc1t4XS52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gVHJ5IGFuZCBiZSBzbWFydCBhYm91dCB3aGVuIHdlIGF1dG8gaW5zZXJ0LgogICAgICAgICAgICAgICAgaWYgKCF0b2tlbiB8fCAocXVvdGVwb3MgPCAwICYmIHRva2VuLnR5cGUgIT09ICJjb21tZW50IiAmJiAodG9rZW4udHlwZSAhPT0gInN0cmluZyIgfHwgKChzZWxlY3Rpb24uc3RhcnQuY29sdW1uICE9PSB0b2tlbi52YWx1ZS5sZW5ndGgrY29sLTEpICYmIHRva2VuLnZhbHVlLmxhc3RJbmRleE9mKCciJykgPT09IHRva2VuLnZhbHVlLmxlbmd0aC0xKSkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJyIiJywKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwxXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gJiYgdG9rZW4udHlwZSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaW5wdXQgYW5kIG1vdmUgcmlnaHQgb25lIGlmIHdlJ3JlIHR5cGluZyBvdmVyIHRoZSBjbG9zaW5nIHF1b3RlLgogICAgICAgICAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7CiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsKICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJyInKSB7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCn0Kb29wLmluaGVyaXRzKENzdHlsZUJlaGF2aW91ciwgQmVoYXZpb3VyKTsKCmV4cG9ydHMuQ3N0eWxlQmVoYXZpb3VyID0gQ3N0eWxlQmVoYXZpb3VyOwp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcveG1sJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL3JhbmdlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgJ2FjZS90b2tlbl9pdGVyYXRvciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsKdmFyIGxhbmcgPSByZXF1aXJlKCIuLi8uLi9saWIvbGFuZyIpOwp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOwp2YXIgQmFzZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZTsKdmFyIFRva2VuSXRlcmF0b3IgPSByZXF1aXJlKCIuLi8uLi90b2tlbl9pdGVyYXRvciIpLlRva2VuSXRlcmF0b3I7Cgp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24odm9pZEVsZW1lbnRzKSB7CiAgICBCYXNlRm9sZE1vZGUuY2FsbCh0aGlzKTsKICAgIHRoaXMudm9pZEVsZW1lbnRzID0gdm9pZEVsZW1lbnRzIHx8IHt9Owp9Owpvb3AuaW5oZXJpdHMoRm9sZE1vZGUsIEJhc2VGb2xkTW9kZSk7CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsKICAgICAgICB2YXIgdGFnID0gdGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmUoc2Vzc2lvbiwgcm93KTsKCiAgICAgICAgaWYgKHRhZy5jbG9zaW5nKQogICAgICAgICAgICByZXR1cm4gZm9sZFN0eWxlID09ICJtYXJrYmVnaW5lbmQiID8gImVuZCIgOiAiIjsKCiAgICAgICAgaWYgKCF0YWcudGFnTmFtZSB8fCB0aGlzLnZvaWRFbGVtZW50c1t0YWcudGFnTmFtZS50b0xvd2VyQ2FzZSgpXSkKICAgICAgICAgICAgcmV0dXJuICIiOwoKICAgICAgICBpZiAodGFnLnNlbGZDbG9zaW5nKQogICAgICAgICAgICByZXR1cm4gIiI7CgogICAgICAgIGlmICh0YWcudmFsdWUuaW5kZXhPZigiLyIgKyB0YWcudGFnTmFtZSkgIT09IC0xKQogICAgICAgICAgICByZXR1cm4gIiI7CgogICAgICAgIHJldHVybiAic3RhcnQiOwogICAgfTsKICAgIAogICAgdGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmUgPSBmdW5jdGlvbihzZXNzaW9uLCByb3cpIHsKICAgICAgICB2YXIgdG9rZW5zID0gc2Vzc2lvbi5nZXRUb2tlbnMocm93LCByb3cpWzBdLnRva2VuczsKICAgICAgICB2YXIgdmFsdWUgPSAiIjsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV07CiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlLmluZGV4T2YoIm1ldGEudGFnIikgPT09IDApCiAgICAgICAgICAgICAgICB2YWx1ZSArPSB0b2tlbi52YWx1ZTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgdmFsdWUgKz0gbGFuZy5zdHJpbmdSZXBlYXQoIiAiLCB0b2tlbi52YWx1ZS5sZW5ndGgpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gdGhpcy5fcGFyc2VUYWcodmFsdWUpOwogICAgfTsKCiAgICB0aGlzLnRhZ1JlID0gL14oXHMqKSg8PyhcLz8pKFstX2EtekEtWjAtOTohXSopXHMqKFwvPyk+PykvOwogICAgdGhpcy5fcGFyc2VUYWcgPSBmdW5jdGlvbih0YWcpIHsKICAgICAgICAKICAgICAgICB2YXIgbWF0Y2ggPSB0aGlzLnRhZ1JlLmV4ZWModGFnKTsKICAgICAgICB2YXIgY29sdW1uID0gdGhpcy50YWdSZS5sYXN0SW5kZXggfHwgMDsKICAgICAgICB0aGlzLnRhZ1JlLmxhc3RJbmRleCA9IDA7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHZhbHVlOiB0YWcsCiAgICAgICAgICAgIG1hdGNoOiBtYXRjaCA/IG1hdGNoWzJdIDogIiIsCiAgICAgICAgICAgIGNsb3Npbmc6IG1hdGNoID8gISFtYXRjaFszXSA6IGZhbHNlLAogICAgICAgICAgICBzZWxmQ2xvc2luZzogbWF0Y2ggPyAhIW1hdGNoWzVdIHx8IG1hdGNoWzJdID09ICIvPiIgOiBmYWxzZSwKICAgICAgICAgICAgdGFnTmFtZTogbWF0Y2ggPyBtYXRjaFs0XSA6ICIiLAogICAgICAgICAgICBjb2x1bW46IG1hdGNoWzFdID8gY29sdW1uICsgbWF0Y2hbMV0ubGVuZ3RoIDogY29sdW1uCiAgICAgICAgfTsKICAgIH07CiAgICAKICAgIC8qKgogICAgICogcmVhZHMgYSBmdWxsIHRhZyBhbmQgcGxhY2VzIHRoZSBpdGVyYXRvciBhZnRlciB0aGUgdGFnCiAgICAgKi8KICAgIHRoaXMuX3JlYWRUYWdGb3J3YXJkID0gZnVuY3Rpb24oaXRlcmF0b3IpIHsKICAgICAgICB2YXIgdG9rZW4gPSBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW4oKTsKICAgICAgICBpZiAoIXRva2VuKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgCiAgICAgICAgdmFyIHZhbHVlID0gIiI7CiAgICAgICAgdmFyIHN0YXJ0OwogICAgICAgIAogICAgICAgIGRvIHsKICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUuaW5kZXhPZigibWV0YS50YWciKSA9PT0gMCkgewogICAgICAgICAgICAgICAgaWYgKCFzdGFydCkgewogICAgICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgcm93OiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Sb3coKSwKICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YWx1ZSArPSB0b2tlbi52YWx1ZTsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCI+IikgIT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRhZyA9IHRoaXMuX3BhcnNlVGFnKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQgPSBzdGFydDsKICAgICAgICAgICAgICAgICAgICB0YWcuZW5kID0gewogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpLAogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpICsgdG9rZW4udmFsdWUubGVuZ3RoCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5zdGVwRm9yd2FyZCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlKHRva2VuID0gaXRlcmF0b3Iuc3RlcEZvcndhcmQoKSk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwogICAgCiAgICB0aGlzLl9yZWFkVGFnQmFja3dhcmQgPSBmdW5jdGlvbihpdGVyYXRvcikgewogICAgICAgIHZhciB0b2tlbiA9IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbigpOwogICAgICAgIGlmICghdG9rZW4pCiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAKICAgICAgICB2YXIgdmFsdWUgPSAiIjsKICAgICAgICB2YXIgZW5kOwoKICAgICAgICBkbyB7CiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlLmluZGV4T2YoIm1ldGEudGFnIikgPT09IDApIHsKICAgICAgICAgICAgICAgIGlmICghZW5kKSB7CiAgICAgICAgICAgICAgICAgICAgZW5kID0gewogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpLAogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpICsgdG9rZW4udmFsdWUubGVuZ3RoCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhbHVlID0gdG9rZW4udmFsdWUgKyB2YWx1ZTsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCI8IikgIT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRhZyA9IHRoaXMuX3BhcnNlVGFnKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB0YWcuZW5kID0gZW5kOwogICAgICAgICAgICAgICAgICAgIHRhZy5zdGFydCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgcm93OiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Sb3coKSwKICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3Iuc3RlcEJhY2t3YXJkKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhZzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gd2hpbGUodG9rZW4gPSBpdGVyYXRvci5zdGVwQmFja3dhcmQoKSk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwogICAgCiAgICB0aGlzLl9wb3AgPSBmdW5jdGlvbihzdGFjaywgdGFnKSB7CiAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkgewogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHRvcCA9IHN0YWNrW3N0YWNrLmxlbmd0aC0xXTsKICAgICAgICAgICAgaWYgKCF0YWcgfHwgdG9wLnRhZ05hbWUgPT0gdGFnLnRhZ05hbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBzdGFjay5wb3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnZvaWRFbGVtZW50c1t0YWcudGFnTmFtZV0pIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnZvaWRFbGVtZW50c1t0b3AudGFnTmFtZV0pIHsKICAgICAgICAgICAgICAgIHN0YWNrLnBvcCgpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICAKICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsKICAgICAgICB2YXIgZmlyc3RUYWcgPSB0aGlzLl9nZXRGaXJzdFRhZ0luTGluZShzZXNzaW9uLCByb3cpOwogICAgICAgIAogICAgICAgIGlmICghZmlyc3RUYWcubWF0Y2gpCiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIAogICAgICAgIHZhciBpc0JhY2t3YXJkID0gZmlyc3RUYWcuY2xvc2luZyB8fCBmaXJzdFRhZy5zZWxmQ2xvc2luZzsKICAgICAgICB2YXIgc3RhY2sgPSBbXTsKICAgICAgICB2YXIgdGFnOwogICAgICAgIAogICAgICAgIGlmICghaXNCYWNrd2FyZCkgewogICAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBuZXcgVG9rZW5JdGVyYXRvcihzZXNzaW9uLCByb3csIGZpcnN0VGFnLmNvbHVtbik7CiAgICAgICAgICAgIHZhciBzdGFydCA9IHsKICAgICAgICAgICAgICAgIHJvdzogcm93LAogICAgICAgICAgICAgICAgY29sdW1uOiBmaXJzdFRhZy5jb2x1bW4gKyBmaXJzdFRhZy50YWdOYW1lLmxlbmd0aCArIDIKICAgICAgICAgICAgfTsKICAgICAgICAgICAgd2hpbGUgKHRhZyA9IHRoaXMuX3JlYWRUYWdGb3J3YXJkKGl0ZXJhdG9yKSkgewogICAgICAgICAgICAgICAgaWYgKHRhZy5zZWxmQ2xvc2luZykgewogICAgICAgICAgICAgICAgICAgIGlmICghc3RhY2subGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5zdGFydC5jb2x1bW4gKz0gdGFnLnRhZ05hbWUubGVuZ3RoICsgMjsKICAgICAgICAgICAgICAgICAgICAgICAgdGFnLmVuZC5jb2x1bW4gLT0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHModGFnLnN0YXJ0LCB0YWcuZW5kKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICh0YWcuY2xvc2luZykgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3BvcChzdGFjaywgdGFnKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCB0YWcuc3RhcnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCh0YWcpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHZhciBpdGVyYXRvciA9IG5ldyBUb2tlbkl0ZXJhdG9yKHNlc3Npb24sIHJvdywgZmlyc3RUYWcuY29sdW1uICsgZmlyc3RUYWcubWF0Y2gubGVuZ3RoKTsKICAgICAgICAgICAgdmFyIGVuZCA9IHsKICAgICAgICAgICAgICAgIHJvdzogcm93LAogICAgICAgICAgICAgICAgY29sdW1uOiBmaXJzdFRhZy5jb2x1bW4KICAgICAgICAgICAgfTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHdoaWxlICh0YWcgPSB0aGlzLl9yZWFkVGFnQmFja3dhcmQoaXRlcmF0b3IpKSB7CiAgICAgICAgICAgICAgICBpZiAodGFnLnNlbGZDbG9zaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFjay5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGFnLnN0YXJ0LmNvbHVtbiArPSB0YWcudGFnTmFtZS5sZW5ndGggKyAyOwogICAgICAgICAgICAgICAgICAgICAgICB0YWcuZW5kLmNvbHVtbiAtPSAyOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyh0YWcuc3RhcnQsIHRhZy5lbmQpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKCF0YWcuY2xvc2luZykgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3BvcChzdGFjaywgdGFnKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGFnLnN0YXJ0LmNvbHVtbiArPSB0YWcudGFnTmFtZS5sZW5ndGggKyAyOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyh0YWcuc3RhcnQsIGVuZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCh0YWcpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICB9OwoKfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOwoKfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOwoKdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSBudWxsOwogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7CgogICAgLy8gbXVzdCByZXR1cm4gIiIgaWYgdGhlcmUncyBubyBmb2xkLCB0byBlbmFibGUgY2FjaGluZwogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsKICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOwogICAgICAgIGlmICh0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGxpbmUpKQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsKICAgICAgICBpZiAoZm9sZFN0eWxlID09ICJtYXJrYmVnaW5lbmQiCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpCiAgICAgICAgICAgIHJldHVybiAiZW5kIjsKICAgICAgICByZXR1cm4gIiI7CiAgICB9OwogICAgCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7CiAgICAgICAgdmFyIHJlID0gL15ccyovOwogICAgICAgIHZhciBzdGFydFJvdyA9IHJvdzsKICAgICAgICB2YXIgZW5kUm93ID0gcm93OwogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgdmFyIHN0YXJ0Q29sdW1uID0gY29sdW1uIHx8IGxpbmUubGVuZ3RoOwogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOwogICAgICAgIHZhciBtYXhSb3cgPSBzZXNzaW9uLmdldExlbmd0aCgpCiAgICAgICAgCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7CiAgICAgICAgICAgIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICAgICAgdmFyIGxldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOwoKICAgICAgICAgICAgaWYgKGxldmVsID09IGxpbmUubGVuZ3RoKQogICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICBpZiAobGV2ZWwgPD0gc3RhcnRMZXZlbCkKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgZW5kUm93ID0gcm93OwogICAgICAgIH0KCiAgICAgICAgaWYgKGVuZFJvdyA+IHN0YXJ0Um93KSB7CiAgICAgICAgICAgIHZhciBlbmRDb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kUm93KS5sZW5ndGg7CiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7CiAgICAgICAgfQogICAgfTsKCiAgICB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCBicmFja2V0LCByb3csIGNvbHVtbikgewogICAgICAgIHZhciBzdGFydCA9IHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW4gKyAxfTsKICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsKICAgICAgICBpZiAoIWVuZCkKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICB2YXIgZncgPSBzZXNzaW9uLmZvbGRXaWRnZXRzW2VuZC5yb3ddOwogICAgICAgIGlmIChmdyA9PSBudWxsKQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsKCiAgICAgICAgaWYgKGZ3ID09ICJzdGFydCIpIHsKICAgICAgICAgICAgZW5kLnJvdyAtLTsKICAgICAgICAgICAgZW5kLmNvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmQucm93KS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOwogICAgfTsKCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsKCn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2phdmFzY3JpcHQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHQnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgJ2FjZS9yYW5nZScsICdhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQnLCAnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZScsICdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsKdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsKdmFyIEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiKS5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXM7CnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Owp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOwp2YXIgV29ya2VyQ2xpZW50ID0gcmVxdWlyZSgiLi4vd29ya2VyL3dvcmtlcl9jbGllbnQiKS5Xb3JrZXJDbGllbnQ7CnZhciBDc3R5bGVCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2JlaGF2aW91ci9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXI7CnZhciBDU3R5bGVGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZTsKCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKG5ldyBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsKICAgIHRoaXMuJG91dGRlbnQgPSBuZXcgTWF0Y2hpbmdCcmFjZU91dGRlbnQoKTsKICAgIHRoaXMuJGJlaGF2aW91ciA9IG5ldyBDc3R5bGVCZWhhdmlvdXIoKTsKICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IENTdHlsZUZvbGRNb2RlKCk7Cn07Cm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7CgooZnVuY3Rpb24oKSB7CgoKICAgIHRoaXMudG9nZ2xlQ29tbWVudExpbmVzID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgc3RhcnRSb3csIGVuZFJvdykgewogICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsKICAgICAgICB2YXIgcmUgPSAvXihccyopXC9cLy87CgogICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykgewogICAgICAgICAgICBpZiAoIXJlLnRlc3QoZG9jLmdldExpbmUoaSkpKSB7CiAgICAgICAgICAgICAgICBvdXRkZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKG91dGRlbnQpIHsKICAgICAgICAgICAgdmFyIGRlbGV0ZVJhbmdlID0gbmV3IFJhbmdlKDAsIDAsIDAsIDApOwogICAgICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUoaSk7CiAgICAgICAgICAgICAgICB2YXIgbSA9IGxpbmUubWF0Y2gocmUpOwogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2Uuc3RhcnQucm93ID0gaTsKICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLmVuZC5yb3cgPSBpOwogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLmNvbHVtbiA9IG1bMF0ubGVuZ3RoOwogICAgICAgICAgICAgICAgZG9jLnJlcGxhY2UoZGVsZXRlUmFuZ2UsIG1bMV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBkb2MuaW5kZW50Um93cyhzdGFydFJvdywgZW5kUm93LCAiLy8iKTsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7CiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsKCiAgICAgICAgdmFyIHRva2VuaXplZExpbmUgPSB0aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhsaW5lLCBzdGF0ZSk7CiAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplZExpbmUudG9rZW5zOwogICAgICAgIHZhciBlbmRTdGF0ZSA9IHRva2VuaXplZExpbmUuc3RhdGU7CgogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7CiAgICAgICAgICAgIHJldHVybiBpbmRlbnQ7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmIChzdGF0ZSA9PSAic3RhcnQiIHx8IHN0YXRlID09ICJyZWdleF9hbGxvd2VkIikgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eLiooPzpcYmNhc2VcYi4qXDp8W1x7XChcW10pXHMqJC8pOwogICAgICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgICAgIGluZGVudCArPSB0YWI7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09ICJkb2Mtc3RhcnQiKSB7CiAgICAgICAgICAgIGlmIChlbmRTdGF0ZSA9PSAic3RhcnQiIHx8IHN0YXRlID09ICJyZWdleF9hbGxvd2VkIikgewogICAgICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL15ccyooXC8/KVwqLyk7CiAgICAgICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICAgICAgaWYgKG1hdGNoWzFdKSB7CiAgICAgICAgICAgICAgICAgICAgaW5kZW50ICs9ICIgIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGluZGVudCArPSAiKiAiOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaW5kZW50OwogICAgfTsKCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCBpbnB1dCkgewogICAgICAgIHJldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChsaW5lLCBpbnB1dCk7CiAgICB9OwoKICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCByb3cpIHsKICAgICAgICB0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGRvYywgcm93KTsKICAgIH07CiAgICAKICAgIHRoaXMuY3JlYXRlV29ya2VyID0gZnVuY3Rpb24oc2Vzc2lvbikgewogICAgICAgIHZhciB3b3JrZXIgPSBuZXcgV29ya2VyQ2xpZW50KFsiYWNlIl0sICJ3b3JrZXItamF2YXNjcmlwdC5qcyIsICJhY2UvbW9kZS9qYXZhc2NyaXB0X3dvcmtlciIsICJKYXZhU2NyaXB0V29ya2VyIik7CiAgICAgICAgd29ya2VyLmF0dGFjaFRvRG9jdW1lbnQoc2Vzc2lvbi5nZXREb2N1bWVudCgpKTsKICAgICAgICAgICAgCiAgICAgICAgd29ya2VyLm9uKCJqc2xpbnQiLCBmdW5jdGlvbihyZXN1bHRzKSB7CiAgICAgICAgICAgIHZhciBlcnJvcnMgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHJlc3VsdHMuZGF0YS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIGVycm9yID0gcmVzdWx0cy5kYXRhW2ldOwogICAgICAgICAgICAgICAgaWYgKGVycm9yKQogICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgcm93OiBlcnJvci5saW5lLTEsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogZXJyb3IuY2hhcmFjdGVyLTEsCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGVycm9yLnJlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogIndhcm5pbmciLAogICAgICAgICAgICAgICAgICAgICAgICBsaW50OiBlcnJvcgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlc3Npb24uc2V0QW5ub3RhdGlvbnMoZXJyb3JzKTsKICAgICAgICB9KTsKICAgICAgICAKICAgICAgICB3b3JrZXIub24oIm5hcmNpc3N1cyIsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgc2Vzc2lvbi5zZXRBbm5vdGF0aW9ucyhbZS5kYXRhXSk7CiAgICAgICAgfSk7CiAgICAgICAgCiAgICAgICAgd29ya2VyLm9uKCJ0ZXJtaW5hdGUiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgc2Vzc2lvbi5jbGVhckFubm90YXRpb25zKCk7CiAgICAgICAgfSk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHdvcmtlcjsKICAgIH07Cgp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsKCmV4cG9ydHMuTW9kZSA9IE1vZGU7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqICAgICAgTWloYWkgU3VjYW4gPG1paGFpIERPVCBzdWNhbiBBVCBnbWFpbCBET1QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9sYW5nJywgJ2FjZS91bmljb2RlJywgJ2FjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOwp2YXIgdW5pY29kZSA9IHJlcXVpcmUoIi4uL3VuaWNvZGUiKTsKdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIikuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzOwp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsKCnZhciBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsKCiAgICAvLyBzZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzCiAgICB2YXIgZ2xvYmFscyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgLy8gQ29uc3RydWN0b3JzCiAgICAgICAgKCJBcnJheXxCb29sZWFufERhdGV8RnVuY3Rpb258SXRlcmF0b3J8TnVtYmVyfE9iamVjdHxSZWdFeHB8U3RyaW5nfFByb3h5fCIgKwogICAgICAvLyBFNFgKICAgICAgICAgIk5hbWVzcGFjZXxRTmFtZXxYTUx8WE1MTGlzdHwiICsKICAgICAgICAgIkFycmF5QnVmZmVyfEZsb2F0MzJBcnJheXxGbG9hdDY0QXJyYXl8SW50MTZBcnJheXxJbnQzMkFycmF5fEludDhBcnJheXwiICsKICAgICAgICAgIlVpbnQxNkFycmF5fFVpbnQzMkFycmF5fFVpbnQ4QXJyYXl8VWludDhDbGFtcGVkQXJyYXl8IiArCiAgICAgIC8vIEVycm9ycwogICAgICAgICJFcnJvcnxFdmFsRXJyb3J8SW50ZXJuYWxFcnJvcnxSYW5nZUVycm9yfFJlZmVyZW5jZUVycm9yfFN0b3BJdGVyYXRpb258IiArCiAgICAgICAgIlN5bnRheEVycm9yfFR5cGVFcnJvcnxVUklFcnJvcnwiICsKICAgICAgLy8gIE5vbi1jb25zdHJ1Y3RvciBmdW5jdGlvbnMKICAgICAgICAiZGVjb2RlVVJJfGRlY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZW5jb2RlVVJJQ29tcG9uZW50fGV2YWx8aXNGaW5pdGV8IiArCiAgICAgICAgImlzTmFOfHBhcnNlRmxvYXR8cGFyc2VJbnR8IiArCiAgICAgIC8vIE90aGVyCiAgICAgICAgIkpTT058TWF0aHwiICsKICAgICAgLy8gUHNldWRvCiAgICAgICAgInRoaXN8YXJndW1lbnRzfHByb3RvdHlwZXx3aW5kb3d8ZG9jdW1lbnQiCiAgICAgICkuc3BsaXQoInwiKQogICAgKTsKCiAgICB2YXIga2V5d29yZHMgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCJicmVha3xjYXNlfGNhdGNofGNvbnRpbnVlfGRlZmF1bHR8ZGVsZXRlfGRvfGVsc2V8ZmluYWxseXxmb3J8ZnVuY3Rpb258IiArCiAgICAgICAgImlmfGlufGluc3RhbmNlb2Z8bmV3fHJldHVybnxzd2l0Y2h8dGhyb3d8dHJ5fHR5cGVvZnxsZXR8dmFyfHdoaWxlfHdpdGh8IiArCiAgICAgICAgImNvbnN0fHlpZWxkfGltcG9ydHxnZXR8c2V0Iikuc3BsaXQoInwiKQogICAgKTsKCiAgICAvLyBrZXl3b3JkcyB3aGljaCBjYW4gYmUgZm9sbG93ZWQgYnkgcmVndWxhciBleHByZXNzaW9ucwogICAgdmFyIGt3QmVmb3JlUmUgPSAiY2FzZXxkb3xlbHNlfGZpbmFsbHl8aW58aW5zdGFuY2VvZnxyZXR1cm58dGhyb3d8dHJ5fHR5cGVvZnx5aWVsZCI7CgogICAgdmFyIGRlcHJlY2F0ZWQgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCJfX3BhcmVudF9ffF9fY291bnRfX3xlc2NhcGV8dW5lc2NhcGV8d2l0aHxfX3Byb3RvX18iKS5zcGxpdCgifCIpCiAgICApOwoKICAgIHZhciBkZWZpbml0aW9ucyA9IGxhbmcuYXJyYXlUb01hcCgoImNvbnN0fGxldHx2YXJ8ZnVuY3Rpb24iKS5zcGxpdCgifCIpKTsKCiAgICB2YXIgYnVpbGRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoIm51bGx8SW5maW5pdHl8TmFOfHVuZGVmaW5lZCIpLnNwbGl0KCJ8IikKICAgICk7CgogICAgdmFyIGZ1dHVyZVJlc2VydmVkID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgiY2xhc3N8ZW51bXxleHRlbmRzfHN1cGVyfGV4cG9ydHxpbXBsZW1lbnRzfHByaXZhdGV8IiArCiAgICAgICAgInB1YmxpY3xpbnRlcmZhY2V8cGFja2FnZXxwcm90ZWN0ZWR8c3RhdGljIikuc3BsaXQoInwiKQogICAgKTsKCiAgICAvLyBUT0RPOiBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMKICAgIHZhciBpZGVudGlmaWVyUmUgPSAiWyIgKyB1bmljb2RlLnBhY2thZ2VzLkwgKyAiXFwkX11bIiAKICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTAogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5NbiArIHVuaWNvZGUucGFja2FnZXMuTWMKICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTmQKICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuUGMgKyAiXFwkX10qXFxiIjsKICAgICAgICAKICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcy4gVXNlICg/OikgaW5zdGVhZC4KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQKCiAgICB0aGlzLiRydWxlcyA9IHsKICAgICAgICAic3RhcnQiIDogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcLy4qJCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0IiksCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJwogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydAogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdLipcXFxcJCcsCiAgICAgICAgICAgICAgICBuZXh0IDogInFxc3RyaW5nIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXS4qXFxcXCQiLAogICAgICAgICAgICAgICAgbmV4dCA6ICJxc3RyaW5nIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaGV4CiAgICAgICAgICAgICAgICByZWdleCA6ICIwW3hYXVswLTlhLWZBLUZdK1xcYiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGZsb2F0CiAgICAgICAgICAgICAgICByZWdleCA6ICJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiBbImtleXdvcmQuZGVmaW5pdGlvbiIsICJ0ZXh0IiwgImVudGl0eS5uYW1lLmZ1bmN0aW9uIl0sCiAgICAgICAgICAgICAgICByZWdleCA6ICIoZnVuY3Rpb24pKFxccyspKCIgKyBpZGVudGlmaWVyUmUgKyAiKSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiIsCiAgICAgICAgICAgICAgICByZWdleCA6ICIoPzp0cnVlfGZhbHNlKVxcYiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICIoPzoiICsga3dCZWZvcmVSZSArICIpXFxiIiwKICAgICAgICAgICAgICAgIG5leHQgOiAicmVnZXhfYWxsb3dlZCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWxzLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS5sYW5ndWFnZSI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVwcmVjYXRlZC5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZWZpbml0aW9ucy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAia2V5d29yZC5kZWZpbml0aW9uIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYnVpbGRpbkNvbnN0YW50cy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZ1dHVyZVJlc2VydmVkLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkLmlsbGVnYWwiOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09ICJkZWJ1Z2dlciIpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcmVnZXggOiBpZGVudGlmaWVyUmUKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsCiAgICAgICAgICAgICAgICByZWdleCA6ICIhfFxcJHwlfCZ8XFwqfFxcLVxcLXxcXC18XFwrXFwrfFxcK3x+fD09PXw9PXw9fCE9fCE9PXw8PXw+PXw8PD18Pj49fD4+Pj18PD58PHw+fCF8JiZ8XFx8XFx8fFxcP1xcOnxcXCo9fCU9fFxcKz18XFwtPXwmPXxcXF49fFxcYig/OmlufGluc3RhbmNlb2Z8bmV3fGRlbGV0ZXx0eXBlb2Z8dm9pZCkiLAogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAicHVuY3R1YXRpb24ub3BlcmF0b3IiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFw/fFxcOnxcXCx8XFw7fFxcLiIsCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5scGFyZW4iLAogICAgICAgICAgICAgICAgcmVnZXggOiAiW1soe10iLAogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIltcXF0pfV0iCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvPT8iLAogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW46ICJjb21tZW50IiwKICAgICAgICAgICAgICAgIHJlZ2V4OiAiXiMhLiokIiAKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIgogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAvLyByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBvbmx5IGFsbG93ZWQgYWZ0ZXIgY2VydGFpbiB0b2tlbnMuIFRoaXMKICAgICAgICAvLyBtYWtlcyBzdXJlIHdlIGRvbid0IG1peCB1cCByZWdleHBzIHdpdGggdGhlIGRpdmlzb24gb3BlcmF0b3IKICAgICAgICAicmVnZXhfYWxsb3dlZCI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudAogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwKICAgICAgICAgICAgICAgIG5leHQgOiAiY29tbWVudF9yZWdleF9hbGxvd2VkIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcLy4qJCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwIiwKICAgICAgICAgICAgICAgIHJlZ2V4OiAiXFwvIiwKICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleCIsCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5IHJldHVybiB0byB0aGUgc3RhcnQgbW9kZSB3aXRob3V0IG1hdGNoaW5nCiAgICAgICAgICAgICAgICAvLyBhbnl0aGluZwogICAgICAgICAgICAgICAgdG9rZW46ICJlbXB0eSIsIAogICAgICAgICAgICAgICAgcmVnZXg6ICIiLAogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0IgogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAicmVnZXgiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuOiAicmVnZXhwLmtleXdvcmQub3BlcmF0b3IiLAogICAgICAgICAgICAgICAgcmVnZXg6ICJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXgiCiAgICAgICAgICAgIH0sIHsKCQkJCS8vIGZsYWcKICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cCIsIAogICAgICAgICAgICAgICAgcmVnZXg6ICIvXFx3KiIsCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiLAogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUgCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cCIsCiAgICAgICAgICAgICAgICByZWdleDogIlteXFxcXC9cXFtdKyIsCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXgiLAogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyIsCiAgICAgICAgICAgICAgICByZWdleDogIlxcWyIsCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIiwKICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCAKICAgICAgICAgICAgICAgIHJlZ2V4OiAiIiwKICAgICAgICAgICAgICAgIG5leHQ6ICJzdGFydCIgCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuOiAicmVnZXhwLmtleXdvcmQub3BlcmF0b3IiLAogICAgICAgICAgICAgICAgcmVnZXg6ICJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwKICAgICAgICAgICAgICAgIHJlZ2V4OiAiXSIsCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXgiLAogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyIsCiAgICAgICAgICAgICAgICByZWdleDogIlteXFxcXFxcXV0rIiwKICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiLAogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW46ICJlbXB0eSIsIAogICAgICAgICAgICAgICAgcmVnZXg6ICIiLAogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0IiAKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgImNvbW1lbnRfcmVnZXhfYWxsb3dlZCIgOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQKICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICBuZXh0IDogInJlZ2V4X2FsbG93ZWQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIgogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiY29tbWVudCIgOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQKICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyIKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInFxc3RyaW5nIiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogJyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJywKICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKycKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInFzdHJpbmciIDogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqPyciLAogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJwogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfTsKICAgIAogICAgdGhpcy5lbWJlZFJ1bGVzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgImRvYy0iLAogICAgICAgIFsgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldEVuZFJ1bGUoInN0YXJ0IikgXSk7Cn07Cgpvb3AuaW5oZXJpdHMoSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOwoKZXhwb3J0cy5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXM7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOwoKdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuJHJ1bGVzID0gewogICAgICAgICJzdGFydCIgOiBbIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MudGFnIiwKICAgICAgICAgICAgcmVnZXggOiAiQFtcXHdcXGRfXSsiIC8vIFRPRE86IGZpeCBlbWFpbCBhZGRyZXNzZXMKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICJcXHMrIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlRPRE8iCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiW15AXFwqXSsiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiLiIKICAgICAgICB9XQogICAgfTsKfTsKCm9vcC5pbmhlcml0cyhEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5nZXRTdGFydFJ1bGUgPSBmdW5jdGlvbihzdGFydCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gZG9jIGNvbW1lbnQKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICJcXC9cXCooPz1cXCopIiwKICAgICAgICAgICAgbmV4dCAgOiBzdGFydAogICAgICAgIH07CiAgICB9OwogICAgCiAgICB0aGlzLmdldEVuZFJ1bGUgPSBmdW5jdGlvbiAoc3RhcnQpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsIC8vIGNsb3NpbmcgY29tbWVudAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlxcKlxcLyIsCiAgICAgICAgICAgIG5leHQgIDogc3RhcnQKICAgICAgICB9OwogICAgfTsKCn0pLmNhbGwoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLnByb3RvdHlwZSk7CgpleHBvcnRzLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsKCn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsKCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IGZ1bmN0aW9uKCkge307CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihsaW5lLCBpbnB1dCkgewogICAgICAgIGlmICghIC9eXHMrJC8udGVzdChsaW5lKSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgICByZXR1cm4gL15ccypcfS8udGVzdChpbnB1dCk7CiAgICB9OwoKICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihkb2MsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocm93KTsKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKlx9KS8pOwoKICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDsKCiAgICAgICAgdmFyIGNvbHVtbiA9IG1hdGNoWzFdLmxlbmd0aDsKICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gZG9jLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn0pOwoKICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcyB8fCBvcGVuQnJhY2VQb3Mucm93ID09IHJvdykgcmV0dXJuIDA7CgogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOwogICAgICAgIGRvYy5yZXBsYWNlKG5ldyBSYW5nZShyb3csIDAsIHJvdywgY29sdW1uLTEpLCBpbmRlbnQpOwogICAgfTsKCiAgICB0aGlzLiRnZXRJbmRlbnQgPSBmdW5jdGlvbihsaW5lKSB7CiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAiIjsKICAgIH07Cgp9KS5jYWxsKE1hdGNoaW5nQnJhY2VPdXRkZW50LnByb3RvdHlwZSk7CgpleHBvcnRzLk1hdGNoaW5nQnJhY2VPdXRkZW50ID0gTWF0Y2hpbmdCcmFjZU91dGRlbnQ7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS93b3JrZXIvd29ya2VyX2NsaWVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9ldmVudF9lbWl0dGVyJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXI7Cgp2YXIgV29ya2VyQ2xpZW50ID0gZnVuY3Rpb24odG9wTGV2ZWxOYW1lc3BhY2VzLCBwYWNrYWdlZEpzLCBtb2QsIGNsYXNzbmFtZSkgewoKICAgIHRoaXMuY2hhbmdlTGlzdGVuZXIgPSB0aGlzLmNoYW5nZUxpc3RlbmVyLmJpbmQodGhpcyk7CgogICAgaWYgKG1vZHVsZS5wYWNrYWdlZCkgewogICAgICAgIHZhciBiYXNlID0gdGhpcy4kZ3Vlc3NCYXNlUGF0aCgpOwogICAgICAgIHRoaXMuJHdvcmtlciA9IG5ldyBXb3JrZXIoYmFzZSArIHBhY2thZ2VkSnMpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgdmFyIHdvcmtlclVybCA9IHRoaXMuJG5vcm1hbGl6ZVBhdGgocmVxdWlyZS5uYW1lVG9VcmwoImFjZS93b3JrZXIvd29ya2VyIiwgbnVsbCwgIl8iKSk7CiAgICAgICAgdGhpcy4kd29ya2VyID0gbmV3IFdvcmtlcih3b3JrZXJVcmwpOwoKICAgICAgICB2YXIgdGxucyA9IHt9OwogICAgICAgIGZvciAodmFyIGk9MDsgaTx0b3BMZXZlbE5hbWVzcGFjZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIG5zID0gdG9wTGV2ZWxOYW1lc3BhY2VzW2ldOwogICAgICAgICAgICB2YXIgcGF0aCA9IHRoaXMuJG5vcm1hbGl6ZVBhdGgocmVxdWlyZS5uYW1lVG9VcmwobnMsIG51bGwsICJfIikucmVwbGFjZSgvLmpzJC8sICIiKSk7CgogICAgICAgICAgICB0bG5zW25zXSA9IHBhdGg7CiAgICAgICAgfQogICAgfQoKICAgIHRoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7CiAgICAgICAgaW5pdCA6IHRydWUsCiAgICAgICAgdGxuczogdGxucywKICAgICAgICBtb2R1bGU6IG1vZCwKICAgICAgICBjbGFzc25hbWU6IGNsYXNzbmFtZQogICAgfSk7CgogICAgdGhpcy5jYWxsYmFja0lkID0gMTsKICAgIHRoaXMuY2FsbGJhY2tzID0ge307CgogICAgdmFyIF9zZWxmID0gdGhpczsKICAgIHRoaXMuJHdvcmtlci5vbmVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgIHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUubG9nICYmIGNvbnNvbGUubG9nKGUpOwogICAgICAgIHRocm93IGU7CiAgICB9OwogICAgdGhpcy4kd29ya2VyLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICB2YXIgbXNnID0gZS5kYXRhOwogICAgICAgIHN3aXRjaChtc2cudHlwZSkgewogICAgICAgICAgICBjYXNlICJsb2ciOgogICAgICAgICAgICAgICAgd2luZG93LmNvbnNvbGUgJiYgY29uc29sZS5sb2cgJiYgY29uc29sZS5sb2cobXNnLmRhdGEpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICJldmVudCI6CiAgICAgICAgICAgICAgICBfc2VsZi5fZW1pdChtc2cubmFtZSwge2RhdGE6IG1zZy5kYXRhfSk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgImNhbGwiOgogICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gX3NlbGYuY2FsbGJhY2tzW21zZy5pZF07CiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhtc2cuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIF9zZWxmLmNhbGxiYWNrc1ttc2cuaWRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfTsKfTsKCihmdW5jdGlvbigpewoKICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsKCiAgICB0aGlzLiRub3JtYWxpemVQYXRoID0gZnVuY3Rpb24ocGF0aCkgewogICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL15bYS16XSs6XC9cL1teXC9dK1wvLywgIiIpOyAvLyBSZW1vdmUgZG9tYWluIG5hbWUgYW5kIHJlYnVpbGQgaXQKICAgICAgICBwYXRoID0gbG9jYXRpb24ucHJvdG9jb2wgKyAiLy8iICsgbG9jYXRpb24uaG9zdAogICAgICAgICAgICAvLyBwYXRocyBzdGFydGluZyB3aXRoIGEgc2xhc2ggYXJlIHJlbGF0aXZlIHRvIHRoZSByb290IChob3N0KQogICAgICAgICAgICArIChwYXRoLmNoYXJBdCgwKSA9PSAiLyIgPyAiIiA6IGxvY2F0aW9uLnBhdGhuYW1lLnJlcGxhY2UoL1wvW15cL10qJC8sICIiKSkKICAgICAgICAgICAgKyAiLyIgKyBwYXRoLnJlcGxhY2UoL15bXC9dKy8sICIiKTsKICAgICAgICByZXR1cm4gcGF0aDsKICAgIH07CgogICAgdGhpcy4kZ3Vlc3NCYXNlUGF0aCA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmIChyZXF1aXJlLmFjZUJhc2VVcmwpCiAgICAgICAgICAgIHJldHVybiByZXF1aXJlLmFjZUJhc2VVcmw7CgogICAgICAgIHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpOwogICAgICAgIGZvciAodmFyIGk9MDsgaTxzY3JpcHRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBzY3JpcHQgPSBzY3JpcHRzW2ldOwoKICAgICAgICAgICAgdmFyIGJhc2UgPSBzY3JpcHQuZ2V0QXR0cmlidXRlKCJkYXRhLWFjZS1iYXNlIik7CiAgICAgICAgICAgIGlmIChiYXNlKQogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UucmVwbGFjZSgvXC8qJC8sICIvIik7CgogICAgICAgICAgICB2YXIgc3JjID0gc2NyaXB0LnNyYyB8fCBzY3JpcHQuZ2V0QXR0cmlidXRlKCJzcmMiKTsKICAgICAgICAgICAgaWYgKCFzcmMpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBtID0gc3JjLm1hdGNoKC9eKD86KC4qXC8pYWNlXC5qc3woLipcLylhY2UoLXVuY29tcHJlc3NlZCk/KC1ub2NvbmZsaWN0KT9cLmpzKSg/Olw/fCQpLyk7CiAgICAgICAgICAgIGlmIChtKQogICAgICAgICAgICAgICAgcmV0dXJuIG1bMV0gfHwgbVsyXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICIiOwogICAgfTsKCiAgICB0aGlzLnRlcm1pbmF0ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2VtaXQoInRlcm1pbmF0ZSIsIHt9KTsKICAgICAgICB0aGlzLiR3b3JrZXIudGVybWluYXRlKCk7CiAgICAgICAgdGhpcy4kd29ya2VyID0gbnVsbDsKICAgICAgICB0aGlzLiRkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7CiAgICAgICAgdGhpcy4kZG9jID0gbnVsbDsKICAgIH07CgogICAgdGhpcy5zZW5kID0gZnVuY3Rpb24oY21kLCBhcmdzKSB7CiAgICAgICAgdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtjb21tYW5kOiBjbWQsIGFyZ3M6IGFyZ3N9KTsKICAgIH07CgogICAgdGhpcy5jYWxsID0gZnVuY3Rpb24oY21kLCBhcmdzLCBjYWxsYmFjaykgewogICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgaWQgPSB0aGlzLmNhbGxiYWNrSWQrKzsKICAgICAgICAgICAgdGhpcy5jYWxsYmFja3NbaWRdID0gY2FsbGJhY2s7CiAgICAgICAgICAgIGFyZ3MucHVzaChpZCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuc2VuZChjbWQsIGFyZ3MpOwogICAgfTsKCiAgICB0aGlzLmVtaXQgPSBmdW5jdGlvbihldmVudCwgZGF0YSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIC8vIGZpcmVmb3ggcmVmdXNlcyB0byBjbG9uZSBvYmplY3RzIHdoaWNoIGhhdmUgZnVuY3Rpb24gcHJvcGVydGllcwogICAgICAgICAgICAvLyBUT0RPOiBjbGVhbnVwIGV2ZW50CiAgICAgICAgICAgIHRoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7ZXZlbnQ6IGV2ZW50LCBkYXRhOiB7ZGF0YTogZGF0YS5kYXRhfX0pOwogICAgICAgIH0KICAgICAgICBjYXRjaChleCkge30KICAgIH07CgogICAgdGhpcy5hdHRhY2hUb0RvY3VtZW50ID0gZnVuY3Rpb24oZG9jKSB7CiAgICAgICAgaWYodGhpcy4kZG9jKQogICAgICAgICAgICB0aGlzLnRlcm1pbmF0ZSgpOwoKICAgICAgICB0aGlzLiRkb2MgPSBkb2M7CiAgICAgICAgdGhpcy5jYWxsKCJzZXRWYWx1ZSIsIFtkb2MuZ2V0VmFsdWUoKV0pOwogICAgICAgIGRvYy5vbigiY2hhbmdlIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7CiAgICB9OwoKICAgIHRoaXMuY2hhbmdlTGlzdGVuZXIgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgZS5yYW5nZSA9IHsKICAgICAgICAgICAgc3RhcnQ6IGUuZGF0YS5yYW5nZS5zdGFydCwKICAgICAgICAgICAgZW5kOiBlLmRhdGEucmFuZ2UuZW5kCiAgICAgICAgfTsKICAgICAgICB0aGlzLmVtaXQoImNoYW5nZSIsIGUpOwogICAgfTsKCn0pLmNhbGwoV29ya2VyQ2xpZW50LnByb3RvdHlwZSk7CgpleHBvcnRzLldvcmtlckNsaWVudCA9IFdvcmtlckNsaWVudDsKCn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7CnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7CnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOwoKdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307Cm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IC8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvOwogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IC9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLzsKICAgIAogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXg7CgogICAgICAgICAgICBpZiAobWF0Y2hbMV0pCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKHNlc3Npb24sIG1hdGNoWzFdLCByb3csIGkpOwoKICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSArIG1hdGNoWzBdLmxlbmd0aCk7CiAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsKICAgICAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGZvbGRTdHlsZSAhPT0gIm1hcmtiZWdpbmVuZCIpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDsKCiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkgewogICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSk7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiByb3csIGNvbHVtbjogaX07CiAgICAgICAgICAgIHZhciBzdGFydCA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldChtYXRjaFsxXSwgZW5kKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICghc3RhcnQpCiAgICAgICAgICAgICAgICByZXR1cm47CgogICAgICAgICAgICBzdGFydC5jb2x1bW4rKzsKICAgICAgICAgICAgZW5kLmNvbHVtbi0tOwoKICAgICAgICAgICAgcmV0dXJuICBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOwogICAgICAgIH0KICAgIH07CiAgICAKfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOwoKfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9jc3MnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHQnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS9jc3NfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCAnYWNlL3dvcmtlci93b3JrZXJfY2xpZW50JywgJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOwp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOwp2YXIgQ3NzSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2Nzc19oaWdobGlnaHRfcnVsZXMiKS5Dc3NIaWdobGlnaHRSdWxlczsKdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gcmVxdWlyZSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQ7CnZhciBXb3JrZXJDbGllbnQgPSByZXF1aXJlKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudDsKdmFyIENTdHlsZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlOwoKdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IENzc0hpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSwgImkiKTsKICAgIHRoaXMuJG91dGRlbnQgPSBuZXcgTWF0Y2hpbmdCcmFjZU91dGRlbnQoKTsKICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IENTdHlsZUZvbGRNb2RlKCk7Cn07Cm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5mb2xkaW5nUnVsZXMgPSAiY1N0eWxlIjsKCiAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgewogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQobGluZSk7CgogICAgICAgIC8vIGlnbm9yZSBicmFjZXMgaW4gY29tbWVudHMKICAgICAgICB2YXIgdG9rZW5zID0gdGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMobGluZSwgc3RhdGUpLnRva2VuczsKICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXS50eXBlID09ICJjb21tZW50IikgewogICAgICAgICAgICByZXR1cm4gaW5kZW50OwogICAgICAgIH0KCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXi4qXHtccyokLyk7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIGluZGVudCArPSB0YWI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaW5kZW50OwogICAgfTsKCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCBpbnB1dCkgewogICAgICAgIHJldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChsaW5lLCBpbnB1dCk7CiAgICB9OwoKICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCByb3cpIHsKICAgICAgICB0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGRvYywgcm93KTsKICAgIH07CiAgICAKICAgIHRoaXMuY3JlYXRlV29ya2VyID0gZnVuY3Rpb24oc2Vzc2lvbikgewogICAgICAgIHZhciB3b3JrZXIgPSBuZXcgV29ya2VyQ2xpZW50KFsiYWNlIl0sICJ3b3JrZXItY3NzLmpzIiwgImFjZS9tb2RlL2Nzc193b3JrZXIiLCAiV29ya2VyIik7CiAgICAgICAgd29ya2VyLmF0dGFjaFRvRG9jdW1lbnQoc2Vzc2lvbi5nZXREb2N1bWVudCgpKTsKICAgICAgICAKICAgICAgICB3b3JrZXIub24oImNzc2xpbnQiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIHZhciBlcnJvcnMgPSBbXTsKICAgICAgICAgICAgZS5kYXRhLmZvckVhY2goZnVuY3Rpb24obWVzc2FnZSkgewogICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goewogICAgICAgICAgICAgICAgICAgIHJvdzogbWVzc2FnZS5saW5lIC0gMSwKICAgICAgICAgICAgICAgICAgICBjb2x1bW46IG1lc3NhZ2UuY29sIC0gMSwKICAgICAgICAgICAgICAgICAgICB0ZXh0OiBtZXNzYWdlLm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgdHlwZTogbWVzc2FnZS50eXBlLAogICAgICAgICAgICAgICAgICAgIGxpbnQ6IG1lc3NhZ2UKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHNlc3Npb24uc2V0QW5ub3RhdGlvbnMoZXJyb3JzKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gd29ya2VyOwogICAgfTsKCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOwoKZXhwb3J0cy5Nb2RlID0gTW9kZTsKCn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2Nzc19oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOwp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsKCnZhciBDc3NIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgewoKICAgIHZhciBwcm9wZXJ0aWVzID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgiLW1vei1hcHBlYXJhbmNlfC1tb3otYm94LXNpemluZ3wtd2Via2l0LWJveC1zaXppbmd8LW1vei1vdXRsaW5lLXJhZGl1c3wtbW96LXRyYW5zZm9ybXwtd2Via2l0LXRyYW5zZm9ybXwiICsKICAgICAgICAiYXBwZWFyYW5jZXxhemltdXRofGJhY2tncm91bmQtYXR0YWNobWVudHxiYWNrZ3JvdW5kLWNvbG9yfGJhY2tncm91bmQtaW1hZ2V8IiArCiAgICAgICAgImJhY2tncm91bmQtb3JpZ2lufGJhY2tncm91bmQtcG9zaXRpb258YmFja2dyb3VuZC1yZXBlYXR8YmFja2dyb3VuZHxib3JkZXItYm90dG9tLWNvbG9yfCIgKwogICAgICAgICJib3JkZXItYm90dG9tLXN0eWxlfGJvcmRlci1ib3R0b20td2lkdGh8Ym9yZGVyLWJvdHRvbXxib3JkZXItY29sbGFwc2V8IiArCiAgICAgICAgImJvcmRlci1jb2xvcnxib3JkZXItbGVmdC1jb2xvcnxib3JkZXItbGVmdC1zdHlsZXxib3JkZXItbGVmdC13aWR0aHwiICsKICAgICAgICAiYm9yZGVyLWxlZnR8Ym9yZGVyLXJpZ2h0LWNvbG9yfGJvcmRlci1yaWdodC1zdHlsZXxib3JkZXItcmlnaHQtd2lkdGh8IiArCiAgICAgICAgImJvcmRlci1yaWdodHxib3JkZXItc3BhY2luZ3xib3JkZXItc3R5bGV8Ym9yZGVyLXRvcC1jb2xvcnwiICsKICAgICAgICAiYm9yZGVyLXRvcC1zdHlsZXxib3JkZXItdG9wLXdpZHRofGJvcmRlci10b3B8Ym9yZGVyLXdpZHRofGJvcmRlcnwiICsKICAgICAgICAiYm90dG9tfGJveC1zaXppbmd8Y2FwdGlvbi1zaWRlfGNsZWFyfGNsaXB8Y29sb3J8Y29udGVudHxjb3VudGVyLWluY3JlbWVudHwiICsKICAgICAgICAiY291bnRlci1yZXNldHxjdWUtYWZ0ZXJ8Y3VlLWJlZm9yZXxjdWV8Y3Vyc29yfGRpcmVjdGlvbnxkaXNwbGF5fCIgKwogICAgICAgICJlbGV2YXRpb258ZW1wdHktY2VsbHN8ZmxvYXR8Zm9udC1mYW1pbHl8Zm9udC1zaXplLWFkanVzdHxmb250LXNpemV8IiArCiAgICAgICAgImZvbnQtc3RyZXRjaHxmb250LXN0eWxlfGZvbnQtdmFyaWFudHxmb250LXdlaWdodHxmb250fGhlaWdodHxsZWZ0fCIgKwogICAgICAgICJsZXR0ZXItc3BhY2luZ3xsaW5lLWhlaWdodHxsaXN0LXN0eWxlLWltYWdlfGxpc3Qtc3R5bGUtcG9zaXRpb258IiArCiAgICAgICAgImxpc3Qtc3R5bGUtdHlwZXxsaXN0LXN0eWxlfG1hcmdpbi1ib3R0b218bWFyZ2luLWxlZnR8bWFyZ2luLXJpZ2h0fCIgKwogICAgICAgICJtYXJnaW4tdG9wfG1hcmtlci1vZmZzZXR8bWFyZ2lufG1hcmtzfG1heC1oZWlnaHR8bWF4LXdpZHRofG1pbi1oZWlnaHR8IiArCiAgICAgICAgIm1pbi13aWR0aHwtbW96LWJvcmRlci1yYWRpdXN8b3BhY2l0eXxvcnBoYW5zfG91dGxpbmUtY29sb3J8b3V0bGluZS1vZmZzZXR8b3V0bGluZS1yYWRpdXN8IiArCiAgICAgICAgIm91dGxpbmUtc3R5bGV8b3V0bGluZS13aWR0aHxvdXRsaW5lfG92ZXJmbG93fG92ZXJmbG93LXh8b3ZlcmZsb3cteXxwYWRkaW5nLWJvdHRvbXwiICsKICAgICAgICAicGFkZGluZy1sZWZ0fHBhZGRpbmctcmlnaHR8cGFkZGluZy10b3B8cGFkZGluZ3xwYWdlLWJyZWFrLWFmdGVyfCIgKwogICAgICAgICJwYWdlLWJyZWFrLWJlZm9yZXxwYWdlLWJyZWFrLWluc2lkZXxwYWdlfHBhdXNlLWFmdGVyfHBhdXNlLWJlZm9yZXwiICsKICAgICAgICAicGF1c2V8cGl0Y2gtcmFuZ2V8cGl0Y2h8cGxheS1kdXJpbmd8cG9pbnRlci1ldmVudHN8cG9zaXRpb258cXVvdGVzfHJlc2l6ZXxyaWNobmVzc3xyaWdodHwiICsKICAgICAgICAic2l6ZXxzcGVhay1oZWFkZXJ8c3BlYWstbnVtZXJhbHxzcGVhay1wdW5jdHVhdGlvbnxzcGVlY2gtcmF0ZXxzcGVha3wiICsKICAgICAgICAic3RyZXNzfHRhYmxlLWxheW91dHx0ZXh0LWFsaWdufHRleHQtZGVjb3JhdGlvbnx0ZXh0LWluZGVudHwiICsKICAgICAgICAidGV4dC1zaGFkb3d8dGV4dC10cmFuc2Zvcm18dG9wfHRyYW5zZm9ybXx1bmljb2RlLWJpZGl8dmVydGljYWwtYWxpZ258IiArCiAgICAgICAgInZpc2liaWxpdHl8dm9pY2UtZmFtaWx5fHZvbHVtZXx3aGl0ZS1zcGFjZXx3aWRvd3N8d2lkdGh8d29yZC1zcGFjaW5nfCIgKwogICAgICAgICJ6LWluZGV4Iikuc3BsaXQoInwiKQogICAgKTsKCiAgICB2YXIgZnVuY3Rpb25zID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgicmdifHJnYmF8dXJsfGF0dHJ8Y291bnRlcnxjb3VudGVycyIpLnNwbGl0KCJ8IikKICAgICk7CgogICAgdmFyIGNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoImFic29sdXRlfGFsbC1zY3JvbGx8YWx3YXlzfGFybWVuaWFufGF1dG98YmFzZWxpbmV8YmVsb3d8YmlkaS1vdmVycmlkZXwiICsKICAgICAgICAiYmxvY2t8Ym9sZHxib2xkZXJ8Ym9yZGVyLWJveHxib3RofGJvdHRvbXxicmVhay1hbGx8YnJlYWstd29yZHxjYXBpdGFsaXplfGNlbnRlcnwiICsKICAgICAgICAiY2hhcnxjaXJjbGV8Y2prLWlkZW9ncmFwaGljfGNvbC1yZXNpemV8Y29sbGFwc2V8Y29udGVudC1ib3h8Y3Jvc3NoYWlyfGRhc2hlZHwiICsKICAgICAgICAiZGVjaW1hbC1sZWFkaW5nLXplcm98ZGVjaW1hbHxkZWZhdWx0fGRpc2FibGVkfGRpc2N8IiArCiAgICAgICAgImRpc3RyaWJ1dGUtYWxsLWxpbmVzfGRpc3RyaWJ1dGUtbGV0dGVyfGRpc3RyaWJ1dGUtc3BhY2V8IiArCiAgICAgICAgImRpc3RyaWJ1dGV8ZG90dGVkfGRvdWJsZXxlLXJlc2l6ZXxlbGxpcHNpc3xmaXhlZHxnZW9yZ2lhbnxncm9vdmV8IiArCiAgICAgICAgImhhbmR8aGVicmV3fGhlbHB8aGlkZGVufGhpcmFnYW5hLWlyb2hhfGhpcmFnYW5hfGhvcml6b250YWx8IiArCiAgICAgICAgImlkZW9ncmFwaC1hbHBoYXxpZGVvZ3JhcGgtbnVtZXJpY3xpZGVvZ3JhcGgtcGFyZW50aGVzaXN8IiArCiAgICAgICAgImlkZW9ncmFwaC1zcGFjZXxpbmFjdGl2ZXxpbmhlcml0fGlubGluZS1ibG9ja3xpbmxpbmV8aW5zZXR8aW5zaWRlfCIgKwogICAgICAgICJpbnRlci1pZGVvZ3JhcGh8aW50ZXItd29yZHxpdGFsaWN8anVzdGlmeXxrYXRha2FuYS1pcm9oYXxrYXRha2FuYXwiICsKICAgICAgICAia2VlcC1hbGx8bGVmdHxsaWdodGVyfGxpbmUtZWRnZXxsaW5lLXRocm91Z2h8bGluZXxsaXN0LWl0ZW18bG9vc2V8IiArCiAgICAgICAgImxvd2VyLWFscGhhfGxvd2VyLWdyZWVrfGxvd2VyLWxhdGlufGxvd2VyLXJvbWFufGxvd2VyY2FzZXxsci10YnxsdHJ8IiArCiAgICAgICAgIm1lZGl1bXxtaWRkbGV8bW92ZXxuLXJlc2l6ZXxuZS1yZXNpemV8bmV3c3BhcGVyfG5vLWRyb3B8bm8tcmVwZWF0fCIgKwogICAgICAgICJudy1yZXNpemV8bm9uZXxub3JtYWx8bm90LWFsbG93ZWR8bm93cmFwfG9ibGlxdWV8b3V0c2V0fG91dHNpZGV8IiArCiAgICAgICAgIm92ZXJsaW5lfHBvaW50ZXJ8cHJvZ3Jlc3N8cmVsYXRpdmV8cmVwZWF0LXh8cmVwZWF0LXl8cmVwZWF0fHJpZ2h0fCIgKwogICAgICAgICJyaWRnZXxyb3ctcmVzaXplfHJ0bHxzLXJlc2l6ZXxzY3JvbGx8c2UtcmVzaXplfHNlcGFyYXRlfHNtYWxsLWNhcHN8IiArCiAgICAgICAgInNvbGlkfHNxdWFyZXxzdGF0aWN8c3RyaWN0fHN1cGVyfHN3LXJlc2l6ZXx0YWJsZS1mb290ZXItZ3JvdXB8IiArCiAgICAgICAgInRhYmxlLWhlYWRlci1ncm91cHx0Yi1ybHx0ZXh0LWJvdHRvbXx0ZXh0LXRvcHx0ZXh0fHRoaWNrfHRoaW58dG9wfCIgKwogICAgICAgICJ0cmFuc3BhcmVudHx1bmRlcmxpbmV8dXBwZXItYWxwaGF8dXBwZXItbGF0aW58dXBwZXItcm9tYW58dXBwZXJjYXNlfCIgKwogICAgICAgICJ2ZXJ0aWNhbC1pZGVvZ3JhcGhpY3x2ZXJ0aWNhbC10ZXh0fHZpc2libGV8dy1yZXNpemV8d2FpdHx3aGl0ZXNwYWNlfCIgKwogICAgICAgICJ6ZXJvIikuc3BsaXQoInwiKQogICAgKTsKCiAgICB2YXIgY29sb3JzID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgiYXF1YXxibGFja3xibHVlfGZ1Y2hzaWF8Z3JheXxncmVlbnxsaW1lfG1hcm9vbnxuYXZ5fG9saXZlfG9yYW5nZXwiICsKICAgICAgICAicHVycGxlfHJlZHxzaWx2ZXJ8dGVhbHx3aGl0ZXx5ZWxsb3ciKS5zcGxpdCgifCIpCiAgICApOwoKICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcy4gVXNlICg/OikgaW5zdGVhZC4KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQKCiAgICB2YXIgbnVtUmUgPSAiXFwtPyg/Oig/OlswLTldKyl8KD86WzAtOV0qXFwuWzAtOV0rKSkiOwoKICAgIHZhciBiYXNlX3J1bGVzZXQgPSBbCiAgICAgICAgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50CiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwKICAgICAgICAgICAgbmV4dCA6ICJydWxlc2V0X2NvbW1lbnQiCiAgICAgICAgfSx7CiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lCiAgICAgICAgICAgIHJlZ2V4IDogJ1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQogICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsCiAgICAgICAgICAgIHJlZ2V4IDogbnVtUmUgKyAiKD86ZW18ZXh8cHh8Y218bW18aW58cHR8cGN8ZGVnfHJhZHxncmFkfG1zfHN8aHp8a2h6fCUpIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsICAvLyBoZXg2IGNvbG9yCiAgICAgICAgICAgIHJlZ2V4IDogIiNbYS1mMC05XXs2fSIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBoZXgzIGNvbG9yCiAgICAgICAgICAgIHJlZ2V4IDogIiNbYS1mMC05XXszfSIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LnR5cGUiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZnVuY3Rpb25zLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmZ1bmN0aW9uIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnN0YW50cy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZS50b0xvd2VyQ2FzZSgpKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5jb25zdGFudCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2xvcnMuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuY29uc3RhbnQuY29sb3IiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ0ZXh0IjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmVnZXggOiAiXFwtP1thLXpBLVpfXVthLXpBLVowLTlfXFwtXSoiCiAgICAgICAgfQogICAgICBdOwoKICAgIHZhciBydWxlc2V0ID0gbGFuZy5jb3B5QXJyYXkoYmFzZV9ydWxlc2V0KTsKICAgIHJ1bGVzZXQudW5zaGlmdCh7CiAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwKICAgICAgICByZWdleCA6ICJcXH0iLAogICAgICAgIG5leHQ6ICAgInN0YXJ0IgogICAgfSk7CgogICAgdmFyIG1lZGlhX3J1bGVzZXQgPSBsYW5nLmNvcHlBcnJheSggYmFzZV9ydWxlc2V0ICk7CiAgICBtZWRpYV9ydWxlc2V0LnVuc2hpZnQoewogICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsCiAgICAgICAgcmVnZXggOiAiXFx9IiwKICAgICAgICBuZXh0OiAgICJtZWRpYSIKICAgIH0pOwoKICAgIHZhciBiYXNlX2NvbW1lbnQgPSBbewogICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQogICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgcmVnZXggOiAiLisiCiAgICB9XTsKCiAgICB2YXIgY29tbWVudCA9IGxhbmcuY29weUFycmF5KGJhc2VfY29tbWVudCk7CiAgICBjb21tZW50LnVuc2hpZnQoewogICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudAogICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwKICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICB9KTsKCiAgICB2YXIgbWVkaWFfY29tbWVudCA9IGxhbmcuY29weUFycmF5KGJhc2VfY29tbWVudCk7CiAgICBtZWRpYV9jb21tZW50LnVuc2hpZnQoewogICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudAogICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwKICAgICAgICAgIG5leHQgOiAibWVkaWEiCiAgICB9KTsKCiAgICB2YXIgcnVsZXNldF9jb21tZW50ID0gbGFuZy5jb3B5QXJyYXkoYmFzZV9jb21tZW50KTsKICAgIHJ1bGVzZXRfY29tbWVudC51bnNoaWZ0KHsKICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQKICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsCiAgICAgICAgICBuZXh0IDogInJ1bGVzZXQiCiAgICB9KTsKCiAgICB0aGlzLiRydWxlcyA9IHsKICAgICAgICAic3RhcnQiIDogW3sKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsCiAgICAgICAgICAgIG5leHQgOiAiY29tbWVudCIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuOiAicGFyZW4ubHBhcmVuIiwKICAgICAgICAgICAgcmVnZXg6ICJcXHsiLAogICAgICAgICAgICBuZXh0OiAgInJ1bGVzZXQiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbjogInN0cmluZyIsCiAgICAgICAgICAgIHJlZ2V4OiAiQC4qP3siLAogICAgICAgICAgICBuZXh0OiAgIm1lZGlhIgogICAgICAgIH0sewogICAgICAgICAgICB0b2tlbjogImtleXdvcmQiLAogICAgICAgICAgICByZWdleDogIiNbYS16MC05LV9dKyIKICAgICAgICB9LHsKICAgICAgICAgICAgdG9rZW46ICJ2YXJpYWJsZSIsCiAgICAgICAgICAgIHJlZ2V4OiAiXFwuW2EtejAtOS1fXSsiCiAgICAgICAgfSx7CiAgICAgICAgICAgIHRva2VuOiAic3RyaW5nIiwKICAgICAgICAgICAgcmVnZXg6ICI6W2EtejAtOS1fXSsiCiAgICAgICAgfSx7CiAgICAgICAgICAgIHRva2VuOiAiY29uc3RhbnQiLAogICAgICAgICAgICByZWdleDogIlthLXowLTktX10rIgogICAgICAgIH1dLAoKICAgICAgICAibWVkaWEiIDogWyB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLAogICAgICAgICAgICBuZXh0IDogIm1lZGlhX2NvbW1lbnQiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbjogInBhcmVuLmxwYXJlbiIsCiAgICAgICAgICAgIHJlZ2V4OiAiXFx7IiwKICAgICAgICAgICAgbmV4dDogICJtZWRpYV9ydWxlc2V0IgogICAgICAgIH0sewogICAgICAgICAgICB0b2tlbjogInN0cmluZyIsCiAgICAgICAgICAgIHJlZ2V4OiAiXFx9IiwKICAgICAgICAgICAgbmV4dDogICJzdGFydCIKICAgICAgICB9LHsKICAgICAgICAgICAgdG9rZW46ICJrZXl3b3JkIiwKICAgICAgICAgICAgcmVnZXg6ICIjW2EtejAtOS1fXSsiCiAgICAgICAgfSx7CiAgICAgICAgICAgIHRva2VuOiAidmFyaWFibGUiLAogICAgICAgICAgICByZWdleDogIlxcLlthLXowLTktX10rIgogICAgICAgIH0sewogICAgICAgICAgICB0b2tlbjogInN0cmluZyIsCiAgICAgICAgICAgIHJlZ2V4OiAiOlthLXowLTktX10rIgogICAgICAgIH0sewogICAgICAgICAgICB0b2tlbjogImNvbnN0YW50IiwKICAgICAgICAgICAgcmVnZXg6ICJbYS16MC05LV9dKyIKICAgICAgICB9XSwKCiAgICAgICAgImNvbW1lbnQiIDogY29tbWVudCwKCiAgICAgICAgInJ1bGVzZXQiIDogcnVsZXNldCwKICAgICAgICAicnVsZXNldF9jb21tZW50IiA6IHJ1bGVzZXRfY29tbWVudCwKCiAgICAgICAgIm1lZGlhX3J1bGVzZXQiIDogbWVkaWFfcnVsZXNldCwKICAgICAgICAibWVkaWFfY29tbWVudCIgOiBtZWRpYV9jb21tZW50CiAgICB9Owp9OwoKb29wLmluaGVyaXRzKENzc0hpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOwoKZXhwb3J0cy5Dc3NIaWdobGlnaHRSdWxlcyA9IENzc0hpZ2hsaWdodFJ1bGVzOwoKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvY29sZGZ1c2lvbl9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL2Nzc19oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUveG1sX3V0aWwnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBDc3NIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vY3NzX2hpZ2hsaWdodF9ydWxlcyIpLkNzc0hpZ2hsaWdodFJ1bGVzOwp2YXIgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIpLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlczsKdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7CnZhciB4bWxfdXRpbCA9IHJlcXVpcmUoIi4veG1sX3V0aWwiKTsKCnZhciBDb2xkZnVzaW9uSGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsKCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMKICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQKCiAgICB0aGlzLiRydWxlcyA9IHsKICAgICAgICBzdGFydCA6IFsgewogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICI8XFwhXFxbQ0RBVEFcXFsiLAogICAgICAgICAgICBuZXh0IDogImNkYXRhIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAieG1sX3BlIiwKICAgICAgICAgICAgcmVnZXggOiAiPFxcPy4qP1xcPz4iCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICI8XFwhLS0iLAogICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJtZXRhLnRhZyIsCiAgICAgICAgICAgIHJlZ2V4IDogIjwoPz1ccypzY3JpcHQpIiwKICAgICAgICAgICAgbmV4dCA6ICJzY3JpcHQiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJtZXRhLnRhZyIsCiAgICAgICAgICAgIHJlZ2V4IDogIjwoPz1ccypzdHlsZSkiLAogICAgICAgICAgICBuZXh0IDogImNzcyIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogIm1ldGEudGFnIiwgLy8gb3BlbmluZyB0YWcKICAgICAgICAgICAgcmVnZXggOiAiPFxcLz8iLAogICAgICAgICAgICBuZXh0IDogInRhZyIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgICAgICByZWdleCA6ICJcXHMrIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsCiAgICAgICAgICAgIHJlZ2V4IDogIltePF0rIgogICAgICAgIH0gXSwKICAgIAogICAgICAgIGNkYXRhIDogWyB7CiAgICAgICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgICAgICByZWdleCA6ICJcXF1cXF0+IiwKICAgICAgICAgICAgbmV4dCA6ICJzdGFydCIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlxccysiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICIuKyIKICAgICAgICB9IF0sCgogICAgICAgIGNvbW1lbnQgOiBbIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgIHJlZ2V4IDogIi4qPy0tPiIsCiAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICIuKyIKICAgICAgICB9IF0KICAgIH07CiAgICAKICAgIHhtbF91dGlsLnRhZyh0aGlzLiRydWxlcywgInRhZyIsICJzdGFydCIpOwogICAgeG1sX3V0aWwudGFnKHRoaXMuJHJ1bGVzLCAiY3NzIiwgImNzcy1zdGFydCIpOwogICAgeG1sX3V0aWwudGFnKHRoaXMuJHJ1bGVzLCAic2NyaXB0IiwgImpzLXN0YXJ0Iik7CiAgICAKICAgIHRoaXMuZW1iZWRSdWxlcyhKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMsICJqcy0iLCBbewogICAgICAgIHRva2VuOiAiY29tbWVudCIsCiAgICAgICAgcmVnZXg6ICJcXC9cXC8uKig/PTxcXC9zY3JpcHQ+KSIsCiAgICAgICAgbmV4dDogInRhZyIKICAgIH0sIHsKICAgICAgICB0b2tlbjogIm1ldGEudGFnIiwKICAgICAgICByZWdleDogIjxcXC8oPz1zY3JpcHQpIiwKICAgICAgICBuZXh0OiAidGFnIgogICAgfV0pOwogICAgCiAgICB0aGlzLmVtYmVkUnVsZXMoQ3NzSGlnaGxpZ2h0UnVsZXMsICJjc3MtIiwgW3sKICAgICAgICB0b2tlbjogIm1ldGEudGFnIiwKICAgICAgICByZWdleDogIjxcXC8oPz1zdHlsZSkiLAogICAgICAgIG5leHQ6ICJ0YWciCiAgICB9XSk7Cn07Cgpvb3AuaW5oZXJpdHMoQ29sZGZ1c2lvbkhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOwoKZXhwb3J0cy5Db2xkZnVzaW9uSGlnaGxpZ2h0UnVsZXMgPSBDb2xkZnVzaW9uSGlnaGxpZ2h0UnVsZXM7Cn0pOwo7CiAgICAgICAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAg]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-coldfusion.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9jb2xkZnVzaW9uIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS94bWwiLCJhY2UvbW9kZS9qYXZhc2NyaXB0IiwiYWNlL21vZGUvY3NzIiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL2NvbGRmdXNpb25faGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3htbCIpLk1vZGUsZj1hKCIuL2phdmFzY3JpcHQiKS5Nb2RlLGc9YSgiLi9jc3MiKS5Nb2RlLGg9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGk9YSgiLi9jb2xkZnVzaW9uX2hpZ2hsaWdodF9ydWxlcyIpLkNvbGRmdXNpb25IaWdobGlnaHRSdWxlcyxqPWZ1bmN0aW9uKCl7ZS5jYWxsKHRoaXMpO3ZhciBhPW5ldyBpO3RoaXMuJHRva2VuaXplcj1uZXcgaChhLmdldFJ1bGVzKCkpLHRoaXMuJGVtYmVkcz1hLmdldEVtYmVkcygpLHRoaXMuY3JlYXRlTW9kZURlbGVnYXRlcyh7ImpzLSI6ZiwiY3NzLSI6Z30pfTtkLmluaGVyaXRzKGosZSksZnVuY3Rpb24oKXt0aGlzLmdldE5leHRMaW5lSW5kZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy4kZ2V0SW5kZW50KGIpfX0uY2FsbChqLnByb3RvdHlwZSksYi5Nb2RlPWp9KSxkZWZpbmUoImFjZS9tb2RlL3htbCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dCIsImFjZS90b2tlbml6ZXIiLCJhY2UvbW9kZS94bWxfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvYmVoYXZpb3VyL3htbCIsImFjZS9tb2RlL2ZvbGRpbmcveG1sIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3RleHQiKS5Nb2RlLGY9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGc9YSgiLi94bWxfaGlnaGxpZ2h0X3J1bGVzIikuWG1sSGlnaGxpZ2h0UnVsZXMsaD1hKCIuL2JlaGF2aW91ci94bWwiKS5YbWxCZWhhdmlvdXIsaT1hKCIuL2ZvbGRpbmcveG1sIikuRm9sZE1vZGUsaj1mdW5jdGlvbigpe3RoaXMuJHRva2VuaXplcj1uZXcgZigobmV3IGcpLmdldFJ1bGVzKCkpLHRoaXMuJGJlaGF2aW91cj1uZXcgaCx0aGlzLmZvbGRpbmdSdWxlcz1uZXcgaX07ZC5pbmhlcml0cyhqLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuJGdldEluZGVudChiKX19LmNhbGwoai5wcm90b3R5cGUpLGIuTW9kZT1qfSksZGVmaW5lKCJhY2UvbW9kZS94bWxfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS94bWxfdXRpbCIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3htbF91dGlsIiksZj1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGc9ZnVuY3Rpb24oKXt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoidGV4dCIscmVnZXg6IjxcXCFcXFtDREFUQVxcWyIsbmV4dDoiY2RhdGEifSx7dG9rZW46InhtbF9wZSIscmVnZXg6IjxcXD8uKj9cXD8+In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiPFxcIS0tIixuZXh0OiJjb21tZW50In0se3Rva2VuOiJtZXRhLnRhZyIscmVnZXg6IjxcXC8/IixuZXh0OiJ0YWcifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiW148XSsifV0sY2RhdGE6W3t0b2tlbjoidGV4dCIscmVnZXg6IlxcXVxcXT4iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9LHt0b2tlbjoidGV4dCIscmVnZXg6Iig/OlteXFxdXXxcXF0oPyFcXF0+KSkrIn1dLGNvbW1lbnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qPy0tPiIsbmV4dDoic3RhcnQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX0sZS50YWcodGhpcy4kcnVsZXMsInRhZyIsInN0YXJ0Iil9O2QuaW5oZXJpdHMoZyxmKSxiLlhtbEhpZ2hsaWdodFJ1bGVzPWd9KSxkZWZpbmUoImFjZS9tb2RlL3htbF91dGlsIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9sYW5nIl0sZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGcoYSl7cmV0dXJuW3t0b2tlbjoic3RyaW5nIixyZWdleDonIi4qPyInfSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6J1siXS4qJyxuZXh0OmErIi1xcXN0cmluZyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiJy4qPycifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6IlsnXS4qIixuZXh0OmErIi1xc3RyaW5nIn1dfWZ1bmN0aW9uIGgoYSxiKXtyZXR1cm5be3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKj8iK2EsbmV4dDpifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfSJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvbGFuZyIpLGU9ZC5hcnJheVRvTWFwKCJidXR0b258Zm9ybXxpbnB1dHxsYWJlbHxzZWxlY3R8dGV4dGFyZWEiLnNwbGl0KCJ8IikpLGY9ZC5hcnJheVRvTWFwKCJ0YWJsZXx0Ym9keXx0ZHx0Zm9vdHx0aHx0ciIuc3BsaXQoInwiKSk7Yi50YWc9ZnVuY3Rpb24oYSxiLGMpe2FbYl09W3t0b2tlbjoidGV4dCIscmVnZXg6IlxccysifSx7dG9rZW46ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT0iYSI/Im1ldGEudGFnLmFuY2hvciI6YT09PSJpbWciPyJtZXRhLnRhZy5pbWFnZSI6YT09PSJzY3JpcHQiPyJtZXRhLnRhZy5zY3JpcHQiOmE9PT0ic3R5bGUiPyJtZXRhLnRhZy5zdHlsZSI6ZS5oYXNPd25Qcm9wZXJ0eShhLnRvTG93ZXJDYXNlKCkpPyJtZXRhLnRhZy5mb3JtIjpmLmhhc093blByb3BlcnR5KGEudG9Mb3dlckNhc2UoKSk/Im1ldGEudGFnLnRhYmxlIjoibWV0YS50YWcifSxtZXJnZTohMCxyZWdleDoiWy1fYS16QS1aMC05OiFdKyIsbmV4dDpiKyJlbWJlZC1hdHRyaWJ1dGUtbGlzdCJ9LHt0b2tlbjoiZW1wdHkiLHJlZ2V4OiIiLG5leHQ6YisiZW1iZWQtYXR0cmlidXRlLWxpc3QifV0sYVtiKyItcXN0cmluZyJdPWgoIiciLGIrImVtYmVkLWF0dHJpYnV0ZS1saXN0IiksYVtiKyItcXFzdHJpbmciXT1oKCciJyxiKyJlbWJlZC1hdHRyaWJ1dGUtbGlzdCIpLGFbYisiZW1iZWQtYXR0cmlidXRlLWxpc3QiXT1be3Rva2VuOiJtZXRhLnRhZyIsbWVyZ2U6ITAscmVnZXg6Ii8/PiIsbmV4dDpjfSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiI9In0se3Rva2VuOiJlbnRpdHkub3RoZXIuYXR0cmlidXRlLW5hbWUiLHJlZ2V4OiJbLV9hLXpBLVowLTk6XSsifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifV0uY29uY2F0KGcoYikpfX0pLGRlZmluZSgiYWNlL21vZGUvYmVoYXZpb3VyL3htbCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvYmVoYXZpb3VyIiwiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vYmVoYXZpb3VyIikuQmVoYXZpb3VyLGY9YSgiLi9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXIsZz1mdW5jdGlvbigpe3RoaXMuaW5oZXJpdChmLFsic3RyaW5nX2RxdW90ZXMiXSksdGhpcy5hZGQoImJyYWNrZXRzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSI8Iil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/ITE6e3RleHQ6Ijw+IixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSI+Iil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0iPiIpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX1lbHNlIGlmKGU9PSJcbiIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGs9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMik7aWYoaz09IjwvIil7dmFyIGw9dGhpcy4kZ2V0SW5kZW50KGQuZG9jLmdldExpbmUoaC5yb3cpKStkLmdldFRhYlN0cmluZygpLG09dGhpcy4kZ2V0SW5kZW50KGQuZG9jLmdldExpbmUoaC5yb3cpKTtyZXR1cm57dGV4dDoiXG4iK2wrIlxuIittLHNlbGVjdGlvbjpbMSxsLmxlbmd0aCwxLGwubGVuZ3RoXX19fX0pfTtkLmluaGVyaXRzKGcsZSksYi5YbWxCZWhhdmlvdXI9Z30pLGRlZmluZSgiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvYmVoYXZpb3VyIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXIsZj1mdW5jdGlvbigpe3RoaXMuYWRkKCJicmFjZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09InsiKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7cmV0dXJuIGchPT0iIj97dGV4dDoieyIrZysifSIsc2VsZWN0aW9uOiExfTp7dGV4dDoie30iLHNlbGVjdGlvbjpbMSwxXX19aWYoZT09In0iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSJ9Iil7dmFyIGs9ZC4kZmluZE9wZW5pbmdCcmFja2V0KCJ9Iix7Y29sdW1uOmguY29sdW1uKzEscm93Omgucm93fSk7aWYoayE9PW51bGwpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19ZWxzZSBpZihlPT0iXG4iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSJ9Iil7dmFyIGw9ZC5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6aC5yb3csY29sdW1uOmguY29sdW1uKzF9KTtpZighbClyZXR1cm4gbnVsbDt2YXIgbT10aGlzLmdldE5leHRMaW5lSW5kZW50KGEsaS5zdWJzdHJpbmcoMCxpLmxlbmd0aC0xKSxkLmdldFRhYlN0cmluZygpKSxuPXRoaXMuJGdldEluZGVudChkLmRvYy5nZXRMaW5lKGwucm93KSk7cmV0dXJue3RleHQ6IlxuIittKyJcbiIrbixzZWxlY3Rpb246WzEsbS5sZW5ndGgsMSxtLmxlbmd0aF19fX19KSx0aGlzLmFkZCgiYnJhY2VzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSJ7Iil7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLmVuZC5jb2x1bW4sZS5lbmQuY29sdW1uKzEpO2lmKGg9PSJ9IilyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KSx0aGlzLmFkZCgicGFyZW5zIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSIoIil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/e3RleHQ6IigiK2crIikiLHNlbGVjdGlvbjohMX06e3RleHQ6IigpIixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSIpIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0iKSIpe3ZhciBrPWQuJGZpbmRPcGVuaW5nQnJhY2tldCgiKSIse2NvbHVtbjpoLmNvbHVtbisxLHJvdzpoLnJvd30pO2lmKGshPT1udWxsKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJwYXJlbnMiLCJkZWxldGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1kLmRvYy5nZXRUZXh0UmFuZ2UoZSk7aWYoIWUuaXNNdWx0aUxpbmUoKSYmZj09IigiKXt2YXIgZz1kLmRvYy5nZXRMaW5lKGUuc3RhcnQucm93KSxoPWcuc3Vic3RyaW5nKGUuc3RhcnQuY29sdW1uKzEsZS5zdGFydC5jb2x1bW4rMik7aWYoaD09IikiKXJldHVybiBlLmVuZC5jb2x1bW4rKyxlfX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0nIicpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtpZihnIT09IiIpcmV0dXJue3RleHQ6JyInK2crJyInLHNlbGVjdGlvbjohMX07dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbi0xLGguY29sdW1uKTtpZihqPT0iXFwiKXJldHVybiBudWxsO3ZhciBrPWQuZ2V0VG9rZW5zKGYuc3RhcnQucm93LGYuc3RhcnQucm93KVswXS50b2tlbnMsbD0wLG0sbj0tMTtmb3IodmFyIG89MDtvPGsubGVuZ3RoO28rKyl7bT1rW29dLG0udHlwZT09InN0cmluZyI/bj0tMTpuPDAmJihuPW0udmFsdWUuaW5kZXhPZignIicpKTtpZihtLnZhbHVlLmxlbmd0aCtsPmYuc3RhcnQuY29sdW1uKWJyZWFrO2wrPWtbb10udmFsdWUubGVuZ3RofWlmKCFtfHxuPDAmJm0udHlwZSE9PSJjb21tZW50IiYmKG0udHlwZSE9PSJzdHJpbmcifHxmLnN0YXJ0LmNvbHVtbiE9PW0udmFsdWUubGVuZ3RoK2wtMSYmbS52YWx1ZS5sYXN0SW5kZXhPZignIicpPT09bS52YWx1ZS5sZW5ndGgtMSkpcmV0dXJue3RleHQ6JyIiJyxzZWxlY3Rpb246WzEsMV19O2lmKG0mJm0udHlwZT09PSJzdHJpbmciKXt2YXIgcD1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihwPT0nIicpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19fSksdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSciJyl7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbisxLGUuc3RhcnQuY29sdW1uKzIpO2lmKGg9PSciJylyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KX07ZC5pbmhlcml0cyhmLGUpLGIuQ3N0eWxlQmVoYXZpb3VyPWZ9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcveG1sIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvcmFuZ2UiLCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIsImFjZS90b2tlbl9pdGVyYXRvciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vLi4vbGliL2xhbmciKSxmPWEoIi4uLy4uL3JhbmdlIikuUmFuZ2UsZz1hKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlLGg9YSgiLi4vLi4vdG9rZW5faXRlcmF0b3IiKS5Ub2tlbkl0ZXJhdG9yLGk9Yi5Gb2xkTW9kZT1mdW5jdGlvbihhKXtnLmNhbGwodGhpcyksdGhpcy52b2lkRWxlbWVudHM9YXx8e319O2QuaW5oZXJpdHMoaSxnKSxmdW5jdGlvbigpe3RoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmUoYSxjKTtyZXR1cm4gZC5jbG9zaW5nP2I9PSJtYXJrYmVnaW5lbmQiPyJlbmQiOiIiOiFkLnRhZ05hbWV8fHRoaXMudm9pZEVsZW1lbnRzW2QudGFnTmFtZS50b0xvd2VyQ2FzZSgpXT8iIjpkLnNlbGZDbG9zaW5nPyIiOmQudmFsdWUuaW5kZXhPZigiLyIrZC50YWdOYW1lKSE9PS0xPyIiOiJzdGFydCJ9LHRoaXMuX2dldEZpcnN0VGFnSW5MaW5lPWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5nZXRUb2tlbnMoYixiKVswXS50b2tlbnMsZD0iIjtmb3IodmFyIGY9MDtmPGMubGVuZ3RoO2YrKyl7dmFyIGc9Y1tmXTtnLnR5cGUuaW5kZXhPZigibWV0YS50YWciKT09PTA/ZCs9Zy52YWx1ZTpkKz1lLnN0cmluZ1JlcGVhdCgiICIsZy52YWx1ZS5sZW5ndGgpfXJldHVybiB0aGlzLl9wYXJzZVRhZyhkKX0sdGhpcy50YWdSZT0vXihccyopKDw/KFwvPykoWy1fYS16QS1aMC05OiFdKilccyooXC8/KT4/KS8sdGhpcy5fcGFyc2VUYWc9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy50YWdSZS5leGVjKGEpLGM9dGhpcy50YWdSZS5sYXN0SW5kZXh8fDA7cmV0dXJuIHRoaXMudGFnUmUubGFzdEluZGV4PTAse3ZhbHVlOmEsbWF0Y2g6Yj9iWzJdOiIiLGNsb3Npbmc6Yj8hIWJbM106ITEsc2VsZkNsb3Npbmc6Yj8hIWJbNV18fGJbMl09PSIvPiI6ITEsdGFnTmFtZTpiP2JbNF06IiIsY29sdW1uOmJbMV0/YytiWzFdLmxlbmd0aDpjfX0sdGhpcy5fcmVhZFRhZ0ZvcndhcmQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRDdXJyZW50VG9rZW4oKTtpZighYilyZXR1cm4gbnVsbDt2YXIgYz0iIixkO2RvIGlmKGIudHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpPT09MCl7aWYoIWQpdmFyIGQ9e3JvdzphLmdldEN1cnJlbnRUb2tlblJvdygpLGNvbHVtbjphLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpfTtjKz1iLnZhbHVlO2lmKGMuaW5kZXhPZigiPiIpIT09LTEpe3ZhciBlPXRoaXMuX3BhcnNlVGFnKGMpO3JldHVybiBlLnN0YXJ0PWQsZS5lbmQ9e3JvdzphLmdldEN1cnJlbnRUb2tlblJvdygpLGNvbHVtbjphLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpK2IudmFsdWUubGVuZ3RofSxhLnN0ZXBGb3J3YXJkKCksZX19d2hpbGUoYj1hLnN0ZXBGb3J3YXJkKCkpO3JldHVybiBudWxsfSx0aGlzLl9yZWFkVGFnQmFja3dhcmQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRDdXJyZW50VG9rZW4oKTtpZighYilyZXR1cm4gbnVsbDt2YXIgYz0iIixkO2RvIGlmKGIudHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpPT09MCl7ZHx8KGQ9e3JvdzphLmdldEN1cnJlbnRUb2tlblJvdygpLGNvbHVtbjphLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpK2IudmFsdWUubGVuZ3RofSksYz1iLnZhbHVlK2M7aWYoYy5pbmRleE9mKCI8IikhPT0tMSl7dmFyIGU9dGhpcy5fcGFyc2VUYWcoYyk7cmV0dXJuIGUuZW5kPWQsZS5zdGFydD17cm93OmEuZ2V0Q3VycmVudFRva2VuUm93KCksY29sdW1uOmEuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCl9LGEuc3RlcEJhY2t3YXJkKCksZX19d2hpbGUoYj1hLnN0ZXBCYWNrd2FyZCgpKTtyZXR1cm4gbnVsbH0sdGhpcy5fcG9wPWZ1bmN0aW9uKGEsYil7d2hpbGUoYS5sZW5ndGgpe3ZhciBjPWFbYS5sZW5ndGgtMV07aWYoIWJ8fGMudGFnTmFtZT09Yi50YWdOYW1lKXJldHVybiBhLnBvcCgpO2lmKHRoaXMudm9pZEVsZW1lbnRzW2IudGFnTmFtZV0pcmV0dXJuO2lmKHRoaXMudm9pZEVsZW1lbnRzW2MudGFnTmFtZV0pe2EucG9wKCk7Y29udGludWV9cmV0dXJuIG51bGx9fSx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmUoYSxjKTtpZighZC5tYXRjaClyZXR1cm4gbnVsbDt2YXIgZT1kLmNsb3Npbmd8fGQuc2VsZkNsb3NpbmcsZz1bXSxpO2lmKCFlKXt2YXIgaj1uZXcgaChhLGMsZC5jb2x1bW4pLGs9e3JvdzpjLGNvbHVtbjpkLmNvbHVtbitkLnRhZ05hbWUubGVuZ3RoKzJ9O3doaWxlKGk9dGhpcy5fcmVhZFRhZ0ZvcndhcmQoaikpe2lmKGkuc2VsZkNsb3Npbmcpe2lmKCFnLmxlbmd0aClyZXR1cm4gaS5zdGFydC5jb2x1bW4rPWkudGFnTmFtZS5sZW5ndGgrMixpLmVuZC5jb2x1bW4tPTIsZi5mcm9tUG9pbnRzKGkuc3RhcnQsaS5lbmQpO2NvbnRpbnVlfWlmKGkuY2xvc2luZyl7dGhpcy5fcG9wKGcsaSk7aWYoZy5sZW5ndGg9PTApcmV0dXJuIGYuZnJvbVBvaW50cyhrLGkuc3RhcnQpfWVsc2UgZy5wdXNoKGkpfX1lbHNle3ZhciBqPW5ldyBoKGEsYyxkLmNvbHVtbitkLm1hdGNoLmxlbmd0aCksbD17cm93OmMsY29sdW1uOmQuY29sdW1ufTt3aGlsZShpPXRoaXMuX3JlYWRUYWdCYWNrd2FyZChqKSl7aWYoaS5zZWxmQ2xvc2luZyl7aWYoIWcubGVuZ3RoKXJldHVybiBpLnN0YXJ0LmNvbHVtbis9aS50YWdOYW1lLmxlbmd0aCsyLGkuZW5kLmNvbHVtbi09MixmLmZyb21Qb2ludHMoaS5zdGFydCxpLmVuZCk7Y29udGludWV9aWYoIWkuY2xvc2luZyl7dGhpcy5fcG9wKGcsaSk7aWYoZy5sZW5ndGg9PTApcmV0dXJuIGkuc3RhcnQuY29sdW1uKz1pLnRhZ05hbWUubGVuZ3RoKzIsZi5mcm9tUG9pbnRzKGkuc3RhcnQsbCl9ZWxzZSBnLnB1c2goaSl9fX19LmNhbGwoaS5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxlPWIuRm9sZE1vZGU9ZnVuY3Rpb24oKXt9OygoZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj1udWxsLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9bnVsbCx0aGlzLmdldEZvbGRXaWRnZXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKTtyZXR1cm4gdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChkKT8ic3RhcnQiOmI9PSJtYXJrYmVnaW5lbmQiJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QoZCk/ImVuZCI6IiJ9LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbnVsbH0sdGhpcy5pbmRlbnRhdGlvbkJsb2NrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZT0vXlxzKi8sZj1iLGc9YixoPWEuZ2V0TGluZShiKSxpPWN8fGgubGVuZ3RoLGo9aC5tYXRjaChlKVswXS5sZW5ndGgsaz1hLmdldExlbmd0aCgpO3doaWxlKCsrYjxrKXtoPWEuZ2V0TGluZShiKTt2YXIgbD1oLm1hdGNoKGUpWzBdLmxlbmd0aDtpZihsPT1oLmxlbmd0aCljb250aW51ZTtpZihsPD1qKWJyZWFrO2c9Yn1pZihnPmYpe3ZhciBtPWEuZ2V0TGluZShnKS5sZW5ndGg7cmV0dXJuIG5ldyBkKGYsaSxnLG0pfX0sdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrPWZ1bmN0aW9uKGEsYixjLGUpe3ZhciBmPXtyb3c6Yyxjb2x1bW46ZSsxfSxnPWEuJGZpbmRDbG9zaW5nQnJhY2tldChiLGYpO2lmKCFnKXJldHVybjt2YXIgaD1hLmZvbGRXaWRnZXRzW2cucm93XTtyZXR1cm4gaD09bnVsbCYmKGg9dGhpcy5nZXRGb2xkV2lkZ2V0KGEsZy5yb3cpKSxoPT0ic3RhcnQiJiYoZy5yb3ctLSxnLmNvbHVtbj1hLmdldExpbmUoZy5yb3cpLmxlbmd0aCksZC5mcm9tUG9pbnRzKGYsZyl9fSkpLmNhbGwoZS5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW9kZS9qYXZhc2NyaXB0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsImFjZS9yYW5nZSIsImFjZS93b3JrZXIvd29ya2VyX2NsaWVudCIsImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiKS5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMsaD1hKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudCxpPWEoIi4uL3JhbmdlIikuUmFuZ2Usaj1hKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudCxrPWEoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cixsPWEoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZSxtPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSksdGhpcy4kb3V0ZGVudD1uZXcgaCx0aGlzLiRiZWhhdmlvdXI9bmV3IGssdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGx9O2QuaW5oZXJpdHMobSxlKSxmdW5jdGlvbigpe3RoaXMudG9nZ2xlQ29tbWVudExpbmVzPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSEwLGY9L14oXHMqKVwvXC8vO2Zvcih2YXIgZz1jO2c8PWQ7ZysrKWlmKCFmLnRlc3QoYi5nZXRMaW5lKGcpKSl7ZT0hMTticmVha31pZihlKXt2YXIgaD1uZXcgaSgwLDAsMCwwKTtmb3IodmFyIGc9YztnPD1kO2crKyl7dmFyIGo9Yi5nZXRMaW5lKGcpLGs9ai5tYXRjaChmKTtoLnN0YXJ0LnJvdz1nLGguZW5kLnJvdz1nLGguZW5kLmNvbHVtbj1rWzBdLmxlbmd0aCxiLnJlcGxhY2UoaCxrWzFdKX19ZWxzZSBiLmluZGVudFJvd3MoYyxkLCIvLyIpfSx0aGlzLmdldE5leHRMaW5lSW5kZW50PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLiRnZXRJbmRlbnQoYiksZT10aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhiLGEpLGY9ZS50b2tlbnMsZz1lLnN0YXRlO2lmKGYubGVuZ3RoJiZmW2YubGVuZ3RoLTFdLnR5cGU9PSJjb21tZW50IilyZXR1cm4gZDtpZihhPT0ic3RhcnQifHxhPT0icmVnZXhfYWxsb3dlZCIpe3ZhciBoPWIubWF0Y2goL14uKig/OlxiY2FzZVxiLipcOnxbXHtcKFxbXSlccyokLyk7aCYmKGQrPWMpfWVsc2UgaWYoYT09ImRvYy1zdGFydCIpe2lmKGc9PSJzdGFydCJ8fGE9PSJyZWdleF9hbGxvd2VkIilyZXR1cm4iIjt2YXIgaD1iLm1hdGNoKC9eXHMqKFwvPylcKi8pO2gmJihoWzFdJiYoZCs9IiAiKSxkKz0iKiAiKX1yZXR1cm4gZH0sdGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChiLGMpfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGEsYixjKXt0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGIsYyl9LHRoaXMuY3JlYXRlV29ya2VyPWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBqKFsiYWNlIl0sIndvcmtlci1qYXZhc2NyaXB0LmpzIiwiYWNlL21vZGUvamF2YXNjcmlwdF93b3JrZXIiLCJKYXZhU2NyaXB0V29ya2VyIik7cmV0dXJuIGIuYXR0YWNoVG9Eb2N1bWVudChhLmdldERvY3VtZW50KCkpLGIub24oImpzbGludCIsZnVuY3Rpb24oYil7dmFyIGM9W107Zm9yKHZhciBkPTA7ZDxiLmRhdGEubGVuZ3RoO2QrKyl7dmFyIGU9Yi5kYXRhW2RdO2UmJmMucHVzaCh7cm93OmUubGluZS0xLGNvbHVtbjplLmNoYXJhY3Rlci0xLHRleHQ6ZS5yZWFzb24sdHlwZToid2FybmluZyIsbGludDplfSl9YS5zZXRBbm5vdGF0aW9ucyhjKX0pLGIub24oIm5hcmNpc3N1cyIsZnVuY3Rpb24oYil7YS5zZXRBbm5vdGF0aW9ucyhbYi5kYXRhXSl9KSxiLm9uKCJ0ZXJtaW5hdGUiLGZ1bmN0aW9uKCl7YS5jbGVhckFubm90YXRpb25zKCl9KSxifX0uY2FsbChtLnByb3RvdHlwZSksYi5Nb2RlPW19KSxkZWZpbmUoImFjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvdW5pY29kZSIsImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi4vdW5pY29kZSIpLGc9YSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsaD1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGk9ZnVuY3Rpb24oKXt2YXIgYT1lLmFycmF5VG9NYXAoIkFycmF5fEJvb2xlYW58RGF0ZXxGdW5jdGlvbnxJdGVyYXRvcnxOdW1iZXJ8T2JqZWN0fFJlZ0V4cHxTdHJpbmd8UHJveHl8TmFtZXNwYWNlfFFOYW1lfFhNTHxYTUxMaXN0fEFycmF5QnVmZmVyfEZsb2F0MzJBcnJheXxGbG9hdDY0QXJyYXl8SW50MTZBcnJheXxJbnQzMkFycmF5fEludDhBcnJheXxVaW50MTZBcnJheXxVaW50MzJBcnJheXxVaW50OEFycmF5fFVpbnQ4Q2xhbXBlZEFycmF5fEVycm9yfEV2YWxFcnJvcnxJbnRlcm5hbEVycm9yfFJhbmdlRXJyb3J8UmVmZXJlbmNlRXJyb3J8U3RvcEl0ZXJhdGlvbnxTeW50YXhFcnJvcnxUeXBlRXJyb3J8VVJJRXJyb3J8ZGVjb2RlVVJJfGRlY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZW5jb2RlVVJJQ29tcG9uZW50fGV2YWx8aXNGaW5pdGV8aXNOYU58cGFyc2VGbG9hdHxwYXJzZUludHxKU09OfE1hdGh8dGhpc3xhcmd1bWVudHN8cHJvdG90eXBlfHdpbmRvd3xkb2N1bWVudCIuc3BsaXQoInwiKSksYj1lLmFycmF5VG9NYXAoImJyZWFrfGNhc2V8Y2F0Y2h8Y29udGludWV8ZGVmYXVsdHxkZWxldGV8ZG98ZWxzZXxmaW5hbGx5fGZvcnxmdW5jdGlvbnxpZnxpbnxpbnN0YW5jZW9mfG5ld3xyZXR1cm58c3dpdGNofHRocm93fHRyeXx0eXBlb2Z8bGV0fHZhcnx3aGlsZXx3aXRofGNvbnN0fHlpZWxkfGltcG9ydHxnZXR8c2V0Ii5zcGxpdCgifCIpKSxjPSJjYXNlfGRvfGVsc2V8ZmluYWxseXxpbnxpbnN0YW5jZW9mfHJldHVybnx0aHJvd3x0cnl8dHlwZW9mfHlpZWxkIixkPWUuYXJyYXlUb01hcCgiX19wYXJlbnRfX3xfX2NvdW50X198ZXNjYXBlfHVuZXNjYXBlfHdpdGh8X19wcm90b19fIi5zcGxpdCgifCIpKSxoPWUuYXJyYXlUb01hcCgiY29uc3R8bGV0fHZhcnxmdW5jdGlvbiIuc3BsaXQoInwiKSksaT1lLmFycmF5VG9NYXAoIm51bGx8SW5maW5pdHl8TmFOfHVuZGVmaW5lZCIuc3BsaXQoInwiKSksaj1lLmFycmF5VG9NYXAoImNsYXNzfGVudW18ZXh0ZW5kc3xzdXBlcnxleHBvcnR8aW1wbGVtZW50c3xwcml2YXRlfHB1YmxpY3xpbnRlcmZhY2V8cGFja2FnZXxwcm90ZWN0ZWR8c3RhdGljIi5zcGxpdCgifCIpKSxrPSJbIitmLnBhY2thZ2VzLkwrIlxcJF9dWyIrZi5wYWNrYWdlcy5MK2YucGFja2FnZXMuTW4rZi5wYWNrYWdlcy5NYytmLnBhY2thZ2VzLk5kK2YucGFja2FnZXMuUGMrIlxcJF9dKlxcYiI7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJcXC9cXC8uKiQifSwobmV3IGcpLmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0Iikse3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwvXFwqIixuZXh0OiJjb21tZW50In0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OidbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJ30se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OidbIl0uKlxcXFwkJyxuZXh0OiJxcXN0cmluZyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiWyddLipcXFxcJCIsbmV4dDoicXN0cmluZyJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IjBbeFhdWzAtOWEtZkEtRl0rXFxiIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIifSx7dG9rZW46WyJrZXl3b3JkLmRlZmluaXRpb24iLCJ0ZXh0IiwiZW50aXR5Lm5hbWUuZnVuY3Rpb24iXSxyZWdleDoiKGZ1bmN0aW9uKShcXHMrKSgiK2srIikifSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLHJlZ2V4OiIoPzp0cnVlfGZhbHNlKVxcYiJ9LHt0b2tlbjoia2V5d29yZCIscmVnZXg6Iig/OiIrYysiKVxcYiIsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjpmdW5jdGlvbihjKXtyZXR1cm4gYS5oYXNPd25Qcm9wZXJ0eShjKT8idmFyaWFibGUubGFuZ3VhZ2UiOmQuaGFzT3duUHJvcGVydHkoYyk/ImludmFsaWQuZGVwcmVjYXRlZCI6aC5oYXNPd25Qcm9wZXJ0eShjKT8ia2V5d29yZC5kZWZpbml0aW9uIjpiLmhhc093blByb3BlcnR5KGMpPyJrZXl3b3JkIjppLmhhc093blByb3BlcnR5KGMpPyJjb25zdGFudC5sYW5ndWFnZSI6ai5oYXNPd25Qcm9wZXJ0eShjKT8iaW52YWxpZC5pbGxlZ2FsIjpjPT0iZGVidWdnZXIiPyJpbnZhbGlkLmRlcHJlY2F0ZWQiOiJpZGVudGlmaWVyIn0scmVnZXg6a30se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIixuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOiJwdW5jdHVhdGlvbi5vcGVyYXRvciIscmVnZXg6IlxcP3xcXDp8XFwsfFxcO3xcXC4iLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46InBhcmVuLmxwYXJlbiIscmVnZXg6IltbKHtdIixuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4OiJbXFxdKX1dIn0se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiXFwvPT8iLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJeIyEuKiQifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn1dLHJlZ2V4X2FsbG93ZWQ6W3t0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKiIsbmV4dDoiY29tbWVudF9yZWdleF9hbGxvd2VkIn0se3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwvXFwvLiokIn0se3Rva2VuOiJzdHJpbmcucmVnZXhwIixyZWdleDoiXFwvIixuZXh0OiJyZWdleCIsbWVyZ2U6ITB9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OiJzdGFydCJ9XSxyZWdleDpbe3Rva2VuOiJyZWdleHAua2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIixuZXh0OiJyZWdleCJ9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6Ii9cXHcqIixuZXh0OiJzdGFydCIsbWVyZ2U6ITB9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6IlteXFxcXC9cXFtdKyIsbmV4dDoicmVnZXgiLG1lcmdlOiEwfSx7dG9rZW46InN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIixyZWdleDoiXFxbIixuZXh0OiJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiLG1lcmdlOiEwfSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OiJzdGFydCJ9XSxyZWdleF9jaGFyYWN0ZXJfY2xhc3M6W3t0b2tlbjoicmVnZXhwLmtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsbmV4dDoicmVnZXhfY2hhcmFjdGVyX2NsYXNzIn0se3Rva2VuOiJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyIscmVnZXg6Il0iLG5leHQ6InJlZ2V4IixtZXJnZTohMH0se3Rva2VuOiJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyIscmVnZXg6IlteXFxcXFxcXV0rIixuZXh0OiJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiLG1lcmdlOiEwfSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OiJzdGFydCJ9XSxjb21tZW50X3JlZ2V4X2FsbG93ZWQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qP1xcKlxcLyIsbWVyZ2U6ITAsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLGNvbW1lbnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qP1xcKlxcLyIsbWVyZ2U6ITAsbmV4dDoic3RhcnQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxxcXN0cmluZzpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OicoPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/IicsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLHFzdHJpbmc6W3t0b2tlbjoic3RyaW5nIixyZWdleDoiKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqPyciLG5leHQ6InN0YXJ0In0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX0sdGhpcy5lbWJlZFJ1bGVzKGcsImRvYy0iLFsobmV3IGcpLmdldEVuZFJ1bGUoInN0YXJ0IildKX07ZC5pbmhlcml0cyhpLGgpLGIuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzPWl9KSxkZWZpbmUoImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsZj1mdW5jdGlvbigpe3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50LmRvYy50YWciLHJlZ2V4OiJAW1xcd1xcZF9dKyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlRPRE8ifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiW15AXFwqXSsifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiLiJ9XX19O2QuaW5oZXJpdHMoZixlKSxmdW5jdGlvbigpe3RoaXMuZ2V0U3RhcnRSdWxlPWZ1bmN0aW9uKGEpe3JldHVybnt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCooPz1cXCopIixuZXh0OmF9fSx0aGlzLmdldEVuZFJ1bGU9ZnVuY3Rpb24oYSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxcKlxcLyIsbmV4dDphfX19LmNhbGwoZi5wcm90b3R5cGUpLGIuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzPWZ9KSxkZWZpbmUoImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3JhbmdlIikuUmFuZ2UsZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuL15ccyskLy50ZXN0KGEpPy9eXHMqXH0vLnRlc3QoYik6ITF9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldExpbmUoYiksZT1jLm1hdGNoKC9eKFxzKlx9KS8pO2lmKCFlKXJldHVybiAwO3ZhciBmPWVbMV0ubGVuZ3RoLGc9YS5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6Yixjb2x1bW46Zn0pO2lmKCFnfHxnLnJvdz09YilyZXR1cm4gMDt2YXIgaD10aGlzLiRnZXRJbmRlbnQoYS5nZXRMaW5lKGcucm93KSk7YS5yZXBsYWNlKG5ldyBkKGIsMCxiLGYtMSksaCl9LHRoaXMuJGdldEluZGVudD1mdW5jdGlvbihhKXt2YXIgYj1hLm1hdGNoKC9eKFxzKykvKTtyZXR1cm4gYj9iWzFdOiIifX0pKS5jYWxsKGUucHJvdG90eXBlKSxiLk1hdGNoaW5nQnJhY2VPdXRkZW50PWV9KSxkZWZpbmUoImFjZS93b3JrZXIvd29ya2VyX2NsaWVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixmPWZ1bmN0aW9uKGIsZCxlLGYpe3RoaXMuY2hhbmdlTGlzdGVuZXI9dGhpcy5jaGFuZ2VMaXN0ZW5lci5iaW5kKHRoaXMpO2lmKGMucGFja2FnZWQpe3ZhciBnPXRoaXMuJGd1ZXNzQmFzZVBhdGgoKTt0aGlzLiR3b3JrZXI9bmV3IFdvcmtlcihnK2QpfWVsc2V7dmFyIGg9dGhpcy4kbm9ybWFsaXplUGF0aChhLm5hbWVUb1VybCgiYWNlL3dvcmtlci93b3JrZXIiLG51bGwsIl8iKSk7dGhpcy4kd29ya2VyPW5ldyBXb3JrZXIoaCk7dmFyIGk9e307Zm9yKHZhciBqPTA7ajxiLmxlbmd0aDtqKyspe3ZhciBrPWJbal0sbD10aGlzLiRub3JtYWxpemVQYXRoKGEubmFtZVRvVXJsKGssbnVsbCwiXyIpLnJlcGxhY2UoLy5qcyQvLCIiKSk7aVtrXT1sfX10aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2luaXQ6ITAsdGxuczppLG1vZHVsZTplLGNsYXNzbmFtZTpmfSksdGhpcy5jYWxsYmFja0lkPTEsdGhpcy5jYWxsYmFja3M9e307dmFyIG09dGhpczt0aGlzLiR3b3JrZXIub25lcnJvcj1mdW5jdGlvbihhKXt0aHJvdyB3aW5kb3cuY29uc29sZSYmY29uc29sZS5sb2cmJmNvbnNvbGUubG9nKGEpLGF9LHRoaXMuJHdvcmtlci5vbm1lc3NhZ2U9ZnVuY3Rpb24oYSl7dmFyIGI9YS5kYXRhO3N3aXRjaChiLnR5cGUpe2Nhc2UibG9nIjp3aW5kb3cuY29uc29sZSYmY29uc29sZS5sb2cmJmNvbnNvbGUubG9nKGIuZGF0YSk7YnJlYWs7Y2FzZSJldmVudCI6bS5fZW1pdChiLm5hbWUse2RhdGE6Yi5kYXRhfSk7YnJlYWs7Y2FzZSJjYWxsIjp2YXIgYz1tLmNhbGxiYWNrc1tiLmlkXTtjJiYoYyhiLmRhdGEpLGRlbGV0ZSBtLmNhbGxiYWNrc1tiLmlkXSl9fX07KChmdW5jdGlvbigpe2QuaW1wbGVtZW50KHRoaXMsZSksdGhpcy4kbm9ybWFsaXplUGF0aD1mdW5jdGlvbihhKXtyZXR1cm4gYT1hLnJlcGxhY2UoL15bYS16XSs6XC9cL1teXC9dK1wvLywiIiksYT1sb2NhdGlvbi5wcm90b2NvbCsiLy8iK2xvY2F0aW9uLmhvc3QrKGEuY2hhckF0KDApPT0iLyI/IiI6bG9jYXRpb24ucGF0aG5hbWUucmVwbGFjZSgvXC9bXlwvXSokLywiIikpKyIvIithLnJlcGxhY2UoL15bXC9dKy8sIiIpLGF9LHRoaXMuJGd1ZXNzQmFzZVBhdGg9ZnVuY3Rpb24oKXtpZihhLmFjZUJhc2VVcmwpcmV0dXJuIGEuYWNlQmFzZVVybDt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPWJbY10sZT1kLmdldEF0dHJpYnV0ZSgiZGF0YS1hY2UtYmFzZSIpO2lmKGUpcmV0dXJuIGUucmVwbGFjZSgvXC8qJC8sIi8iKTt2YXIgZj1kLnNyY3x8ZC5nZXRBdHRyaWJ1dGUoInNyYyIpO2lmKCFmKWNvbnRpbnVlO3ZhciBnPWYubWF0Y2goL14oPzooLipcLylhY2VcLmpzfCguKlwvKWFjZSgtdW5jb21wcmVzc2VkKT8oLW5vY29uZmxpY3QpP1wuanMpKD86XD98JCkvKTtpZihnKXJldHVybiBnWzFdfHxnWzJdfXJldHVybiIifSx0aGlzLnRlcm1pbmF0ZT1mdW5jdGlvbigpe3RoaXMuX2VtaXQoInRlcm1pbmF0ZSIse30pLHRoaXMuJHdvcmtlci50ZXJtaW5hdGUoKSx0aGlzLiR3b3JrZXI9bnVsbCx0aGlzLiRkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix0aGlzLmNoYW5nZUxpc3RlbmVyKSx0aGlzLiRkb2M9bnVsbH0sdGhpcy5zZW5kPWZ1bmN0aW9uKGEsYil7dGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtjb21tYW5kOmEsYXJnczpifSl9LHRoaXMuY2FsbD1mdW5jdGlvbihhLGIsYyl7aWYoYyl7dmFyIGQ9dGhpcy5jYWxsYmFja0lkKys7dGhpcy5jYWxsYmFja3NbZF09YyxiLnB1c2goZCl9dGhpcy5zZW5kKGEsYil9LHRoaXMuZW1pdD1mdW5jdGlvbihhLGIpe3RyeXt0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2V2ZW50OmEsZGF0YTp7ZGF0YTpiLmRhdGF9fSl9Y2F0Y2goYyl7fX0sdGhpcy5hdHRhY2hUb0RvY3VtZW50PWZ1bmN0aW9uKGEpe3RoaXMuJGRvYyYmdGhpcy50ZXJtaW5hdGUoKSx0aGlzLiRkb2M9YSx0aGlzLmNhbGwoInNldFZhbHVlIixbYS5nZXRWYWx1ZSgpXSksYS5vbigiY2hhbmdlIix0aGlzLmNoYW5nZUxpc3RlbmVyKX0sdGhpcy5jaGFuZ2VMaXN0ZW5lcj1mdW5jdGlvbihhKXthLnJhbmdlPXtzdGFydDphLmRhdGEucmFuZ2Uuc3RhcnQsZW5kOmEuZGF0YS5yYW5nZS5lbmR9LHRoaXMuZW1pdCgiY2hhbmdlIixhKX19KSkuY2FsbChmLnByb3RvdHlwZSksYi5Xb3JrZXJDbGllbnQ9Zn0pLGRlZmluZSgiYWNlL21vZGUvZm9sZGluZy9jc3R5bGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9yYW5nZSIsImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGY9YSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZSxnPWIuRm9sZE1vZGU9ZnVuY3Rpb24oKXt9O2QuaW5oZXJpdHMoZyxmKSxmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPS8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9L15bXlxbXHtdKihcfXxcXSl8Xltcc1wqXSooXCpcLykvLHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmdldExpbmUoYyksZj1kLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTtpZihmKXt2YXIgZz1mLmluZGV4O2lmKGZbMV0pcmV0dXJuIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayhhLGZbMV0sYyxnKTt2YXIgaD1hLmdldENvbW1lbnRGb2xkUmFuZ2UoYyxnK2ZbMF0ubGVuZ3RoKTtyZXR1cm4gaC5lbmQuY29sdW1uLT0yLGh9aWYoYiE9PSJtYXJrYmVnaW5lbmQiKXJldHVybjt2YXIgZj1kLm1hdGNoKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIpO2lmKGYpe3ZhciBnPWYuaW5kZXgrZlswXS5sZW5ndGg7aWYoZlsyXSl7dmFyIGg9YS5nZXRDb21tZW50Rm9sZFJhbmdlKGMsZyk7cmV0dXJuIGguZW5kLmNvbHVtbi09MixofXZhciBpPXtyb3c6Yyxjb2x1bW46Z30saj1hLiRmaW5kT3BlbmluZ0JyYWNrZXQoZlsxXSxpKTtpZighailyZXR1cm47cmV0dXJuIGouY29sdW1uKyssaS5jb2x1bW4tLSxlLmZyb21Qb2ludHMoaixpKX19fS5jYWxsKGcucHJvdG90eXBlKX0pLGRlZmluZSgiYWNlL21vZGUvY3NzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL2Nzc19oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50IiwiYWNlL3dvcmtlci93b3JrZXJfY2xpZW50IiwiYWNlL21vZGUvZm9sZGluZy9jc3R5bGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dCIpLk1vZGUsZj1hKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXIsZz1hKCIuL2Nzc19oaWdobGlnaHRfcnVsZXMiKS5Dc3NIaWdobGlnaHRSdWxlcyxoPWEoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50LGk9YSgiLi4vd29ya2VyL3dvcmtlcl9jbGllbnQiKS5Xb3JrZXJDbGllbnQsaj1hKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGUsaz1mdW5jdGlvbigpe3RoaXMuJHRva2VuaXplcj1uZXcgZigobmV3IGcpLmdldFJ1bGVzKCksImkiKSx0aGlzLiRvdXRkZW50PW5ldyBoLHRoaXMuZm9sZGluZ1J1bGVzPW5ldyBqfTtkLmluaGVyaXRzKGssZSksZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdSdWxlcz0iY1N0eWxlIix0aGlzLmdldE5leHRMaW5lSW5kZW50PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLiRnZXRJbmRlbnQoYiksZT10aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhiLGEpLnRva2VucztpZihlLmxlbmd0aCYmZVtlLmxlbmd0aC0xXS50eXBlPT0iY29tbWVudCIpcmV0dXJuIGQ7dmFyIGY9Yi5tYXRjaCgvXi4qXHtccyokLyk7cmV0dXJuIGYmJihkKz1jKSxkfSx0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGIsYyl9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoYixjKX0sdGhpcy5jcmVhdGVXb3JrZXI9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IGkoWyJhY2UiXSwid29ya2VyLWNzcy5qcyIsImFjZS9tb2RlL2Nzc193b3JrZXIiLCJXb3JrZXIiKTtyZXR1cm4gYi5hdHRhY2hUb0RvY3VtZW50KGEuZ2V0RG9jdW1lbnQoKSksYi5vbigiY3NzbGludCIsZnVuY3Rpb24oYil7dmFyIGM9W107Yi5kYXRhLmZvckVhY2goZnVuY3Rpb24oYSl7Yy5wdXNoKHtyb3c6YS5saW5lLTEsY29sdW1uOmEuY29sLTEsdGV4dDphLm1lc3NhZ2UsdHlwZTphLnR5cGUsbGludDphfSl9KSxhLnNldEFubm90YXRpb25zKGMpfSksYn19LmNhbGwoay5wcm90b3R5cGUpLGIuTW9kZT1rfSksZGVmaW5lKCJhY2UvbW9kZS9jc3NfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi4vbGliL2xhbmciKSxmPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsZz1mdW5jdGlvbigpe3ZhciBhPWUuYXJyYXlUb01hcCgiLW1vei1hcHBlYXJhbmNlfC1tb3otYm94LXNpemluZ3wtd2Via2l0LWJveC1zaXppbmd8LW1vei1vdXRsaW5lLXJhZGl1c3wtbW96LXRyYW5zZm9ybXwtd2Via2l0LXRyYW5zZm9ybXxhcHBlYXJhbmNlfGF6aW11dGh8YmFja2dyb3VuZC1hdHRhY2htZW50fGJhY2tncm91bmQtY29sb3J8YmFja2dyb3VuZC1pbWFnZXxiYWNrZ3JvdW5kLW9yaWdpbnxiYWNrZ3JvdW5kLXBvc2l0aW9ufGJhY2tncm91bmQtcmVwZWF0fGJhY2tncm91bmR8Ym9yZGVyLWJvdHRvbS1jb2xvcnxib3JkZXItYm90dG9tLXN0eWxlfGJvcmRlci1ib3R0b20td2lkdGh8Ym9yZGVyLWJvdHRvbXxib3JkZXItY29sbGFwc2V8Ym9yZGVyLWNvbG9yfGJvcmRlci1sZWZ0LWNvbG9yfGJvcmRlci1sZWZ0LXN0eWxlfGJvcmRlci1sZWZ0LXdpZHRofGJvcmRlci1sZWZ0fGJvcmRlci1yaWdodC1jb2xvcnxib3JkZXItcmlnaHQtc3R5bGV8Ym9yZGVyLXJpZ2h0LXdpZHRofGJvcmRlci1yaWdodHxib3JkZXItc3BhY2luZ3xib3JkZXItc3R5bGV8Ym9yZGVyLXRvcC1jb2xvcnxib3JkZXItdG9wLXN0eWxlfGJvcmRlci10b3Atd2lkdGh8Ym9yZGVyLXRvcHxib3JkZXItd2lkdGh8Ym9yZGVyfGJvdHRvbXxib3gtc2l6aW5nfGNhcHRpb24tc2lkZXxjbGVhcnxjbGlwfGNvbG9yfGNvbnRlbnR8Y291bnRlci1pbmNyZW1lbnR8Y291bnRlci1yZXNldHxjdWUtYWZ0ZXJ8Y3VlLWJlZm9yZXxjdWV8Y3Vyc29yfGRpcmVjdGlvbnxkaXNwbGF5fGVsZXZhdGlvbnxlbXB0eS1jZWxsc3xmbG9hdHxmb250LWZhbWlseXxmb250LXNpemUtYWRqdXN0fGZvbnQtc2l6ZXxmb250LXN0cmV0Y2h8Zm9udC1zdHlsZXxmb250LXZhcmlhbnR8Zm9udC13ZWlnaHR8Zm9udHxoZWlnaHR8bGVmdHxsZXR0ZXItc3BhY2luZ3xsaW5lLWhlaWdodHxsaXN0LXN0eWxlLWltYWdlfGxpc3Qtc3R5bGUtcG9zaXRpb258bGlzdC1zdHlsZS10eXBlfGxpc3Qtc3R5bGV8bWFyZ2luLWJvdHRvbXxtYXJnaW4tbGVmdHxtYXJnaW4tcmlnaHR8bWFyZ2luLXRvcHxtYXJrZXItb2Zmc2V0fG1hcmdpbnxtYXJrc3xtYXgtaGVpZ2h0fG1heC13aWR0aHxtaW4taGVpZ2h0fG1pbi13aWR0aHwtbW96LWJvcmRlci1yYWRpdXN8b3BhY2l0eXxvcnBoYW5zfG91dGxpbmUtY29sb3J8b3V0bGluZS1vZmZzZXR8b3V0bGluZS1yYWRpdXN8b3V0bGluZS1zdHlsZXxvdXRsaW5lLXdpZHRofG91dGxpbmV8b3ZlcmZsb3d8b3ZlcmZsb3cteHxvdmVyZmxvdy15fHBhZGRpbmctYm90dG9tfHBhZGRpbmctbGVmdHxwYWRkaW5nLXJpZ2h0fHBhZGRpbmctdG9wfHBhZGRpbmd8cGFnZS1icmVhay1hZnRlcnxwYWdlLWJyZWFrLWJlZm9yZXxwYWdlLWJyZWFrLWluc2lkZXxwYWdlfHBhdXNlLWFmdGVyfHBhdXNlLWJlZm9yZXxwYXVzZXxwaXRjaC1yYW5nZXxwaXRjaHxwbGF5LWR1cmluZ3xwb2ludGVyLWV2ZW50c3xwb3NpdGlvbnxxdW90ZXN8cmVzaXplfHJpY2huZXNzfHJpZ2h0fHNpemV8c3BlYWstaGVhZGVyfHNwZWFrLW51bWVyYWx8c3BlYWstcHVuY3R1YXRpb258c3BlZWNoLXJhdGV8c3BlYWt8c3RyZXNzfHRhYmxlLWxheW91dHx0ZXh0LWFsaWdufHRleHQtZGVjb3JhdGlvbnx0ZXh0LWluZGVudHx0ZXh0LXNoYWRvd3x0ZXh0LXRyYW5zZm9ybXx0b3B8dHJhbnNmb3JtfHVuaWNvZGUtYmlkaXx2ZXJ0aWNhbC1hbGlnbnx2aXNpYmlsaXR5fHZvaWNlLWZhbWlseXx2b2x1bWV8d2hpdGUtc3BhY2V8d2lkb3dzfHdpZHRofHdvcmQtc3BhY2luZ3x6LWluZGV4Ii5zcGxpdCgifCIpKSxiPWUuYXJyYXlUb01hcCgicmdifHJnYmF8dXJsfGF0dHJ8Y291bnRlcnxjb3VudGVycyIuc3BsaXQoInwiKSksYz1lLmFycmF5VG9NYXAoImFic29sdXRlfGFsbC1zY3JvbGx8YWx3YXlzfGFybWVuaWFufGF1dG98YmFzZWxpbmV8YmVsb3d8YmlkaS1vdmVycmlkZXxibG9ja3xib2xkfGJvbGRlcnxib3JkZXItYm94fGJvdGh8Ym90dG9tfGJyZWFrLWFsbHxicmVhay13b3JkfGNhcGl0YWxpemV8Y2VudGVyfGNoYXJ8Y2lyY2xlfGNqay1pZGVvZ3JhcGhpY3xjb2wtcmVzaXplfGNvbGxhcHNlfGNvbnRlbnQtYm94fGNyb3NzaGFpcnxkYXNoZWR8ZGVjaW1hbC1sZWFkaW5nLXplcm98ZGVjaW1hbHxkZWZhdWx0fGRpc2FibGVkfGRpc2N8ZGlzdHJpYnV0ZS1hbGwtbGluZXN8ZGlzdHJpYnV0ZS1sZXR0ZXJ8ZGlzdHJpYnV0ZS1zcGFjZXxkaXN0cmlidXRlfGRvdHRlZHxkb3VibGV8ZS1yZXNpemV8ZWxsaXBzaXN8Zml4ZWR8Z2VvcmdpYW58Z3Jvb3ZlfGhhbmR8aGVicmV3fGhlbHB8aGlkZGVufGhpcmFnYW5hLWlyb2hhfGhpcmFnYW5hfGhvcml6b250YWx8aWRlb2dyYXBoLWFscGhhfGlkZW9ncmFwaC1udW1lcmljfGlkZW9ncmFwaC1wYXJlbnRoZXNpc3xpZGVvZ3JhcGgtc3BhY2V8aW5hY3RpdmV8aW5oZXJpdHxpbmxpbmUtYmxvY2t8aW5saW5lfGluc2V0fGluc2lkZXxpbnRlci1pZGVvZ3JhcGh8aW50ZXItd29yZHxpdGFsaWN8anVzdGlmeXxrYXRha2FuYS1pcm9oYXxrYXRha2FuYXxrZWVwLWFsbHxsZWZ0fGxpZ2h0ZXJ8bGluZS1lZGdlfGxpbmUtdGhyb3VnaHxsaW5lfGxpc3QtaXRlbXxsb29zZXxsb3dlci1hbHBoYXxsb3dlci1ncmVla3xsb3dlci1sYXRpbnxsb3dlci1yb21hbnxsb3dlcmNhc2V8bHItdGJ8bHRyfG1lZGl1bXxtaWRkbGV8bW92ZXxuLXJlc2l6ZXxuZS1yZXNpemV8bmV3c3BhcGVyfG5vLWRyb3B8bm8tcmVwZWF0fG53LXJlc2l6ZXxub25lfG5vcm1hbHxub3QtYWxsb3dlZHxub3dyYXB8b2JsaXF1ZXxvdXRzZXR8b3V0c2lkZXxvdmVybGluZXxwb2ludGVyfHByb2dyZXNzfHJlbGF0aXZlfHJlcGVhdC14fHJlcGVhdC15fHJlcGVhdHxyaWdodHxyaWRnZXxyb3ctcmVzaXplfHJ0bHxzLXJlc2l6ZXxzY3JvbGx8c2UtcmVzaXplfHNlcGFyYXRlfHNtYWxsLWNhcHN8c29saWR8c3F1YXJlfHN0YXRpY3xzdHJpY3R8c3VwZXJ8c3ctcmVzaXplfHRhYmxlLWZvb3Rlci1ncm91cHx0YWJsZS1oZWFkZXItZ3JvdXB8dGItcmx8dGV4dC1ib3R0b218dGV4dC10b3B8dGV4dHx0aGlja3x0aGlufHRvcHx0cmFuc3BhcmVudHx1bmRlcmxpbmV8dXBwZXItYWxwaGF8dXBwZXItbGF0aW58dXBwZXItcm9tYW58dXBwZXJjYXNlfHZlcnRpY2FsLWlkZW9ncmFwaGljfHZlcnRpY2FsLXRleHR8dmlzaWJsZXx3LXJlc2l6ZXx3YWl0fHdoaXRlc3BhY2V8emVybyIuc3BsaXQoInwiKSksZD1lLmFycmF5VG9NYXAoImFxdWF8YmxhY2t8Ymx1ZXxmdWNoc2lhfGdyYXl8Z3JlZW58bGltZXxtYXJvb258bmF2eXxvbGl2ZXxvcmFuZ2V8cHVycGxlfHJlZHxzaWx2ZXJ8dGVhbHx3aGl0ZXx5ZWxsb3ciLnNwbGl0KCJ8IikpLGY9IlxcLT8oPzooPzpbMC05XSspfCg/OlswLTldKlxcLlswLTldKykpIixnPVt7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCoiLG5leHQ6InJ1bGVzZXRfY29tbWVudCJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDonWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXSd9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6ZisiKD86ZW18ZXh8cHh8Y218bW18aW58cHR8cGN8ZGVnfHJhZHxncmFkfG1zfHN8aHp8a2h6fCUpIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiI1thLWYwLTldezZ9In0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiI1thLWYwLTldezN9In0se3Rva2VuOmZ1bmN0aW9uKGUpe3JldHVybiBhLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/InN1cHBvcnQudHlwZSI6Yi5oYXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpPyJzdXBwb3J0LmZ1bmN0aW9uIjpjLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/InN1cHBvcnQuY29uc3RhbnQiOmQuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT8ic3VwcG9ydC5jb25zdGFudC5jb2xvciI6InRleHQifSxyZWdleDoiXFwtP1thLXpBLVpfXVthLXpBLVowLTlfXFwtXSoifV0saD1lLmNvcHlBcnJheShnKTtoLnVuc2hpZnQoe3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4OiJcXH0iLG5leHQ6InN0YXJ0In0pO3ZhciBpPWUuY29weUFycmF5KGcpO2kudW5zaGlmdCh7dG9rZW46InBhcmVuLnJwYXJlbiIscmVnZXg6IlxcfSIsbmV4dDoibWVkaWEifSk7dmFyIGo9W3t0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLGs9ZS5jb3B5QXJyYXkoaik7ay51bnNoaWZ0KHt0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qP1xcKlxcLyIsbmV4dDoic3RhcnQifSk7dmFyIGw9ZS5jb3B5QXJyYXkoaik7bC51bnNoaWZ0KHt0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qP1xcKlxcLyIsbmV4dDoibWVkaWEifSk7dmFyIG09ZS5jb3B5QXJyYXkoaik7bS51bnNoaWZ0KHt0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qP1xcKlxcLyIsbmV4dDoicnVsZXNldCJ9KSx0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKiIsbmV4dDoiY29tbWVudCJ9LHt0b2tlbjoicGFyZW4ubHBhcmVuIixyZWdleDoiXFx7IixuZXh0OiJydWxlc2V0In0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJALio/eyIsbmV4dDoibWVkaWEifSx7dG9rZW46ImtleXdvcmQiLHJlZ2V4OiIjW2EtejAtOS1fXSsifSx7dG9rZW46InZhcmlhYmxlIixyZWdleDoiXFwuW2EtejAtOS1fXSsifSx7dG9rZW46InN0cmluZyIscmVnZXg6IjpbYS16MC05LV9dKyJ9LHt0b2tlbjoiY29uc3RhbnQiLHJlZ2V4OiJbYS16MC05LV9dKyJ9XSxtZWRpYTpbe3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwvXFwqIixuZXh0OiJtZWRpYV9jb21tZW50In0se3Rva2VuOiJwYXJlbi5scGFyZW4iLHJlZ2V4OiJcXHsiLG5leHQ6Im1lZGlhX3J1bGVzZXQifSx7dG9rZW46InN0cmluZyIscmVnZXg6IlxcfSIsbmV4dDoic3RhcnQifSx7dG9rZW46ImtleXdvcmQiLHJlZ2V4OiIjW2EtejAtOS1fXSsifSx7dG9rZW46InZhcmlhYmxlIixyZWdleDoiXFwuW2EtejAtOS1fXSsifSx7dG9rZW46InN0cmluZyIscmVnZXg6IjpbYS16MC05LV9dKyJ9LHt0b2tlbjoiY29uc3RhbnQiLHJlZ2V4OiJbYS16MC05LV9dKyJ9XSxjb21tZW50OmsscnVsZXNldDpoLHJ1bGVzZXRfY29tbWVudDptLG1lZGlhX3J1bGVzZXQ6aSxtZWRpYV9jb21tZW50Omx9fTtkLmluaGVyaXRzKGcsZiksYi5Dc3NIaWdobGlnaHRSdWxlcz1nfSksZGVmaW5lKCJhY2UvbW9kZS9jb2xkZnVzaW9uX2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvY3NzX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS94bWxfdXRpbCJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi9jc3NfaGlnaGxpZ2h0X3J1bGVzIikuQ3NzSGlnaGxpZ2h0UnVsZXMsZj1hKCIuL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIikuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzLGc9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxoPWEoIi4veG1sX3V0aWwiKSxpPWZ1bmN0aW9uKCl7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46InRleHQiLG1lcmdlOiEwLHJlZ2V4OiI8XFwhXFxbQ0RBVEFcXFsiLG5leHQ6ImNkYXRhIn0se3Rva2VuOiJ4bWxfcGUiLHJlZ2V4OiI8XFw/Lio/XFw/PiJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IjxcXCEtLSIsbmV4dDoiY29tbWVudCJ9LHt0b2tlbjoibWV0YS50YWciLHJlZ2V4OiI8KD89cypzY3JpcHQpIixuZXh0OiJzY3JpcHQifSx7dG9rZW46Im1ldGEudGFnIixyZWdleDoiPCg/PXMqc3R5bGUpIixuZXh0OiJjc3MifSx7dG9rZW46Im1ldGEudGFnIixyZWdleDoiPFxcLz8iLG5leHQ6InRhZyJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifSx7dG9rZW46InRleHQiLHJlZ2V4OiJbXjxdKyJ9XSxjZGF0YTpbe3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxdXFxdPiIsbmV4dDoic3RhcnQifSx7dG9rZW46InRleHQiLG1lcmdlOiEwLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJ0ZXh0IixtZXJnZTohMCxyZWdleDoiLisifV0sY29tbWVudDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/LS0+IixuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfSxoLnRhZyh0aGlzLiRydWxlcywidGFnIiwic3RhcnQiKSxoLnRhZyh0aGlzLiRydWxlcywiY3NzIiwiY3NzLXN0YXJ0IiksaC50YWcodGhpcy4kcnVsZXMsInNjcmlwdCIsImpzLXN0YXJ0IiksdGhpcy5lbWJlZFJ1bGVzKGYsImpzLSIsW3t0b2tlbjoiY29tbWVudCIscmVnZXg6IlxcL1xcLy4qKD89PFxcL3NjcmlwdD4pIixuZXh0OiJ0YWcifSx7dG9rZW46Im1ldGEudGFnIixyZWdleDoiPFxcLyg/PXNjcmlwdCkiLG5leHQ6InRhZyJ9XSksdGhpcy5lbWJlZFJ1bGVzKGUsImNzcy0iLFt7dG9rZW46Im1ldGEudGFnIixyZWdleDoiPFxcLyg/PXN0eWxlKSIsbmV4dDoidGFnIn1dKX07ZC5pbmhlcml0cyhpLGcpLGIuQ29sZGZ1c2lvbkhpZ2hsaWdodFJ1bGVzPWl9KSxmdW5jdGlvbigpe3dpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLGZ1bmN0aW9uKGEpe3dpbmRvdy5hY2V8fCh3aW5kb3cuYWNlPXt9KTtmb3IodmFyIGIgaW4gYSlhLmhhc093blByb3BlcnR5KGIpJiYoYWNlW2JdPWFbYl0pfSl9KCk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-csharp-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCdhY2UvbW9kZS9jc2hhcnAnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHQnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS9jc2hhcnBfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCAnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZScsICdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsKdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsKdmFyIENTaGFycEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9jc2hhcnBfaGlnaGxpZ2h0X3J1bGVzIikuQ1NoYXJwSGlnaGxpZ2h0UnVsZXM7CnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Owp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gcmVxdWlyZSgiLi9iZWhhdmlvdXIvY3N0eWxlIikuQ3N0eWxlQmVoYXZpb3VyOwp2YXIgQ1N0eWxlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGU7Cgp2YXIgTW9kZSA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgQ1NoYXJwSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsKICAgIHRoaXMuJG91dGRlbnQgPSBuZXcgTWF0Y2hpbmdCcmFjZU91dGRlbnQoKTsKICAgIHRoaXMuJGJlaGF2aW91ciA9IG5ldyBDc3R5bGVCZWhhdmlvdXIoKTsKICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IENTdHlsZUZvbGRNb2RlKCk7Cn07Cm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7CgooZnVuY3Rpb24oKSB7CiAgICAKICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7CiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsKICAKICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsKICAgICAgICB2YXIgdG9rZW5zID0gdG9rZW5pemVkTGluZS50b2tlbnM7CiAgCiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggJiYgdG9rZW5zW3Rva2Vucy5sZW5ndGgtMV0udHlwZSA9PSAiY29tbWVudCIpIHsKICAgICAgICAgICAgcmV0dXJuIGluZGVudDsKICAgICAgICB9CiAgICAKICAgICAgICBpZiAoc3RhdGUgPT0gInN0YXJ0IikgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eLipbXHtcKFxbXVxzKiQvKTsKICAgICAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gdGFiOwogICAgICAgICAgICB9CiAgICAgICAgfQogIAogICAgICAgIHJldHVybiBpbmRlbnQ7CiAgICB9OwoKICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsKICAgIH07CiAgCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgcm93KSB7CiAgICAgICAgdGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChkb2MsIHJvdyk7CiAgICB9OwoKCiAgICB0aGlzLmNyZWF0ZVdvcmtlciA9IGZ1bmN0aW9uKHNlc3Npb24pIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH07Cgp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsKCmV4cG9ydHMuTW9kZSA9IE1vZGU7Cn0pOwpkZWZpbmUoJ2FjZS9tb2RlL2NzaGFycF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsKdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIikuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzOwp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsKCnZhciBDU2hhcnBIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgewogICAgCiAgICB2YXIga2V5d29yZHMgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAoImFic3RyYWN0fGV2ZW50fG5ld3xzdHJ1Y3R8YXN8ZXhwbGljaXR8bnVsbHxzd2l0Y2h8YmFzZXxleHRlcm58b2JqZWN0fHRoaXN8Ym9vbHxmYWxzZXxvcGVyYXRvcnx0aHJvd3xicmVha3xmaW5hbGx5fG91dHx0cnVlfGJ5dGV8Zml4ZWR8b3ZlcnJpZGV8dHJ5fGNhc2V8ZmxvYXR8cGFyYW1zfHR5cGVvZnxjYXRjaHxmb3J8cHJpdmF0ZXx1aW50fGNoYXJ8Zm9yZWFjaHxwcm90ZWN0ZWR8dWxvbmd8Y2hlY2tlZHxnb3RvfHB1YmxpY3x1bmNoZWNrZWR8Y2xhc3N8aWZ8cmVhZG9ubHl8dW5zYWZlfGNvbnN0fGltcGxpY2l0fHJlZnx1c2hvcnR8Y29udGludWV8aW58cmV0dXJufHVzaW5nfGRlY2ltYWx8aW50fHNieXRlfHZpcnR1YWx8ZGVmYXVsdHxpbnRlcmZhY2V8c2VhbGVkfHZvbGF0aWxlfGRlbGVnYXRlfGludGVybmFsfHNob3J0fHZvaWR8ZG98aXN8c2l6ZW9mfHdoaWxlfGRvdWJsZXxsb2NrfHN0YWNrYWxsb2N8ZWxzZXxsb25nfHN0YXRpY3xlbnVtfG5hbWVzcGFjZXxzdHJpbmd8dmFyfGR5bmFtaWMiKS5zcGxpdCgifCIpCiAgICApOwoKICAgIHZhciBidWlsZGluQ29uc3RhbnRzID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgibnVsbHx0cnVlfGZhbHNlIikuc3BsaXQoInwiKQogICAgKTsKCgogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBVc2UgKD86KSBpbnN0ZWFkLgogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZAoKICAgIHRoaXMuJHJ1bGVzID0gewogICAgICAgICJzdGFydCIgOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwvLiokIgogICAgICAgICAgICB9LAogICAgICAgICAgICBuZXcgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzKCkuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIG5leHQgOiAiY29tbWVudCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nLnJlZ2V4cCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJbL10oPzooPzpcXFsoPzpcXFxcXXxbXlxcXV0pK1xcXSl8KD86XFxcXC98W15cXF0vXSkpKlsvXVxcdypcXHMqKD89WykuLDtdfCQpIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXScKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10iCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBoZXgKICAgICAgICAgICAgICAgIHJlZ2V4IDogIjBbeFhdWzAtOWEtZkEtRl0rXFxiIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5sYW5ndWFnZS5ib29sZWFuIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/OnRydWV8ZmFsc2UpXFxiIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09ICJ0aGlzIikKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS5sYW5ndWFnZSI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5d29yZHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWxkaW5Db25zdGFudHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImNvbnN0YW50Lmxhbmd1YWdlIjsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgLy8gVE9ETzogVW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBVbmljb2RlIGlkZW50aWZpZXJzCiAgICAgICAgICAgICAgICByZWdleCA6ICJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwdW5jdHVhdGlvbi5vcGVyYXRvciIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXD98XFw6fFxcLHxcXDt8XFwuIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5scGFyZW4iLAogICAgICAgICAgICAgICAgcmVnZXggOiAiW1soe10iCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJjb21tZW50IiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudAogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwKICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfTsKICAgIAogICAgdGhpcy5lbWJlZFJ1bGVzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgImRvYy0iLAogICAgICAgIFsgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldEVuZFJ1bGUoInN0YXJ0IikgXSk7Cn07Cgpvb3AuaW5oZXJpdHMoQ1NoYXJwSGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7CgpleHBvcnRzLkNTaGFycEhpZ2hsaWdodFJ1bGVzID0gQ1NoYXJwSGlnaGxpZ2h0UnVsZXM7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOwoKdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuJHJ1bGVzID0gewogICAgICAgICJzdGFydCIgOiBbIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MudGFnIiwKICAgICAgICAgICAgcmVnZXggOiAiQFtcXHdcXGRfXSsiIC8vIFRPRE86IGZpeCBlbWFpbCBhZGRyZXNzZXMKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICJcXHMrIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlRPRE8iCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiW15AXFwqXSsiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiLiIKICAgICAgICB9XQogICAgfTsKfTsKCm9vcC5pbmhlcml0cyhEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5nZXRTdGFydFJ1bGUgPSBmdW5jdGlvbihzdGFydCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gZG9jIGNvbW1lbnQKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICJcXC9cXCooPz1cXCopIiwKICAgICAgICAgICAgbmV4dCAgOiBzdGFydAogICAgICAgIH07CiAgICB9OwogICAgCiAgICB0aGlzLmdldEVuZFJ1bGUgPSBmdW5jdGlvbiAoc3RhcnQpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsIC8vIGNsb3NpbmcgY29tbWVudAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlxcKlxcLyIsCiAgICAgICAgICAgIG5leHQgIDogc3RhcnQKICAgICAgICB9OwogICAgfTsKCn0pLmNhbGwoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLnByb3RvdHlwZSk7CgpleHBvcnRzLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsKCn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsKCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IGZ1bmN0aW9uKCkge307CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihsaW5lLCBpbnB1dCkgewogICAgICAgIGlmICghIC9eXHMrJC8udGVzdChsaW5lKSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgICByZXR1cm4gL15ccypcfS8udGVzdChpbnB1dCk7CiAgICB9OwoKICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihkb2MsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocm93KTsKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKlx9KS8pOwoKICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDsKCiAgICAgICAgdmFyIGNvbHVtbiA9IG1hdGNoWzFdLmxlbmd0aDsKICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gZG9jLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn0pOwoKICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcyB8fCBvcGVuQnJhY2VQb3Mucm93ID09IHJvdykgcmV0dXJuIDA7CgogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOwogICAgICAgIGRvYy5yZXBsYWNlKG5ldyBSYW5nZShyb3csIDAsIHJvdywgY29sdW1uLTEpLCBpbmRlbnQpOwogICAgfTsKCiAgICB0aGlzLiRnZXRJbmRlbnQgPSBmdW5jdGlvbihsaW5lKSB7CiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAiIjsKICAgIH07Cgp9KS5jYWxsKE1hdGNoaW5nQnJhY2VPdXRkZW50LnByb3RvdHlwZSk7CgpleHBvcnRzLk1hdGNoaW5nQnJhY2VPdXRkZW50ID0gTWF0Y2hpbmdCcmFjZU91dGRlbnQ7Cn0pOwovKiB2aW06dHM9NDpzdHM9NDpzdz00OgogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIENocmlzIFNwZW5jZXIgPGNocmlzLmFnLnNwZW5jZXIgQVQgZ29vZ2xlbWFpbCBET1QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9iZWhhdmlvdXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7CnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCcuLi9iZWhhdmlvdXInKS5CZWhhdmlvdXI7Cgp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gZnVuY3Rpb24gKCkgewoKICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgewogICAgICAgIGlmICh0ZXh0ID09ICd7JykgewogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7CiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7JyArIHNlbGVjdGVkICsgJ30nLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3t9JywKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICd9JykgewogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsKICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsKICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsKICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnfScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsKICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAiXG4iKSB7CiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9JykgewogICAgICAgICAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IHNlc3Npb24uZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiBjdXJzb3Iucm93LCBjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxfSk7CiAgICAgICAgICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcykKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CgogICAgICAgICAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQoc3RhdGUsIGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUubGVuZ3RoIC0gMSksIHNlc3Npb24uZ2V0VGFiU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgdmFyIG5leHRfaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOwoKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xuJyArIGluZGVudCArICdcbicgKyBuZXh0X2luZGVudCwKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCBpbmRlbnQubGVuZ3RoLCAxLCBpbmRlbnQubGVuZ3RoXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoImJyYWNlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7CiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsKICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJ3snKSB7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2UuZW5kLmNvbHVtbiwgcmFuZ2UuZW5kLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9JykgewogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOwogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoInBhcmVucyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7CiAgICAgICAgaWYgKHRleHQgPT0gJygnKSB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7CiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygnICsgc2VsZWN0ZWQgKyAnKScsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCknLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJyknKSB7CiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgewogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCcpJywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOwogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoInBhcmVucyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7CiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsKICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJygnKSB7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgewogICAgICAgIGlmICh0ZXh0ID09ICciJykgewogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7CiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICciJyArIHNlbGVjdGVkICsgJyInLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsKICAgICAgICAgICAgICAgIHZhciBsZWZ0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4tMSwgY3Vyc29yLmNvbHVtbik7CgogICAgICAgICAgICAgICAgLy8gV2UncmUgZXNjYXBlZC4KICAgICAgICAgICAgICAgIGlmIChsZWZ0Q2hhciA9PSAnXFwnKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gRmluZCB3aGF0IHRva2VuIHdlJ3JlIGluc2lkZS4KICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzZXNzaW9uLmdldFRva2VucyhzZWxlY3Rpb24uc3RhcnQucm93LCBzZWxlY3Rpb24uc3RhcnQucm93KVswXS50b2tlbnM7CiAgICAgICAgICAgICAgICB2YXIgY29sID0gMCwgdG9rZW47CiAgICAgICAgICAgICAgICB2YXIgcXVvdGVwb3MgPSAtMTsgLy8gVHJhY2sgd2hldGhlciB3ZSdyZSBpbnNpZGUgYW4gb3BlbiBxdW90ZS4KCiAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRva2Vucy5sZW5ndGg7IHgrKykgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW3hdOwogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IC0xOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocXVvdGVwb3MgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IHRva2VuLnZhbHVlLmluZGV4T2YoJyInKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0b2tlbi52YWx1ZS5sZW5ndGggKyBjb2wpID4gc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbikgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29sICs9IHRva2Vuc1t4XS52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gVHJ5IGFuZCBiZSBzbWFydCBhYm91dCB3aGVuIHdlIGF1dG8gaW5zZXJ0LgogICAgICAgICAgICAgICAgaWYgKCF0b2tlbiB8fCAocXVvdGVwb3MgPCAwICYmIHRva2VuLnR5cGUgIT09ICJjb21tZW50IiAmJiAodG9rZW4udHlwZSAhPT0gInN0cmluZyIgfHwgKChzZWxlY3Rpb24uc3RhcnQuY29sdW1uICE9PSB0b2tlbi52YWx1ZS5sZW5ndGgrY29sLTEpICYmIHRva2VuLnZhbHVlLmxhc3RJbmRleE9mKCciJykgPT09IHRva2VuLnZhbHVlLmxlbmd0aC0xKSkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJyIiJywKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwxXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gJiYgdG9rZW4udHlwZSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaW5wdXQgYW5kIG1vdmUgcmlnaHQgb25lIGlmIHdlJ3JlIHR5cGluZyBvdmVyIHRoZSBjbG9zaW5nIHF1b3RlLgogICAgICAgICAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7CiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsKICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJyInKSB7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCn0Kb29wLmluaGVyaXRzKENzdHlsZUJlaGF2aW91ciwgQmVoYXZpb3VyKTsKCmV4cG9ydHMuQ3N0eWxlQmVoYXZpb3VyID0gQ3N0eWxlQmVoYXZpb3VyOwp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7CnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7CnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOwoKdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307Cm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IC8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvOwogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IC9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLzsKICAgIAogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXg7CgogICAgICAgICAgICBpZiAobWF0Y2hbMV0pCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKHNlc3Npb24sIG1hdGNoWzFdLCByb3csIGkpOwoKICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSArIG1hdGNoWzBdLmxlbmd0aCk7CiAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsKICAgICAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGZvbGRTdHlsZSAhPT0gIm1hcmtiZWdpbmVuZCIpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDsKCiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkgewogICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSk7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiByb3csIGNvbHVtbjogaX07CiAgICAgICAgICAgIHZhciBzdGFydCA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldChtYXRjaFsxXSwgZW5kKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICghc3RhcnQpCiAgICAgICAgICAgICAgICByZXR1cm47CgogICAgICAgICAgICBzdGFydC5jb2x1bW4rKzsKICAgICAgICAgICAgZW5kLmNvbHVtbi0tOwoKICAgICAgICAgICAgcmV0dXJuICBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOwogICAgICAgIH0KICAgIH07CiAgICAKfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOwoKfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOwoKdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSBudWxsOwogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7CgogICAgLy8gbXVzdCByZXR1cm4gIiIgaWYgdGhlcmUncyBubyBmb2xkLCB0byBlbmFibGUgY2FjaGluZwogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsKICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOwogICAgICAgIGlmICh0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGxpbmUpKQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsKICAgICAgICBpZiAoZm9sZFN0eWxlID09ICJtYXJrYmVnaW5lbmQiCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpCiAgICAgICAgICAgIHJldHVybiAiZW5kIjsKICAgICAgICByZXR1cm4gIiI7CiAgICB9OwogICAgCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7CiAgICAgICAgdmFyIHJlID0gL15ccyovOwogICAgICAgIHZhciBzdGFydFJvdyA9IHJvdzsKICAgICAgICB2YXIgZW5kUm93ID0gcm93OwogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgdmFyIHN0YXJ0Q29sdW1uID0gY29sdW1uIHx8IGxpbmUubGVuZ3RoOwogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOwogICAgICAgIHZhciBtYXhSb3cgPSBzZXNzaW9uLmdldExlbmd0aCgpCiAgICAgICAgCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7CiAgICAgICAgICAgIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICAgICAgdmFyIGxldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOwoKICAgICAgICAgICAgaWYgKGxldmVsID09IGxpbmUubGVuZ3RoKQogICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICBpZiAobGV2ZWwgPD0gc3RhcnRMZXZlbCkKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgZW5kUm93ID0gcm93OwogICAgICAgIH0KCiAgICAgICAgaWYgKGVuZFJvdyA+IHN0YXJ0Um93KSB7CiAgICAgICAgICAgIHZhciBlbmRDb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kUm93KS5sZW5ndGg7CiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7CiAgICAgICAgfQogICAgfTsKCiAgICB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCBicmFja2V0LCByb3csIGNvbHVtbikgewogICAgICAgIHZhciBzdGFydCA9IHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW4gKyAxfTsKICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsKICAgICAgICBpZiAoIWVuZCkKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICB2YXIgZncgPSBzZXNzaW9uLmZvbGRXaWRnZXRzW2VuZC5yb3ddOwogICAgICAgIGlmIChmdyA9PSBudWxsKQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsKCiAgICAgICAgaWYgKGZ3ID09ICJzdGFydCIpIHsKICAgICAgICAgICAgZW5kLnJvdyAtLTsKICAgICAgICAgICAgZW5kLmNvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmQucm93KS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOwogICAgfTsKCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsKCn0pOwo7CiAgICAgICAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAg]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-csharp.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9jc2hhcnAiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvY3NoYXJwX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLCJhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlIiwiYWNlL21vZGUvZm9sZGluZy9jc3R5bGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dCIpLk1vZGUsZj1hKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXIsZz1hKCIuL2NzaGFycF9oaWdobGlnaHRfcnVsZXMiKS5DU2hhcnBIaWdobGlnaHRSdWxlcyxoPWEoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50LGk9YSgiLi9iZWhhdmlvdXIvY3N0eWxlIikuQ3N0eWxlQmVoYXZpb3VyLGo9YSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlLGs9ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbml6ZXI9bmV3IGYoKG5ldyBnKS5nZXRSdWxlcygpKSx0aGlzLiRvdXRkZW50PW5ldyBoLHRoaXMuJGJlaGF2aW91cj1uZXcgaSx0aGlzLmZvbGRpbmdSdWxlcz1uZXcgan07ZC5pbmhlcml0cyhrLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy4kZ2V0SW5kZW50KGIpLGU9dGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMoYixhKSxmPWUudG9rZW5zO2lmKGYubGVuZ3RoJiZmW2YubGVuZ3RoLTFdLnR5cGU9PSJjb21tZW50IilyZXR1cm4gZDtpZihhPT0ic3RhcnQiKXt2YXIgZz1iLm1hdGNoKC9eLipbXHtcKFxbXVxzKiQvKTtnJiYoZCs9Yyl9cmV0dXJuIGR9LHRoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQoYixjKX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7dGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChiLGMpfSx0aGlzLmNyZWF0ZVdvcmtlcj1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbH19LmNhbGwoay5wcm90b3R5cGUpLGIuTW9kZT1rfSksZGVmaW5lKCJhY2UvbW9kZS9jc2hhcnBfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi4vbGliL2xhbmciKSxmPWEoIi4vZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIikuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLGc9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxoPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKCJhYnN0cmFjdHxldmVudHxuZXd8c3RydWN0fGFzfGV4cGxpY2l0fG51bGx8c3dpdGNofGJhc2V8ZXh0ZXJufG9iamVjdHx0aGlzfGJvb2x8ZmFsc2V8b3BlcmF0b3J8dGhyb3d8YnJlYWt8ZmluYWxseXxvdXR8dHJ1ZXxieXRlfGZpeGVkfG92ZXJyaWRlfHRyeXxjYXNlfGZsb2F0fHBhcmFtc3x0eXBlb2Z8Y2F0Y2h8Zm9yfHByaXZhdGV8dWludHxjaGFyfGZvcmVhY2h8cHJvdGVjdGVkfHVsb25nfGNoZWNrZWR8Z290b3xwdWJsaWN8dW5jaGVja2VkfGNsYXNzfGlmfHJlYWRvbmx5fHVuc2FmZXxjb25zdHxpbXBsaWNpdHxyZWZ8dXNob3J0fGNvbnRpbnVlfGlufHJldHVybnx1c2luZ3xkZWNpbWFsfGludHxzYnl0ZXx2aXJ0dWFsfGRlZmF1bHR8aW50ZXJmYWNlfHNlYWxlZHx2b2xhdGlsZXxkZWxlZ2F0ZXxpbnRlcm5hbHxzaG9ydHx2b2lkfGRvfGlzfHNpemVvZnx3aGlsZXxkb3VibGV8bG9ja3xzdGFja2FsbG9jfGVsc2V8bG9uZ3xzdGF0aWN8ZW51bXxuYW1lc3BhY2V8c3RyaW5nfHZhcnxkeW5hbWljIi5zcGxpdCgifCIpKSxiPWUuYXJyYXlUb01hcCgibnVsbHx0cnVlfGZhbHNlIi5zcGxpdCgifCIpKTt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6IlxcL1xcLy4qJCJ9LChuZXcgZikuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJcXC9cXCoiLG1lcmdlOiEwLG5leHQ6ImNvbW1lbnQifSx7dG9rZW46InN0cmluZy5yZWdleHAiLHJlZ2V4OiJbL10oPzooPzpcXFsoPzpcXFxcXXxbXlxcXV0pK1xcXSl8KD86XFxcXC98W15cXF0vXSkpKlsvXVxcdypcXHMqKD89WykuLDtdfCQpIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OidbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJ30se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiMFt4WF1bMC05YS1mQS1GXStcXGIifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiJ9LHt0b2tlbjoiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiIscmVnZXg6Iig/OnRydWV8ZmFsc2UpXFxiIn0se3Rva2VuOmZ1bmN0aW9uKGMpe3JldHVybiBjPT0idGhpcyI/InZhcmlhYmxlLmxhbmd1YWdlIjphLmhhc093blByb3BlcnR5KGMpPyJrZXl3b3JkIjpiLmhhc093blByb3BlcnR5KGMpPyJjb25zdGFudC5sYW5ndWFnZSI6ImlkZW50aWZpZXIifSxyZWdleDoiW2EtekEtWl8kXVthLXpBLVowLTlfJF0qXFxiIn0se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIn0se3Rva2VuOiJwdW5jdHVhdGlvbi5vcGVyYXRvciIscmVnZXg6IlxcP3xcXDp8XFwsfFxcO3xcXC4ifSx7dG9rZW46InBhcmVuLmxwYXJlbiIscmVnZXg6IltbKHtdIn0se3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4OiJbXFxdKX1dIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9XSxjb21tZW50Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj9cXCpcXC8iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV19LHRoaXMuZW1iZWRSdWxlcyhmLCJkb2MtIixbKG5ldyBmKS5nZXRFbmRSdWxlKCJzdGFydCIpXSl9O2QuaW5oZXJpdHMoaCxnKSxiLkNTaGFycEhpZ2hsaWdodFJ1bGVzPWh9KSxkZWZpbmUoImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsZj1mdW5jdGlvbigpe3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50LmRvYy50YWciLHJlZ2V4OiJAW1xcd1xcZF9dKyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlRPRE8ifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiW15AXFwqXSsifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiLiJ9XX19O2QuaW5oZXJpdHMoZixlKSxmdW5jdGlvbigpe3RoaXMuZ2V0U3RhcnRSdWxlPWZ1bmN0aW9uKGEpe3JldHVybnt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCooPz1cXCopIixuZXh0OmF9fSx0aGlzLmdldEVuZFJ1bGU9ZnVuY3Rpb24oYSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxcKlxcLyIsbmV4dDphfX19LmNhbGwoZi5wcm90b3R5cGUpLGIuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzPWZ9KSxkZWZpbmUoImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3JhbmdlIikuUmFuZ2UsZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuL15ccyskLy50ZXN0KGEpPy9eXHMqXH0vLnRlc3QoYik6ITF9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldExpbmUoYiksZT1jLm1hdGNoKC9eKFxzKlx9KS8pO2lmKCFlKXJldHVybiAwO3ZhciBmPWVbMV0ubGVuZ3RoLGc9YS5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6Yixjb2x1bW46Zn0pO2lmKCFnfHxnLnJvdz09YilyZXR1cm4gMDt2YXIgaD10aGlzLiRnZXRJbmRlbnQoYS5nZXRMaW5lKGcucm93KSk7YS5yZXBsYWNlKG5ldyBkKGIsMCxiLGYtMSksaCl9LHRoaXMuJGdldEluZGVudD1mdW5jdGlvbihhKXt2YXIgYj1hLm1hdGNoKC9eKFxzKykvKTtyZXR1cm4gYj9iWzFdOiIifX0pKS5jYWxsKGUucHJvdG90eXBlKSxiLk1hdGNoaW5nQnJhY2VPdXRkZW50PWV9KSxkZWZpbmUoImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL2JlaGF2aW91ciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vYmVoYXZpb3VyIikuQmVoYXZpb3VyLGY9ZnVuY3Rpb24oKXt0aGlzLmFkZCgiYnJhY2VzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSJ7Iil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/e3RleHQ6InsiK2crIn0iLHNlbGVjdGlvbjohMX06e3RleHQ6Int9IixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSJ9Iil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0ifSIpe3ZhciBrPWQuJGZpbmRPcGVuaW5nQnJhY2tldCgifSIse2NvbHVtbjpoLmNvbHVtbisxLHJvdzpoLnJvd30pO2lmKGshPT1udWxsKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fWVsc2UgaWYoZT09IlxuIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0ifSIpe3ZhciBsPWQuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93Omgucm93LGNvbHVtbjpoLmNvbHVtbisxfSk7aWYoIWwpcmV0dXJuIG51bGw7dmFyIG09dGhpcy5nZXROZXh0TGluZUluZGVudChhLGkuc3Vic3RyaW5nKDAsaS5sZW5ndGgtMSksZC5nZXRUYWJTdHJpbmcoKSksbj10aGlzLiRnZXRJbmRlbnQoZC5kb2MuZ2V0TGluZShsLnJvdykpO3JldHVybnt0ZXh0OiJcbiIrbSsiXG4iK24sc2VsZWN0aW9uOlsxLG0ubGVuZ3RoLDEsbS5sZW5ndGhdfX19fSksdGhpcy5hZGQoImJyYWNlcyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0ieyIpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5lbmQuY29sdW1uLGUuZW5kLmNvbHVtbisxKTtpZihoPT0ifSIpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSksdGhpcy5hZGQoInBhcmVucyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0iKCIpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtyZXR1cm4gZyE9PSIiP3t0ZXh0OiIoIitnKyIpIixzZWxlY3Rpb246ITF9Ont0ZXh0OiIoKSIsc2VsZWN0aW9uOlsxLDFdfX1pZihlPT0iKSIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09IikiKXt2YXIgaz1kLiRmaW5kT3BlbmluZ0JyYWNrZXQoIikiLHtjb2x1bW46aC5jb2x1bW4rMSxyb3c6aC5yb3d9KTtpZihrIT09bnVsbClyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX19KSx0aGlzLmFkZCgicGFyZW5zIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSIoIil7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbisxLGUuc3RhcnQuY29sdW1uKzIpO2lmKGg9PSIpIilyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KSx0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09JyInKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7aWYoZyE9PSIiKXJldHVybnt0ZXh0OiciJytnKyciJyxzZWxlY3Rpb246ITF9O3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4tMSxoLmNvbHVtbik7aWYoaj09IlxcIilyZXR1cm4gbnVsbDt2YXIgaz1kLmdldFRva2VucyhmLnN0YXJ0LnJvdyxmLnN0YXJ0LnJvdylbMF0udG9rZW5zLGw9MCxtLG49LTE7Zm9yKHZhciBvPTA7bzxrLmxlbmd0aDtvKyspe209a1tvXSxtLnR5cGU9PSJzdHJpbmciP249LTE6bjwwJiYobj1tLnZhbHVlLmluZGV4T2YoJyInKSk7aWYobS52YWx1ZS5sZW5ndGgrbD5mLnN0YXJ0LmNvbHVtbilicmVhaztsKz1rW29dLnZhbHVlLmxlbmd0aH1pZighbXx8bjwwJiZtLnR5cGUhPT0iY29tbWVudCImJihtLnR5cGUhPT0ic3RyaW5nInx8Zi5zdGFydC5jb2x1bW4hPT1tLnZhbHVlLmxlbmd0aCtsLTEmJm0udmFsdWUubGFzdEluZGV4T2YoJyInKT09PW0udmFsdWUubGVuZ3RoLTEpKXJldHVybnt0ZXh0OiciIicsc2VsZWN0aW9uOlsxLDFdfTtpZihtJiZtLnR5cGU9PT0ic3RyaW5nIil7dmFyIHA9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYocD09JyInKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0nIicpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5zdGFydC5jb2x1bW4rMSxlLnN0YXJ0LmNvbHVtbisyKTtpZihoPT0nIicpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSl9O2QuaW5oZXJpdHMoZixlKSxiLkNzdHlsZUJlaGF2aW91cj1mfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL3JhbmdlIiwiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4uLy4uL3JhbmdlIikuUmFuZ2UsZj1hKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlLGc9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307ZC5pbmhlcml0cyhnLGYpLGZ1bmN0aW9uKCl7dGhpcy5mb2xkaW5nU3RhcnRNYXJrZXI9Lyhce3xcWylbXlx9XF1dKiR8XlxzKihcL1wqKS8sdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj0vXlteXFtce10qKFx9fFxdKXxeW1xzXCpdKihcKlwvKS8sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKSxmPWQubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpO2lmKGYpe3ZhciBnPWYuaW5kZXg7aWYoZlsxXSlyZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKGEsZlsxXSxjLGcpO3ZhciBoPWEuZ2V0Q29tbWVudEZvbGRSYW5nZShjLGcrZlswXS5sZW5ndGgpO3JldHVybiBoLmVuZC5jb2x1bW4tPTIsaH1pZihiIT09Im1hcmtiZWdpbmVuZCIpcmV0dXJuO3ZhciBmPWQubWF0Y2godGhpcy5mb2xkaW5nU3RvcE1hcmtlcik7aWYoZil7dmFyIGc9Zi5pbmRleCtmWzBdLmxlbmd0aDtpZihmWzJdKXt2YXIgaD1hLmdldENvbW1lbnRGb2xkUmFuZ2UoYyxnKTtyZXR1cm4gaC5lbmQuY29sdW1uLT0yLGh9dmFyIGk9e3JvdzpjLGNvbHVtbjpnfSxqPWEuJGZpbmRPcGVuaW5nQnJhY2tldChmWzFdLGkpO2lmKCFqKXJldHVybjtyZXR1cm4gai5jb2x1bW4rKyxpLmNvbHVtbi0tLGUuZnJvbVBvaW50cyhqLGkpfX19LmNhbGwoZy5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxlPWIuRm9sZE1vZGU9ZnVuY3Rpb24oKXt9OygoZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj1udWxsLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9bnVsbCx0aGlzLmdldEZvbGRXaWRnZXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKTtyZXR1cm4gdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChkKT8ic3RhcnQiOmI9PSJtYXJrYmVnaW5lbmQiJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QoZCk/ImVuZCI6IiJ9LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbnVsbH0sdGhpcy5pbmRlbnRhdGlvbkJsb2NrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZT0vXlxzKi8sZj1iLGc9YixoPWEuZ2V0TGluZShiKSxpPWN8fGgubGVuZ3RoLGo9aC5tYXRjaChlKVswXS5sZW5ndGgsaz1hLmdldExlbmd0aCgpO3doaWxlKCsrYjxrKXtoPWEuZ2V0TGluZShiKTt2YXIgbD1oLm1hdGNoKGUpWzBdLmxlbmd0aDtpZihsPT1oLmxlbmd0aCljb250aW51ZTtpZihsPD1qKWJyZWFrO2c9Yn1pZihnPmYpe3ZhciBtPWEuZ2V0TGluZShnKS5sZW5ndGg7cmV0dXJuIG5ldyBkKGYsaSxnLG0pfX0sdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrPWZ1bmN0aW9uKGEsYixjLGUpe3ZhciBmPXtyb3c6Yyxjb2x1bW46ZSsxfSxnPWEuJGZpbmRDbG9zaW5nQnJhY2tldChiLGYpO2lmKCFnKXJldHVybjt2YXIgaD1hLmZvbGRXaWRnZXRzW2cucm93XTtyZXR1cm4gaD09bnVsbCYmKGg9dGhpcy5nZXRGb2xkV2lkZ2V0KGEsZy5yb3cpKSxoPT0ic3RhcnQiJiYoZy5yb3ctLSxnLmNvbHVtbj1hLmdldExpbmUoZy5yb3cpLmxlbmd0aCksZC5mcm9tUG9pbnRzKGYsZyl9fSkpLmNhbGwoZS5wcm90b3R5cGUpfSksZnVuY3Rpb24oKXt3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSxmdW5jdGlvbihhKXt3aW5kb3cuYWNlfHwod2luZG93LmFjZT17fSk7Zm9yKHZhciBiIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShiKSYmKGFjZVtiXT1hW2JdKX0pfSgp]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-css-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9jc3MnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHQnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS9jc3NfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCAnYWNlL3dvcmtlci93b3JrZXJfY2xpZW50JywgJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOwp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOwp2YXIgQ3NzSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2Nzc19oaWdobGlnaHRfcnVsZXMiKS5Dc3NIaWdobGlnaHRSdWxlczsKdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gcmVxdWlyZSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQ7CnZhciBXb3JrZXJDbGllbnQgPSByZXF1aXJlKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudDsKdmFyIENTdHlsZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlOwoKdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IENzc0hpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSwgImkiKTsKICAgIHRoaXMuJG91dGRlbnQgPSBuZXcgTWF0Y2hpbmdCcmFjZU91dGRlbnQoKTsKICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IENTdHlsZUZvbGRNb2RlKCk7Cn07Cm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5mb2xkaW5nUnVsZXMgPSAiY1N0eWxlIjsKCiAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgewogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQobGluZSk7CgogICAgICAgIC8vIGlnbm9yZSBicmFjZXMgaW4gY29tbWVudHMKICAgICAgICB2YXIgdG9rZW5zID0gdGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMobGluZSwgc3RhdGUpLnRva2VuczsKICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXS50eXBlID09ICJjb21tZW50IikgewogICAgICAgICAgICByZXR1cm4gaW5kZW50OwogICAgICAgIH0KCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXi4qXHtccyokLyk7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIGluZGVudCArPSB0YWI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaW5kZW50OwogICAgfTsKCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCBpbnB1dCkgewogICAgICAgIHJldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChsaW5lLCBpbnB1dCk7CiAgICB9OwoKICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCByb3cpIHsKICAgICAgICB0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGRvYywgcm93KTsKICAgIH07CiAgICAKICAgIHRoaXMuY3JlYXRlV29ya2VyID0gZnVuY3Rpb24oc2Vzc2lvbikgewogICAgICAgIHZhciB3b3JrZXIgPSBuZXcgV29ya2VyQ2xpZW50KFsiYWNlIl0sICJ3b3JrZXItY3NzLmpzIiwgImFjZS9tb2RlL2Nzc193b3JrZXIiLCAiV29ya2VyIik7CiAgICAgICAgd29ya2VyLmF0dGFjaFRvRG9jdW1lbnQoc2Vzc2lvbi5nZXREb2N1bWVudCgpKTsKICAgICAgICAKICAgICAgICB3b3JrZXIub24oImNzc2xpbnQiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIHZhciBlcnJvcnMgPSBbXTsKICAgICAgICAgICAgZS5kYXRhLmZvckVhY2goZnVuY3Rpb24obWVzc2FnZSkgewogICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goewogICAgICAgICAgICAgICAgICAgIHJvdzogbWVzc2FnZS5saW5lIC0gMSwKICAgICAgICAgICAgICAgICAgICBjb2x1bW46IG1lc3NhZ2UuY29sIC0gMSwKICAgICAgICAgICAgICAgICAgICB0ZXh0OiBtZXNzYWdlLm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgdHlwZTogbWVzc2FnZS50eXBlLAogICAgICAgICAgICAgICAgICAgIGxpbnQ6IG1lc3NhZ2UKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHNlc3Npb24uc2V0QW5ub3RhdGlvbnMoZXJyb3JzKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gd29ya2VyOwogICAgfTsKCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOwoKZXhwb3J0cy5Nb2RlID0gTW9kZTsKCn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2Nzc19oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOwp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsKCnZhciBDc3NIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgewoKICAgIHZhciBwcm9wZXJ0aWVzID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgiLW1vei1hcHBlYXJhbmNlfC1tb3otYm94LXNpemluZ3wtd2Via2l0LWJveC1zaXppbmd8LW1vei1vdXRsaW5lLXJhZGl1c3wtbW96LXRyYW5zZm9ybXwtd2Via2l0LXRyYW5zZm9ybXwiICsKICAgICAgICAiYXBwZWFyYW5jZXxhemltdXRofGJhY2tncm91bmQtYXR0YWNobWVudHxiYWNrZ3JvdW5kLWNvbG9yfGJhY2tncm91bmQtaW1hZ2V8IiArCiAgICAgICAgImJhY2tncm91bmQtb3JpZ2lufGJhY2tncm91bmQtcG9zaXRpb258YmFja2dyb3VuZC1yZXBlYXR8YmFja2dyb3VuZHxib3JkZXItYm90dG9tLWNvbG9yfCIgKwogICAgICAgICJib3JkZXItYm90dG9tLXN0eWxlfGJvcmRlci1ib3R0b20td2lkdGh8Ym9yZGVyLWJvdHRvbXxib3JkZXItY29sbGFwc2V8IiArCiAgICAgICAgImJvcmRlci1jb2xvcnxib3JkZXItbGVmdC1jb2xvcnxib3JkZXItbGVmdC1zdHlsZXxib3JkZXItbGVmdC13aWR0aHwiICsKICAgICAgICAiYm9yZGVyLWxlZnR8Ym9yZGVyLXJpZ2h0LWNvbG9yfGJvcmRlci1yaWdodC1zdHlsZXxib3JkZXItcmlnaHQtd2lkdGh8IiArCiAgICAgICAgImJvcmRlci1yaWdodHxib3JkZXItc3BhY2luZ3xib3JkZXItc3R5bGV8Ym9yZGVyLXRvcC1jb2xvcnwiICsKICAgICAgICAiYm9yZGVyLXRvcC1zdHlsZXxib3JkZXItdG9wLXdpZHRofGJvcmRlci10b3B8Ym9yZGVyLXdpZHRofGJvcmRlcnwiICsKICAgICAgICAiYm90dG9tfGJveC1zaXppbmd8Y2FwdGlvbi1zaWRlfGNsZWFyfGNsaXB8Y29sb3J8Y29udGVudHxjb3VudGVyLWluY3JlbWVudHwiICsKICAgICAgICAiY291bnRlci1yZXNldHxjdWUtYWZ0ZXJ8Y3VlLWJlZm9yZXxjdWV8Y3Vyc29yfGRpcmVjdGlvbnxkaXNwbGF5fCIgKwogICAgICAgICJlbGV2YXRpb258ZW1wdHktY2VsbHN8ZmxvYXR8Zm9udC1mYW1pbHl8Zm9udC1zaXplLWFkanVzdHxmb250LXNpemV8IiArCiAgICAgICAgImZvbnQtc3RyZXRjaHxmb250LXN0eWxlfGZvbnQtdmFyaWFudHxmb250LXdlaWdodHxmb250fGhlaWdodHxsZWZ0fCIgKwogICAgICAgICJsZXR0ZXItc3BhY2luZ3xsaW5lLWhlaWdodHxsaXN0LXN0eWxlLWltYWdlfGxpc3Qtc3R5bGUtcG9zaXRpb258IiArCiAgICAgICAgImxpc3Qtc3R5bGUtdHlwZXxsaXN0LXN0eWxlfG1hcmdpbi1ib3R0b218bWFyZ2luLWxlZnR8bWFyZ2luLXJpZ2h0fCIgKwogICAgICAgICJtYXJnaW4tdG9wfG1hcmtlci1vZmZzZXR8bWFyZ2lufG1hcmtzfG1heC1oZWlnaHR8bWF4LXdpZHRofG1pbi1oZWlnaHR8IiArCiAgICAgICAgIm1pbi13aWR0aHwtbW96LWJvcmRlci1yYWRpdXN8b3BhY2l0eXxvcnBoYW5zfG91dGxpbmUtY29sb3J8b3V0bGluZS1vZmZzZXR8b3V0bGluZS1yYWRpdXN8IiArCiAgICAgICAgIm91dGxpbmUtc3R5bGV8b3V0bGluZS13aWR0aHxvdXRsaW5lfG92ZXJmbG93fG92ZXJmbG93LXh8b3ZlcmZsb3cteXxwYWRkaW5nLWJvdHRvbXwiICsKICAgICAgICAicGFkZGluZy1sZWZ0fHBhZGRpbmctcmlnaHR8cGFkZGluZy10b3B8cGFkZGluZ3xwYWdlLWJyZWFrLWFmdGVyfCIgKwogICAgICAgICJwYWdlLWJyZWFrLWJlZm9yZXxwYWdlLWJyZWFrLWluc2lkZXxwYWdlfHBhdXNlLWFmdGVyfHBhdXNlLWJlZm9yZXwiICsKICAgICAgICAicGF1c2V8cGl0Y2gtcmFuZ2V8cGl0Y2h8cGxheS1kdXJpbmd8cG9pbnRlci1ldmVudHN8cG9zaXRpb258cXVvdGVzfHJlc2l6ZXxyaWNobmVzc3xyaWdodHwiICsKICAgICAgICAic2l6ZXxzcGVhay1oZWFkZXJ8c3BlYWstbnVtZXJhbHxzcGVhay1wdW5jdHVhdGlvbnxzcGVlY2gtcmF0ZXxzcGVha3wiICsKICAgICAgICAic3RyZXNzfHRhYmxlLWxheW91dHx0ZXh0LWFsaWdufHRleHQtZGVjb3JhdGlvbnx0ZXh0LWluZGVudHwiICsKICAgICAgICAidGV4dC1zaGFkb3d8dGV4dC10cmFuc2Zvcm18dG9wfHRyYW5zZm9ybXx1bmljb2RlLWJpZGl8dmVydGljYWwtYWxpZ258IiArCiAgICAgICAgInZpc2liaWxpdHl8dm9pY2UtZmFtaWx5fHZvbHVtZXx3aGl0ZS1zcGFjZXx3aWRvd3N8d2lkdGh8d29yZC1zcGFjaW5nfCIgKwogICAgICAgICJ6LWluZGV4Iikuc3BsaXQoInwiKQogICAgKTsKCiAgICB2YXIgZnVuY3Rpb25zID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgicmdifHJnYmF8dXJsfGF0dHJ8Y291bnRlcnxjb3VudGVycyIpLnNwbGl0KCJ8IikKICAgICk7CgogICAgdmFyIGNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoImFic29sdXRlfGFsbC1zY3JvbGx8YWx3YXlzfGFybWVuaWFufGF1dG98YmFzZWxpbmV8YmVsb3d8YmlkaS1vdmVycmlkZXwiICsKICAgICAgICAiYmxvY2t8Ym9sZHxib2xkZXJ8Ym9yZGVyLWJveHxib3RofGJvdHRvbXxicmVhay1hbGx8YnJlYWstd29yZHxjYXBpdGFsaXplfGNlbnRlcnwiICsKICAgICAgICAiY2hhcnxjaXJjbGV8Y2prLWlkZW9ncmFwaGljfGNvbC1yZXNpemV8Y29sbGFwc2V8Y29udGVudC1ib3h8Y3Jvc3NoYWlyfGRhc2hlZHwiICsKICAgICAgICAiZGVjaW1hbC1sZWFkaW5nLXplcm98ZGVjaW1hbHxkZWZhdWx0fGRpc2FibGVkfGRpc2N8IiArCiAgICAgICAgImRpc3RyaWJ1dGUtYWxsLWxpbmVzfGRpc3RyaWJ1dGUtbGV0dGVyfGRpc3RyaWJ1dGUtc3BhY2V8IiArCiAgICAgICAgImRpc3RyaWJ1dGV8ZG90dGVkfGRvdWJsZXxlLXJlc2l6ZXxlbGxpcHNpc3xmaXhlZHxnZW9yZ2lhbnxncm9vdmV8IiArCiAgICAgICAgImhhbmR8aGVicmV3fGhlbHB8aGlkZGVufGhpcmFnYW5hLWlyb2hhfGhpcmFnYW5hfGhvcml6b250YWx8IiArCiAgICAgICAgImlkZW9ncmFwaC1hbHBoYXxpZGVvZ3JhcGgtbnVtZXJpY3xpZGVvZ3JhcGgtcGFyZW50aGVzaXN8IiArCiAgICAgICAgImlkZW9ncmFwaC1zcGFjZXxpbmFjdGl2ZXxpbmhlcml0fGlubGluZS1ibG9ja3xpbmxpbmV8aW5zZXR8aW5zaWRlfCIgKwogICAgICAgICJpbnRlci1pZGVvZ3JhcGh8aW50ZXItd29yZHxpdGFsaWN8anVzdGlmeXxrYXRha2FuYS1pcm9oYXxrYXRha2FuYXwiICsKICAgICAgICAia2VlcC1hbGx8bGVmdHxsaWdodGVyfGxpbmUtZWRnZXxsaW5lLXRocm91Z2h8bGluZXxsaXN0LWl0ZW18bG9vc2V8IiArCiAgICAgICAgImxvd2VyLWFscGhhfGxvd2VyLWdyZWVrfGxvd2VyLWxhdGlufGxvd2VyLXJvbWFufGxvd2VyY2FzZXxsci10YnxsdHJ8IiArCiAgICAgICAgIm1lZGl1bXxtaWRkbGV8bW92ZXxuLXJlc2l6ZXxuZS1yZXNpemV8bmV3c3BhcGVyfG5vLWRyb3B8bm8tcmVwZWF0fCIgKwogICAgICAgICJudy1yZXNpemV8bm9uZXxub3JtYWx8bm90LWFsbG93ZWR8bm93cmFwfG9ibGlxdWV8b3V0c2V0fG91dHNpZGV8IiArCiAgICAgICAgIm92ZXJsaW5lfHBvaW50ZXJ8cHJvZ3Jlc3N8cmVsYXRpdmV8cmVwZWF0LXh8cmVwZWF0LXl8cmVwZWF0fHJpZ2h0fCIgKwogICAgICAgICJyaWRnZXxyb3ctcmVzaXplfHJ0bHxzLXJlc2l6ZXxzY3JvbGx8c2UtcmVzaXplfHNlcGFyYXRlfHNtYWxsLWNhcHN8IiArCiAgICAgICAgInNvbGlkfHNxdWFyZXxzdGF0aWN8c3RyaWN0fHN1cGVyfHN3LXJlc2l6ZXx0YWJsZS1mb290ZXItZ3JvdXB8IiArCiAgICAgICAgInRhYmxlLWhlYWRlci1ncm91cHx0Yi1ybHx0ZXh0LWJvdHRvbXx0ZXh0LXRvcHx0ZXh0fHRoaWNrfHRoaW58dG9wfCIgKwogICAgICAgICJ0cmFuc3BhcmVudHx1bmRlcmxpbmV8dXBwZXItYWxwaGF8dXBwZXItbGF0aW58dXBwZXItcm9tYW58dXBwZXJjYXNlfCIgKwogICAgICAgICJ2ZXJ0aWNhbC1pZGVvZ3JhcGhpY3x2ZXJ0aWNhbC10ZXh0fHZpc2libGV8dy1yZXNpemV8d2FpdHx3aGl0ZXNwYWNlfCIgKwogICAgICAgICJ6ZXJvIikuc3BsaXQoInwiKQogICAgKTsKCiAgICB2YXIgY29sb3JzID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgiYXF1YXxibGFja3xibHVlfGZ1Y2hzaWF8Z3JheXxncmVlbnxsaW1lfG1hcm9vbnxuYXZ5fG9saXZlfG9yYW5nZXwiICsKICAgICAgICAicHVycGxlfHJlZHxzaWx2ZXJ8dGVhbHx3aGl0ZXx5ZWxsb3ciKS5zcGxpdCgifCIpCiAgICApOwoKICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcy4gVXNlICg/OikgaW5zdGVhZC4KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQKCiAgICB2YXIgbnVtUmUgPSAiXFwtPyg/Oig/OlswLTldKyl8KD86WzAtOV0qXFwuWzAtOV0rKSkiOwoKICAgIHZhciBiYXNlX3J1bGVzZXQgPSBbCiAgICAgICAgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50CiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwKICAgICAgICAgICAgbmV4dCA6ICJydWxlc2V0X2NvbW1lbnQiCiAgICAgICAgfSx7CiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lCiAgICAgICAgICAgIHJlZ2V4IDogJ1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQogICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsCiAgICAgICAgICAgIHJlZ2V4IDogbnVtUmUgKyAiKD86ZW18ZXh8cHh8Y218bW18aW58cHR8cGN8ZGVnfHJhZHxncmFkfG1zfHN8aHp8a2h6fCUpIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsICAvLyBoZXg2IGNvbG9yCiAgICAgICAgICAgIHJlZ2V4IDogIiNbYS1mMC05XXs2fSIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBoZXgzIGNvbG9yCiAgICAgICAgICAgIHJlZ2V4IDogIiNbYS1mMC05XXszfSIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LnR5cGUiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZnVuY3Rpb25zLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmZ1bmN0aW9uIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnN0YW50cy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZS50b0xvd2VyQ2FzZSgpKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5jb25zdGFudCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2xvcnMuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuY29uc3RhbnQuY29sb3IiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ0ZXh0IjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmVnZXggOiAiXFwtP1thLXpBLVpfXVthLXpBLVowLTlfXFwtXSoiCiAgICAgICAgfQogICAgICBdOwoKICAgIHZhciBydWxlc2V0ID0gbGFuZy5jb3B5QXJyYXkoYmFzZV9ydWxlc2V0KTsKICAgIHJ1bGVzZXQudW5zaGlmdCh7CiAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwKICAgICAgICByZWdleCA6ICJcXH0iLAogICAgICAgIG5leHQ6ICAgInN0YXJ0IgogICAgfSk7CgogICAgdmFyIG1lZGlhX3J1bGVzZXQgPSBsYW5nLmNvcHlBcnJheSggYmFzZV9ydWxlc2V0ICk7CiAgICBtZWRpYV9ydWxlc2V0LnVuc2hpZnQoewogICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsCiAgICAgICAgcmVnZXggOiAiXFx9IiwKICAgICAgICBuZXh0OiAgICJtZWRpYSIKICAgIH0pOwoKICAgIHZhciBiYXNlX2NvbW1lbnQgPSBbewogICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQogICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgcmVnZXggOiAiLisiCiAgICB9XTsKCiAgICB2YXIgY29tbWVudCA9IGxhbmcuY29weUFycmF5KGJhc2VfY29tbWVudCk7CiAgICBjb21tZW50LnVuc2hpZnQoewogICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudAogICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwKICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICB9KTsKCiAgICB2YXIgbWVkaWFfY29tbWVudCA9IGxhbmcuY29weUFycmF5KGJhc2VfY29tbWVudCk7CiAgICBtZWRpYV9jb21tZW50LnVuc2hpZnQoewogICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudAogICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwKICAgICAgICAgIG5leHQgOiAibWVkaWEiCiAgICB9KTsKCiAgICB2YXIgcnVsZXNldF9jb21tZW50ID0gbGFuZy5jb3B5QXJyYXkoYmFzZV9jb21tZW50KTsKICAgIHJ1bGVzZXRfY29tbWVudC51bnNoaWZ0KHsKICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQKICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsCiAgICAgICAgICBuZXh0IDogInJ1bGVzZXQiCiAgICB9KTsKCiAgICB0aGlzLiRydWxlcyA9IHsKICAgICAgICAic3RhcnQiIDogW3sKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsCiAgICAgICAgICAgIG5leHQgOiAiY29tbWVudCIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuOiAicGFyZW4ubHBhcmVuIiwKICAgICAgICAgICAgcmVnZXg6ICJcXHsiLAogICAgICAgICAgICBuZXh0OiAgInJ1bGVzZXQiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbjogInN0cmluZyIsCiAgICAgICAgICAgIHJlZ2V4OiAiQC4qP3siLAogICAgICAgICAgICBuZXh0OiAgIm1lZGlhIgogICAgICAgIH0sewogICAgICAgICAgICB0b2tlbjogImtleXdvcmQiLAogICAgICAgICAgICByZWdleDogIiNbYS16MC05LV9dKyIKICAgICAgICB9LHsKICAgICAgICAgICAgdG9rZW46ICJ2YXJpYWJsZSIsCiAgICAgICAgICAgIHJlZ2V4OiAiXFwuW2EtejAtOS1fXSsiCiAgICAgICAgfSx7CiAgICAgICAgICAgIHRva2VuOiAic3RyaW5nIiwKICAgICAgICAgICAgcmVnZXg6ICI6W2EtejAtOS1fXSsiCiAgICAgICAgfSx7CiAgICAgICAgICAgIHRva2VuOiAiY29uc3RhbnQiLAogICAgICAgICAgICByZWdleDogIlthLXowLTktX10rIgogICAgICAgIH1dLAoKICAgICAgICAibWVkaWEiIDogWyB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLAogICAgICAgICAgICBuZXh0IDogIm1lZGlhX2NvbW1lbnQiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbjogInBhcmVuLmxwYXJlbiIsCiAgICAgICAgICAgIHJlZ2V4OiAiXFx7IiwKICAgICAgICAgICAgbmV4dDogICJtZWRpYV9ydWxlc2V0IgogICAgICAgIH0sewogICAgICAgICAgICB0b2tlbjogInN0cmluZyIsCiAgICAgICAgICAgIHJlZ2V4OiAiXFx9IiwKICAgICAgICAgICAgbmV4dDogICJzdGFydCIKICAgICAgICB9LHsKICAgICAgICAgICAgdG9rZW46ICJrZXl3b3JkIiwKICAgICAgICAgICAgcmVnZXg6ICIjW2EtejAtOS1fXSsiCiAgICAgICAgfSx7CiAgICAgICAgICAgIHRva2VuOiAidmFyaWFibGUiLAogICAgICAgICAgICByZWdleDogIlxcLlthLXowLTktX10rIgogICAgICAgIH0sewogICAgICAgICAgICB0b2tlbjogInN0cmluZyIsCiAgICAgICAgICAgIHJlZ2V4OiAiOlthLXowLTktX10rIgogICAgICAgIH0sewogICAgICAgICAgICB0b2tlbjogImNvbnN0YW50IiwKICAgICAgICAgICAgcmVnZXg6ICJbYS16MC05LV9dKyIKICAgICAgICB9XSwKCiAgICAgICAgImNvbW1lbnQiIDogY29tbWVudCwKCiAgICAgICAgInJ1bGVzZXQiIDogcnVsZXNldCwKICAgICAgICAicnVsZXNldF9jb21tZW50IiA6IHJ1bGVzZXRfY29tbWVudCwKCiAgICAgICAgIm1lZGlhX3J1bGVzZXQiIDogbWVkaWFfcnVsZXNldCwKICAgICAgICAibWVkaWFfY29tbWVudCIgOiBtZWRpYV9jb21tZW50CiAgICB9Owp9OwoKb29wLmluaGVyaXRzKENzc0hpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOwoKZXhwb3J0cy5Dc3NIaWdobGlnaHRSdWxlcyA9IENzc0hpZ2hsaWdodFJ1bGVzOwoKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOwoKdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gZnVuY3Rpb24oKSB7fTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKGxpbmUsIGlucHV0KSB7CiAgICAgICAgaWYgKCEgL15ccyskLy50ZXN0KGxpbmUpKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgIHJldHVybiAvXlxzKlx9Ly50ZXN0KGlucHV0KTsKICAgIH07CgogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKGRvYywgcm93KSB7CiAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShyb3cpOwogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMqXH0pLyk7CgogICAgICAgIGlmICghbWF0Y2gpIHJldHVybiAwOwoKICAgICAgICB2YXIgY29sdW1uID0gbWF0Y2hbMV0ubGVuZ3RoOwogICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBkb2MuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiByb3csIGNvbHVtbjogY29sdW1ufSk7CgogICAgICAgIGlmICghb3BlbkJyYWNlUG9zIHx8IG9wZW5CcmFjZVBvcy5yb3cgPT0gcm93KSByZXR1cm4gMDsKCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChkb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7CiAgICAgICAgZG9jLnJlcGxhY2UobmV3IFJhbmdlKHJvdywgMCwgcm93LCBjb2x1bW4tMSksIGluZGVudCk7CiAgICB9OwoKICAgIHRoaXMuJGdldEluZGVudCA9IGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKykvKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICIiOwogICAgfTsKCn0pLmNhbGwoTWF0Y2hpbmdCcmFjZU91dGRlbnQucHJvdG90eXBlKTsKCmV4cG9ydHMuTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBNYXRjaGluZ0JyYWNlT3V0ZGVudDsKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL3dvcmtlci93b3JrZXJfY2xpZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2V2ZW50X2VtaXR0ZXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCIuLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsKCnZhciBXb3JrZXJDbGllbnQgPSBmdW5jdGlvbih0b3BMZXZlbE5hbWVzcGFjZXMsIHBhY2thZ2VkSnMsIG1vZCwgY2xhc3NuYW1lKSB7CgogICAgdGhpcy5jaGFuZ2VMaXN0ZW5lciA9IHRoaXMuY2hhbmdlTGlzdGVuZXIuYmluZCh0aGlzKTsKCiAgICBpZiAobW9kdWxlLnBhY2thZ2VkKSB7CiAgICAgICAgdmFyIGJhc2UgPSB0aGlzLiRndWVzc0Jhc2VQYXRoKCk7CiAgICAgICAgdGhpcy4kd29ya2VyID0gbmV3IFdvcmtlcihiYXNlICsgcGFja2FnZWRKcyk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICB2YXIgd29ya2VyVXJsID0gdGhpcy4kbm9ybWFsaXplUGF0aChyZXF1aXJlLm5hbWVUb1VybCgiYWNlL3dvcmtlci93b3JrZXIiLCBudWxsLCAiXyIpKTsKICAgICAgICB0aGlzLiR3b3JrZXIgPSBuZXcgV29ya2VyKHdvcmtlclVybCk7CgogICAgICAgIHZhciB0bG5zID0ge307CiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRvcExldmVsTmFtZXNwYWNlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgbnMgPSB0b3BMZXZlbE5hbWVzcGFjZXNbaV07CiAgICAgICAgICAgIHZhciBwYXRoID0gdGhpcy4kbm9ybWFsaXplUGF0aChyZXF1aXJlLm5hbWVUb1VybChucywgbnVsbCwgIl8iKS5yZXBsYWNlKC8uanMkLywgIiIpKTsKCiAgICAgICAgICAgIHRsbnNbbnNdID0gcGF0aDsKICAgICAgICB9CiAgICB9CgogICAgdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHsKICAgICAgICBpbml0IDogdHJ1ZSwKICAgICAgICB0bG5zOiB0bG5zLAogICAgICAgIG1vZHVsZTogbW9kLAogICAgICAgIGNsYXNzbmFtZTogY2xhc3NuYW1lCiAgICB9KTsKCiAgICB0aGlzLmNhbGxiYWNrSWQgPSAxOwogICAgdGhpcy5jYWxsYmFja3MgPSB7fTsKCiAgICB2YXIgX3NlbGYgPSB0aGlzOwogICAgdGhpcy4kd29ya2VyLm9uZXJyb3IgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgd2luZG93LmNvbnNvbGUgJiYgY29uc29sZS5sb2cgJiYgY29uc29sZS5sb2coZSk7CiAgICAgICAgdGhyb3cgZTsKICAgIH07CiAgICB0aGlzLiR3b3JrZXIub25tZXNzYWdlID0gZnVuY3Rpb24oZSkgewogICAgICAgIHZhciBtc2cgPSBlLmRhdGE7CiAgICAgICAgc3dpdGNoKG1zZy50eXBlKSB7CiAgICAgICAgICAgIGNhc2UgImxvZyI6CiAgICAgICAgICAgICAgICB3aW5kb3cuY29uc29sZSAmJiBjb25zb2xlLmxvZyAmJiBjb25zb2xlLmxvZyhtc2cuZGF0YSk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgImV2ZW50IjoKICAgICAgICAgICAgICAgIF9zZWxmLl9lbWl0KG1zZy5uYW1lLCB7ZGF0YTogbXNnLmRhdGF9KTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAiY2FsbCI6CiAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBfc2VsZi5jYWxsYmFja3NbbXNnLmlkXTsKICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1zZy5kYXRhKTsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgX3NlbGYuY2FsbGJhY2tzW21zZy5pZF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9Owp9OwoKKGZ1bmN0aW9uKCl7CgogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOwoKICAgIHRoaXMuJG5vcm1hbGl6ZVBhdGggPSBmdW5jdGlvbihwYXRoKSB7CiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXlthLXpdKzpcL1wvW15cL10rXC8vLCAiIik7IC8vIFJlbW92ZSBkb21haW4gbmFtZSBhbmQgcmVidWlsZCBpdAogICAgICAgIHBhdGggPSBsb2NhdGlvbi5wcm90b2NvbCArICIvLyIgKyBsb2NhdGlvbi5ob3N0CiAgICAgICAgICAgIC8vIHBhdGhzIHN0YXJ0aW5nIHdpdGggYSBzbGFzaCBhcmUgcmVsYXRpdmUgdG8gdGhlIHJvb3QgKGhvc3QpCiAgICAgICAgICAgICsgKHBhdGguY2hhckF0KDApID09ICIvIiA/ICIiIDogbG9jYXRpb24ucGF0aG5hbWUucmVwbGFjZSgvXC9bXlwvXSokLywgIiIpKQogICAgICAgICAgICArICIvIiArIHBhdGgucmVwbGFjZSgvXltcL10rLywgIiIpOwogICAgICAgIHJldHVybiBwYXRoOwogICAgfTsKCiAgICB0aGlzLiRndWVzc0Jhc2VQYXRoID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHJlcXVpcmUuYWNlQmFzZVVybCkKICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmUuYWNlQmFzZVVybDsKCiAgICAgICAgdmFyIHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7CiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHNjcmlwdHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIHNjcmlwdCA9IHNjcmlwdHNbaV07CgogICAgICAgICAgICB2YXIgYmFzZSA9IHNjcmlwdC5nZXRBdHRyaWJ1dGUoImRhdGEtYWNlLWJhc2UiKTsKICAgICAgICAgICAgaWYgKGJhc2UpCiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5yZXBsYWNlKC9cLyokLywgIi8iKTsKCiAgICAgICAgICAgIHZhciBzcmMgPSBzY3JpcHQuc3JjIHx8IHNjcmlwdC5nZXRBdHRyaWJ1dGUoInNyYyIpOwogICAgICAgICAgICBpZiAoIXNyYykgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIG0gPSBzcmMubWF0Y2goL14oPzooLipcLylhY2VcLmpzfCguKlwvKWFjZSgtdW5jb21wcmVzc2VkKT8oLW5vY29uZmxpY3QpP1wuanMpKD86XD98JCkvKTsKICAgICAgICAgICAgaWYgKG0pCiAgICAgICAgICAgICAgICByZXR1cm4gbVsxXSB8fCBtWzJdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gIiI7CiAgICB9OwoKICAgIHRoaXMudGVybWluYXRlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fZW1pdCgidGVybWluYXRlIiwge30pOwogICAgICAgIHRoaXMuJHdvcmtlci50ZXJtaW5hdGUoKTsKICAgICAgICB0aGlzLiR3b3JrZXIgPSBudWxsOwogICAgICAgIHRoaXMuJGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKICAgICAgICB0aGlzLiRkb2MgPSBudWxsOwogICAgfTsKCiAgICB0aGlzLnNlbmQgPSBmdW5jdGlvbihjbWQsIGFyZ3MpIHsKICAgICAgICB0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2NvbW1hbmQ6IGNtZCwgYXJnczogYXJnc30pOwogICAgfTsKCiAgICB0aGlzLmNhbGwgPSBmdW5jdGlvbihjbWQsIGFyZ3MsIGNhbGxiYWNrKSB7CiAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciBpZCA9IHRoaXMuY2FsbGJhY2tJZCsrOwogICAgICAgICAgICB0aGlzLmNhbGxiYWNrc1tpZF0gPSBjYWxsYmFjazsKICAgICAgICAgICAgYXJncy5wdXNoKGlkKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5zZW5kKGNtZCwgYXJncyk7CiAgICB9OwoKICAgIHRoaXMuZW1pdCA9IGZ1bmN0aW9uKGV2ZW50LCBkYXRhKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgLy8gZmlyZWZveCByZWZ1c2VzIHRvIGNsb25lIG9iamVjdHMgd2hpY2ggaGF2ZSBmdW5jdGlvbiBwcm9wZXJ0aWVzCiAgICAgICAgICAgIC8vIFRPRE86IGNsZWFudXAgZXZlbnQKICAgICAgICAgICAgdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtldmVudDogZXZlbnQsIGRhdGE6IHtkYXRhOiBkYXRhLmRhdGF9fSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoKGV4KSB7fQogICAgfTsKCiAgICB0aGlzLmF0dGFjaFRvRG9jdW1lbnQgPSBmdW5jdGlvbihkb2MpIHsKICAgICAgICBpZih0aGlzLiRkb2MpCiAgICAgICAgICAgIHRoaXMudGVybWluYXRlKCk7CgogICAgICAgIHRoaXMuJGRvYyA9IGRvYzsKICAgICAgICB0aGlzLmNhbGwoInNldFZhbHVlIiwgW2RvYy5nZXRWYWx1ZSgpXSk7CiAgICAgICAgZG9jLm9uKCJjaGFuZ2UiLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKICAgIH07CgogICAgdGhpcy5jaGFuZ2VMaXN0ZW5lciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICBlLnJhbmdlID0gewogICAgICAgICAgICBzdGFydDogZS5kYXRhLnJhbmdlLnN0YXJ0LAogICAgICAgICAgICBlbmQ6IGUuZGF0YS5yYW5nZS5lbmQKICAgICAgICB9OwogICAgICAgIHRoaXMuZW1pdCgiY2hhbmdlIiwgZSk7CiAgICB9OwoKfSkuY2FsbChXb3JrZXJDbGllbnQucHJvdG90eXBlKTsKCmV4cG9ydHMuV29ya2VyQ2xpZW50ID0gV29ya2VyQ2xpZW50OwoKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9yYW5nZScsICdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsKdmFyIEJhc2VGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGU7Cgp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsKb29wLmluaGVyaXRzKEZvbGRNb2RlLCBCYXNlRm9sZE1vZGUpOwoKKGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyID0gLyhce3xcWylbXlx9XF1dKiR8XlxzKihcL1wqKS87CiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gL15bXlxbXHtdKihcfXxcXSl8Xltcc1wqXSooXCpcLykvOwogICAgCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7CiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleDsKCiAgICAgICAgICAgIGlmIChtYXRjaFsxXSkKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soc2Vzc2lvbiwgbWF0Y2hbMV0sIHJvdywgaSk7CgogICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpICsgbWF0Y2hbMF0ubGVuZ3RoKTsKICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOwogICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoZm9sZFN0eWxlICE9PSAibWFya2JlZ2luZW5kIikKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIpOwogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoOwoKICAgICAgICAgICAgaWYgKG1hdGNoWzJdKSB7CiAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpKTsKICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsKICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGVuZCA9IHtyb3c6IHJvdywgY29sdW1uOiBpfTsKICAgICAgICAgICAgdmFyIHN0YXJ0ID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KG1hdGNoWzFdLCBlbmQpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKCFzdGFydCkKICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgICAgIHN0YXJ0LmNvbHVtbisrOwogICAgICAgICAgICBlbmQuY29sdW1uLS07CgogICAgICAgICAgICByZXR1cm4gIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7CiAgICAgICAgfQogICAgfTsKICAgIAp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7Cgp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7Cgp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG51bGw7CiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gbnVsbDsKCiAgICAvLyBtdXN0IHJldHVybiAiIiBpZiB0aGVyZSdzIG5vIGZvbGQsIHRvIGVuYWJsZSBjYWNoaW5nCiAgICB0aGlzLmdldEZvbGRXaWRnZXQgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgaWYgKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QobGluZSkpCiAgICAgICAgICAgIHJldHVybiAic3RhcnQiOwogICAgICAgIGlmIChmb2xkU3R5bGUgPT0gIm1hcmtiZWdpbmVuZCIKICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIKICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChsaW5lKSkKICAgICAgICAgICAgcmV0dXJuICJlbmQiOwogICAgICAgIHJldHVybiAiIjsKICAgIH07CiAgICAKICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH07CgogICAgdGhpcy5pbmRlbnRhdGlvbkJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgcm93LCBjb2x1bW4pIHsKICAgICAgICB2YXIgcmUgPSAvXlxzKi87CiAgICAgICAgdmFyIHN0YXJ0Um93ID0gcm93OwogICAgICAgIHZhciBlbmRSb3cgPSByb3c7CiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSBjb2x1bW4gfHwgbGluZS5sZW5ndGg7CiAgICAgICAgdmFyIHN0YXJ0TGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7CiAgICAgICAgdmFyIG1heFJvdyA9IHNlc3Npb24uZ2V0TGVuZ3RoKCkKICAgICAgICAKICAgICAgICB3aGlsZSAoKytyb3cgPCBtYXhSb3cpIHsKICAgICAgICAgICAgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOwogICAgICAgICAgICB2YXIgbGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7CgogICAgICAgICAgICBpZiAobGV2ZWwgPT0gbGluZS5sZW5ndGgpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgIGlmIChsZXZlbCA8PSBzdGFydExldmVsKQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBlbmRSb3cgPSByb3c7CiAgICAgICAgfQoKICAgICAgICBpZiAoZW5kUm93ID4gc3RhcnRSb3cpIHsKICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmRSb3cpLmxlbmd0aDsKICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShzdGFydFJvdywgc3RhcnRDb2x1bW4sIGVuZFJvdywgZW5kQ29sdW1uKTsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIGJyYWNrZXQsIHJvdywgY29sdW1uKSB7CiAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbiArIDF9OwogICAgICAgIHZhciBlbmQgPSBzZXNzaW9uLiRmaW5kQ2xvc2luZ0JyYWNrZXQoYnJhY2tldCwgc3RhcnQpOwogICAgICAgIGlmICghZW5kKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIHZhciBmdyA9IHNlc3Npb24uZm9sZFdpZGdldHNbZW5kLnJvd107CiAgICAgICAgaWYgKGZ3ID09IG51bGwpCiAgICAgICAgICAgIGZ3ID0gdGhpcy5nZXRGb2xkV2lkZ2V0KHNlc3Npb24sIGVuZC5yb3cpOwoKICAgICAgICBpZiAoZncgPT0gInN0YXJ0IikgewogICAgICAgICAgICBlbmQucm93IC0tOwogICAgICAgICAgICBlbmQuY29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZC5yb3cpLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7CiAgICB9OwoKfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOwoKfSk7CjsKICAgICAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkKICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkoKTsKICAgICAgICA=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-css.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9jc3MiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvY3NzX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLCJhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQiLCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vY3NzX2hpZ2hsaWdodF9ydWxlcyIpLkNzc0hpZ2hsaWdodFJ1bGVzLGg9YSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQsaT1hKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudCxqPWEoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZSxrPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSwiaSIpLHRoaXMuJG91dGRlbnQ9bmV3IGgsdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGp9O2QuaW5oZXJpdHMoayxlKSxmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1J1bGVzPSJjU3R5bGUiLHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuJGdldEluZGVudChiKSxlPXRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGIsYSkudG9rZW5zO2lmKGUubGVuZ3RoJiZlW2UubGVuZ3RoLTFdLnR5cGU9PSJjb21tZW50IilyZXR1cm4gZDt2YXIgZj1iLm1hdGNoKC9eLipce1xzKiQvKTtyZXR1cm4gZiYmKGQrPWMpLGR9LHRoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQoYixjKX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7dGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChiLGMpfSx0aGlzLmNyZWF0ZVdvcmtlcj1mdW5jdGlvbihhKXt2YXIgYj1uZXcgaShbImFjZSJdLCJ3b3JrZXItY3NzLmpzIiwiYWNlL21vZGUvY3NzX3dvcmtlciIsIldvcmtlciIpO3JldHVybiBiLmF0dGFjaFRvRG9jdW1lbnQoYS5nZXREb2N1bWVudCgpKSxiLm9uKCJjc3NsaW50IixmdW5jdGlvbihiKXt2YXIgYz1bXTtiLmRhdGEuZm9yRWFjaChmdW5jdGlvbihhKXtjLnB1c2goe3JvdzphLmxpbmUtMSxjb2x1bW46YS5jb2wtMSx0ZXh0OmEubWVzc2FnZSx0eXBlOmEudHlwZSxsaW50OmF9KX0pLGEuc2V0QW5ub3RhdGlvbnMoYyl9KSxifX0uY2FsbChrLnByb3RvdHlwZSksYi5Nb2RlPWt9KSxkZWZpbmUoImFjZS9tb2RlL2Nzc19oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxnPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKCItbW96LWFwcGVhcmFuY2V8LW1vei1ib3gtc2l6aW5nfC13ZWJraXQtYm94LXNpemluZ3wtbW96LW91dGxpbmUtcmFkaXVzfC1tb3otdHJhbnNmb3JtfC13ZWJraXQtdHJhbnNmb3JtfGFwcGVhcmFuY2V8YXppbXV0aHxiYWNrZ3JvdW5kLWF0dGFjaG1lbnR8YmFja2dyb3VuZC1jb2xvcnxiYWNrZ3JvdW5kLWltYWdlfGJhY2tncm91bmQtb3JpZ2lufGJhY2tncm91bmQtcG9zaXRpb258YmFja2dyb3VuZC1yZXBlYXR8YmFja2dyb3VuZHxib3JkZXItYm90dG9tLWNvbG9yfGJvcmRlci1ib3R0b20tc3R5bGV8Ym9yZGVyLWJvdHRvbS13aWR0aHxib3JkZXItYm90dG9tfGJvcmRlci1jb2xsYXBzZXxib3JkZXItY29sb3J8Ym9yZGVyLWxlZnQtY29sb3J8Ym9yZGVyLWxlZnQtc3R5bGV8Ym9yZGVyLWxlZnQtd2lkdGh8Ym9yZGVyLWxlZnR8Ym9yZGVyLXJpZ2h0LWNvbG9yfGJvcmRlci1yaWdodC1zdHlsZXxib3JkZXItcmlnaHQtd2lkdGh8Ym9yZGVyLXJpZ2h0fGJvcmRlci1zcGFjaW5nfGJvcmRlci1zdHlsZXxib3JkZXItdG9wLWNvbG9yfGJvcmRlci10b3Atc3R5bGV8Ym9yZGVyLXRvcC13aWR0aHxib3JkZXItdG9wfGJvcmRlci13aWR0aHxib3JkZXJ8Ym90dG9tfGJveC1zaXppbmd8Y2FwdGlvbi1zaWRlfGNsZWFyfGNsaXB8Y29sb3J8Y29udGVudHxjb3VudGVyLWluY3JlbWVudHxjb3VudGVyLXJlc2V0fGN1ZS1hZnRlcnxjdWUtYmVmb3JlfGN1ZXxjdXJzb3J8ZGlyZWN0aW9ufGRpc3BsYXl8ZWxldmF0aW9ufGVtcHR5LWNlbGxzfGZsb2F0fGZvbnQtZmFtaWx5fGZvbnQtc2l6ZS1hZGp1c3R8Zm9udC1zaXplfGZvbnQtc3RyZXRjaHxmb250LXN0eWxlfGZvbnQtdmFyaWFudHxmb250LXdlaWdodHxmb250fGhlaWdodHxsZWZ0fGxldHRlci1zcGFjaW5nfGxpbmUtaGVpZ2h0fGxpc3Qtc3R5bGUtaW1hZ2V8bGlzdC1zdHlsZS1wb3NpdGlvbnxsaXN0LXN0eWxlLXR5cGV8bGlzdC1zdHlsZXxtYXJnaW4tYm90dG9tfG1hcmdpbi1sZWZ0fG1hcmdpbi1yaWdodHxtYXJnaW4tdG9wfG1hcmtlci1vZmZzZXR8bWFyZ2lufG1hcmtzfG1heC1oZWlnaHR8bWF4LXdpZHRofG1pbi1oZWlnaHR8bWluLXdpZHRofC1tb3otYm9yZGVyLXJhZGl1c3xvcGFjaXR5fG9ycGhhbnN8b3V0bGluZS1jb2xvcnxvdXRsaW5lLW9mZnNldHxvdXRsaW5lLXJhZGl1c3xvdXRsaW5lLXN0eWxlfG91dGxpbmUtd2lkdGh8b3V0bGluZXxvdmVyZmxvd3xvdmVyZmxvdy14fG92ZXJmbG93LXl8cGFkZGluZy1ib3R0b218cGFkZGluZy1sZWZ0fHBhZGRpbmctcmlnaHR8cGFkZGluZy10b3B8cGFkZGluZ3xwYWdlLWJyZWFrLWFmdGVyfHBhZ2UtYnJlYWstYmVmb3JlfHBhZ2UtYnJlYWstaW5zaWRlfHBhZ2V8cGF1c2UtYWZ0ZXJ8cGF1c2UtYmVmb3JlfHBhdXNlfHBpdGNoLXJhbmdlfHBpdGNofHBsYXktZHVyaW5nfHBvaW50ZXItZXZlbnRzfHBvc2l0aW9ufHF1b3Rlc3xyZXNpemV8cmljaG5lc3N8cmlnaHR8c2l6ZXxzcGVhay1oZWFkZXJ8c3BlYWstbnVtZXJhbHxzcGVhay1wdW5jdHVhdGlvbnxzcGVlY2gtcmF0ZXxzcGVha3xzdHJlc3N8dGFibGUtbGF5b3V0fHRleHQtYWxpZ258dGV4dC1kZWNvcmF0aW9ufHRleHQtaW5kZW50fHRleHQtc2hhZG93fHRleHQtdHJhbnNmb3JtfHRvcHx0cmFuc2Zvcm18dW5pY29kZS1iaWRpfHZlcnRpY2FsLWFsaWdufHZpc2liaWxpdHl8dm9pY2UtZmFtaWx5fHZvbHVtZXx3aGl0ZS1zcGFjZXx3aWRvd3N8d2lkdGh8d29yZC1zcGFjaW5nfHotaW5kZXgiLnNwbGl0KCJ8IikpLGI9ZS5hcnJheVRvTWFwKCJyZ2J8cmdiYXx1cmx8YXR0cnxjb3VudGVyfGNvdW50ZXJzIi5zcGxpdCgifCIpKSxjPWUuYXJyYXlUb01hcCgiYWJzb2x1dGV8YWxsLXNjcm9sbHxhbHdheXN8YXJtZW5pYW58YXV0b3xiYXNlbGluZXxiZWxvd3xiaWRpLW92ZXJyaWRlfGJsb2NrfGJvbGR8Ym9sZGVyfGJvcmRlci1ib3h8Ym90aHxib3R0b218YnJlYWstYWxsfGJyZWFrLXdvcmR8Y2FwaXRhbGl6ZXxjZW50ZXJ8Y2hhcnxjaXJjbGV8Y2prLWlkZW9ncmFwaGljfGNvbC1yZXNpemV8Y29sbGFwc2V8Y29udGVudC1ib3h8Y3Jvc3NoYWlyfGRhc2hlZHxkZWNpbWFsLWxlYWRpbmctemVyb3xkZWNpbWFsfGRlZmF1bHR8ZGlzYWJsZWR8ZGlzY3xkaXN0cmlidXRlLWFsbC1saW5lc3xkaXN0cmlidXRlLWxldHRlcnxkaXN0cmlidXRlLXNwYWNlfGRpc3RyaWJ1dGV8ZG90dGVkfGRvdWJsZXxlLXJlc2l6ZXxlbGxpcHNpc3xmaXhlZHxnZW9yZ2lhbnxncm9vdmV8aGFuZHxoZWJyZXd8aGVscHxoaWRkZW58aGlyYWdhbmEtaXJvaGF8aGlyYWdhbmF8aG9yaXpvbnRhbHxpZGVvZ3JhcGgtYWxwaGF8aWRlb2dyYXBoLW51bWVyaWN8aWRlb2dyYXBoLXBhcmVudGhlc2lzfGlkZW9ncmFwaC1zcGFjZXxpbmFjdGl2ZXxpbmhlcml0fGlubGluZS1ibG9ja3xpbmxpbmV8aW5zZXR8aW5zaWRlfGludGVyLWlkZW9ncmFwaHxpbnRlci13b3JkfGl0YWxpY3xqdXN0aWZ5fGthdGFrYW5hLWlyb2hhfGthdGFrYW5hfGtlZXAtYWxsfGxlZnR8bGlnaHRlcnxsaW5lLWVkZ2V8bGluZS10aHJvdWdofGxpbmV8bGlzdC1pdGVtfGxvb3NlfGxvd2VyLWFscGhhfGxvd2VyLWdyZWVrfGxvd2VyLWxhdGlufGxvd2VyLXJvbWFufGxvd2VyY2FzZXxsci10YnxsdHJ8bWVkaXVtfG1pZGRsZXxtb3ZlfG4tcmVzaXplfG5lLXJlc2l6ZXxuZXdzcGFwZXJ8bm8tZHJvcHxuby1yZXBlYXR8bnctcmVzaXplfG5vbmV8bm9ybWFsfG5vdC1hbGxvd2VkfG5vd3JhcHxvYmxpcXVlfG91dHNldHxvdXRzaWRlfG92ZXJsaW5lfHBvaW50ZXJ8cHJvZ3Jlc3N8cmVsYXRpdmV8cmVwZWF0LXh8cmVwZWF0LXl8cmVwZWF0fHJpZ2h0fHJpZGdlfHJvdy1yZXNpemV8cnRsfHMtcmVzaXplfHNjcm9sbHxzZS1yZXNpemV8c2VwYXJhdGV8c21hbGwtY2Fwc3xzb2xpZHxzcXVhcmV8c3RhdGljfHN0cmljdHxzdXBlcnxzdy1yZXNpemV8dGFibGUtZm9vdGVyLWdyb3VwfHRhYmxlLWhlYWRlci1ncm91cHx0Yi1ybHx0ZXh0LWJvdHRvbXx0ZXh0LXRvcHx0ZXh0fHRoaWNrfHRoaW58dG9wfHRyYW5zcGFyZW50fHVuZGVybGluZXx1cHBlci1hbHBoYXx1cHBlci1sYXRpbnx1cHBlci1yb21hbnx1cHBlcmNhc2V8dmVydGljYWwtaWRlb2dyYXBoaWN8dmVydGljYWwtdGV4dHx2aXNpYmxlfHctcmVzaXplfHdhaXR8d2hpdGVzcGFjZXx6ZXJvIi5zcGxpdCgifCIpKSxkPWUuYXJyYXlUb01hcCgiYXF1YXxibGFja3xibHVlfGZ1Y2hzaWF8Z3JheXxncmVlbnxsaW1lfG1hcm9vbnxuYXZ5fG9saXZlfG9yYW5nZXxwdXJwbGV8cmVkfHNpbHZlcnx0ZWFsfHdoaXRlfHllbGxvdyIuc3BsaXQoInwiKSksZj0iXFwtPyg/Oig/OlswLTldKyl8KD86WzAtOV0qXFwuWzAtOV0rKSkiLGc9W3t0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKiIsbmV4dDoicnVsZXNldF9jb21tZW50In0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OidbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJ30se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDpmKyIoPzplbXxleHxweHxjbXxtbXxpbnxwdHxwY3xkZWd8cmFkfGdyYWR8bXN8c3xoenxraHp8JSkifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIjW2EtZjAtOV17Nn0ifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIjW2EtZjAtOV17M30ifSx7dG9rZW46ZnVuY3Rpb24oZSl7cmV0dXJuIGEuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT8ic3VwcG9ydC50eXBlIjpiLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/InN1cHBvcnQuZnVuY3Rpb24iOmMuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT8ic3VwcG9ydC5jb25zdGFudCI6ZC5oYXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpPyJzdXBwb3J0LmNvbnN0YW50LmNvbG9yIjoidGV4dCJ9LHJlZ2V4OiJcXC0/W2EtekEtWl9dW2EtekEtWjAtOV9cXC1dKiJ9XSxoPWUuY29weUFycmF5KGcpO2gudW5zaGlmdCh7dG9rZW46InBhcmVuLnJwYXJlbiIscmVnZXg6IlxcfSIsbmV4dDoic3RhcnQifSk7dmFyIGk9ZS5jb3B5QXJyYXkoZyk7aS51bnNoaWZ0KHt0b2tlbjoicGFyZW4ucnBhcmVuIixyZWdleDoiXFx9IixuZXh0OiJtZWRpYSJ9KTt2YXIgaj1be3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV0saz1lLmNvcHlBcnJheShqKTtrLnVuc2hpZnQoe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixuZXh0OiJzdGFydCJ9KTt2YXIgbD1lLmNvcHlBcnJheShqKTtsLnVuc2hpZnQoe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixuZXh0OiJtZWRpYSJ9KTt2YXIgbT1lLmNvcHlBcnJheShqKTttLnVuc2hpZnQoe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixuZXh0OiJydWxlc2V0In0pLHRoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwvXFwqIixuZXh0OiJjb21tZW50In0se3Rva2VuOiJwYXJlbi5scGFyZW4iLHJlZ2V4OiJcXHsiLG5leHQ6InJ1bGVzZXQifSx7dG9rZW46InN0cmluZyIscmVnZXg6IkAuKj97IixuZXh0OiJtZWRpYSJ9LHt0b2tlbjoia2V5d29yZCIscmVnZXg6IiNbYS16MC05LV9dKyJ9LHt0b2tlbjoidmFyaWFibGUiLHJlZ2V4OiJcXC5bYS16MC05LV9dKyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiOlthLXowLTktX10rIn0se3Rva2VuOiJjb25zdGFudCIscmVnZXg6IlthLXowLTktX10rIn1dLG1lZGlhOlt7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCoiLG5leHQ6Im1lZGlhX2NvbW1lbnQifSx7dG9rZW46InBhcmVuLmxwYXJlbiIscmVnZXg6IlxceyIsbmV4dDoibWVkaWFfcnVsZXNldCJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiXFx9IixuZXh0OiJzdGFydCJ9LHt0b2tlbjoia2V5d29yZCIscmVnZXg6IiNbYS16MC05LV9dKyJ9LHt0b2tlbjoidmFyaWFibGUiLHJlZ2V4OiJcXC5bYS16MC05LV9dKyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiOlthLXowLTktX10rIn0se3Rva2VuOiJjb25zdGFudCIscmVnZXg6IlthLXowLTktX10rIn1dLGNvbW1lbnQ6ayxydWxlc2V0OmgscnVsZXNldF9jb21tZW50Om0sbWVkaWFfcnVsZXNldDppLG1lZGlhX2NvbW1lbnQ6bH19O2QuaW5oZXJpdHMoZyxmKSxiLkNzc0hpZ2hsaWdodFJ1bGVzPWd9KSxkZWZpbmUoImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3JhbmdlIikuUmFuZ2UsZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuL15ccyskLy50ZXN0KGEpPy9eXHMqXH0vLnRlc3QoYik6ITF9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldExpbmUoYiksZT1jLm1hdGNoKC9eKFxzKlx9KS8pO2lmKCFlKXJldHVybiAwO3ZhciBmPWVbMV0ubGVuZ3RoLGc9YS5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6Yixjb2x1bW46Zn0pO2lmKCFnfHxnLnJvdz09YilyZXR1cm4gMDt2YXIgaD10aGlzLiRnZXRJbmRlbnQoYS5nZXRMaW5lKGcucm93KSk7YS5yZXBsYWNlKG5ldyBkKGIsMCxiLGYtMSksaCl9LHRoaXMuJGdldEluZGVudD1mdW5jdGlvbihhKXt2YXIgYj1hLm1hdGNoKC9eKFxzKykvKTtyZXR1cm4gYj9iWzFdOiIifX0pKS5jYWxsKGUucHJvdG90eXBlKSxiLk1hdGNoaW5nQnJhY2VPdXRkZW50PWV9KSxkZWZpbmUoImFjZS93b3JrZXIvd29ya2VyX2NsaWVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixmPWZ1bmN0aW9uKGIsZCxlLGYpe3RoaXMuY2hhbmdlTGlzdGVuZXI9dGhpcy5jaGFuZ2VMaXN0ZW5lci5iaW5kKHRoaXMpO2lmKGMucGFja2FnZWQpe3ZhciBnPXRoaXMuJGd1ZXNzQmFzZVBhdGgoKTt0aGlzLiR3b3JrZXI9bmV3IFdvcmtlcihnK2QpfWVsc2V7dmFyIGg9dGhpcy4kbm9ybWFsaXplUGF0aChhLm5hbWVUb1VybCgiYWNlL3dvcmtlci93b3JrZXIiLG51bGwsIl8iKSk7dGhpcy4kd29ya2VyPW5ldyBXb3JrZXIoaCk7dmFyIGk9e307Zm9yKHZhciBqPTA7ajxiLmxlbmd0aDtqKyspe3ZhciBrPWJbal0sbD10aGlzLiRub3JtYWxpemVQYXRoKGEubmFtZVRvVXJsKGssbnVsbCwiXyIpLnJlcGxhY2UoLy5qcyQvLCIiKSk7aVtrXT1sfX10aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2luaXQ6ITAsdGxuczppLG1vZHVsZTplLGNsYXNzbmFtZTpmfSksdGhpcy5jYWxsYmFja0lkPTEsdGhpcy5jYWxsYmFja3M9e307dmFyIG09dGhpczt0aGlzLiR3b3JrZXIub25lcnJvcj1mdW5jdGlvbihhKXt0aHJvdyB3aW5kb3cuY29uc29sZSYmY29uc29sZS5sb2cmJmNvbnNvbGUubG9nKGEpLGF9LHRoaXMuJHdvcmtlci5vbm1lc3NhZ2U9ZnVuY3Rpb24oYSl7dmFyIGI9YS5kYXRhO3N3aXRjaChiLnR5cGUpe2Nhc2UibG9nIjp3aW5kb3cuY29uc29sZSYmY29uc29sZS5sb2cmJmNvbnNvbGUubG9nKGIuZGF0YSk7YnJlYWs7Y2FzZSJldmVudCI6bS5fZW1pdChiLm5hbWUse2RhdGE6Yi5kYXRhfSk7YnJlYWs7Y2FzZSJjYWxsIjp2YXIgYz1tLmNhbGxiYWNrc1tiLmlkXTtjJiYoYyhiLmRhdGEpLGRlbGV0ZSBtLmNhbGxiYWNrc1tiLmlkXSl9fX07KChmdW5jdGlvbigpe2QuaW1wbGVtZW50KHRoaXMsZSksdGhpcy4kbm9ybWFsaXplUGF0aD1mdW5jdGlvbihhKXtyZXR1cm4gYT1hLnJlcGxhY2UoL15bYS16XSs6XC9cL1teXC9dK1wvLywiIiksYT1sb2NhdGlvbi5wcm90b2NvbCsiLy8iK2xvY2F0aW9uLmhvc3QrKGEuY2hhckF0KDApPT0iLyI/IiI6bG9jYXRpb24ucGF0aG5hbWUucmVwbGFjZSgvXC9bXlwvXSokLywiIikpKyIvIithLnJlcGxhY2UoL15bXC9dKy8sIiIpLGF9LHRoaXMuJGd1ZXNzQmFzZVBhdGg9ZnVuY3Rpb24oKXtpZihhLmFjZUJhc2VVcmwpcmV0dXJuIGEuYWNlQmFzZVVybDt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPWJbY10sZT1kLmdldEF0dHJpYnV0ZSgiZGF0YS1hY2UtYmFzZSIpO2lmKGUpcmV0dXJuIGUucmVwbGFjZSgvXC8qJC8sIi8iKTt2YXIgZj1kLnNyY3x8ZC5nZXRBdHRyaWJ1dGUoInNyYyIpO2lmKCFmKWNvbnRpbnVlO3ZhciBnPWYubWF0Y2goL14oPzooLipcLylhY2VcLmpzfCguKlwvKWFjZSgtdW5jb21wcmVzc2VkKT8oLW5vY29uZmxpY3QpP1wuanMpKD86XD98JCkvKTtpZihnKXJldHVybiBnWzFdfHxnWzJdfXJldHVybiIifSx0aGlzLnRlcm1pbmF0ZT1mdW5jdGlvbigpe3RoaXMuX2VtaXQoInRlcm1pbmF0ZSIse30pLHRoaXMuJHdvcmtlci50ZXJtaW5hdGUoKSx0aGlzLiR3b3JrZXI9bnVsbCx0aGlzLiRkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix0aGlzLmNoYW5nZUxpc3RlbmVyKSx0aGlzLiRkb2M9bnVsbH0sdGhpcy5zZW5kPWZ1bmN0aW9uKGEsYil7dGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtjb21tYW5kOmEsYXJnczpifSl9LHRoaXMuY2FsbD1mdW5jdGlvbihhLGIsYyl7aWYoYyl7dmFyIGQ9dGhpcy5jYWxsYmFja0lkKys7dGhpcy5jYWxsYmFja3NbZF09YyxiLnB1c2goZCl9dGhpcy5zZW5kKGEsYil9LHRoaXMuZW1pdD1mdW5jdGlvbihhLGIpe3RyeXt0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2V2ZW50OmEsZGF0YTp7ZGF0YTpiLmRhdGF9fSl9Y2F0Y2goYyl7fX0sdGhpcy5hdHRhY2hUb0RvY3VtZW50PWZ1bmN0aW9uKGEpe3RoaXMuJGRvYyYmdGhpcy50ZXJtaW5hdGUoKSx0aGlzLiRkb2M9YSx0aGlzLmNhbGwoInNldFZhbHVlIixbYS5nZXRWYWx1ZSgpXSksYS5vbigiY2hhbmdlIix0aGlzLmNoYW5nZUxpc3RlbmVyKX0sdGhpcy5jaGFuZ2VMaXN0ZW5lcj1mdW5jdGlvbihhKXthLnJhbmdlPXtzdGFydDphLmRhdGEucmFuZ2Uuc3RhcnQsZW5kOmEuZGF0YS5yYW5nZS5lbmR9LHRoaXMuZW1pdCgiY2hhbmdlIixhKX19KSkuY2FsbChmLnByb3RvdHlwZSksYi5Xb3JrZXJDbGllbnQ9Zn0pLGRlZmluZSgiYWNlL21vZGUvZm9sZGluZy9jc3R5bGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9yYW5nZSIsImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGY9YSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZSxnPWIuRm9sZE1vZGU9ZnVuY3Rpb24oKXt9O2QuaW5oZXJpdHMoZyxmKSxmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPS8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9L15bXlxbXHtdKihcfXxcXSl8Xltcc1wqXSooXCpcLykvLHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmdldExpbmUoYyksZj1kLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTtpZihmKXt2YXIgZz1mLmluZGV4O2lmKGZbMV0pcmV0dXJuIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayhhLGZbMV0sYyxnKTt2YXIgaD1hLmdldENvbW1lbnRGb2xkUmFuZ2UoYyxnK2ZbMF0ubGVuZ3RoKTtyZXR1cm4gaC5lbmQuY29sdW1uLT0yLGh9aWYoYiE9PSJtYXJrYmVnaW5lbmQiKXJldHVybjt2YXIgZj1kLm1hdGNoKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIpO2lmKGYpe3ZhciBnPWYuaW5kZXgrZlswXS5sZW5ndGg7aWYoZlsyXSl7dmFyIGg9YS5nZXRDb21tZW50Rm9sZFJhbmdlKGMsZyk7cmV0dXJuIGguZW5kLmNvbHVtbi09MixofXZhciBpPXtyb3c6Yyxjb2x1bW46Z30saj1hLiRmaW5kT3BlbmluZ0JyYWNrZXQoZlsxXSxpKTtpZighailyZXR1cm47cmV0dXJuIGouY29sdW1uKyssaS5jb2x1bW4tLSxlLmZyb21Qb2ludHMoaixpKX19fS5jYWxsKGcucHJvdG90eXBlKX0pLGRlZmluZSgiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL3JhbmdlIikuUmFuZ2UsZT1iLkZvbGRNb2RlPWZ1bmN0aW9uKCl7fTsoKGZ1bmN0aW9uKCl7dGhpcy5mb2xkaW5nU3RhcnRNYXJrZXI9bnVsbCx0aGlzLmZvbGRpbmdTdG9wTWFya2VyPW51bGwsdGhpcy5nZXRGb2xkV2lkZ2V0PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmdldExpbmUoYyk7cmV0dXJuIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QoZCk/InN0YXJ0IjpiPT0ibWFya2JlZ2luZW5kIiYmdGhpcy5mb2xkaW5nU3RvcE1hcmtlciYmdGhpcy5mb2xkaW5nU3RvcE1hcmtlci50ZXN0KGQpPyJlbmQiOiIifSx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIG51bGx9LHRoaXMuaW5kZW50YXRpb25CbG9jaz1mdW5jdGlvbihhLGIsYyl7dmFyIGU9L15ccyovLGY9YixnPWIsaD1hLmdldExpbmUoYiksaT1jfHxoLmxlbmd0aCxqPWgubWF0Y2goZSlbMF0ubGVuZ3RoLGs9YS5nZXRMZW5ndGgoKTt3aGlsZSgrK2I8ayl7aD1hLmdldExpbmUoYik7dmFyIGw9aC5tYXRjaChlKVswXS5sZW5ndGg7aWYobD09aC5sZW5ndGgpY29udGludWU7aWYobDw9ailicmVhaztnPWJ9aWYoZz5mKXt2YXIgbT1hLmdldExpbmUoZykubGVuZ3RoO3JldHVybiBuZXcgZChmLGksZyxtKX19LHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jaz1mdW5jdGlvbihhLGIsYyxlKXt2YXIgZj17cm93OmMsY29sdW1uOmUrMX0sZz1hLiRmaW5kQ2xvc2luZ0JyYWNrZXQoYixmKTtpZighZylyZXR1cm47dmFyIGg9YS5mb2xkV2lkZ2V0c1tnLnJvd107cmV0dXJuIGg9PW51bGwmJihoPXRoaXMuZ2V0Rm9sZFdpZGdldChhLGcucm93KSksaD09InN0YXJ0IiYmKGcucm93LS0sZy5jb2x1bW49YS5nZXRMaW5lKGcucm93KS5sZW5ndGgpLGQuZnJvbVBvaW50cyhmLGcpfX0pKS5jYWxsKGUucHJvdG90eXBlKX0pLGZ1bmN0aW9uKCl7d2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sZnVuY3Rpb24oYSl7d2luZG93LmFjZXx8KHdpbmRvdy5hY2U9e30pO2Zvcih2YXIgYiBpbiBhKWEuaGFzT3duUHJvcGVydHkoYikmJihhY2VbYl09YVtiXSl9KX0oKQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-c_cpp-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKiAgICAgIEdhc3TDs24gS2xlaW1hbiA8Z2FzdG9uLmtsZWltYW4gQVQgZ21haWwgRE9UIGNvbT4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvY19jcHAnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHQnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS9jX2NwcF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZScsICdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsKdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsKdmFyIGNfY3BwSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2NfY3BwX2hpZ2hsaWdodF9ydWxlcyIpLmNfY3BwSGlnaGxpZ2h0UnVsZXM7CnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Owp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOwp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gcmVxdWlyZSgiLi9iZWhhdmlvdXIvY3N0eWxlIikuQ3N0eWxlQmVoYXZpb3VyOwp2YXIgQ1N0eWxlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGU7Cgp2YXIgTW9kZSA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgY19jcHBIaWdobGlnaHRSdWxlcygpLmdldFJ1bGVzKCkpOwogICAgdGhpcy4kb3V0ZGVudCA9IG5ldyBNYXRjaGluZ0JyYWNlT3V0ZGVudCgpOwogICAgdGhpcy4kYmVoYXZpb3VyID0gbmV3IENzdHlsZUJlaGF2aW91cigpOwogICAgdGhpcy5mb2xkaW5nUnVsZXMgPSBuZXcgQ1N0eWxlRm9sZE1vZGUoKTsKfTsKb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpIHsKICAgICAgICB2YXIgb3V0ZGVudCA9IHRydWU7CiAgICAgICAgdmFyIHJlID0gL14oXHMqKVwvXC8vOwoKICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspIHsKICAgICAgICAgICAgaWYgKCFyZS50ZXN0KGRvYy5nZXRMaW5lKGkpKSkgewogICAgICAgICAgICAgICAgb3V0ZGVudCA9IGZhbHNlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChvdXRkZW50KSB7CiAgICAgICAgICAgIHZhciBkZWxldGVSYW5nZSA9IG5ldyBSYW5nZSgwLCAwLCAwLCAwKTsKICAgICAgICAgICAgZm9yICh2YXIgaT1zdGFydFJvdzsgaTw9IGVuZFJvdzsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKGkpOwogICAgICAgICAgICAgICAgdmFyIG0gPSBsaW5lLm1hdGNoKHJlKTsKICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLnN0YXJ0LnJvdyA9IGk7CiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQucm93ID0gaTsKICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLmVuZC5jb2x1bW4gPSBtWzBdLmxlbmd0aDsKICAgICAgICAgICAgICAgIGRvYy5yZXBsYWNlKGRlbGV0ZVJhbmdlLCBtWzFdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZG9jLmluZGVudFJvd3Moc3RhcnRSb3csIGVuZFJvdywgIi8vIik7CiAgICAgICAgfQogICAgfTsKCiAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgewogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQobGluZSk7CgogICAgICAgIHZhciB0b2tlbml6ZWRMaW5lID0gdGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMobGluZSwgc3RhdGUpOwogICAgICAgIHZhciB0b2tlbnMgPSB0b2tlbml6ZWRMaW5lLnRva2VuczsKICAgICAgICB2YXIgZW5kU3RhdGUgPSB0b2tlbml6ZWRMaW5lLnN0YXRlOwoKICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXS50eXBlID09ICJjb21tZW50IikgewogICAgICAgICAgICByZXR1cm4gaW5kZW50OwogICAgICAgIH0KCiAgICAgICAgaWYgKHN0YXRlID09ICJzdGFydCIpIHsKICAgICAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXi4qW1x7XChcW11ccyokLyk7CiAgICAgICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gImRvYy1zdGFydCIpIHsKICAgICAgICAgICAgaWYgKGVuZFN0YXRlID09ICJzdGFydCIpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eXHMqKFwvPylcKi8pOwogICAgICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgICAgIGlmIChtYXRjaFsxXSkgewogICAgICAgICAgICAgICAgICAgIGluZGVudCArPSAiICI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gIiogIjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGluZGVudDsKICAgIH07CgogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgaW5wdXQpIHsKICAgICAgICByZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQobGluZSwgaW5wdXQpOwogICAgfTsKCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgcm93KSB7CiAgICAgICAgdGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChkb2MsIHJvdyk7CiAgICB9OwoKfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7CgpleHBvcnRzLk1vZGUgPSBNb2RlOwp9KTsKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKiAgICAgIEdhc3TDs24gS2xlaW1hbiA8Z2FzdG9uLmtsZWltYW4gQVQgZ21haWwgRE9UIGNvbT4KICoKICogQmFzZWQgb24gQmVzcGluJ3MgQy9DKysgU3ludGF4IFBsdWdpbiBieSBNYXJjIE1jSW50eXJlLgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9jX2NwcF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsKdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIikuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzOwp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsKCnZhciBjX2NwcEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7CgogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgiYW5kfGRvdWJsZXxub3RfZXF8dGhyb3d8YW5kX2VxfGR5bmFtaWNfY2FzdHxvcGVyYXRvcnx0cnVlfCIgKwogICAgICAgICJhc218ZWxzZXxvcnx0cnl8YXV0b3xlbnVtfG9yX2VxfHR5cGVkZWZ8Yml0YW5kfGV4cGxpY2l0fHByaXZhdGV8IiArCiAgICAgICAgInR5cGVpZHxiaXRvcnxleHRlcm58cHJvdGVjdGVkfHR5cGVuYW1lfGJvb2x8ZmFsc2V8cHVibGljfHVuaW9ufCIgKwogICAgICAgICJicmVha3xmbG9hdHxyZWdpc3Rlcnx1bnNpZ25lZHxjYXNlfGZyb3xyZWludGVycHJldC1jYXN0fHVzaW5nfGNhdGNofCIgKwogICAgICAgICJmcmllbmR8cmV0dXJufHZpcnR1YWx8Y2hhcnxnb3RvfHNob3J0fHZvaWR8Y2xhc3N8aWZ8c2lnbmVkfHZvbGF0aWxlfCIgKwogICAgICAgICJjb21wbHxpbmxpbmV8c2l6ZW9mfHdjaGFyX3R8Y29uc3R8aW50fHN0YXRpY3x3aGlsZXxjb25zdC1jYXN0fGxvbmd8IiArCiAgICAgICAgInN0YXRpY19jYXN0fHhvcnxjb250aW51ZXxtdXRhYmxlfHN0cnVjdHx4b3JfZXF8ZGVmYXVsdHxuYW1lc3BhY2V8IiArCiAgICAgICAgInN3aXRjaHxkZWxldGV8bmV3fHRlbXBsYXRlfGRvfG5vdHx0aGlzfGZvciIpLnNwbGl0KCJ8IikKICAgICk7CgogICAgdmFyIGJ1aWxkaW5Db25zdGFudHMgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCJOVUxMIikuc3BsaXQoInwiKQogICAgKTsKCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMuIFVzZSAoPzopIGluc3RlYWQuCiAgICAvLyByZWdleHBzIGFyZSBvcmRlcmVkIC0+IHRoZSBmaXJzdCBtYXRjaCBpcyB1c2VkCgogICAgdGhpcy4kcnVsZXMgPSB7CiAgICAgICAgInN0YXJ0IiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXC8uKiQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50CiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLAogICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXScKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXS4qXFxcXCQnLAogICAgICAgICAgICAgICAgbmV4dCA6ICJxcXN0cmluZyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10iCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0CiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10uKlxcXFwkIiwKICAgICAgICAgICAgICAgIG5leHQgOiAicXN0cmluZyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleAogICAgICAgICAgICAgICAgcmVnZXggOiAiMFt4WF1bMC05YS1mQS1GXStcXGIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdAogICAgICAgICAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudCIsIC8vIDxDT05TVEFOVD4KICAgICAgICAgICAgICByZWdleCA6ICI8W2EtekEtWjAtOS5dKz4iCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkIiwgLy8gcHJlLWNvbXBpbGVyIGRpcmVjdGl2cwogICAgICAgICAgICAgIHJlZ2V4IDogIig/OiNpbmNsdWRlfCNwcmFnbWF8I2xpbmV8I2RlZmluZXwjdW5kZWZ8I2lmZGVmfCNlbHNlfCNlbGlmfCNlbmRpZnwjaWZuZGVmKSIKICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gInRoaXMiKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInZhcmlhYmxlLmxhbmd1YWdlIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYnVpbGRpbkNvbnN0YW50cy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpZGVudGlmaWVyIjsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICByZWdleCA6ICJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PXw9fCE9fDw9fD49fDw8PXw+Pj18Pj4+PXw8Pnw8fD58IXwmJnxcXHxcXHx8XFw/XFw6fFxcKj18JT18XFwrPXxcXC09fCY9fFxcXj18XFxiKD86aW58bmV3fGRlbGV0ZXx0eXBlb2Z8dm9pZCkiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICB0b2tlbiA6ICJwdW5jdHVhdGlvbi5vcGVyYXRvciIsCiAgICAgICAgICAgICAgcmVnZXggOiAiXFw/fFxcOnxcXCx8XFw7fFxcLiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ubHBhcmVuIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIltbKHtdIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5ycGFyZW4iLAogICAgICAgICAgICAgICAgcmVnZXggOiAiW1xcXSl9XSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIgogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiY29tbWVudCIgOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQKICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyIKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInFxc3RyaW5nIiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogJyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJywKICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKycKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInFzdHJpbmciIDogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqPyciLAogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJwogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfTsKICAgIAogICAgdGhpcy5lbWJlZFJ1bGVzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgImRvYy0iLAogICAgICAgIFsgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldEVuZFJ1bGUoInN0YXJ0IikgXSk7Cn07Cgpvb3AuaW5oZXJpdHMoY19jcHBIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsKCmV4cG9ydHMuY19jcHBIaWdobGlnaHRSdWxlcyA9IGNfY3BwSGlnaGxpZ2h0UnVsZXM7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOwoKdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuJHJ1bGVzID0gewogICAgICAgICJzdGFydCIgOiBbIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MudGFnIiwKICAgICAgICAgICAgcmVnZXggOiAiQFtcXHdcXGRfXSsiIC8vIFRPRE86IGZpeCBlbWFpbCBhZGRyZXNzZXMKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICJcXHMrIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlRPRE8iCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiW15AXFwqXSsiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiLiIKICAgICAgICB9XQogICAgfTsKfTsKCm9vcC5pbmhlcml0cyhEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5nZXRTdGFydFJ1bGUgPSBmdW5jdGlvbihzdGFydCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gZG9jIGNvbW1lbnQKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICJcXC9cXCooPz1cXCopIiwKICAgICAgICAgICAgbmV4dCAgOiBzdGFydAogICAgICAgIH07CiAgICB9OwogICAgCiAgICB0aGlzLmdldEVuZFJ1bGUgPSBmdW5jdGlvbiAoc3RhcnQpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsIC8vIGNsb3NpbmcgY29tbWVudAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlxcKlxcLyIsCiAgICAgICAgICAgIG5leHQgIDogc3RhcnQKICAgICAgICB9OwogICAgfTsKCn0pLmNhbGwoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLnByb3RvdHlwZSk7CgpleHBvcnRzLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsKCn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsKCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IGZ1bmN0aW9uKCkge307CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihsaW5lLCBpbnB1dCkgewogICAgICAgIGlmICghIC9eXHMrJC8udGVzdChsaW5lKSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgICByZXR1cm4gL15ccypcfS8udGVzdChpbnB1dCk7CiAgICB9OwoKICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihkb2MsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocm93KTsKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKlx9KS8pOwoKICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDsKCiAgICAgICAgdmFyIGNvbHVtbiA9IG1hdGNoWzFdLmxlbmd0aDsKICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gZG9jLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn0pOwoKICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcyB8fCBvcGVuQnJhY2VQb3Mucm93ID09IHJvdykgcmV0dXJuIDA7CgogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOwogICAgICAgIGRvYy5yZXBsYWNlKG5ldyBSYW5nZShyb3csIDAsIHJvdywgY29sdW1uLTEpLCBpbmRlbnQpOwogICAgfTsKCiAgICB0aGlzLiRnZXRJbmRlbnQgPSBmdW5jdGlvbihsaW5lKSB7CiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAiIjsKICAgIH07Cgp9KS5jYWxsKE1hdGNoaW5nQnJhY2VPdXRkZW50LnByb3RvdHlwZSk7CgpleHBvcnRzLk1hdGNoaW5nQnJhY2VPdXRkZW50ID0gTWF0Y2hpbmdCcmFjZU91dGRlbnQ7Cn0pOwovKiB2aW06dHM9NDpzdHM9NDpzdz00OgogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIENocmlzIFNwZW5jZXIgPGNocmlzLmFnLnNwZW5jZXIgQVQgZ29vZ2xlbWFpbCBET1QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9iZWhhdmlvdXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7CnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCcuLi9iZWhhdmlvdXInKS5CZWhhdmlvdXI7Cgp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gZnVuY3Rpb24gKCkgewoKICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgewogICAgICAgIGlmICh0ZXh0ID09ICd7JykgewogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7CiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7JyArIHNlbGVjdGVkICsgJ30nLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3t9JywKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICd9JykgewogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsKICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsKICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsKICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnfScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsKICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAiXG4iKSB7CiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9JykgewogICAgICAgICAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IHNlc3Npb24uZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiBjdXJzb3Iucm93LCBjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxfSk7CiAgICAgICAgICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcykKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CgogICAgICAgICAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQoc3RhdGUsIGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUubGVuZ3RoIC0gMSksIHNlc3Npb24uZ2V0VGFiU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgdmFyIG5leHRfaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOwoKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xuJyArIGluZGVudCArICdcbicgKyBuZXh0X2luZGVudCwKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCBpbmRlbnQubGVuZ3RoLCAxLCBpbmRlbnQubGVuZ3RoXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoImJyYWNlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7CiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsKICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJ3snKSB7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2UuZW5kLmNvbHVtbiwgcmFuZ2UuZW5kLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9JykgewogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOwogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoInBhcmVucyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7CiAgICAgICAgaWYgKHRleHQgPT0gJygnKSB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7CiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygnICsgc2VsZWN0ZWQgKyAnKScsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCknLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJyknKSB7CiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgewogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCcpJywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOwogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoInBhcmVucyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7CiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsKICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJygnKSB7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgewogICAgICAgIGlmICh0ZXh0ID09ICciJykgewogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7CiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICciJyArIHNlbGVjdGVkICsgJyInLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsKICAgICAgICAgICAgICAgIHZhciBsZWZ0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4tMSwgY3Vyc29yLmNvbHVtbik7CgogICAgICAgICAgICAgICAgLy8gV2UncmUgZXNjYXBlZC4KICAgICAgICAgICAgICAgIGlmIChsZWZ0Q2hhciA9PSAnXFwnKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gRmluZCB3aGF0IHRva2VuIHdlJ3JlIGluc2lkZS4KICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzZXNzaW9uLmdldFRva2VucyhzZWxlY3Rpb24uc3RhcnQucm93LCBzZWxlY3Rpb24uc3RhcnQucm93KVswXS50b2tlbnM7CiAgICAgICAgICAgICAgICB2YXIgY29sID0gMCwgdG9rZW47CiAgICAgICAgICAgICAgICB2YXIgcXVvdGVwb3MgPSAtMTsgLy8gVHJhY2sgd2hldGhlciB3ZSdyZSBpbnNpZGUgYW4gb3BlbiBxdW90ZS4KCiAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRva2Vucy5sZW5ndGg7IHgrKykgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW3hdOwogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IC0xOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocXVvdGVwb3MgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IHRva2VuLnZhbHVlLmluZGV4T2YoJyInKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0b2tlbi52YWx1ZS5sZW5ndGggKyBjb2wpID4gc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbikgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29sICs9IHRva2Vuc1t4XS52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gVHJ5IGFuZCBiZSBzbWFydCBhYm91dCB3aGVuIHdlIGF1dG8gaW5zZXJ0LgogICAgICAgICAgICAgICAgaWYgKCF0b2tlbiB8fCAocXVvdGVwb3MgPCAwICYmIHRva2VuLnR5cGUgIT09ICJjb21tZW50IiAmJiAodG9rZW4udHlwZSAhPT0gInN0cmluZyIgfHwgKChzZWxlY3Rpb24uc3RhcnQuY29sdW1uICE9PSB0b2tlbi52YWx1ZS5sZW5ndGgrY29sLTEpICYmIHRva2VuLnZhbHVlLmxhc3RJbmRleE9mKCciJykgPT09IHRva2VuLnZhbHVlLmxlbmd0aC0xKSkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJyIiJywKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwxXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gJiYgdG9rZW4udHlwZSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaW5wdXQgYW5kIG1vdmUgcmlnaHQgb25lIGlmIHdlJ3JlIHR5cGluZyBvdmVyIHRoZSBjbG9zaW5nIHF1b3RlLgogICAgICAgICAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7CiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsKICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJyInKSB7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCn0Kb29wLmluaGVyaXRzKENzdHlsZUJlaGF2aW91ciwgQmVoYXZpb3VyKTsKCmV4cG9ydHMuQ3N0eWxlQmVoYXZpb3VyID0gQ3N0eWxlQmVoYXZpb3VyOwp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7CnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7CnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOwoKdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307Cm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IC8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvOwogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IC9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLzsKICAgIAogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXg7CgogICAgICAgICAgICBpZiAobWF0Y2hbMV0pCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKHNlc3Npb24sIG1hdGNoWzFdLCByb3csIGkpOwoKICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSArIG1hdGNoWzBdLmxlbmd0aCk7CiAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsKICAgICAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGZvbGRTdHlsZSAhPT0gIm1hcmtiZWdpbmVuZCIpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDsKCiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkgewogICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSk7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiByb3csIGNvbHVtbjogaX07CiAgICAgICAgICAgIHZhciBzdGFydCA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldChtYXRjaFsxXSwgZW5kKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICghc3RhcnQpCiAgICAgICAgICAgICAgICByZXR1cm47CgogICAgICAgICAgICBzdGFydC5jb2x1bW4rKzsKICAgICAgICAgICAgZW5kLmNvbHVtbi0tOwoKICAgICAgICAgICAgcmV0dXJuICBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOwogICAgICAgIH0KICAgIH07CiAgICAKfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOwoKfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOwoKdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSBudWxsOwogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7CgogICAgLy8gbXVzdCByZXR1cm4gIiIgaWYgdGhlcmUncyBubyBmb2xkLCB0byBlbmFibGUgY2FjaGluZwogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsKICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOwogICAgICAgIGlmICh0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGxpbmUpKQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsKICAgICAgICBpZiAoZm9sZFN0eWxlID09ICJtYXJrYmVnaW5lbmQiCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpCiAgICAgICAgICAgIHJldHVybiAiZW5kIjsKICAgICAgICByZXR1cm4gIiI7CiAgICB9OwogICAgCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7CiAgICAgICAgdmFyIHJlID0gL15ccyovOwogICAgICAgIHZhciBzdGFydFJvdyA9IHJvdzsKICAgICAgICB2YXIgZW5kUm93ID0gcm93OwogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgdmFyIHN0YXJ0Q29sdW1uID0gY29sdW1uIHx8IGxpbmUubGVuZ3RoOwogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOwogICAgICAgIHZhciBtYXhSb3cgPSBzZXNzaW9uLmdldExlbmd0aCgpCiAgICAgICAgCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7CiAgICAgICAgICAgIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICAgICAgdmFyIGxldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOwoKICAgICAgICAgICAgaWYgKGxldmVsID09IGxpbmUubGVuZ3RoKQogICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICBpZiAobGV2ZWwgPD0gc3RhcnRMZXZlbCkKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgZW5kUm93ID0gcm93OwogICAgICAgIH0KCiAgICAgICAgaWYgKGVuZFJvdyA+IHN0YXJ0Um93KSB7CiAgICAgICAgICAgIHZhciBlbmRDb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kUm93KS5sZW5ndGg7CiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7CiAgICAgICAgfQogICAgfTsKCiAgICB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCBicmFja2V0LCByb3csIGNvbHVtbikgewogICAgICAgIHZhciBzdGFydCA9IHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW4gKyAxfTsKICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsKICAgICAgICBpZiAoIWVuZCkKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICB2YXIgZncgPSBzZXNzaW9uLmZvbGRXaWRnZXRzW2VuZC5yb3ddOwogICAgICAgIGlmIChmdyA9PSBudWxsKQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsKCiAgICAgICAgaWYgKGZ3ID09ICJzdGFydCIpIHsKICAgICAgICAgICAgZW5kLnJvdyAtLTsKICAgICAgICAgICAgZW5kLmNvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmQucm93KS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOwogICAgfTsKCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsKCn0pOwo7CiAgICAgICAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAg]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-c_cpp.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9jX2NwcCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dCIsImFjZS90b2tlbml6ZXIiLCJhY2UvbW9kZS9jX2NwcF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50IiwiYWNlL3JhbmdlIiwiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSIsImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3RleHQiKS5Nb2RlLGY9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGc9YSgiLi9jX2NwcF9oaWdobGlnaHRfcnVsZXMiKS5jX2NwcEhpZ2hsaWdodFJ1bGVzLGg9YSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQsaT1hKCIuLi9yYW5nZSIpLlJhbmdlLGo9YSgiLi9iZWhhdmlvdXIvY3N0eWxlIikuQ3N0eWxlQmVoYXZpb3VyLGs9YSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlLGw9ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbml6ZXI9bmV3IGYoKG5ldyBnKS5nZXRSdWxlcygpKSx0aGlzLiRvdXRkZW50PW5ldyBoLHRoaXMuJGJlaGF2aW91cj1uZXcgaix0aGlzLmZvbGRpbmdSdWxlcz1uZXcga307ZC5pbmhlcml0cyhsLGUpLGZ1bmN0aW9uKCl7dGhpcy50b2dnbGVDb21tZW50TGluZXM9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ITAsZj0vXihccyopXC9cLy87Zm9yKHZhciBnPWM7Zzw9ZDtnKyspaWYoIWYudGVzdChiLmdldExpbmUoZykpKXtlPSExO2JyZWFrfWlmKGUpe3ZhciBoPW5ldyBpKDAsMCwwLDApO2Zvcih2YXIgZz1jO2c8PWQ7ZysrKXt2YXIgaj1iLmdldExpbmUoZyksaz1qLm1hdGNoKGYpO2guc3RhcnQucm93PWcsaC5lbmQucm93PWcsaC5lbmQuY29sdW1uPWtbMF0ubGVuZ3RoLGIucmVwbGFjZShoLGtbMV0pfX1lbHNlIGIuaW5kZW50Um93cyhjLGQsIi8vIil9LHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuJGdldEluZGVudChiKSxlPXRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGIsYSksZj1lLnRva2VucyxnPWUuc3RhdGU7aWYoZi5sZW5ndGgmJmZbZi5sZW5ndGgtMV0udHlwZT09ImNvbW1lbnQiKXJldHVybiBkO2lmKGE9PSJzdGFydCIpe3ZhciBoPWIubWF0Y2goL14uKltce1woXFtdXHMqJC8pO2gmJihkKz1jKX1lbHNlIGlmKGE9PSJkb2Mtc3RhcnQiKXtpZihnPT0ic3RhcnQiKXJldHVybiIiO3ZhciBoPWIubWF0Y2goL15ccyooXC8/KVwqLyk7aCYmKGhbMV0mJihkKz0iICIpLGQrPSIqICIpfXJldHVybiBkfSx0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGIsYyl9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoYixjKX19LmNhbGwobC5wcm90b3R5cGUpLGIuTW9kZT1sfSksZGVmaW5lKCJhY2UvbW9kZS9jX2NwcF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsZz1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGg9ZnVuY3Rpb24oKXt2YXIgYT1lLmFycmF5VG9NYXAoImFuZHxkb3VibGV8bm90X2VxfHRocm93fGFuZF9lcXxkeW5hbWljX2Nhc3R8b3BlcmF0b3J8dHJ1ZXxhc218ZWxzZXxvcnx0cnl8YXV0b3xlbnVtfG9yX2VxfHR5cGVkZWZ8Yml0YW5kfGV4cGxpY2l0fHByaXZhdGV8dHlwZWlkfGJpdG9yfGV4dGVybnxwcm90ZWN0ZWR8dHlwZW5hbWV8Ym9vbHxmYWxzZXxwdWJsaWN8dW5pb258YnJlYWt8ZmxvYXR8cmVnaXN0ZXJ8dW5zaWduZWR8Y2FzZXxmcm98cmVpbnRlcnByZXQtY2FzdHx1c2luZ3xjYXRjaHxmcmllbmR8cmV0dXJufHZpcnR1YWx8Y2hhcnxnb3RvfHNob3J0fHZvaWR8Y2xhc3N8aWZ8c2lnbmVkfHZvbGF0aWxlfGNvbXBsfGlubGluZXxzaXplb2Z8d2NoYXJfdHxjb25zdHxpbnR8c3RhdGljfHdoaWxlfGNvbnN0LWNhc3R8bG9uZ3xzdGF0aWNfY2FzdHx4b3J8Y29udGludWV8bXV0YWJsZXxzdHJ1Y3R8eG9yX2VxfGRlZmF1bHR8bmFtZXNwYWNlfHN3aXRjaHxkZWxldGV8bmV3fHRlbXBsYXRlfGRvfG5vdHx0aGlzfGZvciIuc3BsaXQoInwiKSksYj1lLmFycmF5VG9NYXAoIk5VTEwiLnNwbGl0KCJ8IikpO3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwvXFwvLiokIn0sKG5ldyBmKS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKiIsbmV4dDoiY29tbWVudCJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDonWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXSd9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDonWyJdLipcXFxcJCcsbmV4dDoicXFzdHJpbmcifSx7dG9rZW46InN0cmluZyIscmVnZXg6IlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10ifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6IlsnXS4qXFxcXCQiLG5leHQ6InFzdHJpbmcifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIwW3hYXVswLTlhLWZBLUZdK1xcYiJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIn0se3Rva2VuOiJjb25zdGFudCIscmVnZXg6IjxbYS16QS1aMC05Ll0rPiJ9LHt0b2tlbjoia2V5d29yZCIscmVnZXg6Iig/OiNpbmNsdWRlfCNwcmFnbWF8I2xpbmV8I2RlZmluZXwjdW5kZWZ8I2lmZGVmfCNlbHNlfCNlbGlmfCNlbmRpZnwjaWZuZGVmKSJ9LHt0b2tlbjpmdW5jdGlvbihjKXtyZXR1cm4gYz09InRoaXMiPyJ2YXJpYWJsZS5sYW5ndWFnZSI6YS5oYXNPd25Qcm9wZXJ0eShjKT8ia2V5d29yZCI6Yi5oYXNPd25Qcm9wZXJ0eShjKT8iY29uc3RhbnQubGFuZ3VhZ2UiOiJpZGVudGlmaWVyIn0scmVnZXg6IlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiJ9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6IiF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT18PXwhPXw8PXw+PXw8PD18Pj49fD4+Pj18PD58PHw+fCF8JiZ8XFx8XFx8fFxcP1xcOnxcXCo9fCU9fFxcKz18XFwtPXwmPXxcXF49fFxcYig/OmlufG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIn0se3Rva2VuOiJwdW5jdHVhdGlvbi5vcGVyYXRvciIscmVnZXg6IlxcP3xcXDp8XFwsfFxcO3xcXC4ifSx7dG9rZW46InBhcmVuLmxwYXJlbiIscmVnZXg6IltbKHtdIn0se3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4OiJbXFxdKX1dIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9XSxjb21tZW50Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj9cXCpcXC8iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV0scXFzdHJpbmc6W3t0b2tlbjoic3RyaW5nIixyZWdleDonKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqPyInLG5leHQ6InN0YXJ0In0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxxc3RyaW5nOlt7dG9rZW46InN0cmluZyIscmVnZXg6Iig/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj8nIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV19LHRoaXMuZW1iZWRSdWxlcyhmLCJkb2MtIixbKG5ldyBmKS5nZXRFbmRSdWxlKCJzdGFydCIpXSl9O2QuaW5oZXJpdHMoaCxnKSxiLmNfY3BwSGlnaGxpZ2h0UnVsZXM9aH0pLGRlZmluZSgiYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxmPWZ1bmN0aW9uKCl7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQuZG9jLnRhZyIscmVnZXg6IkBbXFx3XFxkX10rIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxccysifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiVE9ETyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJbXkBcXCpdKyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiIuIn1dfX07ZC5pbmhlcml0cyhmLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXRTdGFydFJ1bGU9ZnVuY3Rpb24oYSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKig/PVxcKikiLG5leHQ6YX19LHRoaXMuZ2V0RW5kUnVsZT1mdW5jdGlvbihhKXtyZXR1cm57dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiXFwqXFwvIixuZXh0OmF9fX0uY2FsbChmLnByb3RvdHlwZSksYi5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM9Zn0pLGRlZmluZSgiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vcmFuZ2UiKS5SYW5nZSxlPWZ1bmN0aW9uKCl7fTsoKGZ1bmN0aW9uKCl7dGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4vXlxzKyQvLnRlc3QoYSk/L15ccypcfS8udGVzdChiKTohMX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuZ2V0TGluZShiKSxlPWMubWF0Y2goL14oXHMqXH0pLyk7aWYoIWUpcmV0dXJuIDA7dmFyIGY9ZVsxXS5sZW5ndGgsZz1hLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzpiLGNvbHVtbjpmfSk7aWYoIWd8fGcucm93PT1iKXJldHVybiAwO3ZhciBoPXRoaXMuJGdldEluZGVudChhLmdldExpbmUoZy5yb3cpKTthLnJlcGxhY2UobmV3IGQoYiwwLGIsZi0xKSxoKX0sdGhpcy4kZ2V0SW5kZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEubWF0Y2goL14oXHMrKS8pO3JldHVybiBiP2JbMV06IiJ9fSkpLmNhbGwoZS5wcm90b3R5cGUpLGIuTWF0Y2hpbmdCcmFjZU91dGRlbnQ9ZX0pLGRlZmluZSgiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvYmVoYXZpb3VyIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXIsZj1mdW5jdGlvbigpe3RoaXMuYWRkKCJicmFjZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09InsiKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7cmV0dXJuIGchPT0iIj97dGV4dDoieyIrZysifSIsc2VsZWN0aW9uOiExfTp7dGV4dDoie30iLHNlbGVjdGlvbjpbMSwxXX19aWYoZT09In0iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSJ9Iil7dmFyIGs9ZC4kZmluZE9wZW5pbmdCcmFja2V0KCJ9Iix7Y29sdW1uOmguY29sdW1uKzEscm93Omgucm93fSk7aWYoayE9PW51bGwpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19ZWxzZSBpZihlPT0iXG4iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSJ9Iil7dmFyIGw9ZC5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6aC5yb3csY29sdW1uOmguY29sdW1uKzF9KTtpZighbClyZXR1cm4gbnVsbDt2YXIgbT10aGlzLmdldE5leHRMaW5lSW5kZW50KGEsaS5zdWJzdHJpbmcoMCxpLmxlbmd0aC0xKSxkLmdldFRhYlN0cmluZygpKSxuPXRoaXMuJGdldEluZGVudChkLmRvYy5nZXRMaW5lKGwucm93KSk7cmV0dXJue3RleHQ6IlxuIittKyJcbiIrbixzZWxlY3Rpb246WzEsbS5sZW5ndGgsMSxtLmxlbmd0aF19fX19KSx0aGlzLmFkZCgiYnJhY2VzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSJ7Iil7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLmVuZC5jb2x1bW4sZS5lbmQuY29sdW1uKzEpO2lmKGg9PSJ9IilyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KSx0aGlzLmFkZCgicGFyZW5zIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSIoIil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/e3RleHQ6IigiK2crIikiLHNlbGVjdGlvbjohMX06e3RleHQ6IigpIixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSIpIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0iKSIpe3ZhciBrPWQuJGZpbmRPcGVuaW5nQnJhY2tldCgiKSIse2NvbHVtbjpoLmNvbHVtbisxLHJvdzpoLnJvd30pO2lmKGshPT1udWxsKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJwYXJlbnMiLCJkZWxldGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1kLmRvYy5nZXRUZXh0UmFuZ2UoZSk7aWYoIWUuaXNNdWx0aUxpbmUoKSYmZj09IigiKXt2YXIgZz1kLmRvYy5nZXRMaW5lKGUuc3RhcnQucm93KSxoPWcuc3Vic3RyaW5nKGUuc3RhcnQuY29sdW1uKzEsZS5zdGFydC5jb2x1bW4rMik7aWYoaD09IikiKXJldHVybiBlLmVuZC5jb2x1bW4rKyxlfX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0nIicpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtpZihnIT09IiIpcmV0dXJue3RleHQ6JyInK2crJyInLHNlbGVjdGlvbjohMX07dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbi0xLGguY29sdW1uKTtpZihqPT0iXFwiKXJldHVybiBudWxsO3ZhciBrPWQuZ2V0VG9rZW5zKGYuc3RhcnQucm93LGYuc3RhcnQucm93KVswXS50b2tlbnMsbD0wLG0sbj0tMTtmb3IodmFyIG89MDtvPGsubGVuZ3RoO28rKyl7bT1rW29dLG0udHlwZT09InN0cmluZyI/bj0tMTpuPDAmJihuPW0udmFsdWUuaW5kZXhPZignIicpKTtpZihtLnZhbHVlLmxlbmd0aCtsPmYuc3RhcnQuY29sdW1uKWJyZWFrO2wrPWtbb10udmFsdWUubGVuZ3RofWlmKCFtfHxuPDAmJm0udHlwZSE9PSJjb21tZW50IiYmKG0udHlwZSE9PSJzdHJpbmcifHxmLnN0YXJ0LmNvbHVtbiE9PW0udmFsdWUubGVuZ3RoK2wtMSYmbS52YWx1ZS5sYXN0SW5kZXhPZignIicpPT09bS52YWx1ZS5sZW5ndGgtMSkpcmV0dXJue3RleHQ6JyIiJyxzZWxlY3Rpb246WzEsMV19O2lmKG0mJm0udHlwZT09PSJzdHJpbmciKXt2YXIgcD1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihwPT0nIicpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19fSksdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSciJyl7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbisxLGUuc3RhcnQuY29sdW1uKzIpO2lmKGg9PSciJylyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KX07ZC5pbmhlcml0cyhmLGUpLGIuQ3N0eWxlQmVoYXZpb3VyPWZ9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvcmFuZ2UiLCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxmPWEoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGUsZz1iLkZvbGRNb2RlPWZ1bmN0aW9uKCl7fTtkLmluaGVyaXRzKGcsZiksZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj0vKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLyx0aGlzLmZvbGRpbmdTdG9wTWFya2VyPS9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLyx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpLGY9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7aWYoZil7dmFyIGc9Zi5pbmRleDtpZihmWzFdKXJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soYSxmWzFdLGMsZyk7dmFyIGg9YS5nZXRDb21tZW50Rm9sZFJhbmdlKGMsZytmWzBdLmxlbmd0aCk7cmV0dXJuIGguZW5kLmNvbHVtbi09MixofWlmKGIhPT0ibWFya2JlZ2luZW5kIilyZXR1cm47dmFyIGY9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTtpZihmKXt2YXIgZz1mLmluZGV4K2ZbMF0ubGVuZ3RoO2lmKGZbMl0pe3ZhciBoPWEuZ2V0Q29tbWVudEZvbGRSYW5nZShjLGcpO3JldHVybiBoLmVuZC5jb2x1bW4tPTIsaH12YXIgaT17cm93OmMsY29sdW1uOmd9LGo9YS4kZmluZE9wZW5pbmdCcmFja2V0KGZbMV0saSk7aWYoIWopcmV0dXJuO3JldHVybiBqLmNvbHVtbisrLGkuY29sdW1uLS0sZS5mcm9tUG9pbnRzKGosaSl9fX0uY2FsbChnLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGU9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPW51bGwsdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj1udWxsLHRoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpO3JldHVybiB0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGQpPyJzdGFydCI6Yj09Im1hcmtiZWdpbmVuZCImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChkKT8iZW5kIjoiIn0sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBudWxsfSx0aGlzLmluZGVudGF0aW9uQmxvY2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPS9eXHMqLyxmPWIsZz1iLGg9YS5nZXRMaW5lKGIpLGk9Y3x8aC5sZW5ndGgsaj1oLm1hdGNoKGUpWzBdLmxlbmd0aCxrPWEuZ2V0TGVuZ3RoKCk7d2hpbGUoKytiPGspe2g9YS5nZXRMaW5lKGIpO3ZhciBsPWgubWF0Y2goZSlbMF0ubGVuZ3RoO2lmKGw9PWgubGVuZ3RoKWNvbnRpbnVlO2lmKGw8PWopYnJlYWs7Zz1ifWlmKGc+Zil7dmFyIG09YS5nZXRMaW5lKGcpLmxlbmd0aDtyZXR1cm4gbmV3IGQoZixpLGcsbSl9fSx0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2s9ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGY9e3JvdzpjLGNvbHVtbjplKzF9LGc9YS4kZmluZENsb3NpbmdCcmFja2V0KGIsZik7aWYoIWcpcmV0dXJuO3ZhciBoPWEuZm9sZFdpZGdldHNbZy5yb3ddO3JldHVybiBoPT1udWxsJiYoaD10aGlzLmdldEZvbGRXaWRnZXQoYSxnLnJvdykpLGg9PSJzdGFydCImJihnLnJvdy0tLGcuY29sdW1uPWEuZ2V0TGluZShnLnJvdykubGVuZ3RoKSxkLmZyb21Qb2ludHMoZixnKX19KSkuY2FsbChlLnByb3RvdHlwZSl9KSxmdW5jdGlvbigpe3dpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLGZ1bmN0aW9uKGEpe3dpbmRvdy5hY2V8fCh3aW5kb3cuYWNlPXt9KTtmb3IodmFyIGIgaW4gYSlhLmhhc093blByb3BlcnR5KGIpJiYoYWNlW2JdPWFbYl0pfSl9KCk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-groovy-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCdhY2UvbW9kZS9ncm9vdnknLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL2phdmFzY3JpcHQnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS9ncm9vdnlfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgSmF2YVNjcmlwdE1vZGUgPSByZXF1aXJlKCIuL2phdmFzY3JpcHQiKS5Nb2RlOwp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOwp2YXIgR3Jvb3Z5SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2dyb292eV9oaWdobGlnaHRfcnVsZXMiKS5Hcm9vdnlIaWdobGlnaHRSdWxlczsKCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7CiAgICBKYXZhU2NyaXB0TW9kZS5jYWxsKHRoaXMpOwogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgR3Jvb3Z5SGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsKfTsKb29wLmluaGVyaXRzKE1vZGUsIEphdmFTY3JpcHRNb2RlKTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmNyZWF0ZVdvcmtlciA9IGZ1bmN0aW9uKHNlc3Npb24pIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH07Cgp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsKCmV4cG9ydHMuTW9kZSA9IE1vZGU7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2phdmFzY3JpcHQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHQnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgJ2FjZS9yYW5nZScsICdhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQnLCAnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZScsICdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsKdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsKdmFyIEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiKS5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXM7CnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Owp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOwp2YXIgV29ya2VyQ2xpZW50ID0gcmVxdWlyZSgiLi4vd29ya2VyL3dvcmtlcl9jbGllbnQiKS5Xb3JrZXJDbGllbnQ7CnZhciBDc3R5bGVCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2JlaGF2aW91ci9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXI7CnZhciBDU3R5bGVGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZTsKCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKG5ldyBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsKICAgIHRoaXMuJG91dGRlbnQgPSBuZXcgTWF0Y2hpbmdCcmFjZU91dGRlbnQoKTsKICAgIHRoaXMuJGJlaGF2aW91ciA9IG5ldyBDc3R5bGVCZWhhdmlvdXIoKTsKICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IENTdHlsZUZvbGRNb2RlKCk7Cn07Cm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7CgooZnVuY3Rpb24oKSB7CgoKICAgIHRoaXMudG9nZ2xlQ29tbWVudExpbmVzID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgc3RhcnRSb3csIGVuZFJvdykgewogICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsKICAgICAgICB2YXIgcmUgPSAvXihccyopXC9cLy87CgogICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykgewogICAgICAgICAgICBpZiAoIXJlLnRlc3QoZG9jLmdldExpbmUoaSkpKSB7CiAgICAgICAgICAgICAgICBvdXRkZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKG91dGRlbnQpIHsKICAgICAgICAgICAgdmFyIGRlbGV0ZVJhbmdlID0gbmV3IFJhbmdlKDAsIDAsIDAsIDApOwogICAgICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUoaSk7CiAgICAgICAgICAgICAgICB2YXIgbSA9IGxpbmUubWF0Y2gocmUpOwogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2Uuc3RhcnQucm93ID0gaTsKICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLmVuZC5yb3cgPSBpOwogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLmNvbHVtbiA9IG1bMF0ubGVuZ3RoOwogICAgICAgICAgICAgICAgZG9jLnJlcGxhY2UoZGVsZXRlUmFuZ2UsIG1bMV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBkb2MuaW5kZW50Um93cyhzdGFydFJvdywgZW5kUm93LCAiLy8iKTsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7CiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsKCiAgICAgICAgdmFyIHRva2VuaXplZExpbmUgPSB0aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhsaW5lLCBzdGF0ZSk7CiAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplZExpbmUudG9rZW5zOwogICAgICAgIHZhciBlbmRTdGF0ZSA9IHRva2VuaXplZExpbmUuc3RhdGU7CgogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7CiAgICAgICAgICAgIHJldHVybiBpbmRlbnQ7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmIChzdGF0ZSA9PSAic3RhcnQiIHx8IHN0YXRlID09ICJyZWdleF9hbGxvd2VkIikgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eLiooPzpcYmNhc2VcYi4qXDp8W1x7XChcW10pXHMqJC8pOwogICAgICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgICAgIGluZGVudCArPSB0YWI7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09ICJkb2Mtc3RhcnQiKSB7CiAgICAgICAgICAgIGlmIChlbmRTdGF0ZSA9PSAic3RhcnQiIHx8IHN0YXRlID09ICJyZWdleF9hbGxvd2VkIikgewogICAgICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL15ccyooXC8/KVwqLyk7CiAgICAgICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICAgICAgaWYgKG1hdGNoWzFdKSB7CiAgICAgICAgICAgICAgICAgICAgaW5kZW50ICs9ICIgIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGluZGVudCArPSAiKiAiOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaW5kZW50OwogICAgfTsKCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCBpbnB1dCkgewogICAgICAgIHJldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChsaW5lLCBpbnB1dCk7CiAgICB9OwoKICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCByb3cpIHsKICAgICAgICB0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGRvYywgcm93KTsKICAgIH07CiAgICAKICAgIHRoaXMuY3JlYXRlV29ya2VyID0gZnVuY3Rpb24oc2Vzc2lvbikgewogICAgICAgIHZhciB3b3JrZXIgPSBuZXcgV29ya2VyQ2xpZW50KFsiYWNlIl0sICJ3b3JrZXItamF2YXNjcmlwdC5qcyIsICJhY2UvbW9kZS9qYXZhc2NyaXB0X3dvcmtlciIsICJKYXZhU2NyaXB0V29ya2VyIik7CiAgICAgICAgd29ya2VyLmF0dGFjaFRvRG9jdW1lbnQoc2Vzc2lvbi5nZXREb2N1bWVudCgpKTsKICAgICAgICAgICAgCiAgICAgICAgd29ya2VyLm9uKCJqc2xpbnQiLCBmdW5jdGlvbihyZXN1bHRzKSB7CiAgICAgICAgICAgIHZhciBlcnJvcnMgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHJlc3VsdHMuZGF0YS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIGVycm9yID0gcmVzdWx0cy5kYXRhW2ldOwogICAgICAgICAgICAgICAgaWYgKGVycm9yKQogICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgcm93OiBlcnJvci5saW5lLTEsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogZXJyb3IuY2hhcmFjdGVyLTEsCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGVycm9yLnJlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogIndhcm5pbmciLAogICAgICAgICAgICAgICAgICAgICAgICBsaW50OiBlcnJvcgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlc3Npb24uc2V0QW5ub3RhdGlvbnMoZXJyb3JzKTsKICAgICAgICB9KTsKICAgICAgICAKICAgICAgICB3b3JrZXIub24oIm5hcmNpc3N1cyIsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgc2Vzc2lvbi5zZXRBbm5vdGF0aW9ucyhbZS5kYXRhXSk7CiAgICAgICAgfSk7CiAgICAgICAgCiAgICAgICAgd29ya2VyLm9uKCJ0ZXJtaW5hdGUiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgc2Vzc2lvbi5jbGVhckFubm90YXRpb25zKCk7CiAgICAgICAgfSk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHdvcmtlcjsKICAgIH07Cgp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsKCmV4cG9ydHMuTW9kZSA9IE1vZGU7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqICAgICAgTWloYWkgU3VjYW4gPG1paGFpIERPVCBzdWNhbiBBVCBnbWFpbCBET1QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9sYW5nJywgJ2FjZS91bmljb2RlJywgJ2FjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOwp2YXIgdW5pY29kZSA9IHJlcXVpcmUoIi4uL3VuaWNvZGUiKTsKdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIikuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzOwp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsKCnZhciBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsKCiAgICAvLyBzZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzCiAgICB2YXIgZ2xvYmFscyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgLy8gQ29uc3RydWN0b3JzCiAgICAgICAgKCJBcnJheXxCb29sZWFufERhdGV8RnVuY3Rpb258SXRlcmF0b3J8TnVtYmVyfE9iamVjdHxSZWdFeHB8U3RyaW5nfFByb3h5fCIgKwogICAgICAvLyBFNFgKICAgICAgICAgIk5hbWVzcGFjZXxRTmFtZXxYTUx8WE1MTGlzdHwiICsKICAgICAgICAgIkFycmF5QnVmZmVyfEZsb2F0MzJBcnJheXxGbG9hdDY0QXJyYXl8SW50MTZBcnJheXxJbnQzMkFycmF5fEludDhBcnJheXwiICsKICAgICAgICAgIlVpbnQxNkFycmF5fFVpbnQzMkFycmF5fFVpbnQ4QXJyYXl8VWludDhDbGFtcGVkQXJyYXl8IiArCiAgICAgIC8vIEVycm9ycwogICAgICAgICJFcnJvcnxFdmFsRXJyb3J8SW50ZXJuYWxFcnJvcnxSYW5nZUVycm9yfFJlZmVyZW5jZUVycm9yfFN0b3BJdGVyYXRpb258IiArCiAgICAgICAgIlN5bnRheEVycm9yfFR5cGVFcnJvcnxVUklFcnJvcnwiICsKICAgICAgLy8gIE5vbi1jb25zdHJ1Y3RvciBmdW5jdGlvbnMKICAgICAgICAiZGVjb2RlVVJJfGRlY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZW5jb2RlVVJJQ29tcG9uZW50fGV2YWx8aXNGaW5pdGV8IiArCiAgICAgICAgImlzTmFOfHBhcnNlRmxvYXR8cGFyc2VJbnR8IiArCiAgICAgIC8vIE90aGVyCiAgICAgICAgIkpTT058TWF0aHwiICsKICAgICAgLy8gUHNldWRvCiAgICAgICAgInRoaXN8YXJndW1lbnRzfHByb3RvdHlwZXx3aW5kb3d8ZG9jdW1lbnQiCiAgICAgICkuc3BsaXQoInwiKQogICAgKTsKCiAgICB2YXIga2V5d29yZHMgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCJicmVha3xjYXNlfGNhdGNofGNvbnRpbnVlfGRlZmF1bHR8ZGVsZXRlfGRvfGVsc2V8ZmluYWxseXxmb3J8ZnVuY3Rpb258IiArCiAgICAgICAgImlmfGlufGluc3RhbmNlb2Z8bmV3fHJldHVybnxzd2l0Y2h8dGhyb3d8dHJ5fHR5cGVvZnxsZXR8dmFyfHdoaWxlfHdpdGh8IiArCiAgICAgICAgImNvbnN0fHlpZWxkfGltcG9ydHxnZXR8c2V0Iikuc3BsaXQoInwiKQogICAgKTsKCiAgICAvLyBrZXl3b3JkcyB3aGljaCBjYW4gYmUgZm9sbG93ZWQgYnkgcmVndWxhciBleHByZXNzaW9ucwogICAgdmFyIGt3QmVmb3JlUmUgPSAiY2FzZXxkb3xlbHNlfGZpbmFsbHl8aW58aW5zdGFuY2VvZnxyZXR1cm58dGhyb3d8dHJ5fHR5cGVvZnx5aWVsZCI7CgogICAgdmFyIGRlcHJlY2F0ZWQgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCJfX3BhcmVudF9ffF9fY291bnRfX3xlc2NhcGV8dW5lc2NhcGV8d2l0aHxfX3Byb3RvX18iKS5zcGxpdCgifCIpCiAgICApOwoKICAgIHZhciBkZWZpbml0aW9ucyA9IGxhbmcuYXJyYXlUb01hcCgoImNvbnN0fGxldHx2YXJ8ZnVuY3Rpb24iKS5zcGxpdCgifCIpKTsKCiAgICB2YXIgYnVpbGRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoIm51bGx8SW5maW5pdHl8TmFOfHVuZGVmaW5lZCIpLnNwbGl0KCJ8IikKICAgICk7CgogICAgdmFyIGZ1dHVyZVJlc2VydmVkID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgiY2xhc3N8ZW51bXxleHRlbmRzfHN1cGVyfGV4cG9ydHxpbXBsZW1lbnRzfHByaXZhdGV8IiArCiAgICAgICAgInB1YmxpY3xpbnRlcmZhY2V8cGFja2FnZXxwcm90ZWN0ZWR8c3RhdGljIikuc3BsaXQoInwiKQogICAgKTsKCiAgICAvLyBUT0RPOiBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMKICAgIHZhciBpZGVudGlmaWVyUmUgPSAiWyIgKyB1bmljb2RlLnBhY2thZ2VzLkwgKyAiXFwkX11bIiAKICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTAogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5NbiArIHVuaWNvZGUucGFja2FnZXMuTWMKICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTmQKICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuUGMgKyAiXFwkX10qXFxiIjsKICAgICAgICAKICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcy4gVXNlICg/OikgaW5zdGVhZC4KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQKCiAgICB0aGlzLiRydWxlcyA9IHsKICAgICAgICAic3RhcnQiIDogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcLy4qJCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0IiksCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJwogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydAogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdLipcXFxcJCcsCiAgICAgICAgICAgICAgICBuZXh0IDogInFxc3RyaW5nIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXS4qXFxcXCQiLAogICAgICAgICAgICAgICAgbmV4dCA6ICJxc3RyaW5nIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaGV4CiAgICAgICAgICAgICAgICByZWdleCA6ICIwW3hYXVswLTlhLWZBLUZdK1xcYiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGZsb2F0CiAgICAgICAgICAgICAgICByZWdleCA6ICJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiBbImtleXdvcmQuZGVmaW5pdGlvbiIsICJ0ZXh0IiwgImVudGl0eS5uYW1lLmZ1bmN0aW9uIl0sCiAgICAgICAgICAgICAgICByZWdleCA6ICIoZnVuY3Rpb24pKFxccyspKCIgKyBpZGVudGlmaWVyUmUgKyAiKSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiIsCiAgICAgICAgICAgICAgICByZWdleCA6ICIoPzp0cnVlfGZhbHNlKVxcYiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICIoPzoiICsga3dCZWZvcmVSZSArICIpXFxiIiwKICAgICAgICAgICAgICAgIG5leHQgOiAicmVnZXhfYWxsb3dlZCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWxzLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS5sYW5ndWFnZSI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVwcmVjYXRlZC5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZWZpbml0aW9ucy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAia2V5d29yZC5kZWZpbml0aW9uIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYnVpbGRpbkNvbnN0YW50cy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZ1dHVyZVJlc2VydmVkLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkLmlsbGVnYWwiOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09ICJkZWJ1Z2dlciIpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcmVnZXggOiBpZGVudGlmaWVyUmUKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsCiAgICAgICAgICAgICAgICByZWdleCA6ICIhfFxcJHwlfCZ8XFwqfFxcLVxcLXxcXC18XFwrXFwrfFxcK3x+fD09PXw9PXw9fCE9fCE9PXw8PXw+PXw8PD18Pj49fD4+Pj18PD58PHw+fCF8JiZ8XFx8XFx8fFxcP1xcOnxcXCo9fCU9fFxcKz18XFwtPXwmPXxcXF49fFxcYig/OmlufGluc3RhbmNlb2Z8bmV3fGRlbGV0ZXx0eXBlb2Z8dm9pZCkiLAogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAicHVuY3R1YXRpb24ub3BlcmF0b3IiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFw/fFxcOnxcXCx8XFw7fFxcLiIsCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5scGFyZW4iLAogICAgICAgICAgICAgICAgcmVnZXggOiAiW1soe10iLAogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIltcXF0pfV0iCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvPT8iLAogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW46ICJjb21tZW50IiwKICAgICAgICAgICAgICAgIHJlZ2V4OiAiXiMhLiokIiAKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIgogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAvLyByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBvbmx5IGFsbG93ZWQgYWZ0ZXIgY2VydGFpbiB0b2tlbnMuIFRoaXMKICAgICAgICAvLyBtYWtlcyBzdXJlIHdlIGRvbid0IG1peCB1cCByZWdleHBzIHdpdGggdGhlIGRpdmlzb24gb3BlcmF0b3IKICAgICAgICAicmVnZXhfYWxsb3dlZCI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudAogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwKICAgICAgICAgICAgICAgIG5leHQgOiAiY29tbWVudF9yZWdleF9hbGxvd2VkIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcLy4qJCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwIiwKICAgICAgICAgICAgICAgIHJlZ2V4OiAiXFwvIiwKICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleCIsCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5IHJldHVybiB0byB0aGUgc3RhcnQgbW9kZSB3aXRob3V0IG1hdGNoaW5nCiAgICAgICAgICAgICAgICAvLyBhbnl0aGluZwogICAgICAgICAgICAgICAgdG9rZW46ICJlbXB0eSIsIAogICAgICAgICAgICAgICAgcmVnZXg6ICIiLAogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0IgogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAicmVnZXgiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuOiAicmVnZXhwLmtleXdvcmQub3BlcmF0b3IiLAogICAgICAgICAgICAgICAgcmVnZXg6ICJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXgiCiAgICAgICAgICAgIH0sIHsKCQkJCS8vIGZsYWcKICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cCIsIAogICAgICAgICAgICAgICAgcmVnZXg6ICIvXFx3KiIsCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiLAogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUgCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cCIsCiAgICAgICAgICAgICAgICByZWdleDogIlteXFxcXC9cXFtdKyIsCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXgiLAogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyIsCiAgICAgICAgICAgICAgICByZWdleDogIlxcWyIsCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIiwKICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCAKICAgICAgICAgICAgICAgIHJlZ2V4OiAiIiwKICAgICAgICAgICAgICAgIG5leHQ6ICJzdGFydCIgCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuOiAicmVnZXhwLmtleXdvcmQub3BlcmF0b3IiLAogICAgICAgICAgICAgICAgcmVnZXg6ICJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwKICAgICAgICAgICAgICAgIHJlZ2V4OiAiXSIsCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXgiLAogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyIsCiAgICAgICAgICAgICAgICByZWdleDogIlteXFxcXFxcXV0rIiwKICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiLAogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW46ICJlbXB0eSIsIAogICAgICAgICAgICAgICAgcmVnZXg6ICIiLAogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0IiAKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgImNvbW1lbnRfcmVnZXhfYWxsb3dlZCIgOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQKICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICBuZXh0IDogInJlZ2V4X2FsbG93ZWQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIgogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiY29tbWVudCIgOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQKICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyIKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInFxc3RyaW5nIiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogJyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJywKICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKycKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInFzdHJpbmciIDogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqPyciLAogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJwogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfTsKICAgIAogICAgdGhpcy5lbWJlZFJ1bGVzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgImRvYy0iLAogICAgICAgIFsgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldEVuZFJ1bGUoInN0YXJ0IikgXSk7Cn07Cgpvb3AuaW5oZXJpdHMoSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOwoKZXhwb3J0cy5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXM7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOwoKdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuJHJ1bGVzID0gewogICAgICAgICJzdGFydCIgOiBbIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MudGFnIiwKICAgICAgICAgICAgcmVnZXggOiAiQFtcXHdcXGRfXSsiIC8vIFRPRE86IGZpeCBlbWFpbCBhZGRyZXNzZXMKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICJcXHMrIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlRPRE8iCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiW15AXFwqXSsiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiLiIKICAgICAgICB9XQogICAgfTsKfTsKCm9vcC5pbmhlcml0cyhEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5nZXRTdGFydFJ1bGUgPSBmdW5jdGlvbihzdGFydCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gZG9jIGNvbW1lbnQKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICJcXC9cXCooPz1cXCopIiwKICAgICAgICAgICAgbmV4dCAgOiBzdGFydAogICAgICAgIH07CiAgICB9OwogICAgCiAgICB0aGlzLmdldEVuZFJ1bGUgPSBmdW5jdGlvbiAoc3RhcnQpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsIC8vIGNsb3NpbmcgY29tbWVudAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlxcKlxcLyIsCiAgICAgICAgICAgIG5leHQgIDogc3RhcnQKICAgICAgICB9OwogICAgfTsKCn0pLmNhbGwoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLnByb3RvdHlwZSk7CgpleHBvcnRzLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsKCn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsKCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IGZ1bmN0aW9uKCkge307CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihsaW5lLCBpbnB1dCkgewogICAgICAgIGlmICghIC9eXHMrJC8udGVzdChsaW5lKSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgICByZXR1cm4gL15ccypcfS8udGVzdChpbnB1dCk7CiAgICB9OwoKICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihkb2MsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocm93KTsKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKlx9KS8pOwoKICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDsKCiAgICAgICAgdmFyIGNvbHVtbiA9IG1hdGNoWzFdLmxlbmd0aDsKICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gZG9jLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn0pOwoKICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcyB8fCBvcGVuQnJhY2VQb3Mucm93ID09IHJvdykgcmV0dXJuIDA7CgogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOwogICAgICAgIGRvYy5yZXBsYWNlKG5ldyBSYW5nZShyb3csIDAsIHJvdywgY29sdW1uLTEpLCBpbmRlbnQpOwogICAgfTsKCiAgICB0aGlzLiRnZXRJbmRlbnQgPSBmdW5jdGlvbihsaW5lKSB7CiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAiIjsKICAgIH07Cgp9KS5jYWxsKE1hdGNoaW5nQnJhY2VPdXRkZW50LnByb3RvdHlwZSk7CgpleHBvcnRzLk1hdGNoaW5nQnJhY2VPdXRkZW50ID0gTWF0Y2hpbmdCcmFjZU91dGRlbnQ7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS93b3JrZXIvd29ya2VyX2NsaWVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9ldmVudF9lbWl0dGVyJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXI7Cgp2YXIgV29ya2VyQ2xpZW50ID0gZnVuY3Rpb24odG9wTGV2ZWxOYW1lc3BhY2VzLCBwYWNrYWdlZEpzLCBtb2QsIGNsYXNzbmFtZSkgewoKICAgIHRoaXMuY2hhbmdlTGlzdGVuZXIgPSB0aGlzLmNoYW5nZUxpc3RlbmVyLmJpbmQodGhpcyk7CgogICAgaWYgKG1vZHVsZS5wYWNrYWdlZCkgewogICAgICAgIHZhciBiYXNlID0gdGhpcy4kZ3Vlc3NCYXNlUGF0aCgpOwogICAgICAgIHRoaXMuJHdvcmtlciA9IG5ldyBXb3JrZXIoYmFzZSArIHBhY2thZ2VkSnMpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgdmFyIHdvcmtlclVybCA9IHRoaXMuJG5vcm1hbGl6ZVBhdGgocmVxdWlyZS5uYW1lVG9VcmwoImFjZS93b3JrZXIvd29ya2VyIiwgbnVsbCwgIl8iKSk7CiAgICAgICAgdGhpcy4kd29ya2VyID0gbmV3IFdvcmtlcih3b3JrZXJVcmwpOwoKICAgICAgICB2YXIgdGxucyA9IHt9OwogICAgICAgIGZvciAodmFyIGk9MDsgaTx0b3BMZXZlbE5hbWVzcGFjZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIG5zID0gdG9wTGV2ZWxOYW1lc3BhY2VzW2ldOwogICAgICAgICAgICB2YXIgcGF0aCA9IHRoaXMuJG5vcm1hbGl6ZVBhdGgocmVxdWlyZS5uYW1lVG9VcmwobnMsIG51bGwsICJfIikucmVwbGFjZSgvLmpzJC8sICIiKSk7CgogICAgICAgICAgICB0bG5zW25zXSA9IHBhdGg7CiAgICAgICAgfQogICAgfQoKICAgIHRoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7CiAgICAgICAgaW5pdCA6IHRydWUsCiAgICAgICAgdGxuczogdGxucywKICAgICAgICBtb2R1bGU6IG1vZCwKICAgICAgICBjbGFzc25hbWU6IGNsYXNzbmFtZQogICAgfSk7CgogICAgdGhpcy5jYWxsYmFja0lkID0gMTsKICAgIHRoaXMuY2FsbGJhY2tzID0ge307CgogICAgdmFyIF9zZWxmID0gdGhpczsKICAgIHRoaXMuJHdvcmtlci5vbmVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgIHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUubG9nICYmIGNvbnNvbGUubG9nKGUpOwogICAgICAgIHRocm93IGU7CiAgICB9OwogICAgdGhpcy4kd29ya2VyLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICB2YXIgbXNnID0gZS5kYXRhOwogICAgICAgIHN3aXRjaChtc2cudHlwZSkgewogICAgICAgICAgICBjYXNlICJsb2ciOgogICAgICAgICAgICAgICAgd2luZG93LmNvbnNvbGUgJiYgY29uc29sZS5sb2cgJiYgY29uc29sZS5sb2cobXNnLmRhdGEpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICJldmVudCI6CiAgICAgICAgICAgICAgICBfc2VsZi5fZW1pdChtc2cubmFtZSwge2RhdGE6IG1zZy5kYXRhfSk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgImNhbGwiOgogICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gX3NlbGYuY2FsbGJhY2tzW21zZy5pZF07CiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhtc2cuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIF9zZWxmLmNhbGxiYWNrc1ttc2cuaWRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfTsKfTsKCihmdW5jdGlvbigpewoKICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsKCiAgICB0aGlzLiRub3JtYWxpemVQYXRoID0gZnVuY3Rpb24ocGF0aCkgewogICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL15bYS16XSs6XC9cL1teXC9dK1wvLywgIiIpOyAvLyBSZW1vdmUgZG9tYWluIG5hbWUgYW5kIHJlYnVpbGQgaXQKICAgICAgICBwYXRoID0gbG9jYXRpb24ucHJvdG9jb2wgKyAiLy8iICsgbG9jYXRpb24uaG9zdAogICAgICAgICAgICAvLyBwYXRocyBzdGFydGluZyB3aXRoIGEgc2xhc2ggYXJlIHJlbGF0aXZlIHRvIHRoZSByb290IChob3N0KQogICAgICAgICAgICArIChwYXRoLmNoYXJBdCgwKSA9PSAiLyIgPyAiIiA6IGxvY2F0aW9uLnBhdGhuYW1lLnJlcGxhY2UoL1wvW15cL10qJC8sICIiKSkKICAgICAgICAgICAgKyAiLyIgKyBwYXRoLnJlcGxhY2UoL15bXC9dKy8sICIiKTsKICAgICAgICByZXR1cm4gcGF0aDsKICAgIH07CgogICAgdGhpcy4kZ3Vlc3NCYXNlUGF0aCA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmIChyZXF1aXJlLmFjZUJhc2VVcmwpCiAgICAgICAgICAgIHJldHVybiByZXF1aXJlLmFjZUJhc2VVcmw7CgogICAgICAgIHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpOwogICAgICAgIGZvciAodmFyIGk9MDsgaTxzY3JpcHRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBzY3JpcHQgPSBzY3JpcHRzW2ldOwoKICAgICAgICAgICAgdmFyIGJhc2UgPSBzY3JpcHQuZ2V0QXR0cmlidXRlKCJkYXRhLWFjZS1iYXNlIik7CiAgICAgICAgICAgIGlmIChiYXNlKQogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UucmVwbGFjZSgvXC8qJC8sICIvIik7CgogICAgICAgICAgICB2YXIgc3JjID0gc2NyaXB0LnNyYyB8fCBzY3JpcHQuZ2V0QXR0cmlidXRlKCJzcmMiKTsKICAgICAgICAgICAgaWYgKCFzcmMpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBtID0gc3JjLm1hdGNoKC9eKD86KC4qXC8pYWNlXC5qc3woLipcLylhY2UoLXVuY29tcHJlc3NlZCk/KC1ub2NvbmZsaWN0KT9cLmpzKSg/Olw/fCQpLyk7CiAgICAgICAgICAgIGlmIChtKQogICAgICAgICAgICAgICAgcmV0dXJuIG1bMV0gfHwgbVsyXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICIiOwogICAgfTsKCiAgICB0aGlzLnRlcm1pbmF0ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2VtaXQoInRlcm1pbmF0ZSIsIHt9KTsKICAgICAgICB0aGlzLiR3b3JrZXIudGVybWluYXRlKCk7CiAgICAgICAgdGhpcy4kd29ya2VyID0gbnVsbDsKICAgICAgICB0aGlzLiRkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7CiAgICAgICAgdGhpcy4kZG9jID0gbnVsbDsKICAgIH07CgogICAgdGhpcy5zZW5kID0gZnVuY3Rpb24oY21kLCBhcmdzKSB7CiAgICAgICAgdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtjb21tYW5kOiBjbWQsIGFyZ3M6IGFyZ3N9KTsKICAgIH07CgogICAgdGhpcy5jYWxsID0gZnVuY3Rpb24oY21kLCBhcmdzLCBjYWxsYmFjaykgewogICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgaWQgPSB0aGlzLmNhbGxiYWNrSWQrKzsKICAgICAgICAgICAgdGhpcy5jYWxsYmFja3NbaWRdID0gY2FsbGJhY2s7CiAgICAgICAgICAgIGFyZ3MucHVzaChpZCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuc2VuZChjbWQsIGFyZ3MpOwogICAgfTsKCiAgICB0aGlzLmVtaXQgPSBmdW5jdGlvbihldmVudCwgZGF0YSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIC8vIGZpcmVmb3ggcmVmdXNlcyB0byBjbG9uZSBvYmplY3RzIHdoaWNoIGhhdmUgZnVuY3Rpb24gcHJvcGVydGllcwogICAgICAgICAgICAvLyBUT0RPOiBjbGVhbnVwIGV2ZW50CiAgICAgICAgICAgIHRoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7ZXZlbnQ6IGV2ZW50LCBkYXRhOiB7ZGF0YTogZGF0YS5kYXRhfX0pOwogICAgICAgIH0KICAgICAgICBjYXRjaChleCkge30KICAgIH07CgogICAgdGhpcy5hdHRhY2hUb0RvY3VtZW50ID0gZnVuY3Rpb24oZG9jKSB7CiAgICAgICAgaWYodGhpcy4kZG9jKQogICAgICAgICAgICB0aGlzLnRlcm1pbmF0ZSgpOwoKICAgICAgICB0aGlzLiRkb2MgPSBkb2M7CiAgICAgICAgdGhpcy5jYWxsKCJzZXRWYWx1ZSIsIFtkb2MuZ2V0VmFsdWUoKV0pOwogICAgICAgIGRvYy5vbigiY2hhbmdlIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7CiAgICB9OwoKICAgIHRoaXMuY2hhbmdlTGlzdGVuZXIgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgZS5yYW5nZSA9IHsKICAgICAgICAgICAgc3RhcnQ6IGUuZGF0YS5yYW5nZS5zdGFydCwKICAgICAgICAgICAgZW5kOiBlLmRhdGEucmFuZ2UuZW5kCiAgICAgICAgfTsKICAgICAgICB0aGlzLmVtaXQoImNoYW5nZSIsIGUpOwogICAgfTsKCn0pLmNhbGwoV29ya2VyQ2xpZW50LnByb3RvdHlwZSk7CgpleHBvcnRzLldvcmtlckNsaWVudCA9IFdvcmtlckNsaWVudDsKCn0pOwovKiB2aW06dHM9NDpzdHM9NDpzdz00OgogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIENocmlzIFNwZW5jZXIgPGNocmlzLmFnLnNwZW5jZXIgQVQgZ29vZ2xlbWFpbCBET1QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9iZWhhdmlvdXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7CnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCcuLi9iZWhhdmlvdXInKS5CZWhhdmlvdXI7Cgp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gZnVuY3Rpb24gKCkgewoKICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgewogICAgICAgIGlmICh0ZXh0ID09ICd7JykgewogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7CiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7JyArIHNlbGVjdGVkICsgJ30nLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3t9JywKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICd9JykgewogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsKICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsKICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsKICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnfScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsKICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAiXG4iKSB7CiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9JykgewogICAgICAgICAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IHNlc3Npb24uZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiBjdXJzb3Iucm93LCBjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxfSk7CiAgICAgICAgICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcykKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CgogICAgICAgICAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQoc3RhdGUsIGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUubGVuZ3RoIC0gMSksIHNlc3Npb24uZ2V0VGFiU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgdmFyIG5leHRfaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOwoKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xuJyArIGluZGVudCArICdcbicgKyBuZXh0X2luZGVudCwKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCBpbmRlbnQubGVuZ3RoLCAxLCBpbmRlbnQubGVuZ3RoXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoImJyYWNlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7CiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsKICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJ3snKSB7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2UuZW5kLmNvbHVtbiwgcmFuZ2UuZW5kLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9JykgewogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOwogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoInBhcmVucyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7CiAgICAgICAgaWYgKHRleHQgPT0gJygnKSB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7CiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygnICsgc2VsZWN0ZWQgKyAnKScsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCknLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJyknKSB7CiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgewogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCcpJywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOwogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoInBhcmVucyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7CiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsKICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJygnKSB7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgewogICAgICAgIGlmICh0ZXh0ID09ICciJykgewogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7CiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICciJyArIHNlbGVjdGVkICsgJyInLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsKICAgICAgICAgICAgICAgIHZhciBsZWZ0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4tMSwgY3Vyc29yLmNvbHVtbik7CgogICAgICAgICAgICAgICAgLy8gV2UncmUgZXNjYXBlZC4KICAgICAgICAgICAgICAgIGlmIChsZWZ0Q2hhciA9PSAnXFwnKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gRmluZCB3aGF0IHRva2VuIHdlJ3JlIGluc2lkZS4KICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzZXNzaW9uLmdldFRva2VucyhzZWxlY3Rpb24uc3RhcnQucm93LCBzZWxlY3Rpb24uc3RhcnQucm93KVswXS50b2tlbnM7CiAgICAgICAgICAgICAgICB2YXIgY29sID0gMCwgdG9rZW47CiAgICAgICAgICAgICAgICB2YXIgcXVvdGVwb3MgPSAtMTsgLy8gVHJhY2sgd2hldGhlciB3ZSdyZSBpbnNpZGUgYW4gb3BlbiBxdW90ZS4KCiAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRva2Vucy5sZW5ndGg7IHgrKykgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW3hdOwogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IC0xOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocXVvdGVwb3MgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IHRva2VuLnZhbHVlLmluZGV4T2YoJyInKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0b2tlbi52YWx1ZS5sZW5ndGggKyBjb2wpID4gc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbikgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29sICs9IHRva2Vuc1t4XS52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gVHJ5IGFuZCBiZSBzbWFydCBhYm91dCB3aGVuIHdlIGF1dG8gaW5zZXJ0LgogICAgICAgICAgICAgICAgaWYgKCF0b2tlbiB8fCAocXVvdGVwb3MgPCAwICYmIHRva2VuLnR5cGUgIT09ICJjb21tZW50IiAmJiAodG9rZW4udHlwZSAhPT0gInN0cmluZyIgfHwgKChzZWxlY3Rpb24uc3RhcnQuY29sdW1uICE9PSB0b2tlbi52YWx1ZS5sZW5ndGgrY29sLTEpICYmIHRva2VuLnZhbHVlLmxhc3RJbmRleE9mKCciJykgPT09IHRva2VuLnZhbHVlLmxlbmd0aC0xKSkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJyIiJywKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwxXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gJiYgdG9rZW4udHlwZSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaW5wdXQgYW5kIG1vdmUgcmlnaHQgb25lIGlmIHdlJ3JlIHR5cGluZyBvdmVyIHRoZSBjbG9zaW5nIHF1b3RlLgogICAgICAgICAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7CiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsKICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJyInKSB7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCn0Kb29wLmluaGVyaXRzKENzdHlsZUJlaGF2aW91ciwgQmVoYXZpb3VyKTsKCmV4cG9ydHMuQ3N0eWxlQmVoYXZpb3VyID0gQ3N0eWxlQmVoYXZpb3VyOwp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7CnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7CnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOwoKdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307Cm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IC8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvOwogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IC9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLzsKICAgIAogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXg7CgogICAgICAgICAgICBpZiAobWF0Y2hbMV0pCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKHNlc3Npb24sIG1hdGNoWzFdLCByb3csIGkpOwoKICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSArIG1hdGNoWzBdLmxlbmd0aCk7CiAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsKICAgICAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGZvbGRTdHlsZSAhPT0gIm1hcmtiZWdpbmVuZCIpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDsKCiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkgewogICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSk7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiByb3csIGNvbHVtbjogaX07CiAgICAgICAgICAgIHZhciBzdGFydCA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldChtYXRjaFsxXSwgZW5kKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICghc3RhcnQpCiAgICAgICAgICAgICAgICByZXR1cm47CgogICAgICAgICAgICBzdGFydC5jb2x1bW4rKzsKICAgICAgICAgICAgZW5kLmNvbHVtbi0tOwoKICAgICAgICAgICAgcmV0dXJuICBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOwogICAgICAgIH0KICAgIH07CiAgICAKfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOwoKfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOwoKdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSBudWxsOwogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7CgogICAgLy8gbXVzdCByZXR1cm4gIiIgaWYgdGhlcmUncyBubyBmb2xkLCB0byBlbmFibGUgY2FjaGluZwogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsKICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOwogICAgICAgIGlmICh0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGxpbmUpKQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsKICAgICAgICBpZiAoZm9sZFN0eWxlID09ICJtYXJrYmVnaW5lbmQiCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpCiAgICAgICAgICAgIHJldHVybiAiZW5kIjsKICAgICAgICByZXR1cm4gIiI7CiAgICB9OwogICAgCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7CiAgICAgICAgdmFyIHJlID0gL15ccyovOwogICAgICAgIHZhciBzdGFydFJvdyA9IHJvdzsKICAgICAgICB2YXIgZW5kUm93ID0gcm93OwogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgdmFyIHN0YXJ0Q29sdW1uID0gY29sdW1uIHx8IGxpbmUubGVuZ3RoOwogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOwogICAgICAgIHZhciBtYXhSb3cgPSBzZXNzaW9uLmdldExlbmd0aCgpCiAgICAgICAgCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7CiAgICAgICAgICAgIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICAgICAgdmFyIGxldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOwoKICAgICAgICAgICAgaWYgKGxldmVsID09IGxpbmUubGVuZ3RoKQogICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICBpZiAobGV2ZWwgPD0gc3RhcnRMZXZlbCkKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgZW5kUm93ID0gcm93OwogICAgICAgIH0KCiAgICAgICAgaWYgKGVuZFJvdyA+IHN0YXJ0Um93KSB7CiAgICAgICAgICAgIHZhciBlbmRDb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kUm93KS5sZW5ndGg7CiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7CiAgICAgICAgfQogICAgfTsKCiAgICB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCBicmFja2V0LCByb3csIGNvbHVtbikgewogICAgICAgIHZhciBzdGFydCA9IHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW4gKyAxfTsKICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsKICAgICAgICBpZiAoIWVuZCkKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICB2YXIgZncgPSBzZXNzaW9uLmZvbGRXaWRnZXRzW2VuZC5yb3ddOwogICAgICAgIGlmIChmdyA9PSBudWxsKQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsKCiAgICAgICAgaWYgKGZ3ID09ICJzdGFydCIpIHsKICAgICAgICAgICAgZW5kLnJvdyAtLTsKICAgICAgICAgICAgZW5kLmNvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmQucm93KS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOwogICAgfTsKCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsKCn0pOwpkZWZpbmUoJ2FjZS9tb2RlL2dyb292eV9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsKdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIikuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzOwp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsKCnZhciBHcm9vdnlIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgewoKICAgIHZhciBrZXl3b3JkcyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICgiYXNzZXJ0fHdpdGh8YWJzdHJhY3R8Y29udGludWV8Zm9yfG5ld3xzd2l0Y2h8IiArCiAgICAiYXNzZXJ0fGRlZmF1bHR8Z290b3xwYWNrYWdlfHN5bmNocm9uaXplZHwiICsKICAgICJib29sZWFufGRvfGlmfHByaXZhdGV8dGhpc3wiICsKICAgICJicmVha3xkb3VibGV8aW1wbGVtZW50c3xwcm90ZWN0ZWR8dGhyb3d8IiArCiAgICAiYnl0ZXxlbHNlfGltcG9ydHxwdWJsaWN8dGhyb3dzfCIgKwogICAgImNhc2V8ZW51bXxpbnN0YW5jZW9mfHJldHVybnx0cmFuc2llbnR8IiArCiAgICAiY2F0Y2h8ZXh0ZW5kc3xpbnR8c2hvcnR8dHJ5fCIgKwogICAgImNoYXJ8ZmluYWx8aW50ZXJmYWNlfHN0YXRpY3x2b2lkfCIgKwogICAgImNsYXNzfGZpbmFsbHl8bG9uZ3xzdHJpY3RmcHx2b2xhdGlsZXwiICsKICAgICJkZWZ8ZmxvYXR8bmF0aXZlfHN1cGVyfHdoaWxlIikuc3BsaXQoInwiKQogICAgKTsKCiAgICB2YXIgYnVpbGRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoIm51bGx8SW5maW5pdHl8TmFOfHVuZGVmaW5lZCIpLnNwbGl0KCJ8IikKICAgICk7CgogICAgdmFyIGxhbmdDbGFzc2VzID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgiQWJzdHJhY3RNZXRob2RFcnJvcnxBc3NlcnRpb25FcnJvcnxDbGFzc0NpcmN1bGFyaXR5RXJyb3J8IisKICAgICAgICAiQ2xhc3NGb3JtYXRFcnJvcnxEZXByZWNhdGVkfEVudW1Db25zdGFudE5vdFByZXNlbnRFeGNlcHRpb258IisKICAgICAgICAiRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yfElsbGVnYWxBY2Nlc3NFcnJvcnwiKwogICAgICAgICJJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb258SW5zdGFudGlhdGlvbkVycm9yfEludGVybmFsRXJyb3J8IisKICAgICAgICAiTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb258Tm9TdWNoRmllbGRFcnJvcnxPdmVycmlkZXxQcm9jZXNzfCIrCiAgICAgICAgIlByb2Nlc3NCdWlsZGVyfFNlY3VyaXR5TWFuYWdlcnxTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9ufCIrCiAgICAgICAgIlN1cHByZXNzV2FybmluZ3N8VHlwZU5vdFByZXNlbnRFeGNlcHRpb258VW5rbm93bkVycm9yfCIrCiAgICAgICAgIlVuc2F0aXNmaWVkTGlua0Vycm9yfFVuc3VwcG9ydGVkQ2xhc3NWZXJzaW9uRXJyb3J8VmVyaWZ5RXJyb3J8IisKICAgICAgICAiSW5zdGFudGlhdGlvbkV4Y2VwdGlvbnxJbmRleE91dE9mQm91bmRzRXhjZXB0aW9ufCIrCiAgICAgICAgIkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbnxDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbnwiKwogICAgICAgICJOb1N1Y2hGaWVsZEV4Y2VwdGlvbnxJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb258TnVtYmVyRm9ybWF0RXhjZXB0aW9ufCIrCiAgICAgICAgIlNlY3VyaXR5RXhjZXB0aW9ufFZvaWR8SW5oZXJpdGFibGVUaHJlYWRMb2NhbHxJbGxlZ2FsU3RhdGVFeGNlcHRpb258IisKICAgICAgICAiSW50ZXJydXB0ZWRFeGNlcHRpb258Tm9TdWNoTWV0aG9kRXhjZXB0aW9ufElsbGVnYWxBY2Nlc3NFeGNlcHRpb258IisKICAgICAgICAiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb258RW51bXxTdHJpY3RNYXRofFBhY2thZ2V8Q29tcGlsZXJ8IisKICAgICAgICAiUmVhZGFibGV8UnVudGltZXxTdHJpbmdCdWlsZGVyfE1hdGh8SW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvcnwiKwogICAgICAgICJOb1N1Y2hNZXRob2RFcnJvcnxUaHJlYWRMb2NhbHxSdW50aW1lUGVybWlzc2lvbnxBcml0aG1ldGljRXhjZXB0aW9ufCIrCiAgICAgICAgIk51bGxQb2ludGVyRXhjZXB0aW9ufExvbmd8SW50ZWdlcnxTaG9ydHxCeXRlfERvdWJsZXxOdW1iZXJ8RmxvYXR8IisKICAgICAgICAiQ2hhcmFjdGVyfEJvb2xlYW58U3RhY2tUcmFjZUVsZW1lbnR8QXBwZW5kYWJsZXxTdHJpbmdCdWZmZXJ8IisKICAgICAgICAiSXRlcmFibGV8VGhyZWFkR3JvdXB8UnVubmFibGV8VGhyZWFkfElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb258IisKICAgICAgICAiU3RhY2tPdmVyZmxvd0Vycm9yfE91dE9mTWVtb3J5RXJyb3J8VmlydHVhbE1hY2hpbmVFcnJvcnwiKwogICAgICAgICJBcnJheVN0b3JlRXhjZXB0aW9ufENsYXNzQ2FzdEV4Y2VwdGlvbnxMaW5rYWdlRXJyb3J8IisKICAgICAgICAiTm9DbGFzc0RlZkZvdW5kRXJyb3J8Q2xhc3NOb3RGb3VuZEV4Y2VwdGlvbnxSdW50aW1lRXhjZXB0aW9ufCIrCiAgICAgICAgIkV4Y2VwdGlvbnxUaHJlYWREZWF0aHxFcnJvcnxUaHJvd2FibGV8U3lzdGVtfENsYXNzTG9hZGVyfCIrCiAgICAgICAgIkNsb25lYWJsZXxDbGFzc3xDaGFyU2VxdWVuY2V8Q29tcGFyYWJsZXxTdHJpbmd8T2JqZWN0Iikuc3BsaXQoInwiKQogICAgKTsKICAgIAogICAgdmFyIGltcG9ydENsYXNzZXMgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCIiKS5zcGxpdCgifCIpCiAgICApOwogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBVc2UgKD86KSBpbnN0ZWFkLgogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZAoKICAgIHRoaXMuJHJ1bGVzID0gewogICAgICAgICJzdGFydCIgOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwvLiokIgogICAgICAgICAgICB9LAogICAgICAgICAgICBuZXcgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzKCkuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudAogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwKICAgICAgICAgICAgICAgIG5leHQgOiAiY29tbWVudCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nLnJlZ2V4cCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJbL10oPzooPzpcXFsoPzpcXFxcXXxbXlxcXV0pK1xcXSl8KD86XFxcXC98W15cXF0vXSkpKlsvXVxcdypcXHMqKD89WykuLDtdfCQpIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXScKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10iCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBoZXgKICAgICAgICAgICAgICAgIHJlZ2V4IDogIjBbeFhdWzAtOWEtZkEtRl0rXFxiIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5sYW5ndWFnZS5ib29sZWFuIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/OnRydWV8ZmFsc2UpXFxiIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09ICJ0aGlzIikKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS5sYW5ndWFnZSI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5d29yZHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxhbmdDbGFzc2VzLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmZ1bmN0aW9uIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpbXBvcnRDbGFzc2VzLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmZ1bmN0aW9uIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsZGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImlkZW50aWZpZXIiOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIC8vIFRPRE86IFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcwogICAgICAgICAgICAgICAgLy8gVE9ETzogVW5pY29kZSBpZGVudGlmaWVycwogICAgICAgICAgICAgICAgcmVnZXggOiAiW2EtekEtWl8kXVthLXpBLVowLTlfJF0qXFxiIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcPzp8XFw/XFwufFxcKlxcLnw8PT58PX58PT1+fFxcLkB8XFwqXFwuQHxcXC4mfGFzfGlufGlzfCF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT09fD09fD18IT18IT09fDw9fD49fDw8PXw+Pj18Pj4+PXw8Pnw8fD58IXwmJnxcXHxcXHx8XFw/XFw6fFxcKj18JT18XFwrPXxcXC09fCY9fFxcXj18XFxiKD86aW58aW5zdGFuY2VvZnxuZXd8ZGVsZXRlfHR5cGVvZnx2b2lkKSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAibHBhcmVuIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIltbKHtdIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJycGFyZW4iLAogICAgICAgICAgICAgICAgcmVnZXggOiAiW1xcXSl9XSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIgogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiY29tbWVudCIgOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQKICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH07CiAgICAKICAgIHRoaXMuZW1iZWRSdWxlcyhEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsICJkb2MtIiwKICAgICAgICBbIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRFbmRSdWxlKCJzdGFydCIpIF0pOwp9OwoKb29wLmluaGVyaXRzKEdyb292eUhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOwoKZXhwb3J0cy5Hcm9vdnlIaWdobGlnaHRSdWxlcyA9IEdyb292eUhpZ2hsaWdodFJ1bGVzOwp9KTsKOwogICAgICAgICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgewogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KSgpOwogICAgICAgIA==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-groovy.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9ncm9vdnkiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL2phdmFzY3JpcHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvZ3Jvb3Z5X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi9qYXZhc2NyaXB0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vZ3Jvb3Z5X2hpZ2hsaWdodF9ydWxlcyIpLkdyb292eUhpZ2hsaWdodFJ1bGVzLGg9ZnVuY3Rpb24oKXtlLmNhbGwodGhpcyksdGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSl9O2QuaW5oZXJpdHMoaCxlKSxmdW5jdGlvbigpe3RoaXMuY3JlYXRlV29ya2VyPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsfX0uY2FsbChoLnByb3RvdHlwZSksYi5Nb2RlPWh9KSxkZWZpbmUoImFjZS9tb2RlL2phdmFzY3JpcHQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50IiwiYWNlL3JhbmdlIiwiYWNlL3dvcmtlci93b3JrZXJfY2xpZW50IiwiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSIsImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3RleHQiKS5Nb2RlLGY9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGc9YSgiLi9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIpLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyxoPWEoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50LGk9YSgiLi4vcmFuZ2UiKS5SYW5nZSxqPWEoIi4uL3dvcmtlci93b3JrZXJfY2xpZW50IikuV29ya2VyQ2xpZW50LGs9YSgiLi9iZWhhdmlvdXIvY3N0eWxlIikuQ3N0eWxlQmVoYXZpb3VyLGw9YSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlLG09ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbml6ZXI9bmV3IGYoKG5ldyBnKS5nZXRSdWxlcygpKSx0aGlzLiRvdXRkZW50PW5ldyBoLHRoaXMuJGJlaGF2aW91cj1uZXcgayx0aGlzLmZvbGRpbmdSdWxlcz1uZXcgbH07ZC5pbmhlcml0cyhtLGUpLGZ1bmN0aW9uKCl7dGhpcy50b2dnbGVDb21tZW50TGluZXM9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ITAsZj0vXihccyopXC9cLy87Zm9yKHZhciBnPWM7Zzw9ZDtnKyspaWYoIWYudGVzdChiLmdldExpbmUoZykpKXtlPSExO2JyZWFrfWlmKGUpe3ZhciBoPW5ldyBpKDAsMCwwLDApO2Zvcih2YXIgZz1jO2c8PWQ7ZysrKXt2YXIgaj1iLmdldExpbmUoZyksaz1qLm1hdGNoKGYpO2guc3RhcnQucm93PWcsaC5lbmQucm93PWcsaC5lbmQuY29sdW1uPWtbMF0ubGVuZ3RoLGIucmVwbGFjZShoLGtbMV0pfX1lbHNlIGIuaW5kZW50Um93cyhjLGQsIi8vIil9LHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuJGdldEluZGVudChiKSxlPXRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGIsYSksZj1lLnRva2VucyxnPWUuc3RhdGU7aWYoZi5sZW5ndGgmJmZbZi5sZW5ndGgtMV0udHlwZT09ImNvbW1lbnQiKXJldHVybiBkO2lmKGE9PSJzdGFydCJ8fGE9PSJyZWdleF9hbGxvd2VkIil7dmFyIGg9Yi5tYXRjaCgvXi4qKD86XGJjYXNlXGIuKlw6fFtce1woXFtdKVxzKiQvKTtoJiYoZCs9Yyl9ZWxzZSBpZihhPT0iZG9jLXN0YXJ0Iil7aWYoZz09InN0YXJ0Inx8YT09InJlZ2V4X2FsbG93ZWQiKXJldHVybiIiO3ZhciBoPWIubWF0Y2goL15ccyooXC8/KVwqLyk7aCYmKGhbMV0mJihkKz0iICIpLGQrPSIqICIpfXJldHVybiBkfSx0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGIsYyl9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoYixjKX0sdGhpcy5jcmVhdGVXb3JrZXI9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IGooWyJhY2UiXSwid29ya2VyLWphdmFzY3JpcHQuanMiLCJhY2UvbW9kZS9qYXZhc2NyaXB0X3dvcmtlciIsIkphdmFTY3JpcHRXb3JrZXIiKTtyZXR1cm4gYi5hdHRhY2hUb0RvY3VtZW50KGEuZ2V0RG9jdW1lbnQoKSksYi5vbigianNsaW50IixmdW5jdGlvbihiKXt2YXIgYz1bXTtmb3IodmFyIGQ9MDtkPGIuZGF0YS5sZW5ndGg7ZCsrKXt2YXIgZT1iLmRhdGFbZF07ZSYmYy5wdXNoKHtyb3c6ZS5saW5lLTEsY29sdW1uOmUuY2hhcmFjdGVyLTEsdGV4dDplLnJlYXNvbix0eXBlOiJ3YXJuaW5nIixsaW50OmV9KX1hLnNldEFubm90YXRpb25zKGMpfSksYi5vbigibmFyY2lzc3VzIixmdW5jdGlvbihiKXthLnNldEFubm90YXRpb25zKFtiLmRhdGFdKX0pLGIub24oInRlcm1pbmF0ZSIsZnVuY3Rpb24oKXthLmNsZWFyQW5ub3RhdGlvbnMoKX0pLGJ9fS5jYWxsKG0ucHJvdG90eXBlKSxiLk1vZGU9bX0pLGRlZmluZSgiYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS91bmljb2RlIiwiYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4uL2xpYi9sYW5nIiksZj1hKCIuLi91bmljb2RlIiksZz1hKCIuL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIpLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyxoPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsaT1mdW5jdGlvbigpe3ZhciBhPWUuYXJyYXlUb01hcCgiQXJyYXl8Qm9vbGVhbnxEYXRlfEZ1bmN0aW9ufEl0ZXJhdG9yfE51bWJlcnxPYmplY3R8UmVnRXhwfFN0cmluZ3xQcm94eXxOYW1lc3BhY2V8UU5hbWV8WE1MfFhNTExpc3R8QXJyYXlCdWZmZXJ8RmxvYXQzMkFycmF5fEZsb2F0NjRBcnJheXxJbnQxNkFycmF5fEludDMyQXJyYXl8SW50OEFycmF5fFVpbnQxNkFycmF5fFVpbnQzMkFycmF5fFVpbnQ4QXJyYXl8VWludDhDbGFtcGVkQXJyYXl8RXJyb3J8RXZhbEVycm9yfEludGVybmFsRXJyb3J8UmFuZ2VFcnJvcnxSZWZlcmVuY2VFcnJvcnxTdG9wSXRlcmF0aW9ufFN5bnRheEVycm9yfFR5cGVFcnJvcnxVUklFcnJvcnxkZWNvZGVVUkl8ZGVjb2RlVVJJQ29tcG9uZW50fGVuY29kZVVSSXxlbmNvZGVVUklDb21wb25lbnR8ZXZhbHxpc0Zpbml0ZXxpc05hTnxwYXJzZUZsb2F0fHBhcnNlSW50fEpTT058TWF0aHx0aGlzfGFyZ3VtZW50c3xwcm90b3R5cGV8d2luZG93fGRvY3VtZW50Ii5zcGxpdCgifCIpKSxiPWUuYXJyYXlUb01hcCgiYnJlYWt8Y2FzZXxjYXRjaHxjb250aW51ZXxkZWZhdWx0fGRlbGV0ZXxkb3xlbHNlfGZpbmFsbHl8Zm9yfGZ1bmN0aW9ufGlmfGlufGluc3RhbmNlb2Z8bmV3fHJldHVybnxzd2l0Y2h8dGhyb3d8dHJ5fHR5cGVvZnxsZXR8dmFyfHdoaWxlfHdpdGh8Y29uc3R8eWllbGR8aW1wb3J0fGdldHxzZXQiLnNwbGl0KCJ8IikpLGM9ImNhc2V8ZG98ZWxzZXxmaW5hbGx5fGlufGluc3RhbmNlb2Z8cmV0dXJufHRocm93fHRyeXx0eXBlb2Z8eWllbGQiLGQ9ZS5hcnJheVRvTWFwKCJfX3BhcmVudF9ffF9fY291bnRfX3xlc2NhcGV8dW5lc2NhcGV8d2l0aHxfX3Byb3RvX18iLnNwbGl0KCJ8IikpLGg9ZS5hcnJheVRvTWFwKCJjb25zdHxsZXR8dmFyfGZ1bmN0aW9uIi5zcGxpdCgifCIpKSxpPWUuYXJyYXlUb01hcCgibnVsbHxJbmZpbml0eXxOYU58dW5kZWZpbmVkIi5zcGxpdCgifCIpKSxqPWUuYXJyYXlUb01hcCgiY2xhc3N8ZW51bXxleHRlbmRzfHN1cGVyfGV4cG9ydHxpbXBsZW1lbnRzfHByaXZhdGV8cHVibGljfGludGVyZmFjZXxwYWNrYWdlfHByb3RlY3RlZHxzdGF0aWMiLnNwbGl0KCJ8IikpLGs9IlsiK2YucGFja2FnZXMuTCsiXFwkX11bIitmLnBhY2thZ2VzLkwrZi5wYWNrYWdlcy5NbitmLnBhY2thZ2VzLk1jK2YucGFja2FnZXMuTmQrZi5wYWNrYWdlcy5QYysiXFwkX10qXFxiIjt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6IlxcL1xcLy4qJCJ9LChuZXcgZykuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCoiLG5leHQ6ImNvbW1lbnQifSx7dG9rZW46InN0cmluZyIscmVnZXg6J1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nfSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6J1siXS4qXFxcXCQnLG5leHQ6InFxc3RyaW5nIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIn0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiJbJ10uKlxcXFwkIixuZXh0OiJxc3RyaW5nIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiMFt4WF1bMC05YS1mQS1GXStcXGIifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiJ9LHt0b2tlbjpbImtleXdvcmQuZGVmaW5pdGlvbiIsInRleHQiLCJlbnRpdHkubmFtZS5mdW5jdGlvbiJdLHJlZ2V4OiIoZnVuY3Rpb24pKFxccyspKCIraysiKSJ9LHt0b2tlbjoiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiIscmVnZXg6Iig/OnRydWV8ZmFsc2UpXFxiIn0se3Rva2VuOiJrZXl3b3JkIixyZWdleDoiKD86IitjKyIpXFxiIixuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOmZ1bmN0aW9uKGMpe3JldHVybiBhLmhhc093blByb3BlcnR5KGMpPyJ2YXJpYWJsZS5sYW5ndWFnZSI6ZC5oYXNPd25Qcm9wZXJ0eShjKT8iaW52YWxpZC5kZXByZWNhdGVkIjpoLmhhc093blByb3BlcnR5KGMpPyJrZXl3b3JkLmRlZmluaXRpb24iOmIuaGFzT3duUHJvcGVydHkoYyk/ImtleXdvcmQiOmkuaGFzT3duUHJvcGVydHkoYyk/ImNvbnN0YW50Lmxhbmd1YWdlIjpqLmhhc093blByb3BlcnR5KGMpPyJpbnZhbGlkLmlsbGVnYWwiOmM9PSJkZWJ1Z2dlciI/ImludmFsaWQuZGVwcmVjYXRlZCI6ImlkZW50aWZpZXIifSxyZWdleDprfSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiIhfFxcJHwlfCZ8XFwqfFxcLVxcLXxcXC18XFwrXFwrfFxcK3x+fD09PXw9PXw9fCE9fCE9PXw8PXw+PXw8PD18Pj49fD4+Pj18PD58PHw+fCF8JiZ8XFx8XFx8fFxcP1xcOnxcXCo9fCU9fFxcKz18XFwtPXwmPXxcXF49fFxcYig/OmlufGluc3RhbmNlb2Z8bmV3fGRlbGV0ZXx0eXBlb2Z8dm9pZCkiLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46InB1bmN0dWF0aW9uLm9wZXJhdG9yIixyZWdleDoiXFw/fFxcOnxcXCx8XFw7fFxcLiIsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoicGFyZW4ubHBhcmVuIixyZWdleDoiW1soe10iLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46InBhcmVuLnJwYXJlbiIscmVnZXg6IltcXF0pfV0ifSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiJcXC89PyIsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoiY29tbWVudCIscmVnZXg6Il4jIS4qJCJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifV0scmVnZXhfYWxsb3dlZDpbe3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwvXFwqIixuZXh0OiJjb21tZW50X3JlZ2V4X2FsbG93ZWQifSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJcXC9cXC8uKiQifSx7dG9rZW46InN0cmluZy5yZWdleHAiLHJlZ2V4OiJcXC8iLG5leHQ6InJlZ2V4IixtZXJnZTohMH0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9LHt0b2tlbjoiZW1wdHkiLHJlZ2V4OiIiLG5leHQ6InN0YXJ0In1dLHJlZ2V4Olt7dG9rZW46InJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiXFxcXCg/OnVbXFxkYS1mQS1GXXs0fXx4W1xcZGEtZkEtRl17Mn18LikiLG5leHQ6InJlZ2V4In0se3Rva2VuOiJzdHJpbmcucmVnZXhwIixyZWdleDoiL1xcdyoiLG5leHQ6InN0YXJ0IixtZXJnZTohMH0se3Rva2VuOiJzdHJpbmcucmVnZXhwIixyZWdleDoiW15cXFxcL1xcW10rIixuZXh0OiJyZWdleCIsbWVyZ2U6ITB9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLHJlZ2V4OiJcXFsiLG5leHQ6InJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyIsbWVyZ2U6ITB9LHt0b2tlbjoiZW1wdHkiLHJlZ2V4OiIiLG5leHQ6InN0YXJ0In1dLHJlZ2V4X2NoYXJhY3Rlcl9jbGFzczpbe3Rva2VuOiJyZWdleHAua2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIixuZXh0OiJyZWdleF9jaGFyYWN0ZXJfY2xhc3MifSx7dG9rZW46InN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIixyZWdleDoiXSIsbmV4dDoicmVnZXgiLG1lcmdlOiEwfSx7dG9rZW46InN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIixyZWdleDoiW15cXFxcXFxdXSsiLG5leHQ6InJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyIsbWVyZ2U6ITB9LHt0b2tlbjoiZW1wdHkiLHJlZ2V4OiIiLG5leHQ6InN0YXJ0In1dLGNvbW1lbnRfcmVnZXhfYWxsb3dlZDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixtZXJnZTohMCxuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV0sY29tbWVudDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixtZXJnZTohMCxuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLHFxc3RyaW5nOlt7dG9rZW46InN0cmluZyIscmVnZXg6Jyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJyxuZXh0OiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV0scXN0cmluZzpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OiIoPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/JyIsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfSx0aGlzLmVtYmVkUnVsZXMoZywiZG9jLSIsWyhuZXcgZykuZ2V0RW5kUnVsZSgic3RhcnQiKV0pfTtkLmluaGVyaXRzKGksaCksYi5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXM9aX0pLGRlZmluZSgiYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxmPWZ1bmN0aW9uKCl7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQuZG9jLnRhZyIscmVnZXg6IkBbXFx3XFxkX10rIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxccysifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiVE9ETyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJbXkBcXCpdKyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiIuIn1dfX07ZC5pbmhlcml0cyhmLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXRTdGFydFJ1bGU9ZnVuY3Rpb24oYSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKig/PVxcKikiLG5leHQ6YX19LHRoaXMuZ2V0RW5kUnVsZT1mdW5jdGlvbihhKXtyZXR1cm57dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiXFwqXFwvIixuZXh0OmF9fX0uY2FsbChmLnByb3RvdHlwZSksYi5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM9Zn0pLGRlZmluZSgiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vcmFuZ2UiKS5SYW5nZSxlPWZ1bmN0aW9uKCl7fTsoKGZ1bmN0aW9uKCl7dGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4vXlxzKyQvLnRlc3QoYSk/L15ccypcfS8udGVzdChiKTohMX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuZ2V0TGluZShiKSxlPWMubWF0Y2goL14oXHMqXH0pLyk7aWYoIWUpcmV0dXJuIDA7dmFyIGY9ZVsxXS5sZW5ndGgsZz1hLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzpiLGNvbHVtbjpmfSk7aWYoIWd8fGcucm93PT1iKXJldHVybiAwO3ZhciBoPXRoaXMuJGdldEluZGVudChhLmdldExpbmUoZy5yb3cpKTthLnJlcGxhY2UobmV3IGQoYiwwLGIsZi0xKSxoKX0sdGhpcy4kZ2V0SW5kZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEubWF0Y2goL14oXHMrKS8pO3JldHVybiBiP2JbMV06IiJ9fSkpLmNhbGwoZS5wcm90b3R5cGUpLGIuTWF0Y2hpbmdCcmFjZU91dGRlbnQ9ZX0pLGRlZmluZSgiYWNlL3dvcmtlci93b3JrZXJfY2xpZW50IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4uL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLGY9ZnVuY3Rpb24oYixkLGUsZil7dGhpcy5jaGFuZ2VMaXN0ZW5lcj10aGlzLmNoYW5nZUxpc3RlbmVyLmJpbmQodGhpcyk7aWYoYy5wYWNrYWdlZCl7dmFyIGc9dGhpcy4kZ3Vlc3NCYXNlUGF0aCgpO3RoaXMuJHdvcmtlcj1uZXcgV29ya2VyKGcrZCl9ZWxzZXt2YXIgaD10aGlzLiRub3JtYWxpemVQYXRoKGEubmFtZVRvVXJsKCJhY2Uvd29ya2VyL3dvcmtlciIsbnVsbCwiXyIpKTt0aGlzLiR3b3JrZXI9bmV3IFdvcmtlcihoKTt2YXIgaT17fTtmb3IodmFyIGo9MDtqPGIubGVuZ3RoO2orKyl7dmFyIGs9YltqXSxsPXRoaXMuJG5vcm1hbGl6ZVBhdGgoYS5uYW1lVG9VcmwoayxudWxsLCJfIikucmVwbGFjZSgvLmpzJC8sIiIpKTtpW2tdPWx9fXRoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7aW5pdDohMCx0bG5zOmksbW9kdWxlOmUsY2xhc3NuYW1lOmZ9KSx0aGlzLmNhbGxiYWNrSWQ9MSx0aGlzLmNhbGxiYWNrcz17fTt2YXIgbT10aGlzO3RoaXMuJHdvcmtlci5vbmVycm9yPWZ1bmN0aW9uKGEpe3Rocm93IHdpbmRvdy5jb25zb2xlJiZjb25zb2xlLmxvZyYmY29uc29sZS5sb2coYSksYX0sdGhpcy4kd29ya2VyLm9ubWVzc2FnZT1mdW5jdGlvbihhKXt2YXIgYj1hLmRhdGE7c3dpdGNoKGIudHlwZSl7Y2FzZSJsb2ciOndpbmRvdy5jb25zb2xlJiZjb25zb2xlLmxvZyYmY29uc29sZS5sb2coYi5kYXRhKTticmVhaztjYXNlImV2ZW50IjptLl9lbWl0KGIubmFtZSx7ZGF0YTpiLmRhdGF9KTticmVhaztjYXNlImNhbGwiOnZhciBjPW0uY2FsbGJhY2tzW2IuaWRdO2MmJihjKGIuZGF0YSksZGVsZXRlIG0uY2FsbGJhY2tzW2IuaWRdKX19fTsoKGZ1bmN0aW9uKCl7ZC5pbXBsZW1lbnQodGhpcyxlKSx0aGlzLiRub3JtYWxpemVQYXRoPWZ1bmN0aW9uKGEpe3JldHVybiBhPWEucmVwbGFjZSgvXlthLXpdKzpcL1wvW15cL10rXC8vLCIiKSxhPWxvY2F0aW9uLnByb3RvY29sKyIvLyIrbG9jYXRpb24uaG9zdCsoYS5jaGFyQXQoMCk9PSIvIj8iIjpsb2NhdGlvbi5wYXRobmFtZS5yZXBsYWNlKC9cL1teXC9dKiQvLCIiKSkrIi8iK2EucmVwbGFjZSgvXltcL10rLywiIiksYX0sdGhpcy4kZ3Vlc3NCYXNlUGF0aD1mdW5jdGlvbigpe2lmKGEuYWNlQmFzZVVybClyZXR1cm4gYS5hY2VCYXNlVXJsO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKTtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXSxlPWQuZ2V0QXR0cmlidXRlKCJkYXRhLWFjZS1iYXNlIik7aWYoZSlyZXR1cm4gZS5yZXBsYWNlKC9cLyokLywiLyIpO3ZhciBmPWQuc3JjfHxkLmdldEF0dHJpYnV0ZSgic3JjIik7aWYoIWYpY29udGludWU7dmFyIGc9Zi5tYXRjaCgvXig/OiguKlwvKWFjZVwuanN8KC4qXC8pYWNlKC11bmNvbXByZXNzZWQpPygtbm9jb25mbGljdCk/XC5qcykoPzpcP3wkKS8pO2lmKGcpcmV0dXJuIGdbMV18fGdbMl19cmV0dXJuIiJ9LHRoaXMudGVybWluYXRlPWZ1bmN0aW9uKCl7dGhpcy5fZW1pdCgidGVybWluYXRlIix7fSksdGhpcy4kd29ya2VyLnRlcm1pbmF0ZSgpLHRoaXMuJHdvcmtlcj1udWxsLHRoaXMuJGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2UiLHRoaXMuY2hhbmdlTGlzdGVuZXIpLHRoaXMuJGRvYz1udWxsfSx0aGlzLnNlbmQ9ZnVuY3Rpb24oYSxiKXt0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2NvbW1hbmQ6YSxhcmdzOmJ9KX0sdGhpcy5jYWxsPWZ1bmN0aW9uKGEsYixjKXtpZihjKXt2YXIgZD10aGlzLmNhbGxiYWNrSWQrKzt0aGlzLmNhbGxiYWNrc1tkXT1jLGIucHVzaChkKX10aGlzLnNlbmQoYSxiKX0sdGhpcy5lbWl0PWZ1bmN0aW9uKGEsYil7dHJ5e3RoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7ZXZlbnQ6YSxkYXRhOntkYXRhOmIuZGF0YX19KX1jYXRjaChjKXt9fSx0aGlzLmF0dGFjaFRvRG9jdW1lbnQ9ZnVuY3Rpb24oYSl7dGhpcy4kZG9jJiZ0aGlzLnRlcm1pbmF0ZSgpLHRoaXMuJGRvYz1hLHRoaXMuY2FsbCgic2V0VmFsdWUiLFthLmdldFZhbHVlKCldKSxhLm9uKCJjaGFuZ2UiLHRoaXMuY2hhbmdlTGlzdGVuZXIpfSx0aGlzLmNoYW5nZUxpc3RlbmVyPWZ1bmN0aW9uKGEpe2EucmFuZ2U9e3N0YXJ0OmEuZGF0YS5yYW5nZS5zdGFydCxlbmQ6YS5kYXRhLnJhbmdlLmVuZH0sdGhpcy5lbWl0KCJjaGFuZ2UiLGEpfX0pKS5jYWxsKGYucHJvdG90eXBlKSxiLldvcmtlckNsaWVudD1mfSksZGVmaW5lKCJhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9iZWhhdmlvdXIiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4uL2JlaGF2aW91ciIpLkJlaGF2aW91cixmPWZ1bmN0aW9uKCl7dGhpcy5hZGQoImJyYWNlcyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0ieyIpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtyZXR1cm4gZyE9PSIiP3t0ZXh0OiJ7IitnKyJ9IixzZWxlY3Rpb246ITF9Ont0ZXh0OiJ7fSIsc2VsZWN0aW9uOlsxLDFdfX1pZihlPT0ifSIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09In0iKXt2YXIgaz1kLiRmaW5kT3BlbmluZ0JyYWNrZXQoIn0iLHtjb2x1bW46aC5jb2x1bW4rMSxyb3c6aC5yb3d9KTtpZihrIT09bnVsbClyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX1lbHNlIGlmKGU9PSJcbiIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09In0iKXt2YXIgbD1kLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzpoLnJvdyxjb2x1bW46aC5jb2x1bW4rMX0pO2lmKCFsKXJldHVybiBudWxsO3ZhciBtPXRoaXMuZ2V0TmV4dExpbmVJbmRlbnQoYSxpLnN1YnN0cmluZygwLGkubGVuZ3RoLTEpLGQuZ2V0VGFiU3RyaW5nKCkpLG49dGhpcy4kZ2V0SW5kZW50KGQuZG9jLmdldExpbmUobC5yb3cpKTtyZXR1cm57dGV4dDoiXG4iK20rIlxuIituLHNlbGVjdGlvbjpbMSxtLmxlbmd0aCwxLG0ubGVuZ3RoXX19fX0pLHRoaXMuYWRkKCJicmFjZXMiLCJkZWxldGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1kLmRvYy5nZXRUZXh0UmFuZ2UoZSk7aWYoIWUuaXNNdWx0aUxpbmUoKSYmZj09InsiKXt2YXIgZz1kLmRvYy5nZXRMaW5lKGUuc3RhcnQucm93KSxoPWcuc3Vic3RyaW5nKGUuZW5kLmNvbHVtbixlLmVuZC5jb2x1bW4rMSk7aWYoaD09In0iKXJldHVybiBlLmVuZC5jb2x1bW4rKyxlfX0pLHRoaXMuYWRkKCJwYXJlbnMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09IigiKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7cmV0dXJuIGchPT0iIj97dGV4dDoiKCIrZysiKSIsc2VsZWN0aW9uOiExfTp7dGV4dDoiKCkiLHNlbGVjdGlvbjpbMSwxXX19aWYoZT09IikiKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSIpIil7dmFyIGs9ZC4kZmluZE9wZW5pbmdCcmFja2V0KCIpIix7Y29sdW1uOmguY29sdW1uKzEscm93Omgucm93fSk7aWYoayE9PW51bGwpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19fSksdGhpcy5hZGQoInBhcmVucyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0iKCIpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5zdGFydC5jb2x1bW4rMSxlLnN0YXJ0LmNvbHVtbisyKTtpZihoPT0iKSIpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSksdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSciJyl7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO2lmKGchPT0iIilyZXR1cm57dGV4dDonIicrZysnIicsc2VsZWN0aW9uOiExfTt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLTEsaC5jb2x1bW4pO2lmKGo9PSJcXCIpcmV0dXJuIG51bGw7dmFyIGs9ZC5nZXRUb2tlbnMoZi5zdGFydC5yb3csZi5zdGFydC5yb3cpWzBdLnRva2VucyxsPTAsbSxuPS0xO2Zvcih2YXIgbz0wO288ay5sZW5ndGg7bysrKXttPWtbb10sbS50eXBlPT0ic3RyaW5nIj9uPS0xOm48MCYmKG49bS52YWx1ZS5pbmRleE9mKCciJykpO2lmKG0udmFsdWUubGVuZ3RoK2w+Zi5zdGFydC5jb2x1bW4pYnJlYWs7bCs9a1tvXS52YWx1ZS5sZW5ndGh9aWYoIW18fG48MCYmbS50eXBlIT09ImNvbW1lbnQiJiYobS50eXBlIT09InN0cmluZyJ8fGYuc3RhcnQuY29sdW1uIT09bS52YWx1ZS5sZW5ndGgrbC0xJiZtLnZhbHVlLmxhc3RJbmRleE9mKCciJyk9PT1tLnZhbHVlLmxlbmd0aC0xKSlyZXR1cm57dGV4dDonIiInLHNlbGVjdGlvbjpbMSwxXX07aWYobSYmbS50eXBlPT09InN0cmluZyIpe3ZhciBwPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKHA9PSciJylyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX19KSx0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCJkZWxldGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1kLmRvYy5nZXRUZXh0UmFuZ2UoZSk7aWYoIWUuaXNNdWx0aUxpbmUoKSYmZj09JyInKXt2YXIgZz1kLmRvYy5nZXRMaW5lKGUuc3RhcnQucm93KSxoPWcuc3Vic3RyaW5nKGUuc3RhcnQuY29sdW1uKzEsZS5zdGFydC5jb2x1bW4rMik7aWYoaD09JyInKXJldHVybiBlLmVuZC5jb2x1bW4rKyxlfX0pfTtkLmluaGVyaXRzKGYsZSksYi5Dc3R5bGVCZWhhdmlvdXI9Zn0pLGRlZmluZSgiYWNlL21vZGUvZm9sZGluZy9jc3R5bGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9yYW5nZSIsImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGY9YSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZSxnPWIuRm9sZE1vZGU9ZnVuY3Rpb24oKXt9O2QuaW5oZXJpdHMoZyxmKSxmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPS8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9L15bXlxbXHtdKihcfXxcXSl8Xltcc1wqXSooXCpcLykvLHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmdldExpbmUoYyksZj1kLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTtpZihmKXt2YXIgZz1mLmluZGV4O2lmKGZbMV0pcmV0dXJuIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayhhLGZbMV0sYyxnKTt2YXIgaD1hLmdldENvbW1lbnRGb2xkUmFuZ2UoYyxnK2ZbMF0ubGVuZ3RoKTtyZXR1cm4gaC5lbmQuY29sdW1uLT0yLGh9aWYoYiE9PSJtYXJrYmVnaW5lbmQiKXJldHVybjt2YXIgZj1kLm1hdGNoKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIpO2lmKGYpe3ZhciBnPWYuaW5kZXgrZlswXS5sZW5ndGg7aWYoZlsyXSl7dmFyIGg9YS5nZXRDb21tZW50Rm9sZFJhbmdlKGMsZyk7cmV0dXJuIGguZW5kLmNvbHVtbi09MixofXZhciBpPXtyb3c6Yyxjb2x1bW46Z30saj1hLiRmaW5kT3BlbmluZ0JyYWNrZXQoZlsxXSxpKTtpZighailyZXR1cm47cmV0dXJuIGouY29sdW1uKyssaS5jb2x1bW4tLSxlLmZyb21Qb2ludHMoaixpKX19fS5jYWxsKGcucHJvdG90eXBlKX0pLGRlZmluZSgiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL3JhbmdlIikuUmFuZ2UsZT1iLkZvbGRNb2RlPWZ1bmN0aW9uKCl7fTsoKGZ1bmN0aW9uKCl7dGhpcy5mb2xkaW5nU3RhcnRNYXJrZXI9bnVsbCx0aGlzLmZvbGRpbmdTdG9wTWFya2VyPW51bGwsdGhpcy5nZXRGb2xkV2lkZ2V0PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmdldExpbmUoYyk7cmV0dXJuIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QoZCk/InN0YXJ0IjpiPT0ibWFya2JlZ2luZW5kIiYmdGhpcy5mb2xkaW5nU3RvcE1hcmtlciYmdGhpcy5mb2xkaW5nU3RvcE1hcmtlci50ZXN0KGQpPyJlbmQiOiIifSx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIG51bGx9LHRoaXMuaW5kZW50YXRpb25CbG9jaz1mdW5jdGlvbihhLGIsYyl7dmFyIGU9L15ccyovLGY9YixnPWIsaD1hLmdldExpbmUoYiksaT1jfHxoLmxlbmd0aCxqPWgubWF0Y2goZSlbMF0ubGVuZ3RoLGs9YS5nZXRMZW5ndGgoKTt3aGlsZSgrK2I8ayl7aD1hLmdldExpbmUoYik7dmFyIGw9aC5tYXRjaChlKVswXS5sZW5ndGg7aWYobD09aC5sZW5ndGgpY29udGludWU7aWYobDw9ailicmVhaztnPWJ9aWYoZz5mKXt2YXIgbT1hLmdldExpbmUoZykubGVuZ3RoO3JldHVybiBuZXcgZChmLGksZyxtKX19LHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jaz1mdW5jdGlvbihhLGIsYyxlKXt2YXIgZj17cm93OmMsY29sdW1uOmUrMX0sZz1hLiRmaW5kQ2xvc2luZ0JyYWNrZXQoYixmKTtpZighZylyZXR1cm47dmFyIGg9YS5mb2xkV2lkZ2V0c1tnLnJvd107cmV0dXJuIGg9PW51bGwmJihoPXRoaXMuZ2V0Rm9sZFdpZGdldChhLGcucm93KSksaD09InN0YXJ0IiYmKGcucm93LS0sZy5jb2x1bW49YS5nZXRMaW5lKGcucm93KS5sZW5ndGgpLGQuZnJvbVBvaW50cyhmLGcpfX0pKS5jYWxsKGUucHJvdG90eXBlKX0pLGRlZmluZSgiYWNlL21vZGUvZ3Jvb3Z5X2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9sYW5nIiwiYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4uL2xpYi9sYW5nIiksZj1hKCIuL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIpLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyxnPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsaD1mdW5jdGlvbigpe3ZhciBhPWUuYXJyYXlUb01hcCgiYXNzZXJ0fHdpdGh8YWJzdHJhY3R8Y29udGludWV8Zm9yfG5ld3xzd2l0Y2h8YXNzZXJ0fGRlZmF1bHR8Z290b3xwYWNrYWdlfHN5bmNocm9uaXplZHxib29sZWFufGRvfGlmfHByaXZhdGV8dGhpc3xicmVha3xkb3VibGV8aW1wbGVtZW50c3xwcm90ZWN0ZWR8dGhyb3d8Ynl0ZXxlbHNlfGltcG9ydHxwdWJsaWN8dGhyb3dzfGNhc2V8ZW51bXxpbnN0YW5jZW9mfHJldHVybnx0cmFuc2llbnR8Y2F0Y2h8ZXh0ZW5kc3xpbnR8c2hvcnR8dHJ5fGNoYXJ8ZmluYWx8aW50ZXJmYWNlfHN0YXRpY3x2b2lkfGNsYXNzfGZpbmFsbHl8bG9uZ3xzdHJpY3RmcHx2b2xhdGlsZXxkZWZ8ZmxvYXR8bmF0aXZlfHN1cGVyfHdoaWxlIi5zcGxpdCgifCIpKSxiPWUuYXJyYXlUb01hcCgibnVsbHxJbmZpbml0eXxOYU58dW5kZWZpbmVkIi5zcGxpdCgifCIpKSxjPWUuYXJyYXlUb01hcCgiQWJzdHJhY3RNZXRob2RFcnJvcnxBc3NlcnRpb25FcnJvcnxDbGFzc0NpcmN1bGFyaXR5RXJyb3J8Q2xhc3NGb3JtYXRFcnJvcnxEZXByZWNhdGVkfEVudW1Db25zdGFudE5vdFByZXNlbnRFeGNlcHRpb258RXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yfElsbGVnYWxBY2Nlc3NFcnJvcnxJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb258SW5zdGFudGlhdGlvbkVycm9yfEludGVybmFsRXJyb3J8TmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb258Tm9TdWNoRmllbGRFcnJvcnxPdmVycmlkZXxQcm9jZXNzfFByb2Nlc3NCdWlsZGVyfFNlY3VyaXR5TWFuYWdlcnxTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9ufFN1cHByZXNzV2FybmluZ3N8VHlwZU5vdFByZXNlbnRFeGNlcHRpb258VW5rbm93bkVycm9yfFVuc2F0aXNmaWVkTGlua0Vycm9yfFVuc3VwcG9ydGVkQ2xhc3NWZXJzaW9uRXJyb3J8VmVyaWZ5RXJyb3J8SW5zdGFudGlhdGlvbkV4Y2VwdGlvbnxJbmRleE91dE9mQm91bmRzRXhjZXB0aW9ufEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbnxDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbnxOb1N1Y2hGaWVsZEV4Y2VwdGlvbnxJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb258TnVtYmVyRm9ybWF0RXhjZXB0aW9ufFNlY3VyaXR5RXhjZXB0aW9ufFZvaWR8SW5oZXJpdGFibGVUaHJlYWRMb2NhbHxJbGxlZ2FsU3RhdGVFeGNlcHRpb258SW50ZXJydXB0ZWRFeGNlcHRpb258Tm9TdWNoTWV0aG9kRXhjZXB0aW9ufElsbGVnYWxBY2Nlc3NFeGNlcHRpb258VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb258RW51bXxTdHJpY3RNYXRofFBhY2thZ2V8Q29tcGlsZXJ8UmVhZGFibGV8UnVudGltZXxTdHJpbmdCdWlsZGVyfE1hdGh8SW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvcnxOb1N1Y2hNZXRob2RFcnJvcnxUaHJlYWRMb2NhbHxSdW50aW1lUGVybWlzc2lvbnxBcml0aG1ldGljRXhjZXB0aW9ufE51bGxQb2ludGVyRXhjZXB0aW9ufExvbmd8SW50ZWdlcnxTaG9ydHxCeXRlfERvdWJsZXxOdW1iZXJ8RmxvYXR8Q2hhcmFjdGVyfEJvb2xlYW58U3RhY2tUcmFjZUVsZW1lbnR8QXBwZW5kYWJsZXxTdHJpbmdCdWZmZXJ8SXRlcmFibGV8VGhyZWFkR3JvdXB8UnVubmFibGV8VGhyZWFkfElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb258U3RhY2tPdmVyZmxvd0Vycm9yfE91dE9mTWVtb3J5RXJyb3J8VmlydHVhbE1hY2hpbmVFcnJvcnxBcnJheVN0b3JlRXhjZXB0aW9ufENsYXNzQ2FzdEV4Y2VwdGlvbnxMaW5rYWdlRXJyb3J8Tm9DbGFzc0RlZkZvdW5kRXJyb3J8Q2xhc3NOb3RGb3VuZEV4Y2VwdGlvbnxSdW50aW1lRXhjZXB0aW9ufEV4Y2VwdGlvbnxUaHJlYWREZWF0aHxFcnJvcnxUaHJvd2FibGV8U3lzdGVtfENsYXNzTG9hZGVyfENsb25lYWJsZXxDbGFzc3xDaGFyU2VxdWVuY2V8Q29tcGFyYWJsZXxTdHJpbmd8T2JqZWN0Ii5zcGxpdCgifCIpKSxkPWUuYXJyYXlUb01hcCgiIi5zcGxpdCgifCIpKTt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6IlxcL1xcLy4qJCJ9LChuZXcgZikuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCoiLG5leHQ6ImNvbW1lbnQifSx7dG9rZW46InN0cmluZy5yZWdleHAiLHJlZ2V4OiJbL10oPzooPzpcXFsoPzpcXFxcXXxbXlxcXV0pK1xcXSl8KD86XFxcXC98W15cXF0vXSkpKlsvXVxcdypcXHMqKD89WykuLDtdfCQpIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OidbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJ30se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiMFt4WF1bMC05YS1mQS1GXStcXGIifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiJ9LHt0b2tlbjoiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiIscmVnZXg6Iig/OnRydWV8ZmFsc2UpXFxiIn0se3Rva2VuOmZ1bmN0aW9uKGUpe3JldHVybiBlPT0idGhpcyI/InZhcmlhYmxlLmxhbmd1YWdlIjphLmhhc093blByb3BlcnR5KGUpPyJrZXl3b3JkIjpjLmhhc093blByb3BlcnR5KGUpPyJzdXBwb3J0LmZ1bmN0aW9uIjpkLmhhc093blByb3BlcnR5KGUpPyJzdXBwb3J0LmZ1bmN0aW9uIjpiLmhhc093blByb3BlcnR5KGUpPyJjb25zdGFudC5sYW5ndWFnZSI6ImlkZW50aWZpZXIifSxyZWdleDoiW2EtekEtWl8kXVthLXpBLVowLTlfJF0qXFxiIn0se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiXFw/OnxcXD9cXC58XFwqXFwufDw9Pnw9fnw9PX58XFwuQHxcXCpcXC5AfFxcLiZ8YXN8aW58aXN8IXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIn0se3Rva2VuOiJscGFyZW4iLHJlZ2V4OiJbWyh7XSJ9LHt0b2tlbjoicnBhcmVuIixyZWdleDoiW1xcXSl9XSJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifV0sY29tbWVudDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfSx0aGlzLmVtYmVkUnVsZXMoZiwiZG9jLSIsWyhuZXcgZikuZ2V0RW5kUnVsZSgic3RhcnQiKV0pfTtkLmluaGVyaXRzKGgsZyksYi5Hcm9vdnlIaWdobGlnaHRSdWxlcz1ofSksZnVuY3Rpb24oKXt3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSxmdW5jdGlvbihhKXt3aW5kb3cuYWNlfHwod2luZG93LmFjZT17fSk7Zm9yKHZhciBiIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShiKSYmKGFjZVtiXT1hW2JdKX0pfSgp]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-haxe-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCdhY2UvbW9kZS9oYXhlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvaGF4ZV9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOwp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOwp2YXIgSGF4ZUhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9oYXhlX2hpZ2hsaWdodF9ydWxlcyIpLkhheGVIaWdobGlnaHRSdWxlczsKdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gcmVxdWlyZSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQ7CnZhciBDc3R5bGVCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2JlaGF2aW91ci9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXI7CnZhciBDU3R5bGVGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZTsKCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKG5ldyBIYXhlSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsKICAgIHRoaXMuJG91dGRlbnQgPSBuZXcgTWF0Y2hpbmdCcmFjZU91dGRlbnQoKTsKICAgIHRoaXMuJGJlaGF2aW91ciA9IG5ldyBDc3R5bGVCZWhhdmlvdXIoKTsKICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IENTdHlsZUZvbGRNb2RlKCk7Cn07Cm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7CgooZnVuY3Rpb24oKSB7CgogICAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgewogICAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsKCiAgICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsKICAgICAgICAgIHZhciB0b2tlbnMgPSB0b2tlbml6ZWRMaW5lLnRva2VuczsKCiAgICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXS50eXBlID09ICJjb21tZW50IikgewogICAgICAgICAgICAgIHJldHVybiBpbmRlbnQ7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKHN0YXRlID09ICJzdGFydCIpIHsKICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eLipbXHtcKFxbXVxzKiQvKTsKICAgICAgICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuIGluZGVudDsKICAgICAgfTsKCiAgICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7CiAgICAgICAgICByZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQobGluZSwgaW5wdXQpOwogICAgICB9OwoKICAgICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgewogICAgICAgICAgdGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChkb2MsIHJvdyk7CiAgICAgIH07CgoKICAgIHRoaXMuY3JlYXRlV29ya2VyID0gZnVuY3Rpb24oc2Vzc2lvbikgewogICAgICAgIHJldHVybiBudWxsOwogICAgfTsKCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOwoKZXhwb3J0cy5Nb2RlID0gTW9kZTsKfSk7CmRlZmluZSgnYWNlL21vZGUvaGF4ZV9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsKdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIikuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzOwp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsKCnZhciBIYXhlSGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsKCiAgICB2YXIga2V5d29yZHMgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCJicmVha3xjYXNlfGNhc3R8Y2F0Y2h8Y2xhc3N8Y29udGludWV8ZGVmYXVsdHxlbHNlfGVudW18ZXh0ZW5kc3xmb3J8ZnVuY3Rpb258aWZ8aW1wbGVtZW50c3xpbXBvcnR8aW58aW5saW5lfGludGVyZmFjZXxuZXd8b3ZlcnJpZGV8cGFja2FnZXxwcml2YXRlfHB1YmxpY3xyZXR1cm58c3RhdGljfHN1cGVyfHN3aXRjaHx0aGlzfHRocm93fHRyYWNlfHRyeXx0eXBlZGVmfHVudHlwZWR8dmFyfHdoaWxlfEFycmF5fFZvaWR8Qm9vbHxJbnR8VUludHxGbG9hdHxEeW5hbWljfFN0cmluZ3xMaXN0fEhhc2h8SW50SGFzaHxFcnJvcnxVbmtub3dufFR5cGV8U3RkIikuc3BsaXQoInwiKQogICAgKTsKCiAgICB2YXIgYnVpbGRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoIm51bGx8dHJ1ZXxmYWxzZSIpLnNwbGl0KCJ8IikKICAgICk7CgoKICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcy4gVXNlICg/OikgaW5zdGVhZC4KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQKCiAgICB0aGlzLiRydWxlcyA9IHsKICAgICAgICAic3RhcnQiIDogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcLy4qJCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0IiksCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZy5yZWdleHAiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiWy9dKD86KD86XFxbKD86XFxcXF18W15cXF1dKStcXF0pfCg/OlxcXFwvfFteXFxdL10pKSpbL11cXHcqXFxzKig/PVspLiw7XXwkKSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUKICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaGV4CiAgICAgICAgICAgICAgICByZWdleCA6ICIwW3hYXVswLTlhLWZBLUZdK1xcYiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGZsb2F0CiAgICAgICAgICAgICAgICByZWdleCA6ICJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiIsCiAgICAgICAgICAgICAgICByZWdleCA6ICIoPzp0cnVlfGZhbHNlKVxcYiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAidGhpcyIpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUubGFuZ3VhZ2UiOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleXdvcmRzLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsZGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImlkZW50aWZpZXIiOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIC8vIFRPRE86IFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcwogICAgICAgICAgICAgICAgLy8gVE9ETzogVW5pY29kZSBpZGVudGlmaWVycwogICAgICAgICAgICAgICAgcmVnZXggOiAiW2EtekEtWl8kXVthLXpBLVowLTlfJF0qXFxiIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIiF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT09fD09fD18IT18IT09fDw9fD49fDw8PXw+Pj18Pj4+PXw8Pnw8fD58IXwmJnxcXHxcXHx8XFw/XFw6fFxcKj18JT18XFwrPXxcXC09fCY9fFxcXj18XFxiKD86aW58aW5zdGFuY2VvZnxuZXd8ZGVsZXRlfHR5cGVvZnx2b2lkKSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAicHVuY3R1YXRpb24ub3BlcmF0b3IiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFw/fFxcOnxcXCx8XFw7fFxcLiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ubHBhcmVuIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIltbKHs8XSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIltcXF0pfT5dIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJjb21tZW50IiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudAogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwKICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfTsKCiAgICB0aGlzLmVtYmVkUnVsZXMoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLCAiZG9jLSIsCiAgICAgICAgWyBuZXcgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzKCkuZ2V0RW5kUnVsZSgic3RhcnQiKSBdKTsKfTsKCm9vcC5pbmhlcml0cyhIYXhlSGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7CgpleHBvcnRzLkhheGVIaWdobGlnaHRSdWxlcyA9IEhheGVIaWdobGlnaHRSdWxlczsKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7Cgp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7CgogICAgdGhpcy4kcnVsZXMgPSB7CiAgICAgICAgInN0YXJ0IiA6IFsgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYy50YWciLAogICAgICAgICAgICByZWdleCA6ICJAW1xcd1xcZF9dKyIgLy8gVE9ETzogZml4IGVtYWlsIGFkZHJlc3NlcwogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlxccysiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiVE9ETyIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICJbXkBcXCpdKyIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICIuIgogICAgICAgIH1dCiAgICB9Owp9OwoKb29wLmluaGVyaXRzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmdldFN0YXJ0UnVsZSA9IGZ1bmN0aW9uKHN0YXJ0KSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLCAvLyBkb2MgY29tbWVudAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKig/PVxcKikiLAogICAgICAgICAgICBuZXh0ICA6IHN0YXJ0CiAgICAgICAgfTsKICAgIH07CiAgICAKICAgIHRoaXMuZ2V0RW5kUnVsZSA9IGZ1bmN0aW9uIChzdGFydCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gY2xvc2luZyBjb21tZW50CiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiXFwqXFwvIiwKICAgICAgICAgICAgbmV4dCAgOiBzdGFydAogICAgICAgIH07CiAgICB9OwoKfSkuY2FsbChEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMucHJvdG90eXBlKTsKCmV4cG9ydHMuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzOwoKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOwoKdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gZnVuY3Rpb24oKSB7fTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKGxpbmUsIGlucHV0KSB7CiAgICAgICAgaWYgKCEgL15ccyskLy50ZXN0KGxpbmUpKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgIHJldHVybiAvXlxzKlx9Ly50ZXN0KGlucHV0KTsKICAgIH07CgogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKGRvYywgcm93KSB7CiAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShyb3cpOwogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMqXH0pLyk7CgogICAgICAgIGlmICghbWF0Y2gpIHJldHVybiAwOwoKICAgICAgICB2YXIgY29sdW1uID0gbWF0Y2hbMV0ubGVuZ3RoOwogICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBkb2MuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiByb3csIGNvbHVtbjogY29sdW1ufSk7CgogICAgICAgIGlmICghb3BlbkJyYWNlUG9zIHx8IG9wZW5CcmFjZVBvcy5yb3cgPT0gcm93KSByZXR1cm4gMDsKCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChkb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7CiAgICAgICAgZG9jLnJlcGxhY2UobmV3IFJhbmdlKHJvdywgMCwgcm93LCBjb2x1bW4tMSksIGluZGVudCk7CiAgICB9OwoKICAgIHRoaXMuJGdldEluZGVudCA9IGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKykvKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICIiOwogICAgfTsKCn0pLmNhbGwoTWF0Y2hpbmdCcmFjZU91dGRlbnQucHJvdG90eXBlKTsKCmV4cG9ydHMuTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBNYXRjaGluZ0JyYWNlT3V0ZGVudDsKfSk7Ci8qIHZpbTp0cz00OnN0cz00OnN3PTQ6CiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgQ2hyaXMgU3BlbmNlciA8Y2hyaXMuYWcuc3BlbmNlciBBVCBnb29nbGVtYWlsIERPVCBjb20+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL2JlaGF2aW91ciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsKdmFyIEJlaGF2aW91ciA9IHJlcXVpcmUoJy4uL2JlaGF2aW91cicpLkJlaGF2aW91cjsKCnZhciBDc3R5bGVCZWhhdmlvdXIgPSBmdW5jdGlvbiAoKSB7CgogICAgdGhpcy5hZGQoImJyYWNlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7CiAgICAgICAgaWYgKHRleHQgPT0gJ3snKSB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7CiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3snICsgc2VsZWN0ZWQgKyAnfScsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAne30nLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJ30nKSB7CiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9JykgewogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCd9Jywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOwogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICJcbiIpIHsKICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOwogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7CiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7CiAgICAgICAgICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gc2Vzc2lvbi5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IGN1cnNvci5yb3csIGNvbHVtbjogY3Vyc29yLmNvbHVtbiArIDF9KTsKICAgICAgICAgICAgICAgIGlmICghb3BlbkJyYWNlUG9zKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKCiAgICAgICAgICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy5nZXROZXh0TGluZUluZGVudChzdGF0ZSwgbGluZS5zdWJzdHJpbmcoMCwgbGluZS5sZW5ndGggLSAxKSwgc2Vzc2lvbi5nZXRUYWJTdHJpbmcoKSk7CiAgICAgICAgICAgICAgICB2YXIgbmV4dF9pbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoc2Vzc2lvbi5kb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnXG4nICsgaW5kZW50ICsgJ1xuJyArIG5leHRfaW5kZW50LAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIGluZGVudC5sZW5ndGgsIDEsIGluZGVudC5sZW5ndGhdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCiAgICB0aGlzLmFkZCgiYnJhY2VzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsKICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOwogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAneycpIHsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7CiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5lbmQuY29sdW1uLCByYW5nZS5lbmQuY29sdW1uICsgMSk7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsKICAgICAgICBpZiAodGV4dCA9PSAnKCcpIHsKICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOwogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsKICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCcgKyBzZWxlY3RlZCArICcpJywKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcoKScsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnKScpIHsKICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOwogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7CiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7CiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hpbmcgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQoJyknLCB7Y29sdW1uOiBjdXJzb3IuY29sdW1uICsgMSwgcm93OiBjdXJzb3Iucm93fSk7CiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmcgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsKICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOwogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnKCcpIHsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7CiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4gKyAxLCByYW5nZS5zdGFydC5jb2x1bW4gKyAyKTsKICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnKScpIHsKICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsKICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7CiAgICAgICAgaWYgKHRleHQgPT0gJyInKSB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7CiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJyInICsgc2VsZWN0ZWQgKyAnIicsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOwogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICAgICAgdmFyIGxlZnRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbi0xLCBjdXJzb3IuY29sdW1uKTsKCiAgICAgICAgICAgICAgICAvLyBXZSdyZSBlc2NhcGVkLgogICAgICAgICAgICAgICAgaWYgKGxlZnRDaGFyID09ICdcXCcpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBGaW5kIHdoYXQgdG9rZW4gd2UncmUgaW5zaWRlLgogICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHNlc3Npb24uZ2V0VG9rZW5zKHNlbGVjdGlvbi5zdGFydC5yb3csIHNlbGVjdGlvbi5zdGFydC5yb3cpWzBdLnRva2VuczsKICAgICAgICAgICAgICAgIHZhciBjb2wgPSAwLCB0b2tlbjsKICAgICAgICAgICAgICAgIHZhciBxdW90ZXBvcyA9IC0xOyAvLyBUcmFjayB3aGV0aGVyIHdlJ3JlIGluc2lkZSBhbiBvcGVuIHF1b3RlLgoKICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgdG9rZW5zLmxlbmd0aDsgeCsrKSB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbeF07CiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gLTE7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxdW90ZXBvcyA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gdG9rZW4udmFsdWUuaW5kZXhPZignIicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoKHRva2VuLnZhbHVlLmxlbmd0aCArIGNvbCkgPiBzZWxlY3Rpb24uc3RhcnQuY29sdW1uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb2wgKz0gdG9rZW5zW3hdLnZhbHVlLmxlbmd0aDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBUcnkgYW5kIGJlIHNtYXJ0IGFib3V0IHdoZW4gd2UgYXV0byBpbnNlcnQuCiAgICAgICAgICAgICAgICBpZiAoIXRva2VuIHx8IChxdW90ZXBvcyA8IDAgJiYgdG9rZW4udHlwZSAhPT0gImNvbW1lbnQiICYmICh0b2tlbi50eXBlICE9PSAic3RyaW5nIiB8fCAoKHNlbGVjdGlvbi5zdGFydC5jb2x1bW4gIT09IHRva2VuLnZhbHVlLmxlbmd0aCtjb2wtMSkgJiYgdG9rZW4udmFsdWUubGFzdEluZGV4T2YoJyInKSA9PT0gdG9rZW4udmFsdWUubGVuZ3RoLTEpKSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIiInLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLDFdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiAmJiB0b2tlbi50eXBlID09PSAic3RyaW5nIikgewogICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpbnB1dCBhbmQgbW92ZSByaWdodCBvbmUgaWYgd2UncmUgdHlwaW5nIG92ZXIgdGhlIGNsb3NpbmcgcXVvdGUuCiAgICAgICAgICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICciJykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsKICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOwogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnIicpIHsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7CiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4gKyAxLCByYW5nZS5zdGFydC5jb2x1bW4gKyAyKTsKICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsKICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsKICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfQpvb3AuaW5oZXJpdHMoQ3N0eWxlQmVoYXZpb3VyLCBCZWhhdmlvdXIpOwoKZXhwb3J0cy5Dc3R5bGVCZWhhdmlvdXIgPSBDc3R5bGVCZWhhdmlvdXI7Cn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9yYW5nZScsICdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsKdmFyIEJhc2VGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGU7Cgp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsKb29wLmluaGVyaXRzKEZvbGRNb2RlLCBCYXNlRm9sZE1vZGUpOwoKKGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyID0gLyhce3xcWylbXlx9XF1dKiR8XlxzKihcL1wqKS87CiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gL15bXlxbXHtdKihcfXxcXSl8Xltcc1wqXSooXCpcLykvOwogICAgCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7CiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleDsKCiAgICAgICAgICAgIGlmIChtYXRjaFsxXSkKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soc2Vzc2lvbiwgbWF0Y2hbMV0sIHJvdywgaSk7CgogICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpICsgbWF0Y2hbMF0ubGVuZ3RoKTsKICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOwogICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoZm9sZFN0eWxlICE9PSAibWFya2JlZ2luZW5kIikKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIpOwogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoOwoKICAgICAgICAgICAgaWYgKG1hdGNoWzJdKSB7CiAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpKTsKICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsKICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGVuZCA9IHtyb3c6IHJvdywgY29sdW1uOiBpfTsKICAgICAgICAgICAgdmFyIHN0YXJ0ID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KG1hdGNoWzFdLCBlbmQpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKCFzdGFydCkKICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgICAgIHN0YXJ0LmNvbHVtbisrOwogICAgICAgICAgICBlbmQuY29sdW1uLS07CgogICAgICAgICAgICByZXR1cm4gIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7CiAgICAgICAgfQogICAgfTsKICAgIAp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7Cgp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7Cgp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG51bGw7CiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gbnVsbDsKCiAgICAvLyBtdXN0IHJldHVybiAiIiBpZiB0aGVyZSdzIG5vIGZvbGQsIHRvIGVuYWJsZSBjYWNoaW5nCiAgICB0aGlzLmdldEZvbGRXaWRnZXQgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgaWYgKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QobGluZSkpCiAgICAgICAgICAgIHJldHVybiAic3RhcnQiOwogICAgICAgIGlmIChmb2xkU3R5bGUgPT0gIm1hcmtiZWdpbmVuZCIKICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIKICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChsaW5lKSkKICAgICAgICAgICAgcmV0dXJuICJlbmQiOwogICAgICAgIHJldHVybiAiIjsKICAgIH07CiAgICAKICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH07CgogICAgdGhpcy5pbmRlbnRhdGlvbkJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgcm93LCBjb2x1bW4pIHsKICAgICAgICB2YXIgcmUgPSAvXlxzKi87CiAgICAgICAgdmFyIHN0YXJ0Um93ID0gcm93OwogICAgICAgIHZhciBlbmRSb3cgPSByb3c7CiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSBjb2x1bW4gfHwgbGluZS5sZW5ndGg7CiAgICAgICAgdmFyIHN0YXJ0TGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7CiAgICAgICAgdmFyIG1heFJvdyA9IHNlc3Npb24uZ2V0TGVuZ3RoKCkKICAgICAgICAKICAgICAgICB3aGlsZSAoKytyb3cgPCBtYXhSb3cpIHsKICAgICAgICAgICAgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOwogICAgICAgICAgICB2YXIgbGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7CgogICAgICAgICAgICBpZiAobGV2ZWwgPT0gbGluZS5sZW5ndGgpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgIGlmIChsZXZlbCA8PSBzdGFydExldmVsKQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBlbmRSb3cgPSByb3c7CiAgICAgICAgfQoKICAgICAgICBpZiAoZW5kUm93ID4gc3RhcnRSb3cpIHsKICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmRSb3cpLmxlbmd0aDsKICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShzdGFydFJvdywgc3RhcnRDb2x1bW4sIGVuZFJvdywgZW5kQ29sdW1uKTsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIGJyYWNrZXQsIHJvdywgY29sdW1uKSB7CiAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbiArIDF9OwogICAgICAgIHZhciBlbmQgPSBzZXNzaW9uLiRmaW5kQ2xvc2luZ0JyYWNrZXQoYnJhY2tldCwgc3RhcnQpOwogICAgICAgIGlmICghZW5kKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIHZhciBmdyA9IHNlc3Npb24uZm9sZFdpZGdldHNbZW5kLnJvd107CiAgICAgICAgaWYgKGZ3ID09IG51bGwpCiAgICAgICAgICAgIGZ3ID0gdGhpcy5nZXRGb2xkV2lkZ2V0KHNlc3Npb24sIGVuZC5yb3cpOwoKICAgICAgICBpZiAoZncgPT0gInN0YXJ0IikgewogICAgICAgICAgICBlbmQucm93IC0tOwogICAgICAgICAgICBlbmQuY29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZC5yb3cpLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7CiAgICB9OwoKfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOwoKfSk7CjsKICAgICAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkKICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkoKTsKICAgICAgICA=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-haxe.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9oYXhlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL2hheGVfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vaGF4ZV9oaWdobGlnaHRfcnVsZXMiKS5IYXhlSGlnaGxpZ2h0UnVsZXMsaD1hKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudCxpPWEoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cixqPWEoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZSxrPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSksdGhpcy4kb3V0ZGVudD1uZXcgaCx0aGlzLiRiZWhhdmlvdXI9bmV3IGksdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGp9O2QuaW5oZXJpdHMoayxlKSxmdW5jdGlvbigpe3RoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuJGdldEluZGVudChiKSxlPXRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGIsYSksZj1lLnRva2VucztpZihmLmxlbmd0aCYmZltmLmxlbmd0aC0xXS50eXBlPT0iY29tbWVudCIpcmV0dXJuIGQ7aWYoYT09InN0YXJ0Iil7dmFyIGc9Yi5tYXRjaCgvXi4qW1x7XChcW11ccyokLyk7ZyYmKGQrPWMpfXJldHVybiBkfSx0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGIsYyl9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoYixjKX0sdGhpcy5jcmVhdGVXb3JrZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGx9fS5jYWxsKGsucHJvdG90eXBlKSxiLk1vZGU9a30pLGRlZmluZSgiYWNlL21vZGUvaGF4ZV9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsZz1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGg9ZnVuY3Rpb24oKXt2YXIgYT1lLmFycmF5VG9NYXAoImJyZWFrfGNhc2V8Y2FzdHxjYXRjaHxjbGFzc3xjb250aW51ZXxkZWZhdWx0fGVsc2V8ZW51bXxleHRlbmRzfGZvcnxmdW5jdGlvbnxpZnxpbXBsZW1lbnRzfGltcG9ydHxpbnxpbmxpbmV8aW50ZXJmYWNlfG5ld3xvdmVycmlkZXxwYWNrYWdlfHByaXZhdGV8cHVibGljfHJldHVybnxzdGF0aWN8c3VwZXJ8c3dpdGNofHRoaXN8dGhyb3d8dHJhY2V8dHJ5fHR5cGVkZWZ8dW50eXBlZHx2YXJ8d2hpbGV8QXJyYXl8Vm9pZHxCb29sfEludHxVSW50fEZsb2F0fER5bmFtaWN8U3RyaW5nfExpc3R8SGFzaHxJbnRIYXNofEVycm9yfFVua25vd258VHlwZXxTdGQiLnNwbGl0KCJ8IikpLGI9ZS5hcnJheVRvTWFwKCJudWxsfHRydWV8ZmFsc2UiLnNwbGl0KCJ8IikpO3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwvXFwvLiokIn0sKG5ldyBmKS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLHt0b2tlbjoiY29tbWVudCIscmVnZXg6IlxcL1xcKiIsbWVyZ2U6ITAsbmV4dDoiY29tbWVudCJ9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6IlsvXSg/Oig/OlxcWyg/OlxcXFxdfFteXFxdXSkrXFxdKXwoPzpcXFxcL3xbXlxcXS9dKSkqWy9dXFx3KlxccyooPz1bKS4sO118JCkifSx7dG9rZW46InN0cmluZyIscmVnZXg6J1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nfSx7dG9rZW46InN0cmluZyIscmVnZXg6IlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10ifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIwW3hYXVswLTlhLWZBLUZdK1xcYiJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIn0se3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5ib29sZWFuIixyZWdleDoiKD86dHJ1ZXxmYWxzZSlcXGIifSx7dG9rZW46ZnVuY3Rpb24oYyl7cmV0dXJuIGM9PSJ0aGlzIj8idmFyaWFibGUubGFuZ3VhZ2UiOmEuaGFzT3duUHJvcGVydHkoYyk/ImtleXdvcmQiOmIuaGFzT3duUHJvcGVydHkoYyk/ImNvbnN0YW50Lmxhbmd1YWdlIjoiaWRlbnRpZmllciJ9LHJlZ2V4OiJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIifSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiIhfFxcJHwlfCZ8XFwqfFxcLVxcLXxcXC18XFwrXFwrfFxcK3x+fD09PXw9PXw9fCE9fCE9PXw8PXw+PXw8PD18Pj49fD4+Pj18PD58PHw+fCF8JiZ8XFx8XFx8fFxcP1xcOnxcXCo9fCU9fFxcKz18XFwtPXwmPXxcXF49fFxcYig/OmlufGluc3RhbmNlb2Z8bmV3fGRlbGV0ZXx0eXBlb2Z8dm9pZCkifSx7dG9rZW46InB1bmN0dWF0aW9uLm9wZXJhdG9yIixyZWdleDoiXFw/fFxcOnxcXCx8XFw7fFxcLiJ9LHt0b2tlbjoicGFyZW4ubHBhcmVuIixyZWdleDoiW1soezxdIn0se3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4OiJbXFxdKX0+XSJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifV0sY29tbWVudDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfSx0aGlzLmVtYmVkUnVsZXMoZiwiZG9jLSIsWyhuZXcgZikuZ2V0RW5kUnVsZSgic3RhcnQiKV0pfTtkLmluaGVyaXRzKGgsZyksYi5IYXhlSGlnaGxpZ2h0UnVsZXM9aH0pLGRlZmluZSgiYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxmPWZ1bmN0aW9uKCl7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQuZG9jLnRhZyIscmVnZXg6IkBbXFx3XFxkX10rIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxccysifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiVE9ETyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJbXkBcXCpdKyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiIuIn1dfX07ZC5pbmhlcml0cyhmLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXRTdGFydFJ1bGU9ZnVuY3Rpb24oYSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKig/PVxcKikiLG5leHQ6YX19LHRoaXMuZ2V0RW5kUnVsZT1mdW5jdGlvbihhKXtyZXR1cm57dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiXFwqXFwvIixuZXh0OmF9fX0uY2FsbChmLnByb3RvdHlwZSksYi5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM9Zn0pLGRlZmluZSgiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vcmFuZ2UiKS5SYW5nZSxlPWZ1bmN0aW9uKCl7fTsoKGZ1bmN0aW9uKCl7dGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4vXlxzKyQvLnRlc3QoYSk/L15ccypcfS8udGVzdChiKTohMX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuZ2V0TGluZShiKSxlPWMubWF0Y2goL14oXHMqXH0pLyk7aWYoIWUpcmV0dXJuIDA7dmFyIGY9ZVsxXS5sZW5ndGgsZz1hLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzpiLGNvbHVtbjpmfSk7aWYoIWd8fGcucm93PT1iKXJldHVybiAwO3ZhciBoPXRoaXMuJGdldEluZGVudChhLmdldExpbmUoZy5yb3cpKTthLnJlcGxhY2UobmV3IGQoYiwwLGIsZi0xKSxoKX0sdGhpcy4kZ2V0SW5kZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEubWF0Y2goL14oXHMrKS8pO3JldHVybiBiP2JbMV06IiJ9fSkpLmNhbGwoZS5wcm90b3R5cGUpLGIuTWF0Y2hpbmdCcmFjZU91dGRlbnQ9ZX0pLGRlZmluZSgiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvYmVoYXZpb3VyIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXIsZj1mdW5jdGlvbigpe3RoaXMuYWRkKCJicmFjZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09InsiKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7cmV0dXJuIGchPT0iIj97dGV4dDoieyIrZysifSIsc2VsZWN0aW9uOiExfTp7dGV4dDoie30iLHNlbGVjdGlvbjpbMSwxXX19aWYoZT09In0iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSJ9Iil7dmFyIGs9ZC4kZmluZE9wZW5pbmdCcmFja2V0KCJ9Iix7Y29sdW1uOmguY29sdW1uKzEscm93Omgucm93fSk7aWYoayE9PW51bGwpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19ZWxzZSBpZihlPT0iXG4iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSJ9Iil7dmFyIGw9ZC5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6aC5yb3csY29sdW1uOmguY29sdW1uKzF9KTtpZighbClyZXR1cm4gbnVsbDt2YXIgbT10aGlzLmdldE5leHRMaW5lSW5kZW50KGEsaS5zdWJzdHJpbmcoMCxpLmxlbmd0aC0xKSxkLmdldFRhYlN0cmluZygpKSxuPXRoaXMuJGdldEluZGVudChkLmRvYy5nZXRMaW5lKGwucm93KSk7cmV0dXJue3RleHQ6IlxuIittKyJcbiIrbixzZWxlY3Rpb246WzEsbS5sZW5ndGgsMSxtLmxlbmd0aF19fX19KSx0aGlzLmFkZCgiYnJhY2VzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSJ7Iil7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLmVuZC5jb2x1bW4sZS5lbmQuY29sdW1uKzEpO2lmKGg9PSJ9IilyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KSx0aGlzLmFkZCgicGFyZW5zIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSIoIil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/e3RleHQ6IigiK2crIikiLHNlbGVjdGlvbjohMX06e3RleHQ6IigpIixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSIpIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0iKSIpe3ZhciBrPWQuJGZpbmRPcGVuaW5nQnJhY2tldCgiKSIse2NvbHVtbjpoLmNvbHVtbisxLHJvdzpoLnJvd30pO2lmKGshPT1udWxsKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJwYXJlbnMiLCJkZWxldGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1kLmRvYy5nZXRUZXh0UmFuZ2UoZSk7aWYoIWUuaXNNdWx0aUxpbmUoKSYmZj09IigiKXt2YXIgZz1kLmRvYy5nZXRMaW5lKGUuc3RhcnQucm93KSxoPWcuc3Vic3RyaW5nKGUuc3RhcnQuY29sdW1uKzEsZS5zdGFydC5jb2x1bW4rMik7aWYoaD09IikiKXJldHVybiBlLmVuZC5jb2x1bW4rKyxlfX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0nIicpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtpZihnIT09IiIpcmV0dXJue3RleHQ6JyInK2crJyInLHNlbGVjdGlvbjohMX07dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbi0xLGguY29sdW1uKTtpZihqPT0iXFwiKXJldHVybiBudWxsO3ZhciBrPWQuZ2V0VG9rZW5zKGYuc3RhcnQucm93LGYuc3RhcnQucm93KVswXS50b2tlbnMsbD0wLG0sbj0tMTtmb3IodmFyIG89MDtvPGsubGVuZ3RoO28rKyl7bT1rW29dLG0udHlwZT09InN0cmluZyI/bj0tMTpuPDAmJihuPW0udmFsdWUuaW5kZXhPZignIicpKTtpZihtLnZhbHVlLmxlbmd0aCtsPmYuc3RhcnQuY29sdW1uKWJyZWFrO2wrPWtbb10udmFsdWUubGVuZ3RofWlmKCFtfHxuPDAmJm0udHlwZSE9PSJjb21tZW50IiYmKG0udHlwZSE9PSJzdHJpbmcifHxmLnN0YXJ0LmNvbHVtbiE9PW0udmFsdWUubGVuZ3RoK2wtMSYmbS52YWx1ZS5sYXN0SW5kZXhPZignIicpPT09bS52YWx1ZS5sZW5ndGgtMSkpcmV0dXJue3RleHQ6JyIiJyxzZWxlY3Rpb246WzEsMV19O2lmKG0mJm0udHlwZT09PSJzdHJpbmciKXt2YXIgcD1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihwPT0nIicpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19fSksdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSciJyl7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbisxLGUuc3RhcnQuY29sdW1uKzIpO2lmKGg9PSciJylyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KX07ZC5pbmhlcml0cyhmLGUpLGIuQ3N0eWxlQmVoYXZpb3VyPWZ9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvcmFuZ2UiLCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxmPWEoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGUsZz1iLkZvbGRNb2RlPWZ1bmN0aW9uKCl7fTtkLmluaGVyaXRzKGcsZiksZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj0vKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLyx0aGlzLmZvbGRpbmdTdG9wTWFya2VyPS9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLyx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpLGY9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7aWYoZil7dmFyIGc9Zi5pbmRleDtpZihmWzFdKXJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soYSxmWzFdLGMsZyk7dmFyIGg9YS5nZXRDb21tZW50Rm9sZFJhbmdlKGMsZytmWzBdLmxlbmd0aCk7cmV0dXJuIGguZW5kLmNvbHVtbi09MixofWlmKGIhPT0ibWFya2JlZ2luZW5kIilyZXR1cm47dmFyIGY9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTtpZihmKXt2YXIgZz1mLmluZGV4K2ZbMF0ubGVuZ3RoO2lmKGZbMl0pe3ZhciBoPWEuZ2V0Q29tbWVudEZvbGRSYW5nZShjLGcpO3JldHVybiBoLmVuZC5jb2x1bW4tPTIsaH12YXIgaT17cm93OmMsY29sdW1uOmd9LGo9YS4kZmluZE9wZW5pbmdCcmFja2V0KGZbMV0saSk7aWYoIWopcmV0dXJuO3JldHVybiBqLmNvbHVtbisrLGkuY29sdW1uLS0sZS5mcm9tUG9pbnRzKGosaSl9fX0uY2FsbChnLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGU9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPW51bGwsdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj1udWxsLHRoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpO3JldHVybiB0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGQpPyJzdGFydCI6Yj09Im1hcmtiZWdpbmVuZCImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChkKT8iZW5kIjoiIn0sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBudWxsfSx0aGlzLmluZGVudGF0aW9uQmxvY2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPS9eXHMqLyxmPWIsZz1iLGg9YS5nZXRMaW5lKGIpLGk9Y3x8aC5sZW5ndGgsaj1oLm1hdGNoKGUpWzBdLmxlbmd0aCxrPWEuZ2V0TGVuZ3RoKCk7d2hpbGUoKytiPGspe2g9YS5nZXRMaW5lKGIpO3ZhciBsPWgubWF0Y2goZSlbMF0ubGVuZ3RoO2lmKGw9PWgubGVuZ3RoKWNvbnRpbnVlO2lmKGw8PWopYnJlYWs7Zz1ifWlmKGc+Zil7dmFyIG09YS5nZXRMaW5lKGcpLmxlbmd0aDtyZXR1cm4gbmV3IGQoZixpLGcsbSl9fSx0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2s9ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGY9e3JvdzpjLGNvbHVtbjplKzF9LGc9YS4kZmluZENsb3NpbmdCcmFja2V0KGIsZik7aWYoIWcpcmV0dXJuO3ZhciBoPWEuZm9sZFdpZGdldHNbZy5yb3ddO3JldHVybiBoPT1udWxsJiYoaD10aGlzLmdldEZvbGRXaWRnZXQoYSxnLnJvdykpLGg9PSJzdGFydCImJihnLnJvdy0tLGcuY29sdW1uPWEuZ2V0TGluZShnLnJvdykubGVuZ3RoKSxkLmZyb21Qb2ludHMoZixnKX19KSkuY2FsbChlLnByb3RvdHlwZSl9KSxmdW5jdGlvbigpe3dpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLGZ1bmN0aW9uKGEpe3dpbmRvdy5hY2V8fCh3aW5kb3cuYWNlPXt9KTtmb3IodmFyIGIgaW4gYSlhLmhhc093blByb3BlcnR5KGIpJiYoYWNlW2JdPWFbYl0pfSl9KCk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-html-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9odG1sJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS9tb2RlL2phdmFzY3JpcHQnLCAnYWNlL21vZGUvY3NzJywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvaHRtbF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvYmVoYXZpb3VyL3htbCcsICdhY2UvbW9kZS9mb2xkaW5nL2h0bWwnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7CnZhciBKYXZhU2NyaXB0TW9kZSA9IHJlcXVpcmUoIi4vamF2YXNjcmlwdCIpLk1vZGU7CnZhciBDc3NNb2RlID0gcmVxdWlyZSgiLi9jc3MiKS5Nb2RlOwp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOwp2YXIgSHRtbEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9odG1sX2hpZ2hsaWdodF9ydWxlcyIpLkh0bWxIaWdobGlnaHRSdWxlczsKdmFyIFhtbEJlaGF2aW91ciA9IHJlcXVpcmUoIi4vYmVoYXZpb3VyL3htbCIpLlhtbEJlaGF2aW91cjsKdmFyIEh0bWxGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZGluZy9odG1sIikuRm9sZE1vZGU7Cgp2YXIgTW9kZSA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGhpZ2hsaWdodGVyID0gbmV3IEh0bWxIaWdobGlnaHRSdWxlcygpOwogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihoaWdobGlnaHRlci5nZXRSdWxlcygpKTsKICAgIHRoaXMuJGJlaGF2aW91ciA9IG5ldyBYbWxCZWhhdmlvdXIoKTsKICAgIAogICAgdGhpcy4kZW1iZWRzID0gaGlnaGxpZ2h0ZXIuZ2V0RW1iZWRzKCk7CiAgICB0aGlzLmNyZWF0ZU1vZGVEZWxlZ2F0ZXMoewogICAgICAgICJqcy0iOiBKYXZhU2NyaXB0TW9kZSwKICAgICAgICAiY3NzLSI6IENzc01vZGUKICAgIH0pOwogICAgCiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBIdG1sRm9sZE1vZGUoKTsKfTsKb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsKCihmdW5jdGlvbigpIHsKCiAgICAKICAgIHRoaXMudG9nZ2xlQ29tbWVudExpbmVzID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgc3RhcnRSb3csIGVuZFJvdykgewogICAgICAgIHJldHVybiAwOwogICAgfTsKCiAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgewogICAgICAgIHJldHVybiB0aGlzLiRnZXRJbmRlbnQobGluZSk7CiAgICB9OwoKICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfTsKCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOwoKZXhwb3J0cy5Nb2RlID0gTW9kZTsKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvamF2YXNjcmlwdCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCAnYWNlL3JhbmdlJywgJ2FjZS93b3JrZXIvd29ya2VyX2NsaWVudCcsICdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOwp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOwp2YXIgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIpLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlczsKdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gcmVxdWlyZSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQ7CnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7CnZhciBXb3JrZXJDbGllbnQgPSByZXF1aXJlKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudDsKdmFyIENzdHlsZUJlaGF2aW91ciA9IHJlcXVpcmUoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cjsKdmFyIENTdHlsZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlOwoKdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcygpLmdldFJ1bGVzKCkpOwogICAgdGhpcy4kb3V0ZGVudCA9IG5ldyBNYXRjaGluZ0JyYWNlT3V0ZGVudCgpOwogICAgdGhpcy4kYmVoYXZpb3VyID0gbmV3IENzdHlsZUJlaGF2aW91cigpOwogICAgdGhpcy5mb2xkaW5nUnVsZXMgPSBuZXcgQ1N0eWxlRm9sZE1vZGUoKTsKfTsKb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsKCihmdW5jdGlvbigpIHsKCgogICAgdGhpcy50b2dnbGVDb21tZW50TGluZXMgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCBzdGFydFJvdywgZW5kUm93KSB7CiAgICAgICAgdmFyIG91dGRlbnQgPSB0cnVlOwogICAgICAgIHZhciByZSA9IC9eKFxzKilcL1wvLzsKCiAgICAgICAgZm9yICh2YXIgaT1zdGFydFJvdzsgaTw9IGVuZFJvdzsgaSsrKSB7CiAgICAgICAgICAgIGlmICghcmUudGVzdChkb2MuZ2V0TGluZShpKSkpIHsKICAgICAgICAgICAgICAgIG91dGRlbnQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAob3V0ZGVudCkgewogICAgICAgICAgICB2YXIgZGVsZXRlUmFuZ2UgPSBuZXcgUmFuZ2UoMCwgMCwgMCwgMCk7CiAgICAgICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShpKTsKICAgICAgICAgICAgICAgIHZhciBtID0gbGluZS5tYXRjaChyZSk7CiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5zdGFydC5yb3cgPSBpOwogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLnJvdyA9IGk7CiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQuY29sdW1uID0gbVswXS5sZW5ndGg7CiAgICAgICAgICAgICAgICBkb2MucmVwbGFjZShkZWxldGVSYW5nZSwgbVsxXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGRvYy5pbmRlbnRSb3dzKHN0YXJ0Um93LCBlbmRSb3csICIvLyIpOwogICAgICAgIH0KICAgIH07CgogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsKICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGxpbmUpOwoKICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsKICAgICAgICB2YXIgdG9rZW5zID0gdG9rZW5pemVkTGluZS50b2tlbnM7CiAgICAgICAgdmFyIGVuZFN0YXRlID0gdG9rZW5pemVkTGluZS5zdGF0ZTsKCiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggJiYgdG9rZW5zW3Rva2Vucy5sZW5ndGgtMV0udHlwZSA9PSAiY29tbWVudCIpIHsKICAgICAgICAgICAgcmV0dXJuIGluZGVudDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKHN0YXRlID09ICJzdGFydCIgfHwgc3RhdGUgPT0gInJlZ2V4X2FsbG93ZWQiKSB7CiAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14uKig/OlxiY2FzZVxiLipcOnxbXHtcKFxbXSlccyokLyk7CiAgICAgICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gImRvYy1zdGFydCIpIHsKICAgICAgICAgICAgaWYgKGVuZFN0YXRlID09ICJzdGFydCIgfHwgc3RhdGUgPT0gInJlZ2V4X2FsbG93ZWQiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXlxzKihcLz8pXCovKTsKICAgICAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgICAgICBpZiAobWF0Y2hbMV0pIHsKICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gIiAiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaW5kZW50ICs9ICIqICI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBpbmRlbnQ7CiAgICB9OwoKICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsKICAgIH07CgogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgewogICAgICAgIHRoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoZG9jLCByb3cpOwogICAgfTsKICAgIAogICAgdGhpcy5jcmVhdGVXb3JrZXIgPSBmdW5jdGlvbihzZXNzaW9uKSB7CiAgICAgICAgdmFyIHdvcmtlciA9IG5ldyBXb3JrZXJDbGllbnQoWyJhY2UiXSwgIndvcmtlci1qYXZhc2NyaXB0LmpzIiwgImFjZS9tb2RlL2phdmFzY3JpcHRfd29ya2VyIiwgIkphdmFTY3JpcHRXb3JrZXIiKTsKICAgICAgICB3b3JrZXIuYXR0YWNoVG9Eb2N1bWVudChzZXNzaW9uLmdldERvY3VtZW50KCkpOwogICAgICAgICAgICAKICAgICAgICB3b3JrZXIub24oImpzbGludCIsIGZ1bmN0aW9uKHJlc3VsdHMpIHsKICAgICAgICAgICAgdmFyIGVycm9ycyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8cmVzdWx0cy5kYXRhLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSByZXN1bHRzLmRhdGFbaV07CiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpCiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGVycm9yLmxpbmUtMSwKICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBlcnJvci5jaGFyYWN0ZXItMSwKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogZXJyb3IucmVhc29uLAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAid2FybmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbnQ6IGVycm9yCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2Vzc2lvbi5zZXRBbm5vdGF0aW9ucyhlcnJvcnMpOwogICAgICAgIH0pOwogICAgICAgIAogICAgICAgIHdvcmtlci5vbigibmFyY2lzc3VzIiwgZnVuY3Rpb24oZSkgewogICAgICAgICAgICBzZXNzaW9uLnNldEFubm90YXRpb25zKFtlLmRhdGFdKTsKICAgICAgICB9KTsKICAgICAgICAKICAgICAgICB3b3JrZXIub24oInRlcm1pbmF0ZSIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBzZXNzaW9uLmNsZWFyQW5ub3RhdGlvbnMoKTsKICAgICAgICB9KTsKICAgICAgICAKICAgICAgICByZXR1cm4gd29ya2VyOwogICAgfTsKCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOwoKZXhwb3J0cy5Nb2RlID0gTW9kZTsKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICogICAgICBNaWhhaSBTdWNhbiA8bWloYWkgRE9UIHN1Y2FuIEFUIGdtYWlsIERPVCBjb20+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL3VuaWNvZGUnLCAnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7CnZhciB1bmljb2RlID0gcmVxdWlyZSgiLi4vdW5pY29kZSIpOwp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM7CnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOwoKdmFyIEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgewoKICAgIC8vIHNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMKICAgIHZhciBnbG9iYWxzID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAvLyBDb25zdHJ1Y3RvcnMKICAgICAgICAoIkFycmF5fEJvb2xlYW58RGF0ZXxGdW5jdGlvbnxJdGVyYXRvcnxOdW1iZXJ8T2JqZWN0fFJlZ0V4cHxTdHJpbmd8UHJveHl8IiArCiAgICAgIC8vIEU0WAogICAgICAgICAiTmFtZXNwYWNlfFFOYW1lfFhNTHxYTUxMaXN0fCIgKwogICAgICAgICAiQXJyYXlCdWZmZXJ8RmxvYXQzMkFycmF5fEZsb2F0NjRBcnJheXxJbnQxNkFycmF5fEludDMyQXJyYXl8SW50OEFycmF5fCIgKwogICAgICAgICAiVWludDE2QXJyYXl8VWludDMyQXJyYXl8VWludDhBcnJheXxVaW50OENsYW1wZWRBcnJheXwiICsKICAgICAgLy8gRXJyb3JzCiAgICAgICAgIkVycm9yfEV2YWxFcnJvcnxJbnRlcm5hbEVycm9yfFJhbmdlRXJyb3J8UmVmZXJlbmNlRXJyb3J8U3RvcEl0ZXJhdGlvbnwiICsKICAgICAgICAiU3ludGF4RXJyb3J8VHlwZUVycm9yfFVSSUVycm9yfCIgKwogICAgICAvLyAgTm9uLWNvbnN0cnVjdG9yIGZ1bmN0aW9ucwogICAgICAgICJkZWNvZGVVUkl8ZGVjb2RlVVJJQ29tcG9uZW50fGVuY29kZVVSSXxlbmNvZGVVUklDb21wb25lbnR8ZXZhbHxpc0Zpbml0ZXwiICsKICAgICAgICAiaXNOYU58cGFyc2VGbG9hdHxwYXJzZUludHwiICsKICAgICAgLy8gT3RoZXIKICAgICAgICAiSlNPTnxNYXRofCIgKwogICAgICAvLyBQc2V1ZG8KICAgICAgICAidGhpc3xhcmd1bWVudHN8cHJvdG90eXBlfHdpbmRvd3xkb2N1bWVudCIKICAgICAgKS5zcGxpdCgifCIpCiAgICApOwoKICAgIHZhciBrZXl3b3JkcyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoImJyZWFrfGNhc2V8Y2F0Y2h8Y29udGludWV8ZGVmYXVsdHxkZWxldGV8ZG98ZWxzZXxmaW5hbGx5fGZvcnxmdW5jdGlvbnwiICsKICAgICAgICAiaWZ8aW58aW5zdGFuY2VvZnxuZXd8cmV0dXJufHN3aXRjaHx0aHJvd3x0cnl8dHlwZW9mfGxldHx2YXJ8d2hpbGV8d2l0aHwiICsKICAgICAgICAiY29uc3R8eWllbGR8aW1wb3J0fGdldHxzZXQiKS5zcGxpdCgifCIpCiAgICApOwoKICAgIC8vIGtleXdvcmRzIHdoaWNoIGNhbiBiZSBmb2xsb3dlZCBieSByZWd1bGFyIGV4cHJlc3Npb25zCiAgICB2YXIga3dCZWZvcmVSZSA9ICJjYXNlfGRvfGVsc2V8ZmluYWxseXxpbnxpbnN0YW5jZW9mfHJldHVybnx0aHJvd3x0cnl8dHlwZW9mfHlpZWxkIjsKCiAgICB2YXIgZGVwcmVjYXRlZCA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoIl9fcGFyZW50X198X19jb3VudF9ffGVzY2FwZXx1bmVzY2FwZXx3aXRofF9fcHJvdG9fXyIpLnNwbGl0KCJ8IikKICAgICk7CgogICAgdmFyIGRlZmluaXRpb25zID0gbGFuZy5hcnJheVRvTWFwKCgiY29uc3R8bGV0fHZhcnxmdW5jdGlvbiIpLnNwbGl0KCJ8IikpOwoKICAgIHZhciBidWlsZGluQ29uc3RhbnRzID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgibnVsbHxJbmZpbml0eXxOYU58dW5kZWZpbmVkIikuc3BsaXQoInwiKQogICAgKTsKCiAgICB2YXIgZnV0dXJlUmVzZXJ2ZWQgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCJjbGFzc3xlbnVtfGV4dGVuZHN8c3VwZXJ8ZXhwb3J0fGltcGxlbWVudHN8cHJpdmF0ZXwiICsKICAgICAgICAicHVibGljfGludGVyZmFjZXxwYWNrYWdlfHByb3RlY3RlZHxzdGF0aWMiKS5zcGxpdCgifCIpCiAgICApOwoKICAgIC8vIFRPRE86IFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcwogICAgdmFyIGlkZW50aWZpZXJSZSA9ICJbIiArIHVuaWNvZGUucGFja2FnZXMuTCArICJcXCRfXVsiIAogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5MCiAgICAgICAgKyB1bmljb2RlLnBhY2thZ2VzLk1uICsgdW5pY29kZS5wYWNrYWdlcy5NYwogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5OZAogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5QYyArICJcXCRfXSpcXGIiOwogICAgICAgIAogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBVc2UgKD86KSBpbnN0ZWFkLgogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZAoKICAgIHRoaXMuJHJ1bGVzID0gewogICAgICAgICJzdGFydCIgOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwvLiokIgogICAgICAgICAgICB9LAogICAgICAgICAgICBuZXcgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzKCkuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudAogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwKICAgICAgICAgICAgICAgIG5leHQgOiAiY29tbWVudCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUKICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0CiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0uKlxcXFwkJywKICAgICAgICAgICAgICAgIG5leHQgOiAicXFzdHJpbmciCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydAogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddLipcXFxcJCIsCiAgICAgICAgICAgICAgICBuZXh0IDogInFzdHJpbmciCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBoZXgKICAgICAgICAgICAgICAgIHJlZ2V4IDogIjBbeFhdWzAtOWEtZkEtRl0rXFxiIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6IFsia2V5d29yZC5kZWZpbml0aW9uIiwgInRleHQiLCAiZW50aXR5Lm5hbWUuZnVuY3Rpb24iXSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIihmdW5jdGlvbikoXFxzKykoIiArIGlkZW50aWZpZXJSZSArICIpIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5sYW5ndWFnZS5ib29sZWFuIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/OnRydWV8ZmFsc2UpXFxiIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/OiIgKyBrd0JlZm9yZVJlICsgIilcXGIiLAogICAgICAgICAgICAgICAgbmV4dCA6ICJyZWdleF9hbGxvd2VkIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGdsb2JhbHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInZhcmlhYmxlLmxhbmd1YWdlIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZXByZWNhdGVkLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkLmRlcHJlY2F0ZWQiOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZmluaXRpb25zLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkLmRlZmluaXRpb24iOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleXdvcmRzLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsZGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZnV0dXJlUmVzZXJ2ZWQuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuaWxsZWdhbCI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPT0gImRlYnVnZ2VyIikKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkLmRlcHJlY2F0ZWQiOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpZGVudGlmaWVyIjsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICByZWdleCA6IGlkZW50aWZpZXJSZQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIiF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT09fD09fD18IT18IT09fDw9fD49fDw8PXw+Pj18Pj4+PXw8Pnw8fD58IXwmJnxcXHxcXHx8XFw/XFw6fFxcKj18JT18XFwrPXxcXC09fCY9fFxcXj18XFxiKD86aW58aW5zdGFuY2VvZnxuZXd8ZGVsZXRlfHR5cGVvZnx2b2lkKSIsCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwdW5jdHVhdGlvbi5vcGVyYXRvciIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXD98XFw6fFxcLHxcXDt8XFwuIiwKICAgICAgICAgICAgICAgIG5leHQgIDogInJlZ2V4X2FsbG93ZWQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLmxwYXJlbiIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJbWyh7XSIsCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5ycGFyZW4iLAogICAgICAgICAgICAgICAgcmVnZXggOiAiW1xcXSl9XSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC89PyIsCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbjogImNvbW1lbnQiLAogICAgICAgICAgICAgICAgcmVnZXg6ICJeIyEuKiQiIAogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgIC8vIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIG9ubHkgYWxsb3dlZCBhZnRlciBjZXJ0YWluIHRva2Vucy4gVGhpcwogICAgICAgIC8vIG1ha2VzIHN1cmUgd2UgZG9uJ3QgbWl4IHVwIHJlZ2V4cHMgd2l0aCB0aGUgZGl2aXNvbiBvcGVyYXRvcgogICAgICAgICJyZWdleF9hbGxvd2VkIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50CiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLAogICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50X3JlZ2V4X2FsbG93ZWQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwvLiokIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAiLAogICAgICAgICAgICAgICAgcmVnZXg6ICJcXC8iLAogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IiwKICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFxzKyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHkgcmV0dXJuIHRvIHRoZSBzdGFydCBtb2RlIHdpdGhvdXQgbWF0Y2hpbmcKICAgICAgICAgICAgICAgIC8vIGFueXRoaW5nCiAgICAgICAgICAgICAgICB0b2tlbjogImVtcHR5IiwgCiAgICAgICAgICAgICAgICByZWdleDogIiIsCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJyZWdleCI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW46ICJyZWdleHAua2V5d29yZC5vcGVyYXRvciIsCiAgICAgICAgICAgICAgICByZWdleDogIlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIiwKICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleCIKICAgICAgICAgICAgfSwgewoJCQkJLy8gZmxhZwogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwIiwgCiAgICAgICAgICAgICAgICByZWdleDogIi9cXHcqIiwKICAgICAgICAgICAgICAgIG5leHQ6ICJzdGFydCIsCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZSAKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwIiwKICAgICAgICAgICAgICAgIHJlZ2V4OiAiW15cXFxcL1xcW10rIiwKICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleCIsCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwKICAgICAgICAgICAgICAgIHJlZ2V4OiAiXFxbIiwKICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiLAogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW46ICJlbXB0eSIsIAogICAgICAgICAgICAgICAgcmVnZXg6ICIiLAogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0IiAKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW46ICJyZWdleHAua2V5d29yZC5vcGVyYXRvciIsCiAgICAgICAgICAgICAgICByZWdleDogIlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIiwKICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLAogICAgICAgICAgICAgICAgcmVnZXg6ICJdIiwKICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleCIsCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwKICAgICAgICAgICAgICAgIHJlZ2V4OiAiW15cXFxcXFxdXSsiLAogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyIsCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbjogImVtcHR5IiwgCiAgICAgICAgICAgICAgICByZWdleDogIiIsCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiIAogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiY29tbWVudF9yZWdleF9hbGxvd2VkIiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudAogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIG5leHQgOiAicmVnZXhfYWxsb3dlZCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAiLisiCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJjb21tZW50IiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudAogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIgogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAicXFzdHJpbmciIDogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgcmVnZXggOiAnKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqPyInLAogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJwogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAicXN0cmluZyIgOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgICAgICByZWdleCA6ICIoPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/JyIsCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAnLisnCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9OwogICAgCiAgICB0aGlzLmVtYmVkUnVsZXMoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLCAiZG9jLSIsCiAgICAgICAgWyBuZXcgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzKCkuZ2V0RW5kUnVsZSgic3RhcnQiKSBdKTsKfTsKCm9vcC5pbmhlcml0cyhKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7CgpleHBvcnRzLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyA9IEphdmFTY3JpcHRIaWdobGlnaHRSdWxlczsKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7Cgp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7CgogICAgdGhpcy4kcnVsZXMgPSB7CiAgICAgICAgInN0YXJ0IiA6IFsgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYy50YWciLAogICAgICAgICAgICByZWdleCA6ICJAW1xcd1xcZF9dKyIgLy8gVE9ETzogZml4IGVtYWlsIGFkZHJlc3NlcwogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlxccysiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiVE9ETyIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICJbXkBcXCpdKyIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICIuIgogICAgICAgIH1dCiAgICB9Owp9OwoKb29wLmluaGVyaXRzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmdldFN0YXJ0UnVsZSA9IGZ1bmN0aW9uKHN0YXJ0KSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLCAvLyBkb2MgY29tbWVudAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKig/PVxcKikiLAogICAgICAgICAgICBuZXh0ICA6IHN0YXJ0CiAgICAgICAgfTsKICAgIH07CiAgICAKICAgIHRoaXMuZ2V0RW5kUnVsZSA9IGZ1bmN0aW9uIChzdGFydCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gY2xvc2luZyBjb21tZW50CiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiXFwqXFwvIiwKICAgICAgICAgICAgbmV4dCAgOiBzdGFydAogICAgICAgIH07CiAgICB9OwoKfSkuY2FsbChEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMucHJvdG90eXBlKTsKCmV4cG9ydHMuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzOwoKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOwoKdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gZnVuY3Rpb24oKSB7fTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKGxpbmUsIGlucHV0KSB7CiAgICAgICAgaWYgKCEgL15ccyskLy50ZXN0KGxpbmUpKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgIHJldHVybiAvXlxzKlx9Ly50ZXN0KGlucHV0KTsKICAgIH07CgogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKGRvYywgcm93KSB7CiAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShyb3cpOwogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMqXH0pLyk7CgogICAgICAgIGlmICghbWF0Y2gpIHJldHVybiAwOwoKICAgICAgICB2YXIgY29sdW1uID0gbWF0Y2hbMV0ubGVuZ3RoOwogICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBkb2MuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiByb3csIGNvbHVtbjogY29sdW1ufSk7CgogICAgICAgIGlmICghb3BlbkJyYWNlUG9zIHx8IG9wZW5CcmFjZVBvcy5yb3cgPT0gcm93KSByZXR1cm4gMDsKCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChkb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7CiAgICAgICAgZG9jLnJlcGxhY2UobmV3IFJhbmdlKHJvdywgMCwgcm93LCBjb2x1bW4tMSksIGluZGVudCk7CiAgICB9OwoKICAgIHRoaXMuJGdldEluZGVudCA9IGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKykvKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICIiOwogICAgfTsKCn0pLmNhbGwoTWF0Y2hpbmdCcmFjZU91dGRlbnQucHJvdG90eXBlKTsKCmV4cG9ydHMuTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBNYXRjaGluZ0JyYWNlT3V0ZGVudDsKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL3dvcmtlci93b3JrZXJfY2xpZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2V2ZW50X2VtaXR0ZXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCIuLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsKCnZhciBXb3JrZXJDbGllbnQgPSBmdW5jdGlvbih0b3BMZXZlbE5hbWVzcGFjZXMsIHBhY2thZ2VkSnMsIG1vZCwgY2xhc3NuYW1lKSB7CgogICAgdGhpcy5jaGFuZ2VMaXN0ZW5lciA9IHRoaXMuY2hhbmdlTGlzdGVuZXIuYmluZCh0aGlzKTsKCiAgICBpZiAobW9kdWxlLnBhY2thZ2VkKSB7CiAgICAgICAgdmFyIGJhc2UgPSB0aGlzLiRndWVzc0Jhc2VQYXRoKCk7CiAgICAgICAgdGhpcy4kd29ya2VyID0gbmV3IFdvcmtlcihiYXNlICsgcGFja2FnZWRKcyk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICB2YXIgd29ya2VyVXJsID0gdGhpcy4kbm9ybWFsaXplUGF0aChyZXF1aXJlLm5hbWVUb1VybCgiYWNlL3dvcmtlci93b3JrZXIiLCBudWxsLCAiXyIpKTsKICAgICAgICB0aGlzLiR3b3JrZXIgPSBuZXcgV29ya2VyKHdvcmtlclVybCk7CgogICAgICAgIHZhciB0bG5zID0ge307CiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRvcExldmVsTmFtZXNwYWNlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgbnMgPSB0b3BMZXZlbE5hbWVzcGFjZXNbaV07CiAgICAgICAgICAgIHZhciBwYXRoID0gdGhpcy4kbm9ybWFsaXplUGF0aChyZXF1aXJlLm5hbWVUb1VybChucywgbnVsbCwgIl8iKS5yZXBsYWNlKC8uanMkLywgIiIpKTsKCiAgICAgICAgICAgIHRsbnNbbnNdID0gcGF0aDsKICAgICAgICB9CiAgICB9CgogICAgdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHsKICAgICAgICBpbml0IDogdHJ1ZSwKICAgICAgICB0bG5zOiB0bG5zLAogICAgICAgIG1vZHVsZTogbW9kLAogICAgICAgIGNsYXNzbmFtZTogY2xhc3NuYW1lCiAgICB9KTsKCiAgICB0aGlzLmNhbGxiYWNrSWQgPSAxOwogICAgdGhpcy5jYWxsYmFja3MgPSB7fTsKCiAgICB2YXIgX3NlbGYgPSB0aGlzOwogICAgdGhpcy4kd29ya2VyLm9uZXJyb3IgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgd2luZG93LmNvbnNvbGUgJiYgY29uc29sZS5sb2cgJiYgY29uc29sZS5sb2coZSk7CiAgICAgICAgdGhyb3cgZTsKICAgIH07CiAgICB0aGlzLiR3b3JrZXIub25tZXNzYWdlID0gZnVuY3Rpb24oZSkgewogICAgICAgIHZhciBtc2cgPSBlLmRhdGE7CiAgICAgICAgc3dpdGNoKG1zZy50eXBlKSB7CiAgICAgICAgICAgIGNhc2UgImxvZyI6CiAgICAgICAgICAgICAgICB3aW5kb3cuY29uc29sZSAmJiBjb25zb2xlLmxvZyAmJiBjb25zb2xlLmxvZyhtc2cuZGF0YSk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgImV2ZW50IjoKICAgICAgICAgICAgICAgIF9zZWxmLl9lbWl0KG1zZy5uYW1lLCB7ZGF0YTogbXNnLmRhdGF9KTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAiY2FsbCI6CiAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBfc2VsZi5jYWxsYmFja3NbbXNnLmlkXTsKICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1zZy5kYXRhKTsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgX3NlbGYuY2FsbGJhY2tzW21zZy5pZF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9Owp9OwoKKGZ1bmN0aW9uKCl7CgogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOwoKICAgIHRoaXMuJG5vcm1hbGl6ZVBhdGggPSBmdW5jdGlvbihwYXRoKSB7CiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXlthLXpdKzpcL1wvW15cL10rXC8vLCAiIik7IC8vIFJlbW92ZSBkb21haW4gbmFtZSBhbmQgcmVidWlsZCBpdAogICAgICAgIHBhdGggPSBsb2NhdGlvbi5wcm90b2NvbCArICIvLyIgKyBsb2NhdGlvbi5ob3N0CiAgICAgICAgICAgIC8vIHBhdGhzIHN0YXJ0aW5nIHdpdGggYSBzbGFzaCBhcmUgcmVsYXRpdmUgdG8gdGhlIHJvb3QgKGhvc3QpCiAgICAgICAgICAgICsgKHBhdGguY2hhckF0KDApID09ICIvIiA/ICIiIDogbG9jYXRpb24ucGF0aG5hbWUucmVwbGFjZSgvXC9bXlwvXSokLywgIiIpKQogICAgICAgICAgICArICIvIiArIHBhdGgucmVwbGFjZSgvXltcL10rLywgIiIpOwogICAgICAgIHJldHVybiBwYXRoOwogICAgfTsKCiAgICB0aGlzLiRndWVzc0Jhc2VQYXRoID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHJlcXVpcmUuYWNlQmFzZVVybCkKICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmUuYWNlQmFzZVVybDsKCiAgICAgICAgdmFyIHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7CiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHNjcmlwdHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIHNjcmlwdCA9IHNjcmlwdHNbaV07CgogICAgICAgICAgICB2YXIgYmFzZSA9IHNjcmlwdC5nZXRBdHRyaWJ1dGUoImRhdGEtYWNlLWJhc2UiKTsKICAgICAgICAgICAgaWYgKGJhc2UpCiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5yZXBsYWNlKC9cLyokLywgIi8iKTsKCiAgICAgICAgICAgIHZhciBzcmMgPSBzY3JpcHQuc3JjIHx8IHNjcmlwdC5nZXRBdHRyaWJ1dGUoInNyYyIpOwogICAgICAgICAgICBpZiAoIXNyYykgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIG0gPSBzcmMubWF0Y2goL14oPzooLipcLylhY2VcLmpzfCguKlwvKWFjZSgtdW5jb21wcmVzc2VkKT8oLW5vY29uZmxpY3QpP1wuanMpKD86XD98JCkvKTsKICAgICAgICAgICAgaWYgKG0pCiAgICAgICAgICAgICAgICByZXR1cm4gbVsxXSB8fCBtWzJdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gIiI7CiAgICB9OwoKICAgIHRoaXMudGVybWluYXRlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fZW1pdCgidGVybWluYXRlIiwge30pOwogICAgICAgIHRoaXMuJHdvcmtlci50ZXJtaW5hdGUoKTsKICAgICAgICB0aGlzLiR3b3JrZXIgPSBudWxsOwogICAgICAgIHRoaXMuJGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKICAgICAgICB0aGlzLiRkb2MgPSBudWxsOwogICAgfTsKCiAgICB0aGlzLnNlbmQgPSBmdW5jdGlvbihjbWQsIGFyZ3MpIHsKICAgICAgICB0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2NvbW1hbmQ6IGNtZCwgYXJnczogYXJnc30pOwogICAgfTsKCiAgICB0aGlzLmNhbGwgPSBmdW5jdGlvbihjbWQsIGFyZ3MsIGNhbGxiYWNrKSB7CiAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciBpZCA9IHRoaXMuY2FsbGJhY2tJZCsrOwogICAgICAgICAgICB0aGlzLmNhbGxiYWNrc1tpZF0gPSBjYWxsYmFjazsKICAgICAgICAgICAgYXJncy5wdXNoKGlkKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5zZW5kKGNtZCwgYXJncyk7CiAgICB9OwoKICAgIHRoaXMuZW1pdCA9IGZ1bmN0aW9uKGV2ZW50LCBkYXRhKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgLy8gZmlyZWZveCByZWZ1c2VzIHRvIGNsb25lIG9iamVjdHMgd2hpY2ggaGF2ZSBmdW5jdGlvbiBwcm9wZXJ0aWVzCiAgICAgICAgICAgIC8vIFRPRE86IGNsZWFudXAgZXZlbnQKICAgICAgICAgICAgdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtldmVudDogZXZlbnQsIGRhdGE6IHtkYXRhOiBkYXRhLmRhdGF9fSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoKGV4KSB7fQogICAgfTsKCiAgICB0aGlzLmF0dGFjaFRvRG9jdW1lbnQgPSBmdW5jdGlvbihkb2MpIHsKICAgICAgICBpZih0aGlzLiRkb2MpCiAgICAgICAgICAgIHRoaXMudGVybWluYXRlKCk7CgogICAgICAgIHRoaXMuJGRvYyA9IGRvYzsKICAgICAgICB0aGlzLmNhbGwoInNldFZhbHVlIiwgW2RvYy5nZXRWYWx1ZSgpXSk7CiAgICAgICAgZG9jLm9uKCJjaGFuZ2UiLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKICAgIH07CgogICAgdGhpcy5jaGFuZ2VMaXN0ZW5lciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICBlLnJhbmdlID0gewogICAgICAgICAgICBzdGFydDogZS5kYXRhLnJhbmdlLnN0YXJ0LAogICAgICAgICAgICBlbmQ6IGUuZGF0YS5yYW5nZS5lbmQKICAgICAgICB9OwogICAgICAgIHRoaXMuZW1pdCgiY2hhbmdlIiwgZSk7CiAgICB9OwoKfSkuY2FsbChXb3JrZXJDbGllbnQucHJvdG90eXBlKTsKCmV4cG9ydHMuV29ya2VyQ2xpZW50ID0gV29ya2VyQ2xpZW50OwoKfSk7Ci8qIHZpbTp0cz00OnN0cz00OnN3PTQ6CiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgQ2hyaXMgU3BlbmNlciA8Y2hyaXMuYWcuc3BlbmNlciBBVCBnb29nbGVtYWlsIERPVCBjb20+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL2JlaGF2aW91ciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsKdmFyIEJlaGF2aW91ciA9IHJlcXVpcmUoJy4uL2JlaGF2aW91cicpLkJlaGF2aW91cjsKCnZhciBDc3R5bGVCZWhhdmlvdXIgPSBmdW5jdGlvbiAoKSB7CgogICAgdGhpcy5hZGQoImJyYWNlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7CiAgICAgICAgaWYgKHRleHQgPT0gJ3snKSB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7CiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3snICsgc2VsZWN0ZWQgKyAnfScsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAne30nLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJ30nKSB7CiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9JykgewogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCd9Jywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOwogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICJcbiIpIHsKICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOwogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7CiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7CiAgICAgICAgICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gc2Vzc2lvbi5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IGN1cnNvci5yb3csIGNvbHVtbjogY3Vyc29yLmNvbHVtbiArIDF9KTsKICAgICAgICAgICAgICAgIGlmICghb3BlbkJyYWNlUG9zKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKCiAgICAgICAgICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy5nZXROZXh0TGluZUluZGVudChzdGF0ZSwgbGluZS5zdWJzdHJpbmcoMCwgbGluZS5sZW5ndGggLSAxKSwgc2Vzc2lvbi5nZXRUYWJTdHJpbmcoKSk7CiAgICAgICAgICAgICAgICB2YXIgbmV4dF9pbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoc2Vzc2lvbi5kb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnXG4nICsgaW5kZW50ICsgJ1xuJyArIG5leHRfaW5kZW50LAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIGluZGVudC5sZW5ndGgsIDEsIGluZGVudC5sZW5ndGhdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCiAgICB0aGlzLmFkZCgiYnJhY2VzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsKICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOwogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAneycpIHsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7CiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5lbmQuY29sdW1uLCByYW5nZS5lbmQuY29sdW1uICsgMSk7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsKICAgICAgICBpZiAodGV4dCA9PSAnKCcpIHsKICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOwogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsKICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCcgKyBzZWxlY3RlZCArICcpJywKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcoKScsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnKScpIHsKICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOwogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7CiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7CiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hpbmcgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQoJyknLCB7Y29sdW1uOiBjdXJzb3IuY29sdW1uICsgMSwgcm93OiBjdXJzb3Iucm93fSk7CiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmcgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsKICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOwogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnKCcpIHsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7CiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4gKyAxLCByYW5nZS5zdGFydC5jb2x1bW4gKyAyKTsKICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnKScpIHsKICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsKICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7CiAgICAgICAgaWYgKHRleHQgPT0gJyInKSB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7CiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJyInICsgc2VsZWN0ZWQgKyAnIicsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOwogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICAgICAgdmFyIGxlZnRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbi0xLCBjdXJzb3IuY29sdW1uKTsKCiAgICAgICAgICAgICAgICAvLyBXZSdyZSBlc2NhcGVkLgogICAgICAgICAgICAgICAgaWYgKGxlZnRDaGFyID09ICdcXCcpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBGaW5kIHdoYXQgdG9rZW4gd2UncmUgaW5zaWRlLgogICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHNlc3Npb24uZ2V0VG9rZW5zKHNlbGVjdGlvbi5zdGFydC5yb3csIHNlbGVjdGlvbi5zdGFydC5yb3cpWzBdLnRva2VuczsKICAgICAgICAgICAgICAgIHZhciBjb2wgPSAwLCB0b2tlbjsKICAgICAgICAgICAgICAgIHZhciBxdW90ZXBvcyA9IC0xOyAvLyBUcmFjayB3aGV0aGVyIHdlJ3JlIGluc2lkZSBhbiBvcGVuIHF1b3RlLgoKICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgdG9rZW5zLmxlbmd0aDsgeCsrKSB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbeF07CiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gLTE7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxdW90ZXBvcyA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gdG9rZW4udmFsdWUuaW5kZXhPZignIicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoKHRva2VuLnZhbHVlLmxlbmd0aCArIGNvbCkgPiBzZWxlY3Rpb24uc3RhcnQuY29sdW1uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb2wgKz0gdG9rZW5zW3hdLnZhbHVlLmxlbmd0aDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBUcnkgYW5kIGJlIHNtYXJ0IGFib3V0IHdoZW4gd2UgYXV0byBpbnNlcnQuCiAgICAgICAgICAgICAgICBpZiAoIXRva2VuIHx8IChxdW90ZXBvcyA8IDAgJiYgdG9rZW4udHlwZSAhPT0gImNvbW1lbnQiICYmICh0b2tlbi50eXBlICE9PSAic3RyaW5nIiB8fCAoKHNlbGVjdGlvbi5zdGFydC5jb2x1bW4gIT09IHRva2VuLnZhbHVlLmxlbmd0aCtjb2wtMSkgJiYgdG9rZW4udmFsdWUubGFzdEluZGV4T2YoJyInKSA9PT0gdG9rZW4udmFsdWUubGVuZ3RoLTEpKSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIiInLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLDFdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiAmJiB0b2tlbi50eXBlID09PSAic3RyaW5nIikgewogICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpbnB1dCBhbmQgbW92ZSByaWdodCBvbmUgaWYgd2UncmUgdHlwaW5nIG92ZXIgdGhlIGNsb3NpbmcgcXVvdGUuCiAgICAgICAgICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICciJykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsKICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOwogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnIicpIHsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7CiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4gKyAxLCByYW5nZS5zdGFydC5jb2x1bW4gKyAyKTsKICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsKICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsKICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfQpvb3AuaW5oZXJpdHMoQ3N0eWxlQmVoYXZpb3VyLCBCZWhhdmlvdXIpOwoKZXhwb3J0cy5Dc3R5bGVCZWhhdmlvdXIgPSBDc3R5bGVCZWhhdmlvdXI7Cn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9yYW5nZScsICdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsKdmFyIEJhc2VGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGU7Cgp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsKb29wLmluaGVyaXRzKEZvbGRNb2RlLCBCYXNlRm9sZE1vZGUpOwoKKGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyID0gLyhce3xcWylbXlx9XF1dKiR8XlxzKihcL1wqKS87CiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gL15bXlxbXHtdKihcfXxcXSl8Xltcc1wqXSooXCpcLykvOwogICAgCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7CiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleDsKCiAgICAgICAgICAgIGlmIChtYXRjaFsxXSkKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soc2Vzc2lvbiwgbWF0Y2hbMV0sIHJvdywgaSk7CgogICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpICsgbWF0Y2hbMF0ubGVuZ3RoKTsKICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOwogICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoZm9sZFN0eWxlICE9PSAibWFya2JlZ2luZW5kIikKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIpOwogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoOwoKICAgICAgICAgICAgaWYgKG1hdGNoWzJdKSB7CiAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpKTsKICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsKICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGVuZCA9IHtyb3c6IHJvdywgY29sdW1uOiBpfTsKICAgICAgICAgICAgdmFyIHN0YXJ0ID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KG1hdGNoWzFdLCBlbmQpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKCFzdGFydCkKICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgICAgIHN0YXJ0LmNvbHVtbisrOwogICAgICAgICAgICBlbmQuY29sdW1uLS07CgogICAgICAgICAgICByZXR1cm4gIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7CiAgICAgICAgfQogICAgfTsKICAgIAp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7Cgp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7Cgp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG51bGw7CiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gbnVsbDsKCiAgICAvLyBtdXN0IHJldHVybiAiIiBpZiB0aGVyZSdzIG5vIGZvbGQsIHRvIGVuYWJsZSBjYWNoaW5nCiAgICB0aGlzLmdldEZvbGRXaWRnZXQgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgaWYgKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QobGluZSkpCiAgICAgICAgICAgIHJldHVybiAic3RhcnQiOwogICAgICAgIGlmIChmb2xkU3R5bGUgPT0gIm1hcmtiZWdpbmVuZCIKICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIKICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChsaW5lKSkKICAgICAgICAgICAgcmV0dXJuICJlbmQiOwogICAgICAgIHJldHVybiAiIjsKICAgIH07CiAgICAKICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH07CgogICAgdGhpcy5pbmRlbnRhdGlvbkJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgcm93LCBjb2x1bW4pIHsKICAgICAgICB2YXIgcmUgPSAvXlxzKi87CiAgICAgICAgdmFyIHN0YXJ0Um93ID0gcm93OwogICAgICAgIHZhciBlbmRSb3cgPSByb3c7CiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSBjb2x1bW4gfHwgbGluZS5sZW5ndGg7CiAgICAgICAgdmFyIHN0YXJ0TGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7CiAgICAgICAgdmFyIG1heFJvdyA9IHNlc3Npb24uZ2V0TGVuZ3RoKCkKICAgICAgICAKICAgICAgICB3aGlsZSAoKytyb3cgPCBtYXhSb3cpIHsKICAgICAgICAgICAgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOwogICAgICAgICAgICB2YXIgbGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7CgogICAgICAgICAgICBpZiAobGV2ZWwgPT0gbGluZS5sZW5ndGgpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgIGlmIChsZXZlbCA8PSBzdGFydExldmVsKQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBlbmRSb3cgPSByb3c7CiAgICAgICAgfQoKICAgICAgICBpZiAoZW5kUm93ID4gc3RhcnRSb3cpIHsKICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmRSb3cpLmxlbmd0aDsKICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShzdGFydFJvdywgc3RhcnRDb2x1bW4sIGVuZFJvdywgZW5kQ29sdW1uKTsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIGJyYWNrZXQsIHJvdywgY29sdW1uKSB7CiAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbiArIDF9OwogICAgICAgIHZhciBlbmQgPSBzZXNzaW9uLiRmaW5kQ2xvc2luZ0JyYWNrZXQoYnJhY2tldCwgc3RhcnQpOwogICAgICAgIGlmICghZW5kKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIHZhciBmdyA9IHNlc3Npb24uZm9sZFdpZGdldHNbZW5kLnJvd107CiAgICAgICAgaWYgKGZ3ID09IG51bGwpCiAgICAgICAgICAgIGZ3ID0gdGhpcy5nZXRGb2xkV2lkZ2V0KHNlc3Npb24sIGVuZC5yb3cpOwoKICAgICAgICBpZiAoZncgPT0gInN0YXJ0IikgewogICAgICAgICAgICBlbmQucm93IC0tOwogICAgICAgICAgICBlbmQuY29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZC5yb3cpLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7CiAgICB9OwoKfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOwoKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvY3NzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvY3NzX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgJ2FjZS93b3JrZXIvd29ya2VyX2NsaWVudCcsICdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsKdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsKdmFyIENzc0hpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9jc3NfaGlnaGxpZ2h0X3J1bGVzIikuQ3NzSGlnaGxpZ2h0UnVsZXM7CnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Owp2YXIgV29ya2VyQ2xpZW50ID0gcmVxdWlyZSgiLi4vd29ya2VyL3dvcmtlcl9jbGllbnQiKS5Xb3JrZXJDbGllbnQ7CnZhciBDU3R5bGVGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZTsKCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKG5ldyBDc3NIaWdobGlnaHRSdWxlcygpLmdldFJ1bGVzKCksICJpIik7CiAgICB0aGlzLiRvdXRkZW50ID0gbmV3IE1hdGNoaW5nQnJhY2VPdXRkZW50KCk7CiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBDU3R5bGVGb2xkTW9kZSgpOwp9Owpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOwoKKGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gImNTdHlsZSI7CgogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsKICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGxpbmUpOwoKICAgICAgICAvLyBpZ25vcmUgYnJhY2VzIGluIGNvbW1lbnRzCiAgICAgICAgdmFyIHRva2VucyA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKS50b2tlbnM7CiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggJiYgdG9rZW5zW3Rva2Vucy5sZW5ndGgtMV0udHlwZSA9PSAiY29tbWVudCIpIHsKICAgICAgICAgICAgcmV0dXJuIGluZGVudDsKICAgICAgICB9CgogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14uKlx7XHMqJC8pOwogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICBpbmRlbnQgKz0gdGFiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGluZGVudDsKICAgIH07CgogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgaW5wdXQpIHsKICAgICAgICByZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQobGluZSwgaW5wdXQpOwogICAgfTsKCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgcm93KSB7CiAgICAgICAgdGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChkb2MsIHJvdyk7CiAgICB9OwogICAgCiAgICB0aGlzLmNyZWF0ZVdvcmtlciA9IGZ1bmN0aW9uKHNlc3Npb24pIHsKICAgICAgICB2YXIgd29ya2VyID0gbmV3IFdvcmtlckNsaWVudChbImFjZSJdLCAid29ya2VyLWNzcy5qcyIsICJhY2UvbW9kZS9jc3Nfd29ya2VyIiwgIldvcmtlciIpOwogICAgICAgIHdvcmtlci5hdHRhY2hUb0RvY3VtZW50KHNlc3Npb24uZ2V0RG9jdW1lbnQoKSk7CiAgICAgICAgCiAgICAgICAgd29ya2VyLm9uKCJjc3NsaW50IiwgZnVuY3Rpb24oZSkgewogICAgICAgICAgICB2YXIgZXJyb3JzID0gW107CiAgICAgICAgICAgIGUuZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICByb3c6IG1lc3NhZ2UubGluZSAtIDEsCiAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBtZXNzYWdlLmNvbCAtIDEsCiAgICAgICAgICAgICAgICAgICAgdGV4dDogbWVzc2FnZS5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgIHR5cGU6IG1lc3NhZ2UudHlwZSwKICAgICAgICAgICAgICAgICAgICBsaW50OiBtZXNzYWdlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBzZXNzaW9uLnNldEFubm90YXRpb25zKGVycm9ycyk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHdvcmtlcjsKICAgIH07Cgp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsKCmV4cG9ydHMuTW9kZSA9IE1vZGU7Cgp9KTsKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9jc3NfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsKdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7Cgp2YXIgQ3NzSGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsKCiAgICB2YXIgcHJvcGVydGllcyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoIi1tb3otYXBwZWFyYW5jZXwtbW96LWJveC1zaXppbmd8LXdlYmtpdC1ib3gtc2l6aW5nfC1tb3otb3V0bGluZS1yYWRpdXN8LW1vei10cmFuc2Zvcm18LXdlYmtpdC10cmFuc2Zvcm18IiArCiAgICAgICAgImFwcGVhcmFuY2V8YXppbXV0aHxiYWNrZ3JvdW5kLWF0dGFjaG1lbnR8YmFja2dyb3VuZC1jb2xvcnxiYWNrZ3JvdW5kLWltYWdlfCIgKwogICAgICAgICJiYWNrZ3JvdW5kLW9yaWdpbnxiYWNrZ3JvdW5kLXBvc2l0aW9ufGJhY2tncm91bmQtcmVwZWF0fGJhY2tncm91bmR8Ym9yZGVyLWJvdHRvbS1jb2xvcnwiICsKICAgICAgICAiYm9yZGVyLWJvdHRvbS1zdHlsZXxib3JkZXItYm90dG9tLXdpZHRofGJvcmRlci1ib3R0b218Ym9yZGVyLWNvbGxhcHNlfCIgKwogICAgICAgICJib3JkZXItY29sb3J8Ym9yZGVyLWxlZnQtY29sb3J8Ym9yZGVyLWxlZnQtc3R5bGV8Ym9yZGVyLWxlZnQtd2lkdGh8IiArCiAgICAgICAgImJvcmRlci1sZWZ0fGJvcmRlci1yaWdodC1jb2xvcnxib3JkZXItcmlnaHQtc3R5bGV8Ym9yZGVyLXJpZ2h0LXdpZHRofCIgKwogICAgICAgICJib3JkZXItcmlnaHR8Ym9yZGVyLXNwYWNpbmd8Ym9yZGVyLXN0eWxlfGJvcmRlci10b3AtY29sb3J8IiArCiAgICAgICAgImJvcmRlci10b3Atc3R5bGV8Ym9yZGVyLXRvcC13aWR0aHxib3JkZXItdG9wfGJvcmRlci13aWR0aHxib3JkZXJ8IiArCiAgICAgICAgImJvdHRvbXxib3gtc2l6aW5nfGNhcHRpb24tc2lkZXxjbGVhcnxjbGlwfGNvbG9yfGNvbnRlbnR8Y291bnRlci1pbmNyZW1lbnR8IiArCiAgICAgICAgImNvdW50ZXItcmVzZXR8Y3VlLWFmdGVyfGN1ZS1iZWZvcmV8Y3VlfGN1cnNvcnxkaXJlY3Rpb258ZGlzcGxheXwiICsKICAgICAgICAiZWxldmF0aW9ufGVtcHR5LWNlbGxzfGZsb2F0fGZvbnQtZmFtaWx5fGZvbnQtc2l6ZS1hZGp1c3R8Zm9udC1zaXplfCIgKwogICAgICAgICJmb250LXN0cmV0Y2h8Zm9udC1zdHlsZXxmb250LXZhcmlhbnR8Zm9udC13ZWlnaHR8Zm9udHxoZWlnaHR8bGVmdHwiICsKICAgICAgICAibGV0dGVyLXNwYWNpbmd8bGluZS1oZWlnaHR8bGlzdC1zdHlsZS1pbWFnZXxsaXN0LXN0eWxlLXBvc2l0aW9ufCIgKwogICAgICAgICJsaXN0LXN0eWxlLXR5cGV8bGlzdC1zdHlsZXxtYXJnaW4tYm90dG9tfG1hcmdpbi1sZWZ0fG1hcmdpbi1yaWdodHwiICsKICAgICAgICAibWFyZ2luLXRvcHxtYXJrZXItb2Zmc2V0fG1hcmdpbnxtYXJrc3xtYXgtaGVpZ2h0fG1heC13aWR0aHxtaW4taGVpZ2h0fCIgKwogICAgICAgICJtaW4td2lkdGh8LW1vei1ib3JkZXItcmFkaXVzfG9wYWNpdHl8b3JwaGFuc3xvdXRsaW5lLWNvbG9yfG91dGxpbmUtb2Zmc2V0fG91dGxpbmUtcmFkaXVzfCIgKwogICAgICAgICJvdXRsaW5lLXN0eWxlfG91dGxpbmUtd2lkdGh8b3V0bGluZXxvdmVyZmxvd3xvdmVyZmxvdy14fG92ZXJmbG93LXl8cGFkZGluZy1ib3R0b218IiArCiAgICAgICAgInBhZGRpbmctbGVmdHxwYWRkaW5nLXJpZ2h0fHBhZGRpbmctdG9wfHBhZGRpbmd8cGFnZS1icmVhay1hZnRlcnwiICsKICAgICAgICAicGFnZS1icmVhay1iZWZvcmV8cGFnZS1icmVhay1pbnNpZGV8cGFnZXxwYXVzZS1hZnRlcnxwYXVzZS1iZWZvcmV8IiArCiAgICAgICAgInBhdXNlfHBpdGNoLXJhbmdlfHBpdGNofHBsYXktZHVyaW5nfHBvaW50ZXItZXZlbnRzfHBvc2l0aW9ufHF1b3Rlc3xyZXNpemV8cmljaG5lc3N8cmlnaHR8IiArCiAgICAgICAgInNpemV8c3BlYWstaGVhZGVyfHNwZWFrLW51bWVyYWx8c3BlYWstcHVuY3R1YXRpb258c3BlZWNoLXJhdGV8c3BlYWt8IiArCiAgICAgICAgInN0cmVzc3x0YWJsZS1sYXlvdXR8dGV4dC1hbGlnbnx0ZXh0LWRlY29yYXRpb258dGV4dC1pbmRlbnR8IiArCiAgICAgICAgInRleHQtc2hhZG93fHRleHQtdHJhbnNmb3JtfHRvcHx0cmFuc2Zvcm18dW5pY29kZS1iaWRpfHZlcnRpY2FsLWFsaWdufCIgKwogICAgICAgICJ2aXNpYmlsaXR5fHZvaWNlLWZhbWlseXx2b2x1bWV8d2hpdGUtc3BhY2V8d2lkb3dzfHdpZHRofHdvcmQtc3BhY2luZ3wiICsKICAgICAgICAiei1pbmRleCIpLnNwbGl0KCJ8IikKICAgICk7CgogICAgdmFyIGZ1bmN0aW9ucyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoInJnYnxyZ2JhfHVybHxhdHRyfGNvdW50ZXJ8Y291bnRlcnMiKS5zcGxpdCgifCIpCiAgICApOwoKICAgIHZhciBjb25zdGFudHMgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCJhYnNvbHV0ZXxhbGwtc2Nyb2xsfGFsd2F5c3xhcm1lbmlhbnxhdXRvfGJhc2VsaW5lfGJlbG93fGJpZGktb3ZlcnJpZGV8IiArCiAgICAgICAgImJsb2NrfGJvbGR8Ym9sZGVyfGJvcmRlci1ib3h8Ym90aHxib3R0b218YnJlYWstYWxsfGJyZWFrLXdvcmR8Y2FwaXRhbGl6ZXxjZW50ZXJ8IiArCiAgICAgICAgImNoYXJ8Y2lyY2xlfGNqay1pZGVvZ3JhcGhpY3xjb2wtcmVzaXplfGNvbGxhcHNlfGNvbnRlbnQtYm94fGNyb3NzaGFpcnxkYXNoZWR8IiArCiAgICAgICAgImRlY2ltYWwtbGVhZGluZy16ZXJvfGRlY2ltYWx8ZGVmYXVsdHxkaXNhYmxlZHxkaXNjfCIgKwogICAgICAgICJkaXN0cmlidXRlLWFsbC1saW5lc3xkaXN0cmlidXRlLWxldHRlcnxkaXN0cmlidXRlLXNwYWNlfCIgKwogICAgICAgICJkaXN0cmlidXRlfGRvdHRlZHxkb3VibGV8ZS1yZXNpemV8ZWxsaXBzaXN8Zml4ZWR8Z2VvcmdpYW58Z3Jvb3ZlfCIgKwogICAgICAgICJoYW5kfGhlYnJld3xoZWxwfGhpZGRlbnxoaXJhZ2FuYS1pcm9oYXxoaXJhZ2FuYXxob3Jpem9udGFsfCIgKwogICAgICAgICJpZGVvZ3JhcGgtYWxwaGF8aWRlb2dyYXBoLW51bWVyaWN8aWRlb2dyYXBoLXBhcmVudGhlc2lzfCIgKwogICAgICAgICJpZGVvZ3JhcGgtc3BhY2V8aW5hY3RpdmV8aW5oZXJpdHxpbmxpbmUtYmxvY2t8aW5saW5lfGluc2V0fGluc2lkZXwiICsKICAgICAgICAiaW50ZXItaWRlb2dyYXBofGludGVyLXdvcmR8aXRhbGljfGp1c3RpZnl8a2F0YWthbmEtaXJvaGF8a2F0YWthbmF8IiArCiAgICAgICAgImtlZXAtYWxsfGxlZnR8bGlnaHRlcnxsaW5lLWVkZ2V8bGluZS10aHJvdWdofGxpbmV8bGlzdC1pdGVtfGxvb3NlfCIgKwogICAgICAgICJsb3dlci1hbHBoYXxsb3dlci1ncmVla3xsb3dlci1sYXRpbnxsb3dlci1yb21hbnxsb3dlcmNhc2V8bHItdGJ8bHRyfCIgKwogICAgICAgICJtZWRpdW18bWlkZGxlfG1vdmV8bi1yZXNpemV8bmUtcmVzaXplfG5ld3NwYXBlcnxuby1kcm9wfG5vLXJlcGVhdHwiICsKICAgICAgICAibnctcmVzaXplfG5vbmV8bm9ybWFsfG5vdC1hbGxvd2VkfG5vd3JhcHxvYmxpcXVlfG91dHNldHxvdXRzaWRlfCIgKwogICAgICAgICJvdmVybGluZXxwb2ludGVyfHByb2dyZXNzfHJlbGF0aXZlfHJlcGVhdC14fHJlcGVhdC15fHJlcGVhdHxyaWdodHwiICsKICAgICAgICAicmlkZ2V8cm93LXJlc2l6ZXxydGx8cy1yZXNpemV8c2Nyb2xsfHNlLXJlc2l6ZXxzZXBhcmF0ZXxzbWFsbC1jYXBzfCIgKwogICAgICAgICJzb2xpZHxzcXVhcmV8c3RhdGljfHN0cmljdHxzdXBlcnxzdy1yZXNpemV8dGFibGUtZm9vdGVyLWdyb3VwfCIgKwogICAgICAgICJ0YWJsZS1oZWFkZXItZ3JvdXB8dGItcmx8dGV4dC1ib3R0b218dGV4dC10b3B8dGV4dHx0aGlja3x0aGlufHRvcHwiICsKICAgICAgICAidHJhbnNwYXJlbnR8dW5kZXJsaW5lfHVwcGVyLWFscGhhfHVwcGVyLWxhdGlufHVwcGVyLXJvbWFufHVwcGVyY2FzZXwiICsKICAgICAgICAidmVydGljYWwtaWRlb2dyYXBoaWN8dmVydGljYWwtdGV4dHx2aXNpYmxlfHctcmVzaXplfHdhaXR8d2hpdGVzcGFjZXwiICsKICAgICAgICAiemVybyIpLnNwbGl0KCJ8IikKICAgICk7CgogICAgdmFyIGNvbG9ycyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoImFxdWF8YmxhY2t8Ymx1ZXxmdWNoc2lhfGdyYXl8Z3JlZW58bGltZXxtYXJvb258bmF2eXxvbGl2ZXxvcmFuZ2V8IiArCiAgICAgICAgInB1cnBsZXxyZWR8c2lsdmVyfHRlYWx8d2hpdGV8eWVsbG93Iikuc3BsaXQoInwiKQogICAgKTsKCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMuIFVzZSAoPzopIGluc3RlYWQuCiAgICAvLyByZWdleHBzIGFyZSBvcmRlcmVkIC0+IHRoZSBmaXJzdCBtYXRjaCBpcyB1c2VkCgogICAgdmFyIG51bVJlID0gIlxcLT8oPzooPzpbMC05XSspfCg/OlswLTldKlxcLlswLTldKykpIjsKCiAgICB2YXIgYmFzZV9ydWxlc2V0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsCiAgICAgICAgICAgIG5leHQgOiAicnVsZXNldF9jb21tZW50IgogICAgICAgIH0sewogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQogICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJwogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUKICAgICAgICAgICAgcmVnZXggOiAiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLAogICAgICAgICAgICByZWdleCA6IG51bVJlICsgIig/OmVtfGV4fHB4fGNtfG1tfGlufHB0fHBjfGRlZ3xyYWR8Z3JhZHxtc3xzfGh6fGtoenwlKSIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAgLy8gaGV4NiBjb2xvcgogICAgICAgICAgICByZWdleCA6ICIjW2EtZjAtOV17Nn0iCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaGV4MyBjb2xvcgogICAgICAgICAgICByZWdleCA6ICIjW2EtZjAtOV17M30iCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgICAgICBpZiAocHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZS50b0xvd2VyQ2FzZSgpKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC50eXBlIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZ1bmN0aW9ucy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZS50b0xvd2VyQ2FzZSgpKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5mdW5jdGlvbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb25zdGFudHMuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuY29uc3RhbnQiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sb3JzLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmNvbnN0YW50LmNvbG9yIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAidGV4dCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHJlZ2V4IDogIlxcLT9bYS16QS1aX11bYS16QS1aMC05X1xcLV0qIgogICAgICAgIH0KICAgICAgXTsKCiAgICB2YXIgcnVsZXNldCA9IGxhbmcuY29weUFycmF5KGJhc2VfcnVsZXNldCk7CiAgICBydWxlc2V0LnVuc2hpZnQoewogICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsCiAgICAgICAgcmVnZXggOiAiXFx9IiwKICAgICAgICBuZXh0OiAgICJzdGFydCIKICAgIH0pOwoKICAgIHZhciBtZWRpYV9ydWxlc2V0ID0gbGFuZy5jb3B5QXJyYXkoIGJhc2VfcnVsZXNldCApOwogICAgbWVkaWFfcnVsZXNldC51bnNoaWZ0KHsKICAgICAgICB0b2tlbiA6ICJwYXJlbi5ycGFyZW4iLAogICAgICAgIHJlZ2V4IDogIlxcfSIsCiAgICAgICAgbmV4dDogICAibWVkaWEiCiAgICB9KTsKCiAgICB2YXIgYmFzZV9jb21tZW50ID0gW3sKICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUKICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgIHJlZ2V4IDogIi4rIgogICAgfV07CgogICAgdmFyIGNvbW1lbnQgPSBsYW5nLmNvcHlBcnJheShiYXNlX2NvbW1lbnQpOwogICAgY29tbWVudC51bnNoaWZ0KHsKICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQKICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsCiAgICAgICAgICBuZXh0IDogInN0YXJ0IgogICAgfSk7CgogICAgdmFyIG1lZGlhX2NvbW1lbnQgPSBsYW5nLmNvcHlBcnJheShiYXNlX2NvbW1lbnQpOwogICAgbWVkaWFfY29tbWVudC51bnNoaWZ0KHsKICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQKICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsCiAgICAgICAgICBuZXh0IDogIm1lZGlhIgogICAgfSk7CgogICAgdmFyIHJ1bGVzZXRfY29tbWVudCA9IGxhbmcuY29weUFycmF5KGJhc2VfY29tbWVudCk7CiAgICBydWxlc2V0X2NvbW1lbnQudW5zaGlmdCh7CiAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50CiAgICAgICAgICByZWdleCA6ICIuKj9cXCpcXC8iLAogICAgICAgICAgbmV4dCA6ICJydWxlc2V0IgogICAgfSk7CgogICAgdGhpcy4kcnVsZXMgPSB7CiAgICAgICAgInN0YXJ0IiA6IFt7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLAogICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbjogInBhcmVuLmxwYXJlbiIsCiAgICAgICAgICAgIHJlZ2V4OiAiXFx7IiwKICAgICAgICAgICAgbmV4dDogICJydWxlc2V0IgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW46ICJzdHJpbmciLAogICAgICAgICAgICByZWdleDogIkAuKj97IiwKICAgICAgICAgICAgbmV4dDogICJtZWRpYSIKICAgICAgICB9LHsKICAgICAgICAgICAgdG9rZW46ICJrZXl3b3JkIiwKICAgICAgICAgICAgcmVnZXg6ICIjW2EtejAtOS1fXSsiCiAgICAgICAgfSx7CiAgICAgICAgICAgIHRva2VuOiAidmFyaWFibGUiLAogICAgICAgICAgICByZWdleDogIlxcLlthLXowLTktX10rIgogICAgICAgIH0sewogICAgICAgICAgICB0b2tlbjogInN0cmluZyIsCiAgICAgICAgICAgIHJlZ2V4OiAiOlthLXowLTktX10rIgogICAgICAgIH0sewogICAgICAgICAgICB0b2tlbjogImNvbnN0YW50IiwKICAgICAgICAgICAgcmVnZXg6ICJbYS16MC05LV9dKyIKICAgICAgICB9XSwKCiAgICAgICAgIm1lZGlhIiA6IFsgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50CiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwKICAgICAgICAgICAgbmV4dCA6ICJtZWRpYV9jb21tZW50IgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW46ICJwYXJlbi5scGFyZW4iLAogICAgICAgICAgICByZWdleDogIlxceyIsCiAgICAgICAgICAgIG5leHQ6ICAibWVkaWFfcnVsZXNldCIKICAgICAgICB9LHsKICAgICAgICAgICAgdG9rZW46ICJzdHJpbmciLAogICAgICAgICAgICByZWdleDogIlxcfSIsCiAgICAgICAgICAgIG5leHQ6ICAic3RhcnQiCiAgICAgICAgfSx7CiAgICAgICAgICAgIHRva2VuOiAia2V5d29yZCIsCiAgICAgICAgICAgIHJlZ2V4OiAiI1thLXowLTktX10rIgogICAgICAgIH0sewogICAgICAgICAgICB0b2tlbjogInZhcmlhYmxlIiwKICAgICAgICAgICAgcmVnZXg6ICJcXC5bYS16MC05LV9dKyIKICAgICAgICB9LHsKICAgICAgICAgICAgdG9rZW46ICJzdHJpbmciLAogICAgICAgICAgICByZWdleDogIjpbYS16MC05LV9dKyIKICAgICAgICB9LHsKICAgICAgICAgICAgdG9rZW46ICJjb25zdGFudCIsCiAgICAgICAgICAgIHJlZ2V4OiAiW2EtejAtOS1fXSsiCiAgICAgICAgfV0sCgogICAgICAgICJjb21tZW50IiA6IGNvbW1lbnQsCgogICAgICAgICJydWxlc2V0IiA6IHJ1bGVzZXQsCiAgICAgICAgInJ1bGVzZXRfY29tbWVudCIgOiBydWxlc2V0X2NvbW1lbnQsCgogICAgICAgICJtZWRpYV9ydWxlc2V0IiA6IG1lZGlhX3J1bGVzZXQsCiAgICAgICAgIm1lZGlhX2NvbW1lbnQiIDogbWVkaWFfY29tbWVudAogICAgfTsKfTsKCm9vcC5pbmhlcml0cyhDc3NIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsKCmV4cG9ydHMuQ3NzSGlnaGxpZ2h0UnVsZXMgPSBDc3NIaWdobGlnaHRSdWxlczsKCn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2h0bWxfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9jc3NfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3htbF91dGlsJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgQ3NzSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2Nzc19oaWdobGlnaHRfcnVsZXMiKS5Dc3NIaWdobGlnaHRSdWxlczsKdmFyIEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiKS5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXM7CnZhciB4bWxVdGlsID0gcmVxdWlyZSgiLi94bWxfdXRpbCIpOwp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsKCnZhciBIdG1sSGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsKCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMKICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQKICAgIHRoaXMuJHJ1bGVzID0gewogICAgICAgIHN0YXJ0IDogW3sKICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiPFxcIVxcW0NEQVRBXFxbIiwKICAgICAgICAgICAgbmV4dCA6ICJjZGF0YSIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogInhtbF9wZSIsCiAgICAgICAgICAgIHJlZ2V4IDogIjxcXD8uKj9cXD8+IgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiPFxcIS0tIiwKICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50IgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAibWV0YS50YWciLAogICAgICAgICAgICByZWdleCA6ICI8KD89XHMqc2NyaXB0XFxiKSIsCiAgICAgICAgICAgIG5leHQgOiAic2NyaXB0IgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAibWV0YS50YWciLAogICAgICAgICAgICByZWdleCA6ICI8KD89XHMqc3R5bGVcXGIpIiwKICAgICAgICAgICAgbmV4dCA6ICJjc3MiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJtZXRhLnRhZyIsIC8vIG9wZW5pbmcgdGFnCiAgICAgICAgICAgIHJlZ2V4IDogIjxcXC8/IiwKICAgICAgICAgICAgbmV4dCA6ICJ0YWciCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgcmVnZXggOiAiXFxzKyIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgICAgICByZWdleCA6ICJbXjxdKyIKICAgICAgICB9IF0sCiAgICAKICAgICAgICBjZGF0YSA6IFsgewogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgcmVnZXggOiAiXFxdXFxdPiIsCiAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICJcXHMrIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiLisiCiAgICAgICAgfSBdLAoKICAgICAgICBjb21tZW50IDogWyB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLAogICAgICAgICAgICByZWdleCA6ICIuKj8tLT4iLAogICAgICAgICAgICBuZXh0IDogInN0YXJ0IgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiLisiCiAgICAgICAgfSBdCiAgICB9OwogICAgCiAgICB4bWxVdGlsLnRhZyh0aGlzLiRydWxlcywgInRhZyIsICJzdGFydCIpOwogICAgeG1sVXRpbC50YWcodGhpcy4kcnVsZXMsICJjc3MiLCAiY3NzLXN0YXJ0Iik7CiAgICB4bWxVdGlsLnRhZyh0aGlzLiRydWxlcywgInNjcmlwdCIsICJqcy1zdGFydCIpOwogICAgCiAgICB0aGlzLmVtYmVkUnVsZXMoSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzLCAianMtIiwgW3sKICAgICAgICB0b2tlbjogImNvbW1lbnQiLAogICAgICAgIHJlZ2V4OiAiXFwvXFwvLiooPz08XFwvc2NyaXB0PikiLAogICAgICAgIG5leHQ6ICJ0YWciCiAgICB9LCB7CiAgICAgICAgdG9rZW46ICJtZXRhLnRhZyIsCiAgICAgICAgcmVnZXg6ICI8XFwvKD89c2NyaXB0KSIsCiAgICAgICAgbmV4dDogInRhZyIKICAgIH1dKTsKICAgIAogICAgdGhpcy5lbWJlZFJ1bGVzKENzc0hpZ2hsaWdodFJ1bGVzLCAiY3NzLSIsIFt7CiAgICAgICAgdG9rZW46ICJtZXRhLnRhZyIsCiAgICAgICAgcmVnZXg6ICI8XFwvKD89c3R5bGUpIiwKICAgICAgICBuZXh0OiAidGFnIgogICAgfV0pOwp9OwoKb29wLmluaGVyaXRzKEh0bWxIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsKCmV4cG9ydHMuSHRtbEhpZ2hsaWdodFJ1bGVzID0gSHRtbEhpZ2hsaWdodFJ1bGVzOwp9KTsKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS94bWxfdXRpbCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9sYW5nJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7Cgp2YXIgZm9ybVRhZ3MgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAoImJ1dHRvbnxmb3JtfGlucHV0fGxhYmVsfHNlbGVjdHx0ZXh0YXJlYSIpLnNwbGl0KCJ8IikKKTsKCnZhciB0YWJsZVRhZ3MgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAoInRhYmxlfHRib2R5fHRkfHRmb290fHRofHRyIikuc3BsaXQoInwiKQopOwoKZnVuY3Rpb24gc3RyaW5nKHN0YXRlKSB7CiAgICByZXR1cm4gW3sKICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgIHJlZ2V4IDogJyIuKj8iJwogICAgfSwgewogICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0CiAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgIHJlZ2V4IDogJ1siXS4qJywKICAgICAgICBuZXh0IDogc3RhdGUgKyAiLXFxc3RyaW5nIgogICAgfSwgewogICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgcmVnZXggOiAiJy4qPyciCiAgICB9LCB7CiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQKICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgcmVnZXggOiAiWyddLioiLAogICAgICAgIG5leHQgOiBzdGF0ZSArICItcXN0cmluZyIKICAgIH1dOwp9CgpmdW5jdGlvbiBtdWx0aUxpbmVTdHJpbmcocXVvdGUsIHN0YXRlKSB7CiAgICByZXR1cm4gW3sKICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICByZWdleCA6ICIuKj8iICsgcXVvdGUsCiAgICAgICAgbmV4dCA6IHN0YXRlCiAgICB9LCB7CiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgcmVnZXggOiAnLisnCiAgICB9XTsKfQoKZXhwb3J0cy50YWcgPSBmdW5jdGlvbihzdGF0ZXMsIG5hbWUsIG5leHRTdGF0ZSkgewogICAgc3RhdGVzW25hbWVdID0gW3sKICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICByZWdleCA6ICJcXHMrIgogICAgfSwgewogICAgICAgIC8vdG9rZW4gOiAibWV0YS50YWciLAogICAgICAgIAogICAgdG9rZW4gOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICBpZiAoIHZhbHVlPT09J2EnICkgewogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy5hbmNob3IiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCB2YWx1ZT09PSdpbWcnICkgewogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy5pbWFnZSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoIHZhbHVlPT09J3NjcmlwdCcgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnLnNjcmlwdCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoIHZhbHVlPT09J3N0eWxlJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAibWV0YS50YWcuc3R5bGUiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGZvcm1UYWdzLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnLmZvcm0iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRhYmxlVGFncy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZS50b0xvd2VyQ2FzZSgpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy50YWJsZSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnIjsKICAgICAgICAgICAgfQogICAgICAgIH0sICAgICAgICAKICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgcmVnZXggOiAiWy1fYS16QS1aMC05OiFdKyIsCiAgICAgICAgbmV4dCA6IG5hbWUgKyAiZW1iZWQtYXR0cmlidXRlLWxpc3QiIAogICAgfSwgewogICAgICAgIHRva2VuOiAiZW1wdHkiLAogICAgICAgIHJlZ2V4OiAiIiwKICAgICAgICBuZXh0IDogbmFtZSArICJlbWJlZC1hdHRyaWJ1dGUtbGlzdCIKICAgIH1dOwoKICAgIHN0YXRlc1tuYW1lICsgIi1xc3RyaW5nIl0gPSBtdWx0aUxpbmVTdHJpbmcoIiciLCBuYW1lICsgImVtYmVkLWF0dHJpYnV0ZS1saXN0Iik7CiAgICBzdGF0ZXNbbmFtZSArICItcXFzdHJpbmciXSA9IG11bHRpTGluZVN0cmluZygiXCIiLCBuYW1lICsgImVtYmVkLWF0dHJpYnV0ZS1saXN0Iik7CiAgICAKICAgIHN0YXRlc1tuYW1lICsgImVtYmVkLWF0dHJpYnV0ZS1saXN0Il0gPSBbewogICAgICAgIHRva2VuIDogIm1ldGEudGFnIiwKICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgcmVnZXggOiAiXC8/PiIsCiAgICAgICAgbmV4dCA6IG5leHRTdGF0ZQogICAgfSwgewogICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLAogICAgICAgIHJlZ2V4IDogIj0iCiAgICB9LCB7CiAgICAgICAgdG9rZW4gOiAiZW50aXR5Lm90aGVyLmF0dHJpYnV0ZS1uYW1lIiwKICAgICAgICByZWdleCA6ICJbLV9hLXpBLVowLTk6XSsiCiAgICB9LCB7CiAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGZsb2F0CiAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiCiAgICB9LCB7CiAgICAgICAgdG9rZW4gOiAidGV4dCIsCiAgICAgICAgcmVnZXggOiAiXFxzKyIKICAgIH1dLmNvbmNhdChzdHJpbmcobmFtZSkpOwp9OwoKfSk7Ci8qIHZpbTp0cz00OnN0cz00OnN3PTQ6CiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgQ2hyaXMgU3BlbmNlciA8Y2hyaXMuYWcuc3BlbmNlciBBVCBnb29nbGVtYWlsIERPVCBjb20+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2JlaGF2aW91ci94bWwnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL2JlaGF2aW91cicsICdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOwp2YXIgQmVoYXZpb3VyID0gcmVxdWlyZSgiLi4vYmVoYXZpb3VyIikuQmVoYXZpb3VyOwp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gcmVxdWlyZSgiLi9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXI7Cgp2YXIgWG1sQmVoYXZpb3VyID0gZnVuY3Rpb24gKCkgewogICAgCiAgICB0aGlzLmluaGVyaXQoQ3N0eWxlQmVoYXZpb3VyLCBbInN0cmluZ19kcXVvdGVzIl0pOyAvLyBHZXQgc3RyaW5nIGJlaGF2aW91cgogICAgCiAgICB0aGlzLmFkZCgiYnJhY2tldHMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgewogICAgICAgIGlmICh0ZXh0ID09ICc8JykgewogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7CiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICc8PicsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnPicpIHsKICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOwogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7CiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJz4nKSB7IC8vIG5lZWQgc29tZSBraW5kIG9mIG1hdGNoaW5nIGNoZWNrIGhlcmUKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAiXG4iKSB7CiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFycyA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAyKTsKICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhcnMgPT0gJzwvJykgewogICAgICAgICAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpKSArIHNlc3Npb24uZ2V0VGFiU3RyaW5nKCk7CiAgICAgICAgICAgICAgICB2YXIgbmV4dF9pbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnXG4nICsgaW5kZW50ICsgJ1xuJyArIG5leHRfaW5kZW50LAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIGluZGVudC5sZW5ndGgsIDEsIGluZGVudC5sZW5ndGhdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKICAgIAp9Cm9vcC5pbmhlcml0cyhYbWxCZWhhdmlvdXIsIEJlaGF2aW91cik7CgpleHBvcnRzLlhtbEJlaGF2aW91ciA9IFhtbEJlaGF2aW91cjsKfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2h0bWwnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL2ZvbGRpbmcvbWl4ZWQnLCAnYWNlL21vZGUvZm9sZGluZy94bWwnLCAnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7CnZhciBNaXhlZEZvbGRNb2RlID0gcmVxdWlyZSgiLi9taXhlZCIpLkZvbGRNb2RlOwp2YXIgWG1sRm9sZE1vZGUgPSByZXF1aXJlKCIuL3htbCIpLkZvbGRNb2RlOwp2YXIgQ1N0eWxlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2NzdHlsZSIpLkZvbGRNb2RlOwoKdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkgewogICAgTWl4ZWRGb2xkTW9kZS5jYWxsKHRoaXMsIG5ldyBYbWxGb2xkTW9kZSh7CiAgICAgICAgLy8gdm9pZCBlbGVtZW50cwogICAgICAgICJhcmVhIjogMSwKICAgICAgICAiYmFzZSI6IDEsCiAgICAgICAgImJyIjogMSwKICAgICAgICAiY29sIjogMSwKICAgICAgICAiY29tbWFuZCI6IDEsCiAgICAgICAgImVtYmVkIjogMSwKICAgICAgICAiaHIiOiAxLAogICAgICAgICJpbWciOiAxLAogICAgICAgICJpbnB1dCI6IDEsCiAgICAgICAgImtleWdlbiI6IDEsCiAgICAgICAgImxpbmsiOiAxLAogICAgICAgICJtZXRhIjogMSwKICAgICAgICAicGFyYW0iOiAxLAogICAgICAgICJzb3VyY2UiOiAxLAogICAgICAgICJ0cmFjayI6IDEsCiAgICAgICAgIndiciI6IDEsCiAgICAgICAgCiAgICAgICAgLy8gb3B0aW9uYWwgdGFncyAKICAgICAgICAibGkiOiAxLAogICAgICAgICJkdCI6IDEsCiAgICAgICAgImRkIjogMSwKICAgICAgICAicCI6IDEsCiAgICAgICAgInJ0IjogMSwKICAgICAgICAicnAiOiAxLAogICAgICAgICJvcHRncm91cCI6IDEsCiAgICAgICAgIm9wdGlvbiI6IDEsCiAgICAgICAgImNvbGdyb3VwIjogMSwKICAgICAgICAidGQiOiAxLAogICAgICAgICJ0aCI6IDEKICAgIH0pLCB7CiAgICAgICAgImpzLSI6IG5ldyBDU3R5bGVGb2xkTW9kZSgpLAogICAgICAgICJjc3MtIjogbmV3IENTdHlsZUZvbGRNb2RlKCkKICAgIH0pOwp9OwoKb29wLmluaGVyaXRzKEZvbGRNb2RlLCBNaXhlZEZvbGRNb2RlKTsKCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9taXhlZCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7CnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOwoKdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKGRlZmF1bHRNb2RlLCBzdWJNb2RlcykgewogICAgdGhpcy5kZWZhdWx0TW9kZSA9IGRlZmF1bHRNb2RlOwogICAgdGhpcy5zdWJNb2RlcyA9IHN1Yk1vZGVzOwp9Owpvb3AuaW5oZXJpdHMoRm9sZE1vZGUsIEJhc2VGb2xkTW9kZSk7CgooZnVuY3Rpb24oKSB7CgoKICAgIHRoaXMuJGdldE1vZGUgPSBmdW5jdGlvbihzdGF0ZSkgewogICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLnN1Yk1vZGVzKSB7CiAgICAgICAgICAgIGlmIChzdGF0ZS5pbmRleE9mKGtleSkgPT09IDApCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdWJNb2Rlc1trZXldOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH07CiAgICAKICAgIHRoaXMuJHRyeU1vZGUgPSBmdW5jdGlvbihzdGF0ZSwgc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsKICAgICAgICB2YXIgbW9kZSA9IHRoaXMuJGdldE1vZGUoc3RhdGUpOwogICAgICAgIHJldHVybiAobW9kZSA/IG1vZGUuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgOiAiIik7CiAgICB9OwoKICAgIHRoaXMuZ2V0Rm9sZFdpZGdldCA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgdGhpcy4kdHJ5TW9kZShzZXNzaW9uLmdldFN0YXRlKHJvdy0xKSwgc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHx8CiAgICAgICAgICAgIHRoaXMuJHRyeU1vZGUoc2Vzc2lvbi5nZXRTdGF0ZShyb3cpLCBzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgfHwKICAgICAgICAgICAgdGhpcy5kZWZhdWx0TW9kZS5nZXRGb2xkV2lkZ2V0KHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KQogICAgICAgICk7CiAgICB9OwoKICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsKICAgICAgICB2YXIgbW9kZSA9IHRoaXMuJGdldE1vZGUoc2Vzc2lvbi5nZXRTdGF0ZShyb3ctMSkpOwogICAgICAgIAogICAgICAgIGlmICghbW9kZSB8fCAhbW9kZS5nZXRGb2xkV2lkZ2V0KHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSkKICAgICAgICAgICAgbW9kZSA9IHRoaXMuJGdldE1vZGUoc2Vzc2lvbi5nZXRTdGF0ZShyb3cpKTsKICAgICAgICAKICAgICAgICBpZiAoIW1vZGUgfHwgIW1vZGUuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykpCiAgICAgICAgICAgIG1vZGUgPSB0aGlzLmRlZmF1bHRNb2RlOwogICAgICAgIAogICAgICAgIHJldHVybiBtb2RlLmdldEZvbGRXaWRnZXRSYW5nZShzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdyk7CiAgICB9OwoKfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOwoKfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL3htbCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9sYW5nJywgJ2FjZS9yYW5nZScsICdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZScsICdhY2UvdG9rZW5faXRlcmF0b3InXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7CnZhciBsYW5nID0gcmVxdWlyZSgiLi4vLi4vbGliL2xhbmciKTsKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsKdmFyIEJhc2VGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGU7CnZhciBUb2tlbkl0ZXJhdG9yID0gcmVxdWlyZSgiLi4vLi4vdG9rZW5faXRlcmF0b3IiKS5Ub2tlbkl0ZXJhdG9yOwoKdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKHZvaWRFbGVtZW50cykgewogICAgQmFzZUZvbGRNb2RlLmNhbGwodGhpcyk7CiAgICB0aGlzLnZvaWRFbGVtZW50cyA9IHZvaWRFbGVtZW50cyB8fCB7fTsKfTsKb29wLmluaGVyaXRzKEZvbGRNb2RlLCBCYXNlRm9sZE1vZGUpOwoKKGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuZ2V0Rm9sZFdpZGdldCA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7CiAgICAgICAgdmFyIHRhZyA9IHRoaXMuX2dldEZpcnN0VGFnSW5MaW5lKHNlc3Npb24sIHJvdyk7CgogICAgICAgIGlmICh0YWcuY2xvc2luZykKICAgICAgICAgICAgcmV0dXJuIGZvbGRTdHlsZSA9PSAibWFya2JlZ2luZW5kIiA/ICJlbmQiIDogIiI7CgogICAgICAgIGlmICghdGFnLnRhZ05hbWUgfHwgdGhpcy52b2lkRWxlbWVudHNbdGFnLnRhZ05hbWUudG9Mb3dlckNhc2UoKV0pCiAgICAgICAgICAgIHJldHVybiAiIjsKCiAgICAgICAgaWYgKHRhZy5zZWxmQ2xvc2luZykKICAgICAgICAgICAgcmV0dXJuICIiOwoKICAgICAgICBpZiAodGFnLnZhbHVlLmluZGV4T2YoIi8iICsgdGFnLnRhZ05hbWUpICE9PSAtMSkKICAgICAgICAgICAgcmV0dXJuICIiOwoKICAgICAgICByZXR1cm4gInN0YXJ0IjsKICAgIH07CiAgICAKICAgIHRoaXMuX2dldEZpcnN0VGFnSW5MaW5lID0gZnVuY3Rpb24oc2Vzc2lvbiwgcm93KSB7CiAgICAgICAgdmFyIHRva2VucyA9IHNlc3Npb24uZ2V0VG9rZW5zKHJvdywgcm93KVswXS50b2tlbnM7CiAgICAgICAgdmFyIHZhbHVlID0gIiI7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zW2ldOwogICAgICAgICAgICBpZiAodG9rZW4udHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpID09PSAwKQogICAgICAgICAgICAgICAgdmFsdWUgKz0gdG9rZW4udmFsdWU7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHZhbHVlICs9IGxhbmcuc3RyaW5nUmVwZWF0KCIgIiwgdG9rZW4udmFsdWUubGVuZ3RoKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnNlVGFnKHZhbHVlKTsKICAgIH07CgogICAgdGhpcy50YWdSZSA9IC9eKFxzKikoPD8oXC8/KShbLV9hLXpBLVowLTk6IV0qKVxzKihcLz8pPj8pLzsKICAgIHRoaXMuX3BhcnNlVGFnID0gZnVuY3Rpb24odGFnKSB7CiAgICAgICAgCiAgICAgICAgdmFyIG1hdGNoID0gdGhpcy50YWdSZS5leGVjKHRhZyk7CiAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMudGFnUmUubGFzdEluZGV4IHx8IDA7CiAgICAgICAgdGhpcy50YWdSZS5sYXN0SW5kZXggPSAwOwoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB2YWx1ZTogdGFnLAogICAgICAgICAgICBtYXRjaDogbWF0Y2ggPyBtYXRjaFsyXSA6ICIiLAogICAgICAgICAgICBjbG9zaW5nOiBtYXRjaCA/ICEhbWF0Y2hbM10gOiBmYWxzZSwKICAgICAgICAgICAgc2VsZkNsb3Npbmc6IG1hdGNoID8gISFtYXRjaFs1XSB8fCBtYXRjaFsyXSA9PSAiLz4iIDogZmFsc2UsCiAgICAgICAgICAgIHRhZ05hbWU6IG1hdGNoID8gbWF0Y2hbNF0gOiAiIiwKICAgICAgICAgICAgY29sdW1uOiBtYXRjaFsxXSA/IGNvbHVtbiArIG1hdGNoWzFdLmxlbmd0aCA6IGNvbHVtbgogICAgICAgIH07CiAgICB9OwogICAgCiAgICAvKioKICAgICAqIHJlYWRzIGEgZnVsbCB0YWcgYW5kIHBsYWNlcyB0aGUgaXRlcmF0b3IgYWZ0ZXIgdGhlIHRhZwogICAgICovCiAgICB0aGlzLl9yZWFkVGFnRm9yd2FyZCA9IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7CiAgICAgICAgdmFyIHRva2VuID0gaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuKCk7CiAgICAgICAgaWYgKCF0b2tlbikKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIAogICAgICAgIHZhciB2YWx1ZSA9ICIiOwogICAgICAgIHZhciBzdGFydDsKICAgICAgICAKICAgICAgICBkbyB7CiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlLmluZGV4T2YoIm1ldGEudGFnIikgPT09IDApIHsKICAgICAgICAgICAgICAgIGlmICghc3RhcnQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuUm93KCksCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFsdWUgKz0gdG9rZW4udmFsdWU7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZigiPiIpICE9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0YWcgPSB0aGlzLl9wYXJzZVRhZyh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgdGFnLnN0YXJ0ID0gc3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgdGFnLmVuZCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgcm93OiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Sb3coKSwKICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKSArIHRva2VuLnZhbHVlLmxlbmd0aAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3Iuc3RlcEZvcndhcmQoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSB3aGlsZSh0b2tlbiA9IGl0ZXJhdG9yLnN0ZXBGb3J3YXJkKCkpOwogICAgICAgIAogICAgICAgIHJldHVybiBudWxsOwogICAgfTsKICAgIAogICAgdGhpcy5fcmVhZFRhZ0JhY2t3YXJkID0gZnVuY3Rpb24oaXRlcmF0b3IpIHsKICAgICAgICB2YXIgdG9rZW4gPSBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW4oKTsKICAgICAgICBpZiAoIXRva2VuKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgCiAgICAgICAgdmFyIHZhbHVlID0gIiI7CiAgICAgICAgdmFyIGVuZDsKCiAgICAgICAgZG8gewogICAgICAgICAgICBpZiAodG9rZW4udHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpID09PSAwKSB7CiAgICAgICAgICAgICAgICBpZiAoIWVuZCkgewogICAgICAgICAgICAgICAgICAgIGVuZCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgcm93OiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Sb3coKSwKICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKSArIHRva2VuLnZhbHVlLmxlbmd0aAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRva2VuLnZhbHVlICsgdmFsdWU7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZigiPCIpICE9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0YWcgPSB0aGlzLl9wYXJzZVRhZyh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgdGFnLmVuZCA9IGVuZDsKICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuUm93KCksCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnN0ZXBCYWNrd2FyZCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlKHRva2VuID0gaXRlcmF0b3Iuc3RlcEJhY2t3YXJkKCkpOwogICAgICAgIAogICAgICAgIHJldHVybiBudWxsOwogICAgfTsKICAgIAogICAgdGhpcy5fcG9wID0gZnVuY3Rpb24oc3RhY2ssIHRhZykgewogICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGgpIHsKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciB0b3AgPSBzdGFja1tzdGFjay5sZW5ndGgtMV07CiAgICAgICAgICAgIGlmICghdGFnIHx8IHRvcC50YWdOYW1lID09IHRhZy50YWdOYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2sucG9wKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy52b2lkRWxlbWVudHNbdGFnLnRhZ05hbWVdKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy52b2lkRWxlbWVudHNbdG9wLnRhZ05hbWVdKSB7CiAgICAgICAgICAgICAgICBzdGFjay5wb3AoKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwogICAgCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7CiAgICAgICAgdmFyIGZpcnN0VGFnID0gdGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmUoc2Vzc2lvbiwgcm93KTsKICAgICAgICAKICAgICAgICBpZiAoIWZpcnN0VGFnLm1hdGNoKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAKICAgICAgICB2YXIgaXNCYWNrd2FyZCA9IGZpcnN0VGFnLmNsb3NpbmcgfHwgZmlyc3RUYWcuc2VsZkNsb3Npbmc7CiAgICAgICAgdmFyIHN0YWNrID0gW107CiAgICAgICAgdmFyIHRhZzsKICAgICAgICAKICAgICAgICBpZiAoIWlzQmFja3dhcmQpIHsKICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gbmV3IFRva2VuSXRlcmF0b3Ioc2Vzc2lvbiwgcm93LCBmaXJzdFRhZy5jb2x1bW4pOwogICAgICAgICAgICB2YXIgc3RhcnQgPSB7CiAgICAgICAgICAgICAgICByb3c6IHJvdywKICAgICAgICAgICAgICAgIGNvbHVtbjogZmlyc3RUYWcuY29sdW1uICsgZmlyc3RUYWcudGFnTmFtZS5sZW5ndGggKyAyCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHdoaWxlICh0YWcgPSB0aGlzLl9yZWFkVGFnRm9yd2FyZChpdGVyYXRvcikpIHsKICAgICAgICAgICAgICAgIGlmICh0YWcuc2VsZkNsb3NpbmcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YWNrLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQuY29sdW1uICs9IHRhZy50YWdOYW1lLmxlbmd0aCArIDI7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5lbmQuY29sdW1uIC09IDI7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHRhZy5zdGFydCwgdGFnLmVuZCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAodGFnLmNsb3NpbmcpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9wb3Aoc3RhY2ssIHRhZyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgdGFnLnN0YXJ0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2godGFnKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBuZXcgVG9rZW5JdGVyYXRvcihzZXNzaW9uLCByb3csIGZpcnN0VGFnLmNvbHVtbiArIGZpcnN0VGFnLm1hdGNoLmxlbmd0aCk7CiAgICAgICAgICAgIHZhciBlbmQgPSB7CiAgICAgICAgICAgICAgICByb3c6IHJvdywKICAgICAgICAgICAgICAgIGNvbHVtbjogZmlyc3RUYWcuY29sdW1uCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIAogICAgICAgICAgICB3aGlsZSAodGFnID0gdGhpcy5fcmVhZFRhZ0JhY2t3YXJkKGl0ZXJhdG9yKSkgewogICAgICAgICAgICAgICAgaWYgKHRhZy5zZWxmQ2xvc2luZykgewogICAgICAgICAgICAgICAgICAgIGlmICghc3RhY2subGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5zdGFydC5jb2x1bW4gKz0gdGFnLnRhZ05hbWUubGVuZ3RoICsgMjsKICAgICAgICAgICAgICAgICAgICAgICAgdGFnLmVuZC5jb2x1bW4gLT0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHModGFnLnN0YXJ0LCB0YWcuZW5kKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICghdGFnLmNsb3NpbmcpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9wb3Aoc3RhY2ssIHRhZyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5zdGFydC5jb2x1bW4gKz0gdGFnLnRhZ05hbWUubGVuZ3RoICsgMjsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHModGFnLnN0YXJ0LCBlbmQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2godGFnKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgfTsKCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsKCn0pOzsKICAgICAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkKICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkoKTsKICAgICAgICA=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-html.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9odG1sIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL21vZGUvamF2YXNjcmlwdCIsImFjZS9tb2RlL2NzcyIsImFjZS90b2tlbml6ZXIiLCJhY2UvbW9kZS9odG1sX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL2JlaGF2aW91ci94bWwiLCJhY2UvbW9kZS9mb2xkaW5nL2h0bWwiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dCIpLk1vZGUsZj1hKCIuL2phdmFzY3JpcHQiKS5Nb2RlLGc9YSgiLi9jc3MiKS5Nb2RlLGg9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGk9YSgiLi9odG1sX2hpZ2hsaWdodF9ydWxlcyIpLkh0bWxIaWdobGlnaHRSdWxlcyxqPWEoIi4vYmVoYXZpb3VyL3htbCIpLlhtbEJlaGF2aW91cixrPWEoIi4vZm9sZGluZy9odG1sIikuRm9sZE1vZGUsbD1mdW5jdGlvbigpe3ZhciBhPW5ldyBpO3RoaXMuJHRva2VuaXplcj1uZXcgaChhLmdldFJ1bGVzKCkpLHRoaXMuJGJlaGF2aW91cj1uZXcgaix0aGlzLiRlbWJlZHM9YS5nZXRFbWJlZHMoKSx0aGlzLmNyZWF0ZU1vZGVEZWxlZ2F0ZXMoeyJqcy0iOmYsImNzcy0iOmd9KSx0aGlzLmZvbGRpbmdSdWxlcz1uZXcga307ZC5pbmhlcml0cyhsLGUpLGZ1bmN0aW9uKCl7dGhpcy50b2dnbGVDb21tZW50TGluZXM9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIDB9LHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiRnZXRJbmRlbnQoYil9LHRoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hMX19LmNhbGwobC5wcm90b3R5cGUpLGIuTW9kZT1sfSksZGVmaW5lKCJhY2UvbW9kZS9qYXZhc2NyaXB0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsImFjZS9yYW5nZSIsImFjZS93b3JrZXIvd29ya2VyX2NsaWVudCIsImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiKS5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMsaD1hKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudCxpPWEoIi4uL3JhbmdlIikuUmFuZ2Usaj1hKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudCxrPWEoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cixsPWEoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZSxtPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSksdGhpcy4kb3V0ZGVudD1uZXcgaCx0aGlzLiRiZWhhdmlvdXI9bmV3IGssdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGx9O2QuaW5oZXJpdHMobSxlKSxmdW5jdGlvbigpe3RoaXMudG9nZ2xlQ29tbWVudExpbmVzPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSEwLGY9L14oXHMqKVwvXC8vO2Zvcih2YXIgZz1jO2c8PWQ7ZysrKWlmKCFmLnRlc3QoYi5nZXRMaW5lKGcpKSl7ZT0hMTticmVha31pZihlKXt2YXIgaD1uZXcgaSgwLDAsMCwwKTtmb3IodmFyIGc9YztnPD1kO2crKyl7dmFyIGo9Yi5nZXRMaW5lKGcpLGs9ai5tYXRjaChmKTtoLnN0YXJ0LnJvdz1nLGguZW5kLnJvdz1nLGguZW5kLmNvbHVtbj1rWzBdLmxlbmd0aCxiLnJlcGxhY2UoaCxrWzFdKX19ZWxzZSBiLmluZGVudFJvd3MoYyxkLCIvLyIpfSx0aGlzLmdldE5leHRMaW5lSW5kZW50PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLiRnZXRJbmRlbnQoYiksZT10aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhiLGEpLGY9ZS50b2tlbnMsZz1lLnN0YXRlO2lmKGYubGVuZ3RoJiZmW2YubGVuZ3RoLTFdLnR5cGU9PSJjb21tZW50IilyZXR1cm4gZDtpZihhPT0ic3RhcnQifHxhPT0icmVnZXhfYWxsb3dlZCIpe3ZhciBoPWIubWF0Y2goL14uKig/OlxiY2FzZVxiLipcOnxbXHtcKFxbXSlccyokLyk7aCYmKGQrPWMpfWVsc2UgaWYoYT09ImRvYy1zdGFydCIpe2lmKGc9PSJzdGFydCJ8fGE9PSJyZWdleF9hbGxvd2VkIilyZXR1cm4iIjt2YXIgaD1iLm1hdGNoKC9eXHMqKFwvPylcKi8pO2gmJihoWzFdJiYoZCs9IiAiKSxkKz0iKiAiKX1yZXR1cm4gZH0sdGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChiLGMpfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGEsYixjKXt0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGIsYyl9LHRoaXMuY3JlYXRlV29ya2VyPWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBqKFsiYWNlIl0sIndvcmtlci1qYXZhc2NyaXB0LmpzIiwiYWNlL21vZGUvamF2YXNjcmlwdF93b3JrZXIiLCJKYXZhU2NyaXB0V29ya2VyIik7cmV0dXJuIGIuYXR0YWNoVG9Eb2N1bWVudChhLmdldERvY3VtZW50KCkpLGIub24oImpzbGludCIsZnVuY3Rpb24oYil7dmFyIGM9W107Zm9yKHZhciBkPTA7ZDxiLmRhdGEubGVuZ3RoO2QrKyl7dmFyIGU9Yi5kYXRhW2RdO2UmJmMucHVzaCh7cm93OmUubGluZS0xLGNvbHVtbjplLmNoYXJhY3Rlci0xLHRleHQ6ZS5yZWFzb24sdHlwZToid2FybmluZyIsbGludDplfSl9YS5zZXRBbm5vdGF0aW9ucyhjKX0pLGIub24oIm5hcmNpc3N1cyIsZnVuY3Rpb24oYil7YS5zZXRBbm5vdGF0aW9ucyhbYi5kYXRhXSl9KSxiLm9uKCJ0ZXJtaW5hdGUiLGZ1bmN0aW9uKCl7YS5jbGVhckFubm90YXRpb25zKCl9KSxifX0uY2FsbChtLnByb3RvdHlwZSksYi5Nb2RlPW19KSxkZWZpbmUoImFjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvdW5pY29kZSIsImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi4vdW5pY29kZSIpLGc9YSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsaD1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGk9ZnVuY3Rpb24oKXt2YXIgYT1lLmFycmF5VG9NYXAoIkFycmF5fEJvb2xlYW58RGF0ZXxGdW5jdGlvbnxJdGVyYXRvcnxOdW1iZXJ8T2JqZWN0fFJlZ0V4cHxTdHJpbmd8UHJveHl8TmFtZXNwYWNlfFFOYW1lfFhNTHxYTUxMaXN0fEFycmF5QnVmZmVyfEZsb2F0MzJBcnJheXxGbG9hdDY0QXJyYXl8SW50MTZBcnJheXxJbnQzMkFycmF5fEludDhBcnJheXxVaW50MTZBcnJheXxVaW50MzJBcnJheXxVaW50OEFycmF5fFVpbnQ4Q2xhbXBlZEFycmF5fEVycm9yfEV2YWxFcnJvcnxJbnRlcm5hbEVycm9yfFJhbmdlRXJyb3J8UmVmZXJlbmNlRXJyb3J8U3RvcEl0ZXJhdGlvbnxTeW50YXhFcnJvcnxUeXBlRXJyb3J8VVJJRXJyb3J8ZGVjb2RlVVJJfGRlY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZW5jb2RlVVJJQ29tcG9uZW50fGV2YWx8aXNGaW5pdGV8aXNOYU58cGFyc2VGbG9hdHxwYXJzZUludHxKU09OfE1hdGh8dGhpc3xhcmd1bWVudHN8cHJvdG90eXBlfHdpbmRvd3xkb2N1bWVudCIuc3BsaXQoInwiKSksYj1lLmFycmF5VG9NYXAoImJyZWFrfGNhc2V8Y2F0Y2h8Y29udGludWV8ZGVmYXVsdHxkZWxldGV8ZG98ZWxzZXxmaW5hbGx5fGZvcnxmdW5jdGlvbnxpZnxpbnxpbnN0YW5jZW9mfG5ld3xyZXR1cm58c3dpdGNofHRocm93fHRyeXx0eXBlb2Z8bGV0fHZhcnx3aGlsZXx3aXRofGNvbnN0fHlpZWxkfGltcG9ydHxnZXR8c2V0Ii5zcGxpdCgifCIpKSxjPSJjYXNlfGRvfGVsc2V8ZmluYWxseXxpbnxpbnN0YW5jZW9mfHJldHVybnx0aHJvd3x0cnl8dHlwZW9mfHlpZWxkIixkPWUuYXJyYXlUb01hcCgiX19wYXJlbnRfX3xfX2NvdW50X198ZXNjYXBlfHVuZXNjYXBlfHdpdGh8X19wcm90b19fIi5zcGxpdCgifCIpKSxoPWUuYXJyYXlUb01hcCgiY29uc3R8bGV0fHZhcnxmdW5jdGlvbiIuc3BsaXQoInwiKSksaT1lLmFycmF5VG9NYXAoIm51bGx8SW5maW5pdHl8TmFOfHVuZGVmaW5lZCIuc3BsaXQoInwiKSksaj1lLmFycmF5VG9NYXAoImNsYXNzfGVudW18ZXh0ZW5kc3xzdXBlcnxleHBvcnR8aW1wbGVtZW50c3xwcml2YXRlfHB1YmxpY3xpbnRlcmZhY2V8cGFja2FnZXxwcm90ZWN0ZWR8c3RhdGljIi5zcGxpdCgifCIpKSxrPSJbIitmLnBhY2thZ2VzLkwrIlxcJF9dWyIrZi5wYWNrYWdlcy5MK2YucGFja2FnZXMuTW4rZi5wYWNrYWdlcy5NYytmLnBhY2thZ2VzLk5kK2YucGFja2FnZXMuUGMrIlxcJF9dKlxcYiI7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJcXC9cXC8uKiQifSwobmV3IGcpLmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0Iikse3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwvXFwqIixuZXh0OiJjb21tZW50In0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OidbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJ30se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OidbIl0uKlxcXFwkJyxuZXh0OiJxcXN0cmluZyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiWyddLipcXFxcJCIsbmV4dDoicXN0cmluZyJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IjBbeFhdWzAtOWEtZkEtRl0rXFxiIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIifSx7dG9rZW46WyJrZXl3b3JkLmRlZmluaXRpb24iLCJ0ZXh0IiwiZW50aXR5Lm5hbWUuZnVuY3Rpb24iXSxyZWdleDoiKGZ1bmN0aW9uKShcXHMrKSgiK2srIikifSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLHJlZ2V4OiIoPzp0cnVlfGZhbHNlKVxcYiJ9LHt0b2tlbjoia2V5d29yZCIscmVnZXg6Iig/OiIrYysiKVxcYiIsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjpmdW5jdGlvbihjKXtyZXR1cm4gYS5oYXNPd25Qcm9wZXJ0eShjKT8idmFyaWFibGUubGFuZ3VhZ2UiOmQuaGFzT3duUHJvcGVydHkoYyk/ImludmFsaWQuZGVwcmVjYXRlZCI6aC5oYXNPd25Qcm9wZXJ0eShjKT8ia2V5d29yZC5kZWZpbml0aW9uIjpiLmhhc093blByb3BlcnR5KGMpPyJrZXl3b3JkIjppLmhhc093blByb3BlcnR5KGMpPyJjb25zdGFudC5sYW5ndWFnZSI6ai5oYXNPd25Qcm9wZXJ0eShjKT8iaW52YWxpZC5pbGxlZ2FsIjpjPT0iZGVidWdnZXIiPyJpbnZhbGlkLmRlcHJlY2F0ZWQiOiJpZGVudGlmaWVyIn0scmVnZXg6a30se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIixuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOiJwdW5jdHVhdGlvbi5vcGVyYXRvciIscmVnZXg6IlxcP3xcXDp8XFwsfFxcO3xcXC4iLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46InBhcmVuLmxwYXJlbiIscmVnZXg6IltbKHtdIixuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4OiJbXFxdKX1dIn0se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiXFwvPT8iLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJeIyEuKiQifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn1dLHJlZ2V4X2FsbG93ZWQ6W3t0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKiIsbmV4dDoiY29tbWVudF9yZWdleF9hbGxvd2VkIn0se3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwvXFwvLiokIn0se3Rva2VuOiJzdHJpbmcucmVnZXhwIixyZWdleDoiXFwvIixuZXh0OiJyZWdleCIsbWVyZ2U6ITB9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OiJzdGFydCJ9XSxyZWdleDpbe3Rva2VuOiJyZWdleHAua2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIixuZXh0OiJyZWdleCJ9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6Ii9cXHcqIixuZXh0OiJzdGFydCIsbWVyZ2U6ITB9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6IlteXFxcXC9cXFtdKyIsbmV4dDoicmVnZXgiLG1lcmdlOiEwfSx7dG9rZW46InN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIixyZWdleDoiXFxbIixuZXh0OiJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiLG1lcmdlOiEwfSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OiJzdGFydCJ9XSxyZWdleF9jaGFyYWN0ZXJfY2xhc3M6W3t0b2tlbjoicmVnZXhwLmtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsbmV4dDoicmVnZXhfY2hhcmFjdGVyX2NsYXNzIn0se3Rva2VuOiJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyIscmVnZXg6Il0iLG5leHQ6InJlZ2V4IixtZXJnZTohMH0se3Rva2VuOiJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyIscmVnZXg6IlteXFxcXFxcXV0rIixuZXh0OiJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiLG1lcmdlOiEwfSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OiJzdGFydCJ9XSxjb21tZW50X3JlZ2V4X2FsbG93ZWQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qP1xcKlxcLyIsbWVyZ2U6ITAsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLGNvbW1lbnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qP1xcKlxcLyIsbWVyZ2U6ITAsbmV4dDoic3RhcnQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxxcXN0cmluZzpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OicoPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/IicsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLHFzdHJpbmc6W3t0b2tlbjoic3RyaW5nIixyZWdleDoiKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqPyciLG5leHQ6InN0YXJ0In0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX0sdGhpcy5lbWJlZFJ1bGVzKGcsImRvYy0iLFsobmV3IGcpLmdldEVuZFJ1bGUoInN0YXJ0IildKX07ZC5pbmhlcml0cyhpLGgpLGIuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzPWl9KSxkZWZpbmUoImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsZj1mdW5jdGlvbigpe3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50LmRvYy50YWciLHJlZ2V4OiJAW1xcd1xcZF9dKyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlRPRE8ifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiW15AXFwqXSsifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiLiJ9XX19O2QuaW5oZXJpdHMoZixlKSxmdW5jdGlvbigpe3RoaXMuZ2V0U3RhcnRSdWxlPWZ1bmN0aW9uKGEpe3JldHVybnt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCooPz1cXCopIixuZXh0OmF9fSx0aGlzLmdldEVuZFJ1bGU9ZnVuY3Rpb24oYSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxcKlxcLyIsbmV4dDphfX19LmNhbGwoZi5wcm90b3R5cGUpLGIuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzPWZ9KSxkZWZpbmUoImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3JhbmdlIikuUmFuZ2UsZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuL15ccyskLy50ZXN0KGEpPy9eXHMqXH0vLnRlc3QoYik6ITF9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldExpbmUoYiksZT1jLm1hdGNoKC9eKFxzKlx9KS8pO2lmKCFlKXJldHVybiAwO3ZhciBmPWVbMV0ubGVuZ3RoLGc9YS5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6Yixjb2x1bW46Zn0pO2lmKCFnfHxnLnJvdz09YilyZXR1cm4gMDt2YXIgaD10aGlzLiRnZXRJbmRlbnQoYS5nZXRMaW5lKGcucm93KSk7YS5yZXBsYWNlKG5ldyBkKGIsMCxiLGYtMSksaCl9LHRoaXMuJGdldEluZGVudD1mdW5jdGlvbihhKXt2YXIgYj1hLm1hdGNoKC9eKFxzKykvKTtyZXR1cm4gYj9iWzFdOiIifX0pKS5jYWxsKGUucHJvdG90eXBlKSxiLk1hdGNoaW5nQnJhY2VPdXRkZW50PWV9KSxkZWZpbmUoImFjZS93b3JrZXIvd29ya2VyX2NsaWVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixmPWZ1bmN0aW9uKGIsZCxlLGYpe3RoaXMuY2hhbmdlTGlzdGVuZXI9dGhpcy5jaGFuZ2VMaXN0ZW5lci5iaW5kKHRoaXMpO2lmKGMucGFja2FnZWQpe3ZhciBnPXRoaXMuJGd1ZXNzQmFzZVBhdGgoKTt0aGlzLiR3b3JrZXI9bmV3IFdvcmtlcihnK2QpfWVsc2V7dmFyIGg9dGhpcy4kbm9ybWFsaXplUGF0aChhLm5hbWVUb1VybCgiYWNlL3dvcmtlci93b3JrZXIiLG51bGwsIl8iKSk7dGhpcy4kd29ya2VyPW5ldyBXb3JrZXIoaCk7dmFyIGk9e307Zm9yKHZhciBqPTA7ajxiLmxlbmd0aDtqKyspe3ZhciBrPWJbal0sbD10aGlzLiRub3JtYWxpemVQYXRoKGEubmFtZVRvVXJsKGssbnVsbCwiXyIpLnJlcGxhY2UoLy5qcyQvLCIiKSk7aVtrXT1sfX10aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2luaXQ6ITAsdGxuczppLG1vZHVsZTplLGNsYXNzbmFtZTpmfSksdGhpcy5jYWxsYmFja0lkPTEsdGhpcy5jYWxsYmFja3M9e307dmFyIG09dGhpczt0aGlzLiR3b3JrZXIub25lcnJvcj1mdW5jdGlvbihhKXt0aHJvdyB3aW5kb3cuY29uc29sZSYmY29uc29sZS5sb2cmJmNvbnNvbGUubG9nKGEpLGF9LHRoaXMuJHdvcmtlci5vbm1lc3NhZ2U9ZnVuY3Rpb24oYSl7dmFyIGI9YS5kYXRhO3N3aXRjaChiLnR5cGUpe2Nhc2UibG9nIjp3aW5kb3cuY29uc29sZSYmY29uc29sZS5sb2cmJmNvbnNvbGUubG9nKGIuZGF0YSk7YnJlYWs7Y2FzZSJldmVudCI6bS5fZW1pdChiLm5hbWUse2RhdGE6Yi5kYXRhfSk7YnJlYWs7Y2FzZSJjYWxsIjp2YXIgYz1tLmNhbGxiYWNrc1tiLmlkXTtjJiYoYyhiLmRhdGEpLGRlbGV0ZSBtLmNhbGxiYWNrc1tiLmlkXSl9fX07KChmdW5jdGlvbigpe2QuaW1wbGVtZW50KHRoaXMsZSksdGhpcy4kbm9ybWFsaXplUGF0aD1mdW5jdGlvbihhKXtyZXR1cm4gYT1hLnJlcGxhY2UoL15bYS16XSs6XC9cL1teXC9dK1wvLywiIiksYT1sb2NhdGlvbi5wcm90b2NvbCsiLy8iK2xvY2F0aW9uLmhvc3QrKGEuY2hhckF0KDApPT0iLyI/IiI6bG9jYXRpb24ucGF0aG5hbWUucmVwbGFjZSgvXC9bXlwvXSokLywiIikpKyIvIithLnJlcGxhY2UoL15bXC9dKy8sIiIpLGF9LHRoaXMuJGd1ZXNzQmFzZVBhdGg9ZnVuY3Rpb24oKXtpZihhLmFjZUJhc2VVcmwpcmV0dXJuIGEuYWNlQmFzZVVybDt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPWJbY10sZT1kLmdldEF0dHJpYnV0ZSgiZGF0YS1hY2UtYmFzZSIpO2lmKGUpcmV0dXJuIGUucmVwbGFjZSgvXC8qJC8sIi8iKTt2YXIgZj1kLnNyY3x8ZC5nZXRBdHRyaWJ1dGUoInNyYyIpO2lmKCFmKWNvbnRpbnVlO3ZhciBnPWYubWF0Y2goL14oPzooLipcLylhY2VcLmpzfCguKlwvKWFjZSgtdW5jb21wcmVzc2VkKT8oLW5vY29uZmxpY3QpP1wuanMpKD86XD98JCkvKTtpZihnKXJldHVybiBnWzFdfHxnWzJdfXJldHVybiIifSx0aGlzLnRlcm1pbmF0ZT1mdW5jdGlvbigpe3RoaXMuX2VtaXQoInRlcm1pbmF0ZSIse30pLHRoaXMuJHdvcmtlci50ZXJtaW5hdGUoKSx0aGlzLiR3b3JrZXI9bnVsbCx0aGlzLiRkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix0aGlzLmNoYW5nZUxpc3RlbmVyKSx0aGlzLiRkb2M9bnVsbH0sdGhpcy5zZW5kPWZ1bmN0aW9uKGEsYil7dGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtjb21tYW5kOmEsYXJnczpifSl9LHRoaXMuY2FsbD1mdW5jdGlvbihhLGIsYyl7aWYoYyl7dmFyIGQ9dGhpcy5jYWxsYmFja0lkKys7dGhpcy5jYWxsYmFja3NbZF09YyxiLnB1c2goZCl9dGhpcy5zZW5kKGEsYil9LHRoaXMuZW1pdD1mdW5jdGlvbihhLGIpe3RyeXt0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2V2ZW50OmEsZGF0YTp7ZGF0YTpiLmRhdGF9fSl9Y2F0Y2goYyl7fX0sdGhpcy5hdHRhY2hUb0RvY3VtZW50PWZ1bmN0aW9uKGEpe3RoaXMuJGRvYyYmdGhpcy50ZXJtaW5hdGUoKSx0aGlzLiRkb2M9YSx0aGlzLmNhbGwoInNldFZhbHVlIixbYS5nZXRWYWx1ZSgpXSksYS5vbigiY2hhbmdlIix0aGlzLmNoYW5nZUxpc3RlbmVyKX0sdGhpcy5jaGFuZ2VMaXN0ZW5lcj1mdW5jdGlvbihhKXthLnJhbmdlPXtzdGFydDphLmRhdGEucmFuZ2Uuc3RhcnQsZW5kOmEuZGF0YS5yYW5nZS5lbmR9LHRoaXMuZW1pdCgiY2hhbmdlIixhKX19KSkuY2FsbChmLnByb3RvdHlwZSksYi5Xb3JrZXJDbGllbnQ9Zn0pLGRlZmluZSgiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvYmVoYXZpb3VyIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXIsZj1mdW5jdGlvbigpe3RoaXMuYWRkKCJicmFjZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09InsiKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7cmV0dXJuIGchPT0iIj97dGV4dDoieyIrZysifSIsc2VsZWN0aW9uOiExfTp7dGV4dDoie30iLHNlbGVjdGlvbjpbMSwxXX19aWYoZT09In0iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSJ9Iil7dmFyIGs9ZC4kZmluZE9wZW5pbmdCcmFja2V0KCJ9Iix7Y29sdW1uOmguY29sdW1uKzEscm93Omgucm93fSk7aWYoayE9PW51bGwpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19ZWxzZSBpZihlPT0iXG4iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSJ9Iil7dmFyIGw9ZC5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6aC5yb3csY29sdW1uOmguY29sdW1uKzF9KTtpZighbClyZXR1cm4gbnVsbDt2YXIgbT10aGlzLmdldE5leHRMaW5lSW5kZW50KGEsaS5zdWJzdHJpbmcoMCxpLmxlbmd0aC0xKSxkLmdldFRhYlN0cmluZygpKSxuPXRoaXMuJGdldEluZGVudChkLmRvYy5nZXRMaW5lKGwucm93KSk7cmV0dXJue3RleHQ6IlxuIittKyJcbiIrbixzZWxlY3Rpb246WzEsbS5sZW5ndGgsMSxtLmxlbmd0aF19fX19KSx0aGlzLmFkZCgiYnJhY2VzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSJ7Iil7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLmVuZC5jb2x1bW4sZS5lbmQuY29sdW1uKzEpO2lmKGg9PSJ9IilyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KSx0aGlzLmFkZCgicGFyZW5zIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSIoIil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/e3RleHQ6IigiK2crIikiLHNlbGVjdGlvbjohMX06e3RleHQ6IigpIixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSIpIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0iKSIpe3ZhciBrPWQuJGZpbmRPcGVuaW5nQnJhY2tldCgiKSIse2NvbHVtbjpoLmNvbHVtbisxLHJvdzpoLnJvd30pO2lmKGshPT1udWxsKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJwYXJlbnMiLCJkZWxldGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1kLmRvYy5nZXRUZXh0UmFuZ2UoZSk7aWYoIWUuaXNNdWx0aUxpbmUoKSYmZj09IigiKXt2YXIgZz1kLmRvYy5nZXRMaW5lKGUuc3RhcnQucm93KSxoPWcuc3Vic3RyaW5nKGUuc3RhcnQuY29sdW1uKzEsZS5zdGFydC5jb2x1bW4rMik7aWYoaD09IikiKXJldHVybiBlLmVuZC5jb2x1bW4rKyxlfX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0nIicpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtpZihnIT09IiIpcmV0dXJue3RleHQ6JyInK2crJyInLHNlbGVjdGlvbjohMX07dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbi0xLGguY29sdW1uKTtpZihqPT0iXFwiKXJldHVybiBudWxsO3ZhciBrPWQuZ2V0VG9rZW5zKGYuc3RhcnQucm93LGYuc3RhcnQucm93KVswXS50b2tlbnMsbD0wLG0sbj0tMTtmb3IodmFyIG89MDtvPGsubGVuZ3RoO28rKyl7bT1rW29dLG0udHlwZT09InN0cmluZyI/bj0tMTpuPDAmJihuPW0udmFsdWUuaW5kZXhPZignIicpKTtpZihtLnZhbHVlLmxlbmd0aCtsPmYuc3RhcnQuY29sdW1uKWJyZWFrO2wrPWtbb10udmFsdWUubGVuZ3RofWlmKCFtfHxuPDAmJm0udHlwZSE9PSJjb21tZW50IiYmKG0udHlwZSE9PSJzdHJpbmcifHxmLnN0YXJ0LmNvbHVtbiE9PW0udmFsdWUubGVuZ3RoK2wtMSYmbS52YWx1ZS5sYXN0SW5kZXhPZignIicpPT09bS52YWx1ZS5sZW5ndGgtMSkpcmV0dXJue3RleHQ6JyIiJyxzZWxlY3Rpb246WzEsMV19O2lmKG0mJm0udHlwZT09PSJzdHJpbmciKXt2YXIgcD1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihwPT0nIicpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19fSksdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSciJyl7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbisxLGUuc3RhcnQuY29sdW1uKzIpO2lmKGg9PSciJylyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KX07ZC5pbmhlcml0cyhmLGUpLGIuQ3N0eWxlQmVoYXZpb3VyPWZ9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvcmFuZ2UiLCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxmPWEoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGUsZz1iLkZvbGRNb2RlPWZ1bmN0aW9uKCl7fTtkLmluaGVyaXRzKGcsZiksZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj0vKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLyx0aGlzLmZvbGRpbmdTdG9wTWFya2VyPS9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLyx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpLGY9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7aWYoZil7dmFyIGc9Zi5pbmRleDtpZihmWzFdKXJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soYSxmWzFdLGMsZyk7dmFyIGg9YS5nZXRDb21tZW50Rm9sZFJhbmdlKGMsZytmWzBdLmxlbmd0aCk7cmV0dXJuIGguZW5kLmNvbHVtbi09MixofWlmKGIhPT0ibWFya2JlZ2luZW5kIilyZXR1cm47dmFyIGY9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTtpZihmKXt2YXIgZz1mLmluZGV4K2ZbMF0ubGVuZ3RoO2lmKGZbMl0pe3ZhciBoPWEuZ2V0Q29tbWVudEZvbGRSYW5nZShjLGcpO3JldHVybiBoLmVuZC5jb2x1bW4tPTIsaH12YXIgaT17cm93OmMsY29sdW1uOmd9LGo9YS4kZmluZE9wZW5pbmdCcmFja2V0KGZbMV0saSk7aWYoIWopcmV0dXJuO3JldHVybiBqLmNvbHVtbisrLGkuY29sdW1uLS0sZS5mcm9tUG9pbnRzKGosaSl9fX0uY2FsbChnLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGU9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPW51bGwsdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj1udWxsLHRoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpO3JldHVybiB0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGQpPyJzdGFydCI6Yj09Im1hcmtiZWdpbmVuZCImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChkKT8iZW5kIjoiIn0sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBudWxsfSx0aGlzLmluZGVudGF0aW9uQmxvY2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPS9eXHMqLyxmPWIsZz1iLGg9YS5nZXRMaW5lKGIpLGk9Y3x8aC5sZW5ndGgsaj1oLm1hdGNoKGUpWzBdLmxlbmd0aCxrPWEuZ2V0TGVuZ3RoKCk7d2hpbGUoKytiPGspe2g9YS5nZXRMaW5lKGIpO3ZhciBsPWgubWF0Y2goZSlbMF0ubGVuZ3RoO2lmKGw9PWgubGVuZ3RoKWNvbnRpbnVlO2lmKGw8PWopYnJlYWs7Zz1ifWlmKGc+Zil7dmFyIG09YS5nZXRMaW5lKGcpLmxlbmd0aDtyZXR1cm4gbmV3IGQoZixpLGcsbSl9fSx0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2s9ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGY9e3JvdzpjLGNvbHVtbjplKzF9LGc9YS4kZmluZENsb3NpbmdCcmFja2V0KGIsZik7aWYoIWcpcmV0dXJuO3ZhciBoPWEuZm9sZFdpZGdldHNbZy5yb3ddO3JldHVybiBoPT1udWxsJiYoaD10aGlzLmdldEZvbGRXaWRnZXQoYSxnLnJvdykpLGg9PSJzdGFydCImJihnLnJvdy0tLGcuY29sdW1uPWEuZ2V0TGluZShnLnJvdykubGVuZ3RoKSxkLmZyb21Qb2ludHMoZixnKX19KSkuY2FsbChlLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb2RlL2NzcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dCIsImFjZS90b2tlbml6ZXIiLCJhY2UvbW9kZS9jc3NfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsImFjZS93b3JrZXIvd29ya2VyX2NsaWVudCIsImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3RleHQiKS5Nb2RlLGY9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGc9YSgiLi9jc3NfaGlnaGxpZ2h0X3J1bGVzIikuQ3NzSGlnaGxpZ2h0UnVsZXMsaD1hKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudCxpPWEoIi4uL3dvcmtlci93b3JrZXJfY2xpZW50IikuV29ya2VyQ2xpZW50LGo9YSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlLGs9ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbml6ZXI9bmV3IGYoKG5ldyBnKS5nZXRSdWxlcygpLCJpIiksdGhpcy4kb3V0ZGVudD1uZXcgaCx0aGlzLmZvbGRpbmdSdWxlcz1uZXcgan07ZC5pbmhlcml0cyhrLGUpLGZ1bmN0aW9uKCl7dGhpcy5mb2xkaW5nUnVsZXM9ImNTdHlsZSIsdGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy4kZ2V0SW5kZW50KGIpLGU9dGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMoYixhKS50b2tlbnM7aWYoZS5sZW5ndGgmJmVbZS5sZW5ndGgtMV0udHlwZT09ImNvbW1lbnQiKXJldHVybiBkO3ZhciBmPWIubWF0Y2goL14uKlx7XHMqJC8pO3JldHVybiBmJiYoZCs9YyksZH0sdGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChiLGMpfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGEsYixjKXt0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGIsYyl9LHRoaXMuY3JlYXRlV29ya2VyPWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBpKFsiYWNlIl0sIndvcmtlci1jc3MuanMiLCJhY2UvbW9kZS9jc3Nfd29ya2VyIiwiV29ya2VyIik7cmV0dXJuIGIuYXR0YWNoVG9Eb2N1bWVudChhLmdldERvY3VtZW50KCkpLGIub24oImNzc2xpbnQiLGZ1bmN0aW9uKGIpe3ZhciBjPVtdO2IuZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2MucHVzaCh7cm93OmEubGluZS0xLGNvbHVtbjphLmNvbC0xLHRleHQ6YS5tZXNzYWdlLHR5cGU6YS50eXBlLGxpbnQ6YX0pfSksYS5zZXRBbm5vdGF0aW9ucyhjKX0pLGJ9fS5jYWxsKGsucHJvdG90eXBlKSxiLk1vZGU9a30pLGRlZmluZSgiYWNlL21vZGUvY3NzX2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9sYW5nIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4uL2xpYi9sYW5nIiksZj1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGc9ZnVuY3Rpb24oKXt2YXIgYT1lLmFycmF5VG9NYXAoIi1tb3otYXBwZWFyYW5jZXwtbW96LWJveC1zaXppbmd8LXdlYmtpdC1ib3gtc2l6aW5nfC1tb3otb3V0bGluZS1yYWRpdXN8LW1vei10cmFuc2Zvcm18LXdlYmtpdC10cmFuc2Zvcm18YXBwZWFyYW5jZXxhemltdXRofGJhY2tncm91bmQtYXR0YWNobWVudHxiYWNrZ3JvdW5kLWNvbG9yfGJhY2tncm91bmQtaW1hZ2V8YmFja2dyb3VuZC1vcmlnaW58YmFja2dyb3VuZC1wb3NpdGlvbnxiYWNrZ3JvdW5kLXJlcGVhdHxiYWNrZ3JvdW5kfGJvcmRlci1ib3R0b20tY29sb3J8Ym9yZGVyLWJvdHRvbS1zdHlsZXxib3JkZXItYm90dG9tLXdpZHRofGJvcmRlci1ib3R0b218Ym9yZGVyLWNvbGxhcHNlfGJvcmRlci1jb2xvcnxib3JkZXItbGVmdC1jb2xvcnxib3JkZXItbGVmdC1zdHlsZXxib3JkZXItbGVmdC13aWR0aHxib3JkZXItbGVmdHxib3JkZXItcmlnaHQtY29sb3J8Ym9yZGVyLXJpZ2h0LXN0eWxlfGJvcmRlci1yaWdodC13aWR0aHxib3JkZXItcmlnaHR8Ym9yZGVyLXNwYWNpbmd8Ym9yZGVyLXN0eWxlfGJvcmRlci10b3AtY29sb3J8Ym9yZGVyLXRvcC1zdHlsZXxib3JkZXItdG9wLXdpZHRofGJvcmRlci10b3B8Ym9yZGVyLXdpZHRofGJvcmRlcnxib3R0b218Ym94LXNpemluZ3xjYXB0aW9uLXNpZGV8Y2xlYXJ8Y2xpcHxjb2xvcnxjb250ZW50fGNvdW50ZXItaW5jcmVtZW50fGNvdW50ZXItcmVzZXR8Y3VlLWFmdGVyfGN1ZS1iZWZvcmV8Y3VlfGN1cnNvcnxkaXJlY3Rpb258ZGlzcGxheXxlbGV2YXRpb258ZW1wdHktY2VsbHN8ZmxvYXR8Zm9udC1mYW1pbHl8Zm9udC1zaXplLWFkanVzdHxmb250LXNpemV8Zm9udC1zdHJldGNofGZvbnQtc3R5bGV8Zm9udC12YXJpYW50fGZvbnQtd2VpZ2h0fGZvbnR8aGVpZ2h0fGxlZnR8bGV0dGVyLXNwYWNpbmd8bGluZS1oZWlnaHR8bGlzdC1zdHlsZS1pbWFnZXxsaXN0LXN0eWxlLXBvc2l0aW9ufGxpc3Qtc3R5bGUtdHlwZXxsaXN0LXN0eWxlfG1hcmdpbi1ib3R0b218bWFyZ2luLWxlZnR8bWFyZ2luLXJpZ2h0fG1hcmdpbi10b3B8bWFya2VyLW9mZnNldHxtYXJnaW58bWFya3N8bWF4LWhlaWdodHxtYXgtd2lkdGh8bWluLWhlaWdodHxtaW4td2lkdGh8LW1vei1ib3JkZXItcmFkaXVzfG9wYWNpdHl8b3JwaGFuc3xvdXRsaW5lLWNvbG9yfG91dGxpbmUtb2Zmc2V0fG91dGxpbmUtcmFkaXVzfG91dGxpbmUtc3R5bGV8b3V0bGluZS13aWR0aHxvdXRsaW5lfG92ZXJmbG93fG92ZXJmbG93LXh8b3ZlcmZsb3cteXxwYWRkaW5nLWJvdHRvbXxwYWRkaW5nLWxlZnR8cGFkZGluZy1yaWdodHxwYWRkaW5nLXRvcHxwYWRkaW5nfHBhZ2UtYnJlYWstYWZ0ZXJ8cGFnZS1icmVhay1iZWZvcmV8cGFnZS1icmVhay1pbnNpZGV8cGFnZXxwYXVzZS1hZnRlcnxwYXVzZS1iZWZvcmV8cGF1c2V8cGl0Y2gtcmFuZ2V8cGl0Y2h8cGxheS1kdXJpbmd8cG9pbnRlci1ldmVudHN8cG9zaXRpb258cXVvdGVzfHJlc2l6ZXxyaWNobmVzc3xyaWdodHxzaXplfHNwZWFrLWhlYWRlcnxzcGVhay1udW1lcmFsfHNwZWFrLXB1bmN0dWF0aW9ufHNwZWVjaC1yYXRlfHNwZWFrfHN0cmVzc3x0YWJsZS1sYXlvdXR8dGV4dC1hbGlnbnx0ZXh0LWRlY29yYXRpb258dGV4dC1pbmRlbnR8dGV4dC1zaGFkb3d8dGV4dC10cmFuc2Zvcm18dG9wfHRyYW5zZm9ybXx1bmljb2RlLWJpZGl8dmVydGljYWwtYWxpZ258dmlzaWJpbGl0eXx2b2ljZS1mYW1pbHl8dm9sdW1lfHdoaXRlLXNwYWNlfHdpZG93c3x3aWR0aHx3b3JkLXNwYWNpbmd8ei1pbmRleCIuc3BsaXQoInwiKSksYj1lLmFycmF5VG9NYXAoInJnYnxyZ2JhfHVybHxhdHRyfGNvdW50ZXJ8Y291bnRlcnMiLnNwbGl0KCJ8IikpLGM9ZS5hcnJheVRvTWFwKCJhYnNvbHV0ZXxhbGwtc2Nyb2xsfGFsd2F5c3xhcm1lbmlhbnxhdXRvfGJhc2VsaW5lfGJlbG93fGJpZGktb3ZlcnJpZGV8YmxvY2t8Ym9sZHxib2xkZXJ8Ym9yZGVyLWJveHxib3RofGJvdHRvbXxicmVhay1hbGx8YnJlYWstd29yZHxjYXBpdGFsaXplfGNlbnRlcnxjaGFyfGNpcmNsZXxjamstaWRlb2dyYXBoaWN8Y29sLXJlc2l6ZXxjb2xsYXBzZXxjb250ZW50LWJveHxjcm9zc2hhaXJ8ZGFzaGVkfGRlY2ltYWwtbGVhZGluZy16ZXJvfGRlY2ltYWx8ZGVmYXVsdHxkaXNhYmxlZHxkaXNjfGRpc3RyaWJ1dGUtYWxsLWxpbmVzfGRpc3RyaWJ1dGUtbGV0dGVyfGRpc3RyaWJ1dGUtc3BhY2V8ZGlzdHJpYnV0ZXxkb3R0ZWR8ZG91YmxlfGUtcmVzaXplfGVsbGlwc2lzfGZpeGVkfGdlb3JnaWFufGdyb292ZXxoYW5kfGhlYnJld3xoZWxwfGhpZGRlbnxoaXJhZ2FuYS1pcm9oYXxoaXJhZ2FuYXxob3Jpem9udGFsfGlkZW9ncmFwaC1hbHBoYXxpZGVvZ3JhcGgtbnVtZXJpY3xpZGVvZ3JhcGgtcGFyZW50aGVzaXN8aWRlb2dyYXBoLXNwYWNlfGluYWN0aXZlfGluaGVyaXR8aW5saW5lLWJsb2NrfGlubGluZXxpbnNldHxpbnNpZGV8aW50ZXItaWRlb2dyYXBofGludGVyLXdvcmR8aXRhbGljfGp1c3RpZnl8a2F0YWthbmEtaXJvaGF8a2F0YWthbmF8a2VlcC1hbGx8bGVmdHxsaWdodGVyfGxpbmUtZWRnZXxsaW5lLXRocm91Z2h8bGluZXxsaXN0LWl0ZW18bG9vc2V8bG93ZXItYWxwaGF8bG93ZXItZ3JlZWt8bG93ZXItbGF0aW58bG93ZXItcm9tYW58bG93ZXJjYXNlfGxyLXRifGx0cnxtZWRpdW18bWlkZGxlfG1vdmV8bi1yZXNpemV8bmUtcmVzaXplfG5ld3NwYXBlcnxuby1kcm9wfG5vLXJlcGVhdHxudy1yZXNpemV8bm9uZXxub3JtYWx8bm90LWFsbG93ZWR8bm93cmFwfG9ibGlxdWV8b3V0c2V0fG91dHNpZGV8b3ZlcmxpbmV8cG9pbnRlcnxwcm9ncmVzc3xyZWxhdGl2ZXxyZXBlYXQteHxyZXBlYXQteXxyZXBlYXR8cmlnaHR8cmlkZ2V8cm93LXJlc2l6ZXxydGx8cy1yZXNpemV8c2Nyb2xsfHNlLXJlc2l6ZXxzZXBhcmF0ZXxzbWFsbC1jYXBzfHNvbGlkfHNxdWFyZXxzdGF0aWN8c3RyaWN0fHN1cGVyfHN3LXJlc2l6ZXx0YWJsZS1mb290ZXItZ3JvdXB8dGFibGUtaGVhZGVyLWdyb3VwfHRiLXJsfHRleHQtYm90dG9tfHRleHQtdG9wfHRleHR8dGhpY2t8dGhpbnx0b3B8dHJhbnNwYXJlbnR8dW5kZXJsaW5lfHVwcGVyLWFscGhhfHVwcGVyLWxhdGlufHVwcGVyLXJvbWFufHVwcGVyY2FzZXx2ZXJ0aWNhbC1pZGVvZ3JhcGhpY3x2ZXJ0aWNhbC10ZXh0fHZpc2libGV8dy1yZXNpemV8d2FpdHx3aGl0ZXNwYWNlfHplcm8iLnNwbGl0KCJ8IikpLGQ9ZS5hcnJheVRvTWFwKCJhcXVhfGJsYWNrfGJsdWV8ZnVjaHNpYXxncmF5fGdyZWVufGxpbWV8bWFyb29ufG5hdnl8b2xpdmV8b3JhbmdlfHB1cnBsZXxyZWR8c2lsdmVyfHRlYWx8d2hpdGV8eWVsbG93Ii5zcGxpdCgifCIpKSxmPSJcXC0/KD86KD86WzAtOV0rKXwoPzpbMC05XSpcXC5bMC05XSspKSIsZz1be3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwvXFwqIixuZXh0OiJydWxlc2V0X2NvbW1lbnQifSx7dG9rZW46InN0cmluZyIscmVnZXg6J1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nfSx7dG9rZW46InN0cmluZyIscmVnZXg6IlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10ifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OmYrIig/OmVtfGV4fHB4fGNtfG1tfGlufHB0fHBjfGRlZ3xyYWR8Z3JhZHxtc3xzfGh6fGtoenwlKSJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IiNbYS1mMC05XXs2fSJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IiNbYS1mMC05XXszfSJ9LHt0b2tlbjpmdW5jdGlvbihlKXtyZXR1cm4gYS5oYXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpPyJzdXBwb3J0LnR5cGUiOmIuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT8ic3VwcG9ydC5mdW5jdGlvbiI6Yy5oYXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpPyJzdXBwb3J0LmNvbnN0YW50IjpkLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/InN1cHBvcnQuY29uc3RhbnQuY29sb3IiOiJ0ZXh0In0scmVnZXg6IlxcLT9bYS16QS1aX11bYS16QS1aMC05X1xcLV0qIn1dLGg9ZS5jb3B5QXJyYXkoZyk7aC51bnNoaWZ0KHt0b2tlbjoicGFyZW4ucnBhcmVuIixyZWdleDoiXFx9IixuZXh0OiJzdGFydCJ9KTt2YXIgaT1lLmNvcHlBcnJheShnKTtpLnVuc2hpZnQoe3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4OiJcXH0iLG5leHQ6Im1lZGlhIn0pO3ZhciBqPVt7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxrPWUuY29weUFycmF5KGopO2sudW5zaGlmdCh7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj9cXCpcXC8iLG5leHQ6InN0YXJ0In0pO3ZhciBsPWUuY29weUFycmF5KGopO2wudW5zaGlmdCh7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj9cXCpcXC8iLG5leHQ6Im1lZGlhIn0pO3ZhciBtPWUuY29weUFycmF5KGopO20udW5zaGlmdCh7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj9cXCpcXC8iLG5leHQ6InJ1bGVzZXQifSksdGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCoiLG5leHQ6ImNvbW1lbnQifSx7dG9rZW46InBhcmVuLmxwYXJlbiIscmVnZXg6IlxceyIsbmV4dDoicnVsZXNldCJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiQC4qP3siLG5leHQ6Im1lZGlhIn0se3Rva2VuOiJrZXl3b3JkIixyZWdleDoiI1thLXowLTktX10rIn0se3Rva2VuOiJ2YXJpYWJsZSIscmVnZXg6IlxcLlthLXowLTktX10rIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiI6W2EtejAtOS1fXSsifSx7dG9rZW46ImNvbnN0YW50IixyZWdleDoiW2EtejAtOS1fXSsifV0sbWVkaWE6W3t0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKiIsbmV4dDoibWVkaWFfY29tbWVudCJ9LHt0b2tlbjoicGFyZW4ubHBhcmVuIixyZWdleDoiXFx7IixuZXh0OiJtZWRpYV9ydWxlc2V0In0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJcXH0iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJrZXl3b3JkIixyZWdleDoiI1thLXowLTktX10rIn0se3Rva2VuOiJ2YXJpYWJsZSIscmVnZXg6IlxcLlthLXowLTktX10rIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiI6W2EtejAtOS1fXSsifSx7dG9rZW46ImNvbnN0YW50IixyZWdleDoiW2EtejAtOS1fXSsifV0sY29tbWVudDprLHJ1bGVzZXQ6aCxydWxlc2V0X2NvbW1lbnQ6bSxtZWRpYV9ydWxlc2V0OmksbWVkaWFfY29tbWVudDpsfX07ZC5pbmhlcml0cyhnLGYpLGIuQ3NzSGlnaGxpZ2h0UnVsZXM9Z30pLGRlZmluZSgiYWNlL21vZGUvaHRtbF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL2Nzc19oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL3htbF91dGlsIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vY3NzX2hpZ2hsaWdodF9ydWxlcyIpLkNzc0hpZ2hsaWdodFJ1bGVzLGY9YSgiLi9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIpLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyxnPWEoIi4veG1sX3V0aWwiKSxoPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsaT1mdW5jdGlvbigpe3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJ0ZXh0IixtZXJnZTohMCxyZWdleDoiPFxcIVxcW0NEQVRBXFxbIixuZXh0OiJjZGF0YSJ9LHt0b2tlbjoieG1sX3BlIixyZWdleDoiPFxcPy4qP1xcPz4ifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiI8XFwhLS0iLG5leHQ6ImNvbW1lbnQifSx7dG9rZW46Im1ldGEudGFnIixyZWdleDoiPCg/PXMqc2NyaXB0XFxiKSIsbmV4dDoic2NyaXB0In0se3Rva2VuOiJtZXRhLnRhZyIscmVnZXg6IjwoPz1zKnN0eWxlXFxiKSIsbmV4dDoiY3NzIn0se3Rva2VuOiJtZXRhLnRhZyIscmVnZXg6IjxcXC8/IixuZXh0OiJ0YWcifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiW148XSsifV0sY2RhdGE6W3t0b2tlbjoidGV4dCIscmVnZXg6IlxcXVxcXT4iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJ0ZXh0IixtZXJnZTohMCxyZWdleDoiXFxzKyJ9LHt0b2tlbjoidGV4dCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLGNvbW1lbnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qPy0tPiIsbmV4dDoic3RhcnQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX0sZy50YWcodGhpcy4kcnVsZXMsInRhZyIsInN0YXJ0IiksZy50YWcodGhpcy4kcnVsZXMsImNzcyIsImNzcy1zdGFydCIpLGcudGFnKHRoaXMuJHJ1bGVzLCJzY3JpcHQiLCJqcy1zdGFydCIpLHRoaXMuZW1iZWRSdWxlcyhmLCJqcy0iLFt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJcXC9cXC8uKig/PTxcXC9zY3JpcHQ+KSIsbmV4dDoidGFnIn0se3Rva2VuOiJtZXRhLnRhZyIscmVnZXg6IjxcXC8oPz1zY3JpcHQpIixuZXh0OiJ0YWcifV0pLHRoaXMuZW1iZWRSdWxlcyhlLCJjc3MtIixbe3Rva2VuOiJtZXRhLnRhZyIscmVnZXg6IjxcXC8oPz1zdHlsZSkiLG5leHQ6InRhZyJ9XSl9O2QuaW5oZXJpdHMoaSxoKSxiLkh0bWxIaWdobGlnaHRSdWxlcz1pfSksZGVmaW5lKCJhY2UvbW9kZS94bWxfdXRpbCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvbGFuZyJdLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBnKGEpe3JldHVyblt7dG9rZW46InN0cmluZyIscmVnZXg6JyIuKj8iJ30se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OidbIl0uKicsbmV4dDphKyItcXFzdHJpbmcifSx7dG9rZW46InN0cmluZyIscmVnZXg6IicuKj8nIn0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiJbJ10uKiIsbmV4dDphKyItcXN0cmluZyJ9XX1mdW5jdGlvbiBoKGEsYil7cmV0dXJuW3t0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLio/IithLG5leHQ6Yn0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX0idXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL2xhbmciKSxlPWQuYXJyYXlUb01hcCgiYnV0dG9ufGZvcm18aW5wdXR8bGFiZWx8c2VsZWN0fHRleHRhcmVhIi5zcGxpdCgifCIpKSxmPWQuYXJyYXlUb01hcCgidGFibGV8dGJvZHl8dGR8dGZvb3R8dGh8dHIiLnNwbGl0KCJ8IikpO2IudGFnPWZ1bmN0aW9uKGEsYixjKXthW2JdPVt7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn0se3Rva2VuOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09ImEiPyJtZXRhLnRhZy5hbmNob3IiOmE9PT0iaW1nIj8ibWV0YS50YWcuaW1hZ2UiOmE9PT0ic2NyaXB0Ij8ibWV0YS50YWcuc2NyaXB0IjphPT09InN0eWxlIj8ibWV0YS50YWcuc3R5bGUiOmUuaGFzT3duUHJvcGVydHkoYS50b0xvd2VyQ2FzZSgpKT8ibWV0YS50YWcuZm9ybSI6Zi5oYXNPd25Qcm9wZXJ0eShhLnRvTG93ZXJDYXNlKCkpPyJtZXRhLnRhZy50YWJsZSI6Im1ldGEudGFnIn0sbWVyZ2U6ITAscmVnZXg6IlstX2EtekEtWjAtOTohXSsiLG5leHQ6YisiZW1iZWQtYXR0cmlidXRlLWxpc3QifSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OmIrImVtYmVkLWF0dHJpYnV0ZS1saXN0In1dLGFbYisiLXFzdHJpbmciXT1oKCInIixiKyJlbWJlZC1hdHRyaWJ1dGUtbGlzdCIpLGFbYisiLXFxc3RyaW5nIl09aCgnIicsYisiZW1iZWQtYXR0cmlidXRlLWxpc3QiKSxhW2IrImVtYmVkLWF0dHJpYnV0ZS1saXN0Il09W3t0b2tlbjoibWV0YS50YWciLG1lcmdlOiEwLHJlZ2V4OiIvPz4iLG5leHQ6Y30se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiPSJ9LHt0b2tlbjoiZW50aXR5Lm90aGVyLmF0dHJpYnV0ZS1uYW1lIixyZWdleDoiWy1fYS16QS1aMC05Ol0rIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn1dLmNvbmNhdChnKGIpKX19KSxkZWZpbmUoImFjZS9tb2RlL2JlaGF2aW91ci94bWwiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL2JlaGF2aW91ciIsImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4uL2JlaGF2aW91ciIpLkJlaGF2aW91cixmPWEoIi4vY3N0eWxlIikuQ3N0eWxlQmVoYXZpb3VyLGc9ZnVuY3Rpb24oKXt0aGlzLmluaGVyaXQoZixbInN0cmluZ19kcXVvdGVzIl0pLHRoaXMuYWRkKCJicmFja2V0cyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0iPCIpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtyZXR1cm4gZyE9PSIiPyExOnt0ZXh0OiI8PiIsc2VsZWN0aW9uOlsxLDFdfX1pZihlPT0iPiIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09Ij4iKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19ZWxzZSBpZihlPT0iXG4iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxrPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzIpO2lmKGs9PSI8LyIpe3ZhciBsPXRoaXMuJGdldEluZGVudChkLmRvYy5nZXRMaW5lKGgucm93KSkrZC5nZXRUYWJTdHJpbmcoKSxtPXRoaXMuJGdldEluZGVudChkLmRvYy5nZXRMaW5lKGgucm93KSk7cmV0dXJue3RleHQ6IlxuIitsKyJcbiIrbSxzZWxlY3Rpb246WzEsbC5sZW5ndGgsMSxsLmxlbmd0aF19fX19KX07ZC5pbmhlcml0cyhnLGUpLGIuWG1sQmVoYXZpb3VyPWd9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvaHRtbCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvZm9sZGluZy9taXhlZCIsImFjZS9tb2RlL2ZvbGRpbmcveG1sIiwiYWNlL21vZGUvZm9sZGluZy9jc3R5bGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4vbWl4ZWQiKS5Gb2xkTW9kZSxmPWEoIi4veG1sIikuRm9sZE1vZGUsZz1hKCIuL2NzdHlsZSIpLkZvbGRNb2RlLGg9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe2UuY2FsbCh0aGlzLG5ldyBmKHthcmVhOjEsYmFzZToxLGJyOjEsY29sOjEsY29tbWFuZDoxLGVtYmVkOjEsaHI6MSxpbWc6MSxpbnB1dDoxLGtleWdlbjoxLGxpbms6MSxtZXRhOjEscGFyYW06MSxzb3VyY2U6MSx0cmFjazoxLHdicjoxLGxpOjEsZHQ6MSxkZDoxLHA6MSxydDoxLHJwOjEsb3B0Z3JvdXA6MSxvcHRpb246MSxjb2xncm91cDoxLHRkOjEsdGg6MX0pLHsianMtIjpuZXcgZywiY3NzLSI6bmV3IGd9KX07ZC5pbmhlcml0cyhoLGUpfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL21peGVkIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZSxmPWIuRm9sZE1vZGU9ZnVuY3Rpb24oYSxiKXt0aGlzLmRlZmF1bHRNb2RlPWEsdGhpcy5zdWJNb2Rlcz1ifTtkLmluaGVyaXRzKGYsZSksZnVuY3Rpb24oKXt0aGlzLiRnZXRNb2RlPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYiBpbiB0aGlzLnN1Yk1vZGVzKWlmKGEuaW5kZXhPZihiKT09PTApcmV0dXJuIHRoaXMuc3ViTW9kZXNbYl07cmV0dXJuIG51bGx9LHRoaXMuJHRyeU1vZGU9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9dGhpcy4kZ2V0TW9kZShhKTtyZXR1cm4gZT9lLmdldEZvbGRXaWRnZXQoYixjLGQpOiIifSx0aGlzLmdldEZvbGRXaWRnZXQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiR0cnlNb2RlKGEuZ2V0U3RhdGUoYy0xKSxhLGIsYyl8fHRoaXMuJHRyeU1vZGUoYS5nZXRTdGF0ZShjKSxhLGIsYyl8fHRoaXMuZGVmYXVsdE1vZGUuZ2V0Rm9sZFdpZGdldChhLGIsYyl9LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLiRnZXRNb2RlKGEuZ2V0U3RhdGUoYy0xKSk7aWYoIWR8fCFkLmdldEZvbGRXaWRnZXQoYSxiLGMpKWQ9dGhpcy4kZ2V0TW9kZShhLmdldFN0YXRlKGMpKTtpZighZHx8IWQuZ2V0Rm9sZFdpZGdldChhLGIsYykpZD10aGlzLmRlZmF1bHRNb2RlO3JldHVybiBkLmdldEZvbGRXaWRnZXRSYW5nZShhLGIsYyl9fS5jYWxsKGYucHJvdG90eXBlKX0pLGRlZmluZSgiYWNlL21vZGUvZm9sZGluZy94bWwiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9yYW5nZSIsImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIiwiYWNlL3Rva2VuX2l0ZXJhdG9yIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi8uLi9saWIvbGFuZyIpLGY9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxnPWEoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGUsaD1hKCIuLi8uLi90b2tlbl9pdGVyYXRvciIpLlRva2VuSXRlcmF0b3IsaT1iLkZvbGRNb2RlPWZ1bmN0aW9uKGEpe2cuY2FsbCh0aGlzKSx0aGlzLnZvaWRFbGVtZW50cz1hfHx7fX07ZC5pbmhlcml0cyhpLGcpLGZ1bmN0aW9uKCl7dGhpcy5nZXRGb2xkV2lkZ2V0PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLl9nZXRGaXJzdFRhZ0luTGluZShhLGMpO3JldHVybiBkLmNsb3Npbmc/Yj09Im1hcmtiZWdpbmVuZCI/ImVuZCI6IiI6IWQudGFnTmFtZXx8dGhpcy52b2lkRWxlbWVudHNbZC50YWdOYW1lLnRvTG93ZXJDYXNlKCldPyIiOmQuc2VsZkNsb3Npbmc/IiI6ZC52YWx1ZS5pbmRleE9mKCIvIitkLnRhZ05hbWUpIT09LTE/IiI6InN0YXJ0In0sdGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmU9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldFRva2VucyhiLGIpWzBdLnRva2VucyxkPSIiO2Zvcih2YXIgZj0wO2Y8Yy5sZW5ndGg7ZisrKXt2YXIgZz1jW2ZdO2cudHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpPT09MD9kKz1nLnZhbHVlOmQrPWUuc3RyaW5nUmVwZWF0KCIgIixnLnZhbHVlLmxlbmd0aCl9cmV0dXJuIHRoaXMuX3BhcnNlVGFnKGQpfSx0aGlzLnRhZ1JlPS9eKFxzKikoPD8oXC8/KShbLV9hLXpBLVowLTk6IV0qKVxzKihcLz8pPj8pLyx0aGlzLl9wYXJzZVRhZz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnRhZ1JlLmV4ZWMoYSksYz10aGlzLnRhZ1JlLmxhc3RJbmRleHx8MDtyZXR1cm4gdGhpcy50YWdSZS5sYXN0SW5kZXg9MCx7dmFsdWU6YSxtYXRjaDpiP2JbMl06IiIsY2xvc2luZzpiPyEhYlszXTohMSxzZWxmQ2xvc2luZzpiPyEhYls1XXx8YlsyXT09Ii8+IjohMSx0YWdOYW1lOmI/Yls0XToiIixjb2x1bW46YlsxXT9jK2JbMV0ubGVuZ3RoOmN9fSx0aGlzLl9yZWFkVGFnRm9yd2FyZD1mdW5jdGlvbihhKXt2YXIgYj1hLmdldEN1cnJlbnRUb2tlbigpO2lmKCFiKXJldHVybiBudWxsO3ZhciBjPSIiLGQ7ZG8gaWYoYi50eXBlLmluZGV4T2YoIm1ldGEudGFnIik9PT0wKXtpZighZCl2YXIgZD17cm93OmEuZ2V0Q3VycmVudFRva2VuUm93KCksY29sdW1uOmEuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCl9O2MrPWIudmFsdWU7aWYoYy5pbmRleE9mKCI+IikhPT0tMSl7dmFyIGU9dGhpcy5fcGFyc2VUYWcoYyk7cmV0dXJuIGUuc3RhcnQ9ZCxlLmVuZD17cm93OmEuZ2V0Q3VycmVudFRva2VuUm93KCksY29sdW1uOmEuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkrYi52YWx1ZS5sZW5ndGh9LGEuc3RlcEZvcndhcmQoKSxlfX13aGlsZShiPWEuc3RlcEZvcndhcmQoKSk7cmV0dXJuIG51bGx9LHRoaXMuX3JlYWRUYWdCYWNrd2FyZD1mdW5jdGlvbihhKXt2YXIgYj1hLmdldEN1cnJlbnRUb2tlbigpO2lmKCFiKXJldHVybiBudWxsO3ZhciBjPSIiLGQ7ZG8gaWYoYi50eXBlLmluZGV4T2YoIm1ldGEudGFnIik9PT0wKXtkfHwoZD17cm93OmEuZ2V0Q3VycmVudFRva2VuUm93KCksY29sdW1uOmEuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkrYi52YWx1ZS5sZW5ndGh9KSxjPWIudmFsdWUrYztpZihjLmluZGV4T2YoIjwiKSE9PS0xKXt2YXIgZT10aGlzLl9wYXJzZVRhZyhjKTtyZXR1cm4gZS5lbmQ9ZCxlLnN0YXJ0PXtyb3c6YS5nZXRDdXJyZW50VG9rZW5Sb3coKSxjb2x1bW46YS5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKX0sYS5zdGVwQmFja3dhcmQoKSxlfX13aGlsZShiPWEuc3RlcEJhY2t3YXJkKCkpO3JldHVybiBudWxsfSx0aGlzLl9wb3A9ZnVuY3Rpb24oYSxiKXt3aGlsZShhLmxlbmd0aCl7dmFyIGM9YVthLmxlbmd0aC0xXTtpZighYnx8Yy50YWdOYW1lPT1iLnRhZ05hbWUpcmV0dXJuIGEucG9wKCk7aWYodGhpcy52b2lkRWxlbWVudHNbYi50YWdOYW1lXSlyZXR1cm47aWYodGhpcy52b2lkRWxlbWVudHNbYy50YWdOYW1lXSl7YS5wb3AoKTtjb250aW51ZX1yZXR1cm4gbnVsbH19LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLl9nZXRGaXJzdFRhZ0luTGluZShhLGMpO2lmKCFkLm1hdGNoKXJldHVybiBudWxsO3ZhciBlPWQuY2xvc2luZ3x8ZC5zZWxmQ2xvc2luZyxnPVtdLGk7aWYoIWUpe3ZhciBqPW5ldyBoKGEsYyxkLmNvbHVtbiksaz17cm93OmMsY29sdW1uOmQuY29sdW1uK2QudGFnTmFtZS5sZW5ndGgrMn07d2hpbGUoaT10aGlzLl9yZWFkVGFnRm9yd2FyZChqKSl7aWYoaS5zZWxmQ2xvc2luZyl7aWYoIWcubGVuZ3RoKXJldHVybiBpLnN0YXJ0LmNvbHVtbis9aS50YWdOYW1lLmxlbmd0aCsyLGkuZW5kLmNvbHVtbi09MixmLmZyb21Qb2ludHMoaS5zdGFydCxpLmVuZCk7Y29udGludWV9aWYoaS5jbG9zaW5nKXt0aGlzLl9wb3AoZyxpKTtpZihnLmxlbmd0aD09MClyZXR1cm4gZi5mcm9tUG9pbnRzKGssaS5zdGFydCl9ZWxzZSBnLnB1c2goaSl9fWVsc2V7dmFyIGo9bmV3IGgoYSxjLGQuY29sdW1uK2QubWF0Y2gubGVuZ3RoKSxsPXtyb3c6Yyxjb2x1bW46ZC5jb2x1bW59O3doaWxlKGk9dGhpcy5fcmVhZFRhZ0JhY2t3YXJkKGopKXtpZihpLnNlbGZDbG9zaW5nKXtpZighZy5sZW5ndGgpcmV0dXJuIGkuc3RhcnQuY29sdW1uKz1pLnRhZ05hbWUubGVuZ3RoKzIsaS5lbmQuY29sdW1uLT0yLGYuZnJvbVBvaW50cyhpLnN0YXJ0LGkuZW5kKTtjb250aW51ZX1pZighaS5jbG9zaW5nKXt0aGlzLl9wb3AoZyxpKTtpZihnLmxlbmd0aD09MClyZXR1cm4gaS5zdGFydC5jb2x1bW4rPWkudGFnTmFtZS5sZW5ndGgrMixmLmZyb21Qb2ludHMoaS5zdGFydCxsKX1lbHNlIGcucHVzaChpKX19fX0uY2FsbChpLnByb3RvdHlwZSl9KSxmdW5jdGlvbigpe3dpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLGZ1bmN0aW9uKGEpe3dpbmRvdy5hY2V8fCh3aW5kb3cuYWNlPXt9KTtmb3IodmFyIGIgaW4gYSlhLmhhc093blByb3BlcnR5KGIpJiYoYWNlW2JdPWFbYl0pfSl9KCk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-java-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCdhY2UvbW9kZS9qYXZhJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9qYXZhc2NyaXB0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvamF2YV9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBKYXZhU2NyaXB0TW9kZSA9IHJlcXVpcmUoIi4vamF2YXNjcmlwdCIpLk1vZGU7CnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7CnZhciBKYXZhSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2phdmFfaGlnaGxpZ2h0X3J1bGVzIikuSmF2YUhpZ2hsaWdodFJ1bGVzOwoKdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsKICAgIEphdmFTY3JpcHRNb2RlLmNhbGwodGhpcyk7CiAgICAKICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IEphdmFIaWdobGlnaHRSdWxlcygpLmdldFJ1bGVzKCkpOwp9Owpvb3AuaW5oZXJpdHMoTW9kZSwgSmF2YVNjcmlwdE1vZGUpOwoKKGZ1bmN0aW9uKCkgewogICAgCiAgICB0aGlzLmNyZWF0ZVdvcmtlciA9IGZ1bmN0aW9uKHNlc3Npb24pIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH07Cgp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsKCmV4cG9ydHMuTW9kZSA9IE1vZGU7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2phdmFzY3JpcHQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHQnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgJ2FjZS9yYW5nZScsICdhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQnLCAnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZScsICdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsKdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsKdmFyIEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiKS5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXM7CnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Owp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOwp2YXIgV29ya2VyQ2xpZW50ID0gcmVxdWlyZSgiLi4vd29ya2VyL3dvcmtlcl9jbGllbnQiKS5Xb3JrZXJDbGllbnQ7CnZhciBDc3R5bGVCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2JlaGF2aW91ci9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXI7CnZhciBDU3R5bGVGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZTsKCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKG5ldyBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsKICAgIHRoaXMuJG91dGRlbnQgPSBuZXcgTWF0Y2hpbmdCcmFjZU91dGRlbnQoKTsKICAgIHRoaXMuJGJlaGF2aW91ciA9IG5ldyBDc3R5bGVCZWhhdmlvdXIoKTsKICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IENTdHlsZUZvbGRNb2RlKCk7Cn07Cm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7CgooZnVuY3Rpb24oKSB7CgoKICAgIHRoaXMudG9nZ2xlQ29tbWVudExpbmVzID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgc3RhcnRSb3csIGVuZFJvdykgewogICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsKICAgICAgICB2YXIgcmUgPSAvXihccyopXC9cLy87CgogICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykgewogICAgICAgICAgICBpZiAoIXJlLnRlc3QoZG9jLmdldExpbmUoaSkpKSB7CiAgICAgICAgICAgICAgICBvdXRkZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKG91dGRlbnQpIHsKICAgICAgICAgICAgdmFyIGRlbGV0ZVJhbmdlID0gbmV3IFJhbmdlKDAsIDAsIDAsIDApOwogICAgICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUoaSk7CiAgICAgICAgICAgICAgICB2YXIgbSA9IGxpbmUubWF0Y2gocmUpOwogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2Uuc3RhcnQucm93ID0gaTsKICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLmVuZC5yb3cgPSBpOwogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLmNvbHVtbiA9IG1bMF0ubGVuZ3RoOwogICAgICAgICAgICAgICAgZG9jLnJlcGxhY2UoZGVsZXRlUmFuZ2UsIG1bMV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBkb2MuaW5kZW50Um93cyhzdGFydFJvdywgZW5kUm93LCAiLy8iKTsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7CiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsKCiAgICAgICAgdmFyIHRva2VuaXplZExpbmUgPSB0aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhsaW5lLCBzdGF0ZSk7CiAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplZExpbmUudG9rZW5zOwogICAgICAgIHZhciBlbmRTdGF0ZSA9IHRva2VuaXplZExpbmUuc3RhdGU7CgogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7CiAgICAgICAgICAgIHJldHVybiBpbmRlbnQ7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmIChzdGF0ZSA9PSAic3RhcnQiIHx8IHN0YXRlID09ICJyZWdleF9hbGxvd2VkIikgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eLiooPzpcYmNhc2VcYi4qXDp8W1x7XChcW10pXHMqJC8pOwogICAgICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgICAgIGluZGVudCArPSB0YWI7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09ICJkb2Mtc3RhcnQiKSB7CiAgICAgICAgICAgIGlmIChlbmRTdGF0ZSA9PSAic3RhcnQiIHx8IHN0YXRlID09ICJyZWdleF9hbGxvd2VkIikgewogICAgICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL15ccyooXC8/KVwqLyk7CiAgICAgICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICAgICAgaWYgKG1hdGNoWzFdKSB7CiAgICAgICAgICAgICAgICAgICAgaW5kZW50ICs9ICIgIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGluZGVudCArPSAiKiAiOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaW5kZW50OwogICAgfTsKCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCBpbnB1dCkgewogICAgICAgIHJldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChsaW5lLCBpbnB1dCk7CiAgICB9OwoKICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCByb3cpIHsKICAgICAgICB0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGRvYywgcm93KTsKICAgIH07CiAgICAKICAgIHRoaXMuY3JlYXRlV29ya2VyID0gZnVuY3Rpb24oc2Vzc2lvbikgewogICAgICAgIHZhciB3b3JrZXIgPSBuZXcgV29ya2VyQ2xpZW50KFsiYWNlIl0sICJ3b3JrZXItamF2YXNjcmlwdC5qcyIsICJhY2UvbW9kZS9qYXZhc2NyaXB0X3dvcmtlciIsICJKYXZhU2NyaXB0V29ya2VyIik7CiAgICAgICAgd29ya2VyLmF0dGFjaFRvRG9jdW1lbnQoc2Vzc2lvbi5nZXREb2N1bWVudCgpKTsKICAgICAgICAgICAgCiAgICAgICAgd29ya2VyLm9uKCJqc2xpbnQiLCBmdW5jdGlvbihyZXN1bHRzKSB7CiAgICAgICAgICAgIHZhciBlcnJvcnMgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHJlc3VsdHMuZGF0YS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIGVycm9yID0gcmVzdWx0cy5kYXRhW2ldOwogICAgICAgICAgICAgICAgaWYgKGVycm9yKQogICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgcm93OiBlcnJvci5saW5lLTEsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogZXJyb3IuY2hhcmFjdGVyLTEsCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGVycm9yLnJlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogIndhcm5pbmciLAogICAgICAgICAgICAgICAgICAgICAgICBsaW50OiBlcnJvcgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlc3Npb24uc2V0QW5ub3RhdGlvbnMoZXJyb3JzKTsKICAgICAgICB9KTsKICAgICAgICAKICAgICAgICB3b3JrZXIub24oIm5hcmNpc3N1cyIsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgc2Vzc2lvbi5zZXRBbm5vdGF0aW9ucyhbZS5kYXRhXSk7CiAgICAgICAgfSk7CiAgICAgICAgCiAgICAgICAgd29ya2VyLm9uKCJ0ZXJtaW5hdGUiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgc2Vzc2lvbi5jbGVhckFubm90YXRpb25zKCk7CiAgICAgICAgfSk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHdvcmtlcjsKICAgIH07Cgp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsKCmV4cG9ydHMuTW9kZSA9IE1vZGU7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqICAgICAgTWloYWkgU3VjYW4gPG1paGFpIERPVCBzdWNhbiBBVCBnbWFpbCBET1QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9sYW5nJywgJ2FjZS91bmljb2RlJywgJ2FjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOwp2YXIgdW5pY29kZSA9IHJlcXVpcmUoIi4uL3VuaWNvZGUiKTsKdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIikuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzOwp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsKCnZhciBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsKCiAgICAvLyBzZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzCiAgICB2YXIgZ2xvYmFscyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgLy8gQ29uc3RydWN0b3JzCiAgICAgICAgKCJBcnJheXxCb29sZWFufERhdGV8RnVuY3Rpb258SXRlcmF0b3J8TnVtYmVyfE9iamVjdHxSZWdFeHB8U3RyaW5nfFByb3h5fCIgKwogICAgICAvLyBFNFgKICAgICAgICAgIk5hbWVzcGFjZXxRTmFtZXxYTUx8WE1MTGlzdHwiICsKICAgICAgICAgIkFycmF5QnVmZmVyfEZsb2F0MzJBcnJheXxGbG9hdDY0QXJyYXl8SW50MTZBcnJheXxJbnQzMkFycmF5fEludDhBcnJheXwiICsKICAgICAgICAgIlVpbnQxNkFycmF5fFVpbnQzMkFycmF5fFVpbnQ4QXJyYXl8VWludDhDbGFtcGVkQXJyYXl8IiArCiAgICAgIC8vIEVycm9ycwogICAgICAgICJFcnJvcnxFdmFsRXJyb3J8SW50ZXJuYWxFcnJvcnxSYW5nZUVycm9yfFJlZmVyZW5jZUVycm9yfFN0b3BJdGVyYXRpb258IiArCiAgICAgICAgIlN5bnRheEVycm9yfFR5cGVFcnJvcnxVUklFcnJvcnwiICsKICAgICAgLy8gIE5vbi1jb25zdHJ1Y3RvciBmdW5jdGlvbnMKICAgICAgICAiZGVjb2RlVVJJfGRlY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZW5jb2RlVVJJQ29tcG9uZW50fGV2YWx8aXNGaW5pdGV8IiArCiAgICAgICAgImlzTmFOfHBhcnNlRmxvYXR8cGFyc2VJbnR8IiArCiAgICAgIC8vIE90aGVyCiAgICAgICAgIkpTT058TWF0aHwiICsKICAgICAgLy8gUHNldWRvCiAgICAgICAgInRoaXN8YXJndW1lbnRzfHByb3RvdHlwZXx3aW5kb3d8ZG9jdW1lbnQiCiAgICAgICkuc3BsaXQoInwiKQogICAgKTsKCiAgICB2YXIga2V5d29yZHMgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCJicmVha3xjYXNlfGNhdGNofGNvbnRpbnVlfGRlZmF1bHR8ZGVsZXRlfGRvfGVsc2V8ZmluYWxseXxmb3J8ZnVuY3Rpb258IiArCiAgICAgICAgImlmfGlufGluc3RhbmNlb2Z8bmV3fHJldHVybnxzd2l0Y2h8dGhyb3d8dHJ5fHR5cGVvZnxsZXR8dmFyfHdoaWxlfHdpdGh8IiArCiAgICAgICAgImNvbnN0fHlpZWxkfGltcG9ydHxnZXR8c2V0Iikuc3BsaXQoInwiKQogICAgKTsKCiAgICAvLyBrZXl3b3JkcyB3aGljaCBjYW4gYmUgZm9sbG93ZWQgYnkgcmVndWxhciBleHByZXNzaW9ucwogICAgdmFyIGt3QmVmb3JlUmUgPSAiY2FzZXxkb3xlbHNlfGZpbmFsbHl8aW58aW5zdGFuY2VvZnxyZXR1cm58dGhyb3d8dHJ5fHR5cGVvZnx5aWVsZCI7CgogICAgdmFyIGRlcHJlY2F0ZWQgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCJfX3BhcmVudF9ffF9fY291bnRfX3xlc2NhcGV8dW5lc2NhcGV8d2l0aHxfX3Byb3RvX18iKS5zcGxpdCgifCIpCiAgICApOwoKICAgIHZhciBkZWZpbml0aW9ucyA9IGxhbmcuYXJyYXlUb01hcCgoImNvbnN0fGxldHx2YXJ8ZnVuY3Rpb24iKS5zcGxpdCgifCIpKTsKCiAgICB2YXIgYnVpbGRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoIm51bGx8SW5maW5pdHl8TmFOfHVuZGVmaW5lZCIpLnNwbGl0KCJ8IikKICAgICk7CgogICAgdmFyIGZ1dHVyZVJlc2VydmVkID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgiY2xhc3N8ZW51bXxleHRlbmRzfHN1cGVyfGV4cG9ydHxpbXBsZW1lbnRzfHByaXZhdGV8IiArCiAgICAgICAgInB1YmxpY3xpbnRlcmZhY2V8cGFja2FnZXxwcm90ZWN0ZWR8c3RhdGljIikuc3BsaXQoInwiKQogICAgKTsKCiAgICAvLyBUT0RPOiBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMKICAgIHZhciBpZGVudGlmaWVyUmUgPSAiWyIgKyB1bmljb2RlLnBhY2thZ2VzLkwgKyAiXFwkX11bIiAKICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTAogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5NbiArIHVuaWNvZGUucGFja2FnZXMuTWMKICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTmQKICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuUGMgKyAiXFwkX10qXFxiIjsKICAgICAgICAKICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcy4gVXNlICg/OikgaW5zdGVhZC4KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQKCiAgICB0aGlzLiRydWxlcyA9IHsKICAgICAgICAic3RhcnQiIDogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcLy4qJCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0IiksCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJwogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydAogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdLipcXFxcJCcsCiAgICAgICAgICAgICAgICBuZXh0IDogInFxc3RyaW5nIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXS4qXFxcXCQiLAogICAgICAgICAgICAgICAgbmV4dCA6ICJxc3RyaW5nIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaGV4CiAgICAgICAgICAgICAgICByZWdleCA6ICIwW3hYXVswLTlhLWZBLUZdK1xcYiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGZsb2F0CiAgICAgICAgICAgICAgICByZWdleCA6ICJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiBbImtleXdvcmQuZGVmaW5pdGlvbiIsICJ0ZXh0IiwgImVudGl0eS5uYW1lLmZ1bmN0aW9uIl0sCiAgICAgICAgICAgICAgICByZWdleCA6ICIoZnVuY3Rpb24pKFxccyspKCIgKyBpZGVudGlmaWVyUmUgKyAiKSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiIsCiAgICAgICAgICAgICAgICByZWdleCA6ICIoPzp0cnVlfGZhbHNlKVxcYiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICIoPzoiICsga3dCZWZvcmVSZSArICIpXFxiIiwKICAgICAgICAgICAgICAgIG5leHQgOiAicmVnZXhfYWxsb3dlZCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWxzLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS5sYW5ndWFnZSI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVwcmVjYXRlZC5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZWZpbml0aW9ucy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAia2V5d29yZC5kZWZpbml0aW9uIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYnVpbGRpbkNvbnN0YW50cy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZ1dHVyZVJlc2VydmVkLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkLmlsbGVnYWwiOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09ICJkZWJ1Z2dlciIpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcmVnZXggOiBpZGVudGlmaWVyUmUKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsCiAgICAgICAgICAgICAgICByZWdleCA6ICIhfFxcJHwlfCZ8XFwqfFxcLVxcLXxcXC18XFwrXFwrfFxcK3x+fD09PXw9PXw9fCE9fCE9PXw8PXw+PXw8PD18Pj49fD4+Pj18PD58PHw+fCF8JiZ8XFx8XFx8fFxcP1xcOnxcXCo9fCU9fFxcKz18XFwtPXwmPXxcXF49fFxcYig/OmlufGluc3RhbmNlb2Z8bmV3fGRlbGV0ZXx0eXBlb2Z8dm9pZCkiLAogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAicHVuY3R1YXRpb24ub3BlcmF0b3IiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFw/fFxcOnxcXCx8XFw7fFxcLiIsCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5scGFyZW4iLAogICAgICAgICAgICAgICAgcmVnZXggOiAiW1soe10iLAogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIltcXF0pfV0iCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvPT8iLAogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW46ICJjb21tZW50IiwKICAgICAgICAgICAgICAgIHJlZ2V4OiAiXiMhLiokIiAKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIgogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAvLyByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBvbmx5IGFsbG93ZWQgYWZ0ZXIgY2VydGFpbiB0b2tlbnMuIFRoaXMKICAgICAgICAvLyBtYWtlcyBzdXJlIHdlIGRvbid0IG1peCB1cCByZWdleHBzIHdpdGggdGhlIGRpdmlzb24gb3BlcmF0b3IKICAgICAgICAicmVnZXhfYWxsb3dlZCI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudAogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwKICAgICAgICAgICAgICAgIG5leHQgOiAiY29tbWVudF9yZWdleF9hbGxvd2VkIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcLy4qJCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwIiwKICAgICAgICAgICAgICAgIHJlZ2V4OiAiXFwvIiwKICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleCIsCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5IHJldHVybiB0byB0aGUgc3RhcnQgbW9kZSB3aXRob3V0IG1hdGNoaW5nCiAgICAgICAgICAgICAgICAvLyBhbnl0aGluZwogICAgICAgICAgICAgICAgdG9rZW46ICJlbXB0eSIsIAogICAgICAgICAgICAgICAgcmVnZXg6ICIiLAogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0IgogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAicmVnZXgiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuOiAicmVnZXhwLmtleXdvcmQub3BlcmF0b3IiLAogICAgICAgICAgICAgICAgcmVnZXg6ICJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXgiCiAgICAgICAgICAgIH0sIHsKCQkJCS8vIGZsYWcKICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cCIsIAogICAgICAgICAgICAgICAgcmVnZXg6ICIvXFx3KiIsCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiLAogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUgCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cCIsCiAgICAgICAgICAgICAgICByZWdleDogIlteXFxcXC9cXFtdKyIsCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXgiLAogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyIsCiAgICAgICAgICAgICAgICByZWdleDogIlxcWyIsCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIiwKICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCAKICAgICAgICAgICAgICAgIHJlZ2V4OiAiIiwKICAgICAgICAgICAgICAgIG5leHQ6ICJzdGFydCIgCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuOiAicmVnZXhwLmtleXdvcmQub3BlcmF0b3IiLAogICAgICAgICAgICAgICAgcmVnZXg6ICJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwKICAgICAgICAgICAgICAgIHJlZ2V4OiAiXSIsCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXgiLAogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyIsCiAgICAgICAgICAgICAgICByZWdleDogIlteXFxcXFxcXV0rIiwKICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiLAogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW46ICJlbXB0eSIsIAogICAgICAgICAgICAgICAgcmVnZXg6ICIiLAogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0IiAKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgImNvbW1lbnRfcmVnZXhfYWxsb3dlZCIgOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQKICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICBuZXh0IDogInJlZ2V4X2FsbG93ZWQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIgogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiY29tbWVudCIgOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQKICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyIKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInFxc3RyaW5nIiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogJyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJywKICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKycKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInFzdHJpbmciIDogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqPyciLAogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJwogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfTsKICAgIAogICAgdGhpcy5lbWJlZFJ1bGVzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgImRvYy0iLAogICAgICAgIFsgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldEVuZFJ1bGUoInN0YXJ0IikgXSk7Cn07Cgpvb3AuaW5oZXJpdHMoSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOwoKZXhwb3J0cy5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXM7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOwoKdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuJHJ1bGVzID0gewogICAgICAgICJzdGFydCIgOiBbIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MudGFnIiwKICAgICAgICAgICAgcmVnZXggOiAiQFtcXHdcXGRfXSsiIC8vIFRPRE86IGZpeCBlbWFpbCBhZGRyZXNzZXMKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICJcXHMrIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlRPRE8iCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiW15AXFwqXSsiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiLiIKICAgICAgICB9XQogICAgfTsKfTsKCm9vcC5pbmhlcml0cyhEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5nZXRTdGFydFJ1bGUgPSBmdW5jdGlvbihzdGFydCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gZG9jIGNvbW1lbnQKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICJcXC9cXCooPz1cXCopIiwKICAgICAgICAgICAgbmV4dCAgOiBzdGFydAogICAgICAgIH07CiAgICB9OwogICAgCiAgICB0aGlzLmdldEVuZFJ1bGUgPSBmdW5jdGlvbiAoc3RhcnQpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsIC8vIGNsb3NpbmcgY29tbWVudAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlxcKlxcLyIsCiAgICAgICAgICAgIG5leHQgIDogc3RhcnQKICAgICAgICB9OwogICAgfTsKCn0pLmNhbGwoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLnByb3RvdHlwZSk7CgpleHBvcnRzLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsKCn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsKCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IGZ1bmN0aW9uKCkge307CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihsaW5lLCBpbnB1dCkgewogICAgICAgIGlmICghIC9eXHMrJC8udGVzdChsaW5lKSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgICByZXR1cm4gL15ccypcfS8udGVzdChpbnB1dCk7CiAgICB9OwoKICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihkb2MsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocm93KTsKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKlx9KS8pOwoKICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDsKCiAgICAgICAgdmFyIGNvbHVtbiA9IG1hdGNoWzFdLmxlbmd0aDsKICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gZG9jLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn0pOwoKICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcyB8fCBvcGVuQnJhY2VQb3Mucm93ID09IHJvdykgcmV0dXJuIDA7CgogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOwogICAgICAgIGRvYy5yZXBsYWNlKG5ldyBSYW5nZShyb3csIDAsIHJvdywgY29sdW1uLTEpLCBpbmRlbnQpOwogICAgfTsKCiAgICB0aGlzLiRnZXRJbmRlbnQgPSBmdW5jdGlvbihsaW5lKSB7CiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAiIjsKICAgIH07Cgp9KS5jYWxsKE1hdGNoaW5nQnJhY2VPdXRkZW50LnByb3RvdHlwZSk7CgpleHBvcnRzLk1hdGNoaW5nQnJhY2VPdXRkZW50ID0gTWF0Y2hpbmdCcmFjZU91dGRlbnQ7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS93b3JrZXIvd29ya2VyX2NsaWVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9ldmVudF9lbWl0dGVyJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXI7Cgp2YXIgV29ya2VyQ2xpZW50ID0gZnVuY3Rpb24odG9wTGV2ZWxOYW1lc3BhY2VzLCBwYWNrYWdlZEpzLCBtb2QsIGNsYXNzbmFtZSkgewoKICAgIHRoaXMuY2hhbmdlTGlzdGVuZXIgPSB0aGlzLmNoYW5nZUxpc3RlbmVyLmJpbmQodGhpcyk7CgogICAgaWYgKG1vZHVsZS5wYWNrYWdlZCkgewogICAgICAgIHZhciBiYXNlID0gdGhpcy4kZ3Vlc3NCYXNlUGF0aCgpOwogICAgICAgIHRoaXMuJHdvcmtlciA9IG5ldyBXb3JrZXIoYmFzZSArIHBhY2thZ2VkSnMpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgdmFyIHdvcmtlclVybCA9IHRoaXMuJG5vcm1hbGl6ZVBhdGgocmVxdWlyZS5uYW1lVG9VcmwoImFjZS93b3JrZXIvd29ya2VyIiwgbnVsbCwgIl8iKSk7CiAgICAgICAgdGhpcy4kd29ya2VyID0gbmV3IFdvcmtlcih3b3JrZXJVcmwpOwoKICAgICAgICB2YXIgdGxucyA9IHt9OwogICAgICAgIGZvciAodmFyIGk9MDsgaTx0b3BMZXZlbE5hbWVzcGFjZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIG5zID0gdG9wTGV2ZWxOYW1lc3BhY2VzW2ldOwogICAgICAgICAgICB2YXIgcGF0aCA9IHRoaXMuJG5vcm1hbGl6ZVBhdGgocmVxdWlyZS5uYW1lVG9VcmwobnMsIG51bGwsICJfIikucmVwbGFjZSgvLmpzJC8sICIiKSk7CgogICAgICAgICAgICB0bG5zW25zXSA9IHBhdGg7CiAgICAgICAgfQogICAgfQoKICAgIHRoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7CiAgICAgICAgaW5pdCA6IHRydWUsCiAgICAgICAgdGxuczogdGxucywKICAgICAgICBtb2R1bGU6IG1vZCwKICAgICAgICBjbGFzc25hbWU6IGNsYXNzbmFtZQogICAgfSk7CgogICAgdGhpcy5jYWxsYmFja0lkID0gMTsKICAgIHRoaXMuY2FsbGJhY2tzID0ge307CgogICAgdmFyIF9zZWxmID0gdGhpczsKICAgIHRoaXMuJHdvcmtlci5vbmVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgIHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUubG9nICYmIGNvbnNvbGUubG9nKGUpOwogICAgICAgIHRocm93IGU7CiAgICB9OwogICAgdGhpcy4kd29ya2VyLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICB2YXIgbXNnID0gZS5kYXRhOwogICAgICAgIHN3aXRjaChtc2cudHlwZSkgewogICAgICAgICAgICBjYXNlICJsb2ciOgogICAgICAgICAgICAgICAgd2luZG93LmNvbnNvbGUgJiYgY29uc29sZS5sb2cgJiYgY29uc29sZS5sb2cobXNnLmRhdGEpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICJldmVudCI6CiAgICAgICAgICAgICAgICBfc2VsZi5fZW1pdChtc2cubmFtZSwge2RhdGE6IG1zZy5kYXRhfSk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgImNhbGwiOgogICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gX3NlbGYuY2FsbGJhY2tzW21zZy5pZF07CiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhtc2cuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIF9zZWxmLmNhbGxiYWNrc1ttc2cuaWRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfTsKfTsKCihmdW5jdGlvbigpewoKICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsKCiAgICB0aGlzLiRub3JtYWxpemVQYXRoID0gZnVuY3Rpb24ocGF0aCkgewogICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL15bYS16XSs6XC9cL1teXC9dK1wvLywgIiIpOyAvLyBSZW1vdmUgZG9tYWluIG5hbWUgYW5kIHJlYnVpbGQgaXQKICAgICAgICBwYXRoID0gbG9jYXRpb24ucHJvdG9jb2wgKyAiLy8iICsgbG9jYXRpb24uaG9zdAogICAgICAgICAgICAvLyBwYXRocyBzdGFydGluZyB3aXRoIGEgc2xhc2ggYXJlIHJlbGF0aXZlIHRvIHRoZSByb290IChob3N0KQogICAgICAgICAgICArIChwYXRoLmNoYXJBdCgwKSA9PSAiLyIgPyAiIiA6IGxvY2F0aW9uLnBhdGhuYW1lLnJlcGxhY2UoL1wvW15cL10qJC8sICIiKSkKICAgICAgICAgICAgKyAiLyIgKyBwYXRoLnJlcGxhY2UoL15bXC9dKy8sICIiKTsKICAgICAgICByZXR1cm4gcGF0aDsKICAgIH07CgogICAgdGhpcy4kZ3Vlc3NCYXNlUGF0aCA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmIChyZXF1aXJlLmFjZUJhc2VVcmwpCiAgICAgICAgICAgIHJldHVybiByZXF1aXJlLmFjZUJhc2VVcmw7CgogICAgICAgIHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpOwogICAgICAgIGZvciAodmFyIGk9MDsgaTxzY3JpcHRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBzY3JpcHQgPSBzY3JpcHRzW2ldOwoKICAgICAgICAgICAgdmFyIGJhc2UgPSBzY3JpcHQuZ2V0QXR0cmlidXRlKCJkYXRhLWFjZS1iYXNlIik7CiAgICAgICAgICAgIGlmIChiYXNlKQogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UucmVwbGFjZSgvXC8qJC8sICIvIik7CgogICAgICAgICAgICB2YXIgc3JjID0gc2NyaXB0LnNyYyB8fCBzY3JpcHQuZ2V0QXR0cmlidXRlKCJzcmMiKTsKICAgICAgICAgICAgaWYgKCFzcmMpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBtID0gc3JjLm1hdGNoKC9eKD86KC4qXC8pYWNlXC5qc3woLipcLylhY2UoLXVuY29tcHJlc3NlZCk/KC1ub2NvbmZsaWN0KT9cLmpzKSg/Olw/fCQpLyk7CiAgICAgICAgICAgIGlmIChtKQogICAgICAgICAgICAgICAgcmV0dXJuIG1bMV0gfHwgbVsyXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICIiOwogICAgfTsKCiAgICB0aGlzLnRlcm1pbmF0ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2VtaXQoInRlcm1pbmF0ZSIsIHt9KTsKICAgICAgICB0aGlzLiR3b3JrZXIudGVybWluYXRlKCk7CiAgICAgICAgdGhpcy4kd29ya2VyID0gbnVsbDsKICAgICAgICB0aGlzLiRkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7CiAgICAgICAgdGhpcy4kZG9jID0gbnVsbDsKICAgIH07CgogICAgdGhpcy5zZW5kID0gZnVuY3Rpb24oY21kLCBhcmdzKSB7CiAgICAgICAgdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtjb21tYW5kOiBjbWQsIGFyZ3M6IGFyZ3N9KTsKICAgIH07CgogICAgdGhpcy5jYWxsID0gZnVuY3Rpb24oY21kLCBhcmdzLCBjYWxsYmFjaykgewogICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgaWQgPSB0aGlzLmNhbGxiYWNrSWQrKzsKICAgICAgICAgICAgdGhpcy5jYWxsYmFja3NbaWRdID0gY2FsbGJhY2s7CiAgICAgICAgICAgIGFyZ3MucHVzaChpZCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuc2VuZChjbWQsIGFyZ3MpOwogICAgfTsKCiAgICB0aGlzLmVtaXQgPSBmdW5jdGlvbihldmVudCwgZGF0YSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIC8vIGZpcmVmb3ggcmVmdXNlcyB0byBjbG9uZSBvYmplY3RzIHdoaWNoIGhhdmUgZnVuY3Rpb24gcHJvcGVydGllcwogICAgICAgICAgICAvLyBUT0RPOiBjbGVhbnVwIGV2ZW50CiAgICAgICAgICAgIHRoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7ZXZlbnQ6IGV2ZW50LCBkYXRhOiB7ZGF0YTogZGF0YS5kYXRhfX0pOwogICAgICAgIH0KICAgICAgICBjYXRjaChleCkge30KICAgIH07CgogICAgdGhpcy5hdHRhY2hUb0RvY3VtZW50ID0gZnVuY3Rpb24oZG9jKSB7CiAgICAgICAgaWYodGhpcy4kZG9jKQogICAgICAgICAgICB0aGlzLnRlcm1pbmF0ZSgpOwoKICAgICAgICB0aGlzLiRkb2MgPSBkb2M7CiAgICAgICAgdGhpcy5jYWxsKCJzZXRWYWx1ZSIsIFtkb2MuZ2V0VmFsdWUoKV0pOwogICAgICAgIGRvYy5vbigiY2hhbmdlIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7CiAgICB9OwoKICAgIHRoaXMuY2hhbmdlTGlzdGVuZXIgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgZS5yYW5nZSA9IHsKICAgICAgICAgICAgc3RhcnQ6IGUuZGF0YS5yYW5nZS5zdGFydCwKICAgICAgICAgICAgZW5kOiBlLmRhdGEucmFuZ2UuZW5kCiAgICAgICAgfTsKICAgICAgICB0aGlzLmVtaXQoImNoYW5nZSIsIGUpOwogICAgfTsKCn0pLmNhbGwoV29ya2VyQ2xpZW50LnByb3RvdHlwZSk7CgpleHBvcnRzLldvcmtlckNsaWVudCA9IFdvcmtlckNsaWVudDsKCn0pOwovKiB2aW06dHM9NDpzdHM9NDpzdz00OgogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIENocmlzIFNwZW5jZXIgPGNocmlzLmFnLnNwZW5jZXIgQVQgZ29vZ2xlbWFpbCBET1QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9iZWhhdmlvdXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7CnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCcuLi9iZWhhdmlvdXInKS5CZWhhdmlvdXI7Cgp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gZnVuY3Rpb24gKCkgewoKICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgewogICAgICAgIGlmICh0ZXh0ID09ICd7JykgewogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7CiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7JyArIHNlbGVjdGVkICsgJ30nLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3t9JywKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICd9JykgewogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsKICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsKICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsKICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnfScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsKICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAiXG4iKSB7CiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9JykgewogICAgICAgICAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IHNlc3Npb24uZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiBjdXJzb3Iucm93LCBjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxfSk7CiAgICAgICAgICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcykKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CgogICAgICAgICAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQoc3RhdGUsIGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUubGVuZ3RoIC0gMSksIHNlc3Npb24uZ2V0VGFiU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgdmFyIG5leHRfaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOwoKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xuJyArIGluZGVudCArICdcbicgKyBuZXh0X2luZGVudCwKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCBpbmRlbnQubGVuZ3RoLCAxLCBpbmRlbnQubGVuZ3RoXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoImJyYWNlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7CiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsKICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJ3snKSB7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2UuZW5kLmNvbHVtbiwgcmFuZ2UuZW5kLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9JykgewogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOwogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoInBhcmVucyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7CiAgICAgICAgaWYgKHRleHQgPT0gJygnKSB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7CiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygnICsgc2VsZWN0ZWQgKyAnKScsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCknLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJyknKSB7CiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgewogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCcpJywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOwogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoInBhcmVucyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7CiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsKICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJygnKSB7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgewogICAgICAgIGlmICh0ZXh0ID09ICciJykgewogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7CiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICciJyArIHNlbGVjdGVkICsgJyInLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsKICAgICAgICAgICAgICAgIHZhciBsZWZ0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4tMSwgY3Vyc29yLmNvbHVtbik7CgogICAgICAgICAgICAgICAgLy8gV2UncmUgZXNjYXBlZC4KICAgICAgICAgICAgICAgIGlmIChsZWZ0Q2hhciA9PSAnXFwnKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gRmluZCB3aGF0IHRva2VuIHdlJ3JlIGluc2lkZS4KICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzZXNzaW9uLmdldFRva2VucyhzZWxlY3Rpb24uc3RhcnQucm93LCBzZWxlY3Rpb24uc3RhcnQucm93KVswXS50b2tlbnM7CiAgICAgICAgICAgICAgICB2YXIgY29sID0gMCwgdG9rZW47CiAgICAgICAgICAgICAgICB2YXIgcXVvdGVwb3MgPSAtMTsgLy8gVHJhY2sgd2hldGhlciB3ZSdyZSBpbnNpZGUgYW4gb3BlbiBxdW90ZS4KCiAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRva2Vucy5sZW5ndGg7IHgrKykgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW3hdOwogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IC0xOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocXVvdGVwb3MgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IHRva2VuLnZhbHVlLmluZGV4T2YoJyInKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0b2tlbi52YWx1ZS5sZW5ndGggKyBjb2wpID4gc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbikgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29sICs9IHRva2Vuc1t4XS52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gVHJ5IGFuZCBiZSBzbWFydCBhYm91dCB3aGVuIHdlIGF1dG8gaW5zZXJ0LgogICAgICAgICAgICAgICAgaWYgKCF0b2tlbiB8fCAocXVvdGVwb3MgPCAwICYmIHRva2VuLnR5cGUgIT09ICJjb21tZW50IiAmJiAodG9rZW4udHlwZSAhPT0gInN0cmluZyIgfHwgKChzZWxlY3Rpb24uc3RhcnQuY29sdW1uICE9PSB0b2tlbi52YWx1ZS5sZW5ndGgrY29sLTEpICYmIHRva2VuLnZhbHVlLmxhc3RJbmRleE9mKCciJykgPT09IHRva2VuLnZhbHVlLmxlbmd0aC0xKSkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJyIiJywKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwxXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gJiYgdG9rZW4udHlwZSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaW5wdXQgYW5kIG1vdmUgcmlnaHQgb25lIGlmIHdlJ3JlIHR5cGluZyBvdmVyIHRoZSBjbG9zaW5nIHF1b3RlLgogICAgICAgICAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7CiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsKICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJyInKSB7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCn0Kb29wLmluaGVyaXRzKENzdHlsZUJlaGF2aW91ciwgQmVoYXZpb3VyKTsKCmV4cG9ydHMuQ3N0eWxlQmVoYXZpb3VyID0gQ3N0eWxlQmVoYXZpb3VyOwp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7CnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7CnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOwoKdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307Cm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IC8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvOwogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IC9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLzsKICAgIAogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXg7CgogICAgICAgICAgICBpZiAobWF0Y2hbMV0pCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKHNlc3Npb24sIG1hdGNoWzFdLCByb3csIGkpOwoKICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSArIG1hdGNoWzBdLmxlbmd0aCk7CiAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsKICAgICAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGZvbGRTdHlsZSAhPT0gIm1hcmtiZWdpbmVuZCIpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDsKCiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkgewogICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSk7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiByb3csIGNvbHVtbjogaX07CiAgICAgICAgICAgIHZhciBzdGFydCA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldChtYXRjaFsxXSwgZW5kKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICghc3RhcnQpCiAgICAgICAgICAgICAgICByZXR1cm47CgogICAgICAgICAgICBzdGFydC5jb2x1bW4rKzsKICAgICAgICAgICAgZW5kLmNvbHVtbi0tOwoKICAgICAgICAgICAgcmV0dXJuICBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOwogICAgICAgIH0KICAgIH07CiAgICAKfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOwoKfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOwoKdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSBudWxsOwogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7CgogICAgLy8gbXVzdCByZXR1cm4gIiIgaWYgdGhlcmUncyBubyBmb2xkLCB0byBlbmFibGUgY2FjaGluZwogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsKICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOwogICAgICAgIGlmICh0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGxpbmUpKQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsKICAgICAgICBpZiAoZm9sZFN0eWxlID09ICJtYXJrYmVnaW5lbmQiCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpCiAgICAgICAgICAgIHJldHVybiAiZW5kIjsKICAgICAgICByZXR1cm4gIiI7CiAgICB9OwogICAgCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7CiAgICAgICAgdmFyIHJlID0gL15ccyovOwogICAgICAgIHZhciBzdGFydFJvdyA9IHJvdzsKICAgICAgICB2YXIgZW5kUm93ID0gcm93OwogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgdmFyIHN0YXJ0Q29sdW1uID0gY29sdW1uIHx8IGxpbmUubGVuZ3RoOwogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOwogICAgICAgIHZhciBtYXhSb3cgPSBzZXNzaW9uLmdldExlbmd0aCgpCiAgICAgICAgCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7CiAgICAgICAgICAgIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICAgICAgdmFyIGxldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOwoKICAgICAgICAgICAgaWYgKGxldmVsID09IGxpbmUubGVuZ3RoKQogICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICBpZiAobGV2ZWwgPD0gc3RhcnRMZXZlbCkKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgZW5kUm93ID0gcm93OwogICAgICAgIH0KCiAgICAgICAgaWYgKGVuZFJvdyA+IHN0YXJ0Um93KSB7CiAgICAgICAgICAgIHZhciBlbmRDb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kUm93KS5sZW5ndGg7CiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7CiAgICAgICAgfQogICAgfTsKCiAgICB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCBicmFja2V0LCByb3csIGNvbHVtbikgewogICAgICAgIHZhciBzdGFydCA9IHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW4gKyAxfTsKICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsKICAgICAgICBpZiAoIWVuZCkKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICB2YXIgZncgPSBzZXNzaW9uLmZvbGRXaWRnZXRzW2VuZC5yb3ddOwogICAgICAgIGlmIChmdyA9PSBudWxsKQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsKCiAgICAgICAgaWYgKGZ3ID09ICJzdGFydCIpIHsKICAgICAgICAgICAgZW5kLnJvdyAtLTsKICAgICAgICAgICAgZW5kLmNvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmQucm93KS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOwogICAgfTsKCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsKCn0pOwpkZWZpbmUoJ2FjZS9tb2RlL2phdmFfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7CnZhciBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIpLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsKdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7Cgp2YXIgSmF2YUhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7CgogICAgLy8gdGFrZW4gZnJvbSBodHRwOi8vZG93bmxvYWQub3JhY2xlLmNvbS9qYXZhc2UvdHV0b3JpYWwvamF2YS9udXRzYW5kYm9sdHMvX2tleXdvcmRzLmh0bWwKICAgIHZhciBrZXl3b3JkcyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICgiYWJzdHJhY3R8Y29udGludWV8Zm9yfG5ld3xzd2l0Y2h8IiArCiAgICAiYXNzZXJ0fGRlZmF1bHR8Z290b3xwYWNrYWdlfHN5bmNocm9uaXplZHwiICsKICAgICJib29sZWFufGRvfGlmfHByaXZhdGV8dGhpc3wiICsKICAgICJicmVha3xkb3VibGV8aW1wbGVtZW50c3xwcm90ZWN0ZWR8dGhyb3d8IiArCiAgICAiYnl0ZXxlbHNlfGltcG9ydHxwdWJsaWN8dGhyb3dzfCIgKwogICAgImNhc2V8ZW51bXxpbnN0YW5jZW9mfHJldHVybnx0cmFuc2llbnR8IiArCiAgICAiY2F0Y2h8ZXh0ZW5kc3xpbnR8c2hvcnR8dHJ5fCIgKwogICAgImNoYXJ8ZmluYWx8aW50ZXJmYWNlfHN0YXRpY3x2b2lkfCIgKwogICAgImNsYXNzfGZpbmFsbHl8bG9uZ3xzdHJpY3RmcHx2b2xhdGlsZXwiICsKICAgICJjb25zdHxmbG9hdHxuYXRpdmV8c3VwZXJ8d2hpbGUiKS5zcGxpdCgifCIpCiAgICApOwoKICAgIHZhciBidWlsZGluQ29uc3RhbnRzID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgibnVsbHxJbmZpbml0eXxOYU58dW5kZWZpbmVkIikuc3BsaXQoInwiKQogICAgKTsKCiAgICB2YXIgbGFuZ0NsYXNzZXMgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCJBYnN0cmFjdE1ldGhvZEVycm9yfEFzc2VydGlvbkVycm9yfENsYXNzQ2lyY3VsYXJpdHlFcnJvcnwiKwogICAgICAgICJDbGFzc0Zvcm1hdEVycm9yfERlcHJlY2F0ZWR8RW51bUNvbnN0YW50Tm90UHJlc2VudEV4Y2VwdGlvbnwiKwogICAgICAgICJFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3J8SWxsZWdhbEFjY2Vzc0Vycm9yfCIrCiAgICAgICAgIklsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvbnxJbnN0YW50aWF0aW9uRXJyb3J8SW50ZXJuYWxFcnJvcnwiKwogICAgICAgICJOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbnxOb1N1Y2hGaWVsZEVycm9yfE92ZXJyaWRlfFByb2Nlc3N8IisKICAgICAgICAiUHJvY2Vzc0J1aWxkZXJ8U2VjdXJpdHlNYW5hZ2VyfFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb258IisKICAgICAgICAiU3VwcHJlc3NXYXJuaW5nc3xUeXBlTm90UHJlc2VudEV4Y2VwdGlvbnxVbmtub3duRXJyb3J8IisKICAgICAgICAiVW5zYXRpc2ZpZWRMaW5rRXJyb3J8VW5zdXBwb3J0ZWRDbGFzc1ZlcnNpb25FcnJvcnxWZXJpZnlFcnJvcnwiKwogICAgICAgICJJbnN0YW50aWF0aW9uRXhjZXB0aW9ufEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb258IisKICAgICAgICAiQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9ufENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9ufCIrCiAgICAgICAgIk5vU3VjaEZpZWxkRXhjZXB0aW9ufElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbnxOdW1iZXJGb3JtYXRFeGNlcHRpb258IisKICAgICAgICAiU2VjdXJpdHlFeGNlcHRpb258Vm9pZHxJbmhlcml0YWJsZVRocmVhZExvY2FsfElsbGVnYWxTdGF0ZUV4Y2VwdGlvbnwiKwogICAgICAgICJJbnRlcnJ1cHRlZEV4Y2VwdGlvbnxOb1N1Y2hNZXRob2RFeGNlcHRpb258SWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbnwiKwogICAgICAgICJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbnxFbnVtfFN0cmljdE1hdGh8UGFja2FnZXxDb21waWxlcnwiKwogICAgICAgICJSZWFkYWJsZXxSdW50aW1lfFN0cmluZ0J1aWxkZXJ8TWF0aHxJbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yfCIrCiAgICAgICAgIk5vU3VjaE1ldGhvZEVycm9yfFRocmVhZExvY2FsfFJ1bnRpbWVQZXJtaXNzaW9ufEFyaXRobWV0aWNFeGNlcHRpb258IisKICAgICAgICAiTnVsbFBvaW50ZXJFeGNlcHRpb258TG9uZ3xJbnRlZ2VyfFNob3J0fEJ5dGV8RG91YmxlfE51bWJlcnxGbG9hdHwiKwogICAgICAgICJDaGFyYWN0ZXJ8Qm9vbGVhbnxTdGFja1RyYWNlRWxlbWVudHxBcHBlbmRhYmxlfFN0cmluZ0J1ZmZlcnwiKwogICAgICAgICJJdGVyYWJsZXxUaHJlYWRHcm91cHxSdW5uYWJsZXxUaHJlYWR8SWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbnwiKwogICAgICAgICJTdGFja092ZXJmbG93RXJyb3J8T3V0T2ZNZW1vcnlFcnJvcnxWaXJ0dWFsTWFjaGluZUVycm9yfCIrCiAgICAgICAgIkFycmF5U3RvcmVFeGNlcHRpb258Q2xhc3NDYXN0RXhjZXB0aW9ufExpbmthZ2VFcnJvcnwiKwogICAgICAgICJOb0NsYXNzRGVmRm91bmRFcnJvcnxDbGFzc05vdEZvdW5kRXhjZXB0aW9ufFJ1bnRpbWVFeGNlcHRpb258IisKICAgICAgICAiRXhjZXB0aW9ufFRocmVhZERlYXRofEVycm9yfFRocm93YWJsZXxTeXN0ZW18Q2xhc3NMb2FkZXJ8IisKICAgICAgICAiQ2xvbmVhYmxlfENsYXNzfENoYXJTZXF1ZW5jZXxDb21wYXJhYmxlfFN0cmluZ3xPYmplY3QiKS5zcGxpdCgifCIpCiAgICApOwogICAgCiAgICB2YXIgaW1wb3J0Q2xhc3NlcyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoIiIpLnNwbGl0KCJ8IikKICAgICk7CiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMuIFVzZSAoPzopIGluc3RlYWQuCiAgICAvLyByZWdleHBzIGFyZSBvcmRlcmVkIC0+IHRoZSBmaXJzdCBtYXRjaCBpcyB1c2VkCgogICAgdGhpcy4kcnVsZXMgPSB7CiAgICAgICAgInN0YXJ0IiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXC8uKiQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50CiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLAogICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmcucmVnZXhwIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsvXSg/Oig/OlxcWyg/OlxcXFxdfFteXFxdXSkrXFxdKXwoPzpcXFxcL3xbXlxcXS9dKSkqWy9dXFx3KlxccyooPz1bKS4sO118JCkiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJwogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleAogICAgICAgICAgICAgICAgcmVnZXggOiAiMFt4WF1bMC05YS1mQS1GXStcXGIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdAogICAgICAgICAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLAogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86dHJ1ZXxmYWxzZSlcXGIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gInRoaXMiKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInZhcmlhYmxlLmxhbmd1YWdlIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobGFuZ0NsYXNzZXMuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuZnVuY3Rpb24iOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGltcG9ydENsYXNzZXMuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuZnVuY3Rpb24iOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWxkaW5Db25zdGFudHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImNvbnN0YW50Lmxhbmd1YWdlIjsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgLy8gVE9ETzogVW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBVbmljb2RlIGlkZW50aWZpZXJzCiAgICAgICAgICAgICAgICByZWdleCA6ICJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJscGFyZW4iLAogICAgICAgICAgICAgICAgcmVnZXggOiAiW1soe10iCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInJwYXJlbiIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJjb21tZW50IiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudAogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwKICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfTsKICAgIAogICAgdGhpcy5lbWJlZFJ1bGVzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgImRvYy0iLAogICAgICAgIFsgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldEVuZFJ1bGUoInN0YXJ0IikgXSk7Cn07Cgpvb3AuaW5oZXJpdHMoSmF2YUhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOwoKZXhwb3J0cy5KYXZhSGlnaGxpZ2h0UnVsZXMgPSBKYXZhSGlnaGxpZ2h0UnVsZXM7Cn0pOwo7CiAgICAgICAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAg]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-java.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9qYXZhIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9qYXZhc2NyaXB0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL2phdmFfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL2phdmFzY3JpcHQiKS5Nb2RlLGY9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGc9YSgiLi9qYXZhX2hpZ2hsaWdodF9ydWxlcyIpLkphdmFIaWdobGlnaHRSdWxlcyxoPWZ1bmN0aW9uKCl7ZS5jYWxsKHRoaXMpLHRoaXMuJHRva2VuaXplcj1uZXcgZigobmV3IGcpLmdldFJ1bGVzKCkpfTtkLmluaGVyaXRzKGgsZSksZnVuY3Rpb24oKXt0aGlzLmNyZWF0ZVdvcmtlcj1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbH19LmNhbGwoaC5wcm90b3R5cGUpLGIuTW9kZT1ofSksZGVmaW5lKCJhY2UvbW9kZS9qYXZhc2NyaXB0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsImFjZS9yYW5nZSIsImFjZS93b3JrZXIvd29ya2VyX2NsaWVudCIsImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiKS5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMsaD1hKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudCxpPWEoIi4uL3JhbmdlIikuUmFuZ2Usaj1hKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudCxrPWEoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cixsPWEoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZSxtPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSksdGhpcy4kb3V0ZGVudD1uZXcgaCx0aGlzLiRiZWhhdmlvdXI9bmV3IGssdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGx9O2QuaW5oZXJpdHMobSxlKSxmdW5jdGlvbigpe3RoaXMudG9nZ2xlQ29tbWVudExpbmVzPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSEwLGY9L14oXHMqKVwvXC8vO2Zvcih2YXIgZz1jO2c8PWQ7ZysrKWlmKCFmLnRlc3QoYi5nZXRMaW5lKGcpKSl7ZT0hMTticmVha31pZihlKXt2YXIgaD1uZXcgaSgwLDAsMCwwKTtmb3IodmFyIGc9YztnPD1kO2crKyl7dmFyIGo9Yi5nZXRMaW5lKGcpLGs9ai5tYXRjaChmKTtoLnN0YXJ0LnJvdz1nLGguZW5kLnJvdz1nLGguZW5kLmNvbHVtbj1rWzBdLmxlbmd0aCxiLnJlcGxhY2UoaCxrWzFdKX19ZWxzZSBiLmluZGVudFJvd3MoYyxkLCIvLyIpfSx0aGlzLmdldE5leHRMaW5lSW5kZW50PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLiRnZXRJbmRlbnQoYiksZT10aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhiLGEpLGY9ZS50b2tlbnMsZz1lLnN0YXRlO2lmKGYubGVuZ3RoJiZmW2YubGVuZ3RoLTFdLnR5cGU9PSJjb21tZW50IilyZXR1cm4gZDtpZihhPT0ic3RhcnQifHxhPT0icmVnZXhfYWxsb3dlZCIpe3ZhciBoPWIubWF0Y2goL14uKig/OlxiY2FzZVxiLipcOnxbXHtcKFxbXSlccyokLyk7aCYmKGQrPWMpfWVsc2UgaWYoYT09ImRvYy1zdGFydCIpe2lmKGc9PSJzdGFydCJ8fGE9PSJyZWdleF9hbGxvd2VkIilyZXR1cm4iIjt2YXIgaD1iLm1hdGNoKC9eXHMqKFwvPylcKi8pO2gmJihoWzFdJiYoZCs9IiAiKSxkKz0iKiAiKX1yZXR1cm4gZH0sdGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChiLGMpfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGEsYixjKXt0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGIsYyl9LHRoaXMuY3JlYXRlV29ya2VyPWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBqKFsiYWNlIl0sIndvcmtlci1qYXZhc2NyaXB0LmpzIiwiYWNlL21vZGUvamF2YXNjcmlwdF93b3JrZXIiLCJKYXZhU2NyaXB0V29ya2VyIik7cmV0dXJuIGIuYXR0YWNoVG9Eb2N1bWVudChhLmdldERvY3VtZW50KCkpLGIub24oImpzbGludCIsZnVuY3Rpb24oYil7dmFyIGM9W107Zm9yKHZhciBkPTA7ZDxiLmRhdGEubGVuZ3RoO2QrKyl7dmFyIGU9Yi5kYXRhW2RdO2UmJmMucHVzaCh7cm93OmUubGluZS0xLGNvbHVtbjplLmNoYXJhY3Rlci0xLHRleHQ6ZS5yZWFzb24sdHlwZToid2FybmluZyIsbGludDplfSl9YS5zZXRBbm5vdGF0aW9ucyhjKX0pLGIub24oIm5hcmNpc3N1cyIsZnVuY3Rpb24oYil7YS5zZXRBbm5vdGF0aW9ucyhbYi5kYXRhXSl9KSxiLm9uKCJ0ZXJtaW5hdGUiLGZ1bmN0aW9uKCl7YS5jbGVhckFubm90YXRpb25zKCl9KSxifX0uY2FsbChtLnByb3RvdHlwZSksYi5Nb2RlPW19KSxkZWZpbmUoImFjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvdW5pY29kZSIsImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi4vdW5pY29kZSIpLGc9YSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsaD1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGk9ZnVuY3Rpb24oKXt2YXIgYT1lLmFycmF5VG9NYXAoIkFycmF5fEJvb2xlYW58RGF0ZXxGdW5jdGlvbnxJdGVyYXRvcnxOdW1iZXJ8T2JqZWN0fFJlZ0V4cHxTdHJpbmd8UHJveHl8TmFtZXNwYWNlfFFOYW1lfFhNTHxYTUxMaXN0fEFycmF5QnVmZmVyfEZsb2F0MzJBcnJheXxGbG9hdDY0QXJyYXl8SW50MTZBcnJheXxJbnQzMkFycmF5fEludDhBcnJheXxVaW50MTZBcnJheXxVaW50MzJBcnJheXxVaW50OEFycmF5fFVpbnQ4Q2xhbXBlZEFycmF5fEVycm9yfEV2YWxFcnJvcnxJbnRlcm5hbEVycm9yfFJhbmdlRXJyb3J8UmVmZXJlbmNlRXJyb3J8U3RvcEl0ZXJhdGlvbnxTeW50YXhFcnJvcnxUeXBlRXJyb3J8VVJJRXJyb3J8ZGVjb2RlVVJJfGRlY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZW5jb2RlVVJJQ29tcG9uZW50fGV2YWx8aXNGaW5pdGV8aXNOYU58cGFyc2VGbG9hdHxwYXJzZUludHxKU09OfE1hdGh8dGhpc3xhcmd1bWVudHN8cHJvdG90eXBlfHdpbmRvd3xkb2N1bWVudCIuc3BsaXQoInwiKSksYj1lLmFycmF5VG9NYXAoImJyZWFrfGNhc2V8Y2F0Y2h8Y29udGludWV8ZGVmYXVsdHxkZWxldGV8ZG98ZWxzZXxmaW5hbGx5fGZvcnxmdW5jdGlvbnxpZnxpbnxpbnN0YW5jZW9mfG5ld3xyZXR1cm58c3dpdGNofHRocm93fHRyeXx0eXBlb2Z8bGV0fHZhcnx3aGlsZXx3aXRofGNvbnN0fHlpZWxkfGltcG9ydHxnZXR8c2V0Ii5zcGxpdCgifCIpKSxjPSJjYXNlfGRvfGVsc2V8ZmluYWxseXxpbnxpbnN0YW5jZW9mfHJldHVybnx0aHJvd3x0cnl8dHlwZW9mfHlpZWxkIixkPWUuYXJyYXlUb01hcCgiX19wYXJlbnRfX3xfX2NvdW50X198ZXNjYXBlfHVuZXNjYXBlfHdpdGh8X19wcm90b19fIi5zcGxpdCgifCIpKSxoPWUuYXJyYXlUb01hcCgiY29uc3R8bGV0fHZhcnxmdW5jdGlvbiIuc3BsaXQoInwiKSksaT1lLmFycmF5VG9NYXAoIm51bGx8SW5maW5pdHl8TmFOfHVuZGVmaW5lZCIuc3BsaXQoInwiKSksaj1lLmFycmF5VG9NYXAoImNsYXNzfGVudW18ZXh0ZW5kc3xzdXBlcnxleHBvcnR8aW1wbGVtZW50c3xwcml2YXRlfHB1YmxpY3xpbnRlcmZhY2V8cGFja2FnZXxwcm90ZWN0ZWR8c3RhdGljIi5zcGxpdCgifCIpKSxrPSJbIitmLnBhY2thZ2VzLkwrIlxcJF9dWyIrZi5wYWNrYWdlcy5MK2YucGFja2FnZXMuTW4rZi5wYWNrYWdlcy5NYytmLnBhY2thZ2VzLk5kK2YucGFja2FnZXMuUGMrIlxcJF9dKlxcYiI7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJcXC9cXC8uKiQifSwobmV3IGcpLmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0Iikse3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwvXFwqIixuZXh0OiJjb21tZW50In0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OidbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJ30se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OidbIl0uKlxcXFwkJyxuZXh0OiJxcXN0cmluZyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiWyddLipcXFxcJCIsbmV4dDoicXN0cmluZyJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IjBbeFhdWzAtOWEtZkEtRl0rXFxiIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIifSx7dG9rZW46WyJrZXl3b3JkLmRlZmluaXRpb24iLCJ0ZXh0IiwiZW50aXR5Lm5hbWUuZnVuY3Rpb24iXSxyZWdleDoiKGZ1bmN0aW9uKShcXHMrKSgiK2srIikifSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLHJlZ2V4OiIoPzp0cnVlfGZhbHNlKVxcYiJ9LHt0b2tlbjoia2V5d29yZCIscmVnZXg6Iig/OiIrYysiKVxcYiIsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjpmdW5jdGlvbihjKXtyZXR1cm4gYS5oYXNPd25Qcm9wZXJ0eShjKT8idmFyaWFibGUubGFuZ3VhZ2UiOmQuaGFzT3duUHJvcGVydHkoYyk/ImludmFsaWQuZGVwcmVjYXRlZCI6aC5oYXNPd25Qcm9wZXJ0eShjKT8ia2V5d29yZC5kZWZpbml0aW9uIjpiLmhhc093blByb3BlcnR5KGMpPyJrZXl3b3JkIjppLmhhc093blByb3BlcnR5KGMpPyJjb25zdGFudC5sYW5ndWFnZSI6ai5oYXNPd25Qcm9wZXJ0eShjKT8iaW52YWxpZC5pbGxlZ2FsIjpjPT0iZGVidWdnZXIiPyJpbnZhbGlkLmRlcHJlY2F0ZWQiOiJpZGVudGlmaWVyIn0scmVnZXg6a30se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIixuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOiJwdW5jdHVhdGlvbi5vcGVyYXRvciIscmVnZXg6IlxcP3xcXDp8XFwsfFxcO3xcXC4iLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46InBhcmVuLmxwYXJlbiIscmVnZXg6IltbKHtdIixuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4OiJbXFxdKX1dIn0se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiXFwvPT8iLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJeIyEuKiQifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn1dLHJlZ2V4X2FsbG93ZWQ6W3t0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKiIsbmV4dDoiY29tbWVudF9yZWdleF9hbGxvd2VkIn0se3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwvXFwvLiokIn0se3Rva2VuOiJzdHJpbmcucmVnZXhwIixyZWdleDoiXFwvIixuZXh0OiJyZWdleCIsbWVyZ2U6ITB9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OiJzdGFydCJ9XSxyZWdleDpbe3Rva2VuOiJyZWdleHAua2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIixuZXh0OiJyZWdleCJ9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6Ii9cXHcqIixuZXh0OiJzdGFydCIsbWVyZ2U6ITB9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6IlteXFxcXC9cXFtdKyIsbmV4dDoicmVnZXgiLG1lcmdlOiEwfSx7dG9rZW46InN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIixyZWdleDoiXFxbIixuZXh0OiJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiLG1lcmdlOiEwfSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OiJzdGFydCJ9XSxyZWdleF9jaGFyYWN0ZXJfY2xhc3M6W3t0b2tlbjoicmVnZXhwLmtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsbmV4dDoicmVnZXhfY2hhcmFjdGVyX2NsYXNzIn0se3Rva2VuOiJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyIscmVnZXg6Il0iLG5leHQ6InJlZ2V4IixtZXJnZTohMH0se3Rva2VuOiJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyIscmVnZXg6IlteXFxcXFxcXV0rIixuZXh0OiJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiLG1lcmdlOiEwfSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OiJzdGFydCJ9XSxjb21tZW50X3JlZ2V4X2FsbG93ZWQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qP1xcKlxcLyIsbWVyZ2U6ITAsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLGNvbW1lbnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qP1xcKlxcLyIsbWVyZ2U6ITAsbmV4dDoic3RhcnQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxxcXN0cmluZzpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OicoPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/IicsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLHFzdHJpbmc6W3t0b2tlbjoic3RyaW5nIixyZWdleDoiKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqPyciLG5leHQ6InN0YXJ0In0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX0sdGhpcy5lbWJlZFJ1bGVzKGcsImRvYy0iLFsobmV3IGcpLmdldEVuZFJ1bGUoInN0YXJ0IildKX07ZC5pbmhlcml0cyhpLGgpLGIuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzPWl9KSxkZWZpbmUoImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsZj1mdW5jdGlvbigpe3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50LmRvYy50YWciLHJlZ2V4OiJAW1xcd1xcZF9dKyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlRPRE8ifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiW15AXFwqXSsifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiLiJ9XX19O2QuaW5oZXJpdHMoZixlKSxmdW5jdGlvbigpe3RoaXMuZ2V0U3RhcnRSdWxlPWZ1bmN0aW9uKGEpe3JldHVybnt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCooPz1cXCopIixuZXh0OmF9fSx0aGlzLmdldEVuZFJ1bGU9ZnVuY3Rpb24oYSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxcKlxcLyIsbmV4dDphfX19LmNhbGwoZi5wcm90b3R5cGUpLGIuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzPWZ9KSxkZWZpbmUoImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3JhbmdlIikuUmFuZ2UsZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuL15ccyskLy50ZXN0KGEpPy9eXHMqXH0vLnRlc3QoYik6ITF9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldExpbmUoYiksZT1jLm1hdGNoKC9eKFxzKlx9KS8pO2lmKCFlKXJldHVybiAwO3ZhciBmPWVbMV0ubGVuZ3RoLGc9YS5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6Yixjb2x1bW46Zn0pO2lmKCFnfHxnLnJvdz09YilyZXR1cm4gMDt2YXIgaD10aGlzLiRnZXRJbmRlbnQoYS5nZXRMaW5lKGcucm93KSk7YS5yZXBsYWNlKG5ldyBkKGIsMCxiLGYtMSksaCl9LHRoaXMuJGdldEluZGVudD1mdW5jdGlvbihhKXt2YXIgYj1hLm1hdGNoKC9eKFxzKykvKTtyZXR1cm4gYj9iWzFdOiIifX0pKS5jYWxsKGUucHJvdG90eXBlKSxiLk1hdGNoaW5nQnJhY2VPdXRkZW50PWV9KSxkZWZpbmUoImFjZS93b3JrZXIvd29ya2VyX2NsaWVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixmPWZ1bmN0aW9uKGIsZCxlLGYpe3RoaXMuY2hhbmdlTGlzdGVuZXI9dGhpcy5jaGFuZ2VMaXN0ZW5lci5iaW5kKHRoaXMpO2lmKGMucGFja2FnZWQpe3ZhciBnPXRoaXMuJGd1ZXNzQmFzZVBhdGgoKTt0aGlzLiR3b3JrZXI9bmV3IFdvcmtlcihnK2QpfWVsc2V7dmFyIGg9dGhpcy4kbm9ybWFsaXplUGF0aChhLm5hbWVUb1VybCgiYWNlL3dvcmtlci93b3JrZXIiLG51bGwsIl8iKSk7dGhpcy4kd29ya2VyPW5ldyBXb3JrZXIoaCk7dmFyIGk9e307Zm9yKHZhciBqPTA7ajxiLmxlbmd0aDtqKyspe3ZhciBrPWJbal0sbD10aGlzLiRub3JtYWxpemVQYXRoKGEubmFtZVRvVXJsKGssbnVsbCwiXyIpLnJlcGxhY2UoLy5qcyQvLCIiKSk7aVtrXT1sfX10aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2luaXQ6ITAsdGxuczppLG1vZHVsZTplLGNsYXNzbmFtZTpmfSksdGhpcy5jYWxsYmFja0lkPTEsdGhpcy5jYWxsYmFja3M9e307dmFyIG09dGhpczt0aGlzLiR3b3JrZXIub25lcnJvcj1mdW5jdGlvbihhKXt0aHJvdyB3aW5kb3cuY29uc29sZSYmY29uc29sZS5sb2cmJmNvbnNvbGUubG9nKGEpLGF9LHRoaXMuJHdvcmtlci5vbm1lc3NhZ2U9ZnVuY3Rpb24oYSl7dmFyIGI9YS5kYXRhO3N3aXRjaChiLnR5cGUpe2Nhc2UibG9nIjp3aW5kb3cuY29uc29sZSYmY29uc29sZS5sb2cmJmNvbnNvbGUubG9nKGIuZGF0YSk7YnJlYWs7Y2FzZSJldmVudCI6bS5fZW1pdChiLm5hbWUse2RhdGE6Yi5kYXRhfSk7YnJlYWs7Y2FzZSJjYWxsIjp2YXIgYz1tLmNhbGxiYWNrc1tiLmlkXTtjJiYoYyhiLmRhdGEpLGRlbGV0ZSBtLmNhbGxiYWNrc1tiLmlkXSl9fX07KChmdW5jdGlvbigpe2QuaW1wbGVtZW50KHRoaXMsZSksdGhpcy4kbm9ybWFsaXplUGF0aD1mdW5jdGlvbihhKXtyZXR1cm4gYT1hLnJlcGxhY2UoL15bYS16XSs6XC9cL1teXC9dK1wvLywiIiksYT1sb2NhdGlvbi5wcm90b2NvbCsiLy8iK2xvY2F0aW9uLmhvc3QrKGEuY2hhckF0KDApPT0iLyI/IiI6bG9jYXRpb24ucGF0aG5hbWUucmVwbGFjZSgvXC9bXlwvXSokLywiIikpKyIvIithLnJlcGxhY2UoL15bXC9dKy8sIiIpLGF9LHRoaXMuJGd1ZXNzQmFzZVBhdGg9ZnVuY3Rpb24oKXtpZihhLmFjZUJhc2VVcmwpcmV0dXJuIGEuYWNlQmFzZVVybDt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPWJbY10sZT1kLmdldEF0dHJpYnV0ZSgiZGF0YS1hY2UtYmFzZSIpO2lmKGUpcmV0dXJuIGUucmVwbGFjZSgvXC8qJC8sIi8iKTt2YXIgZj1kLnNyY3x8ZC5nZXRBdHRyaWJ1dGUoInNyYyIpO2lmKCFmKWNvbnRpbnVlO3ZhciBnPWYubWF0Y2goL14oPzooLipcLylhY2VcLmpzfCguKlwvKWFjZSgtdW5jb21wcmVzc2VkKT8oLW5vY29uZmxpY3QpP1wuanMpKD86XD98JCkvKTtpZihnKXJldHVybiBnWzFdfHxnWzJdfXJldHVybiIifSx0aGlzLnRlcm1pbmF0ZT1mdW5jdGlvbigpe3RoaXMuX2VtaXQoInRlcm1pbmF0ZSIse30pLHRoaXMuJHdvcmtlci50ZXJtaW5hdGUoKSx0aGlzLiR3b3JrZXI9bnVsbCx0aGlzLiRkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix0aGlzLmNoYW5nZUxpc3RlbmVyKSx0aGlzLiRkb2M9bnVsbH0sdGhpcy5zZW5kPWZ1bmN0aW9uKGEsYil7dGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtjb21tYW5kOmEsYXJnczpifSl9LHRoaXMuY2FsbD1mdW5jdGlvbihhLGIsYyl7aWYoYyl7dmFyIGQ9dGhpcy5jYWxsYmFja0lkKys7dGhpcy5jYWxsYmFja3NbZF09YyxiLnB1c2goZCl9dGhpcy5zZW5kKGEsYil9LHRoaXMuZW1pdD1mdW5jdGlvbihhLGIpe3RyeXt0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2V2ZW50OmEsZGF0YTp7ZGF0YTpiLmRhdGF9fSl9Y2F0Y2goYyl7fX0sdGhpcy5hdHRhY2hUb0RvY3VtZW50PWZ1bmN0aW9uKGEpe3RoaXMuJGRvYyYmdGhpcy50ZXJtaW5hdGUoKSx0aGlzLiRkb2M9YSx0aGlzLmNhbGwoInNldFZhbHVlIixbYS5nZXRWYWx1ZSgpXSksYS5vbigiY2hhbmdlIix0aGlzLmNoYW5nZUxpc3RlbmVyKX0sdGhpcy5jaGFuZ2VMaXN0ZW5lcj1mdW5jdGlvbihhKXthLnJhbmdlPXtzdGFydDphLmRhdGEucmFuZ2Uuc3RhcnQsZW5kOmEuZGF0YS5yYW5nZS5lbmR9LHRoaXMuZW1pdCgiY2hhbmdlIixhKX19KSkuY2FsbChmLnByb3RvdHlwZSksYi5Xb3JrZXJDbGllbnQ9Zn0pLGRlZmluZSgiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvYmVoYXZpb3VyIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXIsZj1mdW5jdGlvbigpe3RoaXMuYWRkKCJicmFjZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09InsiKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7cmV0dXJuIGchPT0iIj97dGV4dDoieyIrZysifSIsc2VsZWN0aW9uOiExfTp7dGV4dDoie30iLHNlbGVjdGlvbjpbMSwxXX19aWYoZT09In0iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSJ9Iil7dmFyIGs9ZC4kZmluZE9wZW5pbmdCcmFja2V0KCJ9Iix7Y29sdW1uOmguY29sdW1uKzEscm93Omgucm93fSk7aWYoayE9PW51bGwpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19ZWxzZSBpZihlPT0iXG4iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSJ9Iil7dmFyIGw9ZC5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6aC5yb3csY29sdW1uOmguY29sdW1uKzF9KTtpZighbClyZXR1cm4gbnVsbDt2YXIgbT10aGlzLmdldE5leHRMaW5lSW5kZW50KGEsaS5zdWJzdHJpbmcoMCxpLmxlbmd0aC0xKSxkLmdldFRhYlN0cmluZygpKSxuPXRoaXMuJGdldEluZGVudChkLmRvYy5nZXRMaW5lKGwucm93KSk7cmV0dXJue3RleHQ6IlxuIittKyJcbiIrbixzZWxlY3Rpb246WzEsbS5sZW5ndGgsMSxtLmxlbmd0aF19fX19KSx0aGlzLmFkZCgiYnJhY2VzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSJ7Iil7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLmVuZC5jb2x1bW4sZS5lbmQuY29sdW1uKzEpO2lmKGg9PSJ9IilyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KSx0aGlzLmFkZCgicGFyZW5zIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSIoIil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/e3RleHQ6IigiK2crIikiLHNlbGVjdGlvbjohMX06e3RleHQ6IigpIixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSIpIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0iKSIpe3ZhciBrPWQuJGZpbmRPcGVuaW5nQnJhY2tldCgiKSIse2NvbHVtbjpoLmNvbHVtbisxLHJvdzpoLnJvd30pO2lmKGshPT1udWxsKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJwYXJlbnMiLCJkZWxldGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1kLmRvYy5nZXRUZXh0UmFuZ2UoZSk7aWYoIWUuaXNNdWx0aUxpbmUoKSYmZj09IigiKXt2YXIgZz1kLmRvYy5nZXRMaW5lKGUuc3RhcnQucm93KSxoPWcuc3Vic3RyaW5nKGUuc3RhcnQuY29sdW1uKzEsZS5zdGFydC5jb2x1bW4rMik7aWYoaD09IikiKXJldHVybiBlLmVuZC5jb2x1bW4rKyxlfX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0nIicpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtpZihnIT09IiIpcmV0dXJue3RleHQ6JyInK2crJyInLHNlbGVjdGlvbjohMX07dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbi0xLGguY29sdW1uKTtpZihqPT0iXFwiKXJldHVybiBudWxsO3ZhciBrPWQuZ2V0VG9rZW5zKGYuc3RhcnQucm93LGYuc3RhcnQucm93KVswXS50b2tlbnMsbD0wLG0sbj0tMTtmb3IodmFyIG89MDtvPGsubGVuZ3RoO28rKyl7bT1rW29dLG0udHlwZT09InN0cmluZyI/bj0tMTpuPDAmJihuPW0udmFsdWUuaW5kZXhPZignIicpKTtpZihtLnZhbHVlLmxlbmd0aCtsPmYuc3RhcnQuY29sdW1uKWJyZWFrO2wrPWtbb10udmFsdWUubGVuZ3RofWlmKCFtfHxuPDAmJm0udHlwZSE9PSJjb21tZW50IiYmKG0udHlwZSE9PSJzdHJpbmcifHxmLnN0YXJ0LmNvbHVtbiE9PW0udmFsdWUubGVuZ3RoK2wtMSYmbS52YWx1ZS5sYXN0SW5kZXhPZignIicpPT09bS52YWx1ZS5sZW5ndGgtMSkpcmV0dXJue3RleHQ6JyIiJyxzZWxlY3Rpb246WzEsMV19O2lmKG0mJm0udHlwZT09PSJzdHJpbmciKXt2YXIgcD1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihwPT0nIicpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19fSksdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSciJyl7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbisxLGUuc3RhcnQuY29sdW1uKzIpO2lmKGg9PSciJylyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KX07ZC5pbmhlcml0cyhmLGUpLGIuQ3N0eWxlQmVoYXZpb3VyPWZ9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvcmFuZ2UiLCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxmPWEoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGUsZz1iLkZvbGRNb2RlPWZ1bmN0aW9uKCl7fTtkLmluaGVyaXRzKGcsZiksZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj0vKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLyx0aGlzLmZvbGRpbmdTdG9wTWFya2VyPS9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLyx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpLGY9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7aWYoZil7dmFyIGc9Zi5pbmRleDtpZihmWzFdKXJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soYSxmWzFdLGMsZyk7dmFyIGg9YS5nZXRDb21tZW50Rm9sZFJhbmdlKGMsZytmWzBdLmxlbmd0aCk7cmV0dXJuIGguZW5kLmNvbHVtbi09MixofWlmKGIhPT0ibWFya2JlZ2luZW5kIilyZXR1cm47dmFyIGY9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTtpZihmKXt2YXIgZz1mLmluZGV4K2ZbMF0ubGVuZ3RoO2lmKGZbMl0pe3ZhciBoPWEuZ2V0Q29tbWVudEZvbGRSYW5nZShjLGcpO3JldHVybiBoLmVuZC5jb2x1bW4tPTIsaH12YXIgaT17cm93OmMsY29sdW1uOmd9LGo9YS4kZmluZE9wZW5pbmdCcmFja2V0KGZbMV0saSk7aWYoIWopcmV0dXJuO3JldHVybiBqLmNvbHVtbisrLGkuY29sdW1uLS0sZS5mcm9tUG9pbnRzKGosaSl9fX0uY2FsbChnLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGU9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPW51bGwsdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj1udWxsLHRoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpO3JldHVybiB0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGQpPyJzdGFydCI6Yj09Im1hcmtiZWdpbmVuZCImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChkKT8iZW5kIjoiIn0sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBudWxsfSx0aGlzLmluZGVudGF0aW9uQmxvY2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPS9eXHMqLyxmPWIsZz1iLGg9YS5nZXRMaW5lKGIpLGk9Y3x8aC5sZW5ndGgsaj1oLm1hdGNoKGUpWzBdLmxlbmd0aCxrPWEuZ2V0TGVuZ3RoKCk7d2hpbGUoKytiPGspe2g9YS5nZXRMaW5lKGIpO3ZhciBsPWgubWF0Y2goZSlbMF0ubGVuZ3RoO2lmKGw9PWgubGVuZ3RoKWNvbnRpbnVlO2lmKGw8PWopYnJlYWs7Zz1ifWlmKGc+Zil7dmFyIG09YS5nZXRMaW5lKGcpLmxlbmd0aDtyZXR1cm4gbmV3IGQoZixpLGcsbSl9fSx0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2s9ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGY9e3JvdzpjLGNvbHVtbjplKzF9LGc9YS4kZmluZENsb3NpbmdCcmFja2V0KGIsZik7aWYoIWcpcmV0dXJuO3ZhciBoPWEuZm9sZFdpZGdldHNbZy5yb3ddO3JldHVybiBoPT1udWxsJiYoaD10aGlzLmdldEZvbGRXaWRnZXQoYSxnLnJvdykpLGg9PSJzdGFydCImJihnLnJvdy0tLGcuY29sdW1uPWEuZ2V0TGluZShnLnJvdykubGVuZ3RoKSxkLmZyb21Qb2ludHMoZixnKX19KSkuY2FsbChlLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb2RlL2phdmFfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi4vbGliL2xhbmciKSxmPWEoIi4vZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIikuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLGc9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxoPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKCJhYnN0cmFjdHxjb250aW51ZXxmb3J8bmV3fHN3aXRjaHxhc3NlcnR8ZGVmYXVsdHxnb3RvfHBhY2thZ2V8c3luY2hyb25pemVkfGJvb2xlYW58ZG98aWZ8cHJpdmF0ZXx0aGlzfGJyZWFrfGRvdWJsZXxpbXBsZW1lbnRzfHByb3RlY3RlZHx0aHJvd3xieXRlfGVsc2V8aW1wb3J0fHB1YmxpY3x0aHJvd3N8Y2FzZXxlbnVtfGluc3RhbmNlb2Z8cmV0dXJufHRyYW5zaWVudHxjYXRjaHxleHRlbmRzfGludHxzaG9ydHx0cnl8Y2hhcnxmaW5hbHxpbnRlcmZhY2V8c3RhdGljfHZvaWR8Y2xhc3N8ZmluYWxseXxsb25nfHN0cmljdGZwfHZvbGF0aWxlfGNvbnN0fGZsb2F0fG5hdGl2ZXxzdXBlcnx3aGlsZSIuc3BsaXQoInwiKSksYj1lLmFycmF5VG9NYXAoIm51bGx8SW5maW5pdHl8TmFOfHVuZGVmaW5lZCIuc3BsaXQoInwiKSksYz1lLmFycmF5VG9NYXAoIkFic3RyYWN0TWV0aG9kRXJyb3J8QXNzZXJ0aW9uRXJyb3J8Q2xhc3NDaXJjdWxhcml0eUVycm9yfENsYXNzRm9ybWF0RXJyb3J8RGVwcmVjYXRlZHxFbnVtQ29uc3RhbnROb3RQcmVzZW50RXhjZXB0aW9ufEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcnxJbGxlZ2FsQWNjZXNzRXJyb3J8SWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9ufEluc3RhbnRpYXRpb25FcnJvcnxJbnRlcm5hbEVycm9yfE5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9ufE5vU3VjaEZpZWxkRXJyb3J8T3ZlcnJpZGV8UHJvY2Vzc3xQcm9jZXNzQnVpbGRlcnxTZWN1cml0eU1hbmFnZXJ8U3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbnxTdXBwcmVzc1dhcm5pbmdzfFR5cGVOb3RQcmVzZW50RXhjZXB0aW9ufFVua25vd25FcnJvcnxVbnNhdGlzZmllZExpbmtFcnJvcnxVbnN1cHBvcnRlZENsYXNzVmVyc2lvbkVycm9yfFZlcmlmeUVycm9yfEluc3RhbnRpYXRpb25FeGNlcHRpb258SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbnxBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb258Q2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb258Tm9TdWNoRmllbGRFeGNlcHRpb258SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufE51bWJlckZvcm1hdEV4Y2VwdGlvbnxTZWN1cml0eUV4Y2VwdGlvbnxWb2lkfEluaGVyaXRhYmxlVGhyZWFkTG9jYWx8SWxsZWdhbFN0YXRlRXhjZXB0aW9ufEludGVycnVwdGVkRXhjZXB0aW9ufE5vU3VjaE1ldGhvZEV4Y2VwdGlvbnxJbGxlZ2FsQWNjZXNzRXhjZXB0aW9ufFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufEVudW18U3RyaWN0TWF0aHxQYWNrYWdlfENvbXBpbGVyfFJlYWRhYmxlfFJ1bnRpbWV8U3RyaW5nQnVpbGRlcnxNYXRofEluY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3J8Tm9TdWNoTWV0aG9kRXJyb3J8VGhyZWFkTG9jYWx8UnVudGltZVBlcm1pc3Npb258QXJpdGhtZXRpY0V4Y2VwdGlvbnxOdWxsUG9pbnRlckV4Y2VwdGlvbnxMb25nfEludGVnZXJ8U2hvcnR8Qnl0ZXxEb3VibGV8TnVtYmVyfEZsb2F0fENoYXJhY3RlcnxCb29sZWFufFN0YWNrVHJhY2VFbGVtZW50fEFwcGVuZGFibGV8U3RyaW5nQnVmZmVyfEl0ZXJhYmxlfFRocmVhZEdyb3VwfFJ1bm5hYmxlfFRocmVhZHxJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9ufFN0YWNrT3ZlcmZsb3dFcnJvcnxPdXRPZk1lbW9yeUVycm9yfFZpcnR1YWxNYWNoaW5lRXJyb3J8QXJyYXlTdG9yZUV4Y2VwdGlvbnxDbGFzc0Nhc3RFeGNlcHRpb258TGlua2FnZUVycm9yfE5vQ2xhc3NEZWZGb3VuZEVycm9yfENsYXNzTm90Rm91bmRFeGNlcHRpb258UnVudGltZUV4Y2VwdGlvbnxFeGNlcHRpb258VGhyZWFkRGVhdGh8RXJyb3J8VGhyb3dhYmxlfFN5c3RlbXxDbGFzc0xvYWRlcnxDbG9uZWFibGV8Q2xhc3N8Q2hhclNlcXVlbmNlfENvbXBhcmFibGV8U3RyaW5nfE9iamVjdCIuc3BsaXQoInwiKSksZD1lLmFycmF5VG9NYXAoIiIuc3BsaXQoInwiKSk7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJcXC9cXC8uKiQifSwobmV3IGYpLmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0Iikse3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwvXFwqIixuZXh0OiJjb21tZW50In0se3Rva2VuOiJzdHJpbmcucmVnZXhwIixyZWdleDoiWy9dKD86KD86XFxbKD86XFxcXF18W15cXF1dKStcXF0pfCg/OlxcXFwvfFteXFxdL10pKSpbL11cXHcqXFxzKig/PVspLiw7XXwkKSJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDonWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXSd9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IjBbeFhdWzAtOWEtZkEtRl0rXFxiIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIifSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLHJlZ2V4OiIoPzp0cnVlfGZhbHNlKVxcYiJ9LHt0b2tlbjpmdW5jdGlvbihlKXtyZXR1cm4gZT09InRoaXMiPyJ2YXJpYWJsZS5sYW5ndWFnZSI6YS5oYXNPd25Qcm9wZXJ0eShlKT8ia2V5d29yZCI6Yy5oYXNPd25Qcm9wZXJ0eShlKT8ic3VwcG9ydC5mdW5jdGlvbiI6ZC5oYXNPd25Qcm9wZXJ0eShlKT8ic3VwcG9ydC5mdW5jdGlvbiI6Yi5oYXNPd25Qcm9wZXJ0eShlKT8iY29uc3RhbnQubGFuZ3VhZ2UiOiJpZGVudGlmaWVyIn0scmVnZXg6IlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiJ9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6IiF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT09fD09fD18IT18IT09fDw9fD49fDw8PXw+Pj18Pj4+PXw8Pnw8fD58IXwmJnxcXHxcXHx8XFw/XFw6fFxcKj18JT18XFwrPXxcXC09fCY9fFxcXj18XFxiKD86aW58aW5zdGFuY2VvZnxuZXd8ZGVsZXRlfHR5cGVvZnx2b2lkKSJ9LHt0b2tlbjoibHBhcmVuIixyZWdleDoiW1soe10ifSx7dG9rZW46InJwYXJlbiIscmVnZXg6IltcXF0pfV0ifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn1dLGNvbW1lbnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qP1xcKlxcLyIsbmV4dDoic3RhcnQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX0sdGhpcy5lbWJlZFJ1bGVzKGYsImRvYy0iLFsobmV3IGYpLmdldEVuZFJ1bGUoInN0YXJ0IildKX07ZC5pbmhlcml0cyhoLGcpLGIuSmF2YUhpZ2hsaWdodFJ1bGVzPWh9KSxmdW5jdGlvbigpe3dpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLGZ1bmN0aW9uKGEpe3dpbmRvdy5hY2V8fCh3aW5kb3cuYWNlPXt9KTtmb3IodmFyIGIgaW4gYSlhLmhhc093blByb3BlcnR5KGIpJiYoYWNlW2JdPWFbYl0pfSl9KCk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-javascript-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9qYXZhc2NyaXB0JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2UvcmFuZ2UnLCAnYWNlL3dvcmtlci93b3JrZXJfY2xpZW50JywgJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnLCAnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7CnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7CnZhciBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIikuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzOwp2YXIgTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSByZXF1aXJlKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudDsKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsKdmFyIFdvcmtlckNsaWVudCA9IHJlcXVpcmUoIi4uL3dvcmtlci93b3JrZXJfY2xpZW50IikuV29ya2VyQ2xpZW50Owp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gcmVxdWlyZSgiLi9iZWhhdmlvdXIvY3N0eWxlIikuQ3N0eWxlQmVoYXZpb3VyOwp2YXIgQ1N0eWxlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGU7Cgp2YXIgTW9kZSA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7CiAgICB0aGlzLiRvdXRkZW50ID0gbmV3IE1hdGNoaW5nQnJhY2VPdXRkZW50KCk7CiAgICB0aGlzLiRiZWhhdmlvdXIgPSBuZXcgQ3N0eWxlQmVoYXZpb3VyKCk7CiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBDU3R5bGVGb2xkTW9kZSgpOwp9Owpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOwoKKGZ1bmN0aW9uKCkgewoKCiAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpIHsKICAgICAgICB2YXIgb3V0ZGVudCA9IHRydWU7CiAgICAgICAgdmFyIHJlID0gL14oXHMqKVwvXC8vOwoKICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspIHsKICAgICAgICAgICAgaWYgKCFyZS50ZXN0KGRvYy5nZXRMaW5lKGkpKSkgewogICAgICAgICAgICAgICAgb3V0ZGVudCA9IGZhbHNlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChvdXRkZW50KSB7CiAgICAgICAgICAgIHZhciBkZWxldGVSYW5nZSA9IG5ldyBSYW5nZSgwLCAwLCAwLCAwKTsKICAgICAgICAgICAgZm9yICh2YXIgaT1zdGFydFJvdzsgaTw9IGVuZFJvdzsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKGkpOwogICAgICAgICAgICAgICAgdmFyIG0gPSBsaW5lLm1hdGNoKHJlKTsKICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLnN0YXJ0LnJvdyA9IGk7CiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQucm93ID0gaTsKICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLmVuZC5jb2x1bW4gPSBtWzBdLmxlbmd0aDsKICAgICAgICAgICAgICAgIGRvYy5yZXBsYWNlKGRlbGV0ZVJhbmdlLCBtWzFdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZG9jLmluZGVudFJvd3Moc3RhcnRSb3csIGVuZFJvdywgIi8vIik7CiAgICAgICAgfQogICAgfTsKCiAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgewogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQobGluZSk7CgogICAgICAgIHZhciB0b2tlbml6ZWRMaW5lID0gdGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMobGluZSwgc3RhdGUpOwogICAgICAgIHZhciB0b2tlbnMgPSB0b2tlbml6ZWRMaW5lLnRva2VuczsKICAgICAgICB2YXIgZW5kU3RhdGUgPSB0b2tlbml6ZWRMaW5lLnN0YXRlOwoKICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXS50eXBlID09ICJjb21tZW50IikgewogICAgICAgICAgICByZXR1cm4gaW5kZW50OwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoc3RhdGUgPT0gInN0YXJ0IiB8fCBzdGF0ZSA9PSAicmVnZXhfYWxsb3dlZCIpIHsKICAgICAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXi4qKD86XGJjYXNlXGIuKlw6fFtce1woXFtdKVxzKiQvKTsKICAgICAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gdGFiOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSAiZG9jLXN0YXJ0IikgewogICAgICAgICAgICBpZiAoZW5kU3RhdGUgPT0gInN0YXJ0IiB8fCBzdGF0ZSA9PSAicmVnZXhfYWxsb3dlZCIpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eXHMqKFwvPylcKi8pOwogICAgICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgICAgIGlmIChtYXRjaFsxXSkgewogICAgICAgICAgICAgICAgICAgIGluZGVudCArPSAiICI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gIiogIjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGluZGVudDsKICAgIH07CgogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgaW5wdXQpIHsKICAgICAgICByZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQobGluZSwgaW5wdXQpOwogICAgfTsKCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgcm93KSB7CiAgICAgICAgdGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChkb2MsIHJvdyk7CiAgICB9OwogICAgCiAgICB0aGlzLmNyZWF0ZVdvcmtlciA9IGZ1bmN0aW9uKHNlc3Npb24pIHsKICAgICAgICB2YXIgd29ya2VyID0gbmV3IFdvcmtlckNsaWVudChbImFjZSJdLCAid29ya2VyLWphdmFzY3JpcHQuanMiLCAiYWNlL21vZGUvamF2YXNjcmlwdF93b3JrZXIiLCAiSmF2YVNjcmlwdFdvcmtlciIpOwogICAgICAgIHdvcmtlci5hdHRhY2hUb0RvY3VtZW50KHNlc3Npb24uZ2V0RG9jdW1lbnQoKSk7CiAgICAgICAgICAgIAogICAgICAgIHdvcmtlci5vbigianNsaW50IiwgZnVuY3Rpb24ocmVzdWx0cykgewogICAgICAgICAgICB2YXIgZXJyb3JzID0gW107CiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxyZXN1bHRzLmRhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciBlcnJvciA9IHJlc3VsdHMuZGF0YVtpXTsKICAgICAgICAgICAgICAgIGlmIChlcnJvcikKICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogZXJyb3IubGluZS0xLAogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGVycm9yLmNoYXJhY3Rlci0xLAogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvci5yZWFzb24sCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJ3YXJuaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgbGludDogZXJyb3IKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXNzaW9uLnNldEFubm90YXRpb25zKGVycm9ycyk7CiAgICAgICAgfSk7CiAgICAgICAgCiAgICAgICAgd29ya2VyLm9uKCJuYXJjaXNzdXMiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIHNlc3Npb24uc2V0QW5ub3RhdGlvbnMoW2UuZGF0YV0pOwogICAgICAgIH0pOwogICAgICAgIAogICAgICAgIHdvcmtlci5vbigidGVybWluYXRlIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHNlc3Npb24uY2xlYXJBbm5vdGF0aW9ucygpOwogICAgICAgIH0pOwogICAgICAgIAogICAgICAgIHJldHVybiB3b3JrZXI7CiAgICB9OwoKfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7CgpleHBvcnRzLk1vZGUgPSBNb2RlOwp9KTsKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKiAgICAgIE1paGFpIFN1Y2FuIDxtaWhhaSBET1Qgc3VjYW4gQVQgZ21haWwgRE9UIGNvbT4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvdW5pY29kZScsICdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsKdmFyIHVuaWNvZGUgPSByZXF1aXJlKCIuLi91bmljb2RlIik7CnZhciBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIpLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsKdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7Cgp2YXIgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7CgogICAgLy8gc2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cwogICAgdmFyIGdsb2JhbHMgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgIC8vIENvbnN0cnVjdG9ycwogICAgICAgICgiQXJyYXl8Qm9vbGVhbnxEYXRlfEZ1bmN0aW9ufEl0ZXJhdG9yfE51bWJlcnxPYmplY3R8UmVnRXhwfFN0cmluZ3xQcm94eXwiICsKICAgICAgLy8gRTRYCiAgICAgICAgICJOYW1lc3BhY2V8UU5hbWV8WE1MfFhNTExpc3R8IiArCiAgICAgICAgICJBcnJheUJ1ZmZlcnxGbG9hdDMyQXJyYXl8RmxvYXQ2NEFycmF5fEludDE2QXJyYXl8SW50MzJBcnJheXxJbnQ4QXJyYXl8IiArCiAgICAgICAgICJVaW50MTZBcnJheXxVaW50MzJBcnJheXxVaW50OEFycmF5fFVpbnQ4Q2xhbXBlZEFycmF5fCIgKwogICAgICAvLyBFcnJvcnMKICAgICAgICAiRXJyb3J8RXZhbEVycm9yfEludGVybmFsRXJyb3J8UmFuZ2VFcnJvcnxSZWZlcmVuY2VFcnJvcnxTdG9wSXRlcmF0aW9ufCIgKwogICAgICAgICJTeW50YXhFcnJvcnxUeXBlRXJyb3J8VVJJRXJyb3J8IiArCiAgICAgIC8vICBOb24tY29uc3RydWN0b3IgZnVuY3Rpb25zCiAgICAgICAgImRlY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZW5jb2RlVVJJfGVuY29kZVVSSUNvbXBvbmVudHxldmFsfGlzRmluaXRlfCIgKwogICAgICAgICJpc05hTnxwYXJzZUZsb2F0fHBhcnNlSW50fCIgKwogICAgICAvLyBPdGhlcgogICAgICAgICJKU09OfE1hdGh8IiArCiAgICAgIC8vIFBzZXVkbwogICAgICAgICJ0aGlzfGFyZ3VtZW50c3xwcm90b3R5cGV8d2luZG93fGRvY3VtZW50IgogICAgICApLnNwbGl0KCJ8IikKICAgICk7CgogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgiYnJlYWt8Y2FzZXxjYXRjaHxjb250aW51ZXxkZWZhdWx0fGRlbGV0ZXxkb3xlbHNlfGZpbmFsbHl8Zm9yfGZ1bmN0aW9ufCIgKwogICAgICAgICJpZnxpbnxpbnN0YW5jZW9mfG5ld3xyZXR1cm58c3dpdGNofHRocm93fHRyeXx0eXBlb2Z8bGV0fHZhcnx3aGlsZXx3aXRofCIgKwogICAgICAgICJjb25zdHx5aWVsZHxpbXBvcnR8Z2V0fHNldCIpLnNwbGl0KCJ8IikKICAgICk7CgogICAgLy8ga2V5d29yZHMgd2hpY2ggY2FuIGJlIGZvbGxvd2VkIGJ5IHJlZ3VsYXIgZXhwcmVzc2lvbnMKICAgIHZhciBrd0JlZm9yZVJlID0gImNhc2V8ZG98ZWxzZXxmaW5hbGx5fGlufGluc3RhbmNlb2Z8cmV0dXJufHRocm93fHRyeXx0eXBlb2Z8eWllbGQiOwoKICAgIHZhciBkZXByZWNhdGVkID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgiX19wYXJlbnRfX3xfX2NvdW50X198ZXNjYXBlfHVuZXNjYXBlfHdpdGh8X19wcm90b19fIikuc3BsaXQoInwiKQogICAgKTsKCiAgICB2YXIgZGVmaW5pdGlvbnMgPSBsYW5nLmFycmF5VG9NYXAoKCJjb25zdHxsZXR8dmFyfGZ1bmN0aW9uIikuc3BsaXQoInwiKSk7CgogICAgdmFyIGJ1aWxkaW5Db25zdGFudHMgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCJudWxsfEluZmluaXR5fE5hTnx1bmRlZmluZWQiKS5zcGxpdCgifCIpCiAgICApOwoKICAgIHZhciBmdXR1cmVSZXNlcnZlZCA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoImNsYXNzfGVudW18ZXh0ZW5kc3xzdXBlcnxleHBvcnR8aW1wbGVtZW50c3xwcml2YXRlfCIgKwogICAgICAgICJwdWJsaWN8aW50ZXJmYWNlfHBhY2thZ2V8cHJvdGVjdGVkfHN0YXRpYyIpLnNwbGl0KCJ8IikKICAgICk7CgogICAgLy8gVE9ETzogVW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzCiAgICB2YXIgaWRlbnRpZmllclJlID0gIlsiICsgdW5pY29kZS5wYWNrYWdlcy5MICsgIlxcJF9dWyIgCiAgICAgICAgKyB1bmljb2RlLnBhY2thZ2VzLkwKICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTW4gKyB1bmljb2RlLnBhY2thZ2VzLk1jCiAgICAgICAgKyB1bmljb2RlLnBhY2thZ2VzLk5kCiAgICAgICAgKyB1bmljb2RlLnBhY2thZ2VzLlBjICsgIlxcJF9dKlxcYiI7CiAgICAgICAgCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMuIFVzZSAoPzopIGluc3RlYWQuCiAgICAvLyByZWdleHBzIGFyZSBvcmRlcmVkIC0+IHRoZSBmaXJzdCBtYXRjaCBpcyB1c2VkCgogICAgdGhpcy4kcnVsZXMgPSB7CiAgICAgICAgInN0YXJ0IiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXC8uKiQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50CiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLAogICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXScKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXS4qXFxcXCQnLAogICAgICAgICAgICAgICAgbmV4dCA6ICJxcXN0cmluZyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10iCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0CiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10uKlxcXFwkIiwKICAgICAgICAgICAgICAgIG5leHQgOiAicXN0cmluZyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleAogICAgICAgICAgICAgICAgcmVnZXggOiAiMFt4WF1bMC05YS1mQS1GXStcXGIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdAogICAgICAgICAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogWyJrZXl3b3JkLmRlZmluaXRpb24iLCAidGV4dCIsICJlbnRpdHkubmFtZS5mdW5jdGlvbiJdLAogICAgICAgICAgICAgICAgcmVnZXggOiAiKGZ1bmN0aW9uKShcXHMrKSgiICsgaWRlbnRpZmllclJlICsgIikiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLAogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86dHJ1ZXxmYWxzZSlcXGIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86IiArIGt3QmVmb3JlUmUgKyAiKVxcYiIsCiAgICAgICAgICAgICAgICBuZXh0IDogInJlZ2V4X2FsbG93ZWQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZ2xvYmFscy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUubGFuZ3VhZ2UiOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlcHJlY2F0ZWQuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuZGVwcmVjYXRlZCI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmaW5pdGlvbnMuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQuZGVmaW5pdGlvbiI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5d29yZHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWxkaW5Db25zdGFudHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImNvbnN0YW50Lmxhbmd1YWdlIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmdXR1cmVSZXNlcnZlZC5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5pbGxlZ2FsIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA9PSAiZGVidWdnZXIiKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuZGVwcmVjYXRlZCI7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImlkZW50aWZpZXIiOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogaWRlbnRpZmllclJlCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIiwKICAgICAgICAgICAgICAgIG5leHQgIDogInJlZ2V4X2FsbG93ZWQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcP3xcXDp8XFwsfFxcO3xcXC4iLAogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ubHBhcmVuIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIltbKHtdIiwKICAgICAgICAgICAgICAgIG5leHQgIDogInJlZ2V4X2FsbG93ZWQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcLz0/IiwKICAgICAgICAgICAgICAgIG5leHQgIDogInJlZ2V4X2FsbG93ZWQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuOiAiY29tbWVudCIsCiAgICAgICAgICAgICAgICByZWdleDogIl4jIS4qJCIgCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFxzKyIKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgLy8gcmVndWxhciBleHByZXNzaW9ucyBhcmUgb25seSBhbGxvd2VkIGFmdGVyIGNlcnRhaW4gdG9rZW5zLiBUaGlzCiAgICAgICAgLy8gbWFrZXMgc3VyZSB3ZSBkb24ndCBtaXggdXAgcmVnZXhwcyB3aXRoIHRoZSBkaXZpc29uIG9wZXJhdG9yCiAgICAgICAgInJlZ2V4X2FsbG93ZWQiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnRfcmVnZXhfYWxsb3dlZCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXC8uKiQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cCIsCiAgICAgICAgICAgICAgICByZWdleDogIlxcLyIsCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXgiLAogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGVseSByZXR1cm4gdG8gdGhlIHN0YXJ0IG1vZGUgd2l0aG91dCBtYXRjaGluZwogICAgICAgICAgICAgICAgLy8gYW55dGhpbmcKICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCAKICAgICAgICAgICAgICAgIHJlZ2V4OiAiIiwKICAgICAgICAgICAgICAgIG5leHQ6ICJzdGFydCIKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInJlZ2V4IjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbjogInJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIiwKICAgICAgICAgICAgICAgIHJlZ2V4OiAiXFxcXCg/OnVbXFxkYS1mQS1GXXs0fXx4W1xcZGEtZkEtRl17Mn18LikiLAogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IgogICAgICAgICAgICB9LCB7CgkJCQkvLyBmbGFnCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAiLCAKICAgICAgICAgICAgICAgIHJlZ2V4OiAiL1xcdyoiLAogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0IiwKICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlIAogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAiLAogICAgICAgICAgICAgICAgcmVnZXg6ICJbXlxcXFwvXFxbXSsiLAogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IiwKICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLAogICAgICAgICAgICAgICAgcmVnZXg6ICJcXFsiLAogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyIsCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbjogImVtcHR5IiwgCiAgICAgICAgICAgICAgICByZWdleDogIiIsCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiIAogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbjogInJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIiwKICAgICAgICAgICAgICAgIHJlZ2V4OiAiXFxcXCg/OnVbXFxkYS1mQS1GXXs0fXx4W1xcZGEtZkEtRl17Mn18LikiLAogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyIsCiAgICAgICAgICAgICAgICByZWdleDogIl0iLAogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IiwKICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLAogICAgICAgICAgICAgICAgcmVnZXg6ICJbXlxcXFxcXF1dKyIsCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIiwKICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCAKICAgICAgICAgICAgICAgIHJlZ2V4OiAiIiwKICAgICAgICAgICAgICAgIG5leHQ6ICJzdGFydCIgCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJjb21tZW50X3JlZ2V4X2FsbG93ZWQiIDogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50CiAgICAgICAgICAgICAgICByZWdleCA6ICIuKj9cXCpcXC8iLAogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgbmV4dCA6ICJyZWdleF9hbGxvd2VkIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyIKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgImNvbW1lbnQiIDogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50CiAgICAgICAgICAgICAgICByZWdleCA6ICIuKj9cXCpcXC8iLAogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAiLisiCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJxcXN0cmluZyIgOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgICAgICByZWdleCA6ICcoPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/IicsCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAnLisnCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJxc3RyaW5nIiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj8nIiwKICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKycKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH07CiAgICAKICAgIHRoaXMuZW1iZWRSdWxlcyhEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsICJkb2MtIiwKICAgICAgICBbIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRFbmRSdWxlKCJzdGFydCIpIF0pOwp9OwoKb29wLmluaGVyaXRzKEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsKCmV4cG9ydHMuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzID0gSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzOwp9KTsKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsKCnZhciBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsKCiAgICB0aGlzLiRydWxlcyA9IHsKICAgICAgICAic3RhcnQiIDogWyB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jLnRhZyIsCiAgICAgICAgICAgIHJlZ2V4IDogIkBbXFx3XFxkX10rIiAvLyBUT0RPOiBmaXggZW1haWwgYWRkcmVzc2VzCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiXFxzKyIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICJUT0RPIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlteQFxcKl0rIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIi4iCiAgICAgICAgfV0KICAgIH07Cn07Cgpvb3AuaW5oZXJpdHMoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOwoKKGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuZ2V0U3RhcnRSdWxlID0gZnVuY3Rpb24oc3RhcnQpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsIC8vIGRvYyBjb21tZW50CiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqKD89XFwqKSIsCiAgICAgICAgICAgIG5leHQgIDogc3RhcnQKICAgICAgICB9OwogICAgfTsKICAgIAogICAgdGhpcy5nZXRFbmRSdWxlID0gZnVuY3Rpb24gKHN0YXJ0KSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLCAvLyBjbG9zaW5nIGNvbW1lbnQKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICJcXCpcXC8iLAogICAgICAgICAgICBuZXh0ICA6IHN0YXJ0CiAgICAgICAgfTsKICAgIH07Cgp9KS5jYWxsKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcy5wcm90b3R5cGUpOwoKZXhwb3J0cy5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM7Cgp9KTsKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7Cgp2YXIgTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBmdW5jdGlvbigpIHt9OwoKKGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24obGluZSwgaW5wdXQpIHsKICAgICAgICBpZiAoISAvXlxzKyQvLnRlc3QobGluZSkpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgICAgcmV0dXJuIC9eXHMqXH0vLnRlc3QoaW5wdXQpOwogICAgfTsKCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oZG9jLCByb3cpIHsKICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKHJvdyk7CiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccypcfSkvKTsKCiAgICAgICAgaWYgKCFtYXRjaCkgcmV0dXJuIDA7CgogICAgICAgIHZhciBjb2x1bW4gPSBtYXRjaFsxXS5sZW5ndGg7CiAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IGRvYy5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW59KTsKCiAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MgfHwgb3BlbkJyYWNlUG9zLnJvdyA9PSByb3cpIHJldHVybiAwOwoKICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsKICAgICAgICBkb2MucmVwbGFjZShuZXcgUmFuZ2Uocm93LCAwLCByb3csIGNvbHVtbi0xKSwgaW5kZW50KTsKICAgIH07CgogICAgdGhpcy4kZ2V0SW5kZW50ID0gZnVuY3Rpb24obGluZSkgewogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMrKS8pOwogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gIiI7CiAgICB9OwoKfSkuY2FsbChNYXRjaGluZ0JyYWNlT3V0ZGVudC5wcm90b3R5cGUpOwoKZXhwb3J0cy5NYXRjaGluZ0JyYWNlT3V0ZGVudCA9IE1hdGNoaW5nQnJhY2VPdXRkZW50Owp9KTsKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvZXZlbnRfZW1pdHRlciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoIi4uL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOwoKdmFyIFdvcmtlckNsaWVudCA9IGZ1bmN0aW9uKHRvcExldmVsTmFtZXNwYWNlcywgcGFja2FnZWRKcywgbW9kLCBjbGFzc25hbWUpIHsKCiAgICB0aGlzLmNoYW5nZUxpc3RlbmVyID0gdGhpcy5jaGFuZ2VMaXN0ZW5lci5iaW5kKHRoaXMpOwoKICAgIGlmIChtb2R1bGUucGFja2FnZWQpIHsKICAgICAgICB2YXIgYmFzZSA9IHRoaXMuJGd1ZXNzQmFzZVBhdGgoKTsKICAgICAgICB0aGlzLiR3b3JrZXIgPSBuZXcgV29ya2VyKGJhc2UgKyBwYWNrYWdlZEpzKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHZhciB3b3JrZXJVcmwgPSB0aGlzLiRub3JtYWxpemVQYXRoKHJlcXVpcmUubmFtZVRvVXJsKCJhY2Uvd29ya2VyL3dvcmtlciIsIG51bGwsICJfIikpOwogICAgICAgIHRoaXMuJHdvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyVXJsKTsKCiAgICAgICAgdmFyIHRsbnMgPSB7fTsKICAgICAgICBmb3IgKHZhciBpPTA7IGk8dG9wTGV2ZWxOYW1lc3BhY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBucyA9IHRvcExldmVsTmFtZXNwYWNlc1tpXTsKICAgICAgICAgICAgdmFyIHBhdGggPSB0aGlzLiRub3JtYWxpemVQYXRoKHJlcXVpcmUubmFtZVRvVXJsKG5zLCBudWxsLCAiXyIpLnJlcGxhY2UoLy5qcyQvLCAiIikpOwoKICAgICAgICAgICAgdGxuc1tuc10gPSBwYXRoOwogICAgICAgIH0KICAgIH0KCiAgICB0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2UoewogICAgICAgIGluaXQgOiB0cnVlLAogICAgICAgIHRsbnM6IHRsbnMsCiAgICAgICAgbW9kdWxlOiBtb2QsCiAgICAgICAgY2xhc3NuYW1lOiBjbGFzc25hbWUKICAgIH0pOwoKICAgIHRoaXMuY2FsbGJhY2tJZCA9IDE7CiAgICB0aGlzLmNhbGxiYWNrcyA9IHt9OwoKICAgIHZhciBfc2VsZiA9IHRoaXM7CiAgICB0aGlzLiR3b3JrZXIub25lcnJvciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICB3aW5kb3cuY29uc29sZSAmJiBjb25zb2xlLmxvZyAmJiBjb25zb2xlLmxvZyhlKTsKICAgICAgICB0aHJvdyBlOwogICAgfTsKICAgIHRoaXMuJHdvcmtlci5vbm1lc3NhZ2UgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgdmFyIG1zZyA9IGUuZGF0YTsKICAgICAgICBzd2l0Y2gobXNnLnR5cGUpIHsKICAgICAgICAgICAgY2FzZSAibG9nIjoKICAgICAgICAgICAgICAgIHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUubG9nICYmIGNvbnNvbGUubG9nKG1zZy5kYXRhKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAiZXZlbnQiOgogICAgICAgICAgICAgICAgX3NlbGYuX2VtaXQobXNnLm5hbWUsIHtkYXRhOiBtc2cuZGF0YX0pOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICJjYWxsIjoKICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IF9zZWxmLmNhbGxiYWNrc1ttc2cuaWRdOwogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobXNnLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBfc2VsZi5jYWxsYmFja3NbbXNnLmlkXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH07Cn07CgooZnVuY3Rpb24oKXsKCiAgICBvb3AuaW1wbGVtZW50KHRoaXMsIEV2ZW50RW1pdHRlcik7CgogICAgdGhpcy4kbm9ybWFsaXplUGF0aCA9IGZ1bmN0aW9uKHBhdGgpIHsKICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9eW2Etel0rOlwvXC9bXlwvXStcLy8sICIiKTsgLy8gUmVtb3ZlIGRvbWFpbiBuYW1lIGFuZCByZWJ1aWxkIGl0CiAgICAgICAgcGF0aCA9IGxvY2F0aW9uLnByb3RvY29sICsgIi8vIiArIGxvY2F0aW9uLmhvc3QKICAgICAgICAgICAgLy8gcGF0aHMgc3RhcnRpbmcgd2l0aCBhIHNsYXNoIGFyZSByZWxhdGl2ZSB0byB0aGUgcm9vdCAoaG9zdCkKICAgICAgICAgICAgKyAocGF0aC5jaGFyQXQoMCkgPT0gIi8iID8gIiIgOiBsb2NhdGlvbi5wYXRobmFtZS5yZXBsYWNlKC9cL1teXC9dKiQvLCAiIikpCiAgICAgICAgICAgICsgIi8iICsgcGF0aC5yZXBsYWNlKC9eW1wvXSsvLCAiIik7CiAgICAgICAgcmV0dXJuIHBhdGg7CiAgICB9OwoKICAgIHRoaXMuJGd1ZXNzQmFzZVBhdGggPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAocmVxdWlyZS5hY2VCYXNlVXJsKQogICAgICAgICAgICByZXR1cm4gcmVxdWlyZS5hY2VCYXNlVXJsOwoKICAgICAgICB2YXIgc2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKTsKICAgICAgICBmb3IgKHZhciBpPTA7IGk8c2NyaXB0cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgc2NyaXB0ID0gc2NyaXB0c1tpXTsKCiAgICAgICAgICAgIHZhciBiYXNlID0gc2NyaXB0LmdldEF0dHJpYnV0ZSgiZGF0YS1hY2UtYmFzZSIpOwogICAgICAgICAgICBpZiAoYmFzZSkKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlLnJlcGxhY2UoL1wvKiQvLCAiLyIpOwoKICAgICAgICAgICAgdmFyIHNyYyA9IHNjcmlwdC5zcmMgfHwgc2NyaXB0LmdldEF0dHJpYnV0ZSgic3JjIik7CiAgICAgICAgICAgIGlmICghc3JjKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbSA9IHNyYy5tYXRjaCgvXig/OiguKlwvKWFjZVwuanN8KC4qXC8pYWNlKC11bmNvbXByZXNzZWQpPygtbm9jb25mbGljdCk/XC5qcykoPzpcP3wkKS8pOwogICAgICAgICAgICBpZiAobSkKICAgICAgICAgICAgICAgIHJldHVybiBtWzFdIHx8IG1bMl07CiAgICAgICAgfQogICAgICAgIHJldHVybiAiIjsKICAgIH07CgogICAgdGhpcy50ZXJtaW5hdGUgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9lbWl0KCJ0ZXJtaW5hdGUiLCB7fSk7CiAgICAgICAgdGhpcy4kd29ya2VyLnRlcm1pbmF0ZSgpOwogICAgICAgIHRoaXMuJHdvcmtlciA9IG51bGw7CiAgICAgICAgdGhpcy4kZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwogICAgICAgIHRoaXMuJGRvYyA9IG51bGw7CiAgICB9OwoKICAgIHRoaXMuc2VuZCA9IGZ1bmN0aW9uKGNtZCwgYXJncykgewogICAgICAgIHRoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7Y29tbWFuZDogY21kLCBhcmdzOiBhcmdzfSk7CiAgICB9OwoKICAgIHRoaXMuY2FsbCA9IGZ1bmN0aW9uKGNtZCwgYXJncywgY2FsbGJhY2spIHsKICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5jYWxsYmFja0lkKys7CiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tzW2lkXSA9IGNhbGxiYWNrOwogICAgICAgICAgICBhcmdzLnB1c2goaWQpOwogICAgICAgIH0KICAgICAgICB0aGlzLnNlbmQoY21kLCBhcmdzKTsKICAgIH07CgogICAgdGhpcy5lbWl0ID0gZnVuY3Rpb24oZXZlbnQsIGRhdGEpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICAvLyBmaXJlZm94IHJlZnVzZXMgdG8gY2xvbmUgb2JqZWN0cyB3aGljaCBoYXZlIGZ1bmN0aW9uIHByb3BlcnRpZXMKICAgICAgICAgICAgLy8gVE9ETzogY2xlYW51cCBldmVudAogICAgICAgICAgICB0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2V2ZW50OiBldmVudCwgZGF0YToge2RhdGE6IGRhdGEuZGF0YX19KTsKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXgpIHt9CiAgICB9OwoKICAgIHRoaXMuYXR0YWNoVG9Eb2N1bWVudCA9IGZ1bmN0aW9uKGRvYykgewogICAgICAgIGlmKHRoaXMuJGRvYykKICAgICAgICAgICAgdGhpcy50ZXJtaW5hdGUoKTsKCiAgICAgICAgdGhpcy4kZG9jID0gZG9jOwogICAgICAgIHRoaXMuY2FsbCgic2V0VmFsdWUiLCBbZG9jLmdldFZhbHVlKCldKTsKICAgICAgICBkb2Mub24oImNoYW5nZSIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwogICAgfTsKCiAgICB0aGlzLmNoYW5nZUxpc3RlbmVyID0gZnVuY3Rpb24oZSkgewogICAgICAgIGUucmFuZ2UgPSB7CiAgICAgICAgICAgIHN0YXJ0OiBlLmRhdGEucmFuZ2Uuc3RhcnQsCiAgICAgICAgICAgIGVuZDogZS5kYXRhLnJhbmdlLmVuZAogICAgICAgIH07CiAgICAgICAgdGhpcy5lbWl0KCJjaGFuZ2UiLCBlKTsKICAgIH07Cgp9KS5jYWxsKFdvcmtlckNsaWVudC5wcm90b3R5cGUpOwoKZXhwb3J0cy5Xb3JrZXJDbGllbnQgPSBXb3JrZXJDbGllbnQ7Cgp9KTsKLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoKICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBDaHJpcyBTcGVuY2VyIDxjaHJpcy5hZy5zcGVuY2VyIEFUIGdvb2dsZW1haWwgRE9UIGNvbT4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvYmVoYXZpb3VyJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOwp2YXIgQmVoYXZpb3VyID0gcmVxdWlyZSgnLi4vYmVoYXZpb3VyJykuQmVoYXZpb3VyOwoKdmFyIENzdHlsZUJlaGF2aW91ciA9IGZ1bmN0aW9uICgpIHsKCiAgICB0aGlzLmFkZCgiYnJhY2VzIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsKICAgICAgICBpZiAodGV4dCA9PSAneycpIHsKICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOwogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsKICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAneycgKyBzZWxlY3RlZCArICd9JywKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7fScsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnfScpIHsKICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOwogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7CiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7CiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hpbmcgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQoJ30nLCB7Y29sdW1uOiBjdXJzb3IuY29sdW1uICsgMSwgcm93OiBjdXJzb3Iucm93fSk7CiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmcgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gIlxuIikgewogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsKICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsKICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsKICAgICAgICAgICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBzZXNzaW9uLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzogY3Vyc29yLnJvdywgY29sdW1uOiBjdXJzb3IuY29sdW1uICsgMX0pOwogICAgICAgICAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwoKICAgICAgICAgICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLmdldE5leHRMaW5lSW5kZW50KHN0YXRlLCBsaW5lLnN1YnN0cmluZygwLCBsaW5lLmxlbmd0aCAtIDEpLCBzZXNzaW9uLmdldFRhYlN0cmluZygpKTsKICAgICAgICAgICAgICAgIHZhciBuZXh0X2luZGVudCA9IHRoaXMuJGdldEluZGVudChzZXNzaW9uLmRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICdcbicgKyBpbmRlbnQgKyAnXG4nICsgbmV4dF9pbmRlbnQsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgaW5kZW50Lmxlbmd0aCwgMSwgaW5kZW50Lmxlbmd0aF0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgewogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7CiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICd7JykgewogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsKICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLmVuZC5jb2x1bW4sIHJhbmdlLmVuZC5jb2x1bW4gKyAxKTsKICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsKICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsKICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKICAgIHRoaXMuYWRkKCJwYXJlbnMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgewogICAgICAgIGlmICh0ZXh0ID09ICcoJykgewogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7CiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcoJyArIHNlbGVjdGVkICsgJyknLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygpJywKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICcpJykgewogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsKICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsKICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnKScpIHsKICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnKScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsKICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKICAgIHRoaXMuYWRkKCJwYXJlbnMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgewogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7CiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICcoJykgewogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsKICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiArIDEsIHJhbmdlLnN0YXJ0LmNvbHVtbiArIDIpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgewogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOwogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsKICAgICAgICBpZiAodGV4dCA9PSAnIicpIHsKICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOwogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsKICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIicgKyBzZWxlY3RlZCArICciJywKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7CiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7CiAgICAgICAgICAgICAgICB2YXIgbGVmdENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLTEsIGN1cnNvci5jb2x1bW4pOwoKICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGVzY2FwZWQuCiAgICAgICAgICAgICAgICBpZiAobGVmdENoYXIgPT0gJ1xcJykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIEZpbmQgd2hhdCB0b2tlbiB3ZSdyZSBpbnNpZGUuCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gc2Vzc2lvbi5nZXRUb2tlbnMoc2VsZWN0aW9uLnN0YXJ0LnJvdywgc2VsZWN0aW9uLnN0YXJ0LnJvdylbMF0udG9rZW5zOwogICAgICAgICAgICAgICAgdmFyIGNvbCA9IDAsIHRva2VuOwogICAgICAgICAgICAgICAgdmFyIHF1b3RlcG9zID0gLTE7IC8vIFRyYWNrIHdoZXRoZXIgd2UncmUgaW5zaWRlIGFuIG9wZW4gcXVvdGUuCgogICAgICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB0b2tlbnMubGVuZ3RoOyB4KyspIHsKICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2Vuc1t4XTsKICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PSAic3RyaW5nIikgewogICAgICAgICAgICAgICAgICAgICAgcXVvdGVwb3MgPSAtMTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHF1b3RlcG9zIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgcXVvdGVwb3MgPSB0b2tlbi52YWx1ZS5pbmRleE9mKCciJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgodG9rZW4udmFsdWUubGVuZ3RoICsgY29sKSA+IHNlbGVjdGlvbi5zdGFydC5jb2x1bW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbCArPSB0b2tlbnNbeF0udmFsdWUubGVuZ3RoOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFRyeSBhbmQgYmUgc21hcnQgYWJvdXQgd2hlbiB3ZSBhdXRvIGluc2VydC4KICAgICAgICAgICAgICAgIGlmICghdG9rZW4gfHwgKHF1b3RlcG9zIDwgMCAmJiB0b2tlbi50eXBlICE9PSAiY29tbWVudCIgJiYgKHRva2VuLnR5cGUgIT09ICJzdHJpbmciIHx8ICgoc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbiAhPT0gdG9rZW4udmFsdWUubGVuZ3RoK2NvbC0xKSAmJiB0b2tlbi52YWx1ZS5sYXN0SW5kZXhPZignIicpID09PSB0b2tlbi52YWx1ZS5sZW5ndGgtMSkpKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICciIicsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsMV0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuICYmIHRva2VuLnR5cGUgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGlucHV0IGFuZCBtb3ZlIHJpZ2h0IG9uZSBpZiB3ZSdyZSB0eXBpbmcgb3ZlciB0aGUgY2xvc2luZyBxdW90ZS4KICAgICAgICAgICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOwogICAgICAgICAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgewogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7CiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICciJykgewogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsKICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiArIDEsIHJhbmdlLnN0YXJ0LmNvbHVtbiArIDIpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICciJykgewogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOwogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9Cm9vcC5pbmhlcml0cyhDc3R5bGVCZWhhdmlvdXIsIEJlaGF2aW91cik7CgpleHBvcnRzLkNzdHlsZUJlaGF2aW91ciA9IENzdHlsZUJlaGF2aW91cjsKfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL3JhbmdlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOwp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOwp2YXIgQmFzZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZTsKCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Owpvb3AuaW5oZXJpdHMoRm9sZE1vZGUsIEJhc2VGb2xkTW9kZSk7CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSAvKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLzsKICAgIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIgPSAvXlteXFtce10qKFx9fFxdKXxeW1xzXCpdKihcKlwvKS87CiAgICAKICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsKICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOwogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpOwogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4OwoKICAgICAgICAgICAgaWYgKG1hdGNoWzFdKQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayhzZXNzaW9uLCBtYXRjaFsxXSwgcm93LCBpKTsKCiAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkgKyBtYXRjaFswXS5sZW5ndGgpOwogICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7CiAgICAgICAgICAgIHJldHVybiByYW5nZTsKICAgICAgICB9CgogICAgICAgIGlmIChmb2xkU3R5bGUgIT09ICJtYXJrYmVnaW5lbmQiKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIAogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2godGhpcy5mb2xkaW5nU3RvcE1hcmtlcik7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7CgogICAgICAgICAgICBpZiAobWF0Y2hbMl0pIHsKICAgICAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkpOwogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOwogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZW5kID0ge3Jvdzogcm93LCBjb2x1bW46IGl9OwogICAgICAgICAgICB2YXIgc3RhcnQgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQobWF0Y2hbMV0sIGVuZCk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoIXN0YXJ0KQogICAgICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICAgICAgc3RhcnQuY29sdW1uKys7CiAgICAgICAgICAgIGVuZC5jb2x1bW4tLTsKCiAgICAgICAgICAgIHJldHVybiAgUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsKICAgICAgICB9CiAgICB9OwogICAgCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsKCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsKCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9OwoKKGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyID0gbnVsbDsKICAgIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIgPSBudWxsOwoKICAgIC8vIG11c3QgcmV0dXJuICIiIGlmIHRoZXJlJ3Mgbm8gZm9sZCwgdG8gZW5hYmxlIGNhY2hpbmcKICAgIHRoaXMuZ2V0Rm9sZFdpZGdldCA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7CiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICBpZiAodGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChsaW5lKSkKICAgICAgICAgICAgcmV0dXJuICJzdGFydCI7CiAgICAgICAgaWYgKGZvbGRTdHlsZSA9PSAibWFya2JlZ2luZW5kIgogICAgICAgICAgICAgICAgJiYgdGhpcy5mb2xkaW5nU3RvcE1hcmtlcgogICAgICAgICAgICAgICAgJiYgdGhpcy5mb2xkaW5nU3RvcE1hcmtlci50ZXN0KGxpbmUpKQogICAgICAgICAgICByZXR1cm4gImVuZCI7CiAgICAgICAgcmV0dXJuICIiOwogICAgfTsKICAgIAogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgewogICAgICAgIHJldHVybiBudWxsOwogICAgfTsKCiAgICB0aGlzLmluZGVudGF0aW9uQmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCByb3csIGNvbHVtbikgewogICAgICAgIHZhciByZSA9IC9eXHMqLzsKICAgICAgICB2YXIgc3RhcnRSb3cgPSByb3c7CiAgICAgICAgdmFyIGVuZFJvdyA9IHJvdzsKICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOwogICAgICAgIHZhciBzdGFydENvbHVtbiA9IGNvbHVtbiB8fCBsaW5lLmxlbmd0aDsKICAgICAgICB2YXIgc3RhcnRMZXZlbCA9IGxpbmUubWF0Y2gocmUpWzBdLmxlbmd0aDsKICAgICAgICB2YXIgbWF4Um93ID0gc2Vzc2lvbi5nZXRMZW5ndGgoKQogICAgICAgIAogICAgICAgIHdoaWxlICgrK3JvdyA8IG1heFJvdykgewogICAgICAgICAgICBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgICAgIHZhciBsZXZlbCA9IGxpbmUubWF0Y2gocmUpWzBdLmxlbmd0aDsKCiAgICAgICAgICAgIGlmIChsZXZlbCA9PSBsaW5lLmxlbmd0aCkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgaWYgKGxldmVsIDw9IHN0YXJ0TGV2ZWwpCiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGVuZFJvdyA9IHJvdzsKICAgICAgICB9CgogICAgICAgIGlmIChlbmRSb3cgPiBzdGFydFJvdykgewogICAgICAgICAgICB2YXIgZW5kQ29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZFJvdykubGVuZ3RoOwogICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHN0YXJ0Um93LCBzdGFydENvbHVtbiwgZW5kUm93LCBlbmRDb2x1bW4pOwogICAgICAgIH0KICAgIH07CgogICAgdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgYnJhY2tldCwgcm93LCBjb2x1bW4pIHsKICAgICAgICB2YXIgc3RhcnQgPSB7cm93OiByb3csIGNvbHVtbjogY29sdW1uICsgMX07CiAgICAgICAgdmFyIGVuZCA9IHNlc3Npb24uJGZpbmRDbG9zaW5nQnJhY2tldChicmFja2V0LCBzdGFydCk7CiAgICAgICAgaWYgKCFlbmQpCiAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgdmFyIGZ3ID0gc2Vzc2lvbi5mb2xkV2lkZ2V0c1tlbmQucm93XTsKICAgICAgICBpZiAoZncgPT0gbnVsbCkKICAgICAgICAgICAgZncgPSB0aGlzLmdldEZvbGRXaWRnZXQoc2Vzc2lvbiwgZW5kLnJvdyk7CgogICAgICAgIGlmIChmdyA9PSAic3RhcnQiKSB7CiAgICAgICAgICAgIGVuZC5yb3cgLS07CiAgICAgICAgICAgIGVuZC5jb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kLnJvdykubGVuZ3RoOwogICAgICAgIH0KICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsKICAgIH07Cgp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7Cgp9KTsKOwogICAgICAgICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgewogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KSgpOwogICAgICAgIA==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-javascript.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9qYXZhc2NyaXB0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsImFjZS9yYW5nZSIsImFjZS93b3JrZXIvd29ya2VyX2NsaWVudCIsImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiKS5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMsaD1hKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudCxpPWEoIi4uL3JhbmdlIikuUmFuZ2Usaj1hKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudCxrPWEoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cixsPWEoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZSxtPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSksdGhpcy4kb3V0ZGVudD1uZXcgaCx0aGlzLiRiZWhhdmlvdXI9bmV3IGssdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGx9O2QuaW5oZXJpdHMobSxlKSxmdW5jdGlvbigpe3RoaXMudG9nZ2xlQ29tbWVudExpbmVzPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSEwLGY9L14oXHMqKVwvXC8vO2Zvcih2YXIgZz1jO2c8PWQ7ZysrKWlmKCFmLnRlc3QoYi5nZXRMaW5lKGcpKSl7ZT0hMTticmVha31pZihlKXt2YXIgaD1uZXcgaSgwLDAsMCwwKTtmb3IodmFyIGc9YztnPD1kO2crKyl7dmFyIGo9Yi5nZXRMaW5lKGcpLGs9ai5tYXRjaChmKTtoLnN0YXJ0LnJvdz1nLGguZW5kLnJvdz1nLGguZW5kLmNvbHVtbj1rWzBdLmxlbmd0aCxiLnJlcGxhY2UoaCxrWzFdKX19ZWxzZSBiLmluZGVudFJvd3MoYyxkLCIvLyIpfSx0aGlzLmdldE5leHRMaW5lSW5kZW50PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLiRnZXRJbmRlbnQoYiksZT10aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhiLGEpLGY9ZS50b2tlbnMsZz1lLnN0YXRlO2lmKGYubGVuZ3RoJiZmW2YubGVuZ3RoLTFdLnR5cGU9PSJjb21tZW50IilyZXR1cm4gZDtpZihhPT0ic3RhcnQifHxhPT0icmVnZXhfYWxsb3dlZCIpe3ZhciBoPWIubWF0Y2goL14uKig/OlxiY2FzZVxiLipcOnxbXHtcKFxbXSlccyokLyk7aCYmKGQrPWMpfWVsc2UgaWYoYT09ImRvYy1zdGFydCIpe2lmKGc9PSJzdGFydCJ8fGE9PSJyZWdleF9hbGxvd2VkIilyZXR1cm4iIjt2YXIgaD1iLm1hdGNoKC9eXHMqKFwvPylcKi8pO2gmJihoWzFdJiYoZCs9IiAiKSxkKz0iKiAiKX1yZXR1cm4gZH0sdGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChiLGMpfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGEsYixjKXt0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGIsYyl9LHRoaXMuY3JlYXRlV29ya2VyPWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBqKFsiYWNlIl0sIndvcmtlci1qYXZhc2NyaXB0LmpzIiwiYWNlL21vZGUvamF2YXNjcmlwdF93b3JrZXIiLCJKYXZhU2NyaXB0V29ya2VyIik7cmV0dXJuIGIuYXR0YWNoVG9Eb2N1bWVudChhLmdldERvY3VtZW50KCkpLGIub24oImpzbGludCIsZnVuY3Rpb24oYil7dmFyIGM9W107Zm9yKHZhciBkPTA7ZDxiLmRhdGEubGVuZ3RoO2QrKyl7dmFyIGU9Yi5kYXRhW2RdO2UmJmMucHVzaCh7cm93OmUubGluZS0xLGNvbHVtbjplLmNoYXJhY3Rlci0xLHRleHQ6ZS5yZWFzb24sdHlwZToid2FybmluZyIsbGludDplfSl9YS5zZXRBbm5vdGF0aW9ucyhjKX0pLGIub24oIm5hcmNpc3N1cyIsZnVuY3Rpb24oYil7YS5zZXRBbm5vdGF0aW9ucyhbYi5kYXRhXSl9KSxiLm9uKCJ0ZXJtaW5hdGUiLGZ1bmN0aW9uKCl7YS5jbGVhckFubm90YXRpb25zKCl9KSxifX0uY2FsbChtLnByb3RvdHlwZSksYi5Nb2RlPW19KSxkZWZpbmUoImFjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvdW5pY29kZSIsImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi4vdW5pY29kZSIpLGc9YSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsaD1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGk9ZnVuY3Rpb24oKXt2YXIgYT1lLmFycmF5VG9NYXAoIkFycmF5fEJvb2xlYW58RGF0ZXxGdW5jdGlvbnxJdGVyYXRvcnxOdW1iZXJ8T2JqZWN0fFJlZ0V4cHxTdHJpbmd8UHJveHl8TmFtZXNwYWNlfFFOYW1lfFhNTHxYTUxMaXN0fEFycmF5QnVmZmVyfEZsb2F0MzJBcnJheXxGbG9hdDY0QXJyYXl8SW50MTZBcnJheXxJbnQzMkFycmF5fEludDhBcnJheXxVaW50MTZBcnJheXxVaW50MzJBcnJheXxVaW50OEFycmF5fFVpbnQ4Q2xhbXBlZEFycmF5fEVycm9yfEV2YWxFcnJvcnxJbnRlcm5hbEVycm9yfFJhbmdlRXJyb3J8UmVmZXJlbmNlRXJyb3J8U3RvcEl0ZXJhdGlvbnxTeW50YXhFcnJvcnxUeXBlRXJyb3J8VVJJRXJyb3J8ZGVjb2RlVVJJfGRlY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZW5jb2RlVVJJQ29tcG9uZW50fGV2YWx8aXNGaW5pdGV8aXNOYU58cGFyc2VGbG9hdHxwYXJzZUludHxKU09OfE1hdGh8dGhpc3xhcmd1bWVudHN8cHJvdG90eXBlfHdpbmRvd3xkb2N1bWVudCIuc3BsaXQoInwiKSksYj1lLmFycmF5VG9NYXAoImJyZWFrfGNhc2V8Y2F0Y2h8Y29udGludWV8ZGVmYXVsdHxkZWxldGV8ZG98ZWxzZXxmaW5hbGx5fGZvcnxmdW5jdGlvbnxpZnxpbnxpbnN0YW5jZW9mfG5ld3xyZXR1cm58c3dpdGNofHRocm93fHRyeXx0eXBlb2Z8bGV0fHZhcnx3aGlsZXx3aXRofGNvbnN0fHlpZWxkfGltcG9ydHxnZXR8c2V0Ii5zcGxpdCgifCIpKSxjPSJjYXNlfGRvfGVsc2V8ZmluYWxseXxpbnxpbnN0YW5jZW9mfHJldHVybnx0aHJvd3x0cnl8dHlwZW9mfHlpZWxkIixkPWUuYXJyYXlUb01hcCgiX19wYXJlbnRfX3xfX2NvdW50X198ZXNjYXBlfHVuZXNjYXBlfHdpdGh8X19wcm90b19fIi5zcGxpdCgifCIpKSxoPWUuYXJyYXlUb01hcCgiY29uc3R8bGV0fHZhcnxmdW5jdGlvbiIuc3BsaXQoInwiKSksaT1lLmFycmF5VG9NYXAoIm51bGx8SW5maW5pdHl8TmFOfHVuZGVmaW5lZCIuc3BsaXQoInwiKSksaj1lLmFycmF5VG9NYXAoImNsYXNzfGVudW18ZXh0ZW5kc3xzdXBlcnxleHBvcnR8aW1wbGVtZW50c3xwcml2YXRlfHB1YmxpY3xpbnRlcmZhY2V8cGFja2FnZXxwcm90ZWN0ZWR8c3RhdGljIi5zcGxpdCgifCIpKSxrPSJbIitmLnBhY2thZ2VzLkwrIlxcJF9dWyIrZi5wYWNrYWdlcy5MK2YucGFja2FnZXMuTW4rZi5wYWNrYWdlcy5NYytmLnBhY2thZ2VzLk5kK2YucGFja2FnZXMuUGMrIlxcJF9dKlxcYiI7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJcXC9cXC8uKiQifSwobmV3IGcpLmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0Iikse3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwvXFwqIixuZXh0OiJjb21tZW50In0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OidbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJ30se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OidbIl0uKlxcXFwkJyxuZXh0OiJxcXN0cmluZyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiWyddLipcXFxcJCIsbmV4dDoicXN0cmluZyJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IjBbeFhdWzAtOWEtZkEtRl0rXFxiIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIifSx7dG9rZW46WyJrZXl3b3JkLmRlZmluaXRpb24iLCJ0ZXh0IiwiZW50aXR5Lm5hbWUuZnVuY3Rpb24iXSxyZWdleDoiKGZ1bmN0aW9uKShcXHMrKSgiK2srIikifSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLHJlZ2V4OiIoPzp0cnVlfGZhbHNlKVxcYiJ9LHt0b2tlbjoia2V5d29yZCIscmVnZXg6Iig/OiIrYysiKVxcYiIsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjpmdW5jdGlvbihjKXtyZXR1cm4gYS5oYXNPd25Qcm9wZXJ0eShjKT8idmFyaWFibGUubGFuZ3VhZ2UiOmQuaGFzT3duUHJvcGVydHkoYyk/ImludmFsaWQuZGVwcmVjYXRlZCI6aC5oYXNPd25Qcm9wZXJ0eShjKT8ia2V5d29yZC5kZWZpbml0aW9uIjpiLmhhc093blByb3BlcnR5KGMpPyJrZXl3b3JkIjppLmhhc093blByb3BlcnR5KGMpPyJjb25zdGFudC5sYW5ndWFnZSI6ai5oYXNPd25Qcm9wZXJ0eShjKT8iaW52YWxpZC5pbGxlZ2FsIjpjPT0iZGVidWdnZXIiPyJpbnZhbGlkLmRlcHJlY2F0ZWQiOiJpZGVudGlmaWVyIn0scmVnZXg6a30se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIixuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOiJwdW5jdHVhdGlvbi5vcGVyYXRvciIscmVnZXg6IlxcP3xcXDp8XFwsfFxcO3xcXC4iLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46InBhcmVuLmxwYXJlbiIscmVnZXg6IltbKHtdIixuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4OiJbXFxdKX1dIn0se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiXFwvPT8iLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJeIyEuKiQifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn1dLHJlZ2V4X2FsbG93ZWQ6W3t0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKiIsbmV4dDoiY29tbWVudF9yZWdleF9hbGxvd2VkIn0se3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwvXFwvLiokIn0se3Rva2VuOiJzdHJpbmcucmVnZXhwIixyZWdleDoiXFwvIixuZXh0OiJyZWdleCIsbWVyZ2U6ITB9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OiJzdGFydCJ9XSxyZWdleDpbe3Rva2VuOiJyZWdleHAua2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIixuZXh0OiJyZWdleCJ9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6Ii9cXHcqIixuZXh0OiJzdGFydCIsbWVyZ2U6ITB9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6IlteXFxcXC9cXFtdKyIsbmV4dDoicmVnZXgiLG1lcmdlOiEwfSx7dG9rZW46InN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIixyZWdleDoiXFxbIixuZXh0OiJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiLG1lcmdlOiEwfSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OiJzdGFydCJ9XSxyZWdleF9jaGFyYWN0ZXJfY2xhc3M6W3t0b2tlbjoicmVnZXhwLmtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsbmV4dDoicmVnZXhfY2hhcmFjdGVyX2NsYXNzIn0se3Rva2VuOiJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyIscmVnZXg6Il0iLG5leHQ6InJlZ2V4IixtZXJnZTohMH0se3Rva2VuOiJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyIscmVnZXg6IlteXFxcXFxcXV0rIixuZXh0OiJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiLG1lcmdlOiEwfSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OiJzdGFydCJ9XSxjb21tZW50X3JlZ2V4X2FsbG93ZWQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qP1xcKlxcLyIsbWVyZ2U6ITAsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLGNvbW1lbnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qP1xcKlxcLyIsbWVyZ2U6ITAsbmV4dDoic3RhcnQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxxcXN0cmluZzpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OicoPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/IicsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLHFzdHJpbmc6W3t0b2tlbjoic3RyaW5nIixyZWdleDoiKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqPyciLG5leHQ6InN0YXJ0In0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX0sdGhpcy5lbWJlZFJ1bGVzKGcsImRvYy0iLFsobmV3IGcpLmdldEVuZFJ1bGUoInN0YXJ0IildKX07ZC5pbmhlcml0cyhpLGgpLGIuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzPWl9KSxkZWZpbmUoImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsZj1mdW5jdGlvbigpe3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50LmRvYy50YWciLHJlZ2V4OiJAW1xcd1xcZF9dKyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlRPRE8ifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiW15AXFwqXSsifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiLiJ9XX19O2QuaW5oZXJpdHMoZixlKSxmdW5jdGlvbigpe3RoaXMuZ2V0U3RhcnRSdWxlPWZ1bmN0aW9uKGEpe3JldHVybnt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCooPz1cXCopIixuZXh0OmF9fSx0aGlzLmdldEVuZFJ1bGU9ZnVuY3Rpb24oYSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxcKlxcLyIsbmV4dDphfX19LmNhbGwoZi5wcm90b3R5cGUpLGIuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzPWZ9KSxkZWZpbmUoImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3JhbmdlIikuUmFuZ2UsZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuL15ccyskLy50ZXN0KGEpPy9eXHMqXH0vLnRlc3QoYik6ITF9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldExpbmUoYiksZT1jLm1hdGNoKC9eKFxzKlx9KS8pO2lmKCFlKXJldHVybiAwO3ZhciBmPWVbMV0ubGVuZ3RoLGc9YS5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6Yixjb2x1bW46Zn0pO2lmKCFnfHxnLnJvdz09YilyZXR1cm4gMDt2YXIgaD10aGlzLiRnZXRJbmRlbnQoYS5nZXRMaW5lKGcucm93KSk7YS5yZXBsYWNlKG5ldyBkKGIsMCxiLGYtMSksaCl9LHRoaXMuJGdldEluZGVudD1mdW5jdGlvbihhKXt2YXIgYj1hLm1hdGNoKC9eKFxzKykvKTtyZXR1cm4gYj9iWzFdOiIifX0pKS5jYWxsKGUucHJvdG90eXBlKSxiLk1hdGNoaW5nQnJhY2VPdXRkZW50PWV9KSxkZWZpbmUoImFjZS93b3JrZXIvd29ya2VyX2NsaWVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixmPWZ1bmN0aW9uKGIsZCxlLGYpe3RoaXMuY2hhbmdlTGlzdGVuZXI9dGhpcy5jaGFuZ2VMaXN0ZW5lci5iaW5kKHRoaXMpO2lmKGMucGFja2FnZWQpe3ZhciBnPXRoaXMuJGd1ZXNzQmFzZVBhdGgoKTt0aGlzLiR3b3JrZXI9bmV3IFdvcmtlcihnK2QpfWVsc2V7dmFyIGg9dGhpcy4kbm9ybWFsaXplUGF0aChhLm5hbWVUb1VybCgiYWNlL3dvcmtlci93b3JrZXIiLG51bGwsIl8iKSk7dGhpcy4kd29ya2VyPW5ldyBXb3JrZXIoaCk7dmFyIGk9e307Zm9yKHZhciBqPTA7ajxiLmxlbmd0aDtqKyspe3ZhciBrPWJbal0sbD10aGlzLiRub3JtYWxpemVQYXRoKGEubmFtZVRvVXJsKGssbnVsbCwiXyIpLnJlcGxhY2UoLy5qcyQvLCIiKSk7aVtrXT1sfX10aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2luaXQ6ITAsdGxuczppLG1vZHVsZTplLGNsYXNzbmFtZTpmfSksdGhpcy5jYWxsYmFja0lkPTEsdGhpcy5jYWxsYmFja3M9e307dmFyIG09dGhpczt0aGlzLiR3b3JrZXIub25lcnJvcj1mdW5jdGlvbihhKXt0aHJvdyB3aW5kb3cuY29uc29sZSYmY29uc29sZS5sb2cmJmNvbnNvbGUubG9nKGEpLGF9LHRoaXMuJHdvcmtlci5vbm1lc3NhZ2U9ZnVuY3Rpb24oYSl7dmFyIGI9YS5kYXRhO3N3aXRjaChiLnR5cGUpe2Nhc2UibG9nIjp3aW5kb3cuY29uc29sZSYmY29uc29sZS5sb2cmJmNvbnNvbGUubG9nKGIuZGF0YSk7YnJlYWs7Y2FzZSJldmVudCI6bS5fZW1pdChiLm5hbWUse2RhdGE6Yi5kYXRhfSk7YnJlYWs7Y2FzZSJjYWxsIjp2YXIgYz1tLmNhbGxiYWNrc1tiLmlkXTtjJiYoYyhiLmRhdGEpLGRlbGV0ZSBtLmNhbGxiYWNrc1tiLmlkXSl9fX07KChmdW5jdGlvbigpe2QuaW1wbGVtZW50KHRoaXMsZSksdGhpcy4kbm9ybWFsaXplUGF0aD1mdW5jdGlvbihhKXtyZXR1cm4gYT1hLnJlcGxhY2UoL15bYS16XSs6XC9cL1teXC9dK1wvLywiIiksYT1sb2NhdGlvbi5wcm90b2NvbCsiLy8iK2xvY2F0aW9uLmhvc3QrKGEuY2hhckF0KDApPT0iLyI/IiI6bG9jYXRpb24ucGF0aG5hbWUucmVwbGFjZSgvXC9bXlwvXSokLywiIikpKyIvIithLnJlcGxhY2UoL15bXC9dKy8sIiIpLGF9LHRoaXMuJGd1ZXNzQmFzZVBhdGg9ZnVuY3Rpb24oKXtpZihhLmFjZUJhc2VVcmwpcmV0dXJuIGEuYWNlQmFzZVVybDt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPWJbY10sZT1kLmdldEF0dHJpYnV0ZSgiZGF0YS1hY2UtYmFzZSIpO2lmKGUpcmV0dXJuIGUucmVwbGFjZSgvXC8qJC8sIi8iKTt2YXIgZj1kLnNyY3x8ZC5nZXRBdHRyaWJ1dGUoInNyYyIpO2lmKCFmKWNvbnRpbnVlO3ZhciBnPWYubWF0Y2goL14oPzooLipcLylhY2VcLmpzfCguKlwvKWFjZSgtdW5jb21wcmVzc2VkKT8oLW5vY29uZmxpY3QpP1wuanMpKD86XD98JCkvKTtpZihnKXJldHVybiBnWzFdfHxnWzJdfXJldHVybiIifSx0aGlzLnRlcm1pbmF0ZT1mdW5jdGlvbigpe3RoaXMuX2VtaXQoInRlcm1pbmF0ZSIse30pLHRoaXMuJHdvcmtlci50ZXJtaW5hdGUoKSx0aGlzLiR3b3JrZXI9bnVsbCx0aGlzLiRkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix0aGlzLmNoYW5nZUxpc3RlbmVyKSx0aGlzLiRkb2M9bnVsbH0sdGhpcy5zZW5kPWZ1bmN0aW9uKGEsYil7dGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtjb21tYW5kOmEsYXJnczpifSl9LHRoaXMuY2FsbD1mdW5jdGlvbihhLGIsYyl7aWYoYyl7dmFyIGQ9dGhpcy5jYWxsYmFja0lkKys7dGhpcy5jYWxsYmFja3NbZF09YyxiLnB1c2goZCl9dGhpcy5zZW5kKGEsYil9LHRoaXMuZW1pdD1mdW5jdGlvbihhLGIpe3RyeXt0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2V2ZW50OmEsZGF0YTp7ZGF0YTpiLmRhdGF9fSl9Y2F0Y2goYyl7fX0sdGhpcy5hdHRhY2hUb0RvY3VtZW50PWZ1bmN0aW9uKGEpe3RoaXMuJGRvYyYmdGhpcy50ZXJtaW5hdGUoKSx0aGlzLiRkb2M9YSx0aGlzLmNhbGwoInNldFZhbHVlIixbYS5nZXRWYWx1ZSgpXSksYS5vbigiY2hhbmdlIix0aGlzLmNoYW5nZUxpc3RlbmVyKX0sdGhpcy5jaGFuZ2VMaXN0ZW5lcj1mdW5jdGlvbihhKXthLnJhbmdlPXtzdGFydDphLmRhdGEucmFuZ2Uuc3RhcnQsZW5kOmEuZGF0YS5yYW5nZS5lbmR9LHRoaXMuZW1pdCgiY2hhbmdlIixhKX19KSkuY2FsbChmLnByb3RvdHlwZSksYi5Xb3JrZXJDbGllbnQ9Zn0pLGRlZmluZSgiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvYmVoYXZpb3VyIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXIsZj1mdW5jdGlvbigpe3RoaXMuYWRkKCJicmFjZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09InsiKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7cmV0dXJuIGchPT0iIj97dGV4dDoieyIrZysifSIsc2VsZWN0aW9uOiExfTp7dGV4dDoie30iLHNlbGVjdGlvbjpbMSwxXX19aWYoZT09In0iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSJ9Iil7dmFyIGs9ZC4kZmluZE9wZW5pbmdCcmFja2V0KCJ9Iix7Y29sdW1uOmguY29sdW1uKzEscm93Omgucm93fSk7aWYoayE9PW51bGwpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19ZWxzZSBpZihlPT0iXG4iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSJ9Iil7dmFyIGw9ZC5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6aC5yb3csY29sdW1uOmguY29sdW1uKzF9KTtpZighbClyZXR1cm4gbnVsbDt2YXIgbT10aGlzLmdldE5leHRMaW5lSW5kZW50KGEsaS5zdWJzdHJpbmcoMCxpLmxlbmd0aC0xKSxkLmdldFRhYlN0cmluZygpKSxuPXRoaXMuJGdldEluZGVudChkLmRvYy5nZXRMaW5lKGwucm93KSk7cmV0dXJue3RleHQ6IlxuIittKyJcbiIrbixzZWxlY3Rpb246WzEsbS5sZW5ndGgsMSxtLmxlbmd0aF19fX19KSx0aGlzLmFkZCgiYnJhY2VzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSJ7Iil7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLmVuZC5jb2x1bW4sZS5lbmQuY29sdW1uKzEpO2lmKGg9PSJ9IilyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KSx0aGlzLmFkZCgicGFyZW5zIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSIoIil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/e3RleHQ6IigiK2crIikiLHNlbGVjdGlvbjohMX06e3RleHQ6IigpIixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSIpIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0iKSIpe3ZhciBrPWQuJGZpbmRPcGVuaW5nQnJhY2tldCgiKSIse2NvbHVtbjpoLmNvbHVtbisxLHJvdzpoLnJvd30pO2lmKGshPT1udWxsKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJwYXJlbnMiLCJkZWxldGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1kLmRvYy5nZXRUZXh0UmFuZ2UoZSk7aWYoIWUuaXNNdWx0aUxpbmUoKSYmZj09IigiKXt2YXIgZz1kLmRvYy5nZXRMaW5lKGUuc3RhcnQucm93KSxoPWcuc3Vic3RyaW5nKGUuc3RhcnQuY29sdW1uKzEsZS5zdGFydC5jb2x1bW4rMik7aWYoaD09IikiKXJldHVybiBlLmVuZC5jb2x1bW4rKyxlfX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0nIicpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtpZihnIT09IiIpcmV0dXJue3RleHQ6JyInK2crJyInLHNlbGVjdGlvbjohMX07dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbi0xLGguY29sdW1uKTtpZihqPT0iXFwiKXJldHVybiBudWxsO3ZhciBrPWQuZ2V0VG9rZW5zKGYuc3RhcnQucm93LGYuc3RhcnQucm93KVswXS50b2tlbnMsbD0wLG0sbj0tMTtmb3IodmFyIG89MDtvPGsubGVuZ3RoO28rKyl7bT1rW29dLG0udHlwZT09InN0cmluZyI/bj0tMTpuPDAmJihuPW0udmFsdWUuaW5kZXhPZignIicpKTtpZihtLnZhbHVlLmxlbmd0aCtsPmYuc3RhcnQuY29sdW1uKWJyZWFrO2wrPWtbb10udmFsdWUubGVuZ3RofWlmKCFtfHxuPDAmJm0udHlwZSE9PSJjb21tZW50IiYmKG0udHlwZSE9PSJzdHJpbmcifHxmLnN0YXJ0LmNvbHVtbiE9PW0udmFsdWUubGVuZ3RoK2wtMSYmbS52YWx1ZS5sYXN0SW5kZXhPZignIicpPT09bS52YWx1ZS5sZW5ndGgtMSkpcmV0dXJue3RleHQ6JyIiJyxzZWxlY3Rpb246WzEsMV19O2lmKG0mJm0udHlwZT09PSJzdHJpbmciKXt2YXIgcD1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihwPT0nIicpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19fSksdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSciJyl7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbisxLGUuc3RhcnQuY29sdW1uKzIpO2lmKGg9PSciJylyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KX07ZC5pbmhlcml0cyhmLGUpLGIuQ3N0eWxlQmVoYXZpb3VyPWZ9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvcmFuZ2UiLCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxmPWEoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGUsZz1iLkZvbGRNb2RlPWZ1bmN0aW9uKCl7fTtkLmluaGVyaXRzKGcsZiksZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj0vKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLyx0aGlzLmZvbGRpbmdTdG9wTWFya2VyPS9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLyx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpLGY9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7aWYoZil7dmFyIGc9Zi5pbmRleDtpZihmWzFdKXJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soYSxmWzFdLGMsZyk7dmFyIGg9YS5nZXRDb21tZW50Rm9sZFJhbmdlKGMsZytmWzBdLmxlbmd0aCk7cmV0dXJuIGguZW5kLmNvbHVtbi09MixofWlmKGIhPT0ibWFya2JlZ2luZW5kIilyZXR1cm47dmFyIGY9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTtpZihmKXt2YXIgZz1mLmluZGV4K2ZbMF0ubGVuZ3RoO2lmKGZbMl0pe3ZhciBoPWEuZ2V0Q29tbWVudEZvbGRSYW5nZShjLGcpO3JldHVybiBoLmVuZC5jb2x1bW4tPTIsaH12YXIgaT17cm93OmMsY29sdW1uOmd9LGo9YS4kZmluZE9wZW5pbmdCcmFja2V0KGZbMV0saSk7aWYoIWopcmV0dXJuO3JldHVybiBqLmNvbHVtbisrLGkuY29sdW1uLS0sZS5mcm9tUG9pbnRzKGosaSl9fX0uY2FsbChnLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGU9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPW51bGwsdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj1udWxsLHRoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpO3JldHVybiB0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGQpPyJzdGFydCI6Yj09Im1hcmtiZWdpbmVuZCImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChkKT8iZW5kIjoiIn0sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBudWxsfSx0aGlzLmluZGVudGF0aW9uQmxvY2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPS9eXHMqLyxmPWIsZz1iLGg9YS5nZXRMaW5lKGIpLGk9Y3x8aC5sZW5ndGgsaj1oLm1hdGNoKGUpWzBdLmxlbmd0aCxrPWEuZ2V0TGVuZ3RoKCk7d2hpbGUoKytiPGspe2g9YS5nZXRMaW5lKGIpO3ZhciBsPWgubWF0Y2goZSlbMF0ubGVuZ3RoO2lmKGw9PWgubGVuZ3RoKWNvbnRpbnVlO2lmKGw8PWopYnJlYWs7Zz1ifWlmKGc+Zil7dmFyIG09YS5nZXRMaW5lKGcpLmxlbmd0aDtyZXR1cm4gbmV3IGQoZixpLGcsbSl9fSx0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2s9ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGY9e3JvdzpjLGNvbHVtbjplKzF9LGc9YS4kZmluZENsb3NpbmdCcmFja2V0KGIsZik7aWYoIWcpcmV0dXJuO3ZhciBoPWEuZm9sZFdpZGdldHNbZy5yb3ddO3JldHVybiBoPT1udWxsJiYoaD10aGlzLmdldEZvbGRXaWRnZXQoYSxnLnJvdykpLGg9PSJzdGFydCImJihnLnJvdy0tLGcuY29sdW1uPWEuZ2V0TGluZShnLnJvdykubGVuZ3RoKSxkLmZyb21Qb2ludHMoZixnKX19KSkuY2FsbChlLnByb3RvdHlwZSl9KSxmdW5jdGlvbigpe3dpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLGZ1bmN0aW9uKGEpe3dpbmRvdy5hY2V8fCh3aW5kb3cuYWNlPXt9KTtmb3IodmFyIGIgaW4gYSlhLmhhc093blByb3BlcnR5KGIpJiYoYWNlW2JdPWFbYl0pfSl9KCk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-json-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9qc29uJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvanNvbl9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOwp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOwp2YXIgSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2pzb25faGlnaGxpZ2h0X3J1bGVzIikuSnNvbkhpZ2hsaWdodFJ1bGVzOwp2YXIgTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSByZXF1aXJlKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudDsKdmFyIENzdHlsZUJlaGF2aW91ciA9IHJlcXVpcmUoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cjsKdmFyIENTdHlsZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlOwoKdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IEhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7CiAgICB0aGlzLiRvdXRkZW50ID0gbmV3IE1hdGNoaW5nQnJhY2VPdXRkZW50KCk7CiAgICB0aGlzLiRiZWhhdmlvdXIgPSBuZXcgQ3N0eWxlQmVoYXZpb3VyKCk7CiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBDU3R5bGVGb2xkTW9kZSgpOwp9Owpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOwoKKGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7CiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsKCiAgICAgICAgaWYgKHN0YXRlID09ICJzdGFydCIpIHsKICAgICAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXi4qW1x7XChcW11ccyokLyk7CiAgICAgICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGluZGVudDsKICAgIH07CgogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgaW5wdXQpIHsKICAgICAgICByZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQobGluZSwgaW5wdXQpOwogICAgfTsKCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgcm93KSB7CiAgICAgICAgdGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChkb2MsIHJvdyk7CiAgICB9OwogICAgCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOwoKZXhwb3J0cy5Nb2RlID0gTW9kZTsKfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKiAgICAgIE1paGFpIFN1Y2FuIDxtaWhhaSBET1Qgc3VjYW4gQVQgZ21haWwgRE9UIGNvbT4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvanNvbl9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsKCnZhciBKc29uSGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsKCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMuIFVzZSAoPzopIGluc3RlYWQuCiAgICAvLyByZWdleHBzIGFyZSBvcmRlcmVkIC0+IHRoZSBmaXJzdCBtYXRjaCBpcyB1c2VkCiAgICB0aGlzLiRydWxlcyA9IHsKICAgICAgICAic3RhcnQiIDogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXScKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleAogICAgICAgICAgICAgICAgcmVnZXggOiAiMFt4WF1bMC05YS1mQS1GXStcXGIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdAogICAgICAgICAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLAogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86dHJ1ZXxmYWxzZSlcXGIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImludmFsaWQuaWxsZWdhbCIsIC8vIHNpbmdsZSBxdW90ZWQgc3RyaW5ncyBhcmUgbm90IGFsbG93ZWQKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10iCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImludmFsaWQuaWxsZWdhbCIsIC8vIGNvbW1lbnRzIGFyZSBub3QgYWxsb3dlZAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwvLiokIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5scGFyZW4iLAogICAgICAgICAgICAgICAgcmVnZXggOiAiW1soe10iCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9OwogICAgCn07Cgpvb3AuaW5oZXJpdHMoSnNvbkhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOwoKZXhwb3J0cy5Kc29uSGlnaGxpZ2h0UnVsZXMgPSBKc29uSGlnaGxpZ2h0UnVsZXM7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsKCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IGZ1bmN0aW9uKCkge307CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihsaW5lLCBpbnB1dCkgewogICAgICAgIGlmICghIC9eXHMrJC8udGVzdChsaW5lKSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgICByZXR1cm4gL15ccypcfS8udGVzdChpbnB1dCk7CiAgICB9OwoKICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihkb2MsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocm93KTsKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKlx9KS8pOwoKICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDsKCiAgICAgICAgdmFyIGNvbHVtbiA9IG1hdGNoWzFdLmxlbmd0aDsKICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gZG9jLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn0pOwoKICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcyB8fCBvcGVuQnJhY2VQb3Mucm93ID09IHJvdykgcmV0dXJuIDA7CgogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOwogICAgICAgIGRvYy5yZXBsYWNlKG5ldyBSYW5nZShyb3csIDAsIHJvdywgY29sdW1uLTEpLCBpbmRlbnQpOwogICAgfTsKCiAgICB0aGlzLiRnZXRJbmRlbnQgPSBmdW5jdGlvbihsaW5lKSB7CiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAiIjsKICAgIH07Cgp9KS5jYWxsKE1hdGNoaW5nQnJhY2VPdXRkZW50LnByb3RvdHlwZSk7CgpleHBvcnRzLk1hdGNoaW5nQnJhY2VPdXRkZW50ID0gTWF0Y2hpbmdCcmFjZU91dGRlbnQ7Cn0pOwovKiB2aW06dHM9NDpzdHM9NDpzdz00OgogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIENocmlzIFNwZW5jZXIgPGNocmlzLmFnLnNwZW5jZXIgQVQgZ29vZ2xlbWFpbCBET1QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9iZWhhdmlvdXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7CnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCcuLi9iZWhhdmlvdXInKS5CZWhhdmlvdXI7Cgp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gZnVuY3Rpb24gKCkgewoKICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgewogICAgICAgIGlmICh0ZXh0ID09ICd7JykgewogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7CiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7JyArIHNlbGVjdGVkICsgJ30nLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3t9JywKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICd9JykgewogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsKICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsKICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsKICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnfScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsKICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAiXG4iKSB7CiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9JykgewogICAgICAgICAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IHNlc3Npb24uZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiBjdXJzb3Iucm93LCBjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxfSk7CiAgICAgICAgICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcykKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CgogICAgICAgICAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQoc3RhdGUsIGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUubGVuZ3RoIC0gMSksIHNlc3Npb24uZ2V0VGFiU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgdmFyIG5leHRfaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOwoKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xuJyArIGluZGVudCArICdcbicgKyBuZXh0X2luZGVudCwKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCBpbmRlbnQubGVuZ3RoLCAxLCBpbmRlbnQubGVuZ3RoXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoImJyYWNlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7CiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsKICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJ3snKSB7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2UuZW5kLmNvbHVtbiwgcmFuZ2UuZW5kLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9JykgewogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOwogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoInBhcmVucyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7CiAgICAgICAgaWYgKHRleHQgPT0gJygnKSB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7CiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygnICsgc2VsZWN0ZWQgKyAnKScsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCknLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJyknKSB7CiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgewogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCcpJywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOwogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoInBhcmVucyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7CiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsKICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJygnKSB7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgewogICAgICAgIGlmICh0ZXh0ID09ICciJykgewogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7CiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICciJyArIHNlbGVjdGVkICsgJyInLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsKICAgICAgICAgICAgICAgIHZhciBsZWZ0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4tMSwgY3Vyc29yLmNvbHVtbik7CgogICAgICAgICAgICAgICAgLy8gV2UncmUgZXNjYXBlZC4KICAgICAgICAgICAgICAgIGlmIChsZWZ0Q2hhciA9PSAnXFwnKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gRmluZCB3aGF0IHRva2VuIHdlJ3JlIGluc2lkZS4KICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzZXNzaW9uLmdldFRva2VucyhzZWxlY3Rpb24uc3RhcnQucm93LCBzZWxlY3Rpb24uc3RhcnQucm93KVswXS50b2tlbnM7CiAgICAgICAgICAgICAgICB2YXIgY29sID0gMCwgdG9rZW47CiAgICAgICAgICAgICAgICB2YXIgcXVvdGVwb3MgPSAtMTsgLy8gVHJhY2sgd2hldGhlciB3ZSdyZSBpbnNpZGUgYW4gb3BlbiBxdW90ZS4KCiAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRva2Vucy5sZW5ndGg7IHgrKykgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW3hdOwogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IC0xOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocXVvdGVwb3MgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IHRva2VuLnZhbHVlLmluZGV4T2YoJyInKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0b2tlbi52YWx1ZS5sZW5ndGggKyBjb2wpID4gc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbikgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29sICs9IHRva2Vuc1t4XS52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gVHJ5IGFuZCBiZSBzbWFydCBhYm91dCB3aGVuIHdlIGF1dG8gaW5zZXJ0LgogICAgICAgICAgICAgICAgaWYgKCF0b2tlbiB8fCAocXVvdGVwb3MgPCAwICYmIHRva2VuLnR5cGUgIT09ICJjb21tZW50IiAmJiAodG9rZW4udHlwZSAhPT0gInN0cmluZyIgfHwgKChzZWxlY3Rpb24uc3RhcnQuY29sdW1uICE9PSB0b2tlbi52YWx1ZS5sZW5ndGgrY29sLTEpICYmIHRva2VuLnZhbHVlLmxhc3RJbmRleE9mKCciJykgPT09IHRva2VuLnZhbHVlLmxlbmd0aC0xKSkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJyIiJywKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwxXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gJiYgdG9rZW4udHlwZSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaW5wdXQgYW5kIG1vdmUgcmlnaHQgb25lIGlmIHdlJ3JlIHR5cGluZyBvdmVyIHRoZSBjbG9zaW5nIHF1b3RlLgogICAgICAgICAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7CiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsKICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJyInKSB7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCn0Kb29wLmluaGVyaXRzKENzdHlsZUJlaGF2aW91ciwgQmVoYXZpb3VyKTsKCmV4cG9ydHMuQ3N0eWxlQmVoYXZpb3VyID0gQ3N0eWxlQmVoYXZpb3VyOwp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7CnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7CnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOwoKdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307Cm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IC8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvOwogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IC9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLzsKICAgIAogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXg7CgogICAgICAgICAgICBpZiAobWF0Y2hbMV0pCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKHNlc3Npb24sIG1hdGNoWzFdLCByb3csIGkpOwoKICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSArIG1hdGNoWzBdLmxlbmd0aCk7CiAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsKICAgICAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGZvbGRTdHlsZSAhPT0gIm1hcmtiZWdpbmVuZCIpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDsKCiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkgewogICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSk7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiByb3csIGNvbHVtbjogaX07CiAgICAgICAgICAgIHZhciBzdGFydCA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldChtYXRjaFsxXSwgZW5kKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICghc3RhcnQpCiAgICAgICAgICAgICAgICByZXR1cm47CgogICAgICAgICAgICBzdGFydC5jb2x1bW4rKzsKICAgICAgICAgICAgZW5kLmNvbHVtbi0tOwoKICAgICAgICAgICAgcmV0dXJuICBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOwogICAgICAgIH0KICAgIH07CiAgICAKfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOwoKfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOwoKdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSBudWxsOwogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7CgogICAgLy8gbXVzdCByZXR1cm4gIiIgaWYgdGhlcmUncyBubyBmb2xkLCB0byBlbmFibGUgY2FjaGluZwogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsKICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOwogICAgICAgIGlmICh0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGxpbmUpKQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsKICAgICAgICBpZiAoZm9sZFN0eWxlID09ICJtYXJrYmVnaW5lbmQiCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpCiAgICAgICAgICAgIHJldHVybiAiZW5kIjsKICAgICAgICByZXR1cm4gIiI7CiAgICB9OwogICAgCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7CiAgICAgICAgdmFyIHJlID0gL15ccyovOwogICAgICAgIHZhciBzdGFydFJvdyA9IHJvdzsKICAgICAgICB2YXIgZW5kUm93ID0gcm93OwogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgdmFyIHN0YXJ0Q29sdW1uID0gY29sdW1uIHx8IGxpbmUubGVuZ3RoOwogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOwogICAgICAgIHZhciBtYXhSb3cgPSBzZXNzaW9uLmdldExlbmd0aCgpCiAgICAgICAgCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7CiAgICAgICAgICAgIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICAgICAgdmFyIGxldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOwoKICAgICAgICAgICAgaWYgKGxldmVsID09IGxpbmUubGVuZ3RoKQogICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICBpZiAobGV2ZWwgPD0gc3RhcnRMZXZlbCkKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgZW5kUm93ID0gcm93OwogICAgICAgIH0KCiAgICAgICAgaWYgKGVuZFJvdyA+IHN0YXJ0Um93KSB7CiAgICAgICAgICAgIHZhciBlbmRDb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kUm93KS5sZW5ndGg7CiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7CiAgICAgICAgfQogICAgfTsKCiAgICB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCBicmFja2V0LCByb3csIGNvbHVtbikgewogICAgICAgIHZhciBzdGFydCA9IHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW4gKyAxfTsKICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsKICAgICAgICBpZiAoIWVuZCkKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICB2YXIgZncgPSBzZXNzaW9uLmZvbGRXaWRnZXRzW2VuZC5yb3ddOwogICAgICAgIGlmIChmdyA9PSBudWxsKQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsKCiAgICAgICAgaWYgKGZ3ID09ICJzdGFydCIpIHsKICAgICAgICAgICAgZW5kLnJvdyAtLTsKICAgICAgICAgICAgZW5kLmNvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmQucm93KS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOwogICAgfTsKCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsKCn0pOwo7CiAgICAgICAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAg]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-json.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9qc29uIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL2pzb25faGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vanNvbl9oaWdobGlnaHRfcnVsZXMiKS5Kc29uSGlnaGxpZ2h0UnVsZXMsaD1hKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudCxpPWEoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cixqPWEoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZSxrPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSksdGhpcy4kb3V0ZGVudD1uZXcgaCx0aGlzLiRiZWhhdmlvdXI9bmV3IGksdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGp9O2QuaW5oZXJpdHMoayxlKSxmdW5jdGlvbigpe3RoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuJGdldEluZGVudChiKTtpZihhPT0ic3RhcnQiKXt2YXIgZT1iLm1hdGNoKC9eLipbXHtcKFxbXVxzKiQvKTtlJiYoZCs9Yyl9cmV0dXJuIGR9LHRoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQoYixjKX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7dGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChiLGMpfX0uY2FsbChrLnByb3RvdHlwZSksYi5Nb2RlPWt9KSxkZWZpbmUoImFjZS9tb2RlL2pzb25faGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxmPWZ1bmN0aW9uKCl7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46InN0cmluZyIscmVnZXg6J1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nfSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIwW3hYXVswLTlhLWZBLUZdK1xcYiJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIn0se3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5ib29sZWFuIixyZWdleDoiKD86dHJ1ZXxmYWxzZSlcXGIifSx7dG9rZW46ImludmFsaWQuaWxsZWdhbCIscmVnZXg6IlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10ifSx7dG9rZW46ImludmFsaWQuaWxsZWdhbCIscmVnZXg6IlxcL1xcLy4qJCJ9LHt0b2tlbjoicGFyZW4ubHBhcmVuIixyZWdleDoiW1soe10ifSx7dG9rZW46InBhcmVuLnJwYXJlbiIscmVnZXg6IltcXF0pfV0ifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn1dfX07ZC5pbmhlcml0cyhmLGUpLGIuSnNvbkhpZ2hsaWdodFJ1bGVzPWZ9KSxkZWZpbmUoImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3JhbmdlIikuUmFuZ2UsZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuL15ccyskLy50ZXN0KGEpPy9eXHMqXH0vLnRlc3QoYik6ITF9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldExpbmUoYiksZT1jLm1hdGNoKC9eKFxzKlx9KS8pO2lmKCFlKXJldHVybiAwO3ZhciBmPWVbMV0ubGVuZ3RoLGc9YS5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6Yixjb2x1bW46Zn0pO2lmKCFnfHxnLnJvdz09YilyZXR1cm4gMDt2YXIgaD10aGlzLiRnZXRJbmRlbnQoYS5nZXRMaW5lKGcucm93KSk7YS5yZXBsYWNlKG5ldyBkKGIsMCxiLGYtMSksaCl9LHRoaXMuJGdldEluZGVudD1mdW5jdGlvbihhKXt2YXIgYj1hLm1hdGNoKC9eKFxzKykvKTtyZXR1cm4gYj9iWzFdOiIifX0pKS5jYWxsKGUucHJvdG90eXBlKSxiLk1hdGNoaW5nQnJhY2VPdXRkZW50PWV9KSxkZWZpbmUoImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL2JlaGF2aW91ciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vYmVoYXZpb3VyIikuQmVoYXZpb3VyLGY9ZnVuY3Rpb24oKXt0aGlzLmFkZCgiYnJhY2VzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSJ7Iil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/e3RleHQ6InsiK2crIn0iLHNlbGVjdGlvbjohMX06e3RleHQ6Int9IixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSJ9Iil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0ifSIpe3ZhciBrPWQuJGZpbmRPcGVuaW5nQnJhY2tldCgifSIse2NvbHVtbjpoLmNvbHVtbisxLHJvdzpoLnJvd30pO2lmKGshPT1udWxsKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fWVsc2UgaWYoZT09IlxuIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0ifSIpe3ZhciBsPWQuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93Omgucm93LGNvbHVtbjpoLmNvbHVtbisxfSk7aWYoIWwpcmV0dXJuIG51bGw7dmFyIG09dGhpcy5nZXROZXh0TGluZUluZGVudChhLGkuc3Vic3RyaW5nKDAsaS5sZW5ndGgtMSksZC5nZXRUYWJTdHJpbmcoKSksbj10aGlzLiRnZXRJbmRlbnQoZC5kb2MuZ2V0TGluZShsLnJvdykpO3JldHVybnt0ZXh0OiJcbiIrbSsiXG4iK24sc2VsZWN0aW9uOlsxLG0ubGVuZ3RoLDEsbS5sZW5ndGhdfX19fSksdGhpcy5hZGQoImJyYWNlcyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0ieyIpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5lbmQuY29sdW1uLGUuZW5kLmNvbHVtbisxKTtpZihoPT0ifSIpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSksdGhpcy5hZGQoInBhcmVucyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0iKCIpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtyZXR1cm4gZyE9PSIiP3t0ZXh0OiIoIitnKyIpIixzZWxlY3Rpb246ITF9Ont0ZXh0OiIoKSIsc2VsZWN0aW9uOlsxLDFdfX1pZihlPT0iKSIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09IikiKXt2YXIgaz1kLiRmaW5kT3BlbmluZ0JyYWNrZXQoIikiLHtjb2x1bW46aC5jb2x1bW4rMSxyb3c6aC5yb3d9KTtpZihrIT09bnVsbClyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX19KSx0aGlzLmFkZCgicGFyZW5zIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSIoIil7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbisxLGUuc3RhcnQuY29sdW1uKzIpO2lmKGg9PSIpIilyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KSx0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09JyInKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7aWYoZyE9PSIiKXJldHVybnt0ZXh0OiciJytnKyciJyxzZWxlY3Rpb246ITF9O3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4tMSxoLmNvbHVtbik7aWYoaj09IlxcIilyZXR1cm4gbnVsbDt2YXIgaz1kLmdldFRva2VucyhmLnN0YXJ0LnJvdyxmLnN0YXJ0LnJvdylbMF0udG9rZW5zLGw9MCxtLG49LTE7Zm9yKHZhciBvPTA7bzxrLmxlbmd0aDtvKyspe209a1tvXSxtLnR5cGU9PSJzdHJpbmciP249LTE6bjwwJiYobj1tLnZhbHVlLmluZGV4T2YoJyInKSk7aWYobS52YWx1ZS5sZW5ndGgrbD5mLnN0YXJ0LmNvbHVtbilicmVhaztsKz1rW29dLnZhbHVlLmxlbmd0aH1pZighbXx8bjwwJiZtLnR5cGUhPT0iY29tbWVudCImJihtLnR5cGUhPT0ic3RyaW5nInx8Zi5zdGFydC5jb2x1bW4hPT1tLnZhbHVlLmxlbmd0aCtsLTEmJm0udmFsdWUubGFzdEluZGV4T2YoJyInKT09PW0udmFsdWUubGVuZ3RoLTEpKXJldHVybnt0ZXh0OiciIicsc2VsZWN0aW9uOlsxLDFdfTtpZihtJiZtLnR5cGU9PT0ic3RyaW5nIil7dmFyIHA9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYocD09JyInKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0nIicpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5zdGFydC5jb2x1bW4rMSxlLnN0YXJ0LmNvbHVtbisyKTtpZihoPT0nIicpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSl9O2QuaW5oZXJpdHMoZixlKSxiLkNzdHlsZUJlaGF2aW91cj1mfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL3JhbmdlIiwiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4uLy4uL3JhbmdlIikuUmFuZ2UsZj1hKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlLGc9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307ZC5pbmhlcml0cyhnLGYpLGZ1bmN0aW9uKCl7dGhpcy5mb2xkaW5nU3RhcnRNYXJrZXI9Lyhce3xcWylbXlx9XF1dKiR8XlxzKihcL1wqKS8sdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj0vXlteXFtce10qKFx9fFxdKXxeW1xzXCpdKihcKlwvKS8sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKSxmPWQubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpO2lmKGYpe3ZhciBnPWYuaW5kZXg7aWYoZlsxXSlyZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKGEsZlsxXSxjLGcpO3ZhciBoPWEuZ2V0Q29tbWVudEZvbGRSYW5nZShjLGcrZlswXS5sZW5ndGgpO3JldHVybiBoLmVuZC5jb2x1bW4tPTIsaH1pZihiIT09Im1hcmtiZWdpbmVuZCIpcmV0dXJuO3ZhciBmPWQubWF0Y2godGhpcy5mb2xkaW5nU3RvcE1hcmtlcik7aWYoZil7dmFyIGc9Zi5pbmRleCtmWzBdLmxlbmd0aDtpZihmWzJdKXt2YXIgaD1hLmdldENvbW1lbnRGb2xkUmFuZ2UoYyxnKTtyZXR1cm4gaC5lbmQuY29sdW1uLT0yLGh9dmFyIGk9e3JvdzpjLGNvbHVtbjpnfSxqPWEuJGZpbmRPcGVuaW5nQnJhY2tldChmWzFdLGkpO2lmKCFqKXJldHVybjtyZXR1cm4gai5jb2x1bW4rKyxpLmNvbHVtbi0tLGUuZnJvbVBvaW50cyhqLGkpfX19LmNhbGwoZy5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxlPWIuRm9sZE1vZGU9ZnVuY3Rpb24oKXt9OygoZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj1udWxsLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9bnVsbCx0aGlzLmdldEZvbGRXaWRnZXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKTtyZXR1cm4gdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChkKT8ic3RhcnQiOmI9PSJtYXJrYmVnaW5lbmQiJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QoZCk/ImVuZCI6IiJ9LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbnVsbH0sdGhpcy5pbmRlbnRhdGlvbkJsb2NrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZT0vXlxzKi8sZj1iLGc9YixoPWEuZ2V0TGluZShiKSxpPWN8fGgubGVuZ3RoLGo9aC5tYXRjaChlKVswXS5sZW5ndGgsaz1hLmdldExlbmd0aCgpO3doaWxlKCsrYjxrKXtoPWEuZ2V0TGluZShiKTt2YXIgbD1oLm1hdGNoKGUpWzBdLmxlbmd0aDtpZihsPT1oLmxlbmd0aCljb250aW51ZTtpZihsPD1qKWJyZWFrO2c9Yn1pZihnPmYpe3ZhciBtPWEuZ2V0TGluZShnKS5sZW5ndGg7cmV0dXJuIG5ldyBkKGYsaSxnLG0pfX0sdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrPWZ1bmN0aW9uKGEsYixjLGUpe3ZhciBmPXtyb3c6Yyxjb2x1bW46ZSsxfSxnPWEuJGZpbmRDbG9zaW5nQnJhY2tldChiLGYpO2lmKCFnKXJldHVybjt2YXIgaD1hLmZvbGRXaWRnZXRzW2cucm93XTtyZXR1cm4gaD09bnVsbCYmKGg9dGhpcy5nZXRGb2xkV2lkZ2V0KGEsZy5yb3cpKSxoPT0ic3RhcnQiJiYoZy5yb3ctLSxnLmNvbHVtbj1hLmdldExpbmUoZy5yb3cpLmxlbmd0aCksZC5mcm9tUG9pbnRzKGYsZyl9fSkpLmNhbGwoZS5wcm90b3R5cGUpfSksZnVuY3Rpb24oKXt3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSxmdW5jdGlvbihhKXt3aW5kb3cuYWNlfHwod2luZG93LmFjZT17fSk7Zm9yKHZhciBiIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShiKSYmKGFjZVtiXT1hW2JdKX0pfSgp]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-latex-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCdhY2UvbW9kZS9sYXRleCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2xhdGV4X2hpZ2hsaWdodF9ydWxlcycsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7CnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7CnZhciBMYXRleEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9sYXRleF9oaWdobGlnaHRfcnVsZXMiKS5MYXRleEhpZ2hsaWdodFJ1bGVzOwp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOwoKdmFyIE1vZGUgPSBmdW5jdGlvbigpCnsKICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IExhdGV4SGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsKfTsKb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsKCihmdW5jdGlvbigpIHsKICAgIHRoaXMudG9nZ2xlQ29tbWVudExpbmVzID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgc3RhcnRSb3csIGVuZFJvdykgewogICAgICAgIC8vIFRoaXMgY29kZSBpcyBhZGFwdGVkIGZyb20gcnVieS5qcwogICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsKICAgICAgICAKICAgICAgICAvLyBMYVRlWCBjb21tZW50cyBiZWdpbiB3aXRoICUgYW5kIGdvIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUKICAgICAgICB2YXIgY29tbWVudFJlZ0V4ID0gL14oXHMqKVwlLzsKCiAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0Um93OyBpIDw9IGVuZFJvdzsgaSsrKSB7CiAgICAgICAgICAgIGlmICghY29tbWVudFJlZ0V4LnRlc3QoZG9jLmdldExpbmUoaSkpKSB7CiAgICAgICAgICAgICAgICBvdXRkZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKG91dGRlbnQpIHsKICAgICAgICAgICAgdmFyIGRlbGV0ZVJhbmdlID0gbmV3IFJhbmdlKDAsIDAsIDAsIDApOwogICAgICAgICAgICBmb3IgKHZhciBpID0gc3RhcnRSb3c7IGkgPD0gZW5kUm93OyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUoaSk7CiAgICAgICAgICAgICAgICB2YXIgbSA9IGxpbmUubWF0Y2goY29tbWVudFJlZ0V4KTsKICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLnN0YXJ0LnJvdyA9IGk7CiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQucm93ID0gaTsKICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLmVuZC5jb2x1bW4gPSBtWzBdLmxlbmd0aDsKICAgICAgICAgICAgICAgIGRvYy5yZXBsYWNlKGRlbGV0ZVJhbmdlLCBtWzFdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZG9jLmluZGVudFJvd3Moc3RhcnRSb3csIGVuZFJvdywgIiUiKTsKICAgICAgICB9CiAgICB9OwogICAgCiAgICAvLyBUaGVyZSBpcyBubyB1bml2ZXJzYWxseSBhY2NlcHRlZCB3YXkgb2YgaW5kZW50aW5nIGEgdGV4IGRvY3VtZW50CiAgICAvLyBzbyBqdXN0IG1haW50YWluIHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgcHJldmlvdXMgbGluZQogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsKICAgICAgICByZXR1cm4gdGhpcy4kZ2V0SW5kZW50KGxpbmUpOwogICAgfTsKICAgIAp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsKCmV4cG9ydHMuTW9kZSA9IE1vZGU7Cgp9KTsKZGVmaW5lKCdhY2UvbW9kZS9sYXRleF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsKCnZhciBMYXRleEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7ICAgCiAgICB0aGlzLiRydWxlcyA9IHsKICAgICAgICAic3RhcnQiIDogW3sKICAgICAgICAgICAgLy8gQSB0ZXggY29tbWFuZCBlLmcuIFxmb28KICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZCIsCiAgICAgICAgICAgIHJlZ2V4IDogIlxcXFwoPzpbXmEtekEtWl18W2EtekEtWl0rKSIsCiAgICAgICAgfSwgewogICAgICAgICAgICAvLyBDdXJseSBhbmQgc3F1YXJlIGJyYWNlcwogICAgICAgICAgICB0b2tlbiA6ICJscGFyZW4iLAogICAgICAgICAgICByZWdleCA6ICJbWyh7XSIKICAgICAgICB9LCB7CiAgICAgICAgICAgIC8vIEN1cmx5IGFuZCBzcXVhcmUgYnJhY2VzCiAgICAgICAgICAgIHRva2VuIDogInJwYXJlbiIsCiAgICAgICAgICAgIHJlZ2V4IDogIltcXF0pfV0iCiAgICAgICAgfSwgewogICAgICAgICAgICAvLyBJbmxpbmUgbWF0aCBiZXR3ZWVuIHR3byAkIHN5bWJvbHMKICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgcmVnZXggOiAiXFwkKD86KD86XFxcXC4pfCg/OlteXFwkXFxcXF0pKSo/XFwkIgogICAgICAgIH0sIHsKICAgICAgICAgICAgLy8gQSBjb21tZW50LiBUZXggY29tbWVudHMgc3RhcnQgd2l0aCAlIGFuZCBnbyB0byAKICAgICAgICAgICAgLy8gdGhlIGVuZCBvZiB0aGUgbGluZQogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwKICAgICAgICAgICAgcmVnZXggOiAiJS4qJCIKICAgICAgICB9XQogICAgfTsKfTsKCm9vcC5pbmhlcml0cyhMYXRleEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOwoKZXhwb3J0cy5MYXRleEhpZ2hsaWdodFJ1bGVzID0gTGF0ZXhIaWdobGlnaHRSdWxlczsKCn0pOwo7CiAgICAgICAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAg]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-latex.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9sYXRleCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dCIsImFjZS90b2tlbml6ZXIiLCJhY2UvbW9kZS9sYXRleF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dCIpLk1vZGUsZj1hKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXIsZz1hKCIuL2xhdGV4X2hpZ2hsaWdodF9ydWxlcyIpLkxhdGV4SGlnaGxpZ2h0UnVsZXMsaD1hKCIuLi9yYW5nZSIpLlJhbmdlLGk9ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbml6ZXI9bmV3IGYoKG5ldyBnKS5nZXRSdWxlcygpKX07ZC5pbmhlcml0cyhpLGUpLGZ1bmN0aW9uKCl7dGhpcy50b2dnbGVDb21tZW50TGluZXM9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ITAsZj0vXihccyopXCUvO2Zvcih2YXIgZz1jO2c8PWQ7ZysrKWlmKCFmLnRlc3QoYi5nZXRMaW5lKGcpKSl7ZT0hMTticmVha31pZihlKXt2YXIgaT1uZXcgaCgwLDAsMCwwKTtmb3IodmFyIGc9YztnPD1kO2crKyl7dmFyIGo9Yi5nZXRMaW5lKGcpLGs9ai5tYXRjaChmKTtpLnN0YXJ0LnJvdz1nLGkuZW5kLnJvdz1nLGkuZW5kLmNvbHVtbj1rWzBdLmxlbmd0aCxiLnJlcGxhY2UoaSxrWzFdKX19ZWxzZSBiLmluZGVudFJvd3MoYyxkLCIlIil9LHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiRnZXRJbmRlbnQoYil9fS5jYWxsKGkucHJvdG90eXBlKSxiLk1vZGU9aX0pLGRlZmluZSgiYWNlL21vZGUvbGF0ZXhfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxmPWZ1bmN0aW9uKCl7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImtleXdvcmQiLHJlZ2V4OiJcXFxcKD86W15hLXpBLVpdfFthLXpBLVpdKykifSx7dG9rZW46ImxwYXJlbiIscmVnZXg6IltbKHtdIn0se3Rva2VuOiJycGFyZW4iLHJlZ2V4OiJbXFxdKX1dIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJcXCQoPzooPzpcXFxcLil8KD86W15cXCRcXFxcXSkpKj9cXCQifSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIlLiokIn1dfX07ZC5pbmhlcml0cyhmLGUpLGIuTGF0ZXhIaWdobGlnaHRSdWxlcz1mfSksZnVuY3Rpb24oKXt3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSxmdW5jdGlvbihhKXt3aW5kb3cuYWNlfHwod2luZG93LmFjZT17fSk7Zm9yKHZhciBiIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShiKSYmKGFjZVtiXT1hW2JdKX0pfSgp]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-lua-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgoqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQoqCiogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwoqCiogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQoqIExpY2Vuc2UuCioKKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KKgoqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwoqIEFqYXgub3JnIEIuVi4KKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqCiogQ29udHJpYnV0b3Iocyk6CiogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgoqICAgICAgQ29saW4gR291cmxheSA8Y29saW4gRE9UIGogRE9UIGdvdXJsYXkgQVQgZ21haWwgRE9UIGNvbT4KKiAgICAgIExlZSBHYW8KKgoqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQoqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgoqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KKgoqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2x1YScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2x1YV9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7CnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7CnZhciBMdWFIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vbHVhX2hpZ2hsaWdodF9ydWxlcyIpLkx1YUhpZ2hsaWdodFJ1bGVzOwoKdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IEx1YUhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7Cn07Cm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7CgooZnVuY3Rpb24oKSB7CiAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgewogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQobGluZSk7CgogICAgICAgIHZhciB0b2tlbml6ZWRMaW5lID0gdGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMobGluZSwgc3RhdGUpOwogICAgICAgIHZhciB0b2tlbnMgPSB0b2tlbml6ZWRMaW5lLnRva2VuczsKCQogICAgICAgIHZhciBjaHVua3MgPSBbImZ1bmN0aW9uIiwgInRoZW4iLCAiZG8iLCAicmVwZWF0Il07CiAgICAgICAgCiAgICAgICAgaWYgKHN0YXRlID09ICJzdGFydCIpIHsKICAgICAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXi4qW1x7XChcW11ccyokLyk7CiAgICAgICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gdG9rZW5zKXsKICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV07CiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgIT0gImtleXdvcmQiKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB2YXIgY2h1bmtfaSA9IGNodW5rcy5pbmRleE9mKHRva2VuLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2h1bmtfaSAhPSAtMSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCArPSB0YWI7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gCgogICAgICAgIHJldHVybiBpbmRlbnQ7CiAgICB9OwogICAgCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOwoKZXhwb3J0cy5Nb2RlID0gTW9kZTsKfSk7CgoKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgoqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQoqCiogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwoqCiogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQoqIExpY2Vuc2UuCioKKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KKgoqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwoqIEFqYXgub3JnIEIuVi4KKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqCiogQ29udHJpYnV0b3Iocyk6CiogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgoqICAgICAgQ29saW4gR291cmxheSA8Y29saW4gRE9UIGogRE9UIGdvdXJsYXkgQVQgZ21haWwgRE9UIGNvbT4KKiAgICAgIExlZSBHYW8KKgoqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQoqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgoqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KKgoqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2x1YV9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOwp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsKCnZhciBMdWFIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgewoKICAgIHZhciBrZXl3b3JkcyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoImJyZWFrfGRvfGVsc2V8ZWxzZWlmfGVuZHxmb3J8ZnVuY3Rpb258aWZ8aW58bG9jYWx8cmVwZWF0fCIrCiAgICAgICAgICJyZXR1cm58dGhlbnx1bnRpbHx3aGlsZXxvcnxhbmR8bm90Iikuc3BsaXQoInwiKQogICAgKTsKCiAgICB2YXIgYnVpbHRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoInRydWV8ZmFsc2V8bmlsfF9HfF9WRVJTSU9OIikuc3BsaXQoInwiKQogICAgKTsKCiAgICB2YXIgYnVpbHRpbkZ1bmN0aW9ucyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoInN0cmluZ3x4cGNhbGx8cGFja2FnZXx0b3N0cmluZ3xwcmludHxvc3x1bnBhY2t8cmVxdWlyZXwiKwogICAgICAgICJnZXRmZW52fHNldG1ldGF0YWJsZXxuZXh0fGFzc2VydHx0b251bWJlcnxpb3xyYXdlcXVhbHwiKwogICAgICAgICJjb2xsZWN0Z2FyYmFnZXxnZXRtZXRhdGFibGV8bW9kdWxlfHJhd3NldHxtYXRofGRlYnVnfCIrCiAgICAgICAgInBjYWxsfHRhYmxlfG5ld3Byb3h5fHR5cGV8Y29yb3V0aW5lfF9HfHNlbGVjdHxnY2luZm98IisKICAgICAgICAicGFpcnN8cmF3Z2V0fGxvYWRzdHJpbmd8aXBhaXJzfF9WRVJTSU9OfGRvZmlsZXxzZXRmZW52fCIrCiAgICAgICAgImxvYWR8ZXJyb3J8bG9hZGZpbGV8IisKCiAgICAgICAgInN1Ynx1cHBlcnxsZW58Z2ZpbmR8cmVwfGZpbmR8bWF0Y2h8Y2hhcnxkdW1wfGdtYXRjaHwiKwogICAgICAgICJyZXZlcnNlfGJ5dGV8Zm9ybWF0fGdzdWJ8bG93ZXJ8cHJlbG9hZHxsb2FkbGlifGxvYWRlZHwiKwogICAgICAgICJsb2FkZXJzfGNwYXRofGNvbmZpZ3xwYXRofHNlZWFsbHxleGl0fHNldGxvY2FsZXxkYXRlfCIrCiAgICAgICAgImdldGVudnxkaWZmdGltZXxyZW1vdmV8dGltZXxjbG9ja3x0bXBuYW1lfHJlbmFtZXxleGVjdXRlfCIrCiAgICAgICAgImxpbmVzfHdyaXRlfGNsb3NlfGZsdXNofG9wZW58b3V0cHV0fHR5cGV8cmVhZHxzdGRlcnJ8IisKICAgICAgICAic3RkaW58aW5wdXR8c3Rkb3V0fHBvcGVufHRtcGZpbGV8bG9nfG1heHxhY29zfGh1Z2V8IisKICAgICAgICAibGRleHB8cGl8Y29zfHRhbmh8cG93fGRlZ3x0YW58Y29zaHxzaW5ofHJhbmRvbXxyYW5kb21zZWVkfCIrCiAgICAgICAgImZyZXhwfGNlaWx8Zmxvb3J8cmFkfGFic3xzcXJ0fG1vZGZ8YXNpbnxtaW58bW9kfGZtb2R8bG9nMTB8IisKICAgICAgICAiYXRhbjJ8ZXhwfHNpbnxhdGFufGdldHVwdmFsdWV8ZGVidWd8c2V0aG9va3xnZXRtZXRhdGFibGV8IisKICAgICAgICAiZ2V0aG9va3xzZXRtZXRhdGFibGV8c2V0bG9jYWx8dHJhY2ViYWNrfHNldGZlbnZ8Z2V0aW5mb3wiKwogICAgICAgICJzZXR1cHZhbHVlfGdldGxvY2FsfGdldHJlZ2lzdHJ5fGdldGZlbnZ8c2V0bnxpbnNlcnR8Z2V0bnwiKwogICAgICAgICJmb3JlYWNoaXxtYXhufGZvcmVhY2h8Y29uY2F0fHNvcnR8cmVtb3ZlfHJlc3VtZXx5aWVsZHwiKwogICAgICAgICJzdGF0dXN8d3JhcHxjcmVhdGV8cnVubmluZyIpLnNwbGl0KCJ8IikKICAgICk7CiAgICAKICAgIHZhciBzdGRMaWJhcmllcyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoInN0cmluZ3xwYWNrYWdlfG9zfGlvfG1hdGh8ZGVidWd8dGFibGV8Y29yb3V0aW5lIikuc3BsaXQoInwiKQogICAgKTsKICAgIAogICAgdmFyIG1ldGF0YWJsZU1ldGhvZHMgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCJfX2FkZHxfX3N1YnxfX21vZHxfX3VubXxfX2NvbmNhdHxfX2x0fF9faW5kZXh8X19jYWxsfF9fZ2N8X19tZXRhdGFibGV8IisKICAgICAgICAgIl9fbXVsfF9fZGl2fF9fcG93fF9fbGVufF9fZXF8X19sZXxfX25ld2luZGV4fF9fdG9zdHJpbmd8X19tb2RlfF9fdG9udW1iZXIiKS5zcGxpdCgifCIpCiAgICApOwoKICAgIHZhciBmdXR1cmVSZXNlcnZlZCA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoIiIpLnNwbGl0KCJ8IikKICAgICk7CiAgICAKICAgIHZhciBkZXByZWNhdGVkSW41MTUyID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgic2V0bnxmb3JlYWNofGZvcmVhY2hpfGdjaW5mb3xsb2cxMHxtYXhuIikuc3BsaXQoInwiKQogICAgKTsKCiAgICB2YXIgc3RyUHJlID0gIiI7CgogICAgdmFyIGRlY2ltYWxJbnRlZ2VyID0gIig/Oig/OlsxLTldXFxkKil8KD86MCkpIjsKICAgIHZhciBoZXhJbnRlZ2VyID0gIig/OjBbeFhdW1xcZEEtRmEtZl0rKSI7CiAgICB2YXIgaW50ZWdlciA9ICIoPzoiICsgZGVjaW1hbEludGVnZXIgKyAifCIgKyBoZXhJbnRlZ2VyICsgIikiOwoKICAgIHZhciBmcmFjdGlvbiA9ICIoPzpcXC5cXGQrKSI7CiAgICB2YXIgaW50UGFydCA9ICIoPzpcXGQrKSI7CiAgICB2YXIgcG9pbnRGbG9hdCA9ICIoPzooPzoiICsgaW50UGFydCArICI/IiArIGZyYWN0aW9uICsgIil8KD86IiArIGludFBhcnQgKyAiXFwuKSkiOwogICAgdmFyIGZsb2F0TnVtYmVyID0gIig/OiIgKyBwb2ludEZsb2F0ICsgIikiOwogICAgCiAgICB2YXIgY29tbWVudF9zdGFjayA9IFtdOwogICAgCiAgICB0aGlzLiRydWxlcyA9IHsKICAgICAgICAic3RhcnQiIDogCgoJCQogICAgICAgIC8vIGJyYWNrZXRlZCBjb21tZW50cwogICAgICAgIFt7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAgICAgICAgICAgLy8gLS1bWyBjb21tZW50CiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcLVxcLVxcW1xcWy4qXFxdXFxdJwogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsICAgICAgICAgICAvLyAtLVs9WyBjb21tZW50CiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcLVxcLVxcW1xcPVxcWy4qXFxdXFw9XFxdJwogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsICAgICAgICAgICAvLyAtLVs9PVsgY29tbWVudAogICAgICAgICAgICByZWdleCA6IHN0clByZSArICdcXC1cXC1cXFtcXD17Mn1cXFsuKlxcXVxcPXsyfVxcXScKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAgICAgICAgICAgLy8gLS1bPT09WyBjb21tZW50CiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcLVxcLVxcW1xcPXszfVxcWy4qXFxdXFw9ezN9XFxdJwogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsICAgICAgICAgICAvLyAtLVs9PT09WyBjb21tZW50CiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcLVxcLVxcW1xcPXs0fVxcWy4qXFxdXFw9ezR9XFxdJwogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsICAgICAgICAgICAvLyAtLVs9PT09K1sgY29tbWVudAogICAgICAgICAgICByZWdleCA6IHN0clByZSArICdcXC1cXC1cXFtcXD17NX1cXD0qXFxbLipcXF1cXD17NX1cXD0qXFxdJwogICAgICAgIH0sCgkJCgkJLy8gbXVsdGlsaW5lIGJyYWNrZXRlZCBjb21tZW50cwoJCXsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsICAgICAgICAgICAvLyAtLVtbIGNvbW1lbnQKICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAnXFwtXFwtXFxbXFxbLiokJywKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICBuZXh0ICA6ICJxY29tbWVudCIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAgICAgICAgICAgLy8gLS1bPVsgY29tbWVudAogICAgICAgICAgICByZWdleCA6IHN0clByZSArICdcXC1cXC1cXFtcXD1cXFsuKiQnLAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIG5leHQgIDogInFjb21tZW50MSIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAgICAgICAgICAgLy8gLS1bPT1bIGNvbW1lbnQKICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAnXFwtXFwtXFxbXFw9ezJ9XFxbLiokJywKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICBuZXh0ICA6ICJxY29tbWVudDIiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgICAgICAgICAgIC8vIC0tWz09PVsgY29tbWVudAogICAgICAgICAgICByZWdleCA6IHN0clByZSArICdcXC1cXC1cXFtcXD17M31cXFsuKiQnLAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIG5leHQgIDogInFjb21tZW50MyIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAgICAgICAgICAgLy8gLS1bPT09PVsgY29tbWVudAogICAgICAgICAgICByZWdleCA6IHN0clByZSArICdcXC1cXC1cXFtcXD17NH1cXFsuKiQnLAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIG5leHQgIDogInFjb21tZW50NCIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpeyAgICAgLy8gLS1bPT09PStbIGNvbW1lbnQKICAgICAgICAgICAgICAgIC8vIFdBUk5JTkc6IEVYVFJFTUVMWSBTTE9XLCBidXQgdGhpcyBpcyB0aGUgb25seSB3YXkgdG8gY2lyY3VtdmVudCB0aGUKICAgICAgICAgICAgICAgIC8vIGxpbWl0cyBpbXBvc2VkIGJ5IHRoZSBjdXJyZW50IGF1dG9tYXRvbi4KICAgICAgICAgICAgICAgIC8vIEkndmUgbmV2ZXIgcGVyc29uYWxseSBzZWVuIGFueSBwcmFjdGljYWwgY29kZSB3aGVyZSA1IG9yIG1vcmUgJz0ncyBhcmUKICAgICAgICAgICAgICAgIC8vIHVzZWQgZm9yIHN0cmluZyBvciBjb21tZW50aW5nLCBzbyB0aGlzIHdpbGwgcmFyZWx5IGJlIGludm9rZWQuCiAgICAgICAgICAgICAgICB2YXIgcGF0dGVybiA9IC9cLVwtXFsoXD0rKVxbLywgbWF0Y2g7CiAgICAgICAgICAgICAgICAvLyB5b3UgY2FuIG5ldmVyIGJlIHRvbyBwYXJhbm9pZCA7KQogICAgICAgICAgICAgICAgaWYgKChtYXRjaCA9IHBhdHRlcm4uZXhlYyh2YWx1ZSkpICE9IG51bGwgJiYgKG1hdGNoID0gbWF0Y2hbMV0pICE9IHVuZGVmaW5lZCkKICAgICAgICAgICAgICAgICAgICBjb21tZW50X3N0YWNrLnB1c2gobWF0Y2gubGVuZ3RoKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAnXFwtXFwtXFxbXFw9ezV9XFw9KlxcWy4qJCcsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgbmV4dCAgOiAicWNvbW1lbnQ1IgogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgLy8gc2luZ2xlIGxpbmUgY29tbWVudHMKICAgICAgICB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLAogICAgICAgICAgICByZWdleCA6ICJcXC1cXC0uKiQiCiAgICAgICAgfSwgCiAgICAgICAgCiAgICAgICAgLy8gYnJhY2tldGVkIHN0cmluZ3MKCQl7CiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsICAgICAgICAgICAvLyBbWyBzdHJpbmcKICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAnXFxbXFxbLipcXF1cXF0nCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gWz1bIHN0cmluZwogICAgICAgICAgICByZWdleCA6IHN0clByZSArICdcXFtcXD1cXFsuKlxcXVxcPVxcXScKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsICAgICAgICAgICAvLyBbPT1bIHN0cmluZwogICAgICAgICAgICByZWdleCA6IHN0clByZSArICdcXFtcXD17Mn1cXFsuKlxcXVxcPXsyfVxcXScKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsICAgICAgICAgICAvLyBbPT09WyBzdHJpbmcKICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAnXFxbXFw9ezN9XFxbLipcXF1cXD17M31cXF0nCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gWz09PT1bIHN0cmluZwogICAgICAgICAgICByZWdleCA6IHN0clByZSArICdcXFtcXD17NH1cXFsuKlxcXVxcPXs0fVxcXScKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsICAgICAgICAgICAvLyBbPT09PStbIHN0cmluZwogICAgICAgICAgICByZWdleCA6IHN0clByZSArICdcXFtcXD17NX1cXD0qXFxbLipcXF1cXD17NX1cXD0qXFxdJwogICAgICAgIH0sCgkJCgkJLy8gbXVsdGlsaW5lIGJyYWNrZXRlZCBzdHJpbmdzCiAgICAgICAgewogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gW1sgc3RyaW5nCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcW1xcWy4qJCcsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgbmV4dCAgOiAicXN0cmluZyIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsICAgICAgICAgICAvLyBbPVsgc3RyaW5nCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcW1xcPVxcWy4qJCcsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgbmV4dCAgOiAicXN0cmluZzEiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gWz09WyBzdHJpbmcKICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAnXFxbXFw9ezJ9XFxbLiokJywKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICBuZXh0ICA6ICJxc3RyaW5nMiIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsICAgICAgICAgICAvLyBbPT09WyBzdHJpbmcKICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAnXFxbXFw9ezN9XFxbLiokJywKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICBuZXh0ICA6ICJxc3RyaW5nMyIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsICAgICAgICAgICAvLyBbPT09PVsgc3RyaW5nCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgJ1xcW1xcPXs0fVxcWy4qJCcsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgbmV4dCAgOiAicXN0cmluZzQiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKXsgICAgIC8vIC0tWz09PT0rWyBzdHJpbmcKICAgICAgICAgICAgICAgIC8vIFdBUk5JTkc6IEVYVFJFTUVMWSBTTE9XLCBzZWUgYWJvdmUuCiAgICAgICAgICAgICAgICB2YXIgcGF0dGVybiA9IC9cWyhcPSspXFsvLCBtYXRjaDsKICAgICAgICAgICAgICAgIGlmICgobWF0Y2ggPSBwYXR0ZXJuLmV4ZWModmFsdWUpKSAhPSBudWxsICYmIChtYXRjaCA9IG1hdGNoWzFdKSAhPSB1bmRlZmluZWQpCiAgICAgICAgICAgICAgICAgICAgY29tbWVudF9zdGFjay5wdXNoKG1hdGNoLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAnXFxbXFw9ezV9XFw9KlxcWy4qJCcsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgbmV4dCAgOiAicXN0cmluZzUiCiAgICAgICAgfSwgCiAgICAgICAgCiAgICAgICAgewogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gIiBzdHJpbmcKICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAnIig/OlteXFxcXF18XFxcXC4pKj8iJwogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgICAgICAgICAgIC8vICcgc3RyaW5nCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgIicoPzpbXlxcXFxdfFxcXFwuKSo/JyIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdAogICAgICAgICAgICByZWdleCA6IGZsb2F0TnVtYmVyCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaW50ZWdlcgogICAgICAgICAgICByZWdleCA6IGludGVnZXIgKyAiXFxiIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICAgICAgaWYgKGtleXdvcmRzLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICAgICAgICAgICAgZWxzZSBpZiAoYnVpbHRpbkNvbnN0YW50cy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7CiAgICAgICAgICAgICAgICBlbHNlIGlmIChmdXR1cmVSZXNlcnZlZC5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkLmlsbGVnYWwiOwogICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RkTGliYXJpZXMuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGlicmFyeSI7CiAgICAgICAgICAgICAgICBlbHNlIGlmIChkZXByZWNhdGVkSW41MTUyLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuZGVwcmVjYXRlZCI7CiAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsdGluRnVuY3Rpb25zLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuZnVuY3Rpb24iOwogICAgICAgICAgICAgICAgZWxzZSBpZiAobWV0YXRhYmxlTWV0aG9kcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmZ1bmN0aW9uIjsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICByZXR1cm4gImlkZW50aWZpZXIiOwogICAgICAgICAgICB9LAogICAgICAgICAgICByZWdleCA6ICJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwKICAgICAgICAgICAgcmVnZXggOiAiXFwrfFxcLXxcXCp8XFwvfCV8XFwjfFxcXnx+fDx8Pnw8PXw9Pnw9PXx+PXw9fFxcOnxcXC5cXC5cXC58XFwuXFwuIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ubHBhcmVuIiwKICAgICAgICAgICAgcmVnZXggOiAiW1xcW1xcKFxce10iCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5ycGFyZW4iLAogICAgICAgICAgICByZWdleCA6ICJbXFxdXFwpXFx9XSIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgICAgICByZWdleCA6ICJcXHMrIgogICAgICAgIH0gXSwKICAgICAgICAKICAgICAgICAicWNvbW1lbnQiOiBbIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgIHJlZ2V4IDogIig/OlteXFxcXF18XFxcXC4pKj9cXF1cXF0iLAogICAgICAgICAgICBuZXh0ICA6ICJzdGFydCIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogJy4rJwogICAgICAgIH0gXSwKICAgICAgICAicWNvbW1lbnQxIjogWyB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLAogICAgICAgICAgICByZWdleCA6ICIoPzpbXlxcXFxdfFxcXFwuKSo/XFxdXFw9XFxdIiwKICAgICAgICAgICAgbmV4dCAgOiAic3RhcnQiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICcuKycKICAgICAgICB9IF0sCiAgICAgICAgInFjb21tZW50MiI6IFsgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwKICAgICAgICAgICAgcmVnZXggOiAiKD86W15cXFxcXXxcXFxcLikqP1xcXVxcPXsyfVxcXSIsCiAgICAgICAgICAgIG5leHQgIDogInN0YXJ0IgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAnLisnCiAgICAgICAgfSBdLAogICAgICAgICJxY29tbWVudDMiOiBbIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgIHJlZ2V4IDogIig/OlteXFxcXF18XFxcXC4pKj9cXF1cXD17M31cXF0iLAogICAgICAgICAgICBuZXh0ICA6ICJzdGFydCIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogJy4rJwogICAgICAgIH0gXSwKICAgICAgICAicWNvbW1lbnQ0IjogWyB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLAogICAgICAgICAgICByZWdleCA6ICIoPzpbXlxcXFxdfFxcXFwuKSo/XFxdXFw9ezR9XFxdIiwKICAgICAgICAgICAgbmV4dCAgOiAic3RhcnQiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICcuKycKICAgICAgICB9IF0sCiAgICAgICAgInFjb21tZW50NSI6IFsgewogICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKXsgCiAgICAgICAgICAgICAgICAvLyB2ZXJ5IGhhY2tpc2gsIG11dGF0ZXMgdGhlIHFjb21tZW50NSBmaWVsZCBvbiB0aGUgZmx5LgogICAgICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSAvXF0oXD0rKVxdLywgcnVsZSA9IHRoaXMucnVsZXMucWNvbW1lbnQ1WzBdLCBtYXRjaDsKICAgICAgICAgICAgICAgIHJ1bGUubmV4dCA9ICJzdGFydCI7CiAgICAgICAgICAgICAgICBpZiAoKG1hdGNoID0gcGF0dGVybi5leGVjKHZhbHVlKSkgIT0gbnVsbCAmJiAobWF0Y2ggPSBtYXRjaFsxXSkgIT0gdW5kZWZpbmVkKXsKICAgICAgICAgICAgICAgICAgICB2YXIgZm91bmQgPSBtYXRjaC5sZW5ndGgsIGV4cGVjdGVkOwogICAgICAgICAgICAgICAgICAgIGlmICgoZXhwZWN0ZWQgPSBjb21tZW50X3N0YWNrLnBvcCgpKSAhPSBmb3VuZCl7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRfc3RhY2sucHVzaChleHBlY3RlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUubmV4dCA9ICJxY29tbWVudDUiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmVnZXggOiAiKD86W15cXFxcXXxcXFxcLikqP1xcXVxcPXs1fVxcPSpcXF0iLAogICAgICAgICAgICBuZXh0ICA6ICJzdGFydCIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogJy4rJwogICAgICAgIH0gXSwKICAgICAgICAKICAgICAgICAicXN0cmluZyI6IFsgewogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgICAgICByZWdleCA6ICIoPzpbXlxcXFxdfFxcXFwuKSo/XFxdXFxdIiwKICAgICAgICAgICAgbmV4dCAgOiAic3RhcnQiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogJy4rJwogICAgICAgIH0gXSwKICAgICAgICAicXN0cmluZzEiOiBbIHsKICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgcmVnZXggOiAiKD86W15cXFxcXXxcXFxcLikqP1xcXVxcPVxcXSIsCiAgICAgICAgICAgIG5leHQgIDogInN0YXJ0IgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICcuKycKICAgICAgICB9IF0sCiAgICAgICAgInFzdHJpbmcyIjogWyB7CiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgIHJlZ2V4IDogIig/OlteXFxcXF18XFxcXC4pKj9cXF1cXD17Mn1cXF0iLAogICAgICAgICAgICBuZXh0ICA6ICJzdGFydCIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAnLisnCiAgICAgICAgfSBdLAogICAgICAgICJxc3RyaW5nMyI6IFsgewogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgICAgICByZWdleCA6ICIoPzpbXlxcXFxdfFxcXFwuKSo/XFxdXFw9ezN9XFxdIiwKICAgICAgICAgICAgbmV4dCAgOiAic3RhcnQiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogJy4rJwogICAgICAgIH0gXSwKICAgICAgICAicXN0cmluZzQiOiBbIHsKICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgcmVnZXggOiAiKD86W15cXFxcXXxcXFxcLikqP1xcXVxcPXs0fVxcXSIsCiAgICAgICAgICAgIG5leHQgIDogInN0YXJ0IgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICcuKycKICAgICAgICB9IF0sCiAgICAgICAgInFzdHJpbmc1IjogWyB7CiAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpeyAKICAgICAgICAgICAgICAgIC8vIHZlcnkgaGFja2lzaCwgbXV0YXRlcyB0aGUgcXN0cmluZzUgZmllbGQgb24gdGhlIGZseS4KICAgICAgICAgICAgICAgIHZhciBwYXR0ZXJuID0gL1xdKFw9KylcXS8sIHJ1bGUgPSB0aGlzLnJ1bGVzLnFzdHJpbmc1WzBdLCBtYXRjaDsKICAgICAgICAgICAgICAgIHJ1bGUubmV4dCA9ICJzdGFydCI7CiAgICAgICAgICAgICAgICBpZiAoKG1hdGNoID0gcGF0dGVybi5leGVjKHZhbHVlKSkgIT0gbnVsbCAmJiAobWF0Y2ggPSBtYXRjaFsxXSkgIT0gdW5kZWZpbmVkKXsKICAgICAgICAgICAgICAgICAgICB2YXIgZm91bmQgPSBtYXRjaC5sZW5ndGgsIGV4cGVjdGVkOwogICAgICAgICAgICAgICAgICAgIGlmICgoZXhwZWN0ZWQgPSBjb21tZW50X3N0YWNrLnBvcCgpKSAhPSBmb3VuZCl7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRfc3RhY2sucHVzaChleHBlY3RlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUubmV4dCA9ICJxc3RyaW5nNSI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHJlZ2V4IDogIig/OlteXFxcXF18XFxcXC4pKj9cXF1cXD17NX1cXD0qXFxdIiwKICAgICAgICAgICAgbmV4dCAgOiAic3RhcnQiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogJy4rJwogICAgICAgIH0gXQogICAgICAgIAogICAgfTsKCn0KCm9vcC5pbmhlcml0cyhMdWFIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsKCmV4cG9ydHMuTHVhSGlnaGxpZ2h0UnVsZXMgPSBMdWFIaWdobGlnaHRSdWxlczsKfSk7CjsKICAgICAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkKICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkoKTsKICAgICAgICA=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-lua.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9sdWEiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvbHVhX2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vbHVhX2hpZ2hsaWdodF9ydWxlcyIpLkx1YUhpZ2hsaWdodFJ1bGVzLGg9ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbml6ZXI9bmV3IGYoKG5ldyBnKS5nZXRSdWxlcygpKX07ZC5pbmhlcml0cyhoLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy4kZ2V0SW5kZW50KGIpLGU9dGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMoYixhKSxmPWUudG9rZW5zLGc9WyJmdW5jdGlvbiIsInRoZW4iLCJkbyIsInJlcGVhdCJdO2lmKGE9PSJzdGFydCIpe3ZhciBoPWIubWF0Y2goL14uKltce1woXFtdXHMqJC8pO2lmKGgpZCs9YztlbHNlIGZvcih2YXIgaSBpbiBmKXt2YXIgaj1mW2ldO2lmKGoudHlwZSE9ImtleXdvcmQiKWNvbnRpbnVlO3ZhciBrPWcuaW5kZXhPZihqLnZhbHVlKTtpZihrIT0tMSl7ZCs9YzticmVha319fXJldHVybiBkfX0uY2FsbChoLnByb3RvdHlwZSksYi5Nb2RlPWh9KSxkZWZpbmUoImFjZS9tb2RlL2x1YV9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxnPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKCJicmVha3xkb3xlbHNlfGVsc2VpZnxlbmR8Zm9yfGZ1bmN0aW9ufGlmfGlufGxvY2FsfHJlcGVhdHxyZXR1cm58dGhlbnx1bnRpbHx3aGlsZXxvcnxhbmR8bm90Ii5zcGxpdCgifCIpKSxiPWUuYXJyYXlUb01hcCgidHJ1ZXxmYWxzZXxuaWx8X0d8X1ZFUlNJT04iLnNwbGl0KCJ8IikpLGM9ZS5hcnJheVRvTWFwKCJzdHJpbmd8eHBjYWxsfHBhY2thZ2V8dG9zdHJpbmd8cHJpbnR8b3N8dW5wYWNrfHJlcXVpcmV8Z2V0ZmVudnxzZXRtZXRhdGFibGV8bmV4dHxhc3NlcnR8dG9udW1iZXJ8aW98cmF3ZXF1YWx8Y29sbGVjdGdhcmJhZ2V8Z2V0bWV0YXRhYmxlfG1vZHVsZXxyYXdzZXR8bWF0aHxkZWJ1Z3xwY2FsbHx0YWJsZXxuZXdwcm94eXx0eXBlfGNvcm91dGluZXxfR3xzZWxlY3R8Z2NpbmZvfHBhaXJzfHJhd2dldHxsb2Fkc3RyaW5nfGlwYWlyc3xfVkVSU0lPTnxkb2ZpbGV8c2V0ZmVudnxsb2FkfGVycm9yfGxvYWRmaWxlfHN1Ynx1cHBlcnxsZW58Z2ZpbmR8cmVwfGZpbmR8bWF0Y2h8Y2hhcnxkdW1wfGdtYXRjaHxyZXZlcnNlfGJ5dGV8Zm9ybWF0fGdzdWJ8bG93ZXJ8cHJlbG9hZHxsb2FkbGlifGxvYWRlZHxsb2FkZXJzfGNwYXRofGNvbmZpZ3xwYXRofHNlZWFsbHxleGl0fHNldGxvY2FsZXxkYXRlfGdldGVudnxkaWZmdGltZXxyZW1vdmV8dGltZXxjbG9ja3x0bXBuYW1lfHJlbmFtZXxleGVjdXRlfGxpbmVzfHdyaXRlfGNsb3NlfGZsdXNofG9wZW58b3V0cHV0fHR5cGV8cmVhZHxzdGRlcnJ8c3RkaW58aW5wdXR8c3Rkb3V0fHBvcGVufHRtcGZpbGV8bG9nfG1heHxhY29zfGh1Z2V8bGRleHB8cGl8Y29zfHRhbmh8cG93fGRlZ3x0YW58Y29zaHxzaW5ofHJhbmRvbXxyYW5kb21zZWVkfGZyZXhwfGNlaWx8Zmxvb3J8cmFkfGFic3xzcXJ0fG1vZGZ8YXNpbnxtaW58bW9kfGZtb2R8bG9nMTB8YXRhbjJ8ZXhwfHNpbnxhdGFufGdldHVwdmFsdWV8ZGVidWd8c2V0aG9va3xnZXRtZXRhdGFibGV8Z2V0aG9va3xzZXRtZXRhdGFibGV8c2V0bG9jYWx8dHJhY2ViYWNrfHNldGZlbnZ8Z2V0aW5mb3xzZXR1cHZhbHVlfGdldGxvY2FsfGdldHJlZ2lzdHJ5fGdldGZlbnZ8c2V0bnxpbnNlcnR8Z2V0bnxmb3JlYWNoaXxtYXhufGZvcmVhY2h8Y29uY2F0fHNvcnR8cmVtb3ZlfHJlc3VtZXx5aWVsZHxzdGF0dXN8d3JhcHxjcmVhdGV8cnVubmluZyIuc3BsaXQoInwiKSksZD1lLmFycmF5VG9NYXAoInN0cmluZ3xwYWNrYWdlfG9zfGlvfG1hdGh8ZGVidWd8dGFibGV8Y29yb3V0aW5lIi5zcGxpdCgifCIpKSxmPWUuYXJyYXlUb01hcCgiX19hZGR8X19zdWJ8X19tb2R8X191bm18X19jb25jYXR8X19sdHxfX2luZGV4fF9fY2FsbHxfX2djfF9fbWV0YXRhYmxlfF9fbXVsfF9fZGl2fF9fcG93fF9fbGVufF9fZXF8X19sZXxfX25ld2luZGV4fF9fdG9zdHJpbmd8X19tb2RlfF9fdG9udW1iZXIiLnNwbGl0KCJ8IikpLGc9ZS5hcnJheVRvTWFwKCIiLnNwbGl0KCJ8IikpLGg9ZS5hcnJheVRvTWFwKCJzZXRufGZvcmVhY2h8Zm9yZWFjaGl8Z2NpbmZvfGxvZzEwfG1heG4iLnNwbGl0KCJ8IikpLGk9IiIsaj0iKD86KD86WzEtOV1cXGQqKXwoPzowKSkiLGs9Iig/OjBbeFhdW1xcZEEtRmEtZl0rKSIsbD0iKD86IitqKyJ8IitrKyIpIixtPSIoPzpcXC5cXGQrKSIsbj0iKD86XFxkKykiLG89Iig/Oig/OiIrbisiPyIrbSsiKXwoPzoiK24rIlxcLikpIixwPSIoPzoiK28rIikiLHE9W107dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OmkrIlxcLVxcLVxcW1xcWy4qXFxdXFxdIn0se3Rva2VuOiJjb21tZW50IixyZWdleDppKyJcXC1cXC1cXFtcXD1cXFsuKlxcXVxcPVxcXSJ9LHt0b2tlbjoiY29tbWVudCIscmVnZXg6aSsiXFwtXFwtXFxbXFw9ezJ9XFxbLipcXF1cXD17Mn1cXF0ifSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OmkrIlxcLVxcLVxcW1xcPXszfVxcWy4qXFxdXFw9ezN9XFxdIn0se3Rva2VuOiJjb21tZW50IixyZWdleDppKyJcXC1cXC1cXFtcXD17NH1cXFsuKlxcXVxcPXs0fVxcXSJ9LHt0b2tlbjoiY29tbWVudCIscmVnZXg6aSsiXFwtXFwtXFxbXFw9ezV9XFw9KlxcWy4qXFxdXFw9ezV9XFw9KlxcXSJ9LHt0b2tlbjoiY29tbWVudCIscmVnZXg6aSsiXFwtXFwtXFxbXFxbLiokIixtZXJnZTohMCxuZXh0OiJxY29tbWVudCJ9LHt0b2tlbjoiY29tbWVudCIscmVnZXg6aSsiXFwtXFwtXFxbXFw9XFxbLiokIixtZXJnZTohMCxuZXh0OiJxY29tbWVudDEifSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OmkrIlxcLVxcLVxcW1xcPXsyfVxcWy4qJCIsbWVyZ2U6ITAsbmV4dDoicWNvbW1lbnQyIn0se3Rva2VuOiJjb21tZW50IixyZWdleDppKyJcXC1cXC1cXFtcXD17M31cXFsuKiQiLG1lcmdlOiEwLG5leHQ6InFjb21tZW50MyJ9LHt0b2tlbjoiY29tbWVudCIscmVnZXg6aSsiXFwtXFwtXFxbXFw9ezR9XFxbLiokIixtZXJnZTohMCxuZXh0OiJxY29tbWVudDQifSx7dG9rZW46ZnVuY3Rpb24oYSl7dmFyIGI9L1wtXC1cWyhcPSspXFsvLGM7cmV0dXJuKGM9Yi5leGVjKGEpKSE9bnVsbCYmKGM9Y1sxXSkhPXVuZGVmaW5lZCYmcS5wdXNoKGMubGVuZ3RoKSwiY29tbWVudCJ9LHJlZ2V4OmkrIlxcLVxcLVxcW1xcPXs1fVxcPSpcXFsuKiQiLG1lcmdlOiEwLG5leHQ6InFjb21tZW50NSJ9LHt0b2tlbjoiY29tbWVudCIscmVnZXg6IlxcLVxcLS4qJCJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDppKyJcXFtcXFsuKlxcXVxcXSJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDppKyJcXFtcXD1cXFsuKlxcXVxcPVxcXSJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDppKyJcXFtcXD17Mn1cXFsuKlxcXVxcPXsyfVxcXSJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDppKyJcXFtcXD17M31cXFsuKlxcXVxcPXszfVxcXSJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDppKyJcXFtcXD17NH1cXFsuKlxcXVxcPXs0fVxcXSJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDppKyJcXFtcXD17NX1cXD0qXFxbLipcXF1cXD17NX1cXD0qXFxdIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OmkrIlxcW1xcWy4qJCIsbWVyZ2U6ITAsbmV4dDoicXN0cmluZyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDppKyJcXFtcXD1cXFsuKiQiLG1lcmdlOiEwLG5leHQ6InFzdHJpbmcxIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OmkrIlxcW1xcPXsyfVxcWy4qJCIsbWVyZ2U6ITAsbmV4dDoicXN0cmluZzIifSx7dG9rZW46InN0cmluZyIscmVnZXg6aSsiXFxbXFw9ezN9XFxbLiokIixtZXJnZTohMCxuZXh0OiJxc3RyaW5nMyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDppKyJcXFtcXD17NH1cXFsuKiQiLG1lcmdlOiEwLG5leHQ6InFzdHJpbmc0In0se3Rva2VuOmZ1bmN0aW9uKGEpe3ZhciBiPS9cWyhcPSspXFsvLGM7cmV0dXJuKGM9Yi5leGVjKGEpKSE9bnVsbCYmKGM9Y1sxXSkhPXVuZGVmaW5lZCYmcS5wdXNoKGMubGVuZ3RoKSwic3RyaW5nIn0scmVnZXg6aSsiXFxbXFw9ezV9XFw9KlxcWy4qJCIsbWVyZ2U6ITAsbmV4dDoicXN0cmluZzUifSx7dG9rZW46InN0cmluZyIscmVnZXg6aSsnIig/OlteXFxcXF18XFxcXC4pKj8iJ30se3Rva2VuOiJzdHJpbmciLHJlZ2V4OmkrIicoPzpbXlxcXFxdfFxcXFwuKSo/JyJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6cH0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDpsKyJcXGIifSx7dG9rZW46ZnVuY3Rpb24oZSl7cmV0dXJuIGEuaGFzT3duUHJvcGVydHkoZSk/ImtleXdvcmQiOmIuaGFzT3duUHJvcGVydHkoZSk/ImNvbnN0YW50Lmxhbmd1YWdlIjpnLmhhc093blByb3BlcnR5KGUpPyJpbnZhbGlkLmlsbGVnYWwiOmQuaGFzT3duUHJvcGVydHkoZSk/ImNvbnN0YW50LmxpYnJhcnkiOmguaGFzT3duUHJvcGVydHkoZSk/ImludmFsaWQuZGVwcmVjYXRlZCI6Yy5oYXNPd25Qcm9wZXJ0eShlKT8ic3VwcG9ydC5mdW5jdGlvbiI6Zi5oYXNPd25Qcm9wZXJ0eShlKT8ic3VwcG9ydC5mdW5jdGlvbiI6ImlkZW50aWZpZXIifSxyZWdleDoiW2EtekEtWl8kXVthLXpBLVowLTlfJF0qXFxiIn0se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiXFwrfFxcLXxcXCp8XFwvfCV8XFwjfFxcXnx+fDx8Pnw8PXw9Pnw9PXx+PXw9fFxcOnxcXC5cXC5cXC58XFwuXFwuIn0se3Rva2VuOiJwYXJlbi5scGFyZW4iLHJlZ2V4OiJbXFxbXFwoXFx7XSJ9LHt0b2tlbjoicGFyZW4ucnBhcmVuIixyZWdleDoiW1xcXVxcKVxcfV0ifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn1dLHFjb21tZW50Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIoPzpbXlxcXFxdfFxcXFwuKSo/XFxdXFxdIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLHFjb21tZW50MTpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiKD86W15cXFxcXXxcXFxcLikqP1xcXVxcPVxcXSIsbmV4dDoic3RhcnQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxxY29tbWVudDI6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Iig/OlteXFxcXF18XFxcXC4pKj9cXF1cXD17Mn1cXF0iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV0scWNvbW1lbnQzOlt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIoPzpbXlxcXFxdfFxcXFwuKSo/XFxdXFw9ezN9XFxdIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLHFjb21tZW50NDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiKD86W15cXFxcXXxcXFxcLikqP1xcXVxcPXs0fVxcXSIsbmV4dDoic3RhcnQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxxY29tbWVudDU6W3t0b2tlbjpmdW5jdGlvbihhKXt2YXIgYj0vXF0oXD0rKVxdLyxjPXRoaXMucnVsZXMucWNvbW1lbnQ1WzBdLGQ7Yy5uZXh0PSJzdGFydCI7aWYoKGQ9Yi5leGVjKGEpKSE9bnVsbCYmKGQ9ZFsxXSkhPXVuZGVmaW5lZCl7dmFyIGU9ZC5sZW5ndGgsZjsoZj1xLnBvcCgpKSE9ZSYmKHEucHVzaChmKSxjLm5leHQ9InFjb21tZW50NSIpfXJldHVybiJjb21tZW50In0scmVnZXg6Iig/OlteXFxcXF18XFxcXC4pKj9cXF1cXD17NX1cXD0qXFxdIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLHFzdHJpbmc6W3t0b2tlbjoic3RyaW5nIixyZWdleDoiKD86W15cXFxcXXxcXFxcLikqP1xcXVxcXSIsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLHFzdHJpbmcxOlt7dG9rZW46InN0cmluZyIscmVnZXg6Iig/OlteXFxcXF18XFxcXC4pKj9cXF1cXD1cXF0iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxxc3RyaW5nMjpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OiIoPzpbXlxcXFxdfFxcXFwuKSo/XFxdXFw9ezJ9XFxdIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV0scXN0cmluZzM6W3t0b2tlbjoic3RyaW5nIixyZWdleDoiKD86W15cXFxcXXxcXFxcLikqP1xcXVxcPXszfVxcXSIsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLHFzdHJpbmc0Olt7dG9rZW46InN0cmluZyIscmVnZXg6Iig/OlteXFxcXF18XFxcXC4pKj9cXF1cXD17NH1cXF0iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxxc3RyaW5nNTpbe3Rva2VuOmZ1bmN0aW9uKGEpe3ZhciBiPS9cXShcPSspXF0vLGM9dGhpcy5ydWxlcy5xc3RyaW5nNVswXSxkO2MubmV4dD0ic3RhcnQiO2lmKChkPWIuZXhlYyhhKSkhPW51bGwmJihkPWRbMV0pIT11bmRlZmluZWQpe3ZhciBlPWQubGVuZ3RoLGY7KGY9cS5wb3AoKSkhPWUmJihxLnB1c2goZiksYy5uZXh0PSJxc3RyaW5nNSIpfXJldHVybiJzdHJpbmcifSxyZWdleDoiKD86W15cXFxcXXxcXFxcLikqP1xcXVxcPXs1fVxcPSpcXF0iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX19O2QuaW5oZXJpdHMoZyxmKSxiLkx1YUhpZ2hsaWdodFJ1bGVzPWd9KSxmdW5jdGlvbigpe3dpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLGZ1bmN0aW9uKGEpe3dpbmRvdy5hY2V8fCh3aW5kb3cuYWNlPXt9KTtmb3IodmFyIGIgaW4gYSlhLmhhc093blByb3BlcnR5KGIpJiYoYWNlW2JdPWFbYl0pfSl9KCk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-markdown-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoKICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKiAgICAgIE1paGFpIFN1Y2FuIDxtaWhhaSBET1Qgc3VjYW4gQVQgZ21haWwgRE9UIGNvbT4KICogICAgICBDaHJpcyBTcGVuY2VyIDxjaHJpcy5hZy5zcGVuY2VyIEFUIGdvb2dsZW1haWwgRE9UIGNvbT4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvbWFya2Rvd24nLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHQnLCAnYWNlL21vZGUvamF2YXNjcmlwdCcsICdhY2UvbW9kZS94bWwnLCAnYWNlL21vZGUvaHRtbCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL21hcmtkb3duX2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsKdmFyIEphdmFTY3JpcHRNb2RlID0gcmVxdWlyZSgiLi9qYXZhc2NyaXB0IikuTW9kZTsKdmFyIFhtbE1vZGUgPSByZXF1aXJlKCIuL3htbCIpLk1vZGU7CnZhciBIdG1sTW9kZSA9IHJlcXVpcmUoIi4vaHRtbCIpLk1vZGU7CnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7CnZhciBNYXJrZG93bkhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9tYXJrZG93bl9oaWdobGlnaHRfcnVsZXMiKS5NYXJrZG93bkhpZ2hsaWdodFJ1bGVzOwoKdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsKICAgIHZhciBoaWdobGlnaHRlciA9IG5ldyBNYXJrZG93bkhpZ2hsaWdodFJ1bGVzKCk7CiAgICAKICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIoaGlnaGxpZ2h0ZXIuZ2V0UnVsZXMoKSk7CiAgICB0aGlzLiRlbWJlZHMgPSBoaWdobGlnaHRlci5nZXRFbWJlZHMoKTsKICAgIHRoaXMuY3JlYXRlTW9kZURlbGVnYXRlcyh7CiAgICAgICJqcy0iOiBKYXZhU2NyaXB0TW9kZSwKICAgICAgInhtbC0iOiBYbWxNb2RlLAogICAgICAiaHRtbC0iOiBIdG1sTW9kZQogICAgfSk7Cn07Cm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7CgooZnVuY3Rpb24oKSB7CiAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgewogICAgICAgIGlmIChzdGF0ZSA9PSAibGlzdGJsb2NrIikgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSAvXigoPzouKyk/KShbLSsqXVsgXSspLy5leGVjKGxpbmUpOwogICAgICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXkobWF0Y2hbMV0ubGVuZ3RoICsgMSkuam9pbigiICIpICsgbWF0Y2hbMl07CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gdGhpcy4kZ2V0SW5kZW50KGxpbmUpOwogICAgICAgIH0KICAgIH07Cn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOwoKZXhwb3J0cy5Nb2RlID0gTW9kZTsKfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9qYXZhc2NyaXB0JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2UvcmFuZ2UnLCAnYWNlL3dvcmtlci93b3JrZXJfY2xpZW50JywgJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnLCAnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7CnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7CnZhciBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIikuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzOwp2YXIgTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSByZXF1aXJlKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudDsKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsKdmFyIFdvcmtlckNsaWVudCA9IHJlcXVpcmUoIi4uL3dvcmtlci93b3JrZXJfY2xpZW50IikuV29ya2VyQ2xpZW50Owp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gcmVxdWlyZSgiLi9iZWhhdmlvdXIvY3N0eWxlIikuQ3N0eWxlQmVoYXZpb3VyOwp2YXIgQ1N0eWxlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGU7Cgp2YXIgTW9kZSA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7CiAgICB0aGlzLiRvdXRkZW50ID0gbmV3IE1hdGNoaW5nQnJhY2VPdXRkZW50KCk7CiAgICB0aGlzLiRiZWhhdmlvdXIgPSBuZXcgQ3N0eWxlQmVoYXZpb3VyKCk7CiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBDU3R5bGVGb2xkTW9kZSgpOwp9Owpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOwoKKGZ1bmN0aW9uKCkgewoKCiAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpIHsKICAgICAgICB2YXIgb3V0ZGVudCA9IHRydWU7CiAgICAgICAgdmFyIHJlID0gL14oXHMqKVwvXC8vOwoKICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspIHsKICAgICAgICAgICAgaWYgKCFyZS50ZXN0KGRvYy5nZXRMaW5lKGkpKSkgewogICAgICAgICAgICAgICAgb3V0ZGVudCA9IGZhbHNlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChvdXRkZW50KSB7CiAgICAgICAgICAgIHZhciBkZWxldGVSYW5nZSA9IG5ldyBSYW5nZSgwLCAwLCAwLCAwKTsKICAgICAgICAgICAgZm9yICh2YXIgaT1zdGFydFJvdzsgaTw9IGVuZFJvdzsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKGkpOwogICAgICAgICAgICAgICAgdmFyIG0gPSBsaW5lLm1hdGNoKHJlKTsKICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLnN0YXJ0LnJvdyA9IGk7CiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQucm93ID0gaTsKICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLmVuZC5jb2x1bW4gPSBtWzBdLmxlbmd0aDsKICAgICAgICAgICAgICAgIGRvYy5yZXBsYWNlKGRlbGV0ZVJhbmdlLCBtWzFdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZG9jLmluZGVudFJvd3Moc3RhcnRSb3csIGVuZFJvdywgIi8vIik7CiAgICAgICAgfQogICAgfTsKCiAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgewogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQobGluZSk7CgogICAgICAgIHZhciB0b2tlbml6ZWRMaW5lID0gdGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMobGluZSwgc3RhdGUpOwogICAgICAgIHZhciB0b2tlbnMgPSB0b2tlbml6ZWRMaW5lLnRva2VuczsKICAgICAgICB2YXIgZW5kU3RhdGUgPSB0b2tlbml6ZWRMaW5lLnN0YXRlOwoKICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXS50eXBlID09ICJjb21tZW50IikgewogICAgICAgICAgICByZXR1cm4gaW5kZW50OwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoc3RhdGUgPT0gInN0YXJ0IiB8fCBzdGF0ZSA9PSAicmVnZXhfYWxsb3dlZCIpIHsKICAgICAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXi4qKD86XGJjYXNlXGIuKlw6fFtce1woXFtdKVxzKiQvKTsKICAgICAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gdGFiOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSAiZG9jLXN0YXJ0IikgewogICAgICAgICAgICBpZiAoZW5kU3RhdGUgPT0gInN0YXJ0IiB8fCBzdGF0ZSA9PSAicmVnZXhfYWxsb3dlZCIpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eXHMqKFwvPylcKi8pOwogICAgICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgICAgIGlmIChtYXRjaFsxXSkgewogICAgICAgICAgICAgICAgICAgIGluZGVudCArPSAiICI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gIiogIjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGluZGVudDsKICAgIH07CgogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgaW5wdXQpIHsKICAgICAgICByZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQobGluZSwgaW5wdXQpOwogICAgfTsKCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgcm93KSB7CiAgICAgICAgdGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChkb2MsIHJvdyk7CiAgICB9OwogICAgCiAgICB0aGlzLmNyZWF0ZVdvcmtlciA9IGZ1bmN0aW9uKHNlc3Npb24pIHsKICAgICAgICB2YXIgd29ya2VyID0gbmV3IFdvcmtlckNsaWVudChbImFjZSJdLCAid29ya2VyLWphdmFzY3JpcHQuanMiLCAiYWNlL21vZGUvamF2YXNjcmlwdF93b3JrZXIiLCAiSmF2YVNjcmlwdFdvcmtlciIpOwogICAgICAgIHdvcmtlci5hdHRhY2hUb0RvY3VtZW50KHNlc3Npb24uZ2V0RG9jdW1lbnQoKSk7CiAgICAgICAgICAgIAogICAgICAgIHdvcmtlci5vbigianNsaW50IiwgZnVuY3Rpb24ocmVzdWx0cykgewogICAgICAgICAgICB2YXIgZXJyb3JzID0gW107CiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxyZXN1bHRzLmRhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciBlcnJvciA9IHJlc3VsdHMuZGF0YVtpXTsKICAgICAgICAgICAgICAgIGlmIChlcnJvcikKICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogZXJyb3IubGluZS0xLAogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGVycm9yLmNoYXJhY3Rlci0xLAogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBlcnJvci5yZWFzb24sCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJ3YXJuaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgbGludDogZXJyb3IKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXNzaW9uLnNldEFubm90YXRpb25zKGVycm9ycyk7CiAgICAgICAgfSk7CiAgICAgICAgCiAgICAgICAgd29ya2VyLm9uKCJuYXJjaXNzdXMiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIHNlc3Npb24uc2V0QW5ub3RhdGlvbnMoW2UuZGF0YV0pOwogICAgICAgIH0pOwogICAgICAgIAogICAgICAgIHdvcmtlci5vbigidGVybWluYXRlIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHNlc3Npb24uY2xlYXJBbm5vdGF0aW9ucygpOwogICAgICAgIH0pOwogICAgICAgIAogICAgICAgIHJldHVybiB3b3JrZXI7CiAgICB9OwoKfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7CgpleHBvcnRzLk1vZGUgPSBNb2RlOwp9KTsKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKiAgICAgIE1paGFpIFN1Y2FuIDxtaWhhaSBET1Qgc3VjYW4gQVQgZ21haWwgRE9UIGNvbT4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvdW5pY29kZScsICdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsKdmFyIHVuaWNvZGUgPSByZXF1aXJlKCIuLi91bmljb2RlIik7CnZhciBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIpLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsKdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7Cgp2YXIgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7CgogICAgLy8gc2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cwogICAgdmFyIGdsb2JhbHMgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgIC8vIENvbnN0cnVjdG9ycwogICAgICAgICgiQXJyYXl8Qm9vbGVhbnxEYXRlfEZ1bmN0aW9ufEl0ZXJhdG9yfE51bWJlcnxPYmplY3R8UmVnRXhwfFN0cmluZ3xQcm94eXwiICsKICAgICAgLy8gRTRYCiAgICAgICAgICJOYW1lc3BhY2V8UU5hbWV8WE1MfFhNTExpc3R8IiArCiAgICAgICAgICJBcnJheUJ1ZmZlcnxGbG9hdDMyQXJyYXl8RmxvYXQ2NEFycmF5fEludDE2QXJyYXl8SW50MzJBcnJheXxJbnQ4QXJyYXl8IiArCiAgICAgICAgICJVaW50MTZBcnJheXxVaW50MzJBcnJheXxVaW50OEFycmF5fFVpbnQ4Q2xhbXBlZEFycmF5fCIgKwogICAgICAvLyBFcnJvcnMKICAgICAgICAiRXJyb3J8RXZhbEVycm9yfEludGVybmFsRXJyb3J8UmFuZ2VFcnJvcnxSZWZlcmVuY2VFcnJvcnxTdG9wSXRlcmF0aW9ufCIgKwogICAgICAgICJTeW50YXhFcnJvcnxUeXBlRXJyb3J8VVJJRXJyb3J8IiArCiAgICAgIC8vICBOb24tY29uc3RydWN0b3IgZnVuY3Rpb25zCiAgICAgICAgImRlY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZW5jb2RlVVJJfGVuY29kZVVSSUNvbXBvbmVudHxldmFsfGlzRmluaXRlfCIgKwogICAgICAgICJpc05hTnxwYXJzZUZsb2F0fHBhcnNlSW50fCIgKwogICAgICAvLyBPdGhlcgogICAgICAgICJKU09OfE1hdGh8IiArCiAgICAgIC8vIFBzZXVkbwogICAgICAgICJ0aGlzfGFyZ3VtZW50c3xwcm90b3R5cGV8d2luZG93fGRvY3VtZW50IgogICAgICApLnNwbGl0KCJ8IikKICAgICk7CgogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgiYnJlYWt8Y2FzZXxjYXRjaHxjb250aW51ZXxkZWZhdWx0fGRlbGV0ZXxkb3xlbHNlfGZpbmFsbHl8Zm9yfGZ1bmN0aW9ufCIgKwogICAgICAgICJpZnxpbnxpbnN0YW5jZW9mfG5ld3xyZXR1cm58c3dpdGNofHRocm93fHRyeXx0eXBlb2Z8bGV0fHZhcnx3aGlsZXx3aXRofCIgKwogICAgICAgICJjb25zdHx5aWVsZHxpbXBvcnR8Z2V0fHNldCIpLnNwbGl0KCJ8IikKICAgICk7CgogICAgLy8ga2V5d29yZHMgd2hpY2ggY2FuIGJlIGZvbGxvd2VkIGJ5IHJlZ3VsYXIgZXhwcmVzc2lvbnMKICAgIHZhciBrd0JlZm9yZVJlID0gImNhc2V8ZG98ZWxzZXxmaW5hbGx5fGlufGluc3RhbmNlb2Z8cmV0dXJufHRocm93fHRyeXx0eXBlb2Z8eWllbGQiOwoKICAgIHZhciBkZXByZWNhdGVkID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgiX19wYXJlbnRfX3xfX2NvdW50X198ZXNjYXBlfHVuZXNjYXBlfHdpdGh8X19wcm90b19fIikuc3BsaXQoInwiKQogICAgKTsKCiAgICB2YXIgZGVmaW5pdGlvbnMgPSBsYW5nLmFycmF5VG9NYXAoKCJjb25zdHxsZXR8dmFyfGZ1bmN0aW9uIikuc3BsaXQoInwiKSk7CgogICAgdmFyIGJ1aWxkaW5Db25zdGFudHMgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCJudWxsfEluZmluaXR5fE5hTnx1bmRlZmluZWQiKS5zcGxpdCgifCIpCiAgICApOwoKICAgIHZhciBmdXR1cmVSZXNlcnZlZCA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoImNsYXNzfGVudW18ZXh0ZW5kc3xzdXBlcnxleHBvcnR8aW1wbGVtZW50c3xwcml2YXRlfCIgKwogICAgICAgICJwdWJsaWN8aW50ZXJmYWNlfHBhY2thZ2V8cHJvdGVjdGVkfHN0YXRpYyIpLnNwbGl0KCJ8IikKICAgICk7CgogICAgLy8gVE9ETzogVW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzCiAgICB2YXIgaWRlbnRpZmllclJlID0gIlsiICsgdW5pY29kZS5wYWNrYWdlcy5MICsgIlxcJF9dWyIgCiAgICAgICAgKyB1bmljb2RlLnBhY2thZ2VzLkwKICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTW4gKyB1bmljb2RlLnBhY2thZ2VzLk1jCiAgICAgICAgKyB1bmljb2RlLnBhY2thZ2VzLk5kCiAgICAgICAgKyB1bmljb2RlLnBhY2thZ2VzLlBjICsgIlxcJF9dKlxcYiI7CiAgICAgICAgCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMuIFVzZSAoPzopIGluc3RlYWQuCiAgICAvLyByZWdleHBzIGFyZSBvcmRlcmVkIC0+IHRoZSBmaXJzdCBtYXRjaCBpcyB1c2VkCgogICAgdGhpcy4kcnVsZXMgPSB7CiAgICAgICAgInN0YXJ0IiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXC8uKiQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50CiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLAogICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXScKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXS4qXFxcXCQnLAogICAgICAgICAgICAgICAgbmV4dCA6ICJxcXN0cmluZyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10iCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0CiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10uKlxcXFwkIiwKICAgICAgICAgICAgICAgIG5leHQgOiAicXN0cmluZyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleAogICAgICAgICAgICAgICAgcmVnZXggOiAiMFt4WF1bMC05YS1mQS1GXStcXGIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdAogICAgICAgICAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogWyJrZXl3b3JkLmRlZmluaXRpb24iLCAidGV4dCIsICJlbnRpdHkubmFtZS5mdW5jdGlvbiJdLAogICAgICAgICAgICAgICAgcmVnZXggOiAiKGZ1bmN0aW9uKShcXHMrKSgiICsgaWRlbnRpZmllclJlICsgIikiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLAogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86dHJ1ZXxmYWxzZSlcXGIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86IiArIGt3QmVmb3JlUmUgKyAiKVxcYiIsCiAgICAgICAgICAgICAgICBuZXh0IDogInJlZ2V4X2FsbG93ZWQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZ2xvYmFscy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUubGFuZ3VhZ2UiOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlcHJlY2F0ZWQuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuZGVwcmVjYXRlZCI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVmaW5pdGlvbnMuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQuZGVmaW5pdGlvbiI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5d29yZHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWxkaW5Db25zdGFudHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImNvbnN0YW50Lmxhbmd1YWdlIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmdXR1cmVSZXNlcnZlZC5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5pbGxlZ2FsIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA9PSAiZGVidWdnZXIiKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuZGVwcmVjYXRlZCI7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImlkZW50aWZpZXIiOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogaWRlbnRpZmllclJlCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIiwKICAgICAgICAgICAgICAgIG5leHQgIDogInJlZ2V4X2FsbG93ZWQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcP3xcXDp8XFwsfFxcO3xcXC4iLAogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ubHBhcmVuIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIltbKHtdIiwKICAgICAgICAgICAgICAgIG5leHQgIDogInJlZ2V4X2FsbG93ZWQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcLz0/IiwKICAgICAgICAgICAgICAgIG5leHQgIDogInJlZ2V4X2FsbG93ZWQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuOiAiY29tbWVudCIsCiAgICAgICAgICAgICAgICByZWdleDogIl4jIS4qJCIgCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFxzKyIKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgLy8gcmVndWxhciBleHByZXNzaW9ucyBhcmUgb25seSBhbGxvd2VkIGFmdGVyIGNlcnRhaW4gdG9rZW5zLiBUaGlzCiAgICAgICAgLy8gbWFrZXMgc3VyZSB3ZSBkb24ndCBtaXggdXAgcmVnZXhwcyB3aXRoIHRoZSBkaXZpc29uIG9wZXJhdG9yCiAgICAgICAgInJlZ2V4X2FsbG93ZWQiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnRfcmVnZXhfYWxsb3dlZCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXC8uKiQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cCIsCiAgICAgICAgICAgICAgICByZWdleDogIlxcLyIsCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXgiLAogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGVseSByZXR1cm4gdG8gdGhlIHN0YXJ0IG1vZGUgd2l0aG91dCBtYXRjaGluZwogICAgICAgICAgICAgICAgLy8gYW55dGhpbmcKICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCAKICAgICAgICAgICAgICAgIHJlZ2V4OiAiIiwKICAgICAgICAgICAgICAgIG5leHQ6ICJzdGFydCIKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInJlZ2V4IjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbjogInJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIiwKICAgICAgICAgICAgICAgIHJlZ2V4OiAiXFxcXCg/OnVbXFxkYS1mQS1GXXs0fXx4W1xcZGEtZkEtRl17Mn18LikiLAogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IgogICAgICAgICAgICB9LCB7CgkJCQkvLyBmbGFnCiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAiLCAKICAgICAgICAgICAgICAgIHJlZ2V4OiAiL1xcdyoiLAogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0IiwKICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlIAogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAiLAogICAgICAgICAgICAgICAgcmVnZXg6ICJbXlxcXFwvXFxbXSsiLAogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IiwKICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLAogICAgICAgICAgICAgICAgcmVnZXg6ICJcXFsiLAogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyIsCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbjogImVtcHR5IiwgCiAgICAgICAgICAgICAgICByZWdleDogIiIsCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiIAogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbjogInJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIiwKICAgICAgICAgICAgICAgIHJlZ2V4OiAiXFxcXCg/OnVbXFxkYS1mQS1GXXs0fXx4W1xcZGEtZkEtRl17Mn18LikiLAogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyIsCiAgICAgICAgICAgICAgICByZWdleDogIl0iLAogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IiwKICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLAogICAgICAgICAgICAgICAgcmVnZXg6ICJbXlxcXFxcXF1dKyIsCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIiwKICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCAKICAgICAgICAgICAgICAgIHJlZ2V4OiAiIiwKICAgICAgICAgICAgICAgIG5leHQ6ICJzdGFydCIgCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJjb21tZW50X3JlZ2V4X2FsbG93ZWQiIDogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50CiAgICAgICAgICAgICAgICByZWdleCA6ICIuKj9cXCpcXC8iLAogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgbmV4dCA6ICJyZWdleF9hbGxvd2VkIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyIKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgImNvbW1lbnQiIDogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY2xvc2luZyBjb21tZW50CiAgICAgICAgICAgICAgICByZWdleCA6ICIuKj9cXCpcXC8iLAogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAiLisiCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJxcXN0cmluZyIgOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgICAgICByZWdleCA6ICcoPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/IicsCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAnLisnCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJxc3RyaW5nIiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj8nIiwKICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKycKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH07CiAgICAKICAgIHRoaXMuZW1iZWRSdWxlcyhEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsICJkb2MtIiwKICAgICAgICBbIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRFbmRSdWxlKCJzdGFydCIpIF0pOwp9OwoKb29wLmluaGVyaXRzKEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsKCmV4cG9ydHMuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzID0gSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzOwp9KTsKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsKCnZhciBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsKCiAgICB0aGlzLiRydWxlcyA9IHsKICAgICAgICAic3RhcnQiIDogWyB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jLnRhZyIsCiAgICAgICAgICAgIHJlZ2V4IDogIkBbXFx3XFxkX10rIiAvLyBUT0RPOiBmaXggZW1haWwgYWRkcmVzc2VzCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiXFxzKyIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICJUT0RPIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlteQFxcKl0rIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIi4iCiAgICAgICAgfV0KICAgIH07Cn07Cgpvb3AuaW5oZXJpdHMoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOwoKKGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuZ2V0U3RhcnRSdWxlID0gZnVuY3Rpb24oc3RhcnQpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsIC8vIGRvYyBjb21tZW50CiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqKD89XFwqKSIsCiAgICAgICAgICAgIG5leHQgIDogc3RhcnQKICAgICAgICB9OwogICAgfTsKICAgIAogICAgdGhpcy5nZXRFbmRSdWxlID0gZnVuY3Rpb24gKHN0YXJ0KSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLCAvLyBjbG9zaW5nIGNvbW1lbnQKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICJcXCpcXC8iLAogICAgICAgICAgICBuZXh0ICA6IHN0YXJ0CiAgICAgICAgfTsKICAgIH07Cgp9KS5jYWxsKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcy5wcm90b3R5cGUpOwoKZXhwb3J0cy5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM7Cgp9KTsKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7Cgp2YXIgTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBmdW5jdGlvbigpIHt9OwoKKGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24obGluZSwgaW5wdXQpIHsKICAgICAgICBpZiAoISAvXlxzKyQvLnRlc3QobGluZSkpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgICAgcmV0dXJuIC9eXHMqXH0vLnRlc3QoaW5wdXQpOwogICAgfTsKCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oZG9jLCByb3cpIHsKICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKHJvdyk7CiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccypcfSkvKTsKCiAgICAgICAgaWYgKCFtYXRjaCkgcmV0dXJuIDA7CgogICAgICAgIHZhciBjb2x1bW4gPSBtYXRjaFsxXS5sZW5ndGg7CiAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IGRvYy5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW59KTsKCiAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MgfHwgb3BlbkJyYWNlUG9zLnJvdyA9PSByb3cpIHJldHVybiAwOwoKICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsKICAgICAgICBkb2MucmVwbGFjZShuZXcgUmFuZ2Uocm93LCAwLCByb3csIGNvbHVtbi0xKSwgaW5kZW50KTsKICAgIH07CgogICAgdGhpcy4kZ2V0SW5kZW50ID0gZnVuY3Rpb24obGluZSkgewogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMrKS8pOwogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gIiI7CiAgICB9OwoKfSkuY2FsbChNYXRjaGluZ0JyYWNlT3V0ZGVudC5wcm90b3R5cGUpOwoKZXhwb3J0cy5NYXRjaGluZ0JyYWNlT3V0ZGVudCA9IE1hdGNoaW5nQnJhY2VPdXRkZW50Owp9KTsKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvZXZlbnRfZW1pdHRlciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoIi4uL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOwoKdmFyIFdvcmtlckNsaWVudCA9IGZ1bmN0aW9uKHRvcExldmVsTmFtZXNwYWNlcywgcGFja2FnZWRKcywgbW9kLCBjbGFzc25hbWUpIHsKCiAgICB0aGlzLmNoYW5nZUxpc3RlbmVyID0gdGhpcy5jaGFuZ2VMaXN0ZW5lci5iaW5kKHRoaXMpOwoKICAgIGlmIChtb2R1bGUucGFja2FnZWQpIHsKICAgICAgICB2YXIgYmFzZSA9IHRoaXMuJGd1ZXNzQmFzZVBhdGgoKTsKICAgICAgICB0aGlzLiR3b3JrZXIgPSBuZXcgV29ya2VyKGJhc2UgKyBwYWNrYWdlZEpzKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHZhciB3b3JrZXJVcmwgPSB0aGlzLiRub3JtYWxpemVQYXRoKHJlcXVpcmUubmFtZVRvVXJsKCJhY2Uvd29ya2VyL3dvcmtlciIsIG51bGwsICJfIikpOwogICAgICAgIHRoaXMuJHdvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyVXJsKTsKCiAgICAgICAgdmFyIHRsbnMgPSB7fTsKICAgICAgICBmb3IgKHZhciBpPTA7IGk8dG9wTGV2ZWxOYW1lc3BhY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBucyA9IHRvcExldmVsTmFtZXNwYWNlc1tpXTsKICAgICAgICAgICAgdmFyIHBhdGggPSB0aGlzLiRub3JtYWxpemVQYXRoKHJlcXVpcmUubmFtZVRvVXJsKG5zLCBudWxsLCAiXyIpLnJlcGxhY2UoLy5qcyQvLCAiIikpOwoKICAgICAgICAgICAgdGxuc1tuc10gPSBwYXRoOwogICAgICAgIH0KICAgIH0KCiAgICB0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2UoewogICAgICAgIGluaXQgOiB0cnVlLAogICAgICAgIHRsbnM6IHRsbnMsCiAgICAgICAgbW9kdWxlOiBtb2QsCiAgICAgICAgY2xhc3NuYW1lOiBjbGFzc25hbWUKICAgIH0pOwoKICAgIHRoaXMuY2FsbGJhY2tJZCA9IDE7CiAgICB0aGlzLmNhbGxiYWNrcyA9IHt9OwoKICAgIHZhciBfc2VsZiA9IHRoaXM7CiAgICB0aGlzLiR3b3JrZXIub25lcnJvciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICB3aW5kb3cuY29uc29sZSAmJiBjb25zb2xlLmxvZyAmJiBjb25zb2xlLmxvZyhlKTsKICAgICAgICB0aHJvdyBlOwogICAgfTsKICAgIHRoaXMuJHdvcmtlci5vbm1lc3NhZ2UgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgdmFyIG1zZyA9IGUuZGF0YTsKICAgICAgICBzd2l0Y2gobXNnLnR5cGUpIHsKICAgICAgICAgICAgY2FzZSAibG9nIjoKICAgICAgICAgICAgICAgIHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUubG9nICYmIGNvbnNvbGUubG9nKG1zZy5kYXRhKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAiZXZlbnQiOgogICAgICAgICAgICAgICAgX3NlbGYuX2VtaXQobXNnLm5hbWUsIHtkYXRhOiBtc2cuZGF0YX0pOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICJjYWxsIjoKICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IF9zZWxmLmNhbGxiYWNrc1ttc2cuaWRdOwogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobXNnLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBfc2VsZi5jYWxsYmFja3NbbXNnLmlkXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH07Cn07CgooZnVuY3Rpb24oKXsKCiAgICBvb3AuaW1wbGVtZW50KHRoaXMsIEV2ZW50RW1pdHRlcik7CgogICAgdGhpcy4kbm9ybWFsaXplUGF0aCA9IGZ1bmN0aW9uKHBhdGgpIHsKICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9eW2Etel0rOlwvXC9bXlwvXStcLy8sICIiKTsgLy8gUmVtb3ZlIGRvbWFpbiBuYW1lIGFuZCByZWJ1aWxkIGl0CiAgICAgICAgcGF0aCA9IGxvY2F0aW9uLnByb3RvY29sICsgIi8vIiArIGxvY2F0aW9uLmhvc3QKICAgICAgICAgICAgLy8gcGF0aHMgc3RhcnRpbmcgd2l0aCBhIHNsYXNoIGFyZSByZWxhdGl2ZSB0byB0aGUgcm9vdCAoaG9zdCkKICAgICAgICAgICAgKyAocGF0aC5jaGFyQXQoMCkgPT0gIi8iID8gIiIgOiBsb2NhdGlvbi5wYXRobmFtZS5yZXBsYWNlKC9cL1teXC9dKiQvLCAiIikpCiAgICAgICAgICAgICsgIi8iICsgcGF0aC5yZXBsYWNlKC9eW1wvXSsvLCAiIik7CiAgICAgICAgcmV0dXJuIHBhdGg7CiAgICB9OwoKICAgIHRoaXMuJGd1ZXNzQmFzZVBhdGggPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAocmVxdWlyZS5hY2VCYXNlVXJsKQogICAgICAgICAgICByZXR1cm4gcmVxdWlyZS5hY2VCYXNlVXJsOwoKICAgICAgICB2YXIgc2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKTsKICAgICAgICBmb3IgKHZhciBpPTA7IGk8c2NyaXB0cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgc2NyaXB0ID0gc2NyaXB0c1tpXTsKCiAgICAgICAgICAgIHZhciBiYXNlID0gc2NyaXB0LmdldEF0dHJpYnV0ZSgiZGF0YS1hY2UtYmFzZSIpOwogICAgICAgICAgICBpZiAoYmFzZSkKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlLnJlcGxhY2UoL1wvKiQvLCAiLyIpOwoKICAgICAgICAgICAgdmFyIHNyYyA9IHNjcmlwdC5zcmMgfHwgc2NyaXB0LmdldEF0dHJpYnV0ZSgic3JjIik7CiAgICAgICAgICAgIGlmICghc3JjKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbSA9IHNyYy5tYXRjaCgvXig/OiguKlwvKWFjZVwuanN8KC4qXC8pYWNlKC11bmNvbXByZXNzZWQpPygtbm9jb25mbGljdCk/XC5qcykoPzpcP3wkKS8pOwogICAgICAgICAgICBpZiAobSkKICAgICAgICAgICAgICAgIHJldHVybiBtWzFdIHx8IG1bMl07CiAgICAgICAgfQogICAgICAgIHJldHVybiAiIjsKICAgIH07CgogICAgdGhpcy50ZXJtaW5hdGUgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9lbWl0KCJ0ZXJtaW5hdGUiLCB7fSk7CiAgICAgICAgdGhpcy4kd29ya2VyLnRlcm1pbmF0ZSgpOwogICAgICAgIHRoaXMuJHdvcmtlciA9IG51bGw7CiAgICAgICAgdGhpcy4kZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwogICAgICAgIHRoaXMuJGRvYyA9IG51bGw7CiAgICB9OwoKICAgIHRoaXMuc2VuZCA9IGZ1bmN0aW9uKGNtZCwgYXJncykgewogICAgICAgIHRoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7Y29tbWFuZDogY21kLCBhcmdzOiBhcmdzfSk7CiAgICB9OwoKICAgIHRoaXMuY2FsbCA9IGZ1bmN0aW9uKGNtZCwgYXJncywgY2FsbGJhY2spIHsKICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5jYWxsYmFja0lkKys7CiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tzW2lkXSA9IGNhbGxiYWNrOwogICAgICAgICAgICBhcmdzLnB1c2goaWQpOwogICAgICAgIH0KICAgICAgICB0aGlzLnNlbmQoY21kLCBhcmdzKTsKICAgIH07CgogICAgdGhpcy5lbWl0ID0gZnVuY3Rpb24oZXZlbnQsIGRhdGEpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICAvLyBmaXJlZm94IHJlZnVzZXMgdG8gY2xvbmUgb2JqZWN0cyB3aGljaCBoYXZlIGZ1bmN0aW9uIHByb3BlcnRpZXMKICAgICAgICAgICAgLy8gVE9ETzogY2xlYW51cCBldmVudAogICAgICAgICAgICB0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2V2ZW50OiBldmVudCwgZGF0YToge2RhdGE6IGRhdGEuZGF0YX19KTsKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXgpIHt9CiAgICB9OwoKICAgIHRoaXMuYXR0YWNoVG9Eb2N1bWVudCA9IGZ1bmN0aW9uKGRvYykgewogICAgICAgIGlmKHRoaXMuJGRvYykKICAgICAgICAgICAgdGhpcy50ZXJtaW5hdGUoKTsKCiAgICAgICAgdGhpcy4kZG9jID0gZG9jOwogICAgICAgIHRoaXMuY2FsbCgic2V0VmFsdWUiLCBbZG9jLmdldFZhbHVlKCldKTsKICAgICAgICBkb2Mub24oImNoYW5nZSIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwogICAgfTsKCiAgICB0aGlzLmNoYW5nZUxpc3RlbmVyID0gZnVuY3Rpb24oZSkgewogICAgICAgIGUucmFuZ2UgPSB7CiAgICAgICAgICAgIHN0YXJ0OiBlLmRhdGEucmFuZ2Uuc3RhcnQsCiAgICAgICAgICAgIGVuZDogZS5kYXRhLnJhbmdlLmVuZAogICAgICAgIH07CiAgICAgICAgdGhpcy5lbWl0KCJjaGFuZ2UiLCBlKTsKICAgIH07Cgp9KS5jYWxsKFdvcmtlckNsaWVudC5wcm90b3R5cGUpOwoKZXhwb3J0cy5Xb3JrZXJDbGllbnQgPSBXb3JrZXJDbGllbnQ7Cgp9KTsKLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoKICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBDaHJpcyBTcGVuY2VyIDxjaHJpcy5hZy5zcGVuY2VyIEFUIGdvb2dsZW1haWwgRE9UIGNvbT4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvYmVoYXZpb3VyJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOwp2YXIgQmVoYXZpb3VyID0gcmVxdWlyZSgnLi4vYmVoYXZpb3VyJykuQmVoYXZpb3VyOwoKdmFyIENzdHlsZUJlaGF2aW91ciA9IGZ1bmN0aW9uICgpIHsKCiAgICB0aGlzLmFkZCgiYnJhY2VzIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsKICAgICAgICBpZiAodGV4dCA9PSAneycpIHsKICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOwogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsKICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAneycgKyBzZWxlY3RlZCArICd9JywKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7fScsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnfScpIHsKICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOwogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7CiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7CiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hpbmcgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQoJ30nLCB7Y29sdW1uOiBjdXJzb3IuY29sdW1uICsgMSwgcm93OiBjdXJzb3Iucm93fSk7CiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmcgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gIlxuIikgewogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsKICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsKICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsKICAgICAgICAgICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBzZXNzaW9uLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzogY3Vyc29yLnJvdywgY29sdW1uOiBjdXJzb3IuY29sdW1uICsgMX0pOwogICAgICAgICAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwoKICAgICAgICAgICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLmdldE5leHRMaW5lSW5kZW50KHN0YXRlLCBsaW5lLnN1YnN0cmluZygwLCBsaW5lLmxlbmd0aCAtIDEpLCBzZXNzaW9uLmdldFRhYlN0cmluZygpKTsKICAgICAgICAgICAgICAgIHZhciBuZXh0X2luZGVudCA9IHRoaXMuJGdldEluZGVudChzZXNzaW9uLmRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICdcbicgKyBpbmRlbnQgKyAnXG4nICsgbmV4dF9pbmRlbnQsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgaW5kZW50Lmxlbmd0aCwgMSwgaW5kZW50Lmxlbmd0aF0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgewogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7CiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICd7JykgewogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsKICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLmVuZC5jb2x1bW4sIHJhbmdlLmVuZC5jb2x1bW4gKyAxKTsKICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsKICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsKICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKICAgIHRoaXMuYWRkKCJwYXJlbnMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgewogICAgICAgIGlmICh0ZXh0ID09ICcoJykgewogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7CiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcoJyArIHNlbGVjdGVkICsgJyknLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygpJywKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICcpJykgewogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsKICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsKICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnKScpIHsKICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnKScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsKICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKICAgIHRoaXMuYWRkKCJwYXJlbnMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgewogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7CiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICcoJykgewogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsKICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiArIDEsIHJhbmdlLnN0YXJ0LmNvbHVtbiArIDIpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgewogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOwogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsKICAgICAgICBpZiAodGV4dCA9PSAnIicpIHsKICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOwogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsKICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIicgKyBzZWxlY3RlZCArICciJywKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7CiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7CiAgICAgICAgICAgICAgICB2YXIgbGVmdENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLTEsIGN1cnNvci5jb2x1bW4pOwoKICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGVzY2FwZWQuCiAgICAgICAgICAgICAgICBpZiAobGVmdENoYXIgPT0gJ1xcJykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIEZpbmQgd2hhdCB0b2tlbiB3ZSdyZSBpbnNpZGUuCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gc2Vzc2lvbi5nZXRUb2tlbnMoc2VsZWN0aW9uLnN0YXJ0LnJvdywgc2VsZWN0aW9uLnN0YXJ0LnJvdylbMF0udG9rZW5zOwogICAgICAgICAgICAgICAgdmFyIGNvbCA9IDAsIHRva2VuOwogICAgICAgICAgICAgICAgdmFyIHF1b3RlcG9zID0gLTE7IC8vIFRyYWNrIHdoZXRoZXIgd2UncmUgaW5zaWRlIGFuIG9wZW4gcXVvdGUuCgogICAgICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB0b2tlbnMubGVuZ3RoOyB4KyspIHsKICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2Vuc1t4XTsKICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PSAic3RyaW5nIikgewogICAgICAgICAgICAgICAgICAgICAgcXVvdGVwb3MgPSAtMTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHF1b3RlcG9zIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgcXVvdGVwb3MgPSB0b2tlbi52YWx1ZS5pbmRleE9mKCciJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgodG9rZW4udmFsdWUubGVuZ3RoICsgY29sKSA+IHNlbGVjdGlvbi5zdGFydC5jb2x1bW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbCArPSB0b2tlbnNbeF0udmFsdWUubGVuZ3RoOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFRyeSBhbmQgYmUgc21hcnQgYWJvdXQgd2hlbiB3ZSBhdXRvIGluc2VydC4KICAgICAgICAgICAgICAgIGlmICghdG9rZW4gfHwgKHF1b3RlcG9zIDwgMCAmJiB0b2tlbi50eXBlICE9PSAiY29tbWVudCIgJiYgKHRva2VuLnR5cGUgIT09ICJzdHJpbmciIHx8ICgoc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbiAhPT0gdG9rZW4udmFsdWUubGVuZ3RoK2NvbC0xKSAmJiB0b2tlbi52YWx1ZS5sYXN0SW5kZXhPZignIicpID09PSB0b2tlbi52YWx1ZS5sZW5ndGgtMSkpKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICciIicsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsMV0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuICYmIHRva2VuLnR5cGUgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGlucHV0IGFuZCBtb3ZlIHJpZ2h0IG9uZSBpZiB3ZSdyZSB0eXBpbmcgb3ZlciB0aGUgY2xvc2luZyBxdW90ZS4KICAgICAgICAgICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOwogICAgICAgICAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiZGVsZXRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCByYW5nZSkgewogICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShyYW5nZSk7CiAgICAgICAgaWYgKCFyYW5nZS5pc011bHRpTGluZSgpICYmIHNlbGVjdGVkID09ICciJykgewogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUocmFuZ2Uuc3RhcnQucm93KTsKICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiArIDEsIHJhbmdlLnN0YXJ0LmNvbHVtbiArIDIpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICciJykgewogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOwogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7Cgp9Cm9vcC5pbmhlcml0cyhDc3R5bGVCZWhhdmlvdXIsIEJlaGF2aW91cik7CgpleHBvcnRzLkNzdHlsZUJlaGF2aW91ciA9IENzdHlsZUJlaGF2aW91cjsKfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL3JhbmdlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOwp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOwp2YXIgQmFzZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZTsKCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9Owpvb3AuaW5oZXJpdHMoRm9sZE1vZGUsIEJhc2VGb2xkTW9kZSk7CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSAvKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLzsKICAgIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIgPSAvXlteXFtce10qKFx9fFxdKXxeW1xzXCpdKihcKlwvKS87CiAgICAKICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsKICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOwogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpOwogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4OwoKICAgICAgICAgICAgaWYgKG1hdGNoWzFdKQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayhzZXNzaW9uLCBtYXRjaFsxXSwgcm93LCBpKTsKCiAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkgKyBtYXRjaFswXS5sZW5ndGgpOwogICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7CiAgICAgICAgICAgIHJldHVybiByYW5nZTsKICAgICAgICB9CgogICAgICAgIGlmIChmb2xkU3R5bGUgIT09ICJtYXJrYmVnaW5lbmQiKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIAogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2godGhpcy5mb2xkaW5nU3RvcE1hcmtlcik7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7CgogICAgICAgICAgICBpZiAobWF0Y2hbMl0pIHsKICAgICAgICAgICAgICAgIHZhciByYW5nZSA9IHNlc3Npb24uZ2V0Q29tbWVudEZvbGRSYW5nZShyb3csIGkpOwogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOwogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZW5kID0ge3Jvdzogcm93LCBjb2x1bW46IGl9OwogICAgICAgICAgICB2YXIgc3RhcnQgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQobWF0Y2hbMV0sIGVuZCk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoIXN0YXJ0KQogICAgICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICAgICAgc3RhcnQuY29sdW1uKys7CiAgICAgICAgICAgIGVuZC5jb2x1bW4tLTsKCiAgICAgICAgICAgIHJldHVybiAgUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsKICAgICAgICB9CiAgICB9OwogICAgCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsKCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsKCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9OwoKKGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyID0gbnVsbDsKICAgIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIgPSBudWxsOwoKICAgIC8vIG11c3QgcmV0dXJuICIiIGlmIHRoZXJlJ3Mgbm8gZm9sZCwgdG8gZW5hYmxlIGNhY2hpbmcKICAgIHRoaXMuZ2V0Rm9sZFdpZGdldCA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7CiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICBpZiAodGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChsaW5lKSkKICAgICAgICAgICAgcmV0dXJuICJzdGFydCI7CiAgICAgICAgaWYgKGZvbGRTdHlsZSA9PSAibWFya2JlZ2luZW5kIgogICAgICAgICAgICAgICAgJiYgdGhpcy5mb2xkaW5nU3RvcE1hcmtlcgogICAgICAgICAgICAgICAgJiYgdGhpcy5mb2xkaW5nU3RvcE1hcmtlci50ZXN0KGxpbmUpKQogICAgICAgICAgICByZXR1cm4gImVuZCI7CiAgICAgICAgcmV0dXJuICIiOwogICAgfTsKICAgIAogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgewogICAgICAgIHJldHVybiBudWxsOwogICAgfTsKCiAgICB0aGlzLmluZGVudGF0aW9uQmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCByb3csIGNvbHVtbikgewogICAgICAgIHZhciByZSA9IC9eXHMqLzsKICAgICAgICB2YXIgc3RhcnRSb3cgPSByb3c7CiAgICAgICAgdmFyIGVuZFJvdyA9IHJvdzsKICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOwogICAgICAgIHZhciBzdGFydENvbHVtbiA9IGNvbHVtbiB8fCBsaW5lLmxlbmd0aDsKICAgICAgICB2YXIgc3RhcnRMZXZlbCA9IGxpbmUubWF0Y2gocmUpWzBdLmxlbmd0aDsKICAgICAgICB2YXIgbWF4Um93ID0gc2Vzc2lvbi5nZXRMZW5ndGgoKQogICAgICAgIAogICAgICAgIHdoaWxlICgrK3JvdyA8IG1heFJvdykgewogICAgICAgICAgICBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgICAgIHZhciBsZXZlbCA9IGxpbmUubWF0Y2gocmUpWzBdLmxlbmd0aDsKCiAgICAgICAgICAgIGlmIChsZXZlbCA9PSBsaW5lLmxlbmd0aCkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgaWYgKGxldmVsIDw9IHN0YXJ0TGV2ZWwpCiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGVuZFJvdyA9IHJvdzsKICAgICAgICB9CgogICAgICAgIGlmIChlbmRSb3cgPiBzdGFydFJvdykgewogICAgICAgICAgICB2YXIgZW5kQ29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZFJvdykubGVuZ3RoOwogICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHN0YXJ0Um93LCBzdGFydENvbHVtbiwgZW5kUm93LCBlbmRDb2x1bW4pOwogICAgICAgIH0KICAgIH07CgogICAgdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgYnJhY2tldCwgcm93LCBjb2x1bW4pIHsKICAgICAgICB2YXIgc3RhcnQgPSB7cm93OiByb3csIGNvbHVtbjogY29sdW1uICsgMX07CiAgICAgICAgdmFyIGVuZCA9IHNlc3Npb24uJGZpbmRDbG9zaW5nQnJhY2tldChicmFja2V0LCBzdGFydCk7CiAgICAgICAgaWYgKCFlbmQpCiAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgdmFyIGZ3ID0gc2Vzc2lvbi5mb2xkV2lkZ2V0c1tlbmQucm93XTsKICAgICAgICBpZiAoZncgPT0gbnVsbCkKICAgICAgICAgICAgZncgPSB0aGlzLmdldEZvbGRXaWRnZXQoc2Vzc2lvbiwgZW5kLnJvdyk7CgogICAgICAgIGlmIChmdyA9PSAic3RhcnQiKSB7CiAgICAgICAgICAgIGVuZC5yb3cgLS07CiAgICAgICAgICAgIGVuZC5jb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kLnJvdykubGVuZ3RoOwogICAgICAgIH0KICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsKICAgIH07Cgp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7Cgp9KTsKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS94bWwnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHQnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS94bWxfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL2JlaGF2aW91ci94bWwnLCAnYWNlL21vZGUvZm9sZGluZy94bWwnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7CnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7CnZhciBYbWxIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4veG1sX2hpZ2hsaWdodF9ydWxlcyIpLlhtbEhpZ2hsaWdodFJ1bGVzOwp2YXIgWG1sQmVoYXZpb3VyID0gcmVxdWlyZSgiLi9iZWhhdmlvdXIveG1sIikuWG1sQmVoYXZpb3VyOwp2YXIgWG1sRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcveG1sIikuRm9sZE1vZGU7Cgp2YXIgTW9kZSA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgWG1sSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsKICAgIHRoaXMuJGJlaGF2aW91ciA9IG5ldyBYbWxCZWhhdmlvdXIoKTsKICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IFhtbEZvbGRNb2RlKCk7Cn07Cgpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOwoKKGZ1bmN0aW9uKCkgewogICAgCiAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgewogICAgICAgIHJldHVybiB0aGlzLiRnZXRJbmRlbnQobGluZSk7CiAgICB9OwoKfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7CgpleHBvcnRzLk1vZGUgPSBNb2RlOwp9KTsKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS94bWxfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS94bWxfdXRpbCcsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIHhtbFV0aWwgPSByZXF1aXJlKCIuL3htbF91dGlsIik7CnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOwoKdmFyIFhtbEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7CgogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzCiAgICAvLyByZWdleHBzIGFyZSBvcmRlcmVkIC0+IHRoZSBmaXJzdCBtYXRjaCBpcyB1c2VkCiAgICB0aGlzLiRydWxlcyA9IHsKICAgICAgICBzdGFydCA6IFt7CiAgICAgICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgICAgICByZWdleCA6ICI8XFwhXFxbQ0RBVEFcXFsiLAogICAgICAgICAgICBuZXh0IDogImNkYXRhIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAieG1sX3BlIiwKICAgICAgICAgICAgcmVnZXggOiAiPFxcPy4qP1xcPz4iCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICI8XFwhLS0iLAogICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJtZXRhLnRhZyIsIC8vIG9wZW5pbmcgdGFnCiAgICAgICAgICAgIHJlZ2V4IDogIjxcXC8/IiwKICAgICAgICAgICAgbmV4dCA6ICJ0YWciCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgcmVnZXggOiAiXFxzKyIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgICAgICByZWdleCA6ICJbXjxdKyIKICAgICAgICB9XSwKICAgICAgICAKICAgICAgICBjZGF0YSA6IFt7CiAgICAgICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgICAgICByZWdleCA6ICJcXF1cXF0+IiwKICAgICAgICAgICAgbmV4dCA6ICJzdGFydCIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgICAgICByZWdleCA6ICJcXHMrIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsCiAgICAgICAgICAgIHJlZ2V4IDogIig/OlteXFxdXXxcXF0oPyFcXF0+KSkrIgogICAgICAgIH1dLAoKICAgICAgICBjb21tZW50IDogW3sKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgIHJlZ2V4IDogIi4qPy0tPiIsCiAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICIuKyIKICAgICAgICB9XQogICAgfTsKICAgIAogICAgeG1sVXRpbC50YWcodGhpcy4kcnVsZXMsICJ0YWciLCAic3RhcnQiKTsKfTsKCm9vcC5pbmhlcml0cyhYbWxIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsKCmV4cG9ydHMuWG1sSGlnaGxpZ2h0UnVsZXMgPSBYbWxIaWdobGlnaHRSdWxlczsKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUveG1sX3V0aWwnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvbGFuZyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOwoKdmFyIGZvcm1UYWdzID0gbGFuZy5hcnJheVRvTWFwKAogICAgKCJidXR0b258Zm9ybXxpbnB1dHxsYWJlbHxzZWxlY3R8dGV4dGFyZWEiKS5zcGxpdCgifCIpCik7Cgp2YXIgdGFibGVUYWdzID0gbGFuZy5hcnJheVRvTWFwKAogICAgKCJ0YWJsZXx0Ym9keXx0ZHx0Zm9vdHx0aHx0ciIpLnNwbGl0KCJ8IikKKTsKCmZ1bmN0aW9uIHN0cmluZyhzdGF0ZSkgewogICAgcmV0dXJuIFt7CiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICByZWdleCA6ICciLio/IicKICAgIH0sIHsKICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydAogICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICByZWdleCA6ICdbIl0uKicsCiAgICAgICAgbmV4dCA6IHN0YXRlICsgIi1xcXN0cmluZyIKICAgIH0sIHsKICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgIHJlZ2V4IDogIicuKj8nIgogICAgfSwgewogICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0CiAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgIHJlZ2V4IDogIlsnXS4qIiwKICAgICAgICBuZXh0IDogc3RhdGUgKyAiLXFzdHJpbmciCiAgICB9XTsKfQoKZnVuY3Rpb24gbXVsdGlMaW5lU3RyaW5nKHF1b3RlLCBzdGF0ZSkgewogICAgcmV0dXJuIFt7CiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgcmVnZXggOiAiLio/IiArIHF1b3RlLAogICAgICAgIG5leHQgOiBzdGF0ZQogICAgfSwgewogICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgIHJlZ2V4IDogJy4rJwogICAgfV07Cn0KCmV4cG9ydHMudGFnID0gZnVuY3Rpb24oc3RhdGVzLCBuYW1lLCBuZXh0U3RhdGUpIHsKICAgIHN0YXRlc1tuYW1lXSA9IFt7CiAgICAgICAgdG9rZW4gOiAidGV4dCIsCiAgICAgICAgcmVnZXggOiAiXFxzKyIKICAgIH0sIHsKICAgICAgICAvL3Rva2VuIDogIm1ldGEudGFnIiwKICAgICAgICAKICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgaWYgKCB2YWx1ZT09PSdhJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAibWV0YS50YWcuYW5jaG9yIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICggdmFsdWU9PT0naW1nJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAibWV0YS50YWcuaW1hZ2UiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCB2YWx1ZT09PSdzY3JpcHQnICkgewogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy5zY3JpcHQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCB2YWx1ZT09PSdzdHlsZScgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnLnN0eWxlIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChmb3JtVGFncy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZS50b0xvd2VyQ2FzZSgpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy5mb3JtIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0YWJsZVRhZ3MuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAibWV0YS50YWcudGFibGUiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZyI7CiAgICAgICAgICAgIH0KICAgICAgICB9LCAgICAgICAgCiAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgIHJlZ2V4IDogIlstX2EtekEtWjAtOTohXSsiLAogICAgICAgIG5leHQgOiBuYW1lICsgImVtYmVkLWF0dHJpYnV0ZS1saXN0IiAKICAgIH0sIHsKICAgICAgICB0b2tlbjogImVtcHR5IiwKICAgICAgICByZWdleDogIiIsCiAgICAgICAgbmV4dCA6IG5hbWUgKyAiZW1iZWQtYXR0cmlidXRlLWxpc3QiCiAgICB9XTsKCiAgICBzdGF0ZXNbbmFtZSArICItcXN0cmluZyJdID0gbXVsdGlMaW5lU3RyaW5nKCInIiwgbmFtZSArICJlbWJlZC1hdHRyaWJ1dGUtbGlzdCIpOwogICAgc3RhdGVzW25hbWUgKyAiLXFxc3RyaW5nIl0gPSBtdWx0aUxpbmVTdHJpbmcoIlwiIiwgbmFtZSArICJlbWJlZC1hdHRyaWJ1dGUtbGlzdCIpOwogICAgCiAgICBzdGF0ZXNbbmFtZSArICJlbWJlZC1hdHRyaWJ1dGUtbGlzdCJdID0gW3sKICAgICAgICB0b2tlbiA6ICJtZXRhLnRhZyIsCiAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgIHJlZ2V4IDogIlwvPz4iLAogICAgICAgIG5leHQgOiBuZXh0U3RhdGUKICAgIH0sIHsKICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwKICAgICAgICByZWdleCA6ICI9IgogICAgfSwgewogICAgICAgIHRva2VuIDogImVudGl0eS5vdGhlci5hdHRyaWJ1dGUtbmFtZSIsCiAgICAgICAgcmVnZXggOiAiWy1fYS16QS1aMC05Ol0rIgogICAgfSwgewogICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdAogICAgICAgIHJlZ2V4IDogIlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIgogICAgfSwgewogICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgIHJlZ2V4IDogIlxccysiCiAgICB9XS5jb25jYXQoc3RyaW5nKG5hbWUpKTsKfTsKCn0pOwovKiB2aW06dHM9NDpzdHM9NDpzdz00OgogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIENocmlzIFNwZW5jZXIgPGNocmlzLmFnLnNwZW5jZXIgQVQgZ29vZ2xlbWFpbCBET1QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9iZWhhdmlvdXIveG1sJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9iZWhhdmlvdXInLCAnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsKdmFyIEJlaGF2aW91ciA9IHJlcXVpcmUoIi4uL2JlaGF2aW91ciIpLkJlaGF2aW91cjsKdmFyIENzdHlsZUJlaGF2aW91ciA9IHJlcXVpcmUoIi4vY3N0eWxlIikuQ3N0eWxlQmVoYXZpb3VyOwoKdmFyIFhtbEJlaGF2aW91ciA9IGZ1bmN0aW9uICgpIHsKICAgIAogICAgdGhpcy5pbmhlcml0KENzdHlsZUJlaGF2aW91ciwgWyJzdHJpbmdfZHF1b3RlcyJdKTsgLy8gR2V0IHN0cmluZyBiZWhhdmlvdXIKICAgIAogICAgdGhpcy5hZGQoImJyYWNrZXRzIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsKICAgICAgICBpZiAodGV4dCA9PSAnPCcpIHsKICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOwogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsKICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnPD4nLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJz4nKSB7CiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICc+JykgeyAvLyBuZWVkIHNvbWUga2luZCBvZiBtYXRjaGluZyBjaGVjayBoZXJlCiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gIlxuIikgewogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsKICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhcnMgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMik7CiAgICAgICAgICAgIGlmIChyaWdodENoYXJzID09ICc8LycpIHsKICAgICAgICAgICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KSkgKyBzZXNzaW9uLmdldFRhYlN0cmluZygpOwogICAgICAgICAgICAgICAgdmFyIG5leHRfaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdykpOwoKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xuJyArIGluZGVudCArICdcbicgKyBuZXh0X2luZGVudCwKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCBpbmRlbnQubGVuZ3RoLCAxLCBpbmRlbnQubGVuZ3RoXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CiAgICAKfQpvb3AuaW5oZXJpdHMoWG1sQmVoYXZpb3VyLCBCZWhhdmlvdXIpOwoKZXhwb3J0cy5YbWxCZWhhdmlvdXIgPSBYbWxCZWhhdmlvdXI7Cn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy94bWwnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnLCAnYWNlL3Rva2VuX2l0ZXJhdG9yJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOwp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uLy4uL2xpYi9sYW5nIik7CnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7CnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOwp2YXIgVG9rZW5JdGVyYXRvciA9IHJlcXVpcmUoIi4uLy4uL3Rva2VuX2l0ZXJhdG9yIikuVG9rZW5JdGVyYXRvcjsKCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbih2b2lkRWxlbWVudHMpIHsKICAgIEJhc2VGb2xkTW9kZS5jYWxsKHRoaXMpOwogICAgdGhpcy52b2lkRWxlbWVudHMgPSB2b2lkRWxlbWVudHMgfHwge307Cn07Cm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmdldEZvbGRXaWRnZXQgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgewogICAgICAgIHZhciB0YWcgPSB0aGlzLl9nZXRGaXJzdFRhZ0luTGluZShzZXNzaW9uLCByb3cpOwoKICAgICAgICBpZiAodGFnLmNsb3NpbmcpCiAgICAgICAgICAgIHJldHVybiBmb2xkU3R5bGUgPT0gIm1hcmtiZWdpbmVuZCIgPyAiZW5kIiA6ICIiOwoKICAgICAgICBpZiAoIXRhZy50YWdOYW1lIHx8IHRoaXMudm9pZEVsZW1lbnRzW3RhZy50YWdOYW1lLnRvTG93ZXJDYXNlKCldKQogICAgICAgICAgICByZXR1cm4gIiI7CgogICAgICAgIGlmICh0YWcuc2VsZkNsb3NpbmcpCiAgICAgICAgICAgIHJldHVybiAiIjsKCiAgICAgICAgaWYgKHRhZy52YWx1ZS5pbmRleE9mKCIvIiArIHRhZy50YWdOYW1lKSAhPT0gLTEpCiAgICAgICAgICAgIHJldHVybiAiIjsKCiAgICAgICAgcmV0dXJuICJzdGFydCI7CiAgICB9OwogICAgCiAgICB0aGlzLl9nZXRGaXJzdFRhZ0luTGluZSA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdykgewogICAgICAgIHZhciB0b2tlbnMgPSBzZXNzaW9uLmdldFRva2Vucyhyb3csIHJvdylbMF0udG9rZW5zOwogICAgICAgIHZhciB2YWx1ZSA9ICIiOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpXTsKICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUuaW5kZXhPZigibWV0YS50YWciKSA9PT0gMCkKICAgICAgICAgICAgICAgIHZhbHVlICs9IHRva2VuLnZhbHVlOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB2YWx1ZSArPSBsYW5nLnN0cmluZ1JlcGVhdCgiICIsIHRva2VuLnZhbHVlLmxlbmd0aCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiB0aGlzLl9wYXJzZVRhZyh2YWx1ZSk7CiAgICB9OwoKICAgIHRoaXMudGFnUmUgPSAvXihccyopKDw/KFwvPykoWy1fYS16QS1aMC05OiFdKilccyooXC8/KT4/KS87CiAgICB0aGlzLl9wYXJzZVRhZyA9IGZ1bmN0aW9uKHRhZykgewogICAgICAgIAogICAgICAgIHZhciBtYXRjaCA9IHRoaXMudGFnUmUuZXhlYyh0YWcpOwogICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLnRhZ1JlLmxhc3RJbmRleCB8fCAwOwogICAgICAgIHRoaXMudGFnUmUubGFzdEluZGV4ID0gMDsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdmFsdWU6IHRhZywKICAgICAgICAgICAgbWF0Y2g6IG1hdGNoID8gbWF0Y2hbMl0gOiAiIiwKICAgICAgICAgICAgY2xvc2luZzogbWF0Y2ggPyAhIW1hdGNoWzNdIDogZmFsc2UsCiAgICAgICAgICAgIHNlbGZDbG9zaW5nOiBtYXRjaCA/ICEhbWF0Y2hbNV0gfHwgbWF0Y2hbMl0gPT0gIi8+IiA6IGZhbHNlLAogICAgICAgICAgICB0YWdOYW1lOiBtYXRjaCA/IG1hdGNoWzRdIDogIiIsCiAgICAgICAgICAgIGNvbHVtbjogbWF0Y2hbMV0gPyBjb2x1bW4gKyBtYXRjaFsxXS5sZW5ndGggOiBjb2x1bW4KICAgICAgICB9OwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiByZWFkcyBhIGZ1bGwgdGFnIGFuZCBwbGFjZXMgdGhlIGl0ZXJhdG9yIGFmdGVyIHRoZSB0YWcKICAgICAqLwogICAgdGhpcy5fcmVhZFRhZ0ZvcndhcmQgPSBmdW5jdGlvbihpdGVyYXRvcikgewogICAgICAgIHZhciB0b2tlbiA9IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbigpOwogICAgICAgIGlmICghdG9rZW4pCiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAKICAgICAgICB2YXIgdmFsdWUgPSAiIjsKICAgICAgICB2YXIgc3RhcnQ7CiAgICAgICAgCiAgICAgICAgZG8gewogICAgICAgICAgICBpZiAodG9rZW4udHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpID09PSAwKSB7CiAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gewogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpLAogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhbHVlICs9IHRva2VuLnZhbHVlOwogICAgICAgICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoIj4iKSAhPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGFnID0gdGhpcy5fcGFyc2VUYWcodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIHRhZy5zdGFydCA9IHN0YXJ0OwogICAgICAgICAgICAgICAgICAgIHRhZy5lbmQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuUm93KCksCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkgKyB0b2tlbi52YWx1ZS5sZW5ndGgKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnN0ZXBGb3J3YXJkKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhZzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gd2hpbGUodG9rZW4gPSBpdGVyYXRvci5zdGVwRm9yd2FyZCgpKTsKICAgICAgICAKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH07CiAgICAKICAgIHRoaXMuX3JlYWRUYWdCYWNrd2FyZCA9IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7CiAgICAgICAgdmFyIHRva2VuID0gaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuKCk7CiAgICAgICAgaWYgKCF0b2tlbikKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIAogICAgICAgIHZhciB2YWx1ZSA9ICIiOwogICAgICAgIHZhciBlbmQ7CgogICAgICAgIGRvIHsKICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUuaW5kZXhPZigibWV0YS50YWciKSA9PT0gMCkgewogICAgICAgICAgICAgICAgaWYgKCFlbmQpIHsKICAgICAgICAgICAgICAgICAgICBlbmQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuUm93KCksCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkgKyB0b2tlbi52YWx1ZS5sZW5ndGgKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFsdWUgPSB0b2tlbi52YWx1ZSArIHZhbHVlOwogICAgICAgICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoIjwiKSAhPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGFnID0gdGhpcy5fcGFyc2VUYWcodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIHRhZy5lbmQgPSBlbmQ7CiAgICAgICAgICAgICAgICAgICAgdGFnLnN0YXJ0ID0gewogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpLAogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5zdGVwQmFja3dhcmQoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSB3aGlsZSh0b2tlbiA9IGl0ZXJhdG9yLnN0ZXBCYWNrd2FyZCgpKTsKICAgICAgICAKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH07CiAgICAKICAgIHRoaXMuX3BvcCA9IGZ1bmN0aW9uKHN0YWNrLCB0YWcpIHsKICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoKSB7CiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgdG9wID0gc3RhY2tbc3RhY2subGVuZ3RoLTFdOwogICAgICAgICAgICBpZiAoIXRhZyB8fCB0b3AudGFnTmFtZSA9PSB0YWcudGFnTmFtZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrLnBvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMudm9pZEVsZW1lbnRzW3RhZy50YWdOYW1lXSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMudm9pZEVsZW1lbnRzW3RvcC50YWdOYW1lXSkgewogICAgICAgICAgICAgICAgc3RhY2sucG9wKCk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKICAgIAogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgewogICAgICAgIHZhciBmaXJzdFRhZyA9IHRoaXMuX2dldEZpcnN0VGFnSW5MaW5lKHNlc3Npb24sIHJvdyk7CiAgICAgICAgCiAgICAgICAgaWYgKCFmaXJzdFRhZy5tYXRjaCkKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgCiAgICAgICAgdmFyIGlzQmFja3dhcmQgPSBmaXJzdFRhZy5jbG9zaW5nIHx8IGZpcnN0VGFnLnNlbGZDbG9zaW5nOwogICAgICAgIHZhciBzdGFjayA9IFtdOwogICAgICAgIHZhciB0YWc7CiAgICAgICAgCiAgICAgICAgaWYgKCFpc0JhY2t3YXJkKSB7CiAgICAgICAgICAgIHZhciBpdGVyYXRvciA9IG5ldyBUb2tlbkl0ZXJhdG9yKHNlc3Npb24sIHJvdywgZmlyc3RUYWcuY29sdW1uKTsKICAgICAgICAgICAgdmFyIHN0YXJ0ID0gewogICAgICAgICAgICAgICAgcm93OiByb3csCiAgICAgICAgICAgICAgICBjb2x1bW46IGZpcnN0VGFnLmNvbHVtbiArIGZpcnN0VGFnLnRhZ05hbWUubGVuZ3RoICsgMgogICAgICAgICAgICB9OwogICAgICAgICAgICB3aGlsZSAodGFnID0gdGhpcy5fcmVhZFRhZ0ZvcndhcmQoaXRlcmF0b3IpKSB7CiAgICAgICAgICAgICAgICBpZiAodGFnLnNlbGZDbG9zaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFjay5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGFnLnN0YXJ0LmNvbHVtbiArPSB0YWcudGFnTmFtZS5sZW5ndGggKyAyOwogICAgICAgICAgICAgICAgICAgICAgICB0YWcuZW5kLmNvbHVtbiAtPSAyOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyh0YWcuc3RhcnQsIHRhZy5lbmQpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKHRhZy5jbG9zaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcG9wKHN0YWNrLCB0YWcpOwogICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIHRhZy5zdGFydCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRhZykKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gbmV3IFRva2VuSXRlcmF0b3Ioc2Vzc2lvbiwgcm93LCBmaXJzdFRhZy5jb2x1bW4gKyBmaXJzdFRhZy5tYXRjaC5sZW5ndGgpOwogICAgICAgICAgICB2YXIgZW5kID0gewogICAgICAgICAgICAgICAgcm93OiByb3csCiAgICAgICAgICAgICAgICBjb2x1bW46IGZpcnN0VGFnLmNvbHVtbgogICAgICAgICAgICB9OwogICAgICAgICAgICAKICAgICAgICAgICAgd2hpbGUgKHRhZyA9IHRoaXMuX3JlYWRUYWdCYWNrd2FyZChpdGVyYXRvcikpIHsKICAgICAgICAgICAgICAgIGlmICh0YWcuc2VsZkNsb3NpbmcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YWNrLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQuY29sdW1uICs9IHRhZy50YWdOYW1lLmxlbmd0aCArIDI7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5lbmQuY29sdW1uIC09IDI7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHRhZy5zdGFydCwgdGFnLmVuZCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoIXRhZy5jbG9zaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcG9wKHN0YWNrLCB0YWcpOwogICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQuY29sdW1uICs9IHRhZy50YWdOYW1lLmxlbmd0aCArIDI7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHRhZy5zdGFydCwgZW5kKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRhZykKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgIH07Cgp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7Cgp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2h0bWwnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHQnLCAnYWNlL21vZGUvamF2YXNjcmlwdCcsICdhY2UvbW9kZS9jc3MnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS9odG1sX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9iZWhhdmlvdXIveG1sJywgJ2FjZS9tb2RlL2ZvbGRpbmcvaHRtbCddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsKdmFyIEphdmFTY3JpcHRNb2RlID0gcmVxdWlyZSgiLi9qYXZhc2NyaXB0IikuTW9kZTsKdmFyIENzc01vZGUgPSByZXF1aXJlKCIuL2NzcyIpLk1vZGU7CnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7CnZhciBIdG1sSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2h0bWxfaGlnaGxpZ2h0X3J1bGVzIikuSHRtbEhpZ2hsaWdodFJ1bGVzOwp2YXIgWG1sQmVoYXZpb3VyID0gcmVxdWlyZSgiLi9iZWhhdmlvdXIveG1sIikuWG1sQmVoYXZpb3VyOwp2YXIgSHRtbEZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkaW5nL2h0bWwiKS5Gb2xkTW9kZTsKCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaGlnaGxpZ2h0ZXIgPSBuZXcgSHRtbEhpZ2hsaWdodFJ1bGVzKCk7CiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKGhpZ2hsaWdodGVyLmdldFJ1bGVzKCkpOwogICAgdGhpcy4kYmVoYXZpb3VyID0gbmV3IFhtbEJlaGF2aW91cigpOwogICAgCiAgICB0aGlzLiRlbWJlZHMgPSBoaWdobGlnaHRlci5nZXRFbWJlZHMoKTsKICAgIHRoaXMuY3JlYXRlTW9kZURlbGVnYXRlcyh7CiAgICAgICAgImpzLSI6IEphdmFTY3JpcHRNb2RlLAogICAgICAgICJjc3MtIjogQ3NzTW9kZQogICAgfSk7CiAgICAKICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IEh0bWxGb2xkTW9kZSgpOwp9Owpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOwoKKGZ1bmN0aW9uKCkgewoKICAgIAogICAgdGhpcy50b2dnbGVDb21tZW50TGluZXMgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCBzdGFydFJvdywgZW5kUm93KSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9OwoKICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJGdldEluZGVudChsaW5lKTsKICAgIH07CgogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgaW5wdXQpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwoKfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7CgpleHBvcnRzLk1vZGUgPSBNb2RlOwp9KTsKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9jc3MnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHQnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS9jc3NfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCAnYWNlL3dvcmtlci93b3JrZXJfY2xpZW50JywgJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOwp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOwp2YXIgQ3NzSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2Nzc19oaWdobGlnaHRfcnVsZXMiKS5Dc3NIaWdobGlnaHRSdWxlczsKdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gcmVxdWlyZSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQ7CnZhciBXb3JrZXJDbGllbnQgPSByZXF1aXJlKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudDsKdmFyIENTdHlsZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlOwoKdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IENzc0hpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSwgImkiKTsKICAgIHRoaXMuJG91dGRlbnQgPSBuZXcgTWF0Y2hpbmdCcmFjZU91dGRlbnQoKTsKICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IENTdHlsZUZvbGRNb2RlKCk7Cn07Cm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5mb2xkaW5nUnVsZXMgPSAiY1N0eWxlIjsKCiAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgewogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQobGluZSk7CgogICAgICAgIC8vIGlnbm9yZSBicmFjZXMgaW4gY29tbWVudHMKICAgICAgICB2YXIgdG9rZW5zID0gdGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMobGluZSwgc3RhdGUpLnRva2VuczsKICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXS50eXBlID09ICJjb21tZW50IikgewogICAgICAgICAgICByZXR1cm4gaW5kZW50OwogICAgICAgIH0KCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXi4qXHtccyokLyk7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIGluZGVudCArPSB0YWI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaW5kZW50OwogICAgfTsKCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCBpbnB1dCkgewogICAgICAgIHJldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChsaW5lLCBpbnB1dCk7CiAgICB9OwoKICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCByb3cpIHsKICAgICAgICB0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGRvYywgcm93KTsKICAgIH07CiAgICAKICAgIHRoaXMuY3JlYXRlV29ya2VyID0gZnVuY3Rpb24oc2Vzc2lvbikgewogICAgICAgIHZhciB3b3JrZXIgPSBuZXcgV29ya2VyQ2xpZW50KFsiYWNlIl0sICJ3b3JrZXItY3NzLmpzIiwgImFjZS9tb2RlL2Nzc193b3JrZXIiLCAiV29ya2VyIik7CiAgICAgICAgd29ya2VyLmF0dGFjaFRvRG9jdW1lbnQoc2Vzc2lvbi5nZXREb2N1bWVudCgpKTsKICAgICAgICAKICAgICAgICB3b3JrZXIub24oImNzc2xpbnQiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIHZhciBlcnJvcnMgPSBbXTsKICAgICAgICAgICAgZS5kYXRhLmZvckVhY2goZnVuY3Rpb24obWVzc2FnZSkgewogICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goewogICAgICAgICAgICAgICAgICAgIHJvdzogbWVzc2FnZS5saW5lIC0gMSwKICAgICAgICAgICAgICAgICAgICBjb2x1bW46IG1lc3NhZ2UuY29sIC0gMSwKICAgICAgICAgICAgICAgICAgICB0ZXh0OiBtZXNzYWdlLm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgdHlwZTogbWVzc2FnZS50eXBlLAogICAgICAgICAgICAgICAgICAgIGxpbnQ6IG1lc3NhZ2UKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHNlc3Npb24uc2V0QW5ub3RhdGlvbnMoZXJyb3JzKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gd29ya2VyOwogICAgfTsKCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOwoKZXhwb3J0cy5Nb2RlID0gTW9kZTsKCn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2Nzc19oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOwp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsKCnZhciBDc3NIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgewoKICAgIHZhciBwcm9wZXJ0aWVzID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgiLW1vei1hcHBlYXJhbmNlfC1tb3otYm94LXNpemluZ3wtd2Via2l0LWJveC1zaXppbmd8LW1vei1vdXRsaW5lLXJhZGl1c3wtbW96LXRyYW5zZm9ybXwtd2Via2l0LXRyYW5zZm9ybXwiICsKICAgICAgICAiYXBwZWFyYW5jZXxhemltdXRofGJhY2tncm91bmQtYXR0YWNobWVudHxiYWNrZ3JvdW5kLWNvbG9yfGJhY2tncm91bmQtaW1hZ2V8IiArCiAgICAgICAgImJhY2tncm91bmQtb3JpZ2lufGJhY2tncm91bmQtcG9zaXRpb258YmFja2dyb3VuZC1yZXBlYXR8YmFja2dyb3VuZHxib3JkZXItYm90dG9tLWNvbG9yfCIgKwogICAgICAgICJib3JkZXItYm90dG9tLXN0eWxlfGJvcmRlci1ib3R0b20td2lkdGh8Ym9yZGVyLWJvdHRvbXxib3JkZXItY29sbGFwc2V8IiArCiAgICAgICAgImJvcmRlci1jb2xvcnxib3JkZXItbGVmdC1jb2xvcnxib3JkZXItbGVmdC1zdHlsZXxib3JkZXItbGVmdC13aWR0aHwiICsKICAgICAgICAiYm9yZGVyLWxlZnR8Ym9yZGVyLXJpZ2h0LWNvbG9yfGJvcmRlci1yaWdodC1zdHlsZXxib3JkZXItcmlnaHQtd2lkdGh8IiArCiAgICAgICAgImJvcmRlci1yaWdodHxib3JkZXItc3BhY2luZ3xib3JkZXItc3R5bGV8Ym9yZGVyLXRvcC1jb2xvcnwiICsKICAgICAgICAiYm9yZGVyLXRvcC1zdHlsZXxib3JkZXItdG9wLXdpZHRofGJvcmRlci10b3B8Ym9yZGVyLXdpZHRofGJvcmRlcnwiICsKICAgICAgICAiYm90dG9tfGJveC1zaXppbmd8Y2FwdGlvbi1zaWRlfGNsZWFyfGNsaXB8Y29sb3J8Y29udGVudHxjb3VudGVyLWluY3JlbWVudHwiICsKICAgICAgICAiY291bnRlci1yZXNldHxjdWUtYWZ0ZXJ8Y3VlLWJlZm9yZXxjdWV8Y3Vyc29yfGRpcmVjdGlvbnxkaXNwbGF5fCIgKwogICAgICAgICJlbGV2YXRpb258ZW1wdHktY2VsbHN8ZmxvYXR8Zm9udC1mYW1pbHl8Zm9udC1zaXplLWFkanVzdHxmb250LXNpemV8IiArCiAgICAgICAgImZvbnQtc3RyZXRjaHxmb250LXN0eWxlfGZvbnQtdmFyaWFudHxmb250LXdlaWdodHxmb250fGhlaWdodHxsZWZ0fCIgKwogICAgICAgICJsZXR0ZXItc3BhY2luZ3xsaW5lLWhlaWdodHxsaXN0LXN0eWxlLWltYWdlfGxpc3Qtc3R5bGUtcG9zaXRpb258IiArCiAgICAgICAgImxpc3Qtc3R5bGUtdHlwZXxsaXN0LXN0eWxlfG1hcmdpbi1ib3R0b218bWFyZ2luLWxlZnR8bWFyZ2luLXJpZ2h0fCIgKwogICAgICAgICJtYXJnaW4tdG9wfG1hcmtlci1vZmZzZXR8bWFyZ2lufG1hcmtzfG1heC1oZWlnaHR8bWF4LXdpZHRofG1pbi1oZWlnaHR8IiArCiAgICAgICAgIm1pbi13aWR0aHwtbW96LWJvcmRlci1yYWRpdXN8b3BhY2l0eXxvcnBoYW5zfG91dGxpbmUtY29sb3J8b3V0bGluZS1vZmZzZXR8b3V0bGluZS1yYWRpdXN8IiArCiAgICAgICAgIm91dGxpbmUtc3R5bGV8b3V0bGluZS13aWR0aHxvdXRsaW5lfG92ZXJmbG93fG92ZXJmbG93LXh8b3ZlcmZsb3cteXxwYWRkaW5nLWJvdHRvbXwiICsKICAgICAgICAicGFkZGluZy1sZWZ0fHBhZGRpbmctcmlnaHR8cGFkZGluZy10b3B8cGFkZGluZ3xwYWdlLWJyZWFrLWFmdGVyfCIgKwogICAgICAgICJwYWdlLWJyZWFrLWJlZm9yZXxwYWdlLWJyZWFrLWluc2lkZXxwYWdlfHBhdXNlLWFmdGVyfHBhdXNlLWJlZm9yZXwiICsKICAgICAgICAicGF1c2V8cGl0Y2gtcmFuZ2V8cGl0Y2h8cGxheS1kdXJpbmd8cG9pbnRlci1ldmVudHN8cG9zaXRpb258cXVvdGVzfHJlc2l6ZXxyaWNobmVzc3xyaWdodHwiICsKICAgICAgICAic2l6ZXxzcGVhay1oZWFkZXJ8c3BlYWstbnVtZXJhbHxzcGVhay1wdW5jdHVhdGlvbnxzcGVlY2gtcmF0ZXxzcGVha3wiICsKICAgICAgICAic3RyZXNzfHRhYmxlLWxheW91dHx0ZXh0LWFsaWdufHRleHQtZGVjb3JhdGlvbnx0ZXh0LWluZGVudHwiICsKICAgICAgICAidGV4dC1zaGFkb3d8dGV4dC10cmFuc2Zvcm18dG9wfHRyYW5zZm9ybXx1bmljb2RlLWJpZGl8dmVydGljYWwtYWxpZ258IiArCiAgICAgICAgInZpc2liaWxpdHl8dm9pY2UtZmFtaWx5fHZvbHVtZXx3aGl0ZS1zcGFjZXx3aWRvd3N8d2lkdGh8d29yZC1zcGFjaW5nfCIgKwogICAgICAgICJ6LWluZGV4Iikuc3BsaXQoInwiKQogICAgKTsKCiAgICB2YXIgZnVuY3Rpb25zID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgicmdifHJnYmF8dXJsfGF0dHJ8Y291bnRlcnxjb3VudGVycyIpLnNwbGl0KCJ8IikKICAgICk7CgogICAgdmFyIGNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoImFic29sdXRlfGFsbC1zY3JvbGx8YWx3YXlzfGFybWVuaWFufGF1dG98YmFzZWxpbmV8YmVsb3d8YmlkaS1vdmVycmlkZXwiICsKICAgICAgICAiYmxvY2t8Ym9sZHxib2xkZXJ8Ym9yZGVyLWJveHxib3RofGJvdHRvbXxicmVhay1hbGx8YnJlYWstd29yZHxjYXBpdGFsaXplfGNlbnRlcnwiICsKICAgICAgICAiY2hhcnxjaXJjbGV8Y2prLWlkZW9ncmFwaGljfGNvbC1yZXNpemV8Y29sbGFwc2V8Y29udGVudC1ib3h8Y3Jvc3NoYWlyfGRhc2hlZHwiICsKICAgICAgICAiZGVjaW1hbC1sZWFkaW5nLXplcm98ZGVjaW1hbHxkZWZhdWx0fGRpc2FibGVkfGRpc2N8IiArCiAgICAgICAgImRpc3RyaWJ1dGUtYWxsLWxpbmVzfGRpc3RyaWJ1dGUtbGV0dGVyfGRpc3RyaWJ1dGUtc3BhY2V8IiArCiAgICAgICAgImRpc3RyaWJ1dGV8ZG90dGVkfGRvdWJsZXxlLXJlc2l6ZXxlbGxpcHNpc3xmaXhlZHxnZW9yZ2lhbnxncm9vdmV8IiArCiAgICAgICAgImhhbmR8aGVicmV3fGhlbHB8aGlkZGVufGhpcmFnYW5hLWlyb2hhfGhpcmFnYW5hfGhvcml6b250YWx8IiArCiAgICAgICAgImlkZW9ncmFwaC1hbHBoYXxpZGVvZ3JhcGgtbnVtZXJpY3xpZGVvZ3JhcGgtcGFyZW50aGVzaXN8IiArCiAgICAgICAgImlkZW9ncmFwaC1zcGFjZXxpbmFjdGl2ZXxpbmhlcml0fGlubGluZS1ibG9ja3xpbmxpbmV8aW5zZXR8aW5zaWRlfCIgKwogICAgICAgICJpbnRlci1pZGVvZ3JhcGh8aW50ZXItd29yZHxpdGFsaWN8anVzdGlmeXxrYXRha2FuYS1pcm9oYXxrYXRha2FuYXwiICsKICAgICAgICAia2VlcC1hbGx8bGVmdHxsaWdodGVyfGxpbmUtZWRnZXxsaW5lLXRocm91Z2h8bGluZXxsaXN0LWl0ZW18bG9vc2V8IiArCiAgICAgICAgImxvd2VyLWFscGhhfGxvd2VyLWdyZWVrfGxvd2VyLWxhdGlufGxvd2VyLXJvbWFufGxvd2VyY2FzZXxsci10YnxsdHJ8IiArCiAgICAgICAgIm1lZGl1bXxtaWRkbGV8bW92ZXxuLXJlc2l6ZXxuZS1yZXNpemV8bmV3c3BhcGVyfG5vLWRyb3B8bm8tcmVwZWF0fCIgKwogICAgICAgICJudy1yZXNpemV8bm9uZXxub3JtYWx8bm90LWFsbG93ZWR8bm93cmFwfG9ibGlxdWV8b3V0c2V0fG91dHNpZGV8IiArCiAgICAgICAgIm92ZXJsaW5lfHBvaW50ZXJ8cHJvZ3Jlc3N8cmVsYXRpdmV8cmVwZWF0LXh8cmVwZWF0LXl8cmVwZWF0fHJpZ2h0fCIgKwogICAgICAgICJyaWRnZXxyb3ctcmVzaXplfHJ0bHxzLXJlc2l6ZXxzY3JvbGx8c2UtcmVzaXplfHNlcGFyYXRlfHNtYWxsLWNhcHN8IiArCiAgICAgICAgInNvbGlkfHNxdWFyZXxzdGF0aWN8c3RyaWN0fHN1cGVyfHN3LXJlc2l6ZXx0YWJsZS1mb290ZXItZ3JvdXB8IiArCiAgICAgICAgInRhYmxlLWhlYWRlci1ncm91cHx0Yi1ybHx0ZXh0LWJvdHRvbXx0ZXh0LXRvcHx0ZXh0fHRoaWNrfHRoaW58dG9wfCIgKwogICAgICAgICJ0cmFuc3BhcmVudHx1bmRlcmxpbmV8dXBwZXItYWxwaGF8dXBwZXItbGF0aW58dXBwZXItcm9tYW58dXBwZXJjYXNlfCIgKwogICAgICAgICJ2ZXJ0aWNhbC1pZGVvZ3JhcGhpY3x2ZXJ0aWNhbC10ZXh0fHZpc2libGV8dy1yZXNpemV8d2FpdHx3aGl0ZXNwYWNlfCIgKwogICAgICAgICJ6ZXJvIikuc3BsaXQoInwiKQogICAgKTsKCiAgICB2YXIgY29sb3JzID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgiYXF1YXxibGFja3xibHVlfGZ1Y2hzaWF8Z3JheXxncmVlbnxsaW1lfG1hcm9vbnxuYXZ5fG9saXZlfG9yYW5nZXwiICsKICAgICAgICAicHVycGxlfHJlZHxzaWx2ZXJ8dGVhbHx3aGl0ZXx5ZWxsb3ciKS5zcGxpdCgifCIpCiAgICApOwoKICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcy4gVXNlICg/OikgaW5zdGVhZC4KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQKCiAgICB2YXIgbnVtUmUgPSAiXFwtPyg/Oig/OlswLTldKyl8KD86WzAtOV0qXFwuWzAtOV0rKSkiOwoKICAgIHZhciBiYXNlX3J1bGVzZXQgPSBbCiAgICAgICAgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50CiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwKICAgICAgICAgICAgbmV4dCA6ICJydWxlc2V0X2NvbW1lbnQiCiAgICAgICAgfSx7CiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lCiAgICAgICAgICAgIHJlZ2V4IDogJ1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQogICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsCiAgICAgICAgICAgIHJlZ2V4IDogbnVtUmUgKyAiKD86ZW18ZXh8cHh8Y218bW18aW58cHR8cGN8ZGVnfHJhZHxncmFkfG1zfHN8aHp8a2h6fCUpIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsICAvLyBoZXg2IGNvbG9yCiAgICAgICAgICAgIHJlZ2V4IDogIiNbYS1mMC05XXs2fSIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBoZXgzIGNvbG9yCiAgICAgICAgICAgIHJlZ2V4IDogIiNbYS1mMC05XXszfSIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LnR5cGUiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZnVuY3Rpb25zLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmZ1bmN0aW9uIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnN0YW50cy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZS50b0xvd2VyQ2FzZSgpKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5jb25zdGFudCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2xvcnMuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuY29uc3RhbnQuY29sb3IiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ0ZXh0IjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmVnZXggOiAiXFwtP1thLXpBLVpfXVthLXpBLVowLTlfXFwtXSoiCiAgICAgICAgfQogICAgICBdOwoKICAgIHZhciBydWxlc2V0ID0gbGFuZy5jb3B5QXJyYXkoYmFzZV9ydWxlc2V0KTsKICAgIHJ1bGVzZXQudW5zaGlmdCh7CiAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwKICAgICAgICByZWdleCA6ICJcXH0iLAogICAgICAgIG5leHQ6ICAgInN0YXJ0IgogICAgfSk7CgogICAgdmFyIG1lZGlhX3J1bGVzZXQgPSBsYW5nLmNvcHlBcnJheSggYmFzZV9ydWxlc2V0ICk7CiAgICBtZWRpYV9ydWxlc2V0LnVuc2hpZnQoewogICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsCiAgICAgICAgcmVnZXggOiAiXFx9IiwKICAgICAgICBuZXh0OiAgICJtZWRpYSIKICAgIH0pOwoKICAgIHZhciBiYXNlX2NvbW1lbnQgPSBbewogICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQogICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgcmVnZXggOiAiLisiCiAgICB9XTsKCiAgICB2YXIgY29tbWVudCA9IGxhbmcuY29weUFycmF5KGJhc2VfY29tbWVudCk7CiAgICBjb21tZW50LnVuc2hpZnQoewogICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudAogICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwKICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICB9KTsKCiAgICB2YXIgbWVkaWFfY29tbWVudCA9IGxhbmcuY29weUFycmF5KGJhc2VfY29tbWVudCk7CiAgICBtZWRpYV9jb21tZW50LnVuc2hpZnQoewogICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudAogICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwKICAgICAgICAgIG5leHQgOiAibWVkaWEiCiAgICB9KTsKCiAgICB2YXIgcnVsZXNldF9jb21tZW50ID0gbGFuZy5jb3B5QXJyYXkoYmFzZV9jb21tZW50KTsKICAgIHJ1bGVzZXRfY29tbWVudC51bnNoaWZ0KHsKICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQKICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsCiAgICAgICAgICBuZXh0IDogInJ1bGVzZXQiCiAgICB9KTsKCiAgICB0aGlzLiRydWxlcyA9IHsKICAgICAgICAic3RhcnQiIDogW3sKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsCiAgICAgICAgICAgIG5leHQgOiAiY29tbWVudCIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuOiAicGFyZW4ubHBhcmVuIiwKICAgICAgICAgICAgcmVnZXg6ICJcXHsiLAogICAgICAgICAgICBuZXh0OiAgInJ1bGVzZXQiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbjogInN0cmluZyIsCiAgICAgICAgICAgIHJlZ2V4OiAiQC4qP3siLAogICAgICAgICAgICBuZXh0OiAgIm1lZGlhIgogICAgICAgIH0sewogICAgICAgICAgICB0b2tlbjogImtleXdvcmQiLAogICAgICAgICAgICByZWdleDogIiNbYS16MC05LV9dKyIKICAgICAgICB9LHsKICAgICAgICAgICAgdG9rZW46ICJ2YXJpYWJsZSIsCiAgICAgICAgICAgIHJlZ2V4OiAiXFwuW2EtejAtOS1fXSsiCiAgICAgICAgfSx7CiAgICAgICAgICAgIHRva2VuOiAic3RyaW5nIiwKICAgICAgICAgICAgcmVnZXg6ICI6W2EtejAtOS1fXSsiCiAgICAgICAgfSx7CiAgICAgICAgICAgIHRva2VuOiAiY29uc3RhbnQiLAogICAgICAgICAgICByZWdleDogIlthLXowLTktX10rIgogICAgICAgIH1dLAoKICAgICAgICAibWVkaWEiIDogWyB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLAogICAgICAgICAgICBuZXh0IDogIm1lZGlhX2NvbW1lbnQiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbjogInBhcmVuLmxwYXJlbiIsCiAgICAgICAgICAgIHJlZ2V4OiAiXFx7IiwKICAgICAgICAgICAgbmV4dDogICJtZWRpYV9ydWxlc2V0IgogICAgICAgIH0sewogICAgICAgICAgICB0b2tlbjogInN0cmluZyIsCiAgICAgICAgICAgIHJlZ2V4OiAiXFx9IiwKICAgICAgICAgICAgbmV4dDogICJzdGFydCIKICAgICAgICB9LHsKICAgICAgICAgICAgdG9rZW46ICJrZXl3b3JkIiwKICAgICAgICAgICAgcmVnZXg6ICIjW2EtejAtOS1fXSsiCiAgICAgICAgfSx7CiAgICAgICAgICAgIHRva2VuOiAidmFyaWFibGUiLAogICAgICAgICAgICByZWdleDogIlxcLlthLXowLTktX10rIgogICAgICAgIH0sewogICAgICAgICAgICB0b2tlbjogInN0cmluZyIsCiAgICAgICAgICAgIHJlZ2V4OiAiOlthLXowLTktX10rIgogICAgICAgIH0sewogICAgICAgICAgICB0b2tlbjogImNvbnN0YW50IiwKICAgICAgICAgICAgcmVnZXg6ICJbYS16MC05LV9dKyIKICAgICAgICB9XSwKCiAgICAgICAgImNvbW1lbnQiIDogY29tbWVudCwKCiAgICAgICAgInJ1bGVzZXQiIDogcnVsZXNldCwKICAgICAgICAicnVsZXNldF9jb21tZW50IiA6IHJ1bGVzZXRfY29tbWVudCwKCiAgICAgICAgIm1lZGlhX3J1bGVzZXQiIDogbWVkaWFfcnVsZXNldCwKICAgICAgICAibWVkaWFfY29tbWVudCIgOiBtZWRpYV9jb21tZW50CiAgICB9Owp9OwoKb29wLmluaGVyaXRzKENzc0hpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOwoKZXhwb3J0cy5Dc3NIaWdobGlnaHRSdWxlcyA9IENzc0hpZ2hsaWdodFJ1bGVzOwoKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvaHRtbF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL2Nzc19oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUveG1sX3V0aWwnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBDc3NIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vY3NzX2hpZ2hsaWdodF9ydWxlcyIpLkNzc0hpZ2hsaWdodFJ1bGVzOwp2YXIgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIpLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlczsKdmFyIHhtbFV0aWwgPSByZXF1aXJlKCIuL3htbF91dGlsIik7CnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOwoKdmFyIEh0bWxIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgewoKICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcwogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZAogICAgdGhpcy4kcnVsZXMgPSB7CiAgICAgICAgc3RhcnQgOiBbewogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICI8XFwhXFxbQ0RBVEFcXFsiLAogICAgICAgICAgICBuZXh0IDogImNkYXRhIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAieG1sX3BlIiwKICAgICAgICAgICAgcmVnZXggOiAiPFxcPy4qP1xcPz4iCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICI8XFwhLS0iLAogICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJtZXRhLnRhZyIsCiAgICAgICAgICAgIHJlZ2V4IDogIjwoPz1ccypzY3JpcHRcXGIpIiwKICAgICAgICAgICAgbmV4dCA6ICJzY3JpcHQiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJtZXRhLnRhZyIsCiAgICAgICAgICAgIHJlZ2V4IDogIjwoPz1ccypzdHlsZVxcYikiLAogICAgICAgICAgICBuZXh0IDogImNzcyIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogIm1ldGEudGFnIiwgLy8gb3BlbmluZyB0YWcKICAgICAgICAgICAgcmVnZXggOiAiPFxcLz8iLAogICAgICAgICAgICBuZXh0IDogInRhZyIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgICAgICByZWdleCA6ICJcXHMrIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsCiAgICAgICAgICAgIHJlZ2V4IDogIltePF0rIgogICAgICAgIH0gXSwKICAgIAogICAgICAgIGNkYXRhIDogWyB7CiAgICAgICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgICAgICByZWdleCA6ICJcXF1cXF0+IiwKICAgICAgICAgICAgbmV4dCA6ICJzdGFydCIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlxccysiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICIuKyIKICAgICAgICB9IF0sCgogICAgICAgIGNvbW1lbnQgOiBbIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgIHJlZ2V4IDogIi4qPy0tPiIsCiAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICIuKyIKICAgICAgICB9IF0KICAgIH07CiAgICAKICAgIHhtbFV0aWwudGFnKHRoaXMuJHJ1bGVzLCAidGFnIiwgInN0YXJ0Iik7CiAgICB4bWxVdGlsLnRhZyh0aGlzLiRydWxlcywgImNzcyIsICJjc3Mtc3RhcnQiKTsKICAgIHhtbFV0aWwudGFnKHRoaXMuJHJ1bGVzLCAic2NyaXB0IiwgImpzLXN0YXJ0Iik7CiAgICAKICAgIHRoaXMuZW1iZWRSdWxlcyhKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMsICJqcy0iLCBbewogICAgICAgIHRva2VuOiAiY29tbWVudCIsCiAgICAgICAgcmVnZXg6ICJcXC9cXC8uKig/PTxcXC9zY3JpcHQ+KSIsCiAgICAgICAgbmV4dDogInRhZyIKICAgIH0sIHsKICAgICAgICB0b2tlbjogIm1ldGEudGFnIiwKICAgICAgICByZWdleDogIjxcXC8oPz1zY3JpcHQpIiwKICAgICAgICBuZXh0OiAidGFnIgogICAgfV0pOwogICAgCiAgICB0aGlzLmVtYmVkUnVsZXMoQ3NzSGlnaGxpZ2h0UnVsZXMsICJjc3MtIiwgW3sKICAgICAgICB0b2tlbjogIm1ldGEudGFnIiwKICAgICAgICByZWdleDogIjxcXC8oPz1zdHlsZSkiLAogICAgICAgIG5leHQ6ICJ0YWciCiAgICB9XSk7Cn07Cgpvb3AuaW5oZXJpdHMoSHRtbEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOwoKZXhwb3J0cy5IdG1sSGlnaGxpZ2h0UnVsZXMgPSBIdG1sSGlnaGxpZ2h0UnVsZXM7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvaHRtbCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvZm9sZGluZy9taXhlZCcsICdhY2UvbW9kZS9mb2xkaW5nL3htbCcsICdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsKdmFyIE1peGVkRm9sZE1vZGUgPSByZXF1aXJlKCIuL21peGVkIikuRm9sZE1vZGU7CnZhciBYbWxGb2xkTW9kZSA9IHJlcXVpcmUoIi4veG1sIikuRm9sZE1vZGU7CnZhciBDU3R5bGVGb2xkTW9kZSA9IHJlcXVpcmUoIi4vY3N0eWxlIikuRm9sZE1vZGU7Cgp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7CiAgICBNaXhlZEZvbGRNb2RlLmNhbGwodGhpcywgbmV3IFhtbEZvbGRNb2RlKHsKICAgICAgICAvLyB2b2lkIGVsZW1lbnRzCiAgICAgICAgImFyZWEiOiAxLAogICAgICAgICJiYXNlIjogMSwKICAgICAgICAiYnIiOiAxLAogICAgICAgICJjb2wiOiAxLAogICAgICAgICJjb21tYW5kIjogMSwKICAgICAgICAiZW1iZWQiOiAxLAogICAgICAgICJociI6IDEsCiAgICAgICAgImltZyI6IDEsCiAgICAgICAgImlucHV0IjogMSwKICAgICAgICAia2V5Z2VuIjogMSwKICAgICAgICAibGluayI6IDEsCiAgICAgICAgIm1ldGEiOiAxLAogICAgICAgICJwYXJhbSI6IDEsCiAgICAgICAgInNvdXJjZSI6IDEsCiAgICAgICAgInRyYWNrIjogMSwKICAgICAgICAid2JyIjogMSwKICAgICAgICAKICAgICAgICAvLyBvcHRpb25hbCB0YWdzIAogICAgICAgICJsaSI6IDEsCiAgICAgICAgImR0IjogMSwKICAgICAgICAiZGQiOiAxLAogICAgICAgICJwIjogMSwKICAgICAgICAicnQiOiAxLAogICAgICAgICJycCI6IDEsCiAgICAgICAgIm9wdGdyb3VwIjogMSwKICAgICAgICAib3B0aW9uIjogMSwKICAgICAgICAiY29sZ3JvdXAiOiAxLAogICAgICAgICJ0ZCI6IDEsCiAgICAgICAgInRoIjogMQogICAgfSksIHsKICAgICAgICAianMtIjogbmV3IENTdHlsZUZvbGRNb2RlKCksCiAgICAgICAgImNzcy0iOiBuZXcgQ1N0eWxlRm9sZE1vZGUoKQogICAgfSk7Cn07Cgpvb3AuaW5oZXJpdHMoRm9sZE1vZGUsIE1peGVkRm9sZE1vZGUpOwoKfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL21peGVkJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsKdmFyIEJhc2VGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGU7Cgp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oZGVmYXVsdE1vZGUsIHN1Yk1vZGVzKSB7CiAgICB0aGlzLmRlZmF1bHRNb2RlID0gZGVmYXVsdE1vZGU7CiAgICB0aGlzLnN1Yk1vZGVzID0gc3ViTW9kZXM7Cn07Cm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsKCihmdW5jdGlvbigpIHsKCgogICAgdGhpcy4kZ2V0TW9kZSA9IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMuc3ViTW9kZXMpIHsKICAgICAgICAgICAgaWYgKHN0YXRlLmluZGV4T2Yoa2V5KSA9PT0gMCkKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN1Yk1vZGVzW2tleV07CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfTsKICAgIAogICAgdGhpcy4kdHJ5TW9kZSA9IGZ1bmN0aW9uKHN0YXRlLCBzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgewogICAgICAgIHZhciBtb2RlID0gdGhpcy4kZ2V0TW9kZShzdGF0ZSk7CiAgICAgICAgcmV0dXJuIChtb2RlID8gbW9kZS5nZXRGb2xkV2lkZ2V0KHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSA6ICIiKTsKICAgIH07CgogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICB0aGlzLiR0cnlNb2RlKHNlc3Npb24uZ2V0U3RhdGUocm93LTEpLCBzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgfHwKICAgICAgICAgICAgdGhpcy4kdHJ5TW9kZShzZXNzaW9uLmdldFN0YXRlKHJvdyksIHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB8fAogICAgICAgICAgICB0aGlzLmRlZmF1bHRNb2RlLmdldEZvbGRXaWRnZXQoc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpCiAgICAgICAgKTsKICAgIH07CgogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgewogICAgICAgIHZhciBtb2RlID0gdGhpcy4kZ2V0TW9kZShzZXNzaW9uLmdldFN0YXRlKHJvdy0xKSk7CiAgICAgICAgCiAgICAgICAgaWYgKCFtb2RlIHx8ICFtb2RlLmdldEZvbGRXaWRnZXQoc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpKQogICAgICAgICAgICBtb2RlID0gdGhpcy4kZ2V0TW9kZShzZXNzaW9uLmdldFN0YXRlKHJvdykpOwogICAgICAgIAogICAgICAgIGlmICghbW9kZSB8fCAhbW9kZS5nZXRGb2xkV2lkZ2V0KHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSkKICAgICAgICAgICAgbW9kZSA9IHRoaXMuZGVmYXVsdE1vZGU7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIG1vZGUuZ2V0Rm9sZFdpZGdldFJhbmdlKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KTsKICAgIH07Cgp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7Cgp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqICAgICAgQ2hyaXMgU3BlbmNlciA8Y2hyaXMuYWcuc3BlbmNlciBBVCBnb29nbGVtYWlsIERPVCBjb20+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL21hcmtkb3duX2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUveG1sX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9odG1sX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9jc3NfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsKdmFyIEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiKS5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXM7CnZhciBYbWxIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4veG1sX2hpZ2hsaWdodF9ydWxlcyIpLlhtbEhpZ2hsaWdodFJ1bGVzOwp2YXIgSHRtbEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9odG1sX2hpZ2hsaWdodF9ydWxlcyIpLkh0bWxIaWdobGlnaHRSdWxlczsKdmFyIENzc0hpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9jc3NfaGlnaGxpZ2h0X3J1bGVzIikuQ3NzSGlnaGxpZ2h0UnVsZXM7CgpmdW5jdGlvbiBnaXRodWJfZW1iZWQodGFnLCBwcmVmaXgpIHsKICAgIHJldHVybiB7IC8vIEdpdGh1YiBzdHlsZSBibG9jawogICAgICAgIHRva2VuIDogInN1cHBvcnQuZnVuY3Rpb24iLAogICAgICAgIHJlZ2V4IDogIl5gYGAiICsgdGFnICsgIlxccyokIiwKICAgICAgICBuZXh0ICA6IHByZWZpeCArICJzdGFydCIKICAgIH07Cn0KCnZhciBNYXJrZG93bkhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7CgogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzCiAgICAvLyByZWdleHBzIGFyZSBvcmRlcmVkIC0+IHRoZSBmaXJzdCBtYXRjaCBpcyB1c2VkCgogICAgdGhpcy4kcnVsZXMgPSB7CiAgICAgICAgInN0YXJ0IiA6IFsgewogICAgICAgICAgICB0b2tlbiA6ICJlbXB0eV9saW5lIiwKICAgICAgICAgICAgcmVnZXggOiAnXiQnCiAgICAgICAgfSwgeyAvLyBjb2RlIHNwYW4gYAogICAgICAgICAgICB0b2tlbiA6ICJzdXBwb3J0LmZ1bmN0aW9uIiwKICAgICAgICAgICAgcmVnZXggOiAiKGArKShbXlxccl0qP1teYF0pKFxcMSkiCiAgICAgICAgfSwgeyAvLyBjb2RlIGJsb2NrCiAgICAgICAgICAgIHRva2VuIDogInN1cHBvcnQuZnVuY3Rpb24iLAogICAgICAgICAgICByZWdleCA6ICJeWyBdezR9LisiCiAgICAgICAgfSwgeyAvLyBoMQogICAgICAgICAgICB0b2tlbjogIm1hcmt1cC5oZWFkaW5nLjEiLAogICAgICAgICAgICByZWdleDogIl49Kyg/PVxccyokKSIKICAgICAgICB9LCB7IC8vIGgyCiAgICAgICAgICAgIHRva2VuOiAibWFya3VwLmhlYWRpbmcuMSIsCiAgICAgICAgICAgIHJlZ2V4OiAiXlxcLSsoPz1cXHMqJCkiCiAgICAgICAgfSwgeyAvLyBoZWFkZXIKICAgICAgICAgICAgdG9rZW4gOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuICJtYXJrdXAuaGVhZGluZy4iICsgdmFsdWUubGVuZ3RoOwogICAgICAgICAgICB9LAogICAgICAgICAgICByZWdleCA6ICJeI3sxLDZ9IgogICAgICAgIH0sIGdpdGh1Yl9lbWJlZCgiamF2YXNjcmlwdCIsICJqcy0iKSwKICAgICAgICAgICBnaXRodWJfZW1iZWQoInhtbCIsICJ4bWwtIiksCiAgICAgICAgICAgZ2l0aHViX2VtYmVkKCJodG1sIiwgImh0bWwtIiksCiAgICAgICAgICAgZ2l0aHViX2VtYmVkKCJjc3MiLCAiY3NzLSIpLAogICAgICAgIHsgLy8gR2l0aHViIHN0eWxlIGJsb2NrCiAgICAgICAgICAgIHRva2VuIDogInN1cHBvcnQuZnVuY3Rpb24iLAogICAgICAgICAgICByZWdleCA6ICJeYGBgW2EtekEtWl0rXFxzKiQiLAogICAgICAgICAgICBuZXh0ICA6ICJnaXRodWJibG9jayIKICAgICAgICB9LCB7IC8vIGJsb2NrIHF1b3RlCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgIHJlZ2V4IDogIl4+WyBdLiskIiwKICAgICAgICAgICAgbmV4dCAgOiAiYmxvY2txdW90ZSIKICAgICAgICB9LCB7IC8vIHJlZmVyZW5jZQogICAgICAgICAgICB0b2tlbiA6IFsidGV4dCIsICJjb25zdGFudCIsICJ0ZXh0IiwgInVybCIsICJzdHJpbmciLCAidGV4dCJdLAogICAgICAgICAgICByZWdleCA6ICJeKFsgXXswLDN9XFxbKShbXlxcXV0rKShcXF06XFxzKikoW14gXSspKFxccyooPzpbXCJdW15cIl0rW1wiXSk/XFxzKikkIgogICAgICAgIH0sIHsgLy8gbGluayBieSByZWZlcmVuY2UKICAgICAgICAgICAgdG9rZW4gOiBbInRleHQiLCAic3RyaW5nIiwgInRleHQiLCAiY29uc3RhbnQiLCAidGV4dCJdLAogICAgICAgICAgICByZWdleCA6ICIoXFxbKSgoPzpbW15cXF1dKlxcXXxbXlxcW1xcXV0pKikoXFxdWyBdPyg/OlxcblsgXSopP1xcWykoLio/KShcXF0pIgogICAgICAgIH0sIHsgLy8gbGluayBieSB1cmwKICAgICAgICAgICAgdG9rZW4gOiBbInRleHQiLCAic3RyaW5nIiwgInRleHQiLCAibWFya3VwLnVuZGVybGluZSIsICJzdHJpbmciLCAidGV4dCJdLAogICAgICAgICAgICByZWdleCA6ICIoXFxbKSIrCiAgICAgICAgICAgICAgICAgICAgIihcXFtbXlxcXV0qXFxdfFteXFxbXFxdXSopIisKICAgICAgICAgICAgICAgICAgICAiKFxcXVxcKFsgXFx0XSopIisKICAgICAgICAgICAgICAgICAgICAiKDw/KD86KD86W15cXChdKj9cXChbXlxcKV0qP1xcKVxcUyo/KXwoPzouKj8pKT4/KSIrCiAgICAgICAgICAgICAgICAgICAgIigoPzpbIFx0XSpcIig/Oi4qPylcIlsgXFx0XSopPykiKwogICAgICAgICAgICAgICAgICAgICIoXFwpKSIKICAgICAgICB9LCB7IC8vIEhSICoKICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQiLAogICAgICAgICAgICByZWdleCA6ICJeWyBdezAsMn0oPzpbIF0/XFwqWyBdPyl7Myx9XFxzKiQiCiAgICAgICAgfSwgeyAvLyBIUiAtCiAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50IiwKICAgICAgICAgICAgcmVnZXggOiAiXlsgXXswLDJ9KD86WyBdP1xcLVsgXT8pezMsfVxccyokIgogICAgICAgIH0sIHsgLy8gSFIgXwogICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudCIsCiAgICAgICAgICAgIHJlZ2V4IDogIl5bIF17MCwyfSg/OlsgXT9cXF9bIF0/KXszLH1cXHMqJCIKICAgICAgICB9LCB7IC8vIGxpc3QKICAgICAgICAgICAgdG9rZW4gOiAibWFya3VwLmxpc3QiLAogICAgICAgICAgICByZWdleCA6ICJeXFxzezAsM30oPzpbKistXXxcXGQrXFwuKVxccysiLAogICAgICAgICAgICBuZXh0ICA6ICJsaXN0YmxvY2siCiAgICAgICAgfSwgeyAvLyBzdHJvbmcgKiogX18KICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgcmVnZXggOiAiKFsqXXsyfXxbX117Mn0oPz1cXFMpKShbXlxccl0qP1xcU1sqX10qKShcXDEpIgogICAgICAgIH0sIHsgLy8gZW1waGFzaXMgKiBfCiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgIHJlZ2V4IDogIihbKl18W19dKD89XFxTKSkoW15cXHJdKj9cXFNbKl9dKikoXFwxKSIKICAgICAgICB9LCB7IC8vIAogICAgICAgICAgICB0b2tlbiA6IFsidGV4dCIsICJ1cmwiLCAidGV4dCJdLAogICAgICAgICAgICByZWdleCA6ICIoPCkoIisKICAgICAgICAgICAgICAgICAgICAgICIoPzpodHRwcz98ZnRwfGRpY3QpOlteJ1wiPlxcc10rIisKICAgICAgICAgICAgICAgICAgICAgICJ8IisKICAgICAgICAgICAgICAgICAgICAgICIoPzptYWlsdG86KT9bLS5cXHddK1xcQFstYS16MC05XSsoPzpcXC5bLWEtejAtOV0rKSpcXC5bYS16XSsiKwogICAgICAgICAgICAgICAgICAgICIpKD4pIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsCiAgICAgICAgICAgIHJlZ2V4IDogIlteXFwqXyUkYFxcWyM8Pl0rIgogICAgICAgIH0gXSwKICAgICAgICAKICAgICAgICAibGlzdGJsb2NrIiA6IFsgeyAvLyBMaXN0cyBvbmx5IGVzY2FwZSBvbiBjb21wbGV0ZWx5IGJsYW5rIGxpbmVzLgogICAgICAgICAgICB0b2tlbiA6ICJlbXB0eV9saW5lIiwKICAgICAgICAgICAgcmVnZXggOiAiXiQiLAogICAgICAgICAgICBuZXh0ICA6ICJzdGFydCIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogIm1hcmt1cC5saXN0IiwKICAgICAgICAgICAgcmVnZXggOiAiLisiCiAgICAgICAgfSBdLAogICAgICAgIAogICAgICAgICJibG9ja3F1b3RlIiA6IFsgeyAvLyBCTG9ja3F1b3RlcyBvbmx5IGVzY2FwZSBvbiBibGFuayBsaW5lcy4KICAgICAgICAgICAgdG9rZW4gOiAiZW1wdHlfbGluZSIsCiAgICAgICAgICAgIHJlZ2V4IDogIl5cXHMqJCIsCiAgICAgICAgICAgIG5leHQgIDogInN0YXJ0IgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgcmVnZXggOiAiLisiCiAgICAgICAgfSBdLAogICAgICAgIAogICAgICAgICJnaXRodWJibG9jayIgOiBbIHsKICAgICAgICAgICAgdG9rZW4gOiAic3VwcG9ydC5mdW5jdGlvbiIsCiAgICAgICAgICAgIHJlZ2V4IDogIl5gYGAiLAogICAgICAgICAgICBuZXh0ICA6ICJzdGFydCIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogInN1cHBvcnQuZnVuY3Rpb24iLAogICAgICAgICAgICByZWdleCA6ICIuKyIKICAgICAgICB9IF0KICAgIH07CiAgICAKICAgIHRoaXMuZW1iZWRSdWxlcyhKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMsICJqcy0iLCBbewogICAgICAgdG9rZW4gOiAic3VwcG9ydC5mdW5jdGlvbiIsCiAgICAgICByZWdleCA6ICJeYGBgIiwKICAgICAgIG5leHQgIDogInN0YXJ0IgogICAgfV0pOwogICAgCiAgICB0aGlzLmVtYmVkUnVsZXMoSHRtbEhpZ2hsaWdodFJ1bGVzLCAiaHRtbC0iLCBbewogICAgICAgdG9rZW4gOiAic3VwcG9ydC5mdW5jdGlvbiIsCiAgICAgICByZWdleCA6ICJeYGBgIiwKICAgICAgIG5leHQgIDogInN0YXJ0IgogICAgfV0pOwogICAgCiAgICB0aGlzLmVtYmVkUnVsZXMoQ3NzSGlnaGxpZ2h0UnVsZXMsICJjc3MtIiwgW3sKICAgICAgIHRva2VuIDogInN1cHBvcnQuZnVuY3Rpb24iLAogICAgICAgcmVnZXggOiAiXmBgYCIsCiAgICAgICBuZXh0ICA6ICJzdGFydCIKICAgIH1dKTsKICAgIAogICAgdGhpcy5lbWJlZFJ1bGVzKFhtbEhpZ2hsaWdodFJ1bGVzLCAieG1sLSIsIFt7CiAgICAgICB0b2tlbiA6ICJzdXBwb3J0LmZ1bmN0aW9uIiwKICAgICAgIHJlZ2V4IDogIl5gYGAiLAogICAgICAgbmV4dCAgOiAic3RhcnQiCiAgICB9XSk7Cn07Cm9vcC5pbmhlcml0cyhNYXJrZG93bkhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOwoKZXhwb3J0cy5NYXJrZG93bkhpZ2hsaWdodFJ1bGVzID0gTWFya2Rvd25IaWdobGlnaHRSdWxlczsKfSk7OwogICAgICAgICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgewogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KSgpOwogICAgICAgIA==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-markdown.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9tYXJrZG93biIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dCIsImFjZS9tb2RlL2phdmFzY3JpcHQiLCJhY2UvbW9kZS94bWwiLCJhY2UvbW9kZS9odG1sIiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL21hcmtkb3duX2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4vamF2YXNjcmlwdCIpLk1vZGUsZz1hKCIuL3htbCIpLk1vZGUsaD1hKCIuL2h0bWwiKS5Nb2RlLGk9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGo9YSgiLi9tYXJrZG93bl9oaWdobGlnaHRfcnVsZXMiKS5NYXJrZG93bkhpZ2hsaWdodFJ1bGVzLGs9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgajt0aGlzLiR0b2tlbml6ZXI9bmV3IGkoYS5nZXRSdWxlcygpKSx0aGlzLiRlbWJlZHM9YS5nZXRFbWJlZHMoKSx0aGlzLmNyZWF0ZU1vZGVEZWxlZ2F0ZXMoeyJqcy0iOmYsInhtbC0iOmcsImh0bWwtIjpofSl9O2QuaW5oZXJpdHMoayxlKSxmdW5jdGlvbigpe3RoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe2lmKGE9PSJsaXN0YmxvY2siKXt2YXIgZD0vXigoPzouKyk/KShbLSsqXVsgXSspLy5leGVjKGIpO3JldHVybiBkPyhuZXcgQXJyYXkoZFsxXS5sZW5ndGgrMSkpLmpvaW4oIiAiKStkWzJdOiIifXJldHVybiB0aGlzLiRnZXRJbmRlbnQoYil9fS5jYWxsKGsucHJvdG90eXBlKSxiLk1vZGU9a30pLGRlZmluZSgiYWNlL21vZGUvamF2YXNjcmlwdCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dCIsImFjZS90b2tlbml6ZXIiLCJhY2UvbW9kZS9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLCJhY2UvcmFuZ2UiLCJhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQiLCJhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlIiwiYWNlL21vZGUvZm9sZGluZy9jc3R5bGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dCIpLk1vZGUsZj1hKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXIsZz1hKCIuL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIikuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzLGg9YSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQsaT1hKCIuLi9yYW5nZSIpLlJhbmdlLGo9YSgiLi4vd29ya2VyL3dvcmtlcl9jbGllbnQiKS5Xb3JrZXJDbGllbnQsaz1hKCIuL2JlaGF2aW91ci9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXIsbD1hKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGUsbT1mdW5jdGlvbigpe3RoaXMuJHRva2VuaXplcj1uZXcgZigobmV3IGcpLmdldFJ1bGVzKCkpLHRoaXMuJG91dGRlbnQ9bmV3IGgsdGhpcy4kYmVoYXZpb3VyPW5ldyBrLHRoaXMuZm9sZGluZ1J1bGVzPW5ldyBsfTtkLmluaGVyaXRzKG0sZSksZnVuY3Rpb24oKXt0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMCxmPS9eKFxzKilcL1wvLztmb3IodmFyIGc9YztnPD1kO2crKylpZighZi50ZXN0KGIuZ2V0TGluZShnKSkpe2U9ITE7YnJlYWt9aWYoZSl7dmFyIGg9bmV3IGkoMCwwLDAsMCk7Zm9yKHZhciBnPWM7Zzw9ZDtnKyspe3ZhciBqPWIuZ2V0TGluZShnKSxrPWoubWF0Y2goZik7aC5zdGFydC5yb3c9ZyxoLmVuZC5yb3c9ZyxoLmVuZC5jb2x1bW49a1swXS5sZW5ndGgsYi5yZXBsYWNlKGgsa1sxXSl9fWVsc2UgYi5pbmRlbnRSb3dzKGMsZCwiLy8iKX0sdGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy4kZ2V0SW5kZW50KGIpLGU9dGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMoYixhKSxmPWUudG9rZW5zLGc9ZS5zdGF0ZTtpZihmLmxlbmd0aCYmZltmLmxlbmd0aC0xXS50eXBlPT0iY29tbWVudCIpcmV0dXJuIGQ7aWYoYT09InN0YXJ0Inx8YT09InJlZ2V4X2FsbG93ZWQiKXt2YXIgaD1iLm1hdGNoKC9eLiooPzpcYmNhc2VcYi4qXDp8W1x7XChcW10pXHMqJC8pO2gmJihkKz1jKX1lbHNlIGlmKGE9PSJkb2Mtc3RhcnQiKXtpZihnPT0ic3RhcnQifHxhPT0icmVnZXhfYWxsb3dlZCIpcmV0dXJuIiI7dmFyIGg9Yi5tYXRjaCgvXlxzKihcLz8pXCovKTtoJiYoaFsxXSYmKGQrPSIgIiksZCs9IiogIil9cmV0dXJuIGR9LHRoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQoYixjKX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7dGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChiLGMpfSx0aGlzLmNyZWF0ZVdvcmtlcj1mdW5jdGlvbihhKXt2YXIgYj1uZXcgaihbImFjZSJdLCJ3b3JrZXItamF2YXNjcmlwdC5qcyIsImFjZS9tb2RlL2phdmFzY3JpcHRfd29ya2VyIiwiSmF2YVNjcmlwdFdvcmtlciIpO3JldHVybiBiLmF0dGFjaFRvRG9jdW1lbnQoYS5nZXREb2N1bWVudCgpKSxiLm9uKCJqc2xpbnQiLGZ1bmN0aW9uKGIpe3ZhciBjPVtdO2Zvcih2YXIgZD0wO2Q8Yi5kYXRhLmxlbmd0aDtkKyspe3ZhciBlPWIuZGF0YVtkXTtlJiZjLnB1c2goe3JvdzplLmxpbmUtMSxjb2x1bW46ZS5jaGFyYWN0ZXItMSx0ZXh0OmUucmVhc29uLHR5cGU6Indhcm5pbmciLGxpbnQ6ZX0pfWEuc2V0QW5ub3RhdGlvbnMoYyl9KSxiLm9uKCJuYXJjaXNzdXMiLGZ1bmN0aW9uKGIpe2Euc2V0QW5ub3RhdGlvbnMoW2IuZGF0YV0pfSksYi5vbigidGVybWluYXRlIixmdW5jdGlvbigpe2EuY2xlYXJBbm5vdGF0aW9ucygpfSksYn19LmNhbGwobS5wcm90b3R5cGUpLGIuTW9kZT1tfSksZGVmaW5lKCJhY2UvbW9kZS9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9sYW5nIiwiYWNlL3VuaWNvZGUiLCJhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi4vbGliL2xhbmciKSxmPWEoIi4uL3VuaWNvZGUiKSxnPWEoIi4vZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIikuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLGg9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxpPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKCJBcnJheXxCb29sZWFufERhdGV8RnVuY3Rpb258SXRlcmF0b3J8TnVtYmVyfE9iamVjdHxSZWdFeHB8U3RyaW5nfFByb3h5fE5hbWVzcGFjZXxRTmFtZXxYTUx8WE1MTGlzdHxBcnJheUJ1ZmZlcnxGbG9hdDMyQXJyYXl8RmxvYXQ2NEFycmF5fEludDE2QXJyYXl8SW50MzJBcnJheXxJbnQ4QXJyYXl8VWludDE2QXJyYXl8VWludDMyQXJyYXl8VWludDhBcnJheXxVaW50OENsYW1wZWRBcnJheXxFcnJvcnxFdmFsRXJyb3J8SW50ZXJuYWxFcnJvcnxSYW5nZUVycm9yfFJlZmVyZW5jZUVycm9yfFN0b3BJdGVyYXRpb258U3ludGF4RXJyb3J8VHlwZUVycm9yfFVSSUVycm9yfGRlY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZW5jb2RlVVJJfGVuY29kZVVSSUNvbXBvbmVudHxldmFsfGlzRmluaXRlfGlzTmFOfHBhcnNlRmxvYXR8cGFyc2VJbnR8SlNPTnxNYXRofHRoaXN8YXJndW1lbnRzfHByb3RvdHlwZXx3aW5kb3d8ZG9jdW1lbnQiLnNwbGl0KCJ8IikpLGI9ZS5hcnJheVRvTWFwKCJicmVha3xjYXNlfGNhdGNofGNvbnRpbnVlfGRlZmF1bHR8ZGVsZXRlfGRvfGVsc2V8ZmluYWxseXxmb3J8ZnVuY3Rpb258aWZ8aW58aW5zdGFuY2VvZnxuZXd8cmV0dXJufHN3aXRjaHx0aHJvd3x0cnl8dHlwZW9mfGxldHx2YXJ8d2hpbGV8d2l0aHxjb25zdHx5aWVsZHxpbXBvcnR8Z2V0fHNldCIuc3BsaXQoInwiKSksYz0iY2FzZXxkb3xlbHNlfGZpbmFsbHl8aW58aW5zdGFuY2VvZnxyZXR1cm58dGhyb3d8dHJ5fHR5cGVvZnx5aWVsZCIsZD1lLmFycmF5VG9NYXAoIl9fcGFyZW50X198X19jb3VudF9ffGVzY2FwZXx1bmVzY2FwZXx3aXRofF9fcHJvdG9fXyIuc3BsaXQoInwiKSksaD1lLmFycmF5VG9NYXAoImNvbnN0fGxldHx2YXJ8ZnVuY3Rpb24iLnNwbGl0KCJ8IikpLGk9ZS5hcnJheVRvTWFwKCJudWxsfEluZmluaXR5fE5hTnx1bmRlZmluZWQiLnNwbGl0KCJ8IikpLGo9ZS5hcnJheVRvTWFwKCJjbGFzc3xlbnVtfGV4dGVuZHN8c3VwZXJ8ZXhwb3J0fGltcGxlbWVudHN8cHJpdmF0ZXxwdWJsaWN8aW50ZXJmYWNlfHBhY2thZ2V8cHJvdGVjdGVkfHN0YXRpYyIuc3BsaXQoInwiKSksaz0iWyIrZi5wYWNrYWdlcy5MKyJcXCRfXVsiK2YucGFja2FnZXMuTCtmLnBhY2thZ2VzLk1uK2YucGFja2FnZXMuTWMrZi5wYWNrYWdlcy5OZCtmLnBhY2thZ2VzLlBjKyJcXCRfXSpcXGIiO3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwvXFwvLiokIn0sKG5ldyBnKS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKiIsbmV4dDoiY29tbWVudCJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDonWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXSd9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDonWyJdLipcXFxcJCcsbmV4dDoicXFzdHJpbmcifSx7dG9rZW46InN0cmluZyIscmVnZXg6IlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10ifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6IlsnXS4qXFxcXCQiLG5leHQ6InFzdHJpbmcifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIwW3hYXVswLTlhLWZBLUZdK1xcYiJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIn0se3Rva2VuOlsia2V5d29yZC5kZWZpbml0aW9uIiwidGV4dCIsImVudGl0eS5uYW1lLmZ1bmN0aW9uIl0scmVnZXg6IihmdW5jdGlvbikoXFxzKykoIitrKyIpIn0se3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5ib29sZWFuIixyZWdleDoiKD86dHJ1ZXxmYWxzZSlcXGIifSx7dG9rZW46ImtleXdvcmQiLHJlZ2V4OiIoPzoiK2MrIilcXGIiLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46ZnVuY3Rpb24oYyl7cmV0dXJuIGEuaGFzT3duUHJvcGVydHkoYyk/InZhcmlhYmxlLmxhbmd1YWdlIjpkLmhhc093blByb3BlcnR5KGMpPyJpbnZhbGlkLmRlcHJlY2F0ZWQiOmguaGFzT3duUHJvcGVydHkoYyk/ImtleXdvcmQuZGVmaW5pdGlvbiI6Yi5oYXNPd25Qcm9wZXJ0eShjKT8ia2V5d29yZCI6aS5oYXNPd25Qcm9wZXJ0eShjKT8iY29uc3RhbnQubGFuZ3VhZ2UiOmouaGFzT3duUHJvcGVydHkoYyk/ImludmFsaWQuaWxsZWdhbCI6Yz09ImRlYnVnZ2VyIj8iaW52YWxpZC5kZXByZWNhdGVkIjoiaWRlbnRpZmllciJ9LHJlZ2V4Omt9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6IiF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT09fD09fD18IT18IT09fDw9fD49fDw8PXw+Pj18Pj4+PXw8Pnw8fD58IXwmJnxcXHxcXHx8XFw/XFw6fFxcKj18JT18XFwrPXxcXC09fCY9fFxcXj18XFxiKD86aW58aW5zdGFuY2VvZnxuZXd8ZGVsZXRlfHR5cGVvZnx2b2lkKSIsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoicHVuY3R1YXRpb24ub3BlcmF0b3IiLHJlZ2V4OiJcXD98XFw6fFxcLHxcXDt8XFwuIixuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOiJwYXJlbi5scGFyZW4iLHJlZ2V4OiJbWyh7XSIsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoicGFyZW4ucnBhcmVuIixyZWdleDoiW1xcXSl9XSJ9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcLz0/IixuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOiJjb21tZW50IixyZWdleDoiXiMhLiokIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9XSxyZWdleF9hbGxvd2VkOlt7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCoiLG5leHQ6ImNvbW1lbnRfcmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoiY29tbWVudCIscmVnZXg6IlxcL1xcLy4qJCJ9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6IlxcLyIsbmV4dDoicmVnZXgiLG1lcmdlOiEwfSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJlbXB0eSIscmVnZXg6IiIsbmV4dDoic3RhcnQifV0scmVnZXg6W3t0b2tlbjoicmVnZXhwLmtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsbmV4dDoicmVnZXgifSx7dG9rZW46InN0cmluZy5yZWdleHAiLHJlZ2V4OiIvXFx3KiIsbmV4dDoic3RhcnQiLG1lcmdlOiEwfSx7dG9rZW46InN0cmluZy5yZWdleHAiLHJlZ2V4OiJbXlxcXFwvXFxbXSsiLG5leHQ6InJlZ2V4IixtZXJnZTohMH0se3Rva2VuOiJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyIscmVnZXg6IlxcWyIsbmV4dDoicmVnZXhfY2hhcmFjdGVyX2NsYXNzIixtZXJnZTohMH0se3Rva2VuOiJlbXB0eSIscmVnZXg6IiIsbmV4dDoic3RhcnQifV0scmVnZXhfY2hhcmFjdGVyX2NsYXNzOlt7dG9rZW46InJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiXFxcXCg/OnVbXFxkYS1mQS1GXXs0fXx4W1xcZGEtZkEtRl17Mn18LikiLG5leHQ6InJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyJ9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLHJlZ2V4OiJdIixuZXh0OiJyZWdleCIsbWVyZ2U6ITB9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLHJlZ2V4OiJbXlxcXFxcXF1dKyIsbmV4dDoicmVnZXhfY2hhcmFjdGVyX2NsYXNzIixtZXJnZTohMH0se3Rva2VuOiJlbXB0eSIscmVnZXg6IiIsbmV4dDoic3RhcnQifV0sY29tbWVudF9yZWdleF9hbGxvd2VkOlt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj9cXCpcXC8iLG1lcmdlOiEwLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxjb21tZW50Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj9cXCpcXC8iLG1lcmdlOiEwLG5leHQ6InN0YXJ0In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV0scXFzdHJpbmc6W3t0b2tlbjoic3RyaW5nIixyZWdleDonKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqPyInLG5leHQ6InN0YXJ0In0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxxc3RyaW5nOlt7dG9rZW46InN0cmluZyIscmVnZXg6Iig/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj8nIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV19LHRoaXMuZW1iZWRSdWxlcyhnLCJkb2MtIixbKG5ldyBnKS5nZXRFbmRSdWxlKCJzdGFydCIpXSl9O2QuaW5oZXJpdHMoaSxoKSxiLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlcz1pfSksZGVmaW5lKCJhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGY9ZnVuY3Rpb24oKXt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoiY29tbWVudC5kb2MudGFnIixyZWdleDoiQFtcXHdcXGRfXSsifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiXFxzKyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJUT0RPIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlteQFxcKl0rIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6Ii4ifV19fTtkLmluaGVyaXRzKGYsZSksZnVuY3Rpb24oKXt0aGlzLmdldFN0YXJ0UnVsZT1mdW5jdGlvbihhKXtyZXR1cm57dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiXFwvXFwqKD89XFwqKSIsbmV4dDphfX0sdGhpcy5nZXRFbmRSdWxlPWZ1bmN0aW9uKGEpe3JldHVybnt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJcXCpcXC8iLG5leHQ6YX19fS5jYWxsKGYucHJvdG90eXBlKSxiLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcz1mfSksZGVmaW5lKCJhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9yYW5nZSIpLlJhbmdlLGU9ZnVuY3Rpb24oKXt9OygoZnVuY3Rpb24oKXt0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihhLGIpe3JldHVybi9eXHMrJC8udGVzdChhKT8vXlxzKlx9Ly50ZXN0KGIpOiExfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5nZXRMaW5lKGIpLGU9Yy5tYXRjaCgvXihccypcfSkvKTtpZighZSlyZXR1cm4gMDt2YXIgZj1lWzFdLmxlbmd0aCxnPWEuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OmIsY29sdW1uOmZ9KTtpZighZ3x8Zy5yb3c9PWIpcmV0dXJuIDA7dmFyIGg9dGhpcy4kZ2V0SW5kZW50KGEuZ2V0TGluZShnLnJvdykpO2EucmVwbGFjZShuZXcgZChiLDAsYixmLTEpLGgpfSx0aGlzLiRnZXRJbmRlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5tYXRjaCgvXihccyspLyk7cmV0dXJuIGI/YlsxXToiIn19KSkuY2FsbChlLnByb3RvdHlwZSksYi5NYXRjaGluZ0JyYWNlT3V0ZGVudD1lfSksZGVmaW5lKCJhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvZXZlbnRfZW1pdHRlciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsZj1mdW5jdGlvbihiLGQsZSxmKXt0aGlzLmNoYW5nZUxpc3RlbmVyPXRoaXMuY2hhbmdlTGlzdGVuZXIuYmluZCh0aGlzKTtpZihjLnBhY2thZ2VkKXt2YXIgZz10aGlzLiRndWVzc0Jhc2VQYXRoKCk7dGhpcy4kd29ya2VyPW5ldyBXb3JrZXIoZytkKX1lbHNle3ZhciBoPXRoaXMuJG5vcm1hbGl6ZVBhdGgoYS5uYW1lVG9VcmwoImFjZS93b3JrZXIvd29ya2VyIixudWxsLCJfIikpO3RoaXMuJHdvcmtlcj1uZXcgV29ya2VyKGgpO3ZhciBpPXt9O2Zvcih2YXIgaj0wO2o8Yi5sZW5ndGg7aisrKXt2YXIgaz1iW2pdLGw9dGhpcy4kbm9ybWFsaXplUGF0aChhLm5hbWVUb1VybChrLG51bGwsIl8iKS5yZXBsYWNlKC8uanMkLywiIikpO2lba109bH19dGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtpbml0OiEwLHRsbnM6aSxtb2R1bGU6ZSxjbGFzc25hbWU6Zn0pLHRoaXMuY2FsbGJhY2tJZD0xLHRoaXMuY2FsbGJhY2tzPXt9O3ZhciBtPXRoaXM7dGhpcy4kd29ya2VyLm9uZXJyb3I9ZnVuY3Rpb24oYSl7dGhyb3cgd2luZG93LmNvbnNvbGUmJmNvbnNvbGUubG9nJiZjb25zb2xlLmxvZyhhKSxhfSx0aGlzLiR3b3JrZXIub25tZXNzYWdlPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZGF0YTtzd2l0Y2goYi50eXBlKXtjYXNlImxvZyI6d2luZG93LmNvbnNvbGUmJmNvbnNvbGUubG9nJiZjb25zb2xlLmxvZyhiLmRhdGEpO2JyZWFrO2Nhc2UiZXZlbnQiOm0uX2VtaXQoYi5uYW1lLHtkYXRhOmIuZGF0YX0pO2JyZWFrO2Nhc2UiY2FsbCI6dmFyIGM9bS5jYWxsYmFja3NbYi5pZF07YyYmKGMoYi5kYXRhKSxkZWxldGUgbS5jYWxsYmFja3NbYi5pZF0pfX19OygoZnVuY3Rpb24oKXtkLmltcGxlbWVudCh0aGlzLGUpLHRoaXMuJG5vcm1hbGl6ZVBhdGg9ZnVuY3Rpb24oYSl7cmV0dXJuIGE9YS5yZXBsYWNlKC9eW2Etel0rOlwvXC9bXlwvXStcLy8sIiIpLGE9bG9jYXRpb24ucHJvdG9jb2wrIi8vIitsb2NhdGlvbi5ob3N0KyhhLmNoYXJBdCgwKT09Ii8iPyIiOmxvY2F0aW9uLnBhdGhuYW1lLnJlcGxhY2UoL1wvW15cL10qJC8sIiIpKSsiLyIrYS5yZXBsYWNlKC9eW1wvXSsvLCIiKSxhfSx0aGlzLiRndWVzc0Jhc2VQYXRoPWZ1bmN0aW9uKCl7aWYoYS5hY2VCYXNlVXJsKXJldHVybiBhLmFjZUJhc2VVcmw7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD1iW2NdLGU9ZC5nZXRBdHRyaWJ1dGUoImRhdGEtYWNlLWJhc2UiKTtpZihlKXJldHVybiBlLnJlcGxhY2UoL1wvKiQvLCIvIik7dmFyIGY9ZC5zcmN8fGQuZ2V0QXR0cmlidXRlKCJzcmMiKTtpZighZiljb250aW51ZTt2YXIgZz1mLm1hdGNoKC9eKD86KC4qXC8pYWNlXC5qc3woLipcLylhY2UoLXVuY29tcHJlc3NlZCk/KC1ub2NvbmZsaWN0KT9cLmpzKSg/Olw/fCQpLyk7aWYoZylyZXR1cm4gZ1sxXXx8Z1syXX1yZXR1cm4iIn0sdGhpcy50ZXJtaW5hdGU9ZnVuY3Rpb24oKXt0aGlzLl9lbWl0KCJ0ZXJtaW5hdGUiLHt9KSx0aGlzLiR3b3JrZXIudGVybWluYXRlKCksdGhpcy4kd29ya2VyPW51bGwsdGhpcy4kZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIsdGhpcy5jaGFuZ2VMaXN0ZW5lciksdGhpcy4kZG9jPW51bGx9LHRoaXMuc2VuZD1mdW5jdGlvbihhLGIpe3RoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7Y29tbWFuZDphLGFyZ3M6Yn0pfSx0aGlzLmNhbGw9ZnVuY3Rpb24oYSxiLGMpe2lmKGMpe3ZhciBkPXRoaXMuY2FsbGJhY2tJZCsrO3RoaXMuY2FsbGJhY2tzW2RdPWMsYi5wdXNoKGQpfXRoaXMuc2VuZChhLGIpfSx0aGlzLmVtaXQ9ZnVuY3Rpb24oYSxiKXt0cnl7dGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtldmVudDphLGRhdGE6e2RhdGE6Yi5kYXRhfX0pfWNhdGNoKGMpe319LHRoaXMuYXR0YWNoVG9Eb2N1bWVudD1mdW5jdGlvbihhKXt0aGlzLiRkb2MmJnRoaXMudGVybWluYXRlKCksdGhpcy4kZG9jPWEsdGhpcy5jYWxsKCJzZXRWYWx1ZSIsW2EuZ2V0VmFsdWUoKV0pLGEub24oImNoYW5nZSIsdGhpcy5jaGFuZ2VMaXN0ZW5lcil9LHRoaXMuY2hhbmdlTGlzdGVuZXI9ZnVuY3Rpb24oYSl7YS5yYW5nZT17c3RhcnQ6YS5kYXRhLnJhbmdlLnN0YXJ0LGVuZDphLmRhdGEucmFuZ2UuZW5kfSx0aGlzLmVtaXQoImNoYW5nZSIsYSl9fSkpLmNhbGwoZi5wcm90b3R5cGUpLGIuV29ya2VyQ2xpZW50PWZ9KSxkZWZpbmUoImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL2JlaGF2aW91ciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vYmVoYXZpb3VyIikuQmVoYXZpb3VyLGY9ZnVuY3Rpb24oKXt0aGlzLmFkZCgiYnJhY2VzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSJ7Iil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/e3RleHQ6InsiK2crIn0iLHNlbGVjdGlvbjohMX06e3RleHQ6Int9IixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSJ9Iil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0ifSIpe3ZhciBrPWQuJGZpbmRPcGVuaW5nQnJhY2tldCgifSIse2NvbHVtbjpoLmNvbHVtbisxLHJvdzpoLnJvd30pO2lmKGshPT1udWxsKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fWVsc2UgaWYoZT09IlxuIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0ifSIpe3ZhciBsPWQuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93Omgucm93LGNvbHVtbjpoLmNvbHVtbisxfSk7aWYoIWwpcmV0dXJuIG51bGw7dmFyIG09dGhpcy5nZXROZXh0TGluZUluZGVudChhLGkuc3Vic3RyaW5nKDAsaS5sZW5ndGgtMSksZC5nZXRUYWJTdHJpbmcoKSksbj10aGlzLiRnZXRJbmRlbnQoZC5kb2MuZ2V0TGluZShsLnJvdykpO3JldHVybnt0ZXh0OiJcbiIrbSsiXG4iK24sc2VsZWN0aW9uOlsxLG0ubGVuZ3RoLDEsbS5sZW5ndGhdfX19fSksdGhpcy5hZGQoImJyYWNlcyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0ieyIpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5lbmQuY29sdW1uLGUuZW5kLmNvbHVtbisxKTtpZihoPT0ifSIpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSksdGhpcy5hZGQoInBhcmVucyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0iKCIpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtyZXR1cm4gZyE9PSIiP3t0ZXh0OiIoIitnKyIpIixzZWxlY3Rpb246ITF9Ont0ZXh0OiIoKSIsc2VsZWN0aW9uOlsxLDFdfX1pZihlPT0iKSIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09IikiKXt2YXIgaz1kLiRmaW5kT3BlbmluZ0JyYWNrZXQoIikiLHtjb2x1bW46aC5jb2x1bW4rMSxyb3c6aC5yb3d9KTtpZihrIT09bnVsbClyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX19KSx0aGlzLmFkZCgicGFyZW5zIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSIoIil7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbisxLGUuc3RhcnQuY29sdW1uKzIpO2lmKGg9PSIpIilyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KSx0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09JyInKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7aWYoZyE9PSIiKXJldHVybnt0ZXh0OiciJytnKyciJyxzZWxlY3Rpb246ITF9O3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4tMSxoLmNvbHVtbik7aWYoaj09IlxcIilyZXR1cm4gbnVsbDt2YXIgaz1kLmdldFRva2VucyhmLnN0YXJ0LnJvdyxmLnN0YXJ0LnJvdylbMF0udG9rZW5zLGw9MCxtLG49LTE7Zm9yKHZhciBvPTA7bzxrLmxlbmd0aDtvKyspe209a1tvXSxtLnR5cGU9PSJzdHJpbmciP249LTE6bjwwJiYobj1tLnZhbHVlLmluZGV4T2YoJyInKSk7aWYobS52YWx1ZS5sZW5ndGgrbD5mLnN0YXJ0LmNvbHVtbilicmVhaztsKz1rW29dLnZhbHVlLmxlbmd0aH1pZighbXx8bjwwJiZtLnR5cGUhPT0iY29tbWVudCImJihtLnR5cGUhPT0ic3RyaW5nInx8Zi5zdGFydC5jb2x1bW4hPT1tLnZhbHVlLmxlbmd0aCtsLTEmJm0udmFsdWUubGFzdEluZGV4T2YoJyInKT09PW0udmFsdWUubGVuZ3RoLTEpKXJldHVybnt0ZXh0OiciIicsc2VsZWN0aW9uOlsxLDFdfTtpZihtJiZtLnR5cGU9PT0ic3RyaW5nIil7dmFyIHA9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYocD09JyInKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0nIicpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5zdGFydC5jb2x1bW4rMSxlLnN0YXJ0LmNvbHVtbisyKTtpZihoPT0nIicpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSl9O2QuaW5oZXJpdHMoZixlKSxiLkNzdHlsZUJlaGF2aW91cj1mfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL3JhbmdlIiwiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4uLy4uL3JhbmdlIikuUmFuZ2UsZj1hKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlLGc9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307ZC5pbmhlcml0cyhnLGYpLGZ1bmN0aW9uKCl7dGhpcy5mb2xkaW5nU3RhcnRNYXJrZXI9Lyhce3xcWylbXlx9XF1dKiR8XlxzKihcL1wqKS8sdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj0vXlteXFtce10qKFx9fFxdKXxeW1xzXCpdKihcKlwvKS8sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKSxmPWQubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpO2lmKGYpe3ZhciBnPWYuaW5kZXg7aWYoZlsxXSlyZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKGEsZlsxXSxjLGcpO3ZhciBoPWEuZ2V0Q29tbWVudEZvbGRSYW5nZShjLGcrZlswXS5sZW5ndGgpO3JldHVybiBoLmVuZC5jb2x1bW4tPTIsaH1pZihiIT09Im1hcmtiZWdpbmVuZCIpcmV0dXJuO3ZhciBmPWQubWF0Y2godGhpcy5mb2xkaW5nU3RvcE1hcmtlcik7aWYoZil7dmFyIGc9Zi5pbmRleCtmWzBdLmxlbmd0aDtpZihmWzJdKXt2YXIgaD1hLmdldENvbW1lbnRGb2xkUmFuZ2UoYyxnKTtyZXR1cm4gaC5lbmQuY29sdW1uLT0yLGh9dmFyIGk9e3JvdzpjLGNvbHVtbjpnfSxqPWEuJGZpbmRPcGVuaW5nQnJhY2tldChmWzFdLGkpO2lmKCFqKXJldHVybjtyZXR1cm4gai5jb2x1bW4rKyxpLmNvbHVtbi0tLGUuZnJvbVBvaW50cyhqLGkpfX19LmNhbGwoZy5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxlPWIuRm9sZE1vZGU9ZnVuY3Rpb24oKXt9OygoZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj1udWxsLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9bnVsbCx0aGlzLmdldEZvbGRXaWRnZXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKTtyZXR1cm4gdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChkKT8ic3RhcnQiOmI9PSJtYXJrYmVnaW5lbmQiJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QoZCk/ImVuZCI6IiJ9LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbnVsbH0sdGhpcy5pbmRlbnRhdGlvbkJsb2NrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZT0vXlxzKi8sZj1iLGc9YixoPWEuZ2V0TGluZShiKSxpPWN8fGgubGVuZ3RoLGo9aC5tYXRjaChlKVswXS5sZW5ndGgsaz1hLmdldExlbmd0aCgpO3doaWxlKCsrYjxrKXtoPWEuZ2V0TGluZShiKTt2YXIgbD1oLm1hdGNoKGUpWzBdLmxlbmd0aDtpZihsPT1oLmxlbmd0aCljb250aW51ZTtpZihsPD1qKWJyZWFrO2c9Yn1pZihnPmYpe3ZhciBtPWEuZ2V0TGluZShnKS5sZW5ndGg7cmV0dXJuIG5ldyBkKGYsaSxnLG0pfX0sdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrPWZ1bmN0aW9uKGEsYixjLGUpe3ZhciBmPXtyb3c6Yyxjb2x1bW46ZSsxfSxnPWEuJGZpbmRDbG9zaW5nQnJhY2tldChiLGYpO2lmKCFnKXJldHVybjt2YXIgaD1hLmZvbGRXaWRnZXRzW2cucm93XTtyZXR1cm4gaD09bnVsbCYmKGg9dGhpcy5nZXRGb2xkV2lkZ2V0KGEsZy5yb3cpKSxoPT0ic3RhcnQiJiYoZy5yb3ctLSxnLmNvbHVtbj1hLmdldExpbmUoZy5yb3cpLmxlbmd0aCksZC5mcm9tUG9pbnRzKGYsZyl9fSkpLmNhbGwoZS5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW9kZS94bWwiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUveG1sX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL2JlaGF2aW91ci94bWwiLCJhY2UvbW9kZS9mb2xkaW5nL3htbCJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4veG1sX2hpZ2hsaWdodF9ydWxlcyIpLlhtbEhpZ2hsaWdodFJ1bGVzLGg9YSgiLi9iZWhhdmlvdXIveG1sIikuWG1sQmVoYXZpb3VyLGk9YSgiLi9mb2xkaW5nL3htbCIpLkZvbGRNb2RlLGo9ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbml6ZXI9bmV3IGYoKG5ldyBnKS5nZXRSdWxlcygpKSx0aGlzLiRiZWhhdmlvdXI9bmV3IGgsdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGl9O2QuaW5oZXJpdHMoaixlKSxmdW5jdGlvbigpe3RoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiRnZXRJbmRlbnQoYil9fS5jYWxsKGoucHJvdG90eXBlKSxiLk1vZGU9an0pLGRlZmluZSgiYWNlL21vZGUveG1sX2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUveG1sX3V0aWwiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi94bWxfdXRpbCIpLGY9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxnPWZ1bmN0aW9uKCl7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46InRleHQiLHJlZ2V4OiI8XFwhXFxbQ0RBVEFcXFsiLG5leHQ6ImNkYXRhIn0se3Rva2VuOiJ4bWxfcGUiLHJlZ2V4OiI8XFw/Lio/XFw/PiJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IjxcXCEtLSIsbmV4dDoiY29tbWVudCJ9LHt0b2tlbjoibWV0YS50YWciLHJlZ2V4OiI8XFwvPyIsbmV4dDoidGFnIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IltePF0rIn1dLGNkYXRhOlt7dG9rZW46InRleHQiLHJlZ2V4OiJcXF1cXF0+IixuZXh0OiJzdGFydCJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifSx7dG9rZW46InRleHQiLHJlZ2V4OiIoPzpbXlxcXV18XFxdKD8hXFxdPikpKyJ9XSxjb21tZW50Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj8tLT4iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV19LGUudGFnKHRoaXMuJHJ1bGVzLCJ0YWciLCJzdGFydCIpfTtkLmluaGVyaXRzKGcsZiksYi5YbWxIaWdobGlnaHRSdWxlcz1nfSksZGVmaW5lKCJhY2UvbW9kZS94bWxfdXRpbCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvbGFuZyJdLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBnKGEpe3JldHVyblt7dG9rZW46InN0cmluZyIscmVnZXg6JyIuKj8iJ30se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OidbIl0uKicsbmV4dDphKyItcXFzdHJpbmcifSx7dG9rZW46InN0cmluZyIscmVnZXg6IicuKj8nIn0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiJbJ10uKiIsbmV4dDphKyItcXN0cmluZyJ9XX1mdW5jdGlvbiBoKGEsYil7cmV0dXJuW3t0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLio/IithLG5leHQ6Yn0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX0idXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL2xhbmciKSxlPWQuYXJyYXlUb01hcCgiYnV0dG9ufGZvcm18aW5wdXR8bGFiZWx8c2VsZWN0fHRleHRhcmVhIi5zcGxpdCgifCIpKSxmPWQuYXJyYXlUb01hcCgidGFibGV8dGJvZHl8dGR8dGZvb3R8dGh8dHIiLnNwbGl0KCJ8IikpO2IudGFnPWZ1bmN0aW9uKGEsYixjKXthW2JdPVt7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn0se3Rva2VuOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09ImEiPyJtZXRhLnRhZy5hbmNob3IiOmE9PT0iaW1nIj8ibWV0YS50YWcuaW1hZ2UiOmE9PT0ic2NyaXB0Ij8ibWV0YS50YWcuc2NyaXB0IjphPT09InN0eWxlIj8ibWV0YS50YWcuc3R5bGUiOmUuaGFzT3duUHJvcGVydHkoYS50b0xvd2VyQ2FzZSgpKT8ibWV0YS50YWcuZm9ybSI6Zi5oYXNPd25Qcm9wZXJ0eShhLnRvTG93ZXJDYXNlKCkpPyJtZXRhLnRhZy50YWJsZSI6Im1ldGEudGFnIn0sbWVyZ2U6ITAscmVnZXg6IlstX2EtekEtWjAtOTohXSsiLG5leHQ6YisiZW1iZWQtYXR0cmlidXRlLWxpc3QifSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OmIrImVtYmVkLWF0dHJpYnV0ZS1saXN0In1dLGFbYisiLXFzdHJpbmciXT1oKCInIixiKyJlbWJlZC1hdHRyaWJ1dGUtbGlzdCIpLGFbYisiLXFxc3RyaW5nIl09aCgnIicsYisiZW1iZWQtYXR0cmlidXRlLWxpc3QiKSxhW2IrImVtYmVkLWF0dHJpYnV0ZS1saXN0Il09W3t0b2tlbjoibWV0YS50YWciLG1lcmdlOiEwLHJlZ2V4OiIvPz4iLG5leHQ6Y30se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiPSJ9LHt0b2tlbjoiZW50aXR5Lm90aGVyLmF0dHJpYnV0ZS1uYW1lIixyZWdleDoiWy1fYS16QS1aMC05Ol0rIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn1dLmNvbmNhdChnKGIpKX19KSxkZWZpbmUoImFjZS9tb2RlL2JlaGF2aW91ci94bWwiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL2JlaGF2aW91ciIsImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4uL2JlaGF2aW91ciIpLkJlaGF2aW91cixmPWEoIi4vY3N0eWxlIikuQ3N0eWxlQmVoYXZpb3VyLGc9ZnVuY3Rpb24oKXt0aGlzLmluaGVyaXQoZixbInN0cmluZ19kcXVvdGVzIl0pLHRoaXMuYWRkKCJicmFja2V0cyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0iPCIpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtyZXR1cm4gZyE9PSIiPyExOnt0ZXh0OiI8PiIsc2VsZWN0aW9uOlsxLDFdfX1pZihlPT0iPiIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09Ij4iKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19ZWxzZSBpZihlPT0iXG4iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxrPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzIpO2lmKGs9PSI8LyIpe3ZhciBsPXRoaXMuJGdldEluZGVudChkLmRvYy5nZXRMaW5lKGgucm93KSkrZC5nZXRUYWJTdHJpbmcoKSxtPXRoaXMuJGdldEluZGVudChkLmRvYy5nZXRMaW5lKGgucm93KSk7cmV0dXJue3RleHQ6IlxuIitsKyJcbiIrbSxzZWxlY3Rpb246WzEsbC5sZW5ndGgsMSxsLmxlbmd0aF19fX19KX07ZC5pbmhlcml0cyhnLGUpLGIuWG1sQmVoYXZpb3VyPWd9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcveG1sIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvcmFuZ2UiLCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIsImFjZS90b2tlbl9pdGVyYXRvciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vLi4vbGliL2xhbmciKSxmPWEoIi4uLy4uL3JhbmdlIikuUmFuZ2UsZz1hKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlLGg9YSgiLi4vLi4vdG9rZW5faXRlcmF0b3IiKS5Ub2tlbkl0ZXJhdG9yLGk9Yi5Gb2xkTW9kZT1mdW5jdGlvbihhKXtnLmNhbGwodGhpcyksdGhpcy52b2lkRWxlbWVudHM9YXx8e319O2QuaW5oZXJpdHMoaSxnKSxmdW5jdGlvbigpe3RoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmUoYSxjKTtyZXR1cm4gZC5jbG9zaW5nP2I9PSJtYXJrYmVnaW5lbmQiPyJlbmQiOiIiOiFkLnRhZ05hbWV8fHRoaXMudm9pZEVsZW1lbnRzW2QudGFnTmFtZS50b0xvd2VyQ2FzZSgpXT8iIjpkLnNlbGZDbG9zaW5nPyIiOmQudmFsdWUuaW5kZXhPZigiLyIrZC50YWdOYW1lKSE9PS0xPyIiOiJzdGFydCJ9LHRoaXMuX2dldEZpcnN0VGFnSW5MaW5lPWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5nZXRUb2tlbnMoYixiKVswXS50b2tlbnMsZD0iIjtmb3IodmFyIGY9MDtmPGMubGVuZ3RoO2YrKyl7dmFyIGc9Y1tmXTtnLnR5cGUuaW5kZXhPZigibWV0YS50YWciKT09PTA/ZCs9Zy52YWx1ZTpkKz1lLnN0cmluZ1JlcGVhdCgiICIsZy52YWx1ZS5sZW5ndGgpfXJldHVybiB0aGlzLl9wYXJzZVRhZyhkKX0sdGhpcy50YWdSZT0vXihccyopKDw/KFwvPykoWy1fYS16QS1aMC05OiFdKilccyooXC8/KT4/KS8sdGhpcy5fcGFyc2VUYWc9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy50YWdSZS5leGVjKGEpLGM9dGhpcy50YWdSZS5sYXN0SW5kZXh8fDA7cmV0dXJuIHRoaXMudGFnUmUubGFzdEluZGV4PTAse3ZhbHVlOmEsbWF0Y2g6Yj9iWzJdOiIiLGNsb3Npbmc6Yj8hIWJbM106ITEsc2VsZkNsb3Npbmc6Yj8hIWJbNV18fGJbMl09PSIvPiI6ITEsdGFnTmFtZTpiP2JbNF06IiIsY29sdW1uOmJbMV0/YytiWzFdLmxlbmd0aDpjfX0sdGhpcy5fcmVhZFRhZ0ZvcndhcmQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRDdXJyZW50VG9rZW4oKTtpZighYilyZXR1cm4gbnVsbDt2YXIgYz0iIixkO2RvIGlmKGIudHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpPT09MCl7aWYoIWQpdmFyIGQ9e3JvdzphLmdldEN1cnJlbnRUb2tlblJvdygpLGNvbHVtbjphLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpfTtjKz1iLnZhbHVlO2lmKGMuaW5kZXhPZigiPiIpIT09LTEpe3ZhciBlPXRoaXMuX3BhcnNlVGFnKGMpO3JldHVybiBlLnN0YXJ0PWQsZS5lbmQ9e3JvdzphLmdldEN1cnJlbnRUb2tlblJvdygpLGNvbHVtbjphLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpK2IudmFsdWUubGVuZ3RofSxhLnN0ZXBGb3J3YXJkKCksZX19d2hpbGUoYj1hLnN0ZXBGb3J3YXJkKCkpO3JldHVybiBudWxsfSx0aGlzLl9yZWFkVGFnQmFja3dhcmQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRDdXJyZW50VG9rZW4oKTtpZighYilyZXR1cm4gbnVsbDt2YXIgYz0iIixkO2RvIGlmKGIudHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpPT09MCl7ZHx8KGQ9e3JvdzphLmdldEN1cnJlbnRUb2tlblJvdygpLGNvbHVtbjphLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpK2IudmFsdWUubGVuZ3RofSksYz1iLnZhbHVlK2M7aWYoYy5pbmRleE9mKCI8IikhPT0tMSl7dmFyIGU9dGhpcy5fcGFyc2VUYWcoYyk7cmV0dXJuIGUuZW5kPWQsZS5zdGFydD17cm93OmEuZ2V0Q3VycmVudFRva2VuUm93KCksY29sdW1uOmEuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCl9LGEuc3RlcEJhY2t3YXJkKCksZX19d2hpbGUoYj1hLnN0ZXBCYWNrd2FyZCgpKTtyZXR1cm4gbnVsbH0sdGhpcy5fcG9wPWZ1bmN0aW9uKGEsYil7d2hpbGUoYS5sZW5ndGgpe3ZhciBjPWFbYS5sZW5ndGgtMV07aWYoIWJ8fGMudGFnTmFtZT09Yi50YWdOYW1lKXJldHVybiBhLnBvcCgpO2lmKHRoaXMudm9pZEVsZW1lbnRzW2IudGFnTmFtZV0pcmV0dXJuO2lmKHRoaXMudm9pZEVsZW1lbnRzW2MudGFnTmFtZV0pe2EucG9wKCk7Y29udGludWV9cmV0dXJuIG51bGx9fSx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmUoYSxjKTtpZighZC5tYXRjaClyZXR1cm4gbnVsbDt2YXIgZT1kLmNsb3Npbmd8fGQuc2VsZkNsb3NpbmcsZz1bXSxpO2lmKCFlKXt2YXIgaj1uZXcgaChhLGMsZC5jb2x1bW4pLGs9e3JvdzpjLGNvbHVtbjpkLmNvbHVtbitkLnRhZ05hbWUubGVuZ3RoKzJ9O3doaWxlKGk9dGhpcy5fcmVhZFRhZ0ZvcndhcmQoaikpe2lmKGkuc2VsZkNsb3Npbmcpe2lmKCFnLmxlbmd0aClyZXR1cm4gaS5zdGFydC5jb2x1bW4rPWkudGFnTmFtZS5sZW5ndGgrMixpLmVuZC5jb2x1bW4tPTIsZi5mcm9tUG9pbnRzKGkuc3RhcnQsaS5lbmQpO2NvbnRpbnVlfWlmKGkuY2xvc2luZyl7dGhpcy5fcG9wKGcsaSk7aWYoZy5sZW5ndGg9PTApcmV0dXJuIGYuZnJvbVBvaW50cyhrLGkuc3RhcnQpfWVsc2UgZy5wdXNoKGkpfX1lbHNle3ZhciBqPW5ldyBoKGEsYyxkLmNvbHVtbitkLm1hdGNoLmxlbmd0aCksbD17cm93OmMsY29sdW1uOmQuY29sdW1ufTt3aGlsZShpPXRoaXMuX3JlYWRUYWdCYWNrd2FyZChqKSl7aWYoaS5zZWxmQ2xvc2luZyl7aWYoIWcubGVuZ3RoKXJldHVybiBpLnN0YXJ0LmNvbHVtbis9aS50YWdOYW1lLmxlbmd0aCsyLGkuZW5kLmNvbHVtbi09MixmLmZyb21Qb2ludHMoaS5zdGFydCxpLmVuZCk7Y29udGludWV9aWYoIWkuY2xvc2luZyl7dGhpcy5fcG9wKGcsaSk7aWYoZy5sZW5ndGg9PTApcmV0dXJuIGkuc3RhcnQuY29sdW1uKz1pLnRhZ05hbWUubGVuZ3RoKzIsZi5mcm9tUG9pbnRzKGkuc3RhcnQsbCl9ZWxzZSBnLnB1c2goaSl9fX19LmNhbGwoaS5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW9kZS9odG1sIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL21vZGUvamF2YXNjcmlwdCIsImFjZS9tb2RlL2NzcyIsImFjZS90b2tlbml6ZXIiLCJhY2UvbW9kZS9odG1sX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL2JlaGF2aW91ci94bWwiLCJhY2UvbW9kZS9mb2xkaW5nL2h0bWwiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dCIpLk1vZGUsZj1hKCIuL2phdmFzY3JpcHQiKS5Nb2RlLGc9YSgiLi9jc3MiKS5Nb2RlLGg9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGk9YSgiLi9odG1sX2hpZ2hsaWdodF9ydWxlcyIpLkh0bWxIaWdobGlnaHRSdWxlcyxqPWEoIi4vYmVoYXZpb3VyL3htbCIpLlhtbEJlaGF2aW91cixrPWEoIi4vZm9sZGluZy9odG1sIikuRm9sZE1vZGUsbD1mdW5jdGlvbigpe3ZhciBhPW5ldyBpO3RoaXMuJHRva2VuaXplcj1uZXcgaChhLmdldFJ1bGVzKCkpLHRoaXMuJGJlaGF2aW91cj1uZXcgaix0aGlzLiRlbWJlZHM9YS5nZXRFbWJlZHMoKSx0aGlzLmNyZWF0ZU1vZGVEZWxlZ2F0ZXMoeyJqcy0iOmYsImNzcy0iOmd9KSx0aGlzLmZvbGRpbmdSdWxlcz1uZXcga307ZC5pbmhlcml0cyhsLGUpLGZ1bmN0aW9uKCl7dGhpcy50b2dnbGVDb21tZW50TGluZXM9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIDB9LHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiRnZXRJbmRlbnQoYil9LHRoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hMX19LmNhbGwobC5wcm90b3R5cGUpLGIuTW9kZT1sfSksZGVmaW5lKCJhY2UvbW9kZS9jc3MiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvY3NzX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLCJhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQiLCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vY3NzX2hpZ2hsaWdodF9ydWxlcyIpLkNzc0hpZ2hsaWdodFJ1bGVzLGg9YSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQsaT1hKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudCxqPWEoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZSxrPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSwiaSIpLHRoaXMuJG91dGRlbnQ9bmV3IGgsdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGp9O2QuaW5oZXJpdHMoayxlKSxmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1J1bGVzPSJjU3R5bGUiLHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuJGdldEluZGVudChiKSxlPXRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGIsYSkudG9rZW5zO2lmKGUubGVuZ3RoJiZlW2UubGVuZ3RoLTFdLnR5cGU9PSJjb21tZW50IilyZXR1cm4gZDt2YXIgZj1iLm1hdGNoKC9eLipce1xzKiQvKTtyZXR1cm4gZiYmKGQrPWMpLGR9LHRoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQoYixjKX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7dGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChiLGMpfSx0aGlzLmNyZWF0ZVdvcmtlcj1mdW5jdGlvbihhKXt2YXIgYj1uZXcgaShbImFjZSJdLCJ3b3JrZXItY3NzLmpzIiwiYWNlL21vZGUvY3NzX3dvcmtlciIsIldvcmtlciIpO3JldHVybiBiLmF0dGFjaFRvRG9jdW1lbnQoYS5nZXREb2N1bWVudCgpKSxiLm9uKCJjc3NsaW50IixmdW5jdGlvbihiKXt2YXIgYz1bXTtiLmRhdGEuZm9yRWFjaChmdW5jdGlvbihhKXtjLnB1c2goe3JvdzphLmxpbmUtMSxjb2x1bW46YS5jb2wtMSx0ZXh0OmEubWVzc2FnZSx0eXBlOmEudHlwZSxsaW50OmF9KX0pLGEuc2V0QW5ub3RhdGlvbnMoYyl9KSxifX0uY2FsbChrLnByb3RvdHlwZSksYi5Nb2RlPWt9KSxkZWZpbmUoImFjZS9tb2RlL2Nzc19oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxnPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKCItbW96LWFwcGVhcmFuY2V8LW1vei1ib3gtc2l6aW5nfC13ZWJraXQtYm94LXNpemluZ3wtbW96LW91dGxpbmUtcmFkaXVzfC1tb3otdHJhbnNmb3JtfC13ZWJraXQtdHJhbnNmb3JtfGFwcGVhcmFuY2V8YXppbXV0aHxiYWNrZ3JvdW5kLWF0dGFjaG1lbnR8YmFja2dyb3VuZC1jb2xvcnxiYWNrZ3JvdW5kLWltYWdlfGJhY2tncm91bmQtb3JpZ2lufGJhY2tncm91bmQtcG9zaXRpb258YmFja2dyb3VuZC1yZXBlYXR8YmFja2dyb3VuZHxib3JkZXItYm90dG9tLWNvbG9yfGJvcmRlci1ib3R0b20tc3R5bGV8Ym9yZGVyLWJvdHRvbS13aWR0aHxib3JkZXItYm90dG9tfGJvcmRlci1jb2xsYXBzZXxib3JkZXItY29sb3J8Ym9yZGVyLWxlZnQtY29sb3J8Ym9yZGVyLWxlZnQtc3R5bGV8Ym9yZGVyLWxlZnQtd2lkdGh8Ym9yZGVyLWxlZnR8Ym9yZGVyLXJpZ2h0LWNvbG9yfGJvcmRlci1yaWdodC1zdHlsZXxib3JkZXItcmlnaHQtd2lkdGh8Ym9yZGVyLXJpZ2h0fGJvcmRlci1zcGFjaW5nfGJvcmRlci1zdHlsZXxib3JkZXItdG9wLWNvbG9yfGJvcmRlci10b3Atc3R5bGV8Ym9yZGVyLXRvcC13aWR0aHxib3JkZXItdG9wfGJvcmRlci13aWR0aHxib3JkZXJ8Ym90dG9tfGJveC1zaXppbmd8Y2FwdGlvbi1zaWRlfGNsZWFyfGNsaXB8Y29sb3J8Y29udGVudHxjb3VudGVyLWluY3JlbWVudHxjb3VudGVyLXJlc2V0fGN1ZS1hZnRlcnxjdWUtYmVmb3JlfGN1ZXxjdXJzb3J8ZGlyZWN0aW9ufGRpc3BsYXl8ZWxldmF0aW9ufGVtcHR5LWNlbGxzfGZsb2F0fGZvbnQtZmFtaWx5fGZvbnQtc2l6ZS1hZGp1c3R8Zm9udC1zaXplfGZvbnQtc3RyZXRjaHxmb250LXN0eWxlfGZvbnQtdmFyaWFudHxmb250LXdlaWdodHxmb250fGhlaWdodHxsZWZ0fGxldHRlci1zcGFjaW5nfGxpbmUtaGVpZ2h0fGxpc3Qtc3R5bGUtaW1hZ2V8bGlzdC1zdHlsZS1wb3NpdGlvbnxsaXN0LXN0eWxlLXR5cGV8bGlzdC1zdHlsZXxtYXJnaW4tYm90dG9tfG1hcmdpbi1sZWZ0fG1hcmdpbi1yaWdodHxtYXJnaW4tdG9wfG1hcmtlci1vZmZzZXR8bWFyZ2lufG1hcmtzfG1heC1oZWlnaHR8bWF4LXdpZHRofG1pbi1oZWlnaHR8bWluLXdpZHRofC1tb3otYm9yZGVyLXJhZGl1c3xvcGFjaXR5fG9ycGhhbnN8b3V0bGluZS1jb2xvcnxvdXRsaW5lLW9mZnNldHxvdXRsaW5lLXJhZGl1c3xvdXRsaW5lLXN0eWxlfG91dGxpbmUtd2lkdGh8b3V0bGluZXxvdmVyZmxvd3xvdmVyZmxvdy14fG92ZXJmbG93LXl8cGFkZGluZy1ib3R0b218cGFkZGluZy1sZWZ0fHBhZGRpbmctcmlnaHR8cGFkZGluZy10b3B8cGFkZGluZ3xwYWdlLWJyZWFrLWFmdGVyfHBhZ2UtYnJlYWstYmVmb3JlfHBhZ2UtYnJlYWstaW5zaWRlfHBhZ2V8cGF1c2UtYWZ0ZXJ8cGF1c2UtYmVmb3JlfHBhdXNlfHBpdGNoLXJhbmdlfHBpdGNofHBsYXktZHVyaW5nfHBvaW50ZXItZXZlbnRzfHBvc2l0aW9ufHF1b3Rlc3xyZXNpemV8cmljaG5lc3N8cmlnaHR8c2l6ZXxzcGVhay1oZWFkZXJ8c3BlYWstbnVtZXJhbHxzcGVhay1wdW5jdHVhdGlvbnxzcGVlY2gtcmF0ZXxzcGVha3xzdHJlc3N8dGFibGUtbGF5b3V0fHRleHQtYWxpZ258dGV4dC1kZWNvcmF0aW9ufHRleHQtaW5kZW50fHRleHQtc2hhZG93fHRleHQtdHJhbnNmb3JtfHRvcHx0cmFuc2Zvcm18dW5pY29kZS1iaWRpfHZlcnRpY2FsLWFsaWdufHZpc2liaWxpdHl8dm9pY2UtZmFtaWx5fHZvbHVtZXx3aGl0ZS1zcGFjZXx3aWRvd3N8d2lkdGh8d29yZC1zcGFjaW5nfHotaW5kZXgiLnNwbGl0KCJ8IikpLGI9ZS5hcnJheVRvTWFwKCJyZ2J8cmdiYXx1cmx8YXR0cnxjb3VudGVyfGNvdW50ZXJzIi5zcGxpdCgifCIpKSxjPWUuYXJyYXlUb01hcCgiYWJzb2x1dGV8YWxsLXNjcm9sbHxhbHdheXN8YXJtZW5pYW58YXV0b3xiYXNlbGluZXxiZWxvd3xiaWRpLW92ZXJyaWRlfGJsb2NrfGJvbGR8Ym9sZGVyfGJvcmRlci1ib3h8Ym90aHxib3R0b218YnJlYWstYWxsfGJyZWFrLXdvcmR8Y2FwaXRhbGl6ZXxjZW50ZXJ8Y2hhcnxjaXJjbGV8Y2prLWlkZW9ncmFwaGljfGNvbC1yZXNpemV8Y29sbGFwc2V8Y29udGVudC1ib3h8Y3Jvc3NoYWlyfGRhc2hlZHxkZWNpbWFsLWxlYWRpbmctemVyb3xkZWNpbWFsfGRlZmF1bHR8ZGlzYWJsZWR8ZGlzY3xkaXN0cmlidXRlLWFsbC1saW5lc3xkaXN0cmlidXRlLWxldHRlcnxkaXN0cmlidXRlLXNwYWNlfGRpc3RyaWJ1dGV8ZG90dGVkfGRvdWJsZXxlLXJlc2l6ZXxlbGxpcHNpc3xmaXhlZHxnZW9yZ2lhbnxncm9vdmV8aGFuZHxoZWJyZXd8aGVscHxoaWRkZW58aGlyYWdhbmEtaXJvaGF8aGlyYWdhbmF8aG9yaXpvbnRhbHxpZGVvZ3JhcGgtYWxwaGF8aWRlb2dyYXBoLW51bWVyaWN8aWRlb2dyYXBoLXBhcmVudGhlc2lzfGlkZW9ncmFwaC1zcGFjZXxpbmFjdGl2ZXxpbmhlcml0fGlubGluZS1ibG9ja3xpbmxpbmV8aW5zZXR8aW5zaWRlfGludGVyLWlkZW9ncmFwaHxpbnRlci13b3JkfGl0YWxpY3xqdXN0aWZ5fGthdGFrYW5hLWlyb2hhfGthdGFrYW5hfGtlZXAtYWxsfGxlZnR8bGlnaHRlcnxsaW5lLWVkZ2V8bGluZS10aHJvdWdofGxpbmV8bGlzdC1pdGVtfGxvb3NlfGxvd2VyLWFscGhhfGxvd2VyLWdyZWVrfGxvd2VyLWxhdGlufGxvd2VyLXJvbWFufGxvd2VyY2FzZXxsci10YnxsdHJ8bWVkaXVtfG1pZGRsZXxtb3ZlfG4tcmVzaXplfG5lLXJlc2l6ZXxuZXdzcGFwZXJ8bm8tZHJvcHxuby1yZXBlYXR8bnctcmVzaXplfG5vbmV8bm9ybWFsfG5vdC1hbGxvd2VkfG5vd3JhcHxvYmxpcXVlfG91dHNldHxvdXRzaWRlfG92ZXJsaW5lfHBvaW50ZXJ8cHJvZ3Jlc3N8cmVsYXRpdmV8cmVwZWF0LXh8cmVwZWF0LXl8cmVwZWF0fHJpZ2h0fHJpZGdlfHJvdy1yZXNpemV8cnRsfHMtcmVzaXplfHNjcm9sbHxzZS1yZXNpemV8c2VwYXJhdGV8c21hbGwtY2Fwc3xzb2xpZHxzcXVhcmV8c3RhdGljfHN0cmljdHxzdXBlcnxzdy1yZXNpemV8dGFibGUtZm9vdGVyLWdyb3VwfHRhYmxlLWhlYWRlci1ncm91cHx0Yi1ybHx0ZXh0LWJvdHRvbXx0ZXh0LXRvcHx0ZXh0fHRoaWNrfHRoaW58dG9wfHRyYW5zcGFyZW50fHVuZGVybGluZXx1cHBlci1hbHBoYXx1cHBlci1sYXRpbnx1cHBlci1yb21hbnx1cHBlcmNhc2V8dmVydGljYWwtaWRlb2dyYXBoaWN8dmVydGljYWwtdGV4dHx2aXNpYmxlfHctcmVzaXplfHdhaXR8d2hpdGVzcGFjZXx6ZXJvIi5zcGxpdCgifCIpKSxkPWUuYXJyYXlUb01hcCgiYXF1YXxibGFja3xibHVlfGZ1Y2hzaWF8Z3JheXxncmVlbnxsaW1lfG1hcm9vbnxuYXZ5fG9saXZlfG9yYW5nZXxwdXJwbGV8cmVkfHNpbHZlcnx0ZWFsfHdoaXRlfHllbGxvdyIuc3BsaXQoInwiKSksZj0iXFwtPyg/Oig/OlswLTldKyl8KD86WzAtOV0qXFwuWzAtOV0rKSkiLGc9W3t0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKiIsbmV4dDoicnVsZXNldF9jb21tZW50In0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OidbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJ30se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDpmKyIoPzplbXxleHxweHxjbXxtbXxpbnxwdHxwY3xkZWd8cmFkfGdyYWR8bXN8c3xoenxraHp8JSkifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIjW2EtZjAtOV17Nn0ifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIjW2EtZjAtOV17M30ifSx7dG9rZW46ZnVuY3Rpb24oZSl7cmV0dXJuIGEuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT8ic3VwcG9ydC50eXBlIjpiLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/InN1cHBvcnQuZnVuY3Rpb24iOmMuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT8ic3VwcG9ydC5jb25zdGFudCI6ZC5oYXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpPyJzdXBwb3J0LmNvbnN0YW50LmNvbG9yIjoidGV4dCJ9LHJlZ2V4OiJcXC0/W2EtekEtWl9dW2EtekEtWjAtOV9cXC1dKiJ9XSxoPWUuY29weUFycmF5KGcpO2gudW5zaGlmdCh7dG9rZW46InBhcmVuLnJwYXJlbiIscmVnZXg6IlxcfSIsbmV4dDoic3RhcnQifSk7dmFyIGk9ZS5jb3B5QXJyYXkoZyk7aS51bnNoaWZ0KHt0b2tlbjoicGFyZW4ucnBhcmVuIixyZWdleDoiXFx9IixuZXh0OiJtZWRpYSJ9KTt2YXIgaj1be3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV0saz1lLmNvcHlBcnJheShqKTtrLnVuc2hpZnQoe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixuZXh0OiJzdGFydCJ9KTt2YXIgbD1lLmNvcHlBcnJheShqKTtsLnVuc2hpZnQoe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixuZXh0OiJtZWRpYSJ9KTt2YXIgbT1lLmNvcHlBcnJheShqKTttLnVuc2hpZnQoe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixuZXh0OiJydWxlc2V0In0pLHRoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwvXFwqIixuZXh0OiJjb21tZW50In0se3Rva2VuOiJwYXJlbi5scGFyZW4iLHJlZ2V4OiJcXHsiLG5leHQ6InJ1bGVzZXQifSx7dG9rZW46InN0cmluZyIscmVnZXg6IkAuKj97IixuZXh0OiJtZWRpYSJ9LHt0b2tlbjoia2V5d29yZCIscmVnZXg6IiNbYS16MC05LV9dKyJ9LHt0b2tlbjoidmFyaWFibGUiLHJlZ2V4OiJcXC5bYS16MC05LV9dKyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiOlthLXowLTktX10rIn0se3Rva2VuOiJjb25zdGFudCIscmVnZXg6IlthLXowLTktX10rIn1dLG1lZGlhOlt7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCoiLG5leHQ6Im1lZGlhX2NvbW1lbnQifSx7dG9rZW46InBhcmVuLmxwYXJlbiIscmVnZXg6IlxceyIsbmV4dDoibWVkaWFfcnVsZXNldCJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiXFx9IixuZXh0OiJzdGFydCJ9LHt0b2tlbjoia2V5d29yZCIscmVnZXg6IiNbYS16MC05LV9dKyJ9LHt0b2tlbjoidmFyaWFibGUiLHJlZ2V4OiJcXC5bYS16MC05LV9dKyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiOlthLXowLTktX10rIn0se3Rva2VuOiJjb25zdGFudCIscmVnZXg6IlthLXowLTktX10rIn1dLGNvbW1lbnQ6ayxydWxlc2V0OmgscnVsZXNldF9jb21tZW50Om0sbWVkaWFfcnVsZXNldDppLG1lZGlhX2NvbW1lbnQ6bH19O2QuaW5oZXJpdHMoZyxmKSxiLkNzc0hpZ2hsaWdodFJ1bGVzPWd9KSxkZWZpbmUoImFjZS9tb2RlL2h0bWxfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9jc3NfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS94bWxfdXRpbCIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL2Nzc19oaWdobGlnaHRfcnVsZXMiKS5Dc3NIaWdobGlnaHRSdWxlcyxmPWEoIi4vamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiKS5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMsZz1hKCIuL3htbF91dGlsIiksaD1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGk9ZnVuY3Rpb24oKXt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoidGV4dCIsbWVyZ2U6ITAscmVnZXg6IjxcXCFcXFtDREFUQVxcWyIsbmV4dDoiY2RhdGEifSx7dG9rZW46InhtbF9wZSIscmVnZXg6IjxcXD8uKj9cXD8+In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiPFxcIS0tIixuZXh0OiJjb21tZW50In0se3Rva2VuOiJtZXRhLnRhZyIscmVnZXg6IjwoPz1zKnNjcmlwdFxcYikiLG5leHQ6InNjcmlwdCJ9LHt0b2tlbjoibWV0YS50YWciLHJlZ2V4OiI8KD89cypzdHlsZVxcYikiLG5leHQ6ImNzcyJ9LHt0b2tlbjoibWV0YS50YWciLHJlZ2V4OiI8XFwvPyIsbmV4dDoidGFnIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IltePF0rIn1dLGNkYXRhOlt7dG9rZW46InRleHQiLHJlZ2V4OiJcXF1cXF0+IixuZXh0OiJzdGFydCJ9LHt0b2tlbjoidGV4dCIsbWVyZ2U6ITAscmVnZXg6IlxccysifSx7dG9rZW46InRleHQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxjb21tZW50Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj8tLT4iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV19LGcudGFnKHRoaXMuJHJ1bGVzLCJ0YWciLCJzdGFydCIpLGcudGFnKHRoaXMuJHJ1bGVzLCJjc3MiLCJjc3Mtc3RhcnQiKSxnLnRhZyh0aGlzLiRydWxlcywic2NyaXB0IiwianMtc3RhcnQiKSx0aGlzLmVtYmVkUnVsZXMoZiwianMtIixbe3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwvXFwvLiooPz08XFwvc2NyaXB0PikiLG5leHQ6InRhZyJ9LHt0b2tlbjoibWV0YS50YWciLHJlZ2V4OiI8XFwvKD89c2NyaXB0KSIsbmV4dDoidGFnIn1dKSx0aGlzLmVtYmVkUnVsZXMoZSwiY3NzLSIsW3t0b2tlbjoibWV0YS50YWciLHJlZ2V4OiI8XFwvKD89c3R5bGUpIixuZXh0OiJ0YWcifV0pfTtkLmluaGVyaXRzKGksaCksYi5IdG1sSGlnaGxpZ2h0UnVsZXM9aX0pLGRlZmluZSgiYWNlL21vZGUvZm9sZGluZy9odG1sIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9mb2xkaW5nL21peGVkIiwiYWNlL21vZGUvZm9sZGluZy94bWwiLCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi9taXhlZCIpLkZvbGRNb2RlLGY9YSgiLi94bWwiKS5Gb2xkTW9kZSxnPWEoIi4vY3N0eWxlIikuRm9sZE1vZGUsaD1iLkZvbGRNb2RlPWZ1bmN0aW9uKCl7ZS5jYWxsKHRoaXMsbmV3IGYoe2FyZWE6MSxiYXNlOjEsYnI6MSxjb2w6MSxjb21tYW5kOjEsZW1iZWQ6MSxocjoxLGltZzoxLGlucHV0OjEsa2V5Z2VuOjEsbGluazoxLG1ldGE6MSxwYXJhbToxLHNvdXJjZToxLHRyYWNrOjEsd2JyOjEsbGk6MSxkdDoxLGRkOjEscDoxLHJ0OjEscnA6MSxvcHRncm91cDoxLG9wdGlvbjoxLGNvbGdyb3VwOjEsdGQ6MSx0aDoxfSkseyJqcy0iOm5ldyBnLCJjc3MtIjpuZXcgZ30pfTtkLmluaGVyaXRzKGgsZSl9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvbWl4ZWQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlLGY9Yi5Gb2xkTW9kZT1mdW5jdGlvbihhLGIpe3RoaXMuZGVmYXVsdE1vZGU9YSx0aGlzLnN1Yk1vZGVzPWJ9O2QuaW5oZXJpdHMoZixlKSxmdW5jdGlvbigpe3RoaXMuJGdldE1vZGU9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiIGluIHRoaXMuc3ViTW9kZXMpaWYoYS5pbmRleE9mKGIpPT09MClyZXR1cm4gdGhpcy5zdWJNb2Rlc1tiXTtyZXR1cm4gbnVsbH0sdGhpcy4kdHJ5TW9kZT1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT10aGlzLiRnZXRNb2RlKGEpO3JldHVybiBlP2UuZ2V0Rm9sZFdpZGdldChiLGMsZCk6IiJ9LHRoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuJHRyeU1vZGUoYS5nZXRTdGF0ZShjLTEpLGEsYixjKXx8dGhpcy4kdHJ5TW9kZShhLmdldFN0YXRlKGMpLGEsYixjKXx8dGhpcy5kZWZhdWx0TW9kZS5nZXRGb2xkV2lkZ2V0KGEsYixjKX0sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuJGdldE1vZGUoYS5nZXRTdGF0ZShjLTEpKTtpZighZHx8IWQuZ2V0Rm9sZFdpZGdldChhLGIsYykpZD10aGlzLiRnZXRNb2RlKGEuZ2V0U3RhdGUoYykpO2lmKCFkfHwhZC5nZXRGb2xkV2lkZ2V0KGEsYixjKSlkPXRoaXMuZGVmYXVsdE1vZGU7cmV0dXJuIGQuZ2V0Rm9sZFdpZGdldFJhbmdlKGEsYixjKX19LmNhbGwoZi5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW9kZS9tYXJrZG93bl9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS94bWxfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvaHRtbF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS9jc3NfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGooYSxiKXtyZXR1cm57dG9rZW46InN1cHBvcnQuZnVuY3Rpb24iLHJlZ2V4OiJeYGBgIithKyJcXHMqJCIsbmV4dDpiKyJzdGFydCJ9fSJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGY9YSgiLi9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIpLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyxnPWEoIi4veG1sX2hpZ2hsaWdodF9ydWxlcyIpLlhtbEhpZ2hsaWdodFJ1bGVzLGg9YSgiLi9odG1sX2hpZ2hsaWdodF9ydWxlcyIpLkh0bWxIaWdobGlnaHRSdWxlcyxpPWEoIi4vY3NzX2hpZ2hsaWdodF9ydWxlcyIpLkNzc0hpZ2hsaWdodFJ1bGVzLGs9ZnVuY3Rpb24oKXt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoiZW1wdHlfbGluZSIscmVnZXg6Il4kIn0se3Rva2VuOiJzdXBwb3J0LmZ1bmN0aW9uIixyZWdleDoiKGArKShbXlxccl0qP1teYF0pKFxcMSkifSx7dG9rZW46InN1cHBvcnQuZnVuY3Rpb24iLHJlZ2V4OiJeWyBdezR9LisifSx7dG9rZW46Im1hcmt1cC5oZWFkaW5nLjEiLHJlZ2V4OiJePSsoPz1cXHMqJCkifSx7dG9rZW46Im1hcmt1cC5oZWFkaW5nLjEiLHJlZ2V4OiJeXFwtKyg/PVxccyokKSJ9LHt0b2tlbjpmdW5jdGlvbihhKXtyZXR1cm4ibWFya3VwLmhlYWRpbmcuIithLmxlbmd0aH0scmVnZXg6Il4jezEsNn0ifSxqKCJqYXZhc2NyaXB0IiwianMtIiksaigieG1sIiwieG1sLSIpLGooImh0bWwiLCJodG1sLSIpLGooImNzcyIsImNzcy0iKSx7dG9rZW46InN1cHBvcnQuZnVuY3Rpb24iLHJlZ2V4OiJeYGBgW2EtekEtWl0rXFxzKiQiLG5leHQ6ImdpdGh1YmJsb2NrIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJePlsgXS4rJCIsbmV4dDoiYmxvY2txdW90ZSJ9LHt0b2tlbjpbInRleHQiLCJjb25zdGFudCIsInRleHQiLCJ1cmwiLCJzdHJpbmciLCJ0ZXh0Il0scmVnZXg6J14oWyBdezAsM31cXFspKFteXFxdXSspKFxcXTpcXHMqKShbXiBdKykoXFxzKig/OlsiXVteIl0rWyJdKT9cXHMqKSQnfSx7dG9rZW46WyJ0ZXh0Iiwic3RyaW5nIiwidGV4dCIsImNvbnN0YW50IiwidGV4dCJdLHJlZ2V4OiIoXFxbKSgoPzpbW15cXF1dKlxcXXxbXlxcW1xcXV0pKikoXFxdWyBdPyg/OlxcblsgXSopP1xcWykoLio/KShcXF0pIn0se3Rva2VuOlsidGV4dCIsInN0cmluZyIsInRleHQiLCJtYXJrdXAudW5kZXJsaW5lIiwic3RyaW5nIiwidGV4dCJdLHJlZ2V4OicoXFxbKShcXFtbXlxcXV0qXFxdfFteXFxbXFxdXSopKFxcXVxcKFsgXFx0XSopKDw/KD86KD86W15cXChdKj9cXChbXlxcKV0qP1xcKVxcUyo/KXwoPzouKj8pKT4/KSgoPzpbIFx0XSoiKD86Lio/KSJbIFxcdF0qKT8pKFxcKSknfSx7dG9rZW46ImNvbnN0YW50IixyZWdleDoiXlsgXXswLDJ9KD86WyBdP1xcKlsgXT8pezMsfVxccyokIn0se3Rva2VuOiJjb25zdGFudCIscmVnZXg6Il5bIF17MCwyfSg/OlsgXT9cXC1bIF0/KXszLH1cXHMqJCJ9LHt0b2tlbjoiY29uc3RhbnQiLHJlZ2V4OiJeWyBdezAsMn0oPzpbIF0/XFxfWyBdPyl7Myx9XFxzKiQifSx7dG9rZW46Im1hcmt1cC5saXN0IixyZWdleDoiXlxcc3swLDN9KD86WyorLV18XFxkK1xcLilcXHMrIixuZXh0OiJsaXN0YmxvY2sifSx7dG9rZW46InN0cmluZyIscmVnZXg6IihbKl17Mn18W19dezJ9KD89XFxTKSkoW15cXHJdKj9cXFNbKl9dKikoXFwxKSJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiKFsqXXxbX10oPz1cXFMpKShbXlxccl0qP1xcU1sqX10qKShcXDEpIn0se3Rva2VuOlsidGV4dCIsInVybCIsInRleHQiXSxyZWdleDoiKDwpKCg/Omh0dHBzP3xmdHB8ZGljdCk6W14nXCI+XFxzXSt8KD86bWFpbHRvOik/Wy0uXFx3XStcXEBbLWEtejAtOV0rKD86XFwuWy1hLXowLTldKykqXFwuW2Etel0rKSg+KSJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlteXFwqXyUkYFxcWyM8Pl0rIn1dLGxpc3RibG9jazpbe3Rva2VuOiJlbXB0eV9saW5lIixyZWdleDoiXiQiLG5leHQ6InN0YXJ0In0se3Rva2VuOiJtYXJrdXAubGlzdCIscmVnZXg6Ii4rIn1dLGJsb2NrcXVvdGU6W3t0b2tlbjoiZW1wdHlfbGluZSIscmVnZXg6Il5cXHMqJCIsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIscmVnZXg6Ii4rIn1dLGdpdGh1YmJsb2NrOlt7dG9rZW46InN1cHBvcnQuZnVuY3Rpb24iLHJlZ2V4OiJeYGBgIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoic3VwcG9ydC5mdW5jdGlvbiIscmVnZXg6Ii4rIn1dfSx0aGlzLmVtYmVkUnVsZXMoZiwianMtIixbe3Rva2VuOiJzdXBwb3J0LmZ1bmN0aW9uIixyZWdleDoiXmBgYCIsbmV4dDoic3RhcnQifV0pLHRoaXMuZW1iZWRSdWxlcyhoLCJodG1sLSIsW3t0b2tlbjoic3VwcG9ydC5mdW5jdGlvbiIscmVnZXg6Il5gYGAiLG5leHQ6InN0YXJ0In1dKSx0aGlzLmVtYmVkUnVsZXMoaSwiY3NzLSIsW3t0b2tlbjoic3VwcG9ydC5mdW5jdGlvbiIscmVnZXg6Il5gYGAiLG5leHQ6InN0YXJ0In1dKSx0aGlzLmVtYmVkUnVsZXMoZywieG1sLSIsW3t0b2tlbjoic3VwcG9ydC5mdW5jdGlvbiIscmVnZXg6Il5gYGAiLG5leHQ6InN0YXJ0In1dKX07ZC5pbmhlcml0cyhrLGUpLGIuTWFya2Rvd25IaWdobGlnaHRSdWxlcz1rfSksZnVuY3Rpb24oKXt3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSxmdW5jdGlvbihhKXt3aW5kb3cuYWNlfHwod2luZG93LmFjZT17fSk7Zm9yKHZhciBiIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShiKSYmKGFjZVtiXT1hW2JdKX0pfSgp]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-ocaml-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBTZXJnaSBNYW5zaWxsYSA8c2VyZ2kgQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9vY2FtbCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL29jYW1sX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsKdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsKdmFyIE9jYW1sSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL29jYW1sX2hpZ2hsaWdodF9ydWxlcyIpLk9jYW1sSGlnaGxpZ2h0UnVsZXM7CnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Owp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOwoKdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IE9jYW1sSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsKICAgIHRoaXMuJG91dGRlbnQgICA9IG5ldyBNYXRjaGluZ0JyYWNlT3V0ZGVudCgpOwp9Owpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOwoKdmFyIGluZGVudGVyID0gLyg/Olsoe1s9Ol18Wy09XT58XGIoPzplbHNlfHRyeXx3aXRoKSlccyokLzsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpIHsKICAgICAgICB2YXIgaSwgbGluZTsKICAgICAgICB2YXIgb3V0ZGVudCA9IHRydWU7CiAgICAgICAgdmFyIHJlID0gL15ccypcKFwqKC4qKVwqXCkvOwoKICAgICAgICBmb3IgKGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykgewogICAgICAgICAgICBpZiAoIXJlLnRlc3QoZG9jLmdldExpbmUoaSkpKSB7CiAgICAgICAgICAgICAgICBvdXRkZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdmFyIHJhbmdlID0gbmV3IFJhbmdlKDAsIDAsIDAsIDApOwogICAgICAgIGZvciAoaT1zdGFydFJvdzsgaTw9IGVuZFJvdzsgaSsrKSB7CiAgICAgICAgICAgIGxpbmUgPSBkb2MuZ2V0TGluZShpKTsKICAgICAgICAgICAgcmFuZ2Uuc3RhcnQucm93ICA9IGk7CiAgICAgICAgICAgIHJhbmdlLmVuZC5yb3cgICAgPSBpOwogICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uID0gbGluZS5sZW5ndGg7CgogICAgICAgICAgICBkb2MucmVwbGFjZShyYW5nZSwgb3V0ZGVudCA/IGxpbmUubWF0Y2gocmUpWzFdIDogIigqIiArIGxpbmUgKyAiKikiKTsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7CiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsKICAgICAgICB2YXIgdG9rZW5zID0gdGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMobGluZSwgc3RhdGUpLnRva2VuczsKCiAgICAgICAgaWYgKCEodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdLnR5cGUgPT09ICdjb21tZW50JykgJiYKICAgICAgICAgICAgc3RhdGUgPT09ICdzdGFydCcgJiYgaW5kZW50ZXIudGVzdChsaW5lKSkKICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsKICAgICAgICByZXR1cm4gaW5kZW50OwogICAgfTsKCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCBpbnB1dCkgewogICAgICAgIHJldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChsaW5lLCBpbnB1dCk7CiAgICB9OwoKICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCByb3cpIHsKICAgICAgICB0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGRvYywgcm93KTsKICAgIH07Cgp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsKCmV4cG9ydHMuTW9kZSA9IE1vZGU7Cn0pOwoKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBTZXJnaSBNYW5zaWxsYSA8c2VyZ2kgQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKgogKgogKi8KCmRlZmluZSgnYWNlL21vZGUvb2NhbWxfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsKdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7Cgp2YXIgT2NhbWxIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgewoKICAgIHZhciBrZXl3b3JkcyA9IGxhbmcuYXJyYXlUb01hcCgoCiAgICAgICAgImFuZHxhc3xhc3NlcnR8YmVnaW58Y2xhc3N8Y29uc3RyYWludHxkb3xkb25lfGRvd250b3xlbHNlfGVuZHwiICArCiAgICAgICAgImV4Y2VwdGlvbnxleHRlcm5hbHxmb3J8ZnVufGZ1bmN0aW9ufGZ1bmN0b3J8aWZ8aW58aW5jbHVkZXwiICAgICArCiAgICAgICAgImluaGVyaXR8aW5pdGlhbGl6ZXJ8bGF6eXxsZXR8bWF0Y2h8bWV0aG9kfG1vZHVsZXxtdXRhYmxlfG5ld3wiICArCiAgICAgICAgIm9iamVjdHxvZnxvcGVufG9yfHByaXZhdGV8cmVjfHNpZ3xzdHJ1Y3R8dGhlbnx0b3x0cnl8dHlwZXx2YWx8IiArCiAgICAgICAgInZpcnR1YWx8d2hlbnx3aGlsZXx3aXRoIikuc3BsaXQoInwiKQogICAgKTsKCiAgICB2YXIgYnVpbHRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoInRydWV8ZmFsc2UiKS5zcGxpdCgifCIpCiAgICApOwoKICAgIHZhciBidWlsdGluRnVuY3Rpb25zID0gbGFuZy5hcnJheVRvTWFwKCgKICAgICAgICAiYWJzfGFic19iaWdfaW50fGFic19mbG9hdHxhYnNfbnVtfGFic3RyYWN0X3RhZ3xhY2NlcHR8YWNjZXNzfGFjb3N8YWRkfCIgKwogICAgICAgICJhZGRfYXZhaWxhYmxlX3VuaXRzfGFkZF9iaWdfaW50fGFkZF9idWZmZXJ8YWRkX2NoYW5uZWx8YWRkX2NoYXJ8IiArCiAgICAgICAgImFkZF9pbml0aWFsaXplcnxhZGRfaW50X2JpZ19pbnR8YWRkX2ludGVyZmFjZXN8YWRkX251bXxhZGRfc3RyaW5nfCIgKwogICAgICAgICJhZGRfc3Vic3RpdHV0ZXxhZGRfc3Vic3RyaW5nfGFsYXJtfGFsbG9jYXRlZF9ieXRlc3xhbGxvd19vbmx5fCIgKwogICAgICAgICJhbGxvd191bnNhZmVfbW9kdWxlc3xhbHdheXN8YXBwZW5kfGFwcG5hbWVfZ2V0fGFwcG5hbWVfc2V0fCIgKwogICAgICAgICJhcHByb3hfbnVtX2V4cHxhcHByb3hfbnVtX2ZpeHxhcmd8YXJndnxhcml0aF9zdGF0dXN8YXJyYXl8IiArCiAgICAgICAgImFycmF5MV9vZl9nZW5hcnJheXxhcnJheTJfb2ZfZ2VuYXJyYXl8YXJyYXkzX29mX2dlbmFycmF5fGFzaW58YXNyfCIgKwogICAgICAgICJhc3NvY3xhc3NxfGF0X2V4aXR8YXRhbnxhdGFuMnxhdXRvX3N5bmNocm9uaXplfGJhY2tncm91bmR8YmFzZW5hbWV8IiArCiAgICAgICAgImJlZ2lubmluZ19vZl9pbnB1dHxiaWdfaW50X29mX2ludHxiaWdfaW50X29mX251bXxiaWdfaW50X29mX3N0cmluZ3xiaW5kfCIgKwogICAgICAgICJiaW5kX2NsYXNzfGJpbmRfdGFnfGJpdHN8Yml0c19vZl9mbG9hdHxibGFja3xibGl0fGJsaXRfaW1hZ2V8Ymx1ZXxib29sfCIgKwogICAgICAgICJib29sX29mX3N0cmluZ3xib3VuZGVkX2Z1bGxfc3BsaXR8Ym91bmRlZF9zcGxpdHxib3VuZGVkX3NwbGl0X2RlbGltfCIgKwogICAgICAgICJicHJpbnRmfGJyZWFrfGJyb2FkY2FzdHxic2NhbmZ8YnV0dG9uX2Rvd258Y19sYXlvdXR8Y2FwaXRhbGl6ZXxjYXJkaW5hbHwiICsKICAgICAgICAiY2FyZGluYWx8Y2F0Y2h8Y2F0Y2hfYnJlYWt8Y2VpbHxjZWlsaW5nX251bXxjaGFubmVsfGNoYXJ8Y2hhcl9vZl9pbnR8IiArCiAgICAgICAgImNoZGlyfGNoZWNrfGNoZWNrX3N1ZmZpeHxjaG1vZHxjaG9vc2V8Y2hvcF9leHRlbnNpb258Y2hvcF9zdWZmaXh8Y2hvd258IiArCiAgICAgICAgImNob3dufGNocnxjaHJvb3R8Y2xhc3NpZnlfZmxvYXR8Y2xlYXJ8Y2xlYXJfYXZhaWxhYmxlX3VuaXRzfCIgKwogICAgICAgICJjbGVhcl9jbG9zZV9vbl9leGVjfGNsZWFyX2dyYXBofGNsZWFyX25vbmJsb2NrfGNsZWFyX3BhcnNlcnwiICsKICAgICAgICAiY2xvc2V8Y2xvc2V8Y2xvc2VUa3xjbG9zZV9ib3h8Y2xvc2VfZ3JhcGh8Y2xvc2VfaW58Y2xvc2VfaW5fbm9lcnJ8IiArCiAgICAgICAgImNsb3NlX291dHxjbG9zZV9vdXRfbm9lcnJ8Y2xvc2VfcHJvY2Vzc3xjbG9zZV9wcm9jZXNzfCIgKwogICAgICAgICJjbG9zZV9wcm9jZXNzX2Z1bGx8Y2xvc2VfcHJvY2Vzc19pbnxjbG9zZV9wcm9jZXNzX291dHxjbG9zZV9zdWJ3aW5kb3d8IiArCiAgICAgICAgImNsb3NlX3RhZ3xjbG9zZV90Ym94fGNsb3NlZGlyfGNsb3NlZGlyfGNsb3N1cmVfdGFnfGNvZGV8Y29tYmluZXwiICsKICAgICAgICAiY29tYmluZXxjb21iaW5lfGNvbW1hbmR8Y29tcGFjdHxjb21wYXJlfGNvbXBhcmVfYmlnX2ludHxjb21wYXJlX251bXwiICsKICAgICAgICAiY29tcGxleDMyfGNvbXBsZXg2NHxjb25jYXR8Y29uanxjb25uZWN0fGNvbnRhaW5zfGNvbnRhaW5zX2Zyb218Y29udGVudHN8IiArCiAgICAgICAgImNvcHl8Y29zfGNvc2h8Y291bnR8Y291bnR8Y291bnRlcnN8Y3JlYXRlfGNyZWF0ZV9hbGFybXxjcmVhdGVfaW1hZ2V8IiArCiAgICAgICAgImNyZWF0ZV9tYXRyaXh8Y3JlYXRlX21hdHJpeHxjcmVhdGVfbWF0cml4fGNyZWF0ZV9vYmplY3R8IiArCiAgICAgICAgImNyZWF0ZV9vYmplY3RfYW5kX3J1bl9pbml0aWFsaXplcnN8Y3JlYXRlX29iamVjdF9vcHR8Y3JlYXRlX3Byb2Nlc3N8IiArCiAgICAgICAgImNyZWF0ZV9wcm9jZXNzfGNyZWF0ZV9wcm9jZXNzX2VudnxjcmVhdGVfcHJvY2Vzc19lbnZ8Y3JlYXRlX3RhYmxlfCIgKwogICAgICAgICJjdXJyZW50fGN1cnJlbnRfZGlyX25hbWV8Y3VycmVudF9wb2ludHxjdXJyZW50X3h8Y3VycmVudF95fGN1cnZldG98IiArCiAgICAgICAgImN1c3RvbV90YWd8Y3lhbnxkYXRhX3NpemV8ZGVjcnxkZWNyX251bXxkZWZhdWx0X2F2YWlsYWJsZV91bml0c3xkZWxheXwiICsKICAgICAgICAiZGVsZXRlX2FsYXJtfGRlc2NyX29mX2luX2NoYW5uZWx8ZGVzY3Jfb2Zfb3V0X2NoYW5uZWx8ZGVzdHJveXxkaWZmfGRpbXwiICsKICAgICAgICAiZGltMXxkaW0yfGRpbTN8ZGltc3xkaXJuYW1lfGRpc3BsYXlfbW9kZXxkaXZ8ZGl2X2JpZ19pbnR8ZGl2X251bXwiICsKICAgICAgICAiZG91YmxlX2FycmF5X3RhZ3xkb3VibGVfdGFnfGRyYXdfYXJjfGRyYXdfY2hhcnxkcmF3X2NpcmNsZXxkcmF3X2VsbGlwc2V8IiArCiAgICAgICAgImRyYXdfaW1hZ2V8ZHJhd19wb2x5fGRyYXdfcG9seV9saW5lfGRyYXdfcmVjdHxkcmF3X3NlZ21lbnRzfGRyYXdfc3RyaW5nfCIgKwogICAgICAgICJkdW1teV9wb3N8ZHVtbXlfdGFibGV8ZHVtcF9pbWFnZXxkdXB8ZHVwMnxlbGVtZW50c3xlbXB0eXxlbmRfb2ZfaW5wdXR8IiArCiAgICAgICAgImVudmlyb25tZW50fGVwcmludGZ8ZXBzaWxvbl9mbG9hdHxlcV9iaWdfaW50fGVxX251bXxlcXVhbHxlcnJfZm9ybWF0dGVyfCIgKwogICAgICAgICJlcnJvcl9tZXNzYWdlfGVzY2FwZWR8ZXN0YWJsaXNoX3NlcnZlcnxleGVjdXRhYmxlX25hbWV8ZXhlY3Z8ZXhlY3ZlfGV4ZWN2cHwiICsKICAgICAgICAiZXhlY3ZwZXxleGlzdHN8ZXhpc3RzMnxleGl0fGV4cHxmYWlsd2l0aHxmYXN0X3NvcnR8ZmNobW9kfGZjaG93bnxmaWVsZHwiICsKICAgICAgICAiZmlsZXxmaWxlX2V4aXN0c3xmaWxsfGZpbGxfYXJjfGZpbGxfY2lyY2xlfGZpbGxfZWxsaXBzZXxmaWxsX3BvbHl8ZmlsbF9yZWN0fCIgKwogICAgICAgICJmaWx0ZXJ8ZmluYWxfdGFnfGZpbmFsaXNlfGZpbmR8ZmluZF9hbGx8Zmlyc3RfY2hhcnN8Zmlyc3RrZXl8ZmxhdHRlbnwiICsKICAgICAgICAiZmxvYXR8ZmxvYXQzMnxmbG9hdDY0fGZsb2F0X29mX2JpZ19pbnR8ZmxvYXRfb2ZfYml0c3xmbG9hdF9vZl9pbnR8IiArCiAgICAgICAgImZsb2F0X29mX251bXxmbG9hdF9vZl9zdHJpbmd8Zmxvb3J8Zmxvb3JfbnVtfGZsdXNofGZsdXNoX2FsbHxmbHVzaF9pbnB1dHwiICsKICAgICAgICAiZmx1c2hfc3RyX2Zvcm1hdHRlcnxmb2xkfGZvbGRfbGVmdHxmb2xkX2xlZnQyfGZvbGRfcmlnaHR8Zm9sZF9yaWdodDJ8IiArCiAgICAgICAgImZvcl9hbGx8Zm9yX2FsbDJ8Zm9yY2V8Zm9yY2VfbmV3bGluZXxmb3JjZV92YWx8Zm9yZWdyb3VuZHxmb3JrfCIgKwogICAgICAgICJmb3JtYXRfb2Zfc3RyaW5nfGZvcm1hdHRlcl9vZl9idWZmZXJ8Zm9ybWF0dGVyX29mX291dF9jaGFubmVsfCIgKwogICAgICAgICJmb3J0cmFuX2xheW91dHxmb3J3YXJkX3RhZ3xmcHJpbnRmfGZyZXhwfGZyb218ZnJvbV9jaGFubmVsfGZyb21fZmlsZXwiICsKICAgICAgICAiZnJvbV9maWxlX2Jpbnxmcm9tX2Z1bmN0aW9ufGZyb21fc3RyaW5nfGZzY2FuZnxmc3R8ZnN0YXR8ZnRydW5jYXRlfCIgKwogICAgICAgICJmdWxsX2luaXR8ZnVsbF9tYWpvcnxmdWxsX3NwbGl0fGdjZF9iaWdfaW50fGdlX2JpZ19pbnR8Z2VfbnVtfCIgKwogICAgICAgICJnZW5hcnJheV9vZl9hcnJheTF8Z2VuYXJyYXlfb2ZfYXJyYXkyfGdlbmFycmF5X29mX2FycmF5M3xnZXR8IiArCiAgICAgICAgImdldF9hbGxfZm9ybWF0dGVyX291dHB1dF9mdW5jdGlvbnN8Z2V0X2FwcHJveF9wcmludGluZ3xnZXRfY29weXwiICsKICAgICAgICAiZ2V0X2VsbGlwc2lzX3RleHR8Z2V0X2Vycm9yX3doZW5fbnVsbF9kZW5vbWluYXRvcnxnZXRfZmxvYXRpbmdfcHJlY2lzaW9ufCIgKwogICAgICAgICJnZXRfZm9ybWF0dGVyX291dHB1dF9mdW5jdGlvbnN8Z2V0X2Zvcm1hdHRlcl90YWdfZnVuY3Rpb25zfGdldF9pbWFnZXwiICsKICAgICAgICAiZ2V0X21hcmdpbnxnZXRfbWFya190YWdzfGdldF9tYXhfYm94ZXN8Z2V0X21heF9pbmRlbnR8Z2V0X21ldGhvZHwiICsKICAgICAgICAiZ2V0X21ldGhvZF9sYWJlbHxnZXRfbm9ybWFsaXplX3JhdGlvfGdldF9ub3JtYWxpemVfcmF0aW9fd2hlbl9wcmludGluZ3wiICsKICAgICAgICAiZ2V0X3ByaW50X3RhZ3N8Z2V0X3N0YXRlfGdldF92YXJpYWJsZXxnZXRjd2R8Z2V0ZWdpZHxnZXRlZ2lkfGdldGVudnwiICsKICAgICAgICAiZ2V0ZW52fGdldGVudnxnZXRldWlkfGdldGV1aWR8Z2V0Z2lkfGdldGdpZHxnZXRncmdpZHxnZXRncmdpZHxnZXRncm5hbXwiICsKICAgICAgICAiZ2V0Z3JuYW18Z2V0Z3JvdXBzfGdldGhvc3RieWFkZHJ8Z2V0aG9zdGJ5bmFtZXxnZXRob3N0bmFtZXxnZXRpdGltZXJ8IiArCiAgICAgICAgImdldGxvZ2lufGdldHBlZXJuYW1lfGdldHBpZHxnZXRwcGlkfGdldHByb3RvYnluYW1lfGdldHByb3RvYnludW1iZXJ8IiArCiAgICAgICAgImdldHB3bmFtfGdldHB3dWlkfGdldHNlcnZieW5hbWV8Z2V0c2VydmJ5cG9ydHxnZXRzb2NrbmFtZXxnZXRzb2Nrb3B0fCIgKwogICAgICAgICJnZXRzb2Nrb3B0X2Zsb2F0fGdldHNvY2tvcHRfaW50fGdldHNvY2tvcHRfb3B0aW50fGdldHRpbWVvZmRheXxnZXR1aWR8IiArCiAgICAgICAgImdsb2JhbF9yZXBsYWNlfGdsb2JhbF9zdWJzdGl0dXRlfGdtdGltZXxncmVlbnxncmlkfGdyb3VwX2JlZ2lubmluZ3wiICsKICAgICAgICAiZ3JvdXBfZW5kfGd0X2JpZ19pbnR8Z3RfbnVtfGd1YXJkfGhhbmRsZV91bml4X2Vycm9yfGhhc2h8aGFzaF9wYXJhbXwiICsKICAgICAgICAiaGR8aGVhZGVyX3NpemV8aXxpZHxpZ25vcmV8aW5fY2hhbm5lbF9sZW5ndGh8aW5fY2hhbm5lbF9vZl9kZXNjcnxpbmNyfCIgKwogICAgICAgICJpbmNyX251bXxpbmRleHxpbmRleF9mcm9tfGluZXRfYWRkcl9hbnl8aW5ldF9hZGRyX29mX3N0cmluZ3xpbmZpbml0eXwiICsKICAgICAgICAiaW5maXhfdGFnfGluaXR8aW5pdF9jbGFzc3xpbnB1dHxpbnB1dF9iaW5hcnlfaW50fGlucHV0X2J5dGV8aW5wdXRfY2hhcnwiICsKICAgICAgICAiaW5wdXRfbGluZXxpbnB1dF92YWx1ZXxpbnR8aW50MTZfc2lnbmVkfGludDE2X3Vuc2lnbmVkfGludDMyfGludDY0fCIgKwogICAgICAgICJpbnQ4X3NpZ25lZHxpbnQ4X3Vuc2lnbmVkfGludF9vZl9iaWdfaW50fGludF9vZl9jaGFyfGludF9vZl9mbG9hdHwiICsKICAgICAgICAiaW50X29mX251bXxpbnRfb2Zfc3RyaW5nfGludGVnZXJfbnVtfGludGVyfGludGVyYWN0aXZlfGludnxpbnZhbGlkX2FyZ3wiICsKICAgICAgICAiaXNfYmxvY2t8aXNfZW1wdHl8aXNfaW1wbGljaXR8aXNfaW50fGlzX2ludF9iaWdfaW50fGlzX2ludGVnZXJfbnVtfCIgKwogICAgICAgICJpc19yZWxhdGl2ZXxpdGVyfGl0ZXIyfGl0ZXJpfGpvaW58anVua3xrZXlfcHJlc3NlZHxraWxsfGtpbmR8a3ByaW50ZnwiICsKICAgICAgICAia3NjYW5mfGxhbmR8bGFzdF9jaGFyc3xsYXlvdXR8bGF6eV9mcm9tX2Z1bnxsYXp5X2Zyb21fdmFsfGxhenlfaXNfdmFsfCIgKwogICAgICAgICJsYXp5X3RhZ3xsZGV4cHxsZV9iaWdfaW50fGxlX251bXxsZW5ndGh8bGV4ZW1lfGxleGVtZV9jaGFyfGxleGVtZV9lbmR8IiArCiAgICAgICAgImxleGVtZV9lbmRfcHxsZXhlbWVfc3RhcnR8bGV4ZW1lX3N0YXJ0X3B8bGluZXRvfGxpbmt8bGlzdHxsaXN0ZW58bG5vdHwiICsKICAgICAgICAibG9hZGZpbGV8bG9hZGZpbGVfcHJpdmF0ZXxsb2NhbHRpbWV8bG9ja3xsb2NrZnxsb2d8bG9nMTB8bG9nYW5kfGxvZ25vdHwiICsKICAgICAgICAibG9nb3J8bG9neG9yfGxvcnxsb3dlcl93aW5kb3d8bG93ZXJjYXNlfGxzZWVrfGxzbHxsc3J8bHN0YXR8bHRfYmlnX2ludHwiICsKICAgICAgICAibHRfbnVtfGx4b3J8bWFnZW50YXxtYWdpY3xtYWluTG9vcHxtYWpvcnxtYWpvcl9zbGljZXxtYWtlfG1ha2VfZm9ybWF0dGVyfCIgKwogICAgICAgICJtYWtlX2ltYWdlfG1ha2VfbGV4ZXJ8bWFrZV9tYXRyaXh8bWFrZV9zZWxmX2luaXR8bWFwfG1hcDJ8bWFwX2ZpbGV8bWFwaXwiICsKICAgICAgICAibWFyc2hhbHxtYXRjaF9iZWdpbm5pbmd8bWF0Y2hfZW5kfG1hdGNoZWRfZ3JvdXB8bWF0Y2hlZF9zdHJpbmd8bWF4fCIgKwogICAgICAgICJtYXhfYXJyYXlfbGVuZ3RofG1heF9iaWdfaW50fG1heF9lbHR8bWF4X2Zsb2F0fG1heF9pbnR8bWF4X251bXwiICsKICAgICAgICAibWF4X3N0cmluZ19sZW5ndGh8bWVtfG1lbV9hc3NvY3xtZW1fYXNzcXxtZW1xfG1lcmdlfG1pbnxtaW5fYmlnX2ludHwiICsKICAgICAgICAibWluX2VsdHxtaW5fZmxvYXR8bWluX2ludHxtaW5fbnVtfG1pbm9yfG1pbnVzX2JpZ19pbnR8bWludXNfbnVtfCIgKwogICAgICAgICJtaW51c19vbmV8bWtkaXJ8bWtmaWZvfG1rdGltZXxtb2R8bW9kX2JpZ19pbnR8bW9kX2Zsb2F0fG1vZF9udW18bW9kZnwiICsKICAgICAgICAibW91c2VfcG9zfG1vdmV0b3xtdWx8bXVsdF9iaWdfaW50fG11bHRfaW50X2JpZ19pbnR8bXVsdF9udW18bmFufG5hcnJvd3wiICsKICAgICAgICAibmF0X29mX251bXxuYXRpdmVpbnR8bmVnfG5lZ19pbmZpbml0eXxuZXdfYmxvY2t8bmV3X2NoYW5uZWx8bmV3X21ldGhvZHwiICsKICAgICAgICAibmV3X3ZhcmlhYmxlfG5leHR8bmV4dGtleXxuaWNlfG5pY2V8bm9fc2Nhbl90YWd8bm9ybXxub3JtMnxub3R8bnBlZWt8IiArCiAgICAgICAgIm50aHxudGhfZGltfG51bV9kaWdpdHNfYmlnX2ludHxudW1fZGltc3xudW1fb2ZfYmlnX2ludHxudW1fb2ZfaW50fCIgKwogICAgICAgICJudW1fb2ZfbmF0fG51bV9vZl9yYXRpb3xudW1fb2Zfc3RyaW5nfE98b2JqfG9iamVjdF90YWd8b2NhbWxfdmVyc2lvbnwiICsKICAgICAgICAib2ZfYXJyYXl8b2ZfY2hhbm5lbHxvZl9mbG9hdHxvZl9pbnR8b2ZfaW50MzJ8b2ZfbGlzdHxvZl9uYXRpdmVpbnR8IiArCiAgICAgICAgIm9mX3N0cmluZ3xvbmV8b3BlblRrfG9wZW5fYm94fG9wZW5fY29ubmVjdGlvbnxvcGVuX2dyYXBofG9wZW5faGJveHwiICsKICAgICAgICAib3Blbl9ob3Zib3h8b3Blbl9odmJveHxvcGVuX2lufG9wZW5faW5fYmlufG9wZW5faW5fZ2VufG9wZW5fb3V0fCIgKwogICAgICAgICJvcGVuX291dF9iaW58b3Blbl9vdXRfZ2VufG9wZW5fcHJvY2Vzc3xvcGVuX3Byb2Nlc3NfZnVsbHxvcGVuX3Byb2Nlc3NfaW58IiArCiAgICAgICAgIm9wZW5fcHJvY2Vzc19vdXR8b3Blbl9zdWJ3aW5kb3d8b3Blbl90YWd8b3Blbl90Ym94fG9wZW5fdGVtcF9maWxlfCIgKwogICAgICAgICJvcGVuX3Zib3h8b3BlbmRibXxvcGVuZGlyfG9wZW5maWxlfG9yfG9zX3R5cGV8b3V0X2NoYW5uZWxfbGVuZ3RofCIgKwogICAgICAgICJvdXRfY2hhbm5lbF9vZl9kZXNjcnxvdXRwdXR8b3V0cHV0X2JpbmFyeV9pbnR8b3V0cHV0X2J1ZmZlcnxvdXRwdXRfYnl0ZXwiICsKICAgICAgICAib3V0cHV0X2NoYXJ8b3V0cHV0X3N0cmluZ3xvdXRwdXRfdmFsdWV8b3Zlcl9tYXhfYm94ZXN8cGFja3xwYXJhbXN8IiArCiAgICAgICAgInBhcmVudF9kaXJfbmFtZXxwYXJzZXxwYXJzZV9hcmd2fHBhcnRpdGlvbnxwYXVzZXxwZWVrfHBpcGV8cGl4ZWxzfCIgKwogICAgICAgICJwbGFjZXxwbG90fHBsb3RzfHBvaW50X2NvbG9yfHBvbGFyfHBvbGx8cG9wfHBvc19pbnxwb3Nfb3V0fHBvd3wiICsKICAgICAgICAicG93ZXJfYmlnX2ludF9wb3NpdGl2ZV9iaWdfaW50fHBvd2VyX2JpZ19pbnRfcG9zaXRpdmVfaW50fCIgKwogICAgICAgICJwb3dlcl9pbnRfcG9zaXRpdmVfYmlnX2ludHxwb3dlcl9pbnRfcG9zaXRpdmVfaW50fHBvd2VyX251bXwiICsKICAgICAgICAicHBfY2xvc2VfYm94fHBwX2Nsb3NlX3RhZ3xwcF9jbG9zZV90Ym94fHBwX2ZvcmNlX25ld2xpbmV8IiArCiAgICAgICAgInBwX2dldF9hbGxfZm9ybWF0dGVyX291dHB1dF9mdW5jdGlvbnN8cHBfZ2V0X2VsbGlwc2lzX3RleHR8IiArCiAgICAgICAgInBwX2dldF9mb3JtYXR0ZXJfb3V0cHV0X2Z1bmN0aW9uc3xwcF9nZXRfZm9ybWF0dGVyX3RhZ19mdW5jdGlvbnN8IiArCiAgICAgICAgInBwX2dldF9tYXJnaW58cHBfZ2V0X21hcmtfdGFnc3xwcF9nZXRfbWF4X2JveGVzfHBwX2dldF9tYXhfaW5kZW50fCIgKwogICAgICAgICJwcF9nZXRfcHJpbnRfdGFnc3xwcF9vcGVuX2JveHxwcF9vcGVuX2hib3h8cHBfb3Blbl9ob3Zib3h8cHBfb3Blbl9odmJveHwiICsKICAgICAgICAicHBfb3Blbl90YWd8cHBfb3Blbl90Ym94fHBwX29wZW5fdmJveHxwcF9vdmVyX21heF9ib3hlc3xwcF9wcmludF9hc3wiICsKICAgICAgICAicHBfcHJpbnRfYm9vbHxwcF9wcmludF9icmVha3xwcF9wcmludF9jaGFyfHBwX3ByaW50X2N1dHxwcF9wcmludF9mbG9hdHwiICsKICAgICAgICAicHBfcHJpbnRfZmx1c2h8cHBfcHJpbnRfaWZfbmV3bGluZXxwcF9wcmludF9pbnR8cHBfcHJpbnRfbmV3bGluZXwiICsKICAgICAgICAicHBfcHJpbnRfc3BhY2V8cHBfcHJpbnRfc3RyaW5nfHBwX3ByaW50X3RhYnxwcF9wcmludF90YnJlYWt8IiArCiAgICAgICAgInBwX3NldF9hbGxfZm9ybWF0dGVyX291dHB1dF9mdW5jdGlvbnN8cHBfc2V0X2VsbGlwc2lzX3RleHR8IiArCiAgICAgICAgInBwX3NldF9mb3JtYXR0ZXJfb3V0X2NoYW5uZWx8cHBfc2V0X2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zfCIgKwogICAgICAgICJwcF9zZXRfZm9ybWF0dGVyX3RhZ19mdW5jdGlvbnN8cHBfc2V0X21hcmdpbnxwcF9zZXRfbWFya190YWdzfCIgKwogICAgICAgICJwcF9zZXRfbWF4X2JveGVzfHBwX3NldF9tYXhfaW5kZW50fHBwX3NldF9wcmludF90YWdzfHBwX3NldF90YWJ8IiArCiAgICAgICAgInBwX3NldF90YWdzfHByZWR8cHJlZF9iaWdfaW50fHByZWRfbnVtfHByZXJyX2NoYXJ8cHJlcnJfZW5kbGluZXwiICsKICAgICAgICAicHJlcnJfZmxvYXR8cHJlcnJfaW50fHByZXJyX25ld2xpbmV8cHJlcnJfc3RyaW5nfHByaW50fHByaW50X2FzfCIgKwogICAgICAgICJwcmludF9ib29sfHByaW50X2JyZWFrfHByaW50X2NoYXJ8cHJpbnRfY3V0fHByaW50X2VuZGxpbmV8cHJpbnRfZmxvYXR8IiArCiAgICAgICAgInByaW50X2ZsdXNofHByaW50X2lmX25ld2xpbmV8cHJpbnRfaW50fHByaW50X25ld2xpbmV8cHJpbnRfc3BhY2V8IiArCiAgICAgICAgInByaW50X3N0YXR8cHJpbnRfc3RyaW5nfHByaW50X3RhYnxwcmludF90YnJlYWt8cHJpbnRmfHByb2hpYml0fCIgKwogICAgICAgICJwdWJsaWNfbWV0aG9kX2xhYmVsfHB1c2h8cHV0ZW52fHF1b19udW18cXVvbW9kX2JpZ19pbnR8cXVvdGV8cmFpc2V8IiArCiAgICAgICAgInJhaXNlX3dpbmRvd3xyYXRpb19vZl9udW18cmNvbnRhaW5zX2Zyb218cmVhZHxyZWFkX2Zsb2F0fHJlYWRfaW50fCIgKwogICAgICAgICJyZWFkX2tleXxyZWFkX2xpbmV8cmVhZGRpcnxyZWFkZGlyfHJlYWRsaW5rfHJlYWxseV9pbnB1dHxyZWNlaXZlfHJlY3Z8IiArCiAgICAgICAgInJlY3Zmcm9tfHJlZHxyZWZ8cmVnZXhwfHJlZ2V4cF9jYXNlX2ZvbGR8cmVnZXhwX3N0cmluZ3wiICsKICAgICAgICAicmVnZXhwX3N0cmluZ19jYXNlX2ZvbGR8cmVnaXN0ZXJ8cmVnaXN0ZXJfZXhjZXB0aW9ufHJlbXxyZW1lbWJlcl9tb2RlfCIgKwogICAgICAgICJyZW1vdmV8cmVtb3ZlX2Fzc29jfHJlbW92ZV9hc3NxfHJlbmFtZXxyZXBsYWNlfHJlcGxhY2VfZmlyc3R8IiArCiAgICAgICAgInJlcGxhY2VfbWF0Y2hlZHxyZXByfHJlc2V0fHJlc2hhcGV8cmVzaGFwZV8xfHJlc2hhcGVfMnxyZXNoYXBlXzN8cmV2fCIgKwogICAgICAgICJyZXZfYXBwZW5kfHJldl9tYXB8cmV2X21hcDJ8cmV3aW5kZGlyfHJnYnxyaHNfZW5kfHJoc19lbmRfcG9zfHJoc19zdGFydHwiICsKICAgICAgICAicmhzX3N0YXJ0X3Bvc3xyaW5kZXh8cmluZGV4X2Zyb218cmxpbmV0b3xybWRpcnxybW92ZXRvfHJvdW5kX251bXwiICsKICAgICAgICAicnVuX2luaXRpYWxpemVyc3xydW5faW5pdGlhbGl6ZXJzX29wdHxzY2FuZnxzZWFyY2hfYmFja3dhcmR8IiArCiAgICAgICAgInNlYXJjaF9mb3J3YXJkfHNlZWtfaW58c2Vla19vdXR8c2VsZWN0fHNlbGZ8c2VsZl9pbml0fHNlbmR8c2VuZHRvfHNldHwiICsKICAgICAgICAic2V0X2FsbF9mb3JtYXR0ZXJfb3V0cHV0X2Z1bmN0aW9uc3xzZXRfYXBwcm94X3ByaW50aW5nfCIgKwogICAgICAgICJzZXRfYmluYXJ5X21vZGVfaW58c2V0X2JpbmFyeV9tb2RlX291dHxzZXRfY2xvc2Vfb25fZXhlY3wiICsKICAgICAgICAic2V0X2Nsb3NlX29uX2V4ZWN8c2V0X2NvbG9yfHNldF9lbGxpcHNpc190ZXh0fCIgKwogICAgICAgICJzZXRfZXJyb3Jfd2hlbl9udWxsX2Rlbm9taW5hdG9yfHNldF9maWVsZHxzZXRfZmxvYXRpbmdfcHJlY2lzaW9ufCIgKwogICAgICAgICJzZXRfZm9udHxzZXRfZm9ybWF0dGVyX291dF9jaGFubmVsfHNldF9mb3JtYXR0ZXJfb3V0cHV0X2Z1bmN0aW9uc3wiICsKICAgICAgICAic2V0X2Zvcm1hdHRlcl90YWdfZnVuY3Rpb25zfHNldF9saW5lX3dpZHRofHNldF9tYXJnaW58c2V0X21hcmtfdGFnc3wiICsKICAgICAgICAic2V0X21heF9ib3hlc3xzZXRfbWF4X2luZGVudHxzZXRfbWV0aG9kfHNldF9ub25ibG9ja3xzZXRfbm9uYmxvY2t8IiArCiAgICAgICAgInNldF9ub3JtYWxpemVfcmF0aW98c2V0X25vcm1hbGl6ZV9yYXRpb193aGVuX3ByaW50aW5nfHNldF9wcmludF90YWdzfCIgKwogICAgICAgICJzZXRfc2lnbmFsfHNldF9zdGF0ZXxzZXRfdGFifHNldF90YWd8c2V0X3RhZ3N8c2V0X3RleHRfc2l6ZXwiICsKICAgICAgICAic2V0X3dpbmRvd190aXRsZXxzZXRnaWR8c2V0Z2lkfHNldGl0aW1lcnxzZXRpdGltZXJ8c2V0c2lkfHNldHNpZHwiICsKICAgICAgICAic2V0c29ja29wdHxzZXRzb2Nrb3B0fHNldHNvY2tvcHRfZmxvYXR8c2V0c29ja29wdF9mbG9hdHxzZXRzb2Nrb3B0X2ludHwiICsKICAgICAgICAic2V0c29ja29wdF9pbnR8c2V0c29ja29wdF9vcHRpbnR8c2V0c29ja29wdF9vcHRpbnR8c2V0dWlkfHNldHVpZHwiICsKICAgICAgICAic2hpZnRfbGVmdHxzaGlmdF9sZWZ0fHNoaWZ0X2xlZnR8c2hpZnRfcmlnaHR8c2hpZnRfcmlnaHR8c2hpZnRfcmlnaHR8IiArCiAgICAgICAgInNoaWZ0X3JpZ2h0X2xvZ2ljYWx8c2hpZnRfcmlnaHRfbG9naWNhbHxzaGlmdF9yaWdodF9sb2dpY2FsfHNob3dfYnVja2V0c3wiICsKICAgICAgICAic2h1dGRvd258c2h1dGRvd258c2h1dGRvd25fY29ubmVjdGlvbnxzaHV0ZG93bl9jb25uZWN0aW9ufHNpZ2FicnR8IiArCiAgICAgICAgInNpZ2Fscm18c2lnY2hsZHxzaWdjb250fHNpZ2ZwZXxzaWdodXB8c2lnaWxsfHNpZ2ludHxzaWdraWxsfHNpZ25fYmlnX2ludHwiICsKICAgICAgICAic2lnbl9udW18c2lnbmFsfHNpZ25hbHxzaWdwZW5kaW5nfHNpZ3BlbmRpbmd8c2lncGlwZXxzaWdwcm9jbWFza3wiICsKICAgICAgICAic2lncHJvY21hc2t8c2lncHJvZnxzaWdxdWl0fHNpZ3NlZ3Z8c2lnc3RvcHxzaWdzdXNwZW5kfHNpZ3N1c3BlbmR8IiArCiAgICAgICAgInNpZ3Rlcm18c2lndHN0cHxzaWd0dGlufHNpZ3R0b3V8c2lndXNyMXxzaWd1c3IyfHNpZ3Z0YWxybXxzaW58c2luZ2xldG9ufCIgKwogICAgICAgICJzaW5ofHNpemV8c2l6ZXxzaXplX3h8c2l6ZV95fHNsZWVwfHNsZWVwfHNsZWVwfHNsaWNlX2xlZnR8c2xpY2VfbGVmdHwiICsKICAgICAgICAic2xpY2VfbGVmdF8xfHNsaWNlX2xlZnRfMnxzbGljZV9yaWdodHxzbGljZV9yaWdodHxzbGljZV9yaWdodF8xfCIgKwogICAgICAgICJzbGljZV9yaWdodF8yfHNuZHxzb2NrZXR8c29ja2V0fHNvY2tldHxzb2NrZXRwYWlyfHNvY2tldHBhaXJ8c29ydHxzb3VuZHwiICsKICAgICAgICAic3BsaXR8c3BsaXRfZGVsaW18c3ByaW50ZnxzcHJpbnRmfHNxcnR8c3FydHxzcXJ0X2JpZ19pbnR8c3F1YXJlX2JpZ19pbnR8IiArCiAgICAgICAgInNxdWFyZV9udW18c3NjYW5mfHN0YWJsZV9zb3J0fHN0YWJsZV9zb3J0fHN0YWJsZV9zb3J0fHN0YWJsZV9zb3J0fHN0YWJsZV9zb3J0fCIgKwogICAgICAgICJzdGFibGVfc29ydHxzdGF0fHN0YXR8c3RhdHxzdGF0fHN0YXR8c3RhdHN8c3RhdHN8c3RkX2Zvcm1hdHRlcnxzdGRidWZ8IiArCiAgICAgICAgInN0ZGVycnxzdGRlcnJ8c3RkZXJyfHN0ZGlifHN0ZGlufHN0ZGlufHN0ZGlufHN0ZG91dHxzdGRvdXR8c3Rkb3V0fCIgKwogICAgICAgICJzdHJfZm9ybWF0dGVyfHN0cmluZ3xzdHJpbmdfYWZ0ZXJ8c3RyaW5nX2JlZm9yZXxzdHJpbmdfbWF0Y2h8IiArCiAgICAgICAgInN0cmluZ19vZl9iaWdfaW50fHN0cmluZ19vZl9ib29sfHN0cmluZ19vZl9mbG9hdHxzdHJpbmdfb2ZfZm9ybWF0fCIgKwogICAgICAgICJzdHJpbmdfb2ZfaW5ldF9hZGRyfHN0cmluZ19vZl9pbmV0X2FkZHJ8c3RyaW5nX29mX2ludHxzdHJpbmdfb2ZfbnVtfCIgKwogICAgICAgICJzdHJpbmdfcGFydGlhbF9tYXRjaHxzdHJpbmdfdGFnfHN1YnxzdWJ8c3ViX2JpZ19pbnR8c3ViX2xlZnR8c3ViX251bXwiICsKICAgICAgICAic3ViX3JpZ2h0fHN1YnNldHxzdWJzZXR8c3Vic3RpdHV0ZV9maXJzdHxzdWJzdHJpbmd8c3VjY3xzdWNjfCIgKwogICAgICAgICJzdWNjfHN1Y2N8c3VjY19iaWdfaW50fHN1Y2NfbnVtfHN5bWJvbF9lbmR8c3ltYm9sX2VuZF9wb3N8c3ltYm9sX3N0YXJ0fCIgKwogICAgICAgICJzeW1ib2xfc3RhcnRfcG9zfHN5bWxpbmt8c3ltbGlua3xzeW5jfHN5bmNocm9uaXplfHN5c3RlbXxzeXN0ZW18c3lzdGVtfCIgKwogICAgICAgICJ0YWd8dGFrZXx0YW58dGFuaHx0Y2RyYWlufHRjZHJhaW58dGNmbG93fHRjZmxvd3x0Y2ZsdXNofHRjZmx1c2h8IiArCiAgICAgICAgInRjZ2V0YXR0cnx0Y2dldGF0dHJ8dGNzZW5kYnJlYWt8dGNzZW5kYnJlYWt8dGNzZXRhdHRyfHRjc2V0YXR0cnwiICsKICAgICAgICAidGVtcF9maWxlfHRleHRfc2l6ZXx0aW1lfHRpbWV8dGltZXx0aW1lZF9yZWFkfHRpbWVkX3dyaXRlfHRpbWVzfHRpbWVzfCIgKwogICAgICAgICJ0bHx0bHx0bHx0b19idWZmZXJ8dG9fY2hhbm5lbHx0b19mbG9hdHx0b19oZXh8dG9faW50fHRvX2ludDMyfHRvX2xpc3R8IiArCiAgICAgICAgInRvX2xpc3R8dG9fbGlzdHx0b19uYXRpdmVpbnR8dG9fc3RyaW5nfHRvX3N0cmluZ3x0b19zdHJpbmd8dG9fc3RyaW5nfCIgKwogICAgICAgICJ0b19zdHJpbmd8dG9wfHRvcHx0b3RhbF9zaXplfHRyYW5zZmVyfHRyYW5zcHx0cnVuY2F0ZXx0cnVuY2F0ZXx0cnVuY2F0ZXwiICsKICAgICAgICAidHJ1bmNhdGV8dHJ1bmNhdGV8dHJ1bmNhdGV8dHJ5X2xvY2t8dW1hc2t8dW1hc2t8dW5jYXBpdGFsaXplfHVuY2FwaXRhbGl6ZXwiICsKICAgICAgICAidW5jYXBpdGFsaXplfHVuaW9ufHVuaW9ufHVuaXRfYmlnX2ludHx1bmxpbmt8dW5saW5rfHVubG9ja3x1bm1hcnNoYWx8IiArCiAgICAgICAgInVuc2FmZV9ibGl0fHVuc2FmZV9maWxsfHVuc2FmZV9nZXR8dW5zYWZlX2dldHx1bnNhZmVfc2V0fHVuc2FmZV9zZXR8IiArCiAgICAgICAgInVwZGF0ZXx1cHBlcmNhc2V8dXBwZXJjYXNlfHVwcGVyY2FzZXx1cHBlcmNhc2V8dXNhZ2V8dXRpbWVzfHV0aW1lc3x3YWl0fCIgKwogICAgICAgICJ3YWl0fHdhaXR8d2FpdHx3YWl0X25leHRfZXZlbnR8d2FpdF9waWR8d2FpdF9yZWFkfHdhaXRfc2lnbmFsfCIgKwogICAgICAgICJ3YWl0X3RpbWVkX3JlYWR8d2FpdF90aW1lZF93cml0ZXx3YWl0X3dyaXRlfHdhaXRwaWR8d2hpdGV8IiArCiAgICAgICAgIndpZGVufHdpbmRvd19pZHx3b3JkX3NpemV8d3JhcHx3cmFwX2Fib3J0fHdyaXRlfHllbGxvd3x5aWVsZHx6ZXJvfHplcm9fYmlnX2ludHwiICsKCiAgICAgICAgIkFyZ3xBcml0aF9zdGF0dXN8QXJyYXl8QXJyYXkxfEFycmF5MnxBcnJheTN8QXJyYXlMYWJlbHN8QmlnX2ludHxCaWdhcnJheXwiICsKICAgICAgICAiQnVmZmVyfENhbGxiYWNrfENhbWxpbnRlcm5hbE9PfENoYXJ8Q29tcGxleHxDb25kaXRpb258RGJtfERpZ2VzdHxEeW5saW5rfCIgKwogICAgICAgICJFdmVudHxGaWxlbmFtZXxGb3JtYXR8R2N8R2VuYXJyYXl8R2VubGV4fEdyYXBoaWNzfEdyYXBoaWNzWDExfEhhc2h0Ymx8IiArCiAgICAgICAgIkludDMyfEludDY0fExhcmdlRmlsZXxMYXp5fExleGluZ3xMaXN0fExpc3RMYWJlbHN8TWFrZXxNYXB8TWFyc2hhbHwiICsKICAgICAgICAiTW9yZUxhYmVsc3xNdXRleHxOYXRpdmVpbnR8TnVtfE9ianxPb3xQYXJzaW5nfFBlcnZhc2l2ZXN8UHJpbnRleGN8IiArCiAgICAgICAgIlByaW50ZnxRdWV1ZXxSYW5kb218U2NhbmZ8U2Nhbm5pbmd8U2V0fFNvcnR8U3RhY2t8U3RhdGV8U3RkTGFiZWxzfFN0cnwiICsKICAgICAgICAiU3RyZWFtfFN0cmluZ3xTdHJpbmdMYWJlbHN8U3lzfFRocmVhZHxUaHJlYWRVbml4fFRrfFVuaXh8VW5peExhYmVsc3xXZWFrIgogICAgKS5zcGxpdCgifCIpKTsKCiAgICB2YXIgZGVjaW1hbEludGVnZXIgPSAiKD86KD86WzEtOV1cXGQqKXwoPzowKSkiOwogICAgdmFyIG9jdEludGVnZXIgPSAiKD86MFtvT10/WzAtN10rKSI7CiAgICB2YXIgaGV4SW50ZWdlciA9ICIoPzowW3hYXVtcXGRBLUZhLWZdKykiOwogICAgdmFyIGJpbkludGVnZXIgPSAiKD86MFtiQl1bMDFdKykiOwogICAgdmFyIGludGVnZXIgPSAiKD86IiArIGRlY2ltYWxJbnRlZ2VyICsgInwiICsgb2N0SW50ZWdlciArICJ8IiArIGhleEludGVnZXIgKyAifCIgKyBiaW5JbnRlZ2VyICsgIikiOwoKICAgIHZhciBleHBvbmVudCA9ICIoPzpbZUVdWystXT9cXGQrKSI7CiAgICB2YXIgZnJhY3Rpb24gPSAiKD86XFwuXFxkKykiOwogICAgdmFyIGludFBhcnQgPSAiKD86XFxkKykiOwogICAgdmFyIHBvaW50RmxvYXQgPSAiKD86KD86IiArIGludFBhcnQgKyAiPyIgKyBmcmFjdGlvbiArICIpfCg/OiIgKyBpbnRQYXJ0ICsgIlxcLikpIjsKICAgIHZhciBleHBvbmVudEZsb2F0ID0gIig/Oig/OiIgKyBwb2ludEZsb2F0ICsgInwiICsgIGludFBhcnQgKyAiKSIgKyBleHBvbmVudCArICIpIjsKICAgIHZhciBmbG9hdE51bWJlciA9ICIoPzoiICsgZXhwb25lbnRGbG9hdCArICJ8IiArIHBvaW50RmxvYXQgKyAiKSI7CgogICAgdGhpcy4kcnVsZXMgPSB7CiAgICAgICAgInN0YXJ0IiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICdcXChcXCouKj9cXCpcXClcXHMqPyQnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLAogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAnXFwoXFwqLionLAogICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50IgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXScKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGNoYXIKICAgICAgICAgICAgICAgIHJlZ2V4IDogIicuJyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gIiBzdHJpbmcKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogJyInLAogICAgICAgICAgICAgICAgbmV4dCAgOiAicXN0cmluZyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGltYWdpbmFyeQogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86IiArIGZsb2F0TnVtYmVyICsgInxcXGQrKVtqSl1cXGIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdAogICAgICAgICAgICAgICAgcmVnZXggOiBmbG9hdE51bWJlcgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaW50ZWdlcgogICAgICAgICAgICAgICAgcmVnZXggOiBpbnRlZ2VyICsgIlxcYiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYnVpbHRpbkNvbnN0YW50cy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWx0aW5GdW5jdGlvbnMuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuZnVuY3Rpb24iOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpZGVudGlmaWVyIjsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICByZWdleCA6ICJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwrXFwufFxcLVxcLnxcXCpcXC58XFwvXFwufCN8Ozt8XFwrfFxcLXxcXCp8XFwqXFwqXFwvfFxcL1xcL3wlfDw8fD4+fCZ8XFx8fFxcXnx+fDx8Pnw8PXw9Pnw9PXwhPXw8Pnw8LXw9IgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5scGFyZW4iLAogICAgICAgICAgICAgICAgcmVnZXggOiAiW1soe10iCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJjb21tZW50IiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudAogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwpIiwKICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIgogICAgICAgICAgICB9CiAgICAgICAgXSwKCiAgICAgICAgInFzdHJpbmciIDogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgcmVnZXggOiAnIicsCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAnLisnCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9Owp9OwoKb29wLmluaGVyaXRzKE9jYW1sSGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7CgpleHBvcnRzLk9jYW1sSGlnaGxpZ2h0UnVsZXMgPSBPY2FtbEhpZ2hsaWdodFJ1bGVzOwp9KTsKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7Cgp2YXIgTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBmdW5jdGlvbigpIHt9OwoKKGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24obGluZSwgaW5wdXQpIHsKICAgICAgICBpZiAoISAvXlxzKyQvLnRlc3QobGluZSkpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgICAgcmV0dXJuIC9eXHMqXH0vLnRlc3QoaW5wdXQpOwogICAgfTsKCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oZG9jLCByb3cpIHsKICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKHJvdyk7CiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccypcfSkvKTsKCiAgICAgICAgaWYgKCFtYXRjaCkgcmV0dXJuIDA7CgogICAgICAgIHZhciBjb2x1bW4gPSBtYXRjaFsxXS5sZW5ndGg7CiAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IGRvYy5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW59KTsKCiAgICAgICAgaWYgKCFvcGVuQnJhY2VQb3MgfHwgb3BlbkJyYWNlUG9zLnJvdyA9PSByb3cpIHJldHVybiAwOwoKICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGRvYy5nZXRMaW5lKG9wZW5CcmFjZVBvcy5yb3cpKTsKICAgICAgICBkb2MucmVwbGFjZShuZXcgUmFuZ2Uocm93LCAwLCByb3csIGNvbHVtbi0xKSwgaW5kZW50KTsKICAgIH07CgogICAgdGhpcy4kZ2V0SW5kZW50ID0gZnVuY3Rpb24obGluZSkgewogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMrKS8pOwogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gIiI7CiAgICB9OwoKfSkuY2FsbChNYXRjaGluZ0JyYWNlT3V0ZGVudC5wcm90b3R5cGUpOwoKZXhwb3J0cy5NYXRjaGluZ0JyYWNlT3V0ZGVudCA9IE1hdGNoaW5nQnJhY2VPdXRkZW50Owp9KTsKOwogICAgICAgICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgewogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KSgpOwogICAgICAgIA==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-ocaml.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9vY2FtbCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dCIsImFjZS90b2tlbml6ZXIiLCJhY2UvbW9kZS9vY2FtbF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50IiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3RleHQiKS5Nb2RlLGY9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGc9YSgiLi9vY2FtbF9oaWdobGlnaHRfcnVsZXMiKS5PY2FtbEhpZ2hsaWdodFJ1bGVzLGg9YSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQsaT1hKCIuLi9yYW5nZSIpLlJhbmdlLGo9ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbml6ZXI9bmV3IGYoKG5ldyBnKS5nZXRSdWxlcygpKSx0aGlzLiRvdXRkZW50PW5ldyBofTtkLmluaGVyaXRzKGosZSk7dmFyIGs9Lyg/Olsoe1s9Ol18Wy09XT58XGIoPzplbHNlfHRyeXx3aXRoKSlccyokLzsoKGZ1bmN0aW9uKCl7dGhpcy50b2dnbGVDb21tZW50TGluZXM9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnPSEwLGg9L15ccypcKFwqKC4qKVwqXCkvO2ZvcihlPWM7ZTw9ZDtlKyspaWYoIWgudGVzdChiLmdldExpbmUoZSkpKXtnPSExO2JyZWFrfXZhciBqPW5ldyBpKDAsMCwwLDApO2ZvcihlPWM7ZTw9ZDtlKyspZj1iLmdldExpbmUoZSksai5zdGFydC5yb3c9ZSxqLmVuZC5yb3c9ZSxqLmVuZC5jb2x1bW49Zi5sZW5ndGgsYi5yZXBsYWNlKGosZz9mLm1hdGNoKGgpWzFdOiIoKiIrZisiKikiKX0sdGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy4kZ2V0SW5kZW50KGIpLGU9dGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMoYixhKS50b2tlbnM7cmV0dXJuKCFlLmxlbmd0aHx8ZVtlLmxlbmd0aC0xXS50eXBlIT09ImNvbW1lbnQiKSYmYT09PSJzdGFydCImJmsudGVzdChiKSYmKGQrPWMpLGR9LHRoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQoYixjKX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7dGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChiLGMpfX0pKS5jYWxsKGoucHJvdG90eXBlKSxiLk1vZGU9an0pLGRlZmluZSgiYWNlL21vZGUvb2NhbWxfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi4vbGliL2xhbmciKSxmPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsZz1mdW5jdGlvbigpe3ZhciBhPWUuYXJyYXlUb01hcCgiYW5kfGFzfGFzc2VydHxiZWdpbnxjbGFzc3xjb25zdHJhaW50fGRvfGRvbmV8ZG93bnRvfGVsc2V8ZW5kfGV4Y2VwdGlvbnxleHRlcm5hbHxmb3J8ZnVufGZ1bmN0aW9ufGZ1bmN0b3J8aWZ8aW58aW5jbHVkZXxpbmhlcml0fGluaXRpYWxpemVyfGxhenl8bGV0fG1hdGNofG1ldGhvZHxtb2R1bGV8bXV0YWJsZXxuZXd8b2JqZWN0fG9mfG9wZW58b3J8cHJpdmF0ZXxyZWN8c2lnfHN0cnVjdHx0aGVufHRvfHRyeXx0eXBlfHZhbHx2aXJ0dWFsfHdoZW58d2hpbGV8d2l0aCIuc3BsaXQoInwiKSksYj1lLmFycmF5VG9NYXAoInRydWV8ZmFsc2UiLnNwbGl0KCJ8IikpLGM9ZS5hcnJheVRvTWFwKCJhYnN8YWJzX2JpZ19pbnR8YWJzX2Zsb2F0fGFic19udW18YWJzdHJhY3RfdGFnfGFjY2VwdHxhY2Nlc3N8YWNvc3xhZGR8YWRkX2F2YWlsYWJsZV91bml0c3xhZGRfYmlnX2ludHxhZGRfYnVmZmVyfGFkZF9jaGFubmVsfGFkZF9jaGFyfGFkZF9pbml0aWFsaXplcnxhZGRfaW50X2JpZ19pbnR8YWRkX2ludGVyZmFjZXN8YWRkX251bXxhZGRfc3RyaW5nfGFkZF9zdWJzdGl0dXRlfGFkZF9zdWJzdHJpbmd8YWxhcm18YWxsb2NhdGVkX2J5dGVzfGFsbG93X29ubHl8YWxsb3dfdW5zYWZlX21vZHVsZXN8YWx3YXlzfGFwcGVuZHxhcHBuYW1lX2dldHxhcHBuYW1lX3NldHxhcHByb3hfbnVtX2V4cHxhcHByb3hfbnVtX2ZpeHxhcmd8YXJndnxhcml0aF9zdGF0dXN8YXJyYXl8YXJyYXkxX29mX2dlbmFycmF5fGFycmF5Ml9vZl9nZW5hcnJheXxhcnJheTNfb2ZfZ2VuYXJyYXl8YXNpbnxhc3J8YXNzb2N8YXNzcXxhdF9leGl0fGF0YW58YXRhbjJ8YXV0b19zeW5jaHJvbml6ZXxiYWNrZ3JvdW5kfGJhc2VuYW1lfGJlZ2lubmluZ19vZl9pbnB1dHxiaWdfaW50X29mX2ludHxiaWdfaW50X29mX251bXxiaWdfaW50X29mX3N0cmluZ3xiaW5kfGJpbmRfY2xhc3N8YmluZF90YWd8Yml0c3xiaXRzX29mX2Zsb2F0fGJsYWNrfGJsaXR8YmxpdF9pbWFnZXxibHVlfGJvb2x8Ym9vbF9vZl9zdHJpbmd8Ym91bmRlZF9mdWxsX3NwbGl0fGJvdW5kZWRfc3BsaXR8Ym91bmRlZF9zcGxpdF9kZWxpbXxicHJpbnRmfGJyZWFrfGJyb2FkY2FzdHxic2NhbmZ8YnV0dG9uX2Rvd258Y19sYXlvdXR8Y2FwaXRhbGl6ZXxjYXJkaW5hbHxjYXJkaW5hbHxjYXRjaHxjYXRjaF9icmVha3xjZWlsfGNlaWxpbmdfbnVtfGNoYW5uZWx8Y2hhcnxjaGFyX29mX2ludHxjaGRpcnxjaGVja3xjaGVja19zdWZmaXh8Y2htb2R8Y2hvb3NlfGNob3BfZXh0ZW5zaW9ufGNob3Bfc3VmZml4fGNob3dufGNob3dufGNocnxjaHJvb3R8Y2xhc3NpZnlfZmxvYXR8Y2xlYXJ8Y2xlYXJfYXZhaWxhYmxlX3VuaXRzfGNsZWFyX2Nsb3NlX29uX2V4ZWN8Y2xlYXJfZ3JhcGh8Y2xlYXJfbm9uYmxvY2t8Y2xlYXJfcGFyc2VyfGNsb3NlfGNsb3NlfGNsb3NlVGt8Y2xvc2VfYm94fGNsb3NlX2dyYXBofGNsb3NlX2lufGNsb3NlX2luX25vZXJyfGNsb3NlX291dHxjbG9zZV9vdXRfbm9lcnJ8Y2xvc2VfcHJvY2Vzc3xjbG9zZV9wcm9jZXNzfGNsb3NlX3Byb2Nlc3NfZnVsbHxjbG9zZV9wcm9jZXNzX2lufGNsb3NlX3Byb2Nlc3Nfb3V0fGNsb3NlX3N1YndpbmRvd3xjbG9zZV90YWd8Y2xvc2VfdGJveHxjbG9zZWRpcnxjbG9zZWRpcnxjbG9zdXJlX3RhZ3xjb2RlfGNvbWJpbmV8Y29tYmluZXxjb21iaW5lfGNvbW1hbmR8Y29tcGFjdHxjb21wYXJlfGNvbXBhcmVfYmlnX2ludHxjb21wYXJlX251bXxjb21wbGV4MzJ8Y29tcGxleDY0fGNvbmNhdHxjb25qfGNvbm5lY3R8Y29udGFpbnN8Y29udGFpbnNfZnJvbXxjb250ZW50c3xjb3B5fGNvc3xjb3NofGNvdW50fGNvdW50fGNvdW50ZXJzfGNyZWF0ZXxjcmVhdGVfYWxhcm18Y3JlYXRlX2ltYWdlfGNyZWF0ZV9tYXRyaXh8Y3JlYXRlX21hdHJpeHxjcmVhdGVfbWF0cml4fGNyZWF0ZV9vYmplY3R8Y3JlYXRlX29iamVjdF9hbmRfcnVuX2luaXRpYWxpemVyc3xjcmVhdGVfb2JqZWN0X29wdHxjcmVhdGVfcHJvY2Vzc3xjcmVhdGVfcHJvY2Vzc3xjcmVhdGVfcHJvY2Vzc19lbnZ8Y3JlYXRlX3Byb2Nlc3NfZW52fGNyZWF0ZV90YWJsZXxjdXJyZW50fGN1cnJlbnRfZGlyX25hbWV8Y3VycmVudF9wb2ludHxjdXJyZW50X3h8Y3VycmVudF95fGN1cnZldG98Y3VzdG9tX3RhZ3xjeWFufGRhdGFfc2l6ZXxkZWNyfGRlY3JfbnVtfGRlZmF1bHRfYXZhaWxhYmxlX3VuaXRzfGRlbGF5fGRlbGV0ZV9hbGFybXxkZXNjcl9vZl9pbl9jaGFubmVsfGRlc2NyX29mX291dF9jaGFubmVsfGRlc3Ryb3l8ZGlmZnxkaW18ZGltMXxkaW0yfGRpbTN8ZGltc3xkaXJuYW1lfGRpc3BsYXlfbW9kZXxkaXZ8ZGl2X2JpZ19pbnR8ZGl2X251bXxkb3VibGVfYXJyYXlfdGFnfGRvdWJsZV90YWd8ZHJhd19hcmN8ZHJhd19jaGFyfGRyYXdfY2lyY2xlfGRyYXdfZWxsaXBzZXxkcmF3X2ltYWdlfGRyYXdfcG9seXxkcmF3X3BvbHlfbGluZXxkcmF3X3JlY3R8ZHJhd19zZWdtZW50c3xkcmF3X3N0cmluZ3xkdW1teV9wb3N8ZHVtbXlfdGFibGV8ZHVtcF9pbWFnZXxkdXB8ZHVwMnxlbGVtZW50c3xlbXB0eXxlbmRfb2ZfaW5wdXR8ZW52aXJvbm1lbnR8ZXByaW50ZnxlcHNpbG9uX2Zsb2F0fGVxX2JpZ19pbnR8ZXFfbnVtfGVxdWFsfGVycl9mb3JtYXR0ZXJ8ZXJyb3JfbWVzc2FnZXxlc2NhcGVkfGVzdGFibGlzaF9zZXJ2ZXJ8ZXhlY3V0YWJsZV9uYW1lfGV4ZWN2fGV4ZWN2ZXxleGVjdnB8ZXhlY3ZwZXxleGlzdHN8ZXhpc3RzMnxleGl0fGV4cHxmYWlsd2l0aHxmYXN0X3NvcnR8ZmNobW9kfGZjaG93bnxmaWVsZHxmaWxlfGZpbGVfZXhpc3RzfGZpbGx8ZmlsbF9hcmN8ZmlsbF9jaXJjbGV8ZmlsbF9lbGxpcHNlfGZpbGxfcG9seXxmaWxsX3JlY3R8ZmlsdGVyfGZpbmFsX3RhZ3xmaW5hbGlzZXxmaW5kfGZpbmRfYWxsfGZpcnN0X2NoYXJzfGZpcnN0a2V5fGZsYXR0ZW58ZmxvYXR8ZmxvYXQzMnxmbG9hdDY0fGZsb2F0X29mX2JpZ19pbnR8ZmxvYXRfb2ZfYml0c3xmbG9hdF9vZl9pbnR8ZmxvYXRfb2ZfbnVtfGZsb2F0X29mX3N0cmluZ3xmbG9vcnxmbG9vcl9udW18Zmx1c2h8Zmx1c2hfYWxsfGZsdXNoX2lucHV0fGZsdXNoX3N0cl9mb3JtYXR0ZXJ8Zm9sZHxmb2xkX2xlZnR8Zm9sZF9sZWZ0Mnxmb2xkX3JpZ2h0fGZvbGRfcmlnaHQyfGZvcl9hbGx8Zm9yX2FsbDJ8Zm9yY2V8Zm9yY2VfbmV3bGluZXxmb3JjZV92YWx8Zm9yZWdyb3VuZHxmb3JrfGZvcm1hdF9vZl9zdHJpbmd8Zm9ybWF0dGVyX29mX2J1ZmZlcnxmb3JtYXR0ZXJfb2Zfb3V0X2NoYW5uZWx8Zm9ydHJhbl9sYXlvdXR8Zm9yd2FyZF90YWd8ZnByaW50ZnxmcmV4cHxmcm9tfGZyb21fY2hhbm5lbHxmcm9tX2ZpbGV8ZnJvbV9maWxlX2Jpbnxmcm9tX2Z1bmN0aW9ufGZyb21fc3RyaW5nfGZzY2FuZnxmc3R8ZnN0YXR8ZnRydW5jYXRlfGZ1bGxfaW5pdHxmdWxsX21ham9yfGZ1bGxfc3BsaXR8Z2NkX2JpZ19pbnR8Z2VfYmlnX2ludHxnZV9udW18Z2VuYXJyYXlfb2ZfYXJyYXkxfGdlbmFycmF5X29mX2FycmF5MnxnZW5hcnJheV9vZl9hcnJheTN8Z2V0fGdldF9hbGxfZm9ybWF0dGVyX291dHB1dF9mdW5jdGlvbnN8Z2V0X2FwcHJveF9wcmludGluZ3xnZXRfY29weXxnZXRfZWxsaXBzaXNfdGV4dHxnZXRfZXJyb3Jfd2hlbl9udWxsX2Rlbm9taW5hdG9yfGdldF9mbG9hdGluZ19wcmVjaXNpb258Z2V0X2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zfGdldF9mb3JtYXR0ZXJfdGFnX2Z1bmN0aW9uc3xnZXRfaW1hZ2V8Z2V0X21hcmdpbnxnZXRfbWFya190YWdzfGdldF9tYXhfYm94ZXN8Z2V0X21heF9pbmRlbnR8Z2V0X21ldGhvZHxnZXRfbWV0aG9kX2xhYmVsfGdldF9ub3JtYWxpemVfcmF0aW98Z2V0X25vcm1hbGl6ZV9yYXRpb193aGVuX3ByaW50aW5nfGdldF9wcmludF90YWdzfGdldF9zdGF0ZXxnZXRfdmFyaWFibGV8Z2V0Y3dkfGdldGVnaWR8Z2V0ZWdpZHxnZXRlbnZ8Z2V0ZW52fGdldGVudnxnZXRldWlkfGdldGV1aWR8Z2V0Z2lkfGdldGdpZHxnZXRncmdpZHxnZXRncmdpZHxnZXRncm5hbXxnZXRncm5hbXxnZXRncm91cHN8Z2V0aG9zdGJ5YWRkcnxnZXRob3N0YnluYW1lfGdldGhvc3RuYW1lfGdldGl0aW1lcnxnZXRsb2dpbnxnZXRwZWVybmFtZXxnZXRwaWR8Z2V0cHBpZHxnZXRwcm90b2J5bmFtZXxnZXRwcm90b2J5bnVtYmVyfGdldHB3bmFtfGdldHB3dWlkfGdldHNlcnZieW5hbWV8Z2V0c2VydmJ5cG9ydHxnZXRzb2NrbmFtZXxnZXRzb2Nrb3B0fGdldHNvY2tvcHRfZmxvYXR8Z2V0c29ja29wdF9pbnR8Z2V0c29ja29wdF9vcHRpbnR8Z2V0dGltZW9mZGF5fGdldHVpZHxnbG9iYWxfcmVwbGFjZXxnbG9iYWxfc3Vic3RpdHV0ZXxnbXRpbWV8Z3JlZW58Z3JpZHxncm91cF9iZWdpbm5pbmd8Z3JvdXBfZW5kfGd0X2JpZ19pbnR8Z3RfbnVtfGd1YXJkfGhhbmRsZV91bml4X2Vycm9yfGhhc2h8aGFzaF9wYXJhbXxoZHxoZWFkZXJfc2l6ZXxpfGlkfGlnbm9yZXxpbl9jaGFubmVsX2xlbmd0aHxpbl9jaGFubmVsX29mX2Rlc2NyfGluY3J8aW5jcl9udW18aW5kZXh8aW5kZXhfZnJvbXxpbmV0X2FkZHJfYW55fGluZXRfYWRkcl9vZl9zdHJpbmd8aW5maW5pdHl8aW5maXhfdGFnfGluaXR8aW5pdF9jbGFzc3xpbnB1dHxpbnB1dF9iaW5hcnlfaW50fGlucHV0X2J5dGV8aW5wdXRfY2hhcnxpbnB1dF9saW5lfGlucHV0X3ZhbHVlfGludHxpbnQxNl9zaWduZWR8aW50MTZfdW5zaWduZWR8aW50MzJ8aW50NjR8aW50OF9zaWduZWR8aW50OF91bnNpZ25lZHxpbnRfb2ZfYmlnX2ludHxpbnRfb2ZfY2hhcnxpbnRfb2ZfZmxvYXR8aW50X29mX251bXxpbnRfb2Zfc3RyaW5nfGludGVnZXJfbnVtfGludGVyfGludGVyYWN0aXZlfGludnxpbnZhbGlkX2FyZ3xpc19ibG9ja3xpc19lbXB0eXxpc19pbXBsaWNpdHxpc19pbnR8aXNfaW50X2JpZ19pbnR8aXNfaW50ZWdlcl9udW18aXNfcmVsYXRpdmV8aXRlcnxpdGVyMnxpdGVyaXxqb2lufGp1bmt8a2V5X3ByZXNzZWR8a2lsbHxraW5kfGtwcmludGZ8a3NjYW5mfGxhbmR8bGFzdF9jaGFyc3xsYXlvdXR8bGF6eV9mcm9tX2Z1bnxsYXp5X2Zyb21fdmFsfGxhenlfaXNfdmFsfGxhenlfdGFnfGxkZXhwfGxlX2JpZ19pbnR8bGVfbnVtfGxlbmd0aHxsZXhlbWV8bGV4ZW1lX2NoYXJ8bGV4ZW1lX2VuZHxsZXhlbWVfZW5kX3B8bGV4ZW1lX3N0YXJ0fGxleGVtZV9zdGFydF9wfGxpbmV0b3xsaW5rfGxpc3R8bGlzdGVufGxub3R8bG9hZGZpbGV8bG9hZGZpbGVfcHJpdmF0ZXxsb2NhbHRpbWV8bG9ja3xsb2NrZnxsb2d8bG9nMTB8bG9nYW5kfGxvZ25vdHxsb2dvcnxsb2d4b3J8bG9yfGxvd2VyX3dpbmRvd3xsb3dlcmNhc2V8bHNlZWt8bHNsfGxzcnxsc3RhdHxsdF9iaWdfaW50fGx0X251bXxseG9yfG1hZ2VudGF8bWFnaWN8bWFpbkxvb3B8bWFqb3J8bWFqb3Jfc2xpY2V8bWFrZXxtYWtlX2Zvcm1hdHRlcnxtYWtlX2ltYWdlfG1ha2VfbGV4ZXJ8bWFrZV9tYXRyaXh8bWFrZV9zZWxmX2luaXR8bWFwfG1hcDJ8bWFwX2ZpbGV8bWFwaXxtYXJzaGFsfG1hdGNoX2JlZ2lubmluZ3xtYXRjaF9lbmR8bWF0Y2hlZF9ncm91cHxtYXRjaGVkX3N0cmluZ3xtYXh8bWF4X2FycmF5X2xlbmd0aHxtYXhfYmlnX2ludHxtYXhfZWx0fG1heF9mbG9hdHxtYXhfaW50fG1heF9udW18bWF4X3N0cmluZ19sZW5ndGh8bWVtfG1lbV9hc3NvY3xtZW1fYXNzcXxtZW1xfG1lcmdlfG1pbnxtaW5fYmlnX2ludHxtaW5fZWx0fG1pbl9mbG9hdHxtaW5faW50fG1pbl9udW18bWlub3J8bWludXNfYmlnX2ludHxtaW51c19udW18bWludXNfb25lfG1rZGlyfG1rZmlmb3xta3RpbWV8bW9kfG1vZF9iaWdfaW50fG1vZF9mbG9hdHxtb2RfbnVtfG1vZGZ8bW91c2VfcG9zfG1vdmV0b3xtdWx8bXVsdF9iaWdfaW50fG11bHRfaW50X2JpZ19pbnR8bXVsdF9udW18bmFufG5hcnJvd3xuYXRfb2ZfbnVtfG5hdGl2ZWludHxuZWd8bmVnX2luZmluaXR5fG5ld19ibG9ja3xuZXdfY2hhbm5lbHxuZXdfbWV0aG9kfG5ld192YXJpYWJsZXxuZXh0fG5leHRrZXl8bmljZXxuaWNlfG5vX3NjYW5fdGFnfG5vcm18bm9ybTJ8bm90fG5wZWVrfG50aHxudGhfZGltfG51bV9kaWdpdHNfYmlnX2ludHxudW1fZGltc3xudW1fb2ZfYmlnX2ludHxudW1fb2ZfaW50fG51bV9vZl9uYXR8bnVtX29mX3JhdGlvfG51bV9vZl9zdHJpbmd8T3xvYmp8b2JqZWN0X3RhZ3xvY2FtbF92ZXJzaW9ufG9mX2FycmF5fG9mX2NoYW5uZWx8b2ZfZmxvYXR8b2ZfaW50fG9mX2ludDMyfG9mX2xpc3R8b2ZfbmF0aXZlaW50fG9mX3N0cmluZ3xvbmV8b3BlblRrfG9wZW5fYm94fG9wZW5fY29ubmVjdGlvbnxvcGVuX2dyYXBofG9wZW5faGJveHxvcGVuX2hvdmJveHxvcGVuX2h2Ym94fG9wZW5faW58b3Blbl9pbl9iaW58b3Blbl9pbl9nZW58b3Blbl9vdXR8b3Blbl9vdXRfYmlufG9wZW5fb3V0X2dlbnxvcGVuX3Byb2Nlc3N8b3Blbl9wcm9jZXNzX2Z1bGx8b3Blbl9wcm9jZXNzX2lufG9wZW5fcHJvY2Vzc19vdXR8b3Blbl9zdWJ3aW5kb3d8b3Blbl90YWd8b3Blbl90Ym94fG9wZW5fdGVtcF9maWxlfG9wZW5fdmJveHxvcGVuZGJtfG9wZW5kaXJ8b3BlbmZpbGV8b3J8b3NfdHlwZXxvdXRfY2hhbm5lbF9sZW5ndGh8b3V0X2NoYW5uZWxfb2ZfZGVzY3J8b3V0cHV0fG91dHB1dF9iaW5hcnlfaW50fG91dHB1dF9idWZmZXJ8b3V0cHV0X2J5dGV8b3V0cHV0X2NoYXJ8b3V0cHV0X3N0cmluZ3xvdXRwdXRfdmFsdWV8b3Zlcl9tYXhfYm94ZXN8cGFja3xwYXJhbXN8cGFyZW50X2Rpcl9uYW1lfHBhcnNlfHBhcnNlX2FyZ3Z8cGFydGl0aW9ufHBhdXNlfHBlZWt8cGlwZXxwaXhlbHN8cGxhY2V8cGxvdHxwbG90c3xwb2ludF9jb2xvcnxwb2xhcnxwb2xsfHBvcHxwb3NfaW58cG9zX291dHxwb3d8cG93ZXJfYmlnX2ludF9wb3NpdGl2ZV9iaWdfaW50fHBvd2VyX2JpZ19pbnRfcG9zaXRpdmVfaW50fHBvd2VyX2ludF9wb3NpdGl2ZV9iaWdfaW50fHBvd2VyX2ludF9wb3NpdGl2ZV9pbnR8cG93ZXJfbnVtfHBwX2Nsb3NlX2JveHxwcF9jbG9zZV90YWd8cHBfY2xvc2VfdGJveHxwcF9mb3JjZV9uZXdsaW5lfHBwX2dldF9hbGxfZm9ybWF0dGVyX291dHB1dF9mdW5jdGlvbnN8cHBfZ2V0X2VsbGlwc2lzX3RleHR8cHBfZ2V0X2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zfHBwX2dldF9mb3JtYXR0ZXJfdGFnX2Z1bmN0aW9uc3xwcF9nZXRfbWFyZ2lufHBwX2dldF9tYXJrX3RhZ3N8cHBfZ2V0X21heF9ib3hlc3xwcF9nZXRfbWF4X2luZGVudHxwcF9nZXRfcHJpbnRfdGFnc3xwcF9vcGVuX2JveHxwcF9vcGVuX2hib3h8cHBfb3Blbl9ob3Zib3h8cHBfb3Blbl9odmJveHxwcF9vcGVuX3RhZ3xwcF9vcGVuX3Rib3h8cHBfb3Blbl92Ym94fHBwX292ZXJfbWF4X2JveGVzfHBwX3ByaW50X2FzfHBwX3ByaW50X2Jvb2x8cHBfcHJpbnRfYnJlYWt8cHBfcHJpbnRfY2hhcnxwcF9wcmludF9jdXR8cHBfcHJpbnRfZmxvYXR8cHBfcHJpbnRfZmx1c2h8cHBfcHJpbnRfaWZfbmV3bGluZXxwcF9wcmludF9pbnR8cHBfcHJpbnRfbmV3bGluZXxwcF9wcmludF9zcGFjZXxwcF9wcmludF9zdHJpbmd8cHBfcHJpbnRfdGFifHBwX3ByaW50X3RicmVha3xwcF9zZXRfYWxsX2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zfHBwX3NldF9lbGxpcHNpc190ZXh0fHBwX3NldF9mb3JtYXR0ZXJfb3V0X2NoYW5uZWx8cHBfc2V0X2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zfHBwX3NldF9mb3JtYXR0ZXJfdGFnX2Z1bmN0aW9uc3xwcF9zZXRfbWFyZ2lufHBwX3NldF9tYXJrX3RhZ3N8cHBfc2V0X21heF9ib3hlc3xwcF9zZXRfbWF4X2luZGVudHxwcF9zZXRfcHJpbnRfdGFnc3xwcF9zZXRfdGFifHBwX3NldF90YWdzfHByZWR8cHJlZF9iaWdfaW50fHByZWRfbnVtfHByZXJyX2NoYXJ8cHJlcnJfZW5kbGluZXxwcmVycl9mbG9hdHxwcmVycl9pbnR8cHJlcnJfbmV3bGluZXxwcmVycl9zdHJpbmd8cHJpbnR8cHJpbnRfYXN8cHJpbnRfYm9vbHxwcmludF9icmVha3xwcmludF9jaGFyfHByaW50X2N1dHxwcmludF9lbmRsaW5lfHByaW50X2Zsb2F0fHByaW50X2ZsdXNofHByaW50X2lmX25ld2xpbmV8cHJpbnRfaW50fHByaW50X25ld2xpbmV8cHJpbnRfc3BhY2V8cHJpbnRfc3RhdHxwcmludF9zdHJpbmd8cHJpbnRfdGFifHByaW50X3RicmVha3xwcmludGZ8cHJvaGliaXR8cHVibGljX21ldGhvZF9sYWJlbHxwdXNofHB1dGVudnxxdW9fbnVtfHF1b21vZF9iaWdfaW50fHF1b3RlfHJhaXNlfHJhaXNlX3dpbmRvd3xyYXRpb19vZl9udW18cmNvbnRhaW5zX2Zyb218cmVhZHxyZWFkX2Zsb2F0fHJlYWRfaW50fHJlYWRfa2V5fHJlYWRfbGluZXxyZWFkZGlyfHJlYWRkaXJ8cmVhZGxpbmt8cmVhbGx5X2lucHV0fHJlY2VpdmV8cmVjdnxyZWN2ZnJvbXxyZWR8cmVmfHJlZ2V4cHxyZWdleHBfY2FzZV9mb2xkfHJlZ2V4cF9zdHJpbmd8cmVnZXhwX3N0cmluZ19jYXNlX2ZvbGR8cmVnaXN0ZXJ8cmVnaXN0ZXJfZXhjZXB0aW9ufHJlbXxyZW1lbWJlcl9tb2RlfHJlbW92ZXxyZW1vdmVfYXNzb2N8cmVtb3ZlX2Fzc3F8cmVuYW1lfHJlcGxhY2V8cmVwbGFjZV9maXJzdHxyZXBsYWNlX21hdGNoZWR8cmVwcnxyZXNldHxyZXNoYXBlfHJlc2hhcGVfMXxyZXNoYXBlXzJ8cmVzaGFwZV8zfHJldnxyZXZfYXBwZW5kfHJldl9tYXB8cmV2X21hcDJ8cmV3aW5kZGlyfHJnYnxyaHNfZW5kfHJoc19lbmRfcG9zfHJoc19zdGFydHxyaHNfc3RhcnRfcG9zfHJpbmRleHxyaW5kZXhfZnJvbXxybGluZXRvfHJtZGlyfHJtb3ZldG98cm91bmRfbnVtfHJ1bl9pbml0aWFsaXplcnN8cnVuX2luaXRpYWxpemVyc19vcHR8c2NhbmZ8c2VhcmNoX2JhY2t3YXJkfHNlYXJjaF9mb3J3YXJkfHNlZWtfaW58c2Vla19vdXR8c2VsZWN0fHNlbGZ8c2VsZl9pbml0fHNlbmR8c2VuZHRvfHNldHxzZXRfYWxsX2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zfHNldF9hcHByb3hfcHJpbnRpbmd8c2V0X2JpbmFyeV9tb2RlX2lufHNldF9iaW5hcnlfbW9kZV9vdXR8c2V0X2Nsb3NlX29uX2V4ZWN8c2V0X2Nsb3NlX29uX2V4ZWN8c2V0X2NvbG9yfHNldF9lbGxpcHNpc190ZXh0fHNldF9lcnJvcl93aGVuX251bGxfZGVub21pbmF0b3J8c2V0X2ZpZWxkfHNldF9mbG9hdGluZ19wcmVjaXNpb258c2V0X2ZvbnR8c2V0X2Zvcm1hdHRlcl9vdXRfY2hhbm5lbHxzZXRfZm9ybWF0dGVyX291dHB1dF9mdW5jdGlvbnN8c2V0X2Zvcm1hdHRlcl90YWdfZnVuY3Rpb25zfHNldF9saW5lX3dpZHRofHNldF9tYXJnaW58c2V0X21hcmtfdGFnc3xzZXRfbWF4X2JveGVzfHNldF9tYXhfaW5kZW50fHNldF9tZXRob2R8c2V0X25vbmJsb2NrfHNldF9ub25ibG9ja3xzZXRfbm9ybWFsaXplX3JhdGlvfHNldF9ub3JtYWxpemVfcmF0aW9fd2hlbl9wcmludGluZ3xzZXRfcHJpbnRfdGFnc3xzZXRfc2lnbmFsfHNldF9zdGF0ZXxzZXRfdGFifHNldF90YWd8c2V0X3RhZ3N8c2V0X3RleHRfc2l6ZXxzZXRfd2luZG93X3RpdGxlfHNldGdpZHxzZXRnaWR8c2V0aXRpbWVyfHNldGl0aW1lcnxzZXRzaWR8c2V0c2lkfHNldHNvY2tvcHR8c2V0c29ja29wdHxzZXRzb2Nrb3B0X2Zsb2F0fHNldHNvY2tvcHRfZmxvYXR8c2V0c29ja29wdF9pbnR8c2V0c29ja29wdF9pbnR8c2V0c29ja29wdF9vcHRpbnR8c2V0c29ja29wdF9vcHRpbnR8c2V0dWlkfHNldHVpZHxzaGlmdF9sZWZ0fHNoaWZ0X2xlZnR8c2hpZnRfbGVmdHxzaGlmdF9yaWdodHxzaGlmdF9yaWdodHxzaGlmdF9yaWdodHxzaGlmdF9yaWdodF9sb2dpY2FsfHNoaWZ0X3JpZ2h0X2xvZ2ljYWx8c2hpZnRfcmlnaHRfbG9naWNhbHxzaG93X2J1Y2tldHN8c2h1dGRvd258c2h1dGRvd258c2h1dGRvd25fY29ubmVjdGlvbnxzaHV0ZG93bl9jb25uZWN0aW9ufHNpZ2FicnR8c2lnYWxybXxzaWdjaGxkfHNpZ2NvbnR8c2lnZnBlfHNpZ2h1cHxzaWdpbGx8c2lnaW50fHNpZ2tpbGx8c2lnbl9iaWdfaW50fHNpZ25fbnVtfHNpZ25hbHxzaWduYWx8c2lncGVuZGluZ3xzaWdwZW5kaW5nfHNpZ3BpcGV8c2lncHJvY21hc2t8c2lncHJvY21hc2t8c2lncHJvZnxzaWdxdWl0fHNpZ3NlZ3Z8c2lnc3RvcHxzaWdzdXNwZW5kfHNpZ3N1c3BlbmR8c2lndGVybXxzaWd0c3RwfHNpZ3R0aW58c2lndHRvdXxzaWd1c3IxfHNpZ3VzcjJ8c2lndnRhbHJtfHNpbnxzaW5nbGV0b258c2luaHxzaXplfHNpemV8c2l6ZV94fHNpemVfeXxzbGVlcHxzbGVlcHxzbGVlcHxzbGljZV9sZWZ0fHNsaWNlX2xlZnR8c2xpY2VfbGVmdF8xfHNsaWNlX2xlZnRfMnxzbGljZV9yaWdodHxzbGljZV9yaWdodHxzbGljZV9yaWdodF8xfHNsaWNlX3JpZ2h0XzJ8c25kfHNvY2tldHxzb2NrZXR8c29ja2V0fHNvY2tldHBhaXJ8c29ja2V0cGFpcnxzb3J0fHNvdW5kfHNwbGl0fHNwbGl0X2RlbGltfHNwcmludGZ8c3ByaW50ZnxzcXJ0fHNxcnR8c3FydF9iaWdfaW50fHNxdWFyZV9iaWdfaW50fHNxdWFyZV9udW18c3NjYW5mfHN0YWJsZV9zb3J0fHN0YWJsZV9zb3J0fHN0YWJsZV9zb3J0fHN0YWJsZV9zb3J0fHN0YWJsZV9zb3J0fHN0YWJsZV9zb3J0fHN0YXR8c3RhdHxzdGF0fHN0YXR8c3RhdHxzdGF0c3xzdGF0c3xzdGRfZm9ybWF0dGVyfHN0ZGJ1ZnxzdGRlcnJ8c3RkZXJyfHN0ZGVycnxzdGRpYnxzdGRpbnxzdGRpbnxzdGRpbnxzdGRvdXR8c3Rkb3V0fHN0ZG91dHxzdHJfZm9ybWF0dGVyfHN0cmluZ3xzdHJpbmdfYWZ0ZXJ8c3RyaW5nX2JlZm9yZXxzdHJpbmdfbWF0Y2h8c3RyaW5nX29mX2JpZ19pbnR8c3RyaW5nX29mX2Jvb2x8c3RyaW5nX29mX2Zsb2F0fHN0cmluZ19vZl9mb3JtYXR8c3RyaW5nX29mX2luZXRfYWRkcnxzdHJpbmdfb2ZfaW5ldF9hZGRyfHN0cmluZ19vZl9pbnR8c3RyaW5nX29mX251bXxzdHJpbmdfcGFydGlhbF9tYXRjaHxzdHJpbmdfdGFnfHN1YnxzdWJ8c3ViX2JpZ19pbnR8c3ViX2xlZnR8c3ViX251bXxzdWJfcmlnaHR8c3Vic2V0fHN1YnNldHxzdWJzdGl0dXRlX2ZpcnN0fHN1YnN0cmluZ3xzdWNjfHN1Y2N8c3VjY3xzdWNjfHN1Y2NfYmlnX2ludHxzdWNjX251bXxzeW1ib2xfZW5kfHN5bWJvbF9lbmRfcG9zfHN5bWJvbF9zdGFydHxzeW1ib2xfc3RhcnRfcG9zfHN5bWxpbmt8c3ltbGlua3xzeW5jfHN5bmNocm9uaXplfHN5c3RlbXxzeXN0ZW18c3lzdGVtfHRhZ3x0YWtlfHRhbnx0YW5ofHRjZHJhaW58dGNkcmFpbnx0Y2Zsb3d8dGNmbG93fHRjZmx1c2h8dGNmbHVzaHx0Y2dldGF0dHJ8dGNnZXRhdHRyfHRjc2VuZGJyZWFrfHRjc2VuZGJyZWFrfHRjc2V0YXR0cnx0Y3NldGF0dHJ8dGVtcF9maWxlfHRleHRfc2l6ZXx0aW1lfHRpbWV8dGltZXx0aW1lZF9yZWFkfHRpbWVkX3dyaXRlfHRpbWVzfHRpbWVzfHRsfHRsfHRsfHRvX2J1ZmZlcnx0b19jaGFubmVsfHRvX2Zsb2F0fHRvX2hleHx0b19pbnR8dG9faW50MzJ8dG9fbGlzdHx0b19saXN0fHRvX2xpc3R8dG9fbmF0aXZlaW50fHRvX3N0cmluZ3x0b19zdHJpbmd8dG9fc3RyaW5nfHRvX3N0cmluZ3x0b19zdHJpbmd8dG9wfHRvcHx0b3RhbF9zaXplfHRyYW5zZmVyfHRyYW5zcHx0cnVuY2F0ZXx0cnVuY2F0ZXx0cnVuY2F0ZXx0cnVuY2F0ZXx0cnVuY2F0ZXx0cnVuY2F0ZXx0cnlfbG9ja3x1bWFza3x1bWFza3x1bmNhcGl0YWxpemV8dW5jYXBpdGFsaXplfHVuY2FwaXRhbGl6ZXx1bmlvbnx1bmlvbnx1bml0X2JpZ19pbnR8dW5saW5rfHVubGlua3x1bmxvY2t8dW5tYXJzaGFsfHVuc2FmZV9ibGl0fHVuc2FmZV9maWxsfHVuc2FmZV9nZXR8dW5zYWZlX2dldHx1bnNhZmVfc2V0fHVuc2FmZV9zZXR8dXBkYXRlfHVwcGVyY2FzZXx1cHBlcmNhc2V8dXBwZXJjYXNlfHVwcGVyY2FzZXx1c2FnZXx1dGltZXN8dXRpbWVzfHdhaXR8d2FpdHx3YWl0fHdhaXR8d2FpdF9uZXh0X2V2ZW50fHdhaXRfcGlkfHdhaXRfcmVhZHx3YWl0X3NpZ25hbHx3YWl0X3RpbWVkX3JlYWR8d2FpdF90aW1lZF93cml0ZXx3YWl0X3dyaXRlfHdhaXRwaWR8d2hpdGV8d2lkZW58d2luZG93X2lkfHdvcmRfc2l6ZXx3cmFwfHdyYXBfYWJvcnR8d3JpdGV8eWVsbG93fHlpZWxkfHplcm98emVyb19iaWdfaW50fEFyZ3xBcml0aF9zdGF0dXN8QXJyYXl8QXJyYXkxfEFycmF5MnxBcnJheTN8QXJyYXlMYWJlbHN8QmlnX2ludHxCaWdhcnJheXxCdWZmZXJ8Q2FsbGJhY2t8Q2FtbGludGVybmFsT098Q2hhcnxDb21wbGV4fENvbmRpdGlvbnxEYm18RGlnZXN0fER5bmxpbmt8RXZlbnR8RmlsZW5hbWV8Rm9ybWF0fEdjfEdlbmFycmF5fEdlbmxleHxHcmFwaGljc3xHcmFwaGljc1gxMXxIYXNodGJsfEludDMyfEludDY0fExhcmdlRmlsZXxMYXp5fExleGluZ3xMaXN0fExpc3RMYWJlbHN8TWFrZXxNYXB8TWFyc2hhbHxNb3JlTGFiZWxzfE11dGV4fE5hdGl2ZWludHxOdW18T2JqfE9vfFBhcnNpbmd8UGVydmFzaXZlc3xQcmludGV4Y3xQcmludGZ8UXVldWV8UmFuZG9tfFNjYW5mfFNjYW5uaW5nfFNldHxTb3J0fFN0YWNrfFN0YXRlfFN0ZExhYmVsc3xTdHJ8U3RyZWFtfFN0cmluZ3xTdHJpbmdMYWJlbHN8U3lzfFRocmVhZHxUaHJlYWRVbml4fFRrfFVuaXh8VW5peExhYmVsc3xXZWFrIi5zcGxpdCgifCIpKSxkPSIoPzooPzpbMS05XVxcZCopfCg/OjApKSIsZj0iKD86MFtvT10/WzAtN10rKSIsZz0iKD86MFt4WF1bXFxkQS1GYS1mXSspIixoPSIoPzowW2JCXVswMV0rKSIsaT0iKD86IitkKyJ8IitmKyJ8IitnKyJ8IitoKyIpIixqPSIoPzpbZUVdWystXT9cXGQrKSIsaz0iKD86XFwuXFxkKykiLGw9Iig/OlxcZCspIixtPSIoPzooPzoiK2wrIj8iK2srIil8KD86IitsKyJcXC4pKSIsbj0iKD86KD86IittKyJ8IitsKyIpIitqKyIpIixvPSIoPzoiK24rInwiK20rIikiO3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwoXFwqLio/XFwqXFwpXFxzKj8kIn0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwoXFwqLioiLG5leHQ6ImNvbW1lbnQifSx7dG9rZW46InN0cmluZyIscmVnZXg6J1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nfSx7dG9rZW46InN0cmluZyIscmVnZXg6IicuJyJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDonIicsbmV4dDoicXN0cmluZyJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6Iig/OiIrbysifFxcZCspW2pKXVxcYiJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6b30se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDppKyJcXGIifSx7dG9rZW46ZnVuY3Rpb24oZCl7cmV0dXJuIGEuaGFzT3duUHJvcGVydHkoZCk/ImtleXdvcmQiOmIuaGFzT3duUHJvcGVydHkoZCk/ImNvbnN0YW50Lmxhbmd1YWdlIjpjLmhhc093blByb3BlcnR5KGQpPyJzdXBwb3J0LmZ1bmN0aW9uIjoiaWRlbnRpZmllciJ9LHJlZ2V4OiJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIifSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiJcXCtcXC58XFwtXFwufFxcKlxcLnxcXC9cXC58I3w7O3xcXCt8XFwtfFxcKnxcXCpcXCpcXC98XFwvXFwvfCV8PDx8Pj58JnxcXHx8XFxefH58PHw+fDw9fD0+fD09fCE9fDw+fDwtfD0ifSx7dG9rZW46InBhcmVuLmxwYXJlbiIscmVnZXg6IltbKHtdIn0se3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4OiJbXFxdKX1dIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9XSxjb21tZW50Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj9cXCpcXCkiLG5leHQ6InN0YXJ0In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV0scXN0cmluZzpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OiciJyxuZXh0OiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV19fTtkLmluaGVyaXRzKGcsZiksYi5PY2FtbEhpZ2hsaWdodFJ1bGVzPWd9KSxkZWZpbmUoImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3JhbmdlIikuUmFuZ2UsZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuL15ccyskLy50ZXN0KGEpPy9eXHMqXH0vLnRlc3QoYik6ITF9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldExpbmUoYiksZT1jLm1hdGNoKC9eKFxzKlx9KS8pO2lmKCFlKXJldHVybiAwO3ZhciBmPWVbMV0ubGVuZ3RoLGc9YS5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6Yixjb2x1bW46Zn0pO2lmKCFnfHxnLnJvdz09YilyZXR1cm4gMDt2YXIgaD10aGlzLiRnZXRJbmRlbnQoYS5nZXRMaW5lKGcucm93KSk7YS5yZXBsYWNlKG5ldyBkKGIsMCxiLGYtMSksaCl9LHRoaXMuJGdldEluZGVudD1mdW5jdGlvbihhKXt2YXIgYj1hLm1hdGNoKC9eKFxzKykvKTtyZXR1cm4gYj9iWzFdOiIifX0pKS5jYWxsKGUucHJvdG90eXBlKSxiLk1hdGNoaW5nQnJhY2VPdXRkZW50PWV9KSxmdW5jdGlvbigpe3dpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLGZ1bmN0aW9uKGEpe3dpbmRvdy5hY2V8fCh3aW5kb3cuYWNlPXt9KTtmb3IodmFyIGIgaW4gYSlhLmhhc093blByb3BlcnR5KGIpJiYoYWNlW2JdPWFbYl0pfSl9KCk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-perl-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBQYW5hZ2lvdGlzIEFzdGl0aGFzIDxwYXN0aXRoIEFUIGdtYWlsIERPVCBjb20+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL3BlcmwnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHQnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS9wZXJsX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgJ2FjZS9yYW5nZScsICdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsKdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsKdmFyIFBlcmxIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vcGVybF9oaWdobGlnaHRfcnVsZXMiKS5QZXJsSGlnaGxpZ2h0UnVsZXM7CnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Owp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOwp2YXIgQ1N0eWxlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGU7Cgp2YXIgTW9kZSA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgUGVybEhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7CiAgICB0aGlzLiRvdXRkZW50ID0gbmV3IE1hdGNoaW5nQnJhY2VPdXRkZW50KCk7CiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBDU3R5bGVGb2xkTW9kZSgpOwp9Owpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOwoKKGZ1bmN0aW9uKCkgewoKICAgIHRoaXMudG9nZ2xlQ29tbWVudExpbmVzID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgc3RhcnRSb3csIGVuZFJvdykgewogICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsKICAgICAgICB2YXIgcmUgPSAvXihccyopIy87CgogICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykgewogICAgICAgICAgICBpZiAoIXJlLnRlc3QoZG9jLmdldExpbmUoaSkpKSB7CiAgICAgICAgICAgICAgICBvdXRkZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKG91dGRlbnQpIHsKICAgICAgICAgICAgdmFyIGRlbGV0ZVJhbmdlID0gbmV3IFJhbmdlKDAsIDAsIDAsIDApOwogICAgICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUoaSk7CiAgICAgICAgICAgICAgICB2YXIgbSA9IGxpbmUubWF0Y2gocmUpOwogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2Uuc3RhcnQucm93ID0gaTsKICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLmVuZC5yb3cgPSBpOwogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLmNvbHVtbiA9IG1bMF0ubGVuZ3RoOwogICAgICAgICAgICAgICAgZG9jLnJlcGxhY2UoZGVsZXRlUmFuZ2UsIG1bMV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBkb2MuaW5kZW50Um93cyhzdGFydFJvdywgZW5kUm93LCAiIyIpOwogICAgICAgIH0KICAgIH07CgogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsKICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGxpbmUpOwoKICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsKICAgICAgICB2YXIgdG9rZW5zID0gdG9rZW5pemVkTGluZS50b2tlbnM7CgogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7CiAgICAgICAgICAgIHJldHVybiBpbmRlbnQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoc3RhdGUgPT0gInN0YXJ0IikgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eLipbXHtcKFxbXDpdXHMqJC8pOwogICAgICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgICAgIGluZGVudCArPSB0YWI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBpbmRlbnQ7CiAgICB9OwoKICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsKICAgIH07CgogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgewogICAgICAgIHRoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoZG9jLCByb3cpOwogICAgfTsKCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOwoKZXhwb3J0cy5Nb2RlID0gTW9kZTsKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgUGFuYWdpb3RpcyBBc3RpdGhhcyA8cGFzdGl0aCBBVCBnbWFpbCBET1QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9wZXJsX2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9sYW5nJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7CnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOwoKdmFyIFBlcmxIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgewoKICAgIHZhciBrZXl3b3JkcyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoImJhc2V8Y29uc3RhbnR8Y29udGludWV8ZWxzZXxlbHNpZnxmb3J8Zm9yZWFjaHxmb3JtYXR8Z290b3xpZnxsYXN0fGxvY2FsfG15fG5leHR8IiArCiAgICAgICAgICJub3xwYWNrYWdlfHBhcmVudHxyZWRvfHJlcXVpcmV8c2NhbGFyfHN1Ynx1bmxlc3N8dW50aWx8d2hpbGV8dXNlfHZhcnMiKS5zcGxpdCgifCIpCiAgICApOwoKICAgIHZhciBidWlsZGluQ29uc3RhbnRzID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgiQVJHVnxFTlZ8SU5DfFNJRyIpLnNwbGl0KCJ8IikKICAgICk7CgogICAgdmFyIGJ1aWx0aW5GdW5jdGlvbnMgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCJnZXRwcm90b2J5bnVtYmVyfGdldHByb3RvYnluYW1lfGdldHNlcnZieW5hbWV8Z2V0aG9zdGJ5YWRkcnwiICsKICAgICAgICAgImdldGhvc3RieW5hbWV8Z2V0c2VydmJ5cG9ydHxnZXRuZXRieWFkZHJ8Z2V0bmV0YnluYW1lfGdldHNvY2tuYW1lfCIgKwogICAgICAgICAiZ2V0cGVlcm5hbWV8c2V0cHJpb3JpdHl8Z2V0cHJvdG9lbnR8c2V0cHJvdG9lbnR8Z2V0cHJpb3JpdHl8IiArCiAgICAgICAgICJlbmRwcm90b2VudHxnZXRzZXJ2ZW50fHNldHNlcnZlbnR8ZW5kc2VydmVudHxzZXRob3N0ZW50fHNvY2tldHBhaXJ8IiArCiAgICAgICAgICJnZXRzb2Nrb3B0fGdldGhvc3RlbnR8ZW5kaG9zdGVudHxzZXRzb2Nrb3B0fHNldG5ldGVudHxxdW90ZW1ldGF8IiArCiAgICAgICAgICJsb2NhbHRpbWV8cHJvdG90eXBlfGdldG5ldGVudHxlbmRuZXRlbnR8cmV3aW5kZGlyfHdhbnRhcnJheXxnZXRwd3VpZHwiICsKICAgICAgICAgImNsb3NlZGlyfGdldGxvZ2lufHJlYWRsaW5rfGVuZGdyZW50fGdldGdyZ2lkfGdldGdybmFtfHNobXdyaXRlfCIgKwogICAgICAgICAic2h1dGRvd258cmVhZGxpbmV8ZW5kcHdlbnR8c2V0Z3JlbnR8cmVhZHBpcGV8Zm9ybWxpbmV8dHJ1bmNhdGV8IiArCiAgICAgICAgICJkYm1jbG9zZXxzeXN3cml0ZXxzZXRwd2VudHxnZXRwd25hbXxnZXRncmVudHxnZXRwd2VudHx1Y2ZpcnN0fHN5c3JlYWR8IiArCiAgICAgICAgICJzZXRwZ3JwfHNobXJlYWR8c3lzc2Vla3xzeXNvcGVufHRlbGxkaXJ8ZGVmaW5lZHxvcGVuZGlyfGNvbm5lY3R8IiArCiAgICAgICAgICJsY2ZpcnN0fGdldHBwaWR8YmlubW9kZXxzeXNjYWxsfHNwcmludGZ8Z2V0cGdycHxyZWFkZGlyfHNlZWtkaXJ8IiArCiAgICAgICAgICJ3YWl0cGlkfHJldmVyc2V8dW5zaGlmdHxzeW1saW5rfGRibW9wZW58c2VtZ2V0fG1zZ3JjdnxyZW5hbWV8bGlzdGVufCIgKwogICAgICAgICAiY2hyb290fG1zZ3NuZHxzaG1jdGx8YWNjZXB0fHVucGFja3xleGlzdHN8ZmlsZW5vfHNobWdldHxzeXN0ZW18IiArCiAgICAgICAgICJ1bmxpbmt8cHJpbnRmfGdtdGltZXxtc2djdGx8c2VtY3RsfHZhbHVlc3xyaW5kZXh8c3Vic3RyfHNwbGljZXwiICsKICAgICAgICAgImxlbmd0aHxtc2dnZXR8c2VsZWN0fHNvY2tldHxyZXR1cm58Y2FsbGVyfGRlbGV0ZXxhbGFybXxpb2N0bHxpbmRleHwiICsKICAgICAgICAgInVuZGVmfGxzdGF0fHRpbWVzfHNyYW5kfGNob3dufGZjbnRsfGNsb3NlfHdyaXRlfHVtYXNrfHJtZGlyfHN0dWR5fCIgKwogICAgICAgICAic2xlZXB8Y2hvbXB8dW50aWV8cHJpbnR8dXRpbWV8bWtkaXJ8YXRhbjJ8c3BsaXR8Y3J5cHR8ZmxvY2t8Y2htb2R8IiArCiAgICAgICAgICJCRUdJTnxibGVzc3xjaGRpcnxzZW1vcHxzaGlmdHxyZXNldHxsaW5rfHN0YXR8Y2hvcHxncmVwfGZvcmt8ZHVtcHwiICsKICAgICAgICAgImpvaW58b3Blbnx0ZWxsfHBpcGV8ZXhpdHxnbG9ifHdhcm58ZWFjaHxiaW5kfHNvcnR8cGFja3xldmFsfHB1c2h8IiArCiAgICAgICAgICJrZXlzfGdldGN8a2lsbHxzZWVrfHNxcnR8c2VuZHx3YWl0fHJhbmR8dGllZHxyZWFkfHRpbWV8ZXhlY3xyZWN2fCIgKwogICAgICAgICAiZW9mfGNocnxpbnR8b3JkfGV4cHxwb3N8cG9wfHNpbnxsb2d8YWJzfG9jdHxoZXh8dGllfGNvc3x2ZWN8RU5EfHJlZnwiICsKICAgICAgICAgIm1hcHxkaWV8dWN8bGN8ZG8iKS5zcGxpdCgifCIpCiAgICApOwoKICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcy4gVXNlICg/OikgaW5zdGVhZC4KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQKCiAgICB0aGlzLiRydWxlcyA9IHsKICAgICAgICAic3RhcnQiIDogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIiMuKiQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZy5yZWdleHAiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiWy9dKD86KD86XFxbKD86XFxcXF18W15cXF1dKStcXF0pfCg/OlxcXFwvfFteXFxdL10pKSpbL11cXHcqXFxzKig/PVspLiw7XXwkKSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUKICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0CiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0uKlxcXFwkJywKICAgICAgICAgICAgICAgIG5leHQgOiAicXFzdHJpbmciCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydAogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddLipcXFxcJCIsCiAgICAgICAgICAgICAgICBuZXh0IDogInFzdHJpbmciCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBoZXgKICAgICAgICAgICAgICAgIHJlZ2V4IDogIjB4WzAtOWEtZkEtRl0rXFxiIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGtleXdvcmRzLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsZGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYnVpbHRpbkZ1bmN0aW9ucy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5mdW5jdGlvbiI7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImlkZW50aWZpZXIiOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC5cXC5cXC58XFx8XFx8PXw+Pj18PDw9fDw9PnwmJj18PT58IX58XFxePXwmPXxcXHw9fFxcLj18eD18JT18XFwvPXxcXCo9fFxcLT18XFwrPXw9fnxcXCpcXCp8XFwtXFwtfFxcLlxcLnxcXHxcXHx8JiZ8XFwrXFwrfFxcLT58IT18PT18Pj18PD18Pj58PDx8LHw9fFxcP1xcOnxcXF58XFx8fHh8JXxcXC98XFwqfDx8JnxcXFxcfH58IXw+fFxcLnxcXC18XFwrfFxcLUN8XFwtYnxcXC1TfFxcLXV8XFwtdHxcXC1wfFxcLWx8XFwtZHxcXC1mfFxcLWd8XFwtc3xcXC16fFxcLWt8XFwtZXxcXC1PfFxcLVR8XFwtQnxcXC1NfFxcLUF8XFwtWHxcXC1XfFxcLWN8XFwtUnxcXC1vfFxcLXh8XFwtd3xcXC1yfFxcYig/OmFuZHxjbXB8ZXF8Z2V8Z3R8bGV8bHR8bmV8bm90fG9yfHhvcikiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImxwYXJlbiIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJbWyh7XSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAicnBhcmVuIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIltcXF0pfV0iCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFxzKyIKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInFxc3RyaW5nIiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogJyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJywKICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKycKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInFzdHJpbmciIDogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqPyciLAogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJwogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfTsKfTsKCm9vcC5pbmhlcml0cyhQZXJsSGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7CgpleHBvcnRzLlBlcmxIaWdobGlnaHRSdWxlcyA9IFBlcmxIaWdobGlnaHRSdWxlczsKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOwoKdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gZnVuY3Rpb24oKSB7fTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKGxpbmUsIGlucHV0KSB7CiAgICAgICAgaWYgKCEgL15ccyskLy50ZXN0KGxpbmUpKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgIHJldHVybiAvXlxzKlx9Ly50ZXN0KGlucHV0KTsKICAgIH07CgogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKGRvYywgcm93KSB7CiAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShyb3cpOwogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMqXH0pLyk7CgogICAgICAgIGlmICghbWF0Y2gpIHJldHVybiAwOwoKICAgICAgICB2YXIgY29sdW1uID0gbWF0Y2hbMV0ubGVuZ3RoOwogICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBkb2MuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiByb3csIGNvbHVtbjogY29sdW1ufSk7CgogICAgICAgIGlmICghb3BlbkJyYWNlUG9zIHx8IG9wZW5CcmFjZVBvcy5yb3cgPT0gcm93KSByZXR1cm4gMDsKCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChkb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7CiAgICAgICAgZG9jLnJlcGxhY2UobmV3IFJhbmdlKHJvdywgMCwgcm93LCBjb2x1bW4tMSksIGluZGVudCk7CiAgICB9OwoKICAgIHRoaXMuJGdldEluZGVudCA9IGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKykvKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICIiOwogICAgfTsKCn0pLmNhbGwoTWF0Y2hpbmdCcmFjZU91dGRlbnQucHJvdG90eXBlKTsKCmV4cG9ydHMuTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBNYXRjaGluZ0JyYWNlT3V0ZGVudDsKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9yYW5nZScsICdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsKdmFyIEJhc2VGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGU7Cgp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsKb29wLmluaGVyaXRzKEZvbGRNb2RlLCBCYXNlRm9sZE1vZGUpOwoKKGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyID0gLyhce3xcWylbXlx9XF1dKiR8XlxzKihcL1wqKS87CiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gL15bXlxbXHtdKihcfXxcXSl8Xltcc1wqXSooXCpcLykvOwogICAgCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7CiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleDsKCiAgICAgICAgICAgIGlmIChtYXRjaFsxXSkKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soc2Vzc2lvbiwgbWF0Y2hbMV0sIHJvdywgaSk7CgogICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpICsgbWF0Y2hbMF0ubGVuZ3RoKTsKICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOwogICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoZm9sZFN0eWxlICE9PSAibWFya2JlZ2luZW5kIikKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIpOwogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoOwoKICAgICAgICAgICAgaWYgKG1hdGNoWzJdKSB7CiAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpKTsKICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsKICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGVuZCA9IHtyb3c6IHJvdywgY29sdW1uOiBpfTsKICAgICAgICAgICAgdmFyIHN0YXJ0ID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KG1hdGNoWzFdLCBlbmQpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKCFzdGFydCkKICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgICAgIHN0YXJ0LmNvbHVtbisrOwogICAgICAgICAgICBlbmQuY29sdW1uLS07CgogICAgICAgICAgICByZXR1cm4gIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7CiAgICAgICAgfQogICAgfTsKICAgIAp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7Cgp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7Cgp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG51bGw7CiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gbnVsbDsKCiAgICAvLyBtdXN0IHJldHVybiAiIiBpZiB0aGVyZSdzIG5vIGZvbGQsIHRvIGVuYWJsZSBjYWNoaW5nCiAgICB0aGlzLmdldEZvbGRXaWRnZXQgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgaWYgKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QobGluZSkpCiAgICAgICAgICAgIHJldHVybiAic3RhcnQiOwogICAgICAgIGlmIChmb2xkU3R5bGUgPT0gIm1hcmtiZWdpbmVuZCIKICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIKICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChsaW5lKSkKICAgICAgICAgICAgcmV0dXJuICJlbmQiOwogICAgICAgIHJldHVybiAiIjsKICAgIH07CiAgICAKICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH07CgogICAgdGhpcy5pbmRlbnRhdGlvbkJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgcm93LCBjb2x1bW4pIHsKICAgICAgICB2YXIgcmUgPSAvXlxzKi87CiAgICAgICAgdmFyIHN0YXJ0Um93ID0gcm93OwogICAgICAgIHZhciBlbmRSb3cgPSByb3c7CiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSBjb2x1bW4gfHwgbGluZS5sZW5ndGg7CiAgICAgICAgdmFyIHN0YXJ0TGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7CiAgICAgICAgdmFyIG1heFJvdyA9IHNlc3Npb24uZ2V0TGVuZ3RoKCkKICAgICAgICAKICAgICAgICB3aGlsZSAoKytyb3cgPCBtYXhSb3cpIHsKICAgICAgICAgICAgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOwogICAgICAgICAgICB2YXIgbGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7CgogICAgICAgICAgICBpZiAobGV2ZWwgPT0gbGluZS5sZW5ndGgpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgIGlmIChsZXZlbCA8PSBzdGFydExldmVsKQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBlbmRSb3cgPSByb3c7CiAgICAgICAgfQoKICAgICAgICBpZiAoZW5kUm93ID4gc3RhcnRSb3cpIHsKICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmRSb3cpLmxlbmd0aDsKICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShzdGFydFJvdywgc3RhcnRDb2x1bW4sIGVuZFJvdywgZW5kQ29sdW1uKTsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIGJyYWNrZXQsIHJvdywgY29sdW1uKSB7CiAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbiArIDF9OwogICAgICAgIHZhciBlbmQgPSBzZXNzaW9uLiRmaW5kQ2xvc2luZ0JyYWNrZXQoYnJhY2tldCwgc3RhcnQpOwogICAgICAgIGlmICghZW5kKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIHZhciBmdyA9IHNlc3Npb24uZm9sZFdpZGdldHNbZW5kLnJvd107CiAgICAgICAgaWYgKGZ3ID09IG51bGwpCiAgICAgICAgICAgIGZ3ID0gdGhpcy5nZXRGb2xkV2lkZ2V0KHNlc3Npb24sIGVuZC5yb3cpOwoKICAgICAgICBpZiAoZncgPT0gInN0YXJ0IikgewogICAgICAgICAgICBlbmQucm93IC0tOwogICAgICAgICAgICBlbmQuY29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZC5yb3cpLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7CiAgICB9OwoKfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOwoKfSk7CjsKICAgICAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkKICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkoKTsKICAgICAgICA=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-perl.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9wZXJsIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL3BlcmxfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsImFjZS9yYW5nZSIsImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3RleHQiKS5Nb2RlLGY9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGc9YSgiLi9wZXJsX2hpZ2hsaWdodF9ydWxlcyIpLlBlcmxIaWdobGlnaHRSdWxlcyxoPWEoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50LGk9YSgiLi4vcmFuZ2UiKS5SYW5nZSxqPWEoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZSxrPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSksdGhpcy4kb3V0ZGVudD1uZXcgaCx0aGlzLmZvbGRpbmdSdWxlcz1uZXcgan07ZC5pbmhlcml0cyhrLGUpLGZ1bmN0aW9uKCl7dGhpcy50b2dnbGVDb21tZW50TGluZXM9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ITAsZj0vXihccyopIy87Zm9yKHZhciBnPWM7Zzw9ZDtnKyspaWYoIWYudGVzdChiLmdldExpbmUoZykpKXtlPSExO2JyZWFrfWlmKGUpe3ZhciBoPW5ldyBpKDAsMCwwLDApO2Zvcih2YXIgZz1jO2c8PWQ7ZysrKXt2YXIgaj1iLmdldExpbmUoZyksaz1qLm1hdGNoKGYpO2guc3RhcnQucm93PWcsaC5lbmQucm93PWcsaC5lbmQuY29sdW1uPWtbMF0ubGVuZ3RoLGIucmVwbGFjZShoLGtbMV0pfX1lbHNlIGIuaW5kZW50Um93cyhjLGQsIiMiKX0sdGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy4kZ2V0SW5kZW50KGIpLGU9dGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMoYixhKSxmPWUudG9rZW5zO2lmKGYubGVuZ3RoJiZmW2YubGVuZ3RoLTFdLnR5cGU9PSJjb21tZW50IilyZXR1cm4gZDtpZihhPT0ic3RhcnQiKXt2YXIgZz1iLm1hdGNoKC9eLipbXHtcKFxbXDpdXHMqJC8pO2cmJihkKz1jKX1yZXR1cm4gZH0sdGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChiLGMpfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGEsYixjKXt0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGIsYyl9fS5jYWxsKGsucHJvdG90eXBlKSxiLk1vZGU9a30pLGRlZmluZSgiYWNlL21vZGUvcGVybF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxnPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKCJiYXNlfGNvbnN0YW50fGNvbnRpbnVlfGVsc2V8ZWxzaWZ8Zm9yfGZvcmVhY2h8Zm9ybWF0fGdvdG98aWZ8bGFzdHxsb2NhbHxteXxuZXh0fG5vfHBhY2thZ2V8cGFyZW50fHJlZG98cmVxdWlyZXxzY2FsYXJ8c3VifHVubGVzc3x1bnRpbHx3aGlsZXx1c2V8dmFycyIuc3BsaXQoInwiKSksYj1lLmFycmF5VG9NYXAoIkFSR1Z8RU5WfElOQ3xTSUciLnNwbGl0KCJ8IikpLGM9ZS5hcnJheVRvTWFwKCJnZXRwcm90b2J5bnVtYmVyfGdldHByb3RvYnluYW1lfGdldHNlcnZieW5hbWV8Z2V0aG9zdGJ5YWRkcnxnZXRob3N0YnluYW1lfGdldHNlcnZieXBvcnR8Z2V0bmV0YnlhZGRyfGdldG5ldGJ5bmFtZXxnZXRzb2NrbmFtZXxnZXRwZWVybmFtZXxzZXRwcmlvcml0eXxnZXRwcm90b2VudHxzZXRwcm90b2VudHxnZXRwcmlvcml0eXxlbmRwcm90b2VudHxnZXRzZXJ2ZW50fHNldHNlcnZlbnR8ZW5kc2VydmVudHxzZXRob3N0ZW50fHNvY2tldHBhaXJ8Z2V0c29ja29wdHxnZXRob3N0ZW50fGVuZGhvc3RlbnR8c2V0c29ja29wdHxzZXRuZXRlbnR8cXVvdGVtZXRhfGxvY2FsdGltZXxwcm90b3R5cGV8Z2V0bmV0ZW50fGVuZG5ldGVudHxyZXdpbmRkaXJ8d2FudGFycmF5fGdldHB3dWlkfGNsb3NlZGlyfGdldGxvZ2lufHJlYWRsaW5rfGVuZGdyZW50fGdldGdyZ2lkfGdldGdybmFtfHNobXdyaXRlfHNodXRkb3dufHJlYWRsaW5lfGVuZHB3ZW50fHNldGdyZW50fHJlYWRwaXBlfGZvcm1saW5lfHRydW5jYXRlfGRibWNsb3NlfHN5c3dyaXRlfHNldHB3ZW50fGdldHB3bmFtfGdldGdyZW50fGdldHB3ZW50fHVjZmlyc3R8c3lzcmVhZHxzZXRwZ3JwfHNobXJlYWR8c3lzc2Vla3xzeXNvcGVufHRlbGxkaXJ8ZGVmaW5lZHxvcGVuZGlyfGNvbm5lY3R8bGNmaXJzdHxnZXRwcGlkfGJpbm1vZGV8c3lzY2FsbHxzcHJpbnRmfGdldHBncnB8cmVhZGRpcnxzZWVrZGlyfHdhaXRwaWR8cmV2ZXJzZXx1bnNoaWZ0fHN5bWxpbmt8ZGJtb3BlbnxzZW1nZXR8bXNncmN2fHJlbmFtZXxsaXN0ZW58Y2hyb290fG1zZ3NuZHxzaG1jdGx8YWNjZXB0fHVucGFja3xleGlzdHN8ZmlsZW5vfHNobWdldHxzeXN0ZW18dW5saW5rfHByaW50ZnxnbXRpbWV8bXNnY3RsfHNlbWN0bHx2YWx1ZXN8cmluZGV4fHN1YnN0cnxzcGxpY2V8bGVuZ3RofG1zZ2dldHxzZWxlY3R8c29ja2V0fHJldHVybnxjYWxsZXJ8ZGVsZXRlfGFsYXJtfGlvY3RsfGluZGV4fHVuZGVmfGxzdGF0fHRpbWVzfHNyYW5kfGNob3dufGZjbnRsfGNsb3NlfHdyaXRlfHVtYXNrfHJtZGlyfHN0dWR5fHNsZWVwfGNob21wfHVudGllfHByaW50fHV0aW1lfG1rZGlyfGF0YW4yfHNwbGl0fGNyeXB0fGZsb2NrfGNobW9kfEJFR0lOfGJsZXNzfGNoZGlyfHNlbW9wfHNoaWZ0fHJlc2V0fGxpbmt8c3RhdHxjaG9wfGdyZXB8Zm9ya3xkdW1wfGpvaW58b3Blbnx0ZWxsfHBpcGV8ZXhpdHxnbG9ifHdhcm58ZWFjaHxiaW5kfHNvcnR8cGFja3xldmFsfHB1c2h8a2V5c3xnZXRjfGtpbGx8c2Vla3xzcXJ0fHNlbmR8d2FpdHxyYW5kfHRpZWR8cmVhZHx0aW1lfGV4ZWN8cmVjdnxlb2Z8Y2hyfGludHxvcmR8ZXhwfHBvc3xwb3B8c2lufGxvZ3xhYnN8b2N0fGhleHx0aWV8Y29zfHZlY3xFTkR8cmVmfG1hcHxkaWV8dWN8bGN8ZG8iLnNwbGl0KCJ8IikpO3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiIy4qJCJ9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6IlsvXSg/Oig/OlxcWyg/OlxcXFxdfFteXFxdXSkrXFxdKXwoPzpcXFxcL3xbXlxcXS9dKSkqWy9dXFx3KlxccyooPz1bKS4sO118JCkifSx7dG9rZW46InN0cmluZyIscmVnZXg6J1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nfSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6J1siXS4qXFxcXCQnLG5leHQ6InFxc3RyaW5nIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIn0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiJbJ10uKlxcXFwkIixuZXh0OiJxc3RyaW5nIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiMHhbMC05YS1mQS1GXStcXGIifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiJ9LHt0b2tlbjpmdW5jdGlvbihkKXtyZXR1cm4gYS5oYXNPd25Qcm9wZXJ0eShkKT8ia2V5d29yZCI6Yi5oYXNPd25Qcm9wZXJ0eShkKT8iY29uc3RhbnQubGFuZ3VhZ2UiOmMuaGFzT3duUHJvcGVydHkoZCk/InN1cHBvcnQuZnVuY3Rpb24iOiJpZGVudGlmaWVyIn0scmVnZXg6IlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiJ9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcLlxcLlxcLnxcXHxcXHw9fD4+PXw8PD18PD0+fCYmPXw9PnwhfnxcXF49fCY9fFxcfD18XFwuPXx4PXwlPXxcXC89fFxcKj18XFwtPXxcXCs9fD1+fFxcKlxcKnxcXC1cXC18XFwuXFwufFxcfFxcfHwmJnxcXCtcXCt8XFwtPnwhPXw9PXw+PXw8PXw+Pnw8PHwsfD18XFw/XFw6fFxcXnxcXHx8eHwlfFxcL3xcXCp8PHwmfFxcXFx8fnwhfD58XFwufFxcLXxcXCt8XFwtQ3xcXC1ifFxcLVN8XFwtdXxcXC10fFxcLXB8XFwtbHxcXC1kfFxcLWZ8XFwtZ3xcXC1zfFxcLXp8XFwta3xcXC1lfFxcLU98XFwtVHxcXC1CfFxcLU18XFwtQXxcXC1YfFxcLVd8XFwtY3xcXC1SfFxcLW98XFwteHxcXC13fFxcLXJ8XFxiKD86YW5kfGNtcHxlcXxnZXxndHxsZXxsdHxuZXxub3R8b3J8eG9yKSJ9LHt0b2tlbjoibHBhcmVuIixyZWdleDoiW1soe10ifSx7dG9rZW46InJwYXJlbiIscmVnZXg6IltcXF0pfV0ifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn1dLHFxc3RyaW5nOlt7dG9rZW46InN0cmluZyIscmVnZXg6Jyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJyxuZXh0OiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV0scXN0cmluZzpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OiIoPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/JyIsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfX07ZC5pbmhlcml0cyhnLGYpLGIuUGVybEhpZ2hsaWdodFJ1bGVzPWd9KSxkZWZpbmUoImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3JhbmdlIikuUmFuZ2UsZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuL15ccyskLy50ZXN0KGEpPy9eXHMqXH0vLnRlc3QoYik6ITF9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldExpbmUoYiksZT1jLm1hdGNoKC9eKFxzKlx9KS8pO2lmKCFlKXJldHVybiAwO3ZhciBmPWVbMV0ubGVuZ3RoLGc9YS5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6Yixjb2x1bW46Zn0pO2lmKCFnfHxnLnJvdz09YilyZXR1cm4gMDt2YXIgaD10aGlzLiRnZXRJbmRlbnQoYS5nZXRMaW5lKGcucm93KSk7YS5yZXBsYWNlKG5ldyBkKGIsMCxiLGYtMSksaCl9LHRoaXMuJGdldEluZGVudD1mdW5jdGlvbihhKXt2YXIgYj1hLm1hdGNoKC9eKFxzKykvKTtyZXR1cm4gYj9iWzFdOiIifX0pKS5jYWxsKGUucHJvdG90eXBlKSxiLk1hdGNoaW5nQnJhY2VPdXRkZW50PWV9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvcmFuZ2UiLCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxmPWEoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGUsZz1iLkZvbGRNb2RlPWZ1bmN0aW9uKCl7fTtkLmluaGVyaXRzKGcsZiksZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj0vKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLyx0aGlzLmZvbGRpbmdTdG9wTWFya2VyPS9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLyx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpLGY9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7aWYoZil7dmFyIGc9Zi5pbmRleDtpZihmWzFdKXJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soYSxmWzFdLGMsZyk7dmFyIGg9YS5nZXRDb21tZW50Rm9sZFJhbmdlKGMsZytmWzBdLmxlbmd0aCk7cmV0dXJuIGguZW5kLmNvbHVtbi09MixofWlmKGIhPT0ibWFya2JlZ2luZW5kIilyZXR1cm47dmFyIGY9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTtpZihmKXt2YXIgZz1mLmluZGV4K2ZbMF0ubGVuZ3RoO2lmKGZbMl0pe3ZhciBoPWEuZ2V0Q29tbWVudEZvbGRSYW5nZShjLGcpO3JldHVybiBoLmVuZC5jb2x1bW4tPTIsaH12YXIgaT17cm93OmMsY29sdW1uOmd9LGo9YS4kZmluZE9wZW5pbmdCcmFja2V0KGZbMV0saSk7aWYoIWopcmV0dXJuO3JldHVybiBqLmNvbHVtbisrLGkuY29sdW1uLS0sZS5mcm9tUG9pbnRzKGosaSl9fX0uY2FsbChnLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGU9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPW51bGwsdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj1udWxsLHRoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpO3JldHVybiB0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGQpPyJzdGFydCI6Yj09Im1hcmtiZWdpbmVuZCImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChkKT8iZW5kIjoiIn0sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBudWxsfSx0aGlzLmluZGVudGF0aW9uQmxvY2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPS9eXHMqLyxmPWIsZz1iLGg9YS5nZXRMaW5lKGIpLGk9Y3x8aC5sZW5ndGgsaj1oLm1hdGNoKGUpWzBdLmxlbmd0aCxrPWEuZ2V0TGVuZ3RoKCk7d2hpbGUoKytiPGspe2g9YS5nZXRMaW5lKGIpO3ZhciBsPWgubWF0Y2goZSlbMF0ubGVuZ3RoO2lmKGw9PWgubGVuZ3RoKWNvbnRpbnVlO2lmKGw8PWopYnJlYWs7Zz1ifWlmKGc+Zil7dmFyIG09YS5nZXRMaW5lKGcpLmxlbmd0aDtyZXR1cm4gbmV3IGQoZixpLGcsbSl9fSx0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2s9ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGY9e3JvdzpjLGNvbHVtbjplKzF9LGc9YS4kZmluZENsb3NpbmdCcmFja2V0KGIsZik7aWYoIWcpcmV0dXJuO3ZhciBoPWEuZm9sZFdpZGdldHNbZy5yb3ddO3JldHVybiBoPT1udWxsJiYoaD10aGlzLmdldEZvbGRXaWRnZXQoYSxnLnJvdykpLGg9PSJzdGFydCImJihnLnJvdy0tLGcuY29sdW1uPWEuZ2V0TGluZShnLnJvdykubGVuZ3RoKSxkLmZyb21Qb2ludHMoZixnKX19KSkuY2FsbChlLnByb3RvdHlwZSl9KSxmdW5jdGlvbigpe3dpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLGZ1bmN0aW9uKGEpe3dpbmRvdy5hY2V8fCh3aW5kb3cuYWNlPXt9KTtmb3IodmFyIGIgaW4gYSlhLmhhc093blByb3BlcnR5KGIpJiYoYWNlW2JdPWFbYl0pfSl9KCk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-pgsql-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgoqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgoqCiogQ29udHJpYnV0b3Iocyk6CiogICAgICBKb25hdGhhbiBDYW1pbGUgPGpvbmF0aGFuLmNhbWlsZSBBVCBnbWFpbCBET1QgY29tPgoqCiogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAoqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwoqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQoqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgoqCiogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvcGdzcWwnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHQnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS9wZ3NxbF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoKICAgIHZhciBvb3AgPSByZXF1aXJlKCJhY2UvbGliL29vcCIpOwogICAgdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiYWNlL21vZGUvdGV4dCIpLk1vZGU7CiAgICB2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiYWNlL3Rva2VuaXplciIpLlRva2VuaXplcjsKICAgIHZhciBQZ3NxbEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiYWNlL21vZGUvcGdzcWxfaGlnaGxpZ2h0X3J1bGVzIikuUGdzcWxIaWdobGlnaHRSdWxlczsKICAgIHZhciBSYW5nZSA9IHJlcXVpcmUoImFjZS9yYW5nZSIpLlJhbmdlOwogICAgLy8gdmFyIEVkaXRTZXNzaW9uID0gcmVxdWlyZSgiYWNlL2VkaXRfc2Vzc2lvbiIpLkVkaXRTZXNzaW9uOwoKICAgIHZhciBNb2RlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgUGdzcWxIaWdobGlnaHRSdWxlcygpLmdldFJ1bGVzKCkpOwogICAgfTsKICAgIG9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7CgogICAgKGZ1bmN0aW9uKCkgewoKICAgICAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpIHsKICAgICAgICAgICAgdmFyIG91dGRlbnQgPSB0cnVlOwogICAgICAgICAgICAvLyB2YXIgb3V0ZW50ZWRSb3dzID0gW107CiAgICAgICAgICAgIHZhciByZSA9IC9eKFxzKiktLS87CgogICAgICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspIHsKICAgICAgICAgICAgICAgIGlmICghcmUudGVzdChkb2MuZ2V0TGluZShpKSkpIHsKICAgICAgICAgICAgICAgICAgICBvdXRkZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChvdXRkZW50KSB7CiAgICAgICAgICAgICAgICB2YXIgZGVsZXRlUmFuZ2UgPSBuZXcgUmFuZ2UoMCwgMCwgMCwgMCk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShpKTsKICAgICAgICAgICAgICAgICAgICB2YXIgbSA9IGxpbmUubWF0Y2gocmUpOwogICAgICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLnN0YXJ0LnJvdyA9IGk7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLnJvdyA9IGk7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLmNvbHVtbiA9IG1bMF0ubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGRvYy5yZXBsYWNlKGRlbGV0ZVJhbmdlLCBtWzFdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGRvYy5pbmRlbnRSb3dzKHN0YXJ0Um93LCBlbmRSb3csICItLSIpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCgogICAgICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7IAogICAgICAgICAgICBpZiAoc3RhdGUgPT0gInN0YXJ0IiB8fCBzdGF0ZSA9PSAia2V5d29yZC5zdGF0ZW1lbnRFbmQiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kZ2V0SW5kZW50KGxpbmUpOyAvLyBLZWVwIHdoYXRldmVyIGluZGVudCB0aGUgcHJldmlvdXMgbGluZSBoYXMKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsKCiAgICBleHBvcnRzLk1vZGUgPSBNb2RlOwp9KTsKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgSm9obiBEZVNvaSwgUGguRC4gPGRlc29pIEFUIHBnZWRpdCBET1QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKgogKgogKi8KCgpkZWZpbmUoJ2FjZS9tb2RlL3Bnc3FsX2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9sYW5nJywgJ2FjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9wZXJsX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9weXRob25faGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoKdmFyIG9vcCA9IHJlcXVpcmUoImFjZS9saWIvb29wIik7CnZhciBsYW5nID0gcmVxdWlyZSgiYWNlL2xpYi9sYW5nIik7CnZhciBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIpLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsKdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7Ci8vIFN1cHBvcnRpbmcgcGVybCBhbmQgcHl0aG9uIGZvciBub3cgLS0gYm90aCBpbiBwZyBjb3JlIGFuZCBhY2UKdmFyIFBlcmxIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vcGVybF9oaWdobGlnaHRfcnVsZXMiKS5QZXJsSGlnaGxpZ2h0UnVsZXM7CnZhciBQeXRob25IaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vcHl0aG9uX2hpZ2hsaWdodF9ydWxlcyIpLlB5dGhvbkhpZ2hsaWdodFJ1bGVzOwoKdmFyIFBnc3FsSGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsKICAgIAogICAgLy8gS2V5d29yZHMsIGZ1bmN0aW9ucywgb3BlcmF0b3JzIGxhc3QgdXBkYXRlZCBmb3IgcGcgOS4xLgogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgiYWJvcnR8YWJzb2x1dGV8YWJzdGltZXxhY2Nlc3N8YWNsaXRlbXxhY3Rpb258YWRkfGFkbWlufGFmdGVyfGFnZ3JlZ2F0ZXxhbGx8YWxzb3xhbHRlcnxhbHdheXN8IiArCiAgICAgICAgImFuYWx5c2V8YW5hbHl6ZXxhbmR8YW55fGFueWFycmF5fGFueWVsZW1lbnR8YW55ZW51bXxhbnlub25hcnJheXxhcnJheXxhc3xhc2N8YXNzZXJ0aW9ufCIgKwogICAgICAgICJhc3NpZ25tZW50fGFzeW1tZXRyaWN8YXR8YXR0cmlidXRlfGF1dGhvcml6YXRpb258YmFja3dhcmR8YmVmb3JlfGJlZ2lufGJldHdlZW58YmlnaW50fCIgKwogICAgICAgICJiaW5hcnl8Yml0fGJvb2x8Ym9vbGVhbnxib3RofGJveHxicGNoYXJ8Ynl8Ynl0ZWF8Y2FjaGV8Y2FsbGVkfGNhc2NhZGV8Y2FzY2FkZWR8Y2FzZXxjYXN0fCIgKwogICAgICAgICJjYXRhbG9nfGNoYWlufGNoYXJ8Y2hhcmFjdGVyfGNoYXJhY3RlcmlzdGljc3xjaGVja3xjaGVja3BvaW50fGNpZHxjaWRyfGNpcmNsZXxjbGFzc3xjbG9zZXwiICsKICAgICAgICAiY2x1c3Rlcnxjb2FsZXNjZXxjb2xsYXRlfGNvbGxhdGlvbnxjb2x1bW58Y29tbWVudHxjb21tZW50c3xjb21taXR8Y29tbWl0dGVkfGNvbmN1cnJlbnRseXwiICsKICAgICAgICAiY29uZmlndXJhdGlvbnxjb25uZWN0aW9ufGNvbnN0cmFpbnR8Y29uc3RyYWludHN8Y29udGVudHxjb250aW51ZXxjb252ZXJzaW9ufGNvcHl8Y29zdHwiICsKICAgICAgICAiY3JlYXRlfGNyb3NzfGNzdHJpbmd8Y3N2fGN1cnJlbnR8Y3VycmVudF9jYXRhbG9nfGN1cnJlbnRfZGF0ZXxjdXJyZW50X3JvbGV8IiArCiAgICAgICAgImN1cnJlbnRfc2NoZW1hfGN1cnJlbnRfdGltZXxjdXJyZW50X3RpbWVzdGFtcHxjdXJyZW50X3VzZXJ8Y3Vyc29yfGN5Y2xlfGRhdGF8ZGF0YWJhc2V8IiArCiAgICAgICAgImRhdGV8ZGF5fGRlYWxsb2NhdGV8ZGVjfGRlY2ltYWx8ZGVjbGFyZXxkZWZhdWx0fGRlZmF1bHRzfGRlZmVycmFibGV8ZGVmZXJyZWR8ZGVmaW5lcnxkZWxldGV8IiArCiAgICAgICAgImRlbGltaXRlcnxkZWxpbWl0ZXJzfGRlc2N8ZGljdGlvbmFyeXxkaXNhYmxlfGRpc2NhcmR8ZGlzdGluY3R8ZG98ZG9jdW1lbnR8ZG9tYWlufGRvdWJsZXwiICsKICAgICAgICAiZHJvcHxlYWNofGVsc2V8ZW5hYmxlfGVuY29kaW5nfGVuY3J5cHRlZHxlbmR8ZW51bXxlc2NhcGV8ZXhjZXB0fGV4Y2x1ZGV8ZXhjbHVkaW5nfGV4Y2x1c2l2ZXwiICsKICAgICAgICAiZXhlY3V0ZXxleGlzdHN8ZXhwbGFpbnxleHRlbnNpb258ZXh0ZXJuYWx8ZXh0cmFjdHxmYWxzZXxmYW1pbHl8ZmR3X2hhbmRsZXJ8ZmV0Y2h8Zmlyc3R8IiArCiAgICAgICAgImZsb2F0fGZsb2F0NHxmbG9hdDh8Zm9sbG93aW5nfGZvcnxmb3JjZXxmb3JlaWdufGZvcndhcmR8ZnJlZXplfGZyb218ZnVsbHxmdW5jdGlvbnxmdW5jdGlvbnN8IiArCiAgICAgICAgImdsb2JhbHxncmFudHxncmFudGVkfGdyZWF0ZXN0fGdyb3VwfGd0c3ZlY3RvcnxoYW5kbGVyfGhhdmluZ3xoZWFkZXJ8aG9sZHxob3VyfGlkZW50aXR5fGlmfCIgKwogICAgICAgICJpbGlrZXxpbW1lZGlhdGV8aW1tdXRhYmxlfGltcGxpY2l0fGlufGluY2x1ZGluZ3xpbmNyZW1lbnR8aW5kZXh8aW5kZXhlc3xpbmV0fGluaGVyaXR8IiArCiAgICAgICAgImluaGVyaXRzfGluaXRpYWxseXxpbmxpbmV8aW5uZXJ8aW5vdXR8aW5wdXR8aW5zZW5zaXRpdmV8aW5zZXJ0fGluc3RlYWR8aW50fGludDJ8aW50MnZlY3RvcnwiICsKICAgICAgICAiaW50NHxpbnQ4fGludGVnZXJ8aW50ZXJuYWx8aW50ZXJzZWN0fGludGVydmFsfGludG98aW52b2tlcnxpc3xpc251bGx8aXNvbGF0aW9ufGpvaW58a2V5fGxhYmVsfCIgKwogICAgICAgICJsYW5ndWFnZXxsYW5ndWFnZV9oYW5kbGVyfGxhcmdlfGxhc3R8bGNfY29sbGF0ZXxsY19jdHlwZXxsZWFkaW5nfGxlYXN0fGxlZnR8bGV2ZWx8bGlrZXwiICsKICAgICAgICAibGltaXR8bGluZXxsaXN0ZW58bG9hZHxsb2NhbHxsb2NhbHRpbWV8bG9jYWx0aW1lc3RhbXB8bG9jYXRpb258bG9ja3xsc2VnfG1hY2FkZHJ8bWFwcGluZ3wiICsKICAgICAgICAibWF0Y2h8bWF4dmFsdWV8bWludXRlfG1pbnZhbHVlfG1vZGV8bW9uZXl8bW9udGh8bW92ZXxuYW1lfG5hbWVzfG5hdGlvbmFsfG5hdHVyYWx8bmNoYXJ8bmV4dHxub3wiICsKICAgICAgICAibm9uZXxub3R8bm90aGluZ3xub3RpZnl8bm90bnVsbHxub3dhaXR8bnVsbHxudWxsaWZ8bnVsbHN8bnVtZXJpY3xvYmplY3R8b2Z8b2ZmfG9mZnNldHxvaWR8b2lkc3wiICsKICAgICAgICAib2lkdmVjdG9yfG9ufG9ubHl8b3BhcXVlfG9wZXJhdG9yfG9wdGlvbnxvcHRpb25zfG9yfG9yZGVyfG91dHxvdXRlcnxvdmVyfG92ZXJsYXBzfG92ZXJsYXl8IiArCiAgICAgICAgIm93bmVkfG93bmVyfHBhcnNlcnxwYXJ0aWFsfHBhcnRpdGlvbnxwYXNzaW5nfHBhc3N3b3JkfHBhdGh8cGdfYXR0cmlidXRlfHBnX2F1dGhfbWVtYmVyc3wiICsKICAgICAgICAicGdfYXV0aGlkfHBnX2NsYXNzfHBnX2RhdGFiYXNlfHBnX25vZGVfdHJlZXxwZ19wcm9jfHBnX3R5cGV8cGxhY2luZ3xwbGFuc3xwb2ludHxwb2x5Z29ufCIgKwogICAgICAgICJwb3NpdGlvbnxwcmVjZWRpbmd8cHJlY2lzaW9ufHByZXBhcmV8cHJlcGFyZWR8cHJlc2VydmV8cHJpbWFyeXxwcmlvcnxwcml2aWxlZ2VzfCIgKwogICAgICAgICJwcm9jZWR1cmFsfHByb2NlZHVyZXxxdW90ZXxyYW5nZXxyZWFkfHJlYWx8cmVhc3NpZ258cmVjaGVja3xyZWNvcmR8cmVjdXJzaXZlfHJlZnxyZWZjdXJzb3J8IiArCiAgICAgICAgInJlZmVyZW5jZXN8cmVnY2xhc3N8cmVnY29uZmlnfHJlZ2RpY3Rpb25hcnl8cmVnb3BlcnxyZWdvcGVyYXRvcnxyZWdwcm9jfHJlZ3Byb2NlZHVyZXwiICsKICAgICAgICAicmVndHlwZXxyZWluZGV4fHJlbGF0aXZlfHJlbGVhc2V8cmVsdGltZXxyZW5hbWV8cmVwZWF0YWJsZXxyZXBsYWNlfHJlcGxpY2F8cmVzZXR8cmVzdGFydHwiICsKICAgICAgICAicmVzdHJpY3R8cmV0dXJuaW5nfHJldHVybnN8cmV2b2tlfHJpZ2h0fHJvbGV8cm9sbGJhY2t8cm93fHJvd3N8cnVsZXxzYXZlcG9pbnR8c2NoZW1hfHNjcm9sbHwiICsKICAgICAgICAic2VhcmNofHNlY29uZHxzZWN1cml0eXxzZWxlY3R8c2VxdWVuY2V8c2VxdWVuY2VzfHNlcmlhbGl6YWJsZXxzZXJ2ZXJ8c2Vzc2lvbnxzZXNzaW9uX3VzZXJ8IiArCiAgICAgICAgInNldHxzZXRvZnxzaGFyZXxzaG93fHNpbWlsYXJ8c2ltcGxlfHNtYWxsaW50fHNtZ3J8c29tZXxzdGFibGV8c3RhbmRhbG9uZXxzdGFydHxzdGF0ZW1lbnR8IiArCiAgICAgICAgInN0YXRpc3RpY3N8c3RkaW58c3Rkb3V0fHN0b3JhZ2V8c3RyaWN0fHN0cmlwfHN1YnN0cmluZ3xzeW1tZXRyaWN8c3lzaWR8c3lzdGVtfHRhYmxlfHRhYmxlc3wiICsKICAgICAgICAidGFibGVzcGFjZXx0ZW1wfHRlbXBsYXRlfHRlbXBvcmFyeXx0ZXh0fHRoZW58dGlkfHRpbWV8dGltZXN0YW1wfHRpbWVzdGFtcHR6fHRpbWV0enwiICsKICAgICAgICAidGludGVydmFsfHRvfHRyYWlsaW5nfHRyYW5zYWN0aW9ufHRyZWF0fHRyaWdnZXJ8dHJpbXx0cnVlfHRydW5jYXRlfHRydXN0ZWR8dHNxdWVyeXx0c3ZlY3RvcnwiICsKICAgICAgICAidHhpZF9zbmFwc2hvdHx0eXBlfHVuYm91bmRlZHx1bmNvbW1pdHRlZHx1bmVuY3J5cHRlZHx1bmlvbnx1bmlxdWV8dW5rbm93bnx1bmxpc3RlbnwiICsKICAgICAgICAidW5sb2dnZWR8dW50aWx8dXBkYXRlfHVzZXJ8dXNpbmd8dXVpZHx2YWN1dW18dmFsaWR8dmFsaWRhdGV8dmFsaWRhdG9yfHZhbHVlfHZhbHVlc3x2YXJiaXR8IiArCiAgICAgICAgInZhcmNoYXJ8dmFyaWFkaWN8dmFyeWluZ3x2ZXJib3NlfHZlcnNpb258dmlld3x2b2lkfHZvbGF0aWxlfHdoZW58d2hlcmV8d2hpdGVzcGFjZXx3aW5kb3d8IiArCiAgICAgICAgIndpdGh8d2l0aG91dHx3b3JrfHdyYXBwZXJ8d3JpdGV8eGlkfHhtbHx4bWxhdHRyaWJ1dGVzfHhtbGNvbmNhdHx4bWxlbGVtZW50fHhtbGV4aXN0c3wiICsKICAgICAgICAieG1sZm9yZXN0fHhtbHBhcnNlfHhtbHBpfHhtbHJvb3R8eG1sc2VyaWFsaXplfHllYXJ8eWVzfHpvbmUiKS5zcGxpdCgifCIpCiAgICApOwogICAgCiAgICAKICAgIHZhciBidWlsdGluRnVuY3Rpb25zID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgiUklfRktleV9jYXNjYWRlX2RlbHxSSV9GS2V5X2Nhc2NhZGVfdXBkfFJJX0ZLZXlfY2hlY2tfaW5zfFJJX0ZLZXlfY2hlY2tfdXBkfCIgKwogICAgICAgICJSSV9GS2V5X25vYWN0aW9uX2RlbHxSSV9GS2V5X25vYWN0aW9uX3VwZHxSSV9GS2V5X3Jlc3RyaWN0X2RlbHxSSV9GS2V5X3Jlc3RyaWN0X3VwZHwiICsKICAgICAgICAiUklfRktleV9zZXRkZWZhdWx0X2RlbHxSSV9GS2V5X3NldGRlZmF1bHRfdXBkfFJJX0ZLZXlfc2V0bnVsbF9kZWx8IiArCiAgICAgICAgIlJJX0ZLZXlfc2V0bnVsbF91cGR8YWJicmV2fGFic3xhYnN0aW1lfGFic3RpbWVlcXxhYnN0aW1lZ2V8YWJzdGltZWd0fGFic3RpbWVpbnxhYnN0aW1lbGV8IiArCiAgICAgICAgImFic3RpbWVsdHxhYnN0aW1lbmV8YWJzdGltZW91dHxhYnN0aW1lcmVjdnxhYnN0aW1lc2VuZHxhY2xjb250YWluc3xhY2xleHBsb2RlfGFjbGluc2VydHwiICsKICAgICAgICAiYWNsaXRlbWVxfGFjbGl0ZW1pbnxhY2xpdGVtb3V0fGFjbHJlbW92ZXxhY29zfGFnZXxhbnlfaW58YW55X291dHxhbnlhcnJheV9pbnxhbnlhcnJheV9vdXR8IiArCiAgICAgICAgImFueWFycmF5X3JlY3Z8YW55YXJyYXlfc2VuZHxhbnllbGVtZW50X2lufGFueWVsZW1lbnRfb3V0fGFueWVudW1faW58YW55ZW51bV9vdXR8IiArCiAgICAgICAgImFueW5vbmFycmF5X2lufGFueW5vbmFycmF5X291dHxhbnl0ZXh0Y2F0fGFyZWF8YXJlYWpvaW5zZWx8YXJlYXNlbHxhcnJheV9hZ2d8IiArCiAgICAgICAgImFycmF5X2FnZ19maW5hbGZufGFycmF5X2FnZ190cmFuc2ZufGFycmF5X2FwcGVuZHxhcnJheV9jYXR8YXJyYXlfZGltc3xhcnJheV9lcXwiICsKICAgICAgICAiYXJyYXlfZmlsbHxhcnJheV9nZXxhcnJheV9ndHxhcnJheV9pbnxhcnJheV9sYXJnZXJ8YXJyYXlfbGV8YXJyYXlfbGVuZ3RofGFycmF5X2xvd2VyfCIgKwogICAgICAgICJhcnJheV9sdHxhcnJheV9uZGltc3xhcnJheV9uZXxhcnJheV9vdXR8YXJyYXlfcHJlcGVuZHxhcnJheV9yZWN2fGFycmF5X3NlbmR8IiArCiAgICAgICAgImFycmF5X3NtYWxsZXJ8YXJyYXlfdG9fc3RyaW5nfGFycmF5X3VwcGVyfGFycmF5Y29udGFpbmVkfGFycmF5Y29udGFpbnN8YXJyYXlvdmVybGFwfCIgKwogICAgICAgICJhc2NpaXxhc2NpaV90b19taWN8YXNjaWlfdG9fdXRmOHxhc2lufGF0YW58YXRhbjJ8YXZnfGJpZzVfdG9fZXVjX3R3fGJpZzVfdG9fbWljfCIgKwogICAgICAgICJiaWc1X3RvX3V0Zjh8Yml0X2FuZHxiaXRfaW58Yml0X2xlbmd0aHxiaXRfb3J8Yml0X291dHxiaXRfcmVjdnxiaXRfc2VuZHxiaXRhbmR8Yml0Y2F0fCIgKwogICAgICAgICJiaXRjbXB8Yml0ZXF8Yml0Z2V8Yml0Z3R8Yml0bGV8Yml0bHR8Yml0bmV8Yml0bm90fGJpdG9yfGJpdHNoaWZ0bGVmdHxiaXRzaGlmdHJpZ2h0fCIgKwogICAgICAgICJiaXR0eXBtb2RpbnxiaXR0eXBtb2RvdXR8Yml0eG9yfGJvb2x8Ym9vbF9hbmR8Ym9vbF9vcnxib29sYW5kX3N0YXRlZnVuY3xib29sZXF8Ym9vbGdlfCIgKwogICAgICAgICJib29sZ3R8Ym9vbGlufGJvb2xsZXxib29sbHR8Ym9vbG5lfGJvb2xvcl9zdGF0ZWZ1bmN8Ym9vbG91dHxib29scmVjdnxib29sc2VuZHxib3h8IiArCiAgICAgICAgImJveF9hYm92ZXxib3hfYWJvdmVfZXF8Ym94X2FkZHxib3hfYmVsb3d8Ym94X2JlbG93X2VxfGJveF9jZW50ZXJ8Ym94X2NvbnRhaW58IiArCiAgICAgICAgImJveF9jb250YWluX3B0fGJveF9jb250YWluZWR8Ym94X2Rpc3RhbmNlfGJveF9kaXZ8Ym94X2VxfGJveF9nZXxib3hfZ3R8Ym94X2lufCIgKwogICAgICAgICJib3hfaW50ZXJzZWN0fGJveF9sZXxib3hfbGVmdHxib3hfbHR8Ym94X211bHxib3hfb3V0fGJveF9vdmVyYWJvdmV8Ym94X292ZXJiZWxvd3wiICsKICAgICAgICAiYm94X292ZXJsYXB8Ym94X292ZXJsZWZ0fGJveF9vdmVycmlnaHR8Ym94X3JlY3Z8Ym94X3JpZ2h0fGJveF9zYW1lfGJveF9zZW5kfGJveF9zdWJ8IiArCiAgICAgICAgImJwY2hhcl9sYXJnZXJ8YnBjaGFyX3BhdHRlcm5fZ2V8YnBjaGFyX3BhdHRlcm5fZ3R8YnBjaGFyX3BhdHRlcm5fbGV8IiArCiAgICAgICAgImJwY2hhcl9wYXR0ZXJuX2x0fGJwY2hhcl9zbWFsbGVyfGJwY2hhcmNtcHxicGNoYXJlcXxicGNoYXJnZXxicGNoYXJndHxicGNoYXJpY2xpa2V8IiArCiAgICAgICAgImJwY2hhcmljbmxpa2V8YnBjaGFyaWNyZWdleGVxfGJwY2hhcmljcmVnZXhuZXxicGNoYXJpbnxicGNoYXJsZXxicGNoYXJsaWtlfGJwY2hhcmx0fCIgKwogICAgICAgICJicGNoYXJuZXxicGNoYXJubGlrZXxicGNoYXJvdXR8YnBjaGFycmVjdnxicGNoYXJyZWdleGVxfGJwY2hhcnJlZ2V4bmV8YnBjaGFyc2VuZHwiICsKICAgICAgICAiYnBjaGFydHlwbW9kaW58YnBjaGFydHlwbW9kb3V0fGJyb2FkY2FzdHxidGFic3RpbWVjbXB8YnRhcnJheWNtcHxidGJlZ2luc2NhbnxidGJvb2xjbXB8IiArCiAgICAgICAgImJ0YnBjaGFyX3BhdHRlcm5fY21wfGJ0YnVpbGR8YnRidWlsZGVtcHR5fGJ0YnVsa2RlbGV0ZXxidGNoYXJjbXB8YnRjb3N0ZXN0aW1hdGV8IiArCiAgICAgICAgImJ0ZW5kc2NhbnxidGZsb2F0NDhjbXB8YnRmbG9hdDRjbXB8YnRmbG9hdDg0Y21wfGJ0ZmxvYXQ4Y21wfGJ0Z2V0Yml0bWFwfGJ0Z2V0dHVwbGV8IiArCiAgICAgICAgImJ0aW5zZXJ0fGJ0aW50MjRjbXB8YnRpbnQyOGNtcHxidGludDJjbXB8YnRpbnQ0MmNtcHxidGludDQ4Y21wfGJ0aW50NGNtcHxidGludDgyY21wfCIgKwogICAgICAgICJidGludDg0Y21wfGJ0aW50OGNtcHxidG1hcmtwb3N8YnRuYW1lY21wfGJ0b2lkY21wfGJ0b2lkdmVjdG9yY21wfGJ0b3B0aW9uc3xidHJlY29yZGNtcHwiICsKICAgICAgICAiYnRyZWx0aW1lY21wfGJ0cmVzY2FufGJ0cmVzdHJwb3N8YnRyaW18YnR0ZXh0X3BhdHRlcm5fY21wfGJ0dGV4dGNtcHxidHRpZGNtcHwiICsKICAgICAgICAiYnR0aW50ZXJ2YWxjbXB8YnR2YWN1dW1jbGVhbnVwfGJ5dGVhY2F0fGJ5dGVhY21wfGJ5dGVhZXF8Ynl0ZWFnZXxieXRlYWd0fGJ5dGVhaW58Ynl0ZWFsZXwiICsKICAgICAgICAiYnl0ZWFsaWtlfGJ5dGVhbHR8Ynl0ZWFuZXxieXRlYW5saWtlfGJ5dGVhb3V0fGJ5dGVhcmVjdnxieXRlYXNlbmR8Y2FzaF9jbXB8Y2FzaF9kaXZfY2FzaHwiICsKICAgICAgICAiY2FzaF9kaXZfZmx0NHxjYXNoX2Rpdl9mbHQ4fGNhc2hfZGl2X2ludDJ8Y2FzaF9kaXZfaW50NHxjYXNoX2VxfGNhc2hfZ2V8Y2FzaF9ndHxjYXNoX2lufCIgKwogICAgICAgICJjYXNoX2xlfGNhc2hfbHR8Y2FzaF9taXxjYXNoX211bF9mbHQ0fGNhc2hfbXVsX2ZsdDh8Y2FzaF9tdWxfaW50MnxjYXNoX211bF9pbnQ0fGNhc2hfbmV8IiArCiAgICAgICAgImNhc2hfb3V0fGNhc2hfcGx8Y2FzaF9yZWN2fGNhc2hfc2VuZHxjYXNoX3dvcmRzfGNhc2hsYXJnZXJ8Y2FzaHNtYWxsZXJ8Y2JydHxjZWlsfGNlaWxpbmd8IiArCiAgICAgICAgImNlbnRlcnxjaGFyfGNoYXJfbGVuZ3RofGNoYXJhY3Rlcl9sZW5ndGh8Y2hhcmVxfGNoYXJnZXxjaGFyZ3R8Y2hhcmlufGNoYXJsZXxjaGFybHR8Y2hhcm5lfCIgKwogICAgICAgICJjaGFyb3V0fGNoYXJyZWN2fGNoYXJzZW5kfGNocnxjaWRlcXxjaWRpbnxjaWRvdXR8Y2lkcnxjaWRyX2lufGNpZHJfb3V0fGNpZHJfcmVjdnxjaWRyX3NlbmR8IiArCiAgICAgICAgImNpZHJlY3Z8Y2lkc2VuZHxjaXJjbGV8Y2lyY2xlX2Fib3ZlfGNpcmNsZV9hZGRfcHR8Y2lyY2xlX2JlbG93fGNpcmNsZV9jZW50ZXJ8IiArCiAgICAgICAgImNpcmNsZV9jb250YWlufGNpcmNsZV9jb250YWluX3B0fGNpcmNsZV9jb250YWluZWR8Y2lyY2xlX2Rpc3RhbmNlfGNpcmNsZV9kaXZfcHR8IiArCiAgICAgICAgImNpcmNsZV9lcXxjaXJjbGVfZ2V8Y2lyY2xlX2d0fGNpcmNsZV9pbnxjaXJjbGVfbGV8Y2lyY2xlX2xlZnR8Y2lyY2xlX2x0fGNpcmNsZV9tdWxfcHR8IiArCiAgICAgICAgImNpcmNsZV9uZXxjaXJjbGVfb3V0fGNpcmNsZV9vdmVyYWJvdmV8Y2lyY2xlX292ZXJiZWxvd3xjaXJjbGVfb3ZlcmxhcHxjaXJjbGVfb3ZlcmxlZnR8IiArCiAgICAgICAgImNpcmNsZV9vdmVycmlnaHR8Y2lyY2xlX3JlY3Z8Y2lyY2xlX3JpZ2h0fGNpcmNsZV9zYW1lfGNpcmNsZV9zZW5kfGNpcmNsZV9zdWJfcHR8IiArCiAgICAgICAgImNsb2NrX3RpbWVzdGFtcHxjbG9zZV9sYnxjbG9zZV9sc3xjbG9zZV9sc2VnfGNsb3NlX3BifGNsb3NlX3BsfGNsb3NlX3BzfGNsb3NlX3NifCIgKwogICAgICAgICJjbG9zZV9zbHxjb2xfZGVzY3JpcHRpb258Y29uY2F0fGNvbmNhdF93c3xjb250am9pbnNlbHxjb250c2VsfGNvbnZlcnR8Y29udmVydF9mcm9tfCIgKwogICAgICAgICJjb252ZXJ0X3RvfGNvcnJ8Y29zfGNvdHxjb3VudHxjb3Zhcl9wb3B8Y292YXJfc2FtcHxjc3RyaW5nX2lufGNzdHJpbmdfb3V0fGNzdHJpbmdfcmVjdnwiICsKICAgICAgICAiY3N0cmluZ19zZW5kfGN1bWVfZGlzdHxjdXJyZW50X2RhdGFiYXNlfGN1cnJlbnRfcXVlcnl8Y3VycmVudF9zY2hlbWF8Y3VycmVudF9zY2hlbWFzfCIgKwogICAgICAgICJjdXJyZW50X3NldHRpbmd8Y3VycmVudF91c2VyfGN1cnJ0aWR8Y3VycnRpZDJ8Y3VycnZhbHxjdXJzb3JfdG9feG1sfCIgKwogICAgICAgICJjdXJzb3JfdG9feG1sc2NoZW1hfGRhdGFiYXNlX3RvX3htbHxkYXRhYmFzZV90b194bWxfYW5kX3htbHNjaGVtYXwiICsKICAgICAgICAiZGF0YWJhc2VfdG9feG1sc2NoZW1hfGRhdGV8ZGF0ZV9jbXB8ZGF0ZV9jbXBfdGltZXN0YW1wfGRhdGVfY21wX3RpbWVzdGFtcHR6fGRhdGVfZXF8IiArCiAgICAgICAgImRhdGVfZXFfdGltZXN0YW1wfGRhdGVfZXFfdGltZXN0YW1wdHp8ZGF0ZV9nZXxkYXRlX2dlX3RpbWVzdGFtcHxkYXRlX2dlX3RpbWVzdGFtcHR6fCIgKwogICAgICAgICJkYXRlX2d0fGRhdGVfZ3RfdGltZXN0YW1wfGRhdGVfZ3RfdGltZXN0YW1wdHp8ZGF0ZV9pbnxkYXRlX2xhcmdlcnxkYXRlX2xlfCIgKwogICAgICAgICJkYXRlX2xlX3RpbWVzdGFtcHxkYXRlX2xlX3RpbWVzdGFtcHR6fGRhdGVfbHR8ZGF0ZV9sdF90aW1lc3RhbXB8ZGF0ZV9sdF90aW1lc3RhbXB0enwiICsKICAgICAgICAiZGF0ZV9taXxkYXRlX21pX2ludGVydmFsfGRhdGVfbWlpfGRhdGVfbmV8ZGF0ZV9uZV90aW1lc3RhbXB8ZGF0ZV9uZV90aW1lc3RhbXB0enwiICsKICAgICAgICAiZGF0ZV9vdXR8ZGF0ZV9wYXJ0fGRhdGVfcGxfaW50ZXJ2YWx8ZGF0ZV9wbGl8ZGF0ZV9yZWN2fGRhdGVfc2VuZHxkYXRlX3NtYWxsZXJ8IiArCiAgICAgICAgImRhdGVfdHJ1bmN8ZGF0ZXRpbWVfcGx8ZGF0ZXRpbWV0el9wbHxkY2JydHxkZWNvZGV8ZGVncmVlc3xkZW5zZV9yYW5rfGRleHB8ZGlhZ29uYWx8IiArCiAgICAgICAgImRpYW1ldGVyfGRpc3BlbGxfaW5pdHxkaXNwZWxsX2xleGl6ZXxkaXN0X2Nwb2x5fGRpc3RfbGJ8ZGlzdF9wYnxkaXN0X3BjfGRpc3RfcGx8IiArCiAgICAgICAgImRpc3RfcHBhdGh8ZGlzdF9wc3xkaXN0X3NifGRpc3Rfc2x8ZGl2fGRsb2cxfGRsb2cxMHxkb21haW5faW58ZG9tYWluX3JlY3Z8ZHBvd3xkcm91bmR8IiArCiAgICAgICAgImRzaW1wbGVfaW5pdHxkc2ltcGxlX2xleGl6ZXxkc25vd2JhbGxfaW5pdHxkc25vd2JhbGxfbGV4aXplfGRzcXJ0fGRzeW5vbnltX2luaXR8IiArCiAgICAgICAgImRzeW5vbnltX2xleGl6ZXxkdHJ1bmN8ZW5jb2RlfGVudW1fY21wfGVudW1fZXF8ZW51bV9maXJzdHxlbnVtX2dlfGVudW1fZ3R8ZW51bV9pbnwiICsKICAgICAgICAiZW51bV9sYXJnZXJ8ZW51bV9sYXN0fGVudW1fbGV8ZW51bV9sdHxlbnVtX25lfGVudW1fb3V0fGVudW1fcmFuZ2V8ZW51bV9yZWN2fGVudW1fc2VuZHwiICsKICAgICAgICAiZW51bV9zbWFsbGVyfGVxam9pbnNlbHxlcXNlbHxldWNfY25fdG9fbWljfGV1Y19jbl90b191dGY4fCIgKwogICAgICAgICJldWNfamlzXzIwMDRfdG9fc2hpZnRfamlzXzIwMDR8ZXVjX2ppc18yMDA0X3RvX3V0Zjh8ZXVjX2pwX3RvX21pY3xldWNfanBfdG9fc2ppc3wiICsKICAgICAgICAiZXVjX2pwX3RvX3V0Zjh8ZXVjX2tyX3RvX21pY3xldWNfa3JfdG9fdXRmOHxldWNfdHdfdG9fYmlnNXxldWNfdHdfdG9fbWljfCIgKwogICAgICAgICJldWNfdHdfdG9fdXRmOHxldmVyeXxleHB8ZmFjdG9yaWFsfGZhbWlseXxmZHdfaGFuZGxlcl9pbnxmZHdfaGFuZGxlcl9vdXR8Zmlyc3RfdmFsdWV8IiArCiAgICAgICAgImZsb2F0NHxmbG9hdDQ4ZGl2fGZsb2F0NDhlcXxmbG9hdDQ4Z2V8ZmxvYXQ0OGd0fGZsb2F0NDhsZXxmbG9hdDQ4bHR8ZmxvYXQ0OG1pfGZsb2F0NDhtdWx8IiArCiAgICAgICAgImZsb2F0NDhuZXxmbG9hdDQ4cGx8ZmxvYXQ0X2FjY3VtfGZsb2F0NGFic3xmbG9hdDRkaXZ8ZmxvYXQ0ZXF8ZmxvYXQ0Z2V8ZmxvYXQ0Z3R8ZmxvYXQ0aW58IiArCiAgICAgICAgImZsb2F0NGxhcmdlcnxmbG9hdDRsZXxmbG9hdDRsdHxmbG9hdDRtaXxmbG9hdDRtdWx8ZmxvYXQ0bmV8ZmxvYXQ0b3V0fGZsb2F0NHBsfGZsb2F0NHJlY3Z8IiArCiAgICAgICAgImZsb2F0NHNlbmR8ZmxvYXQ0c21hbGxlcnxmbG9hdDR1bXxmbG9hdDR1cHxmbG9hdDh8ZmxvYXQ4NGRpdnxmbG9hdDg0ZXF8ZmxvYXQ4NGdlfCIgKwogICAgICAgICJmbG9hdDg0Z3R8ZmxvYXQ4NGxlfGZsb2F0ODRsdHxmbG9hdDg0bWl8ZmxvYXQ4NG11bHxmbG9hdDg0bmV8ZmxvYXQ4NHBsfGZsb2F0OF9hY2N1bXwiICsKICAgICAgICAiZmxvYXQ4X2F2Z3xmbG9hdDhfY29ycnxmbG9hdDhfY292YXJfcG9wfGZsb2F0OF9jb3Zhcl9zYW1wfGZsb2F0OF9yZWdyX2FjY3VtfCIgKwogICAgICAgICJmbG9hdDhfcmVncl9hdmd4fGZsb2F0OF9yZWdyX2F2Z3l8ZmxvYXQ4X3JlZ3JfaW50ZXJjZXB0fGZsb2F0OF9yZWdyX3IyfCIgKwogICAgICAgICJmbG9hdDhfcmVncl9zbG9wZXxmbG9hdDhfcmVncl9zeHh8ZmxvYXQ4X3JlZ3Jfc3h5fGZsb2F0OF9yZWdyX3N5eXxmbG9hdDhfc3RkZGV2X3BvcHwiICsKICAgICAgICAiZmxvYXQ4X3N0ZGRldl9zYW1wfGZsb2F0OF92YXJfcG9wfGZsb2F0OF92YXJfc2FtcHxmbG9hdDhhYnN8ZmxvYXQ4ZGl2fGZsb2F0OGVxfCIgKwogICAgICAgICJmbG9hdDhnZXxmbG9hdDhndHxmbG9hdDhpbnxmbG9hdDhsYXJnZXJ8ZmxvYXQ4bGV8ZmxvYXQ4bHR8ZmxvYXQ4bWl8ZmxvYXQ4bXVsfGZsb2F0OG5lfCIgKwogICAgICAgICJmbG9hdDhvdXR8ZmxvYXQ4cGx8ZmxvYXQ4cmVjdnxmbG9hdDhzZW5kfGZsb2F0OHNtYWxsZXJ8ZmxvYXQ4dW18ZmxvYXQ4dXB8Zmxvb3J8IiArCiAgICAgICAgImZsdDRfbXVsX2Nhc2h8Zmx0OF9tdWxfY2FzaHxmbWdyX2NfdmFsaWRhdG9yfGZtZ3JfaW50ZXJuYWxfdmFsaWRhdG9yfCIgKwogICAgICAgICJmbWdyX3NxbF92YWxpZGF0b3J8Zm9ybWF0fGZvcm1hdF90eXBlfGdiMTgwMzBfdG9fdXRmOHxnYmtfdG9fdXRmOHxnZW5lcmF0ZV9zZXJpZXN8IiArCiAgICAgICAgImdlbmVyYXRlX3N1YnNjcmlwdHN8Z2V0X2JpdHxnZXRfYnl0ZXxnZXRfY3VycmVudF90c19jb25maWd8Z2V0ZGF0YWJhc2VlbmNvZGluZ3wiICsKICAgICAgICAiZ2V0cGd1c2VybmFtZXxnaW5fY21wX3ByZWZpeHxnaW5fY21wX3RzbGV4ZW1lfGdpbl9leHRyYWN0X3RzcXVlcnl8IiArCiAgICAgICAgImdpbl9leHRyYWN0X3RzdmVjdG9yfGdpbl90c3F1ZXJ5X2NvbnNpc3RlbnR8Z2luYXJyYXljb25zaXN0ZW50fGdpbmFycmF5ZXh0cmFjdHwiICsKICAgICAgICAiZ2luYmVnaW5zY2FufGdpbmJ1aWxkfGdpbmJ1aWxkZW1wdHl8Z2luYnVsa2RlbGV0ZXxnaW5jb3N0ZXN0aW1hdGV8Z2luZW5kc2NhbnwiICsKICAgICAgICAiZ2luZ2V0Yml0bWFwfGdpbmluc2VydHxnaW5tYXJrcG9zfGdpbm9wdGlvbnN8Z2lucXVlcnlhcnJheWV4dHJhY3R8Z2lucmVzY2FufCIgKwogICAgICAgICJnaW5yZXN0cnBvc3xnaW52YWN1dW1jbGVhbnVwfGdpc3RfYm94X2NvbXByZXNzfGdpc3RfYm94X2NvbnNpc3RlbnR8IiArCiAgICAgICAgImdpc3RfYm94X2RlY29tcHJlc3N8Z2lzdF9ib3hfcGVuYWx0eXxnaXN0X2JveF9waWNrc3BsaXR8Z2lzdF9ib3hfc2FtZXxnaXN0X2JveF91bmlvbnwiICsKICAgICAgICAiZ2lzdF9jaXJjbGVfY29tcHJlc3N8Z2lzdF9jaXJjbGVfY29uc2lzdGVudHxnaXN0X3BvaW50X2NvbXByZXNzfCIgKwogICAgICAgICJnaXN0X3BvaW50X2NvbnNpc3RlbnR8Z2lzdF9wb2ludF9kaXN0YW5jZXxnaXN0X3BvbHlfY29tcHJlc3N8Z2lzdF9wb2x5X2NvbnNpc3RlbnR8IiArCiAgICAgICAgImdpc3RiZWdpbnNjYW58Z2lzdGJ1aWxkfGdpc3RidWlsZGVtcHR5fGdpc3RidWxrZGVsZXRlfGdpc3Rjb3N0ZXN0aW1hdGV8Z2lzdGVuZHNjYW58IiArCiAgICAgICAgImdpc3RnZXRiaXRtYXB8Z2lzdGdldHR1cGxlfGdpc3RpbnNlcnR8Z2lzdG1hcmtwb3N8Z2lzdG9wdGlvbnN8Z2lzdHJlc2NhbnxnaXN0cmVzdHJwb3N8IiArCiAgICAgICAgImdpc3R2YWN1dW1jbGVhbnVwfGd0c3F1ZXJ5X2NvbXByZXNzfGd0c3F1ZXJ5X2NvbnNpc3RlbnR8Z3RzcXVlcnlfZGVjb21wcmVzc3wiICsKICAgICAgICAiZ3RzcXVlcnlfcGVuYWx0eXxndHNxdWVyeV9waWNrc3BsaXR8Z3RzcXVlcnlfc2FtZXxndHNxdWVyeV91bmlvbnxndHN2ZWN0b3JfY29tcHJlc3N8IiArCiAgICAgICAgImd0c3ZlY3Rvcl9jb25zaXN0ZW50fGd0c3ZlY3Rvcl9kZWNvbXByZXNzfGd0c3ZlY3Rvcl9wZW5hbHR5fGd0c3ZlY3Rvcl9waWNrc3BsaXR8IiArCiAgICAgICAgImd0c3ZlY3Rvcl9zYW1lfGd0c3ZlY3Rvcl91bmlvbnxndHN2ZWN0b3JpbnxndHN2ZWN0b3JvdXR8aGFzX2FueV9jb2x1bW5fcHJpdmlsZWdlfCIgKwogICAgICAgICJoYXNfY29sdW1uX3ByaXZpbGVnZXxoYXNfZGF0YWJhc2VfcHJpdmlsZWdlfGhhc19mb3JlaWduX2RhdGFfd3JhcHBlcl9wcml2aWxlZ2V8IiArCiAgICAgICAgImhhc19mdW5jdGlvbl9wcml2aWxlZ2V8aGFzX2xhbmd1YWdlX3ByaXZpbGVnZXxoYXNfc2NoZW1hX3ByaXZpbGVnZXwiICsKICAgICAgICAiaGFzX3NlcXVlbmNlX3ByaXZpbGVnZXxoYXNfc2VydmVyX3ByaXZpbGVnZXxoYXNfdGFibGVfcHJpdmlsZWdlfCIgKwogICAgICAgICJoYXNfdGFibGVzcGFjZV9wcml2aWxlZ2V8aGFzaF9hY2xpdGVtfGhhc2hfYXJyYXl8aGFzaF9udW1lcmljfGhhc2hiZWdpbnNjYW58IiArCiAgICAgICAgImhhc2hicGNoYXJ8aGFzaGJ1aWxkfGhhc2hidWlsZGVtcHR5fGhhc2hidWxrZGVsZXRlfGhhc2hjaGFyfGhhc2hjb3N0ZXN0aW1hdGV8IiArCiAgICAgICAgImhhc2hlbmRzY2FufGhhc2hlbnVtfGhhc2hmbG9hdDR8aGFzaGZsb2F0OHxoYXNoZ2V0Yml0bWFwfGhhc2hnZXR0dXBsZXxoYXNoaW5ldHwiICsKICAgICAgICAiaGFzaGluc2VydHxoYXNoaW50MnxoYXNoaW50MnZlY3RvcnxoYXNoaW50NHxoYXNoaW50OHxoYXNobWFjYWRkcnxoYXNobWFya3Bvc3xoYXNobmFtZXwiICsKICAgICAgICAiaGFzaG9pZHxoYXNob2lkdmVjdG9yfGhhc2hvcHRpb25zfGhhc2hyZXNjYW58aGFzaHJlc3RycG9zfGhhc2h0ZXh0fGhhc2h2YWN1dW1jbGVhbnVwfCIgKwogICAgICAgICJoYXNodmFybGVuYXxoZWlnaHR8aG9zdHxob3N0bWFza3xpY2xpa2Vqb2luc2VsfGljbGlrZXNlbHxpY25saWtlam9pbnNlbHxpY25saWtlc2VsfCIgKwogICAgICAgICJpY3JlZ2V4ZXFqb2luc2VsfGljcmVnZXhlcXNlbHxpY3JlZ2V4bmVqb2luc2VsfGljcmVnZXhuZXNlbHxpbmV0X2NsaWVudF9hZGRyfCIgKwogICAgICAgICJpbmV0X2NsaWVudF9wb3J0fGluZXRfaW58aW5ldF9vdXR8aW5ldF9yZWN2fGluZXRfc2VuZHxpbmV0X3NlcnZlcl9hZGRyfCIgKwogICAgICAgICJpbmV0X3NlcnZlcl9wb3J0fGluZXRhbmR8aW5ldG1pfGluZXRtaV9pbnQ4fGluZXRub3R8aW5ldG9yfGluZXRwbHxpbml0Y2FwfGludDJ8aW50MjRkaXZ8IiArCiAgICAgICAgImludDI0ZXF8aW50MjRnZXxpbnQyNGd0fGludDI0bGV8aW50MjRsdHxpbnQyNG1pfGludDI0bXVsfGludDI0bmV8aW50MjRwbHxpbnQyOGRpdnxpbnQyOGVxfCIgKwogICAgICAgICJpbnQyOGdlfGludDI4Z3R8aW50MjhsZXxpbnQyOGx0fGludDI4bWl8aW50MjhtdWx8aW50MjhuZXxpbnQyOHBsfGludDJfYWNjdW18IiArCiAgICAgICAgImludDJfYXZnX2FjY3VtfGludDJfbXVsX2Nhc2h8aW50Ml9zdW18aW50MmFic3xpbnQyYW5kfGludDJkaXZ8aW50MmVxfGludDJnZXxpbnQyZ3R8aW50MmlufCIgKwogICAgICAgICJpbnQybGFyZ2VyfGludDJsZXxpbnQybHR8aW50Mm1pfGludDJtb2R8aW50Mm11bHxpbnQybmV8aW50Mm5vdHxpbnQyb3J8aW50Mm91dHxpbnQycGx8IiArCiAgICAgICAgImludDJyZWN2fGludDJzZW5kfGludDJzaGx8aW50MnNocnxpbnQyc21hbGxlcnxpbnQydW18aW50MnVwfGludDJ2ZWN0b3JlcXxpbnQydmVjdG9yaW58IiArCiAgICAgICAgImludDJ2ZWN0b3JvdXR8aW50MnZlY3RvcnJlY3Z8aW50MnZlY3RvcnNlbmR8aW50MnhvcnxpbnQ0fGludDQyZGl2fGludDQyZXF8aW50NDJnZXwiICsKICAgICAgICAiaW50NDJndHxpbnQ0MmxlfGludDQybHR8aW50NDJtaXxpbnQ0Mm11bHxpbnQ0Mm5lfGludDQycGx8aW50NDhkaXZ8aW50NDhlcXxpbnQ0OGdlfGludDQ4Z3R8IiArCiAgICAgICAgImludDQ4bGV8aW50NDhsdHxpbnQ0OG1pfGludDQ4bXVsfGludDQ4bmV8aW50NDhwbHxpbnQ0X2FjY3VtfGludDRfYXZnX2FjY3VtfGludDRfbXVsX2Nhc2h8IiArCiAgICAgICAgImludDRfc3VtfGludDRhYnN8aW50NGFuZHxpbnQ0ZGl2fGludDRlcXxpbnQ0Z2V8aW50NGd0fGludDRpbnxpbnQ0aW5jfGludDRsYXJnZXJ8aW50NGxlfCIgKwogICAgICAgICJpbnQ0bHR8aW50NG1pfGludDRtb2R8aW50NG11bHxpbnQ0bmV8aW50NG5vdHxpbnQ0b3J8aW50NG91dHxpbnQ0cGx8aW50NHJlY3Z8aW50NHNlbmR8IiArCiAgICAgICAgImludDRzaGx8aW50NHNocnxpbnQ0c21hbGxlcnxpbnQ0dW18aW50NHVwfGludDR4b3J8aW50OHxpbnQ4MmRpdnxpbnQ4MmVxfGludDgyZ2V8aW50ODJndHwiICsKICAgICAgICAiaW50ODJsZXxpbnQ4Mmx0fGludDgybWl8aW50ODJtdWx8aW50ODJuZXxpbnQ4MnBsfGludDg0ZGl2fGludDg0ZXF8aW50ODRnZXxpbnQ4NGd0fGludDg0bGV8IiArCiAgICAgICAgImludDg0bHR8aW50ODRtaXxpbnQ4NG11bHxpbnQ4NG5lfGludDg0cGx8aW50OF9hY2N1bXxpbnQ4X2F2Z3xpbnQ4X2F2Z19hY2N1bXxpbnQ4X3N1bXwiICsKICAgICAgICAiaW50OGFic3xpbnQ4YW5kfGludDhkaXZ8aW50OGVxfGludDhnZXxpbnQ4Z3R8aW50OGlufGludDhpbmN8aW50OGluY19hbnl8IiArCiAgICAgICAgImludDhpbmNfZmxvYXQ4X2Zsb2F0OHxpbnQ4bGFyZ2VyfGludDhsZXxpbnQ4bHR8aW50OG1pfGludDhtb2R8aW50OG11bHxpbnQ4bmV8aW50OG5vdHwiICsKICAgICAgICAiaW50OG9yfGludDhvdXR8aW50OHBsfGludDhwbF9pbmV0fGludDhyZWN2fGludDhzZW5kfGludDhzaGx8aW50OHNocnxpbnQ4c21hbGxlcnxpbnQ4dW18IiArCiAgICAgICAgImludDh1cHxpbnQ4eG9yfGludGVnZXJfcGxfZGF0ZXxpbnRlcl9sYnxpbnRlcl9zYnxpbnRlcl9zbHxpbnRlcm5hbF9pbnxpbnRlcm5hbF9vdXR8IiArCiAgICAgICAgImludGVydmFsX2FjY3VtfGludGVydmFsX2F2Z3xpbnRlcnZhbF9jbXB8aW50ZXJ2YWxfZGl2fGludGVydmFsX2VxfGludGVydmFsX2dlfCIgKwogICAgICAgICJpbnRlcnZhbF9ndHxpbnRlcnZhbF9oYXNofGludGVydmFsX2lufGludGVydmFsX2xhcmdlcnxpbnRlcnZhbF9sZXxpbnRlcnZhbF9sdHwiICsKICAgICAgICAiaW50ZXJ2YWxfbWl8aW50ZXJ2YWxfbXVsfGludGVydmFsX25lfGludGVydmFsX291dHxpbnRlcnZhbF9wbHxpbnRlcnZhbF9wbF9kYXRlfCIgKwogICAgICAgICJpbnRlcnZhbF9wbF90aW1lfGludGVydmFsX3BsX3RpbWVzdGFtcHxpbnRlcnZhbF9wbF90aW1lc3RhbXB0enxpbnRlcnZhbF9wbF90aW1ldHp8IiArCiAgICAgICAgImludGVydmFsX3JlY3Z8aW50ZXJ2YWxfc2VuZHxpbnRlcnZhbF9zbWFsbGVyfGludGVydmFsX3VtfGludGVydmFsdHlwbW9kaW58IiArCiAgICAgICAgImludGVydmFsdHlwbW9kb3V0fGludGludGVydmFsfGlzY2xvc2VkfGlzZmluaXRlfGlzaG9yaXpvbnRhbHxpc284ODU5XzFfdG9fdXRmOHwiICsKICAgICAgICAiaXNvODg1OV90b191dGY4fGlzb190b19rb2k4cnxpc29fdG9fbWljfGlzb190b193aW4xMjUxfGlzb190b193aW44NjZ8aXNvcGVufGlzcGFyYWxsZWx8IiArCiAgICAgICAgImlzcGVycHxpc3ZlcnRpY2FsfGpvaGFiX3RvX3V0Zjh8anVzdGlmeV9kYXlzfGp1c3RpZnlfaG91cnN8anVzdGlmeV9pbnRlcnZhbHwiICsKICAgICAgICAia29pOHJfdG9faXNvfGtvaThyX3RvX21pY3xrb2k4cl90b191dGY4fGtvaThyX3RvX3dpbjEyNTF8a29pOHJfdG9fd2luODY2fCIgKwogICAgICAgICJrb2k4dV90b191dGY4fGxhZ3xsYW5ndWFnZV9oYW5kbGVyX2lufGxhbmd1YWdlX2hhbmRsZXJfb3V0fGxhc3RfdmFsdWV8bGFzdHZhbHwiICsKICAgICAgICAibGF0aW4xX3RvX21pY3xsYXRpbjJfdG9fbWljfGxhdGluMl90b193aW4xMjUwfGxhdGluM190b19taWN8bGF0aW40X3RvX21pY3xsZWFkfGxlZnR8IiArCiAgICAgICAgImxlbmd0aHxsaWtlfGxpa2VfZXNjYXBlfGxpa2Vqb2luc2VsfGxpa2VzZWx8bGluZXxsaW5lX2Rpc3RhbmNlfGxpbmVfZXF8bGluZV9ob3Jpem9udGFsfCIgKwogICAgICAgICJsaW5lX2lufGxpbmVfaW50ZXJwdHxsaW5lX2ludGVyc2VjdHxsaW5lX291dHxsaW5lX3BhcmFsbGVsfGxpbmVfcGVycHxsaW5lX3JlY3Z8IiArCiAgICAgICAgImxpbmVfc2VuZHxsaW5lX3ZlcnRpY2FsfGxufGxvX2Nsb3NlfGxvX2NyZWF0fGxvX2NyZWF0ZXxsb19leHBvcnR8bG9faW1wb3J0fGxvX2xzZWVrfCIgKwogICAgICAgICJsb19vcGVufGxvX3RlbGx8bG9fdHJ1bmNhdGV8bG9fdW5saW5rfGxvZ3xsb3JlYWR8bG93ZXJ8bG93cml0ZXxscGFkfGxzZWd8bHNlZ19jZW50ZXJ8IiArCiAgICAgICAgImxzZWdfZGlzdGFuY2V8bHNlZ19lcXxsc2VnX2dlfGxzZWdfZ3R8bHNlZ19ob3Jpem9udGFsfGxzZWdfaW58bHNlZ19pbnRlcnB0fCIgKwogICAgICAgICJsc2VnX2ludGVyc2VjdHxsc2VnX2xlfGxzZWdfbGVuZ3RofGxzZWdfbHR8bHNlZ19uZXxsc2VnX291dHxsc2VnX3BhcmFsbGVsfGxzZWdfcGVycHwiICsKICAgICAgICAibHNlZ19yZWN2fGxzZWdfc2VuZHxsc2VnX3ZlcnRpY2FsfGx0cmltfG1hY2FkZHJfY21wfG1hY2FkZHJfZXF8bWFjYWRkcl9nZXxtYWNhZGRyX2d0fCIgKwogICAgICAgICJtYWNhZGRyX2lufG1hY2FkZHJfbGV8bWFjYWRkcl9sdHxtYWNhZGRyX25lfG1hY2FkZHJfb3V0fG1hY2FkZHJfcmVjdnxtYWNhZGRyX3NlbmR8IiArCiAgICAgICAgIm1ha2VhY2xpdGVtfG1hc2tsZW58bWF4fG1kNXxtaWNfdG9fYXNjaWl8bWljX3RvX2JpZzV8bWljX3RvX2V1Y19jbnxtaWNfdG9fZXVjX2pwfCIgKwogICAgICAgICJtaWNfdG9fZXVjX2tyfG1pY190b19ldWNfdHd8bWljX3RvX2lzb3xtaWNfdG9fa29pOHJ8bWljX3RvX2xhdGluMXxtaWNfdG9fbGF0aW4yfCIgKwogICAgICAgICJtaWNfdG9fbGF0aW4zfG1pY190b19sYXRpbjR8bWljX3RvX3NqaXN8bWljX3RvX3dpbjEyNTB8bWljX3RvX3dpbjEyNTF8bWljX3RvX3dpbjg2NnwiICsKICAgICAgICAibWlufG1rdGludGVydmFsfG1vZHxtb25leXxtdWxfZF9pbnRlcnZhbHxuYW1lfG5hbWVlcXxuYW1lZ2V8bmFtZWd0fG5hbWVpY2xpa2V8bmFtZWljbmxpa2V8IiArCiAgICAgICAgIm5hbWVpY3JlZ2V4ZXF8bmFtZWljcmVnZXhuZXxuYW1laW58bmFtZWxlfG5hbWVsaWtlfG5hbWVsdHxuYW1lbmV8bmFtZW5saWtlfG5hbWVvdXR8IiArCiAgICAgICAgIm5hbWVyZWN2fG5hbWVyZWdleGVxfG5hbWVyZWdleG5lfG5hbWVzZW5kfG5lcWpvaW5zZWx8bmVxc2VsfG5ldG1hc2t8bmV0d29ya3xuZXR3b3JrX2NtcHwiICsKICAgICAgICAibmV0d29ya19lcXxuZXR3b3JrX2dlfG5ldHdvcmtfZ3R8bmV0d29ya19sZXxuZXR3b3JrX2x0fG5ldHdvcmtfbmV8bmV0d29ya19zdWJ8IiArCiAgICAgICAgIm5ldHdvcmtfc3ViZXF8bmV0d29ya19zdXB8bmV0d29ya19zdXBlcXxuZXh0dmFsfG5saWtlam9pbnNlbHxubGlrZXNlbHxub3RsaWtlfG5vd3wiICsKICAgICAgICAibnBvaW50c3xudGhfdmFsdWV8bnRpbGV8bnVtZXJpY19hYnN8bnVtZXJpY19hY2N1bXxudW1lcmljX2FkZHxudW1lcmljX2F2Z3wiICsKICAgICAgICAibnVtZXJpY19hdmdfYWNjdW18bnVtZXJpY19jbXB8bnVtZXJpY19kaXZ8bnVtZXJpY19kaXZfdHJ1bmN8bnVtZXJpY19lcXxudW1lcmljX2V4cHwiICsKICAgICAgICAibnVtZXJpY19mYWN8bnVtZXJpY19nZXxudW1lcmljX2d0fG51bWVyaWNfaW58bnVtZXJpY19pbmN8bnVtZXJpY19sYXJnZXJ8bnVtZXJpY19sZXwiICsKICAgICAgICAibnVtZXJpY19sbnxudW1lcmljX2xvZ3xudW1lcmljX2x0fG51bWVyaWNfbW9kfG51bWVyaWNfbXVsfG51bWVyaWNfbmV8bnVtZXJpY19vdXR8IiArCiAgICAgICAgIm51bWVyaWNfcG93ZXJ8bnVtZXJpY19yZWN2fG51bWVyaWNfc2VuZHxudW1lcmljX3NtYWxsZXJ8bnVtZXJpY19zcXJ0fCIgKwogICAgICAgICJudW1lcmljX3N0ZGRldl9wb3B8bnVtZXJpY19zdGRkZXZfc2FtcHxudW1lcmljX3N1YnxudW1lcmljX3VtaW51c3xudW1lcmljX3VwbHVzfCIgKwogICAgICAgICJudW1lcmljX3Zhcl9wb3B8bnVtZXJpY192YXJfc2FtcHxudW1lcmljdHlwbW9kaW58bnVtZXJpY3R5cG1vZG91dHxudW1ub2RlfCIgKwogICAgICAgICJvYmpfZGVzY3JpcHRpb258b2N0ZXRfbGVuZ3RofG9pZHxvaWRlcXxvaWRnZXxvaWRndHxvaWRpbnxvaWRsYXJnZXJ8b2lkbGV8b2lkbHR8b2lkbmV8b2lkb3V0fCIgKwogICAgICAgICJvaWRyZWN2fG9pZHNlbmR8b2lkc21hbGxlcnxvaWR2ZWN0b3JlcXxvaWR2ZWN0b3JnZXxvaWR2ZWN0b3JndHxvaWR2ZWN0b3JpbnxvaWR2ZWN0b3JsZXwiICsKICAgICAgICAib2lkdmVjdG9ybHR8b2lkdmVjdG9ybmV8b2lkdmVjdG9yb3V0fG9pZHZlY3RvcnJlY3Z8b2lkdmVjdG9yc2VuZHxvaWR2ZWN0b3J0eXBlc3xvbl9wYnwiICsKICAgICAgICAib25fcGx8b25fcHBhdGh8b25fcHN8b25fc2J8b25fc2x8b3BhcXVlX2lufG9wYXF1ZV9vdXR8b3ZlcmxhcHN8b3ZlcmxheXxwYXRofHBhdGhfYWRkfCIgKwogICAgICAgICJwYXRoX2FkZF9wdHxwYXRoX2NlbnRlcnxwYXRoX2NvbnRhaW5fcHR8cGF0aF9kaXN0YW5jZXxwYXRoX2Rpdl9wdHxwYXRoX2lufHBhdGhfaW50ZXJ8IiArCiAgICAgICAgInBhdGhfbGVuZ3RofHBhdGhfbXVsX3B0fHBhdGhfbl9lcXxwYXRoX25fZ2V8cGF0aF9uX2d0fHBhdGhfbl9sZXxwYXRoX25fbHR8cGF0aF9ucG9pbnRzfCIgKwogICAgICAgICJwYXRoX291dHxwYXRoX3JlY3Z8cGF0aF9zZW5kfHBhdGhfc3ViX3B0fHBjbG9zZXxwZXJjZW50X3Jhbmt8cGdfYWR2aXNvcnlfbG9ja3wiICsKICAgICAgICAicGdfYWR2aXNvcnlfbG9ja19zaGFyZWR8cGdfYWR2aXNvcnlfdW5sb2NrfHBnX2Fkdmlzb3J5X3VubG9ja19hbGx8IiArCiAgICAgICAgInBnX2Fkdmlzb3J5X3VubG9ja19zaGFyZWR8cGdfYWR2aXNvcnlfeGFjdF9sb2NrfHBnX2Fkdmlzb3J5X3hhY3RfbG9ja19zaGFyZWR8IiArCiAgICAgICAgInBnX2F2YWlsYWJsZV9leHRlbnNpb25fdmVyc2lvbnN8cGdfYXZhaWxhYmxlX2V4dGVuc2lvbnN8cGdfYmFja2VuZF9waWR8IiArCiAgICAgICAgInBnX2NhbmNlbF9iYWNrZW5kfHBnX2NoYXJfdG9fZW5jb2Rpbmd8cGdfY2xpZW50X2VuY29kaW5nfHBnX2NvbGxhdGlvbl9pc192aXNpYmxlfCIgKwogICAgICAgICJwZ19jb2x1bW5fc2l6ZXxwZ19jb25mX2xvYWRfdGltZXxwZ19jb252ZXJzaW9uX2lzX3Zpc2libGV8cGdfY3JlYXRlX3Jlc3RvcmVfcG9pbnR8IiArCiAgICAgICAgInBnX2N1cnJlbnRfeGxvZ19pbnNlcnRfbG9jYXRpb258cGdfY3VycmVudF94bG9nX2xvY2F0aW9ufHBnX2N1cnNvcnxwZ19kYXRhYmFzZV9zaXplfCIgKwogICAgICAgICJwZ19kZXNjcmliZV9vYmplY3R8cGdfZW5jb2RpbmdfbWF4X2xlbmd0aHxwZ19lbmNvZGluZ190b19jaGFyfCIgKwogICAgICAgICJwZ19leHRlbnNpb25fY29uZmlnX2R1bXB8cGdfZXh0ZW5zaW9uX3VwZGF0ZV9wYXRoc3xwZ19mdW5jdGlvbl9pc192aXNpYmxlfCIgKwogICAgICAgICJwZ19nZXRfY29uc3RyYWludGRlZnxwZ19nZXRfZXhwcnxwZ19nZXRfZnVuY3Rpb25fYXJndW1lbnRzfCIgKwogICAgICAgICJwZ19nZXRfZnVuY3Rpb25faWRlbnRpdHlfYXJndW1lbnRzfHBnX2dldF9mdW5jdGlvbl9yZXN1bHR8cGdfZ2V0X2Z1bmN0aW9uZGVmfCIgKwogICAgICAgICJwZ19nZXRfaW5kZXhkZWZ8cGdfZ2V0X2tleXdvcmRzfHBnX2dldF9ydWxlZGVmfHBnX2dldF9zZXJpYWxfc2VxdWVuY2V8IiArCiAgICAgICAgInBnX2dldF90cmlnZ2VyZGVmfHBnX2dldF91c2VyYnlpZHxwZ19nZXRfdmlld2RlZnxwZ19oYXNfcm9sZXxwZ19pbmRleGVzX3NpemV8IiArCiAgICAgICAgInBnX2lzX2luX3JlY292ZXJ5fHBnX2lzX290aGVyX3RlbXBfc2NoZW1hfHBnX2lzX3hsb2dfcmVwbGF5X3BhdXNlZHwiICsKICAgICAgICAicGdfbGFzdF94YWN0X3JlcGxheV90aW1lc3RhbXB8cGdfbGFzdF94bG9nX3JlY2VpdmVfbG9jYXRpb258IiArCiAgICAgICAgInBnX2xhc3RfeGxvZ19yZXBsYXlfbG9jYXRpb258cGdfbGlzdGVuaW5nX2NoYW5uZWxzfHBnX2xvY2tfc3RhdHVzfHBnX2xzX2RpcnwiICsKICAgICAgICAicGdfbXlfdGVtcF9zY2hlbWF8cGdfbm9kZV90cmVlX2lufHBnX25vZGVfdHJlZV9vdXR8cGdfbm9kZV90cmVlX3JlY3Z8IiArCiAgICAgICAgInBnX25vZGVfdHJlZV9zZW5kfHBnX25vdGlmeXxwZ19vcGNsYXNzX2lzX3Zpc2libGV8cGdfb3BlcmF0b3JfaXNfdmlzaWJsZXwiICsKICAgICAgICAicGdfb3B0aW9uc190b190YWJsZXxwZ19wb3N0bWFzdGVyX3N0YXJ0X3RpbWV8cGdfcHJlcGFyZWRfc3RhdGVtZW50fHBnX3ByZXBhcmVkX3hhY3R8IiArCiAgICAgICAgInBnX3JlYWRfYmluYXJ5X2ZpbGV8cGdfcmVhZF9maWxlfHBnX3JlbGF0aW9uX2ZpbGVub2RlfHBnX3JlbGF0aW9uX2ZpbGVwYXRofCIgKwogICAgICAgICJwZ19yZWxhdGlvbl9zaXplfHBnX3JlbG9hZF9jb25mfHBnX3JvdGF0ZV9sb2dmaWxlfHBnX3NlcXVlbmNlX3BhcmFtZXRlcnN8IiArCiAgICAgICAgInBnX3Nob3dfYWxsX3NldHRpbmdzfHBnX3NpemVfcHJldHR5fHBnX3NsZWVwfHBnX3N0YXJ0X2JhY2t1cHxwZ19zdGF0X2NsZWFyX3NuYXBzaG90fCIgKwogICAgICAgICJwZ19zdGF0X2ZpbGV8cGdfc3RhdF9nZXRfYWN0aXZpdHl8cGdfc3RhdF9nZXRfYW5hbHl6ZV9jb3VudHwiICsKICAgICAgICAicGdfc3RhdF9nZXRfYXV0b2FuYWx5emVfY291bnR8cGdfc3RhdF9nZXRfYXV0b3ZhY3V1bV9jb3VudHwiICsKICAgICAgICAicGdfc3RhdF9nZXRfYmFja2VuZF9hY3Rpdml0eXxwZ19zdGF0X2dldF9iYWNrZW5kX2FjdGl2aXR5X3N0YXJ0fCIgKwogICAgICAgICJwZ19zdGF0X2dldF9iYWNrZW5kX2NsaWVudF9hZGRyfHBnX3N0YXRfZ2V0X2JhY2tlbmRfY2xpZW50X3BvcnR8IiArCiAgICAgICAgInBnX3N0YXRfZ2V0X2JhY2tlbmRfZGJpZHxwZ19zdGF0X2dldF9iYWNrZW5kX2lkc2V0fHBnX3N0YXRfZ2V0X2JhY2tlbmRfcGlkfCIgKwogICAgICAgICJwZ19zdGF0X2dldF9iYWNrZW5kX3N0YXJ0fHBnX3N0YXRfZ2V0X2JhY2tlbmRfdXNlcmlkfHBnX3N0YXRfZ2V0X2JhY2tlbmRfd2FpdGluZ3wiICsKICAgICAgICAicGdfc3RhdF9nZXRfYmFja2VuZF94YWN0X3N0YXJ0fHBnX3N0YXRfZ2V0X2Jnd3JpdGVyX2J1Zl93cml0dGVuX2NoZWNrcG9pbnRzfCIgKwogICAgICAgICJwZ19zdGF0X2dldF9iZ3dyaXRlcl9idWZfd3JpdHRlbl9jbGVhbnxwZ19zdGF0X2dldF9iZ3dyaXRlcl9tYXh3cml0dGVuX2NsZWFufCIgKwogICAgICAgICJwZ19zdGF0X2dldF9iZ3dyaXRlcl9yZXF1ZXN0ZWRfY2hlY2twb2ludHN8cGdfc3RhdF9nZXRfYmd3cml0ZXJfc3RhdF9yZXNldF90aW1lfCIgKwogICAgICAgICJwZ19zdGF0X2dldF9iZ3dyaXRlcl90aW1lZF9jaGVja3BvaW50c3xwZ19zdGF0X2dldF9ibG9ja3NfZmV0Y2hlZHwiICsKICAgICAgICAicGdfc3RhdF9nZXRfYmxvY2tzX2hpdHxwZ19zdGF0X2dldF9idWZfYWxsb2N8cGdfc3RhdF9nZXRfYnVmX2ZzeW5jX2JhY2tlbmR8IiArCiAgICAgICAgInBnX3N0YXRfZ2V0X2J1Zl93cml0dGVuX2JhY2tlbmR8cGdfc3RhdF9nZXRfZGJfYmxvY2tzX2ZldGNoZWR8IiArCiAgICAgICAgInBnX3N0YXRfZ2V0X2RiX2Jsb2Nrc19oaXR8cGdfc3RhdF9nZXRfZGJfY29uZmxpY3RfYWxsfCIgKwogICAgICAgICJwZ19zdGF0X2dldF9kYl9jb25mbGljdF9idWZmZXJwaW58cGdfc3RhdF9nZXRfZGJfY29uZmxpY3RfbG9ja3wiICsKICAgICAgICAicGdfc3RhdF9nZXRfZGJfY29uZmxpY3Rfc25hcHNob3R8cGdfc3RhdF9nZXRfZGJfY29uZmxpY3Rfc3RhcnR1cF9kZWFkbG9ja3wiICsKICAgICAgICAicGdfc3RhdF9nZXRfZGJfY29uZmxpY3RfdGFibGVzcGFjZXxwZ19zdGF0X2dldF9kYl9udW1iYWNrZW5kc3wiICsKICAgICAgICAicGdfc3RhdF9nZXRfZGJfc3RhdF9yZXNldF90aW1lfHBnX3N0YXRfZ2V0X2RiX3R1cGxlc19kZWxldGVkfCIgKwogICAgICAgICJwZ19zdGF0X2dldF9kYl90dXBsZXNfZmV0Y2hlZHxwZ19zdGF0X2dldF9kYl90dXBsZXNfaW5zZXJ0ZWR8IiArCiAgICAgICAgInBnX3N0YXRfZ2V0X2RiX3R1cGxlc19yZXR1cm5lZHxwZ19zdGF0X2dldF9kYl90dXBsZXNfdXBkYXRlZHwiICsKICAgICAgICAicGdfc3RhdF9nZXRfZGJfeGFjdF9jb21taXR8cGdfc3RhdF9nZXRfZGJfeGFjdF9yb2xsYmFja3xwZ19zdGF0X2dldF9kZWFkX3R1cGxlc3wiICsKICAgICAgICAicGdfc3RhdF9nZXRfZnVuY3Rpb25fY2FsbHN8cGdfc3RhdF9nZXRfZnVuY3Rpb25fc2VsZl90aW1lfCIgKwogICAgICAgICJwZ19zdGF0X2dldF9mdW5jdGlvbl90aW1lfHBnX3N0YXRfZ2V0X2xhc3RfYW5hbHl6ZV90aW1lfCIgKwogICAgICAgICJwZ19zdGF0X2dldF9sYXN0X2F1dG9hbmFseXplX3RpbWV8cGdfc3RhdF9nZXRfbGFzdF9hdXRvdmFjdXVtX3RpbWV8IiArCiAgICAgICAgInBnX3N0YXRfZ2V0X2xhc3RfdmFjdXVtX3RpbWV8cGdfc3RhdF9nZXRfbGl2ZV90dXBsZXN8cGdfc3RhdF9nZXRfbnVtc2NhbnN8IiArCiAgICAgICAgInBnX3N0YXRfZ2V0X3R1cGxlc19kZWxldGVkfHBnX3N0YXRfZ2V0X3R1cGxlc19mZXRjaGVkfCIgKwogICAgICAgICJwZ19zdGF0X2dldF90dXBsZXNfaG90X3VwZGF0ZWR8cGdfc3RhdF9nZXRfdHVwbGVzX2luc2VydGVkfCIgKwogICAgICAgICJwZ19zdGF0X2dldF90dXBsZXNfcmV0dXJuZWR8cGdfc3RhdF9nZXRfdHVwbGVzX3VwZGF0ZWR8cGdfc3RhdF9nZXRfdmFjdXVtX2NvdW50fCIgKwogICAgICAgICJwZ19zdGF0X2dldF93YWxfc2VuZGVyc3xwZ19zdGF0X2dldF94YWN0X2Jsb2Nrc19mZXRjaGVkfCIgKwogICAgICAgICJwZ19zdGF0X2dldF94YWN0X2Jsb2Nrc19oaXR8cGdfc3RhdF9nZXRfeGFjdF9mdW5jdGlvbl9jYWxsc3wiICsKICAgICAgICAicGdfc3RhdF9nZXRfeGFjdF9mdW5jdGlvbl9zZWxmX3RpbWV8cGdfc3RhdF9nZXRfeGFjdF9mdW5jdGlvbl90aW1lfCIgKwogICAgICAgICJwZ19zdGF0X2dldF94YWN0X251bXNjYW5zfHBnX3N0YXRfZ2V0X3hhY3RfdHVwbGVzX2RlbGV0ZWR8IiArCiAgICAgICAgInBnX3N0YXRfZ2V0X3hhY3RfdHVwbGVzX2ZldGNoZWR8cGdfc3RhdF9nZXRfeGFjdF90dXBsZXNfaG90X3VwZGF0ZWR8IiArCiAgICAgICAgInBnX3N0YXRfZ2V0X3hhY3RfdHVwbGVzX2luc2VydGVkfHBnX3N0YXRfZ2V0X3hhY3RfdHVwbGVzX3JldHVybmVkfCIgKwogICAgICAgICJwZ19zdGF0X2dldF94YWN0X3R1cGxlc191cGRhdGVkfHBnX3N0YXRfcmVzZXR8cGdfc3RhdF9yZXNldF9zaGFyZWR8IiArCiAgICAgICAgInBnX3N0YXRfcmVzZXRfc2luZ2xlX2Z1bmN0aW9uX2NvdW50ZXJzfHBnX3N0YXRfcmVzZXRfc2luZ2xlX3RhYmxlX2NvdW50ZXJzfCIgKwogICAgICAgICJwZ19zdG9wX2JhY2t1cHxwZ19zd2l0Y2hfeGxvZ3xwZ190YWJsZV9pc192aXNpYmxlfHBnX3RhYmxlX3NpemV8IiArCiAgICAgICAgInBnX3RhYmxlc3BhY2VfZGF0YWJhc2VzfHBnX3RhYmxlc3BhY2Vfc2l6ZXxwZ190ZXJtaW5hdGVfYmFja2VuZHxwZ190aW1lem9uZV9hYmJyZXZzfCIgKwogICAgICAgICJwZ190aW1lem9uZV9uYW1lc3xwZ190b3RhbF9yZWxhdGlvbl9zaXplfHBnX3RyeV9hZHZpc29yeV9sb2NrfCIgKwogICAgICAgICJwZ190cnlfYWR2aXNvcnlfbG9ja19zaGFyZWR8cGdfdHJ5X2Fkdmlzb3J5X3hhY3RfbG9ja3wiICsKICAgICAgICAicGdfdHJ5X2Fkdmlzb3J5X3hhY3RfbG9ja19zaGFyZWR8cGdfdHNfY29uZmlnX2lzX3Zpc2libGV8cGdfdHNfZGljdF9pc192aXNpYmxlfCIgKwogICAgICAgICJwZ190c19wYXJzZXJfaXNfdmlzaWJsZXxwZ190c190ZW1wbGF0ZV9pc192aXNpYmxlfHBnX3R5cGVfaXNfdmlzaWJsZXxwZ190eXBlb2Z8IiArCiAgICAgICAgInBnX3hsb2dfcmVwbGF5X3BhdXNlfHBnX3hsb2dfcmVwbGF5X3Jlc3VtZXxwZ194bG9nZmlsZV9uYW1lfHBnX3hsb2dmaWxlX25hbWVfb2Zmc2V0fCIgKwogICAgICAgICJwaXxwbGFpbnRvX3RzcXVlcnl8cGxwZ3NxbF9jYWxsX2hhbmRsZXJ8cGxwZ3NxbF9pbmxpbmVfaGFuZGxlcnxwbHBnc3FsX3ZhbGlkYXRvcnwiICsKICAgICAgICAicG9pbnR8cG9pbnRfYWJvdmV8cG9pbnRfYWRkfHBvaW50X2JlbG93fHBvaW50X2Rpc3RhbmNlfHBvaW50X2Rpdnxwb2ludF9lcXxwb2ludF9ob3JpenwiICsKICAgICAgICAicG9pbnRfaW58cG9pbnRfbGVmdHxwb2ludF9tdWx8cG9pbnRfbmV8cG9pbnRfb3V0fHBvaW50X3JlY3Z8cG9pbnRfcmlnaHR8cG9pbnRfc2VuZHwiICsKICAgICAgICAicG9pbnRfc3VifHBvaW50X3ZlcnR8cG9seV9hYm92ZXxwb2x5X2JlbG93fHBvbHlfY2VudGVyfHBvbHlfY29udGFpbnxwb2x5X2NvbnRhaW5fcHR8IiArCiAgICAgICAgInBvbHlfY29udGFpbmVkfHBvbHlfZGlzdGFuY2V8cG9seV9pbnxwb2x5X2xlZnR8cG9seV9ucG9pbnRzfHBvbHlfb3V0fHBvbHlfb3ZlcmFib3ZlfCIgKwogICAgICAgICJwb2x5X292ZXJiZWxvd3xwb2x5X292ZXJsYXB8cG9seV9vdmVybGVmdHxwb2x5X292ZXJyaWdodHxwb2x5X3JlY3Z8cG9seV9yaWdodHwiICsKICAgICAgICAicG9seV9zYW1lfHBvbHlfc2VuZHxwb2x5Z29ufHBvcGVufHBvc2l0aW9ufHBvc2l0aW9uam9pbnNlbHxwb3NpdGlvbnNlbHwiICsKICAgICAgICAicG9zdGdyZXNxbF9mZHdfdmFsaWRhdG9yfHBvd3xwb3dlcnxwcnNkX2VuZHxwcnNkX2hlYWRsaW5lfHByc2RfbGV4dHlwZXxwcnNkX25leHR0b2tlbnwiICsKICAgICAgICAicHJzZF9zdGFydHxwdF9jb250YWluZWRfY2lyY2xlfHB0X2NvbnRhaW5lZF9wb2x5fHF1ZXJ5X3RvX3htbHwiICsKICAgICAgICAicXVlcnlfdG9feG1sX2FuZF94bWxzY2hlbWF8cXVlcnlfdG9feG1sc2NoZW1hfHF1ZXJ5dHJlZXxxdW90ZV9pZGVudHxxdW90ZV9saXRlcmFsfCIgKwogICAgICAgICJxdW90ZV9udWxsYWJsZXxyYWRpYW5zfHJhZGl1c3xyYW5kb218cmFua3xyZWNvcmRfZXF8cmVjb3JkX2dlfHJlY29yZF9ndHxyZWNvcmRfaW58IiArCiAgICAgICAgInJlY29yZF9sZXxyZWNvcmRfbHR8cmVjb3JkX25lfHJlY29yZF9vdXR8cmVjb3JkX3JlY3Z8cmVjb3JkX3NlbmR8cmVnY2xhc3N8cmVnY2xhc3NpbnwiICsKICAgICAgICAicmVnY2xhc3NvdXR8cmVnY2xhc3NyZWN2fHJlZ2NsYXNzc2VuZHxyZWdjb25maWdpbnxyZWdjb25maWdvdXR8cmVnY29uZmlncmVjdnwiICsKICAgICAgICAicmVnY29uZmlnc2VuZHxyZWdkaWN0aW9uYXJ5aW58cmVnZGljdGlvbmFyeW91dHxyZWdkaWN0aW9uYXJ5cmVjdnxyZWdkaWN0aW9uYXJ5c2VuZHwiICsKICAgICAgICAicmVnZXhlcWpvaW5zZWx8cmVnZXhlcXNlbHxyZWdleG5lam9pbnNlbHxyZWdleG5lc2VsfHJlZ2V4cF9tYXRjaGVzfHJlZ2V4cF9yZXBsYWNlfCIgKwogICAgICAgICJyZWdleHBfc3BsaXRfdG9fYXJyYXl8cmVnZXhwX3NwbGl0X3RvX3RhYmxlfHJlZ29wZXJhdG9yaW58cmVnb3BlcmF0b3JvdXR8IiArCiAgICAgICAgInJlZ29wZXJhdG9ycmVjdnxyZWdvcGVyYXRvcnNlbmR8cmVnb3BlcmlufHJlZ29wZXJvdXR8cmVnb3BlcnJlY3Z8cmVnb3BlcnNlbmR8IiArCiAgICAgICAgInJlZ3Byb2NlZHVyZWlufHJlZ3Byb2NlZHVyZW91dHxyZWdwcm9jZWR1cmVyZWN2fHJlZ3Byb2NlZHVyZXNlbmR8cmVncHJvY2lufHJlZ3Byb2NvdXR8IiArCiAgICAgICAgInJlZ3Byb2NyZWN2fHJlZ3Byb2NzZW5kfHJlZ3JfYXZneHxyZWdyX2F2Z3l8cmVncl9jb3VudHxyZWdyX2ludGVyY2VwdHxyZWdyX3IyfCIgKwogICAgICAgICJyZWdyX3Nsb3BlfHJlZ3Jfc3h4fHJlZ3Jfc3h5fHJlZ3Jfc3l5fHJlZ3R5cGVpbnxyZWd0eXBlb3V0fHJlZ3R5cGVyZWN2fHJlZ3R5cGVzZW5kfCIgKwogICAgICAgICJyZWx0aW1lfHJlbHRpbWVlcXxyZWx0aW1lZ2V8cmVsdGltZWd0fHJlbHRpbWVpbnxyZWx0aW1lbGV8cmVsdGltZWx0fHJlbHRpbWVuZXxyZWx0aW1lb3V0fCIgKwogICAgICAgICJyZWx0aW1lcmVjdnxyZWx0aW1lc2VuZHxyZXBlYXR8cmVwbGFjZXxyZXZlcnNlfHJpZ2h0fHJvdW5kfHJvd19udW1iZXJ8cnBhZHxydHJpbXwiICsKICAgICAgICAic2NhbGFyZ3Rqb2luc2VsfHNjYWxhcmd0c2VsfHNjYWxhcmx0am9pbnNlbHxzY2FsYXJsdHNlbHxzY2hlbWFfdG9feG1sfCIgKwogICAgICAgICJzY2hlbWFfdG9feG1sX2FuZF94bWxzY2hlbWF8c2NoZW1hX3RvX3htbHNjaGVtYXxzZXNzaW9uX3VzZXJ8c2V0X2JpdHxzZXRfYnl0ZXwiICsKICAgICAgICAic2V0X2NvbmZpZ3xzZXRfbWFza2xlbnxzZXRzZWVkfHNldHZhbHxzZXR3ZWlnaHR8c2hlbGxfaW58c2hlbGxfb3V0fCIgKwogICAgICAgICJzaGlmdF9qaXNfMjAwNF90b19ldWNfamlzXzIwMDR8c2hpZnRfamlzXzIwMDRfdG9fdXRmOHxzaG9ial9kZXNjcmlwdGlvbnxzaWdufCIgKwogICAgICAgICJzaW1pbGFyX2VzY2FwZXxzaW58c2ppc190b19ldWNfanB8c2ppc190b19taWN8c2ppc190b191dGY4fHNsb3BlfHNtZ3JlcXxzbWdyaW58c21ncm5lfCIgKwogICAgICAgICJzbWdyb3V0fHNwbGl0X3BhcnR8c3FydHxzdGF0ZW1lbnRfdGltZXN0YW1wfHN0ZGRldnxzdGRkZXZfcG9wfHN0ZGRldl9zYW1wfHN0cmluZ19hZ2d8IiArCiAgICAgICAgInN0cmluZ19hZ2dfZmluYWxmbnxzdHJpbmdfYWdnX3RyYW5zZm58c3RyaW5nX3RvX2FycmF5fHN0cmlwfHN0cnBvc3xzdWJzdHJ8c3Vic3RyaW5nfHN1bXwiICsKICAgICAgICAic3VwcHJlc3NfcmVkdW5kYW50X3VwZGF0ZXNfdHJpZ2dlcnx0YWJsZV90b194bWx8dGFibGVfdG9feG1sX2FuZF94bWxzY2hlbWF8IiArCiAgICAgICAgInRhYmxlX3RvX3htbHNjaGVtYXx0YW58dGV4dHx0ZXh0X2dlfHRleHRfZ3R8dGV4dF9sYXJnZXJ8dGV4dF9sZXx0ZXh0X2x0fHRleHRfcGF0dGVybl9nZXwiICsKICAgICAgICAidGV4dF9wYXR0ZXJuX2d0fHRleHRfcGF0dGVybl9sZXx0ZXh0X3BhdHRlcm5fbHR8dGV4dF9zbWFsbGVyfHRleHRhbnljYXR8dGV4dGNhdHx0ZXh0ZXF8IiArCiAgICAgICAgInRleHRpY2xpa2V8dGV4dGljbmxpa2V8dGV4dGljcmVnZXhlcXx0ZXh0aWNyZWdleG5lfHRleHRpbnx0ZXh0bGVufHRleHRsaWtlfHRleHRuZXwiICsKICAgICAgICAidGV4dG5saWtlfHRleHRvdXR8dGV4dHJlY3Z8dGV4dHJlZ2V4ZXF8dGV4dHJlZ2V4bmV8dGV4dHNlbmR8dGhlc2F1cnVzX2luaXR8IiArCiAgICAgICAgInRoZXNhdXJ1c19sZXhpemV8dGlkZXF8dGlkZ2V8dGlkZ3R8dGlkaW58dGlkbGFyZ2VyfHRpZGxlfHRpZGx0fHRpZG5lfHRpZG91dHx0aWRyZWN2fHRpZHNlbmR8IiArCiAgICAgICAgInRpZHNtYWxsZXJ8dGltZV9jbXB8dGltZV9lcXx0aW1lX2dlfHRpbWVfZ3R8dGltZV9oYXNofHRpbWVfaW58dGltZV9sYXJnZXJ8dGltZV9sZXx0aW1lX2x0fCIgKwogICAgICAgICJ0aW1lX21pX2ludGVydmFsfHRpbWVfbWlfdGltZXx0aW1lX25lfHRpbWVfb3V0fHRpbWVfcGxfaW50ZXJ2YWx8dGltZV9yZWN2fHRpbWVfc2VuZHwiICsKICAgICAgICAidGltZV9zbWFsbGVyfHRpbWVkYXRlX3BsfHRpbWVtaXx0aW1lbm93fHRpbWVvZmRheXx0aW1lcGx8dGltZXN0YW1wX2NtcHwiICsKICAgICAgICAidGltZXN0YW1wX2NtcF9kYXRlfHRpbWVzdGFtcF9jbXBfdGltZXN0YW1wdHp8dGltZXN0YW1wX2VxfHRpbWVzdGFtcF9lcV9kYXRlfCIgKwogICAgICAgICJ0aW1lc3RhbXBfZXFfdGltZXN0YW1wdHp8dGltZXN0YW1wX2dlfHRpbWVzdGFtcF9nZV9kYXRlfHRpbWVzdGFtcF9nZV90aW1lc3RhbXB0enwiICsKICAgICAgICAidGltZXN0YW1wX2d0fHRpbWVzdGFtcF9ndF9kYXRlfHRpbWVzdGFtcF9ndF90aW1lc3RhbXB0enx0aW1lc3RhbXBfaGFzaHx0aW1lc3RhbXBfaW58IiArCiAgICAgICAgInRpbWVzdGFtcF9sYXJnZXJ8dGltZXN0YW1wX2xlfHRpbWVzdGFtcF9sZV9kYXRlfHRpbWVzdGFtcF9sZV90aW1lc3RhbXB0enwiICsKICAgICAgICAidGltZXN0YW1wX2x0fHRpbWVzdGFtcF9sdF9kYXRlfHRpbWVzdGFtcF9sdF90aW1lc3RhbXB0enx0aW1lc3RhbXBfbWl8IiArCiAgICAgICAgInRpbWVzdGFtcF9taV9pbnRlcnZhbHx0aW1lc3RhbXBfbmV8dGltZXN0YW1wX25lX2RhdGV8dGltZXN0YW1wX25lX3RpbWVzdGFtcHR6fCIgKwogICAgICAgICJ0aW1lc3RhbXBfb3V0fHRpbWVzdGFtcF9wbF9pbnRlcnZhbHx0aW1lc3RhbXBfcmVjdnx0aW1lc3RhbXBfc2VuZHx0aW1lc3RhbXBfc21hbGxlcnwiICsKICAgICAgICAidGltZXN0YW1wdHlwbW9kaW58dGltZXN0YW1wdHlwbW9kb3V0fHRpbWVzdGFtcHR6X2NtcHx0aW1lc3RhbXB0el9jbXBfZGF0ZXwiICsKICAgICAgICAidGltZXN0YW1wdHpfY21wX3RpbWVzdGFtcHx0aW1lc3RhbXB0el9lcXx0aW1lc3RhbXB0el9lcV9kYXRlfCIgKwogICAgICAgICJ0aW1lc3RhbXB0el9lcV90aW1lc3RhbXB8dGltZXN0YW1wdHpfZ2V8dGltZXN0YW1wdHpfZ2VfZGF0ZXwiICsKICAgICAgICAidGltZXN0YW1wdHpfZ2VfdGltZXN0YW1wfHRpbWVzdGFtcHR6X2d0fHRpbWVzdGFtcHR6X2d0X2RhdGV8IiArCiAgICAgICAgInRpbWVzdGFtcHR6X2d0X3RpbWVzdGFtcHx0aW1lc3RhbXB0el9pbnx0aW1lc3RhbXB0el9sYXJnZXJ8dGltZXN0YW1wdHpfbGV8IiArCiAgICAgICAgInRpbWVzdGFtcHR6X2xlX2RhdGV8dGltZXN0YW1wdHpfbGVfdGltZXN0YW1wfHRpbWVzdGFtcHR6X2x0fHRpbWVzdGFtcHR6X2x0X2RhdGV8IiArCiAgICAgICAgInRpbWVzdGFtcHR6X2x0X3RpbWVzdGFtcHx0aW1lc3RhbXB0el9taXx0aW1lc3RhbXB0el9taV9pbnRlcnZhbHx0aW1lc3RhbXB0el9uZXwiICsKICAgICAgICAidGltZXN0YW1wdHpfbmVfZGF0ZXx0aW1lc3RhbXB0el9uZV90aW1lc3RhbXB8dGltZXN0YW1wdHpfb3V0fCIgKwogICAgICAgICJ0aW1lc3RhbXB0el9wbF9pbnRlcnZhbHx0aW1lc3RhbXB0el9yZWN2fHRpbWVzdGFtcHR6X3NlbmR8dGltZXN0YW1wdHpfc21hbGxlcnwiICsKICAgICAgICAidGltZXN0YW1wdHp0eXBtb2Rpbnx0aW1lc3RhbXB0enR5cG1vZG91dHx0aW1ldHlwbW9kaW58dGltZXR5cG1vZG91dHx0aW1ldHpfY21wfCIgKwogICAgICAgICJ0aW1ldHpfZXF8dGltZXR6X2dlfHRpbWV0el9ndHx0aW1ldHpfaGFzaHx0aW1ldHpfaW58dGltZXR6X2xhcmdlcnx0aW1ldHpfbGV8dGltZXR6X2x0fCIgKwogICAgICAgICJ0aW1ldHpfbWlfaW50ZXJ2YWx8dGltZXR6X25lfHRpbWV0el9vdXR8dGltZXR6X3BsX2ludGVydmFsfHRpbWV0el9yZWN2fHRpbWV0el9zZW5kfCIgKwogICAgICAgICJ0aW1ldHpfc21hbGxlcnx0aW1ldHpkYXRlX3BsfHRpbWV0enR5cG1vZGlufHRpbWV0enR5cG1vZG91dHx0aW1lem9uZXx0aW50ZXJ2YWx8IiArCiAgICAgICAgInRpbnRlcnZhbGN0fHRpbnRlcnZhbGVuZHx0aW50ZXJ2YWxlcXx0aW50ZXJ2YWxnZXx0aW50ZXJ2YWxndHx0aW50ZXJ2YWxpbnx0aW50ZXJ2YWxsZXwiICsKICAgICAgICAidGludGVydmFsbGVuZXF8dGludGVydmFsbGVuZ2V8dGludGVydmFsbGVuZ3R8dGludGVydmFsbGVubGV8dGludGVydmFsbGVubHR8IiArCiAgICAgICAgInRpbnRlcnZhbGxlbm5lfHRpbnRlcnZhbGx0fHRpbnRlcnZhbG5lfHRpbnRlcnZhbG91dHx0aW50ZXJ2YWxvdnx0aW50ZXJ2YWxyZWN2fCIgKwogICAgICAgICJ0aW50ZXJ2YWxyZWx8dGludGVydmFsc2FtZXx0aW50ZXJ2YWxzZW5kfHRpbnRlcnZhbHN0YXJ0fHRvX2FzY2lpfHRvX2NoYXJ8dG9fZGF0ZXx0b19oZXh8IiArCiAgICAgICAgInRvX251bWJlcnx0b190aW1lc3RhbXB8dG9fdHNxdWVyeXx0b190c3ZlY3Rvcnx0cmFuc2FjdGlvbl90aW1lc3RhbXB8dHJhbnNsYXRlfCIgKwogICAgICAgICJ0cmlnZ2VyX2lufHRyaWdnZXJfb3V0fHRydW5jfHRzX2RlYnVnfHRzX2hlYWRsaW5lfHRzX2xleGl6ZXx0c19tYXRjaF9xdnx0c19tYXRjaF90cXwiICsKICAgICAgICAidHNfbWF0Y2hfdHR8dHNfbWF0Y2hfdnF8dHNfcGFyc2V8dHNfcmFua3x0c19yYW5rX2NkfHRzX3Jld3JpdGV8dHNfc3RhdHx0c190b2tlbl90eXBlfCIgKwogICAgICAgICJ0c190eXBhbmFseXplfHRzbWF0Y2hqb2luc2VsfHRzbWF0Y2hzZWx8dHNxX21jb250YWluZWR8dHNxX21jb250YWluc3x0c3F1ZXJ5X2FuZHwiICsKICAgICAgICAidHNxdWVyeV9jbXB8dHNxdWVyeV9lcXx0c3F1ZXJ5X2dlfHRzcXVlcnlfZ3R8dHNxdWVyeV9sZXx0c3F1ZXJ5X2x0fHRzcXVlcnlfbmV8IiArCiAgICAgICAgInRzcXVlcnlfbm90fHRzcXVlcnlfb3J8dHNxdWVyeWlufHRzcXVlcnlvdXR8dHNxdWVyeXJlY3Z8dHNxdWVyeXNlbmR8dHN2ZWN0b3JfY21wfCIgKwogICAgICAgICJ0c3ZlY3Rvcl9jb25jYXR8dHN2ZWN0b3JfZXF8dHN2ZWN0b3JfZ2V8dHN2ZWN0b3JfZ3R8dHN2ZWN0b3JfbGV8dHN2ZWN0b3JfbHR8IiArCiAgICAgICAgInRzdmVjdG9yX25lfHRzdmVjdG9yX3VwZGF0ZV90cmlnZ2VyfHRzdmVjdG9yX3VwZGF0ZV90cmlnZ2VyX2NvbHVtbnx0c3ZlY3RvcmlufCIgKwogICAgICAgICJ0c3ZlY3Rvcm91dHx0c3ZlY3RvcnJlY3Z8dHN2ZWN0b3JzZW5kfHR4aWRfY3VycmVudHx0eGlkX2N1cnJlbnRfc25hcHNob3R8IiArCiAgICAgICAgInR4aWRfc25hcHNob3RfaW58dHhpZF9zbmFwc2hvdF9vdXR8dHhpZF9zbmFwc2hvdF9yZWN2fHR4aWRfc25hcHNob3Rfc2VuZHwiICsKICAgICAgICAidHhpZF9zbmFwc2hvdF94aXB8dHhpZF9zbmFwc2hvdF94bWF4fHR4aWRfc25hcHNob3RfeG1pbnx0eGlkX3Zpc2libGVfaW5fc25hcHNob3R8IiArCiAgICAgICAgInVoY190b191dGY4fHVuaXF1ZV9rZXlfcmVjaGVja3x1bmtub3duaW58dW5rbm93bm91dHx1bmtub3ducmVjdnx1bmtub3duc2VuZHx1bm5lc3R8IiArCiAgICAgICAgInVwcGVyfHV0ZjhfdG9fYXNjaWl8dXRmOF90b19iaWc1fHV0ZjhfdG9fZXVjX2NufHV0ZjhfdG9fZXVjX2ppc18yMDA0fHV0ZjhfdG9fZXVjX2pwfCIgKwogICAgICAgICJ1dGY4X3RvX2V1Y19rcnx1dGY4X3RvX2V1Y190d3x1dGY4X3RvX2diMTgwMzB8dXRmOF90b19nYmt8dXRmOF90b19pc284ODU5fCIgKwogICAgICAgICJ1dGY4X3RvX2lzbzg4NTlfMXx1dGY4X3RvX2pvaGFifHV0ZjhfdG9fa29pOHJ8dXRmOF90b19rb2k4dXx1dGY4X3RvX3NoaWZ0X2ppc18yMDA0fCIgKwogICAgICAgICJ1dGY4X3RvX3NqaXN8dXRmOF90b191aGN8dXRmOF90b193aW58dXVpZF9jbXB8dXVpZF9lcXx1dWlkX2dlfHV1aWRfZ3R8dXVpZF9oYXNofHV1aWRfaW58IiArCiAgICAgICAgInV1aWRfbGV8dXVpZF9sdHx1dWlkX25lfHV1aWRfb3V0fHV1aWRfcmVjdnx1dWlkX3NlbmR8dmFyX3BvcHx2YXJfc2FtcHx2YXJiaXRfaW58IiArCiAgICAgICAgInZhcmJpdF9vdXR8dmFyYml0X3JlY3Z8dmFyYml0X3NlbmR8dmFyYml0Y21wfHZhcmJpdGVxfHZhcmJpdGdlfHZhcmJpdGd0fHZhcmJpdGxlfCIgKwogICAgICAgICJ2YXJiaXRsdHx2YXJiaXRuZXx2YXJiaXR0eXBtb2Rpbnx2YXJiaXR0eXBtb2RvdXR8dmFyY2hhcmlufHZhcmNoYXJvdXR8dmFyY2hhcnJlY3Z8IiArCiAgICAgICAgInZhcmNoYXJzZW5kfHZhcmNoYXJ0eXBtb2Rpbnx2YXJjaGFydHlwbW9kb3V0fHZhcmlhbmNlfHZlcnNpb258dm9pZF9pbnx2b2lkX291dHwiICsKICAgICAgICAidm9pZF9yZWN2fHZvaWRfc2VuZHx3aWR0aHx3aWR0aF9idWNrZXR8d2luMTI1MF90b19sYXRpbjJ8d2luMTI1MF90b19taWN8d2luMTI1MV90b19pc298IiArCiAgICAgICAgIndpbjEyNTFfdG9fa29pOHJ8d2luMTI1MV90b19taWN8d2luMTI1MV90b193aW44NjZ8d2luODY2X3RvX2lzb3x3aW44NjZfdG9fa29pOHJ8IiArCiAgICAgICAgIndpbjg2Nl90b19taWN8d2luODY2X3RvX3dpbjEyNTF8d2luX3RvX3V0Zjh8eGlkZXF8eGlkZXFpbnQ0fHhpZGlufHhpZG91dHx4aWRyZWN2fHhpZHNlbmR8IiArCiAgICAgICAgInhtbHx4bWxfaW58eG1sX2lzX3dlbGxfZm9ybWVkfHhtbF9pc193ZWxsX2Zvcm1lZF9jb250ZW50fHhtbF9pc193ZWxsX2Zvcm1lZF9kb2N1bWVudHwiICsKICAgICAgICAieG1sX291dHx4bWxfcmVjdnx4bWxfc2VuZHx4bWxhZ2d8eG1sY29tbWVudHx4bWxjb25jYXQyfHhtbGV4aXN0c3x4bWx2YWxpZGF0ZXx4cGF0aHwiICsKICAgICAgICAieHBhdGhfZXhpc3RzIikuc3BsaXQoInwiKQogICAgKTsKICAgIAogICAgdmFyIHNxbFJ1bGVzID0gWwogICAgICAgIHsKICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUgc3RyaW5nIC0tIGFzc3VtZSBkb2xsYXIgc3RyaW5ncyBpZiBtdWx0aS1saW5lIGZvciBub3cKICAgICAgICAgICAgcmVnZXggOiAiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogInZhcmlhYmxlLmxhbmd1YWdlIiwgLy8gcGcgaWRlbnRpZmllcgogICAgICAgICAgICByZWdleCA6ICciLio/IicKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdAogICAgICAgICAgICByZWdleCA6ICJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChidWlsdGluRnVuY3Rpb25zLmhhc093blByb3BlcnR5KHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5mdW5jdGlvbiI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICByZWdleCA6ICJbYS16QS1aX11bYS16QS1aMC05XyRdKlxcYiIgLy8gVE9ETyAtIFVuaWNvZGUgaW4gaWRlbnRpZmllcnMKICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwKICAgICAgICAgICAgICByZWdleCA6ICIhfCEhfCF+fCF+XFwqfCF+fnwhfn5cXCp8I3wjI3wjPHwjPD18Izw+fCM9fCM+fCM+PXwlfFxcJnxcXCZcXCZ8XFwmPHxcXCY8XFx8fFxcJj58XFwqfFxcK3wiICsKICAgICAgICAgICAgICAgICAgICAgICJcXC18L3w8fDwjPnw8XFwtPnw8PHw8PD18PDxcXHx8PD18PD58PFxcPz58PEB8PFxcXnw9fD58Pj18Pj58Pj49fD5cXF58XFw/I3xcXD9cXC18XFw/XFwtXFx8fCIgKwogICAgICAgICAgICAgICAgICAgICAgIlxcP1xcfHxcXD9cXHxcXHx8QHxAXFwtQHxAPnxAQHxAQEB8XFxefFxcfHxcXHxcXCY+fFxcfC98XFx8Pj58XFx8XFx8fFxcfFxcfC98fnx+XFwqfH48PX58fjx+fCIgKwogICAgICAgICAgICAgICAgICAgICAgIn49fH4+PX58fj5+fH5+fH5+XFwqIgogICAgICAgICAgfSwgewogICAgICAgICAgICAgIHRva2VuIDogImxwYXJlbi5wYXJlbiIsCiAgICAgICAgICAgICAgcmVnZXggOiAiW1xcKF0iCiAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwKICAgICAgICAgICAgICByZWdleCA6ICJbXFwpXSIKICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIgogICAgICAgICAgfQogICAgXTsKICAgICAgICAgICAKCiAgICB0aGlzLiRydWxlcyA9IHsKICAgICAgICAic3RhcnQiIDogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIi0tLiokIgogICAgICAgICAgICB9LCAKICAgICAgICAgICAgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0IiksCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aS1saW5lIGNvbW1lbnQKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiCiAgICAgICAgICAgIH0sewogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZC5zdGF0ZW1lbnRCZWdpbiIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJeW2EtekEtWl0rIiwgLy8gQ291bGQgZW51bWVyYXRlIHN0YXJ0aW5nIGtleXdvcmRzIGJ1dCB0aGlzIGFsbG93cyB0aGluZ3MgdG8gd29yayB3aGVuIG5ldyBzdGF0ZW1lbnRzIGFyZSBhZGRlZC4KICAgICAgICAgICAgICAgIG5leHQgOiAic3RhdGVtZW50IgogICAgICAgICAgICB9LHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN1cHBvcnQuYnVpbGRpbiIsIC8vIHBzcWwgZGlyZWN0aXZlCiAgICAgICAgICAgICAgICByZWdleCA6ICJeXFxcXFtcXFNdKy4qJCIKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgCiAgICAgICAgInN0YXRlbWVudCIgOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiLS0uKiQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aS1saW5lIGNvbW1lbnQKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnRTdGF0ZW1lbnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0YXRlbWVudEVuZCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICI7IiwKICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHBlcmwsIHB5dGhvbiwgdGNsIGFyZSBpbiB0aGUgcGcgZGVmYXVsdCBkaXN0IChubyB0Y2wgaGlnaGxpZ2h0ZXIpCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXCRwZXJsXFwkIiwKICAgICAgICAgICAgICAgIG5leHQgOiAicGVybC1zdGFydCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcJHB5dGhvblxcJCIsCiAgICAgICAgICAgICAgICBuZXh0IDogInB5dGhvbi1zdGFydCIKICAgICAgICAgICAgfSx7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwkW1xcd18wLTldKlxcJCQiLCAvLyBkb2xsYXIgcXVvdGUgYXQgdGhlIGVuZCBvZiBhIGxpbmUKICAgICAgICAgICAgICAgIG5leHQgOiAiZG9sbGFyU3FsIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwkW1xcd18wLTldKlxcJCIsCiAgICAgICAgICAgICAgICBuZXh0IDogImRvbGxhclN0YXRlbWVudFN0cmluZyIKICAgICAgICAgICAgfQogICAgICAgIF0uY29uY2F0KHNxbFJ1bGVzKSwKICAgICAgICAKICAgICAgICAiZG9sbGFyU3FsIiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICItLS4qJCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpLWxpbmUgY29tbWVudAogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwKICAgICAgICAgICAgICAgIG5leHQgOiAiY29tbWVudERvbGxhclNxbCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gZW5kIHF1b3Rpbmcgd2l0aCBkb2xsYXIgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZQogICAgICAgICAgICAgICAgcmVnZXggOiAiXlxcJFtcXHdfMC05XSpcXCQiLAogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGF0ZW1lbnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXCRbXFx3XzAtOV0qXFwkIiwKICAgICAgICAgICAgICAgIG5leHQgOiAiZG9sbGFyU3FsU3RyaW5nIgogICAgICAgICAgICB9CiAgICAgICAgXS5jb25jYXQoc3FsUnVsZXMpLAogICAgICAgIAogICAgICAgICJjb21tZW50IiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudAogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwKICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIgogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAKICAgICAgICAiY29tbWVudFN0YXRlbWVudCIgOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQKICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXRlbWVudCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAiLisiCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgIAogICAgICAgICJjb21tZW50RG9sbGFyU3FsIiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudAogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwKICAgICAgICAgICAgICAgIG5leHQgOiAiZG9sbGFyU3FsIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyIKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgCiAgICAgICAgImRvbGxhclN0YXRlbWVudFN0cmluZyIgOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIGNsb3NpbmcgZG9sbGFyc3RyaW5nCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKj9cXCRbXFx3XzAtOV0qXFwkIiwKICAgICAgICAgICAgICAgIG5leHQgOiAic3RhdGVtZW50IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBkb2xsYXJzdHJpbmcgc3Bhbm5pbmcgd2hvbGUgbGluZQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAiLisiCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgIAogICAgICAgICJkb2xsYXJTcWxTdHJpbmciIDogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBjbG9zaW5nIGRvbGxhcnN0cmluZwogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwkW1xcd18wLTldKlxcJCIsCiAgICAgICAgICAgICAgICBuZXh0IDogImRvbGxhclNxbCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gZG9sbGFyc3RyaW5nIHNwYW5uaW5nIHdob2xlIGxpbmUKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfTsKICAgIAogICAgdGhpcy5lbWJlZFJ1bGVzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgImRvYy0iLCBbIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRFbmRSdWxlKCJzdGFydCIpIF0pOwogICAgdGhpcy5lbWJlZFJ1bGVzKFBlcmxIaWdobGlnaHRSdWxlcywgInBlcmwtIiwgW3t0b2tlbiA6ICJzdHJpbmciLCByZWdleCA6ICJcXCRwZXJsXFwkIiwgbmV4dCA6ICJzdGF0ZW1lbnQifV0pOwogICAgdGhpcy5lbWJlZFJ1bGVzKFB5dGhvbkhpZ2hsaWdodFJ1bGVzLCAicHl0aG9uLSIsIFt7dG9rZW4gOiAic3RyaW5nIiwgcmVnZXggOiAiXFwkcHl0aG9uXFwkIiwgbmV4dCA6ICJzdGF0ZW1lbnQifV0pOwp9OwoKb29wLmluaGVyaXRzKFBnc3FsSGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7CgpleHBvcnRzLlBnc3FsSGlnaGxpZ2h0UnVsZXMgPSBQZ3NxbEhpZ2hsaWdodFJ1bGVzOwp9KTsKCi8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7Cgp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7CgogICAgdGhpcy4kcnVsZXMgPSB7CiAgICAgICAgInN0YXJ0IiA6IFsgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYy50YWciLAogICAgICAgICAgICByZWdleCA6ICJAW1xcd1xcZF9dKyIgLy8gVE9ETzogZml4IGVtYWlsIGFkZHJlc3NlcwogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlxccysiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiVE9ETyIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICJbXkBcXCpdKyIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICIuIgogICAgICAgIH1dCiAgICB9Owp9OwoKb29wLmluaGVyaXRzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmdldFN0YXJ0UnVsZSA9IGZ1bmN0aW9uKHN0YXJ0KSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLCAvLyBkb2MgY29tbWVudAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKig/PVxcKikiLAogICAgICAgICAgICBuZXh0ICA6IHN0YXJ0CiAgICAgICAgfTsKICAgIH07CiAgICAKICAgIHRoaXMuZ2V0RW5kUnVsZSA9IGZ1bmN0aW9uIChzdGFydCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gY2xvc2luZyBjb21tZW50CiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiXFwqXFwvIiwKICAgICAgICAgICAgbmV4dCAgOiBzdGFydAogICAgICAgIH07CiAgICB9OwoKfSkuY2FsbChEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMucHJvdG90eXBlKTsKCmV4cG9ydHMuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzOwoKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgUGFuYWdpb3RpcyBBc3RpdGhhcyA8cGFzdGl0aCBBVCBnbWFpbCBET1QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9wZXJsX2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9sYW5nJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7CnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOwoKdmFyIFBlcmxIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgewoKICAgIHZhciBrZXl3b3JkcyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoImJhc2V8Y29uc3RhbnR8Y29udGludWV8ZWxzZXxlbHNpZnxmb3J8Zm9yZWFjaHxmb3JtYXR8Z290b3xpZnxsYXN0fGxvY2FsfG15fG5leHR8IiArCiAgICAgICAgICJub3xwYWNrYWdlfHBhcmVudHxyZWRvfHJlcXVpcmV8c2NhbGFyfHN1Ynx1bmxlc3N8dW50aWx8d2hpbGV8dXNlfHZhcnMiKS5zcGxpdCgifCIpCiAgICApOwoKICAgIHZhciBidWlsZGluQ29uc3RhbnRzID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgiQVJHVnxFTlZ8SU5DfFNJRyIpLnNwbGl0KCJ8IikKICAgICk7CgogICAgdmFyIGJ1aWx0aW5GdW5jdGlvbnMgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCJnZXRwcm90b2J5bnVtYmVyfGdldHByb3RvYnluYW1lfGdldHNlcnZieW5hbWV8Z2V0aG9zdGJ5YWRkcnwiICsKICAgICAgICAgImdldGhvc3RieW5hbWV8Z2V0c2VydmJ5cG9ydHxnZXRuZXRieWFkZHJ8Z2V0bmV0YnluYW1lfGdldHNvY2tuYW1lfCIgKwogICAgICAgICAiZ2V0cGVlcm5hbWV8c2V0cHJpb3JpdHl8Z2V0cHJvdG9lbnR8c2V0cHJvdG9lbnR8Z2V0cHJpb3JpdHl8IiArCiAgICAgICAgICJlbmRwcm90b2VudHxnZXRzZXJ2ZW50fHNldHNlcnZlbnR8ZW5kc2VydmVudHxzZXRob3N0ZW50fHNvY2tldHBhaXJ8IiArCiAgICAgICAgICJnZXRzb2Nrb3B0fGdldGhvc3RlbnR8ZW5kaG9zdGVudHxzZXRzb2Nrb3B0fHNldG5ldGVudHxxdW90ZW1ldGF8IiArCiAgICAgICAgICJsb2NhbHRpbWV8cHJvdG90eXBlfGdldG5ldGVudHxlbmRuZXRlbnR8cmV3aW5kZGlyfHdhbnRhcnJheXxnZXRwd3VpZHwiICsKICAgICAgICAgImNsb3NlZGlyfGdldGxvZ2lufHJlYWRsaW5rfGVuZGdyZW50fGdldGdyZ2lkfGdldGdybmFtfHNobXdyaXRlfCIgKwogICAgICAgICAic2h1dGRvd258cmVhZGxpbmV8ZW5kcHdlbnR8c2V0Z3JlbnR8cmVhZHBpcGV8Zm9ybWxpbmV8dHJ1bmNhdGV8IiArCiAgICAgICAgICJkYm1jbG9zZXxzeXN3cml0ZXxzZXRwd2VudHxnZXRwd25hbXxnZXRncmVudHxnZXRwd2VudHx1Y2ZpcnN0fHN5c3JlYWR8IiArCiAgICAgICAgICJzZXRwZ3JwfHNobXJlYWR8c3lzc2Vla3xzeXNvcGVufHRlbGxkaXJ8ZGVmaW5lZHxvcGVuZGlyfGNvbm5lY3R8IiArCiAgICAgICAgICJsY2ZpcnN0fGdldHBwaWR8YmlubW9kZXxzeXNjYWxsfHNwcmludGZ8Z2V0cGdycHxyZWFkZGlyfHNlZWtkaXJ8IiArCiAgICAgICAgICJ3YWl0cGlkfHJldmVyc2V8dW5zaGlmdHxzeW1saW5rfGRibW9wZW58c2VtZ2V0fG1zZ3JjdnxyZW5hbWV8bGlzdGVufCIgKwogICAgICAgICAiY2hyb290fG1zZ3NuZHxzaG1jdGx8YWNjZXB0fHVucGFja3xleGlzdHN8ZmlsZW5vfHNobWdldHxzeXN0ZW18IiArCiAgICAgICAgICJ1bmxpbmt8cHJpbnRmfGdtdGltZXxtc2djdGx8c2VtY3RsfHZhbHVlc3xyaW5kZXh8c3Vic3RyfHNwbGljZXwiICsKICAgICAgICAgImxlbmd0aHxtc2dnZXR8c2VsZWN0fHNvY2tldHxyZXR1cm58Y2FsbGVyfGRlbGV0ZXxhbGFybXxpb2N0bHxpbmRleHwiICsKICAgICAgICAgInVuZGVmfGxzdGF0fHRpbWVzfHNyYW5kfGNob3dufGZjbnRsfGNsb3NlfHdyaXRlfHVtYXNrfHJtZGlyfHN0dWR5fCIgKwogICAgICAgICAic2xlZXB8Y2hvbXB8dW50aWV8cHJpbnR8dXRpbWV8bWtkaXJ8YXRhbjJ8c3BsaXR8Y3J5cHR8ZmxvY2t8Y2htb2R8IiArCiAgICAgICAgICJCRUdJTnxibGVzc3xjaGRpcnxzZW1vcHxzaGlmdHxyZXNldHxsaW5rfHN0YXR8Y2hvcHxncmVwfGZvcmt8ZHVtcHwiICsKICAgICAgICAgImpvaW58b3Blbnx0ZWxsfHBpcGV8ZXhpdHxnbG9ifHdhcm58ZWFjaHxiaW5kfHNvcnR8cGFja3xldmFsfHB1c2h8IiArCiAgICAgICAgICJrZXlzfGdldGN8a2lsbHxzZWVrfHNxcnR8c2VuZHx3YWl0fHJhbmR8dGllZHxyZWFkfHRpbWV8ZXhlY3xyZWN2fCIgKwogICAgICAgICAiZW9mfGNocnxpbnR8b3JkfGV4cHxwb3N8cG9wfHNpbnxsb2d8YWJzfG9jdHxoZXh8dGllfGNvc3x2ZWN8RU5EfHJlZnwiICsKICAgICAgICAgIm1hcHxkaWV8dWN8bGN8ZG8iKS5zcGxpdCgifCIpCiAgICApOwoKICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcy4gVXNlICg/OikgaW5zdGVhZC4KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQKCiAgICB0aGlzLiRydWxlcyA9IHsKICAgICAgICAic3RhcnQiIDogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIiMuKiQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZy5yZWdleHAiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiWy9dKD86KD86XFxbKD86XFxcXF18W15cXF1dKStcXF0pfCg/OlxcXFwvfFteXFxdL10pKSpbL11cXHcqXFxzKig/PVspLiw7XXwkKSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUKICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0CiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0uKlxcXFwkJywKICAgICAgICAgICAgICAgIG5leHQgOiAicXFzdHJpbmciCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydAogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddLipcXFxcJCIsCiAgICAgICAgICAgICAgICBuZXh0IDogInFzdHJpbmciCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBoZXgKICAgICAgICAgICAgICAgIHJlZ2V4IDogIjB4WzAtOWEtZkEtRl0rXFxiIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGtleXdvcmRzLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsZGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYnVpbHRpbkZ1bmN0aW9ucy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5mdW5jdGlvbiI7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImlkZW50aWZpZXIiOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC5cXC5cXC58XFx8XFx8PXw+Pj18PDw9fDw9PnwmJj18PT58IX58XFxePXwmPXxcXHw9fFxcLj18eD18JT18XFwvPXxcXCo9fFxcLT18XFwrPXw9fnxcXCpcXCp8XFwtXFwtfFxcLlxcLnxcXHxcXHx8JiZ8XFwrXFwrfFxcLT58IT18PT18Pj18PD18Pj58PDx8LHw9fFxcP1xcOnxcXF58XFx8fHh8JXxcXC98XFwqfDx8JnxcXFxcfH58IXw+fFxcLnxcXC18XFwrfFxcLUN8XFwtYnxcXC1TfFxcLXV8XFwtdHxcXC1wfFxcLWx8XFwtZHxcXC1mfFxcLWd8XFwtc3xcXC16fFxcLWt8XFwtZXxcXC1PfFxcLVR8XFwtQnxcXC1NfFxcLUF8XFwtWHxcXC1XfFxcLWN8XFwtUnxcXC1vfFxcLXh8XFwtd3xcXC1yfFxcYig/OmFuZHxjbXB8ZXF8Z2V8Z3R8bGV8bHR8bmV8bm90fG9yfHhvcikiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImxwYXJlbiIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJbWyh7XSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAicnBhcmVuIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIltcXF0pfV0iCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFxzKyIKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInFxc3RyaW5nIiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogJyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJywKICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKycKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInFzdHJpbmciIDogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqPyciLAogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJwogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfTsKfTsKCm9vcC5pbmhlcml0cyhQZXJsSGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7CgpleHBvcnRzLlBlcmxIaWdobGlnaHRSdWxlcyA9IFBlcmxIaWdobGlnaHRSdWxlczsKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICogICAgICBDb2xpbiBHb3VybGF5IDxjb2xpbiBET1QgaiBET1QgZ291cmxheSBBVCBnbWFpbCBET1QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKgogKgogKiBUT0RPOiBweXRob24gZGVsaW1pdGVycwogKi8KCmRlZmluZSgnYWNlL21vZGUvcHl0aG9uX2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9sYW5nJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7CnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOwoKdmFyIFB5dGhvbkhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7CgogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgiYW5kfGFzfGFzc2VydHxicmVha3xjbGFzc3xjb250aW51ZXxkZWZ8ZGVsfGVsaWZ8ZWxzZXxleGNlcHR8ZXhlY3wiICsKICAgICAgICAiZmluYWxseXxmb3J8ZnJvbXxnbG9iYWx8aWZ8aW1wb3J0fGlufGlzfGxhbWJkYXxub3R8b3J8cGFzc3xwcmludHwiICsKICAgICAgICAicmFpc2V8cmV0dXJufHRyeXx3aGlsZXx3aXRofHlpZWxkIikuc3BsaXQoInwiKQogICAgKTsKCiAgICB2YXIgYnVpbHRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoIlRydWV8RmFsc2V8Tm9uZXxOb3RJbXBsZW1lbnRlZHxFbGxpcHNpc3xfX2RlYnVnX18iKS5zcGxpdCgifCIpCiAgICApOwoKICAgIHZhciBidWlsdGluRnVuY3Rpb25zID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgiYWJzfGRpdm1vZHxpbnB1dHxvcGVufHN0YXRpY21ldGhvZHxhbGx8ZW51bWVyYXRlfGludHxvcmR8c3RyfGFueXwiICsKICAgICAgICAiZXZhbHxpc2luc3RhbmNlfHBvd3xzdW18YmFzZXN0cmluZ3xleGVjZmlsZXxpc3N1YmNsYXNzfHByaW50fHN1cGVyfCIgKwogICAgICAgICJiaW5maWxlfGl0ZXJ8cHJvcGVydHl8dHVwbGV8Ym9vbHxmaWx0ZXJ8bGVufHJhbmdlfHR5cGV8Ynl0ZWFycmF5fCIgKwogICAgICAgICJmbG9hdHxsaXN0fHJhd19pbnB1dHx1bmljaHJ8Y2FsbGFibGV8Zm9ybWF0fGxvY2Fsc3xyZWR1Y2V8dW5pY29kZXwiICsKICAgICAgICAiY2hyfGZyb3plbnNldHxsb25nfHJlbG9hZHx2YXJzfGNsYXNzbWV0aG9kfGdldGF0dHJ8bWFwfHJlcHJ8eHJhbmdlfCIgKwogICAgICAgICJjbXB8Z2xvYmFsc3xtYXh8cmV2ZXJzZWR8emlwfGNvbXBpbGV8aGFzYXR0cnxtZW1vcnl2aWV3fHJvdW5kfCIgKwogICAgICAgICJfX2ltcG9ydF9ffGNvbXBsZXh8aGFzaHxtaW58c2V0fGFwcGx5fGRlbGF0dHJ8aGVscHxuZXh0fHNldGF0dHJ8IiArCiAgICAgICAgImJ1ZmZlcnxkaWN0fGhleHxvYmplY3R8c2xpY2V8Y29lcmNlfGRpcnxpZHxvY3R8c29ydGVkfGludGVybiIpLnNwbGl0KCJ8IikKICAgICk7CgogICAgdmFyIGZ1dHVyZVJlc2VydmVkID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgiIikuc3BsaXQoInwiKQogICAgKTsKCiAgICB2YXIgc3RyUHJlID0gIig/OnJ8dXx1cnxSfFV8VVJ8VXJ8dVIpPyI7CgogICAgdmFyIGRlY2ltYWxJbnRlZ2VyID0gIig/Oig/OlsxLTldXFxkKil8KD86MCkpIjsKICAgIHZhciBvY3RJbnRlZ2VyID0gIig/OjBbb09dP1swLTddKykiOwogICAgdmFyIGhleEludGVnZXIgPSAiKD86MFt4WF1bXFxkQS1GYS1mXSspIjsKICAgIHZhciBiaW5JbnRlZ2VyID0gIig/OjBbYkJdWzAxXSspIjsKICAgIHZhciBpbnRlZ2VyID0gIig/OiIgKyBkZWNpbWFsSW50ZWdlciArICJ8IiArIG9jdEludGVnZXIgKyAifCIgKyBoZXhJbnRlZ2VyICsgInwiICsgYmluSW50ZWdlciArICIpIjsKCiAgICB2YXIgZXhwb25lbnQgPSAiKD86W2VFXVsrLV0/XFxkKykiOwogICAgdmFyIGZyYWN0aW9uID0gIig/OlxcLlxcZCspIjsKICAgIHZhciBpbnRQYXJ0ID0gIig/OlxcZCspIjsKICAgIHZhciBwb2ludEZsb2F0ID0gIig/Oig/OiIgKyBpbnRQYXJ0ICsgIj8iICsgZnJhY3Rpb24gKyAiKXwoPzoiICsgaW50UGFydCArICJcXC4pKSI7CiAgICB2YXIgZXhwb25lbnRGbG9hdCA9ICIoPzooPzoiICsgcG9pbnRGbG9hdCArICJ8IiArICBpbnRQYXJ0ICsgIikiICsgZXhwb25lbnQgKyAiKSI7CiAgICB2YXIgZmxvYXROdW1iZXIgPSAiKD86IiArIGV4cG9uZW50RmxvYXQgKyAifCIgKyBwb2ludEZsb2F0ICsgIikiOwoKICAgIHRoaXMuJHJ1bGVzID0gewogICAgICAgICJzdGFydCIgOiBbIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgIHJlZ2V4IDogIiMuKiQiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gIiIiIHN0cmluZwogICAgICAgICAgICByZWdleCA6IHN0clByZSArICciezN9KD86W15cXFxcXXxcXFxcLikqPyJ7M30nCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gbXVsdGkgbGluZSAiIiIgc3RyaW5nIHN0YXJ0CiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAnInszfS4qJCcsCiAgICAgICAgICAgIG5leHQgOiAicXFzdHJpbmciCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gIiBzdHJpbmcKICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAnIig/OlteXFxcXF18XFxcXC4pKj8iJwogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgICAgICAgICAgIC8vICcnJyBzdHJpbmcKICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAiJ3szfSg/OlteXFxcXF18XFxcXC4pKj8nezN9IgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgICAgICAgICAgIC8vIG11bHRpIGxpbmUgJycnIHN0cmluZyBzdGFydAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgIid7M30uKiQiLAogICAgICAgICAgICBuZXh0IDogInFzdHJpbmciCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gJyBzdHJpbmcKICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAiJyg/OlteXFxcXF18XFxcXC4pKj8nIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGltYWdpbmFyeQogICAgICAgICAgICByZWdleCA6ICIoPzoiICsgZmxvYXROdW1iZXIgKyAifFxcZCspW2pKXVxcYiIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdAogICAgICAgICAgICByZWdleCA6IGZsb2F0TnVtYmVyCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gbG9uZyBpbnRlZ2VyCiAgICAgICAgICAgIHJlZ2V4IDogaW50ZWdlciArICJbbExdXFxiIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGludGVnZXIKICAgICAgICAgICAgcmVnZXggOiBpbnRlZ2VyICsgIlxcYiIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWx0aW5Db25zdGFudHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOwogICAgICAgICAgICAgICAgZWxzZSBpZiAoZnV0dXJlUmVzZXJ2ZWQuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5pbGxlZ2FsIjsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWx0aW5GdW5jdGlvbnMuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5mdW5jdGlvbiI7CiAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA9PSAiZGVidWdnZXIiKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICByZXR1cm4gImlkZW50aWZpZXIiOwogICAgICAgICAgICB9LAogICAgICAgICAgICByZWdleCA6ICJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwKICAgICAgICAgICAgcmVnZXggOiAiXFwrfFxcLXxcXCp8XFwqXFwqfFxcL3xcXC9cXC98JXw8PHw+PnwmfFxcfHxcXF58fnw8fD58PD18PT58PT18IT18PD58PSIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImxwYXJlbi5wYXJlbiIsCiAgICAgICAgICAgIHJlZ2V4IDogIltcXFtcXChcXHtdIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwKICAgICAgICAgICAgcmVnZXggOiAiW1xcXVxcKVxcfV0iCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgcmVnZXggOiAiXFxzKyIKICAgICAgICB9IF0sCiAgICAgICAgInFxc3RyaW5nIiA6IFsgewogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lICIiIiBzdHJpbmcgZW5kCiAgICAgICAgICAgIHJlZ2V4IDogJyg/OlteXFxcXF18XFxcXC4pKj8iezN9JywKICAgICAgICAgICAgbmV4dCA6ICJzdGFydCIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAnLisnCiAgICAgICAgfSBdLAogICAgICAgICJxc3RyaW5nIiA6IFsgewogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgLy8gbXVsdGkgbGluZSAnJycgc3RyaW5nIGVuZAogICAgICAgICAgICByZWdleCA6ICIoPzpbXlxcXFxdfFxcXFwuKSo/J3szfSIsCiAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogJy4rJwogICAgICAgIH0gXQogICAgfTsKfTsKCm9vcC5pbmhlcml0cyhQeXRob25IaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsKCmV4cG9ydHMuUHl0aG9uSGlnaGxpZ2h0UnVsZXMgPSBQeXRob25IaWdobGlnaHRSdWxlczsKfSk7CjsKICAgICAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkKICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkoKTsKICAgICAgICA=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-pgsql.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9wZ3NxbCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dCIsImFjZS90b2tlbml6ZXIiLCJhY2UvbW9kZS9wZ3NxbF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSgiYWNlL2xpYi9vb3AiKSxlPWEoImFjZS9tb2RlL3RleHQiKS5Nb2RlLGY9YSgiYWNlL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoImFjZS9tb2RlL3Bnc3FsX2hpZ2hsaWdodF9ydWxlcyIpLlBnc3FsSGlnaGxpZ2h0UnVsZXMsaD1hKCJhY2UvcmFuZ2UiKS5SYW5nZSxpPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSl9O2QuaW5oZXJpdHMoaSxlKSxmdW5jdGlvbigpe3RoaXMudG9nZ2xlQ29tbWVudExpbmVzPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSEwLGY9L14oXHMqKS0tLztmb3IodmFyIGc9YztnPD1kO2crKylpZighZi50ZXN0KGIuZ2V0TGluZShnKSkpe2U9ITE7YnJlYWt9aWYoZSl7dmFyIGk9bmV3IGgoMCwwLDAsMCk7Zm9yKHZhciBnPWM7Zzw9ZDtnKyspe3ZhciBqPWIuZ2V0TGluZShnKSxrPWoubWF0Y2goZik7aS5zdGFydC5yb3c9ZyxpLmVuZC5yb3c9ZyxpLmVuZC5jb2x1bW49a1swXS5sZW5ndGgsYi5yZXBsYWNlKGksa1sxXSl9fWVsc2UgYi5pbmRlbnRSb3dzKGMsZCwiLS0iKX0sdGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGE9PSJzdGFydCJ8fGE9PSJrZXl3b3JkLnN0YXRlbWVudEVuZCI/IiI6dGhpcy4kZ2V0SW5kZW50KGIpfX0uY2FsbChpLnByb3RvdHlwZSksYi5Nb2RlPWl9KSxkZWZpbmUoImFjZS9tb2RlL3Bnc3FsX2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9sYW5nIiwiYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS9wZXJsX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL3B5dGhvbl9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSgiYWNlL2xpYi9vb3AiKSxlPWEoImFjZS9saWIvbGFuZyIpLGY9YSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsZz1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGg9YSgiLi9wZXJsX2hpZ2hsaWdodF9ydWxlcyIpLlBlcmxIaWdobGlnaHRSdWxlcyxpPWEoIi4vcHl0aG9uX2hpZ2hsaWdodF9ydWxlcyIpLlB5dGhvbkhpZ2hsaWdodFJ1bGVzLGo9ZnVuY3Rpb24oKXt2YXIgYT1lLmFycmF5VG9NYXAoImFib3J0fGFic29sdXRlfGFic3RpbWV8YWNjZXNzfGFjbGl0ZW18YWN0aW9ufGFkZHxhZG1pbnxhZnRlcnxhZ2dyZWdhdGV8YWxsfGFsc298YWx0ZXJ8YWx3YXlzfGFuYWx5c2V8YW5hbHl6ZXxhbmR8YW55fGFueWFycmF5fGFueWVsZW1lbnR8YW55ZW51bXxhbnlub25hcnJheXxhcnJheXxhc3xhc2N8YXNzZXJ0aW9ufGFzc2lnbm1lbnR8YXN5bW1ldHJpY3xhdHxhdHRyaWJ1dGV8YXV0aG9yaXphdGlvbnxiYWNrd2FyZHxiZWZvcmV8YmVnaW58YmV0d2VlbnxiaWdpbnR8YmluYXJ5fGJpdHxib29sfGJvb2xlYW58Ym90aHxib3h8YnBjaGFyfGJ5fGJ5dGVhfGNhY2hlfGNhbGxlZHxjYXNjYWRlfGNhc2NhZGVkfGNhc2V8Y2FzdHxjYXRhbG9nfGNoYWlufGNoYXJ8Y2hhcmFjdGVyfGNoYXJhY3RlcmlzdGljc3xjaGVja3xjaGVja3BvaW50fGNpZHxjaWRyfGNpcmNsZXxjbGFzc3xjbG9zZXxjbHVzdGVyfGNvYWxlc2NlfGNvbGxhdGV8Y29sbGF0aW9ufGNvbHVtbnxjb21tZW50fGNvbW1lbnRzfGNvbW1pdHxjb21taXR0ZWR8Y29uY3VycmVudGx5fGNvbmZpZ3VyYXRpb258Y29ubmVjdGlvbnxjb25zdHJhaW50fGNvbnN0cmFpbnRzfGNvbnRlbnR8Y29udGludWV8Y29udmVyc2lvbnxjb3B5fGNvc3R8Y3JlYXRlfGNyb3NzfGNzdHJpbmd8Y3N2fGN1cnJlbnR8Y3VycmVudF9jYXRhbG9nfGN1cnJlbnRfZGF0ZXxjdXJyZW50X3JvbGV8Y3VycmVudF9zY2hlbWF8Y3VycmVudF90aW1lfGN1cnJlbnRfdGltZXN0YW1wfGN1cnJlbnRfdXNlcnxjdXJzb3J8Y3ljbGV8ZGF0YXxkYXRhYmFzZXxkYXRlfGRheXxkZWFsbG9jYXRlfGRlY3xkZWNpbWFsfGRlY2xhcmV8ZGVmYXVsdHxkZWZhdWx0c3xkZWZlcnJhYmxlfGRlZmVycmVkfGRlZmluZXJ8ZGVsZXRlfGRlbGltaXRlcnxkZWxpbWl0ZXJzfGRlc2N8ZGljdGlvbmFyeXxkaXNhYmxlfGRpc2NhcmR8ZGlzdGluY3R8ZG98ZG9jdW1lbnR8ZG9tYWlufGRvdWJsZXxkcm9wfGVhY2h8ZWxzZXxlbmFibGV8ZW5jb2Rpbmd8ZW5jcnlwdGVkfGVuZHxlbnVtfGVzY2FwZXxleGNlcHR8ZXhjbHVkZXxleGNsdWRpbmd8ZXhjbHVzaXZlfGV4ZWN1dGV8ZXhpc3RzfGV4cGxhaW58ZXh0ZW5zaW9ufGV4dGVybmFsfGV4dHJhY3R8ZmFsc2V8ZmFtaWx5fGZkd19oYW5kbGVyfGZldGNofGZpcnN0fGZsb2F0fGZsb2F0NHxmbG9hdDh8Zm9sbG93aW5nfGZvcnxmb3JjZXxmb3JlaWdufGZvcndhcmR8ZnJlZXplfGZyb218ZnVsbHxmdW5jdGlvbnxmdW5jdGlvbnN8Z2xvYmFsfGdyYW50fGdyYW50ZWR8Z3JlYXRlc3R8Z3JvdXB8Z3RzdmVjdG9yfGhhbmRsZXJ8aGF2aW5nfGhlYWRlcnxob2xkfGhvdXJ8aWRlbnRpdHl8aWZ8aWxpa2V8aW1tZWRpYXRlfGltbXV0YWJsZXxpbXBsaWNpdHxpbnxpbmNsdWRpbmd8aW5jcmVtZW50fGluZGV4fGluZGV4ZXN8aW5ldHxpbmhlcml0fGluaGVyaXRzfGluaXRpYWxseXxpbmxpbmV8aW5uZXJ8aW5vdXR8aW5wdXR8aW5zZW5zaXRpdmV8aW5zZXJ0fGluc3RlYWR8aW50fGludDJ8aW50MnZlY3RvcnxpbnQ0fGludDh8aW50ZWdlcnxpbnRlcm5hbHxpbnRlcnNlY3R8aW50ZXJ2YWx8aW50b3xpbnZva2VyfGlzfGlzbnVsbHxpc29sYXRpb258am9pbnxrZXl8bGFiZWx8bGFuZ3VhZ2V8bGFuZ3VhZ2VfaGFuZGxlcnxsYXJnZXxsYXN0fGxjX2NvbGxhdGV8bGNfY3R5cGV8bGVhZGluZ3xsZWFzdHxsZWZ0fGxldmVsfGxpa2V8bGltaXR8bGluZXxsaXN0ZW58bG9hZHxsb2NhbHxsb2NhbHRpbWV8bG9jYWx0aW1lc3RhbXB8bG9jYXRpb258bG9ja3xsc2VnfG1hY2FkZHJ8bWFwcGluZ3xtYXRjaHxtYXh2YWx1ZXxtaW51dGV8bWludmFsdWV8bW9kZXxtb25leXxtb250aHxtb3ZlfG5hbWV8bmFtZXN8bmF0aW9uYWx8bmF0dXJhbHxuY2hhcnxuZXh0fG5vfG5vbmV8bm90fG5vdGhpbmd8bm90aWZ5fG5vdG51bGx8bm93YWl0fG51bGx8bnVsbGlmfG51bGxzfG51bWVyaWN8b2JqZWN0fG9mfG9mZnxvZmZzZXR8b2lkfG9pZHN8b2lkdmVjdG9yfG9ufG9ubHl8b3BhcXVlfG9wZXJhdG9yfG9wdGlvbnxvcHRpb25zfG9yfG9yZGVyfG91dHxvdXRlcnxvdmVyfG92ZXJsYXBzfG92ZXJsYXl8b3duZWR8b3duZXJ8cGFyc2VyfHBhcnRpYWx8cGFydGl0aW9ufHBhc3Npbmd8cGFzc3dvcmR8cGF0aHxwZ19hdHRyaWJ1dGV8cGdfYXV0aF9tZW1iZXJzfHBnX2F1dGhpZHxwZ19jbGFzc3xwZ19kYXRhYmFzZXxwZ19ub2RlX3RyZWV8cGdfcHJvY3xwZ190eXBlfHBsYWNpbmd8cGxhbnN8cG9pbnR8cG9seWdvbnxwb3NpdGlvbnxwcmVjZWRpbmd8cHJlY2lzaW9ufHByZXBhcmV8cHJlcGFyZWR8cHJlc2VydmV8cHJpbWFyeXxwcmlvcnxwcml2aWxlZ2VzfHByb2NlZHVyYWx8cHJvY2VkdXJlfHF1b3RlfHJhbmdlfHJlYWR8cmVhbHxyZWFzc2lnbnxyZWNoZWNrfHJlY29yZHxyZWN1cnNpdmV8cmVmfHJlZmN1cnNvcnxyZWZlcmVuY2VzfHJlZ2NsYXNzfHJlZ2NvbmZpZ3xyZWdkaWN0aW9uYXJ5fHJlZ29wZXJ8cmVnb3BlcmF0b3J8cmVncHJvY3xyZWdwcm9jZWR1cmV8cmVndHlwZXxyZWluZGV4fHJlbGF0aXZlfHJlbGVhc2V8cmVsdGltZXxyZW5hbWV8cmVwZWF0YWJsZXxyZXBsYWNlfHJlcGxpY2F8cmVzZXR8cmVzdGFydHxyZXN0cmljdHxyZXR1cm5pbmd8cmV0dXJuc3xyZXZva2V8cmlnaHR8cm9sZXxyb2xsYmFja3xyb3d8cm93c3xydWxlfHNhdmVwb2ludHxzY2hlbWF8c2Nyb2xsfHNlYXJjaHxzZWNvbmR8c2VjdXJpdHl8c2VsZWN0fHNlcXVlbmNlfHNlcXVlbmNlc3xzZXJpYWxpemFibGV8c2VydmVyfHNlc3Npb258c2Vzc2lvbl91c2VyfHNldHxzZXRvZnxzaGFyZXxzaG93fHNpbWlsYXJ8c2ltcGxlfHNtYWxsaW50fHNtZ3J8c29tZXxzdGFibGV8c3RhbmRhbG9uZXxzdGFydHxzdGF0ZW1lbnR8c3RhdGlzdGljc3xzdGRpbnxzdGRvdXR8c3RvcmFnZXxzdHJpY3R8c3RyaXB8c3Vic3RyaW5nfHN5bW1ldHJpY3xzeXNpZHxzeXN0ZW18dGFibGV8dGFibGVzfHRhYmxlc3BhY2V8dGVtcHx0ZW1wbGF0ZXx0ZW1wb3Jhcnl8dGV4dHx0aGVufHRpZHx0aW1lfHRpbWVzdGFtcHx0aW1lc3RhbXB0enx0aW1ldHp8dGludGVydmFsfHRvfHRyYWlsaW5nfHRyYW5zYWN0aW9ufHRyZWF0fHRyaWdnZXJ8dHJpbXx0cnVlfHRydW5jYXRlfHRydXN0ZWR8dHNxdWVyeXx0c3ZlY3Rvcnx0eGlkX3NuYXBzaG90fHR5cGV8dW5ib3VuZGVkfHVuY29tbWl0dGVkfHVuZW5jcnlwdGVkfHVuaW9ufHVuaXF1ZXx1bmtub3dufHVubGlzdGVufHVubG9nZ2VkfHVudGlsfHVwZGF0ZXx1c2VyfHVzaW5nfHV1aWR8dmFjdXVtfHZhbGlkfHZhbGlkYXRlfHZhbGlkYXRvcnx2YWx1ZXx2YWx1ZXN8dmFyYml0fHZhcmNoYXJ8dmFyaWFkaWN8dmFyeWluZ3x2ZXJib3NlfHZlcnNpb258dmlld3x2b2lkfHZvbGF0aWxlfHdoZW58d2hlcmV8d2hpdGVzcGFjZXx3aW5kb3d8d2l0aHx3aXRob3V0fHdvcmt8d3JhcHBlcnx3cml0ZXx4aWR8eG1sfHhtbGF0dHJpYnV0ZXN8eG1sY29uY2F0fHhtbGVsZW1lbnR8eG1sZXhpc3RzfHhtbGZvcmVzdHx4bWxwYXJzZXx4bWxwaXx4bWxyb290fHhtbHNlcmlhbGl6ZXx5ZWFyfHllc3x6b25lIi5zcGxpdCgifCIpKSxiPWUuYXJyYXlUb01hcCgiUklfRktleV9jYXNjYWRlX2RlbHxSSV9GS2V5X2Nhc2NhZGVfdXBkfFJJX0ZLZXlfY2hlY2tfaW5zfFJJX0ZLZXlfY2hlY2tfdXBkfFJJX0ZLZXlfbm9hY3Rpb25fZGVsfFJJX0ZLZXlfbm9hY3Rpb25fdXBkfFJJX0ZLZXlfcmVzdHJpY3RfZGVsfFJJX0ZLZXlfcmVzdHJpY3RfdXBkfFJJX0ZLZXlfc2V0ZGVmYXVsdF9kZWx8UklfRktleV9zZXRkZWZhdWx0X3VwZHxSSV9GS2V5X3NldG51bGxfZGVsfFJJX0ZLZXlfc2V0bnVsbF91cGR8YWJicmV2fGFic3xhYnN0aW1lfGFic3RpbWVlcXxhYnN0aW1lZ2V8YWJzdGltZWd0fGFic3RpbWVpbnxhYnN0aW1lbGV8YWJzdGltZWx0fGFic3RpbWVuZXxhYnN0aW1lb3V0fGFic3RpbWVyZWN2fGFic3RpbWVzZW5kfGFjbGNvbnRhaW5zfGFjbGV4cGxvZGV8YWNsaW5zZXJ0fGFjbGl0ZW1lcXxhY2xpdGVtaW58YWNsaXRlbW91dHxhY2xyZW1vdmV8YWNvc3xhZ2V8YW55X2lufGFueV9vdXR8YW55YXJyYXlfaW58YW55YXJyYXlfb3V0fGFueWFycmF5X3JlY3Z8YW55YXJyYXlfc2VuZHxhbnllbGVtZW50X2lufGFueWVsZW1lbnRfb3V0fGFueWVudW1faW58YW55ZW51bV9vdXR8YW55bm9uYXJyYXlfaW58YW55bm9uYXJyYXlfb3V0fGFueXRleHRjYXR8YXJlYXxhcmVham9pbnNlbHxhcmVhc2VsfGFycmF5X2FnZ3xhcnJheV9hZ2dfZmluYWxmbnxhcnJheV9hZ2dfdHJhbnNmbnxhcnJheV9hcHBlbmR8YXJyYXlfY2F0fGFycmF5X2RpbXN8YXJyYXlfZXF8YXJyYXlfZmlsbHxhcnJheV9nZXxhcnJheV9ndHxhcnJheV9pbnxhcnJheV9sYXJnZXJ8YXJyYXlfbGV8YXJyYXlfbGVuZ3RofGFycmF5X2xvd2VyfGFycmF5X2x0fGFycmF5X25kaW1zfGFycmF5X25lfGFycmF5X291dHxhcnJheV9wcmVwZW5kfGFycmF5X3JlY3Z8YXJyYXlfc2VuZHxhcnJheV9zbWFsbGVyfGFycmF5X3RvX3N0cmluZ3xhcnJheV91cHBlcnxhcnJheWNvbnRhaW5lZHxhcnJheWNvbnRhaW5zfGFycmF5b3ZlcmxhcHxhc2NpaXxhc2NpaV90b19taWN8YXNjaWlfdG9fdXRmOHxhc2lufGF0YW58YXRhbjJ8YXZnfGJpZzVfdG9fZXVjX3R3fGJpZzVfdG9fbWljfGJpZzVfdG9fdXRmOHxiaXRfYW5kfGJpdF9pbnxiaXRfbGVuZ3RofGJpdF9vcnxiaXRfb3V0fGJpdF9yZWN2fGJpdF9zZW5kfGJpdGFuZHxiaXRjYXR8Yml0Y21wfGJpdGVxfGJpdGdlfGJpdGd0fGJpdGxlfGJpdGx0fGJpdG5lfGJpdG5vdHxiaXRvcnxiaXRzaGlmdGxlZnR8Yml0c2hpZnRyaWdodHxiaXR0eXBtb2RpbnxiaXR0eXBtb2RvdXR8Yml0eG9yfGJvb2x8Ym9vbF9hbmR8Ym9vbF9vcnxib29sYW5kX3N0YXRlZnVuY3xib29sZXF8Ym9vbGdlfGJvb2xndHxib29saW58Ym9vbGxlfGJvb2xsdHxib29sbmV8Ym9vbG9yX3N0YXRlZnVuY3xib29sb3V0fGJvb2xyZWN2fGJvb2xzZW5kfGJveHxib3hfYWJvdmV8Ym94X2Fib3ZlX2VxfGJveF9hZGR8Ym94X2JlbG93fGJveF9iZWxvd19lcXxib3hfY2VudGVyfGJveF9jb250YWlufGJveF9jb250YWluX3B0fGJveF9jb250YWluZWR8Ym94X2Rpc3RhbmNlfGJveF9kaXZ8Ym94X2VxfGJveF9nZXxib3hfZ3R8Ym94X2lufGJveF9pbnRlcnNlY3R8Ym94X2xlfGJveF9sZWZ0fGJveF9sdHxib3hfbXVsfGJveF9vdXR8Ym94X292ZXJhYm92ZXxib3hfb3ZlcmJlbG93fGJveF9vdmVybGFwfGJveF9vdmVybGVmdHxib3hfb3ZlcnJpZ2h0fGJveF9yZWN2fGJveF9yaWdodHxib3hfc2FtZXxib3hfc2VuZHxib3hfc3VifGJwY2hhcl9sYXJnZXJ8YnBjaGFyX3BhdHRlcm5fZ2V8YnBjaGFyX3BhdHRlcm5fZ3R8YnBjaGFyX3BhdHRlcm5fbGV8YnBjaGFyX3BhdHRlcm5fbHR8YnBjaGFyX3NtYWxsZXJ8YnBjaGFyY21wfGJwY2hhcmVxfGJwY2hhcmdlfGJwY2hhcmd0fGJwY2hhcmljbGlrZXxicGNoYXJpY25saWtlfGJwY2hhcmljcmVnZXhlcXxicGNoYXJpY3JlZ2V4bmV8YnBjaGFyaW58YnBjaGFybGV8YnBjaGFybGlrZXxicGNoYXJsdHxicGNoYXJuZXxicGNoYXJubGlrZXxicGNoYXJvdXR8YnBjaGFycmVjdnxicGNoYXJyZWdleGVxfGJwY2hhcnJlZ2V4bmV8YnBjaGFyc2VuZHxicGNoYXJ0eXBtb2RpbnxicGNoYXJ0eXBtb2RvdXR8YnJvYWRjYXN0fGJ0YWJzdGltZWNtcHxidGFycmF5Y21wfGJ0YmVnaW5zY2FufGJ0Ym9vbGNtcHxidGJwY2hhcl9wYXR0ZXJuX2NtcHxidGJ1aWxkfGJ0YnVpbGRlbXB0eXxidGJ1bGtkZWxldGV8YnRjaGFyY21wfGJ0Y29zdGVzdGltYXRlfGJ0ZW5kc2NhbnxidGZsb2F0NDhjbXB8YnRmbG9hdDRjbXB8YnRmbG9hdDg0Y21wfGJ0ZmxvYXQ4Y21wfGJ0Z2V0Yml0bWFwfGJ0Z2V0dHVwbGV8YnRpbnNlcnR8YnRpbnQyNGNtcHxidGludDI4Y21wfGJ0aW50MmNtcHxidGludDQyY21wfGJ0aW50NDhjbXB8YnRpbnQ0Y21wfGJ0aW50ODJjbXB8YnRpbnQ4NGNtcHxidGludDhjbXB8YnRtYXJrcG9zfGJ0bmFtZWNtcHxidG9pZGNtcHxidG9pZHZlY3RvcmNtcHxidG9wdGlvbnN8YnRyZWNvcmRjbXB8YnRyZWx0aW1lY21wfGJ0cmVzY2FufGJ0cmVzdHJwb3N8YnRyaW18YnR0ZXh0X3BhdHRlcm5fY21wfGJ0dGV4dGNtcHxidHRpZGNtcHxidHRpbnRlcnZhbGNtcHxidHZhY3V1bWNsZWFudXB8Ynl0ZWFjYXR8Ynl0ZWFjbXB8Ynl0ZWFlcXxieXRlYWdlfGJ5dGVhZ3R8Ynl0ZWFpbnxieXRlYWxlfGJ5dGVhbGlrZXxieXRlYWx0fGJ5dGVhbmV8Ynl0ZWFubGlrZXxieXRlYW91dHxieXRlYXJlY3Z8Ynl0ZWFzZW5kfGNhc2hfY21wfGNhc2hfZGl2X2Nhc2h8Y2FzaF9kaXZfZmx0NHxjYXNoX2Rpdl9mbHQ4fGNhc2hfZGl2X2ludDJ8Y2FzaF9kaXZfaW50NHxjYXNoX2VxfGNhc2hfZ2V8Y2FzaF9ndHxjYXNoX2lufGNhc2hfbGV8Y2FzaF9sdHxjYXNoX21pfGNhc2hfbXVsX2ZsdDR8Y2FzaF9tdWxfZmx0OHxjYXNoX211bF9pbnQyfGNhc2hfbXVsX2ludDR8Y2FzaF9uZXxjYXNoX291dHxjYXNoX3BsfGNhc2hfcmVjdnxjYXNoX3NlbmR8Y2FzaF93b3Jkc3xjYXNobGFyZ2VyfGNhc2hzbWFsbGVyfGNicnR8Y2VpbHxjZWlsaW5nfGNlbnRlcnxjaGFyfGNoYXJfbGVuZ3RofGNoYXJhY3Rlcl9sZW5ndGh8Y2hhcmVxfGNoYXJnZXxjaGFyZ3R8Y2hhcmlufGNoYXJsZXxjaGFybHR8Y2hhcm5lfGNoYXJvdXR8Y2hhcnJlY3Z8Y2hhcnNlbmR8Y2hyfGNpZGVxfGNpZGlufGNpZG91dHxjaWRyfGNpZHJfaW58Y2lkcl9vdXR8Y2lkcl9yZWN2fGNpZHJfc2VuZHxjaWRyZWN2fGNpZHNlbmR8Y2lyY2xlfGNpcmNsZV9hYm92ZXxjaXJjbGVfYWRkX3B0fGNpcmNsZV9iZWxvd3xjaXJjbGVfY2VudGVyfGNpcmNsZV9jb250YWlufGNpcmNsZV9jb250YWluX3B0fGNpcmNsZV9jb250YWluZWR8Y2lyY2xlX2Rpc3RhbmNlfGNpcmNsZV9kaXZfcHR8Y2lyY2xlX2VxfGNpcmNsZV9nZXxjaXJjbGVfZ3R8Y2lyY2xlX2lufGNpcmNsZV9sZXxjaXJjbGVfbGVmdHxjaXJjbGVfbHR8Y2lyY2xlX211bF9wdHxjaXJjbGVfbmV8Y2lyY2xlX291dHxjaXJjbGVfb3ZlcmFib3ZlfGNpcmNsZV9vdmVyYmVsb3d8Y2lyY2xlX292ZXJsYXB8Y2lyY2xlX292ZXJsZWZ0fGNpcmNsZV9vdmVycmlnaHR8Y2lyY2xlX3JlY3Z8Y2lyY2xlX3JpZ2h0fGNpcmNsZV9zYW1lfGNpcmNsZV9zZW5kfGNpcmNsZV9zdWJfcHR8Y2xvY2tfdGltZXN0YW1wfGNsb3NlX2xifGNsb3NlX2xzfGNsb3NlX2xzZWd8Y2xvc2VfcGJ8Y2xvc2VfcGx8Y2xvc2VfcHN8Y2xvc2Vfc2J8Y2xvc2Vfc2x8Y29sX2Rlc2NyaXB0aW9ufGNvbmNhdHxjb25jYXRfd3N8Y29udGpvaW5zZWx8Y29udHNlbHxjb252ZXJ0fGNvbnZlcnRfZnJvbXxjb252ZXJ0X3RvfGNvcnJ8Y29zfGNvdHxjb3VudHxjb3Zhcl9wb3B8Y292YXJfc2FtcHxjc3RyaW5nX2lufGNzdHJpbmdfb3V0fGNzdHJpbmdfcmVjdnxjc3RyaW5nX3NlbmR8Y3VtZV9kaXN0fGN1cnJlbnRfZGF0YWJhc2V8Y3VycmVudF9xdWVyeXxjdXJyZW50X3NjaGVtYXxjdXJyZW50X3NjaGVtYXN8Y3VycmVudF9zZXR0aW5nfGN1cnJlbnRfdXNlcnxjdXJydGlkfGN1cnJ0aWQyfGN1cnJ2YWx8Y3Vyc29yX3RvX3htbHxjdXJzb3JfdG9feG1sc2NoZW1hfGRhdGFiYXNlX3RvX3htbHxkYXRhYmFzZV90b194bWxfYW5kX3htbHNjaGVtYXxkYXRhYmFzZV90b194bWxzY2hlbWF8ZGF0ZXxkYXRlX2NtcHxkYXRlX2NtcF90aW1lc3RhbXB8ZGF0ZV9jbXBfdGltZXN0YW1wdHp8ZGF0ZV9lcXxkYXRlX2VxX3RpbWVzdGFtcHxkYXRlX2VxX3RpbWVzdGFtcHR6fGRhdGVfZ2V8ZGF0ZV9nZV90aW1lc3RhbXB8ZGF0ZV9nZV90aW1lc3RhbXB0enxkYXRlX2d0fGRhdGVfZ3RfdGltZXN0YW1wfGRhdGVfZ3RfdGltZXN0YW1wdHp8ZGF0ZV9pbnxkYXRlX2xhcmdlcnxkYXRlX2xlfGRhdGVfbGVfdGltZXN0YW1wfGRhdGVfbGVfdGltZXN0YW1wdHp8ZGF0ZV9sdHxkYXRlX2x0X3RpbWVzdGFtcHxkYXRlX2x0X3RpbWVzdGFtcHR6fGRhdGVfbWl8ZGF0ZV9taV9pbnRlcnZhbHxkYXRlX21paXxkYXRlX25lfGRhdGVfbmVfdGltZXN0YW1wfGRhdGVfbmVfdGltZXN0YW1wdHp8ZGF0ZV9vdXR8ZGF0ZV9wYXJ0fGRhdGVfcGxfaW50ZXJ2YWx8ZGF0ZV9wbGl8ZGF0ZV9yZWN2fGRhdGVfc2VuZHxkYXRlX3NtYWxsZXJ8ZGF0ZV90cnVuY3xkYXRldGltZV9wbHxkYXRldGltZXR6X3BsfGRjYnJ0fGRlY29kZXxkZWdyZWVzfGRlbnNlX3Jhbmt8ZGV4cHxkaWFnb25hbHxkaWFtZXRlcnxkaXNwZWxsX2luaXR8ZGlzcGVsbF9sZXhpemV8ZGlzdF9jcG9seXxkaXN0X2xifGRpc3RfcGJ8ZGlzdF9wY3xkaXN0X3BsfGRpc3RfcHBhdGh8ZGlzdF9wc3xkaXN0X3NifGRpc3Rfc2x8ZGl2fGRsb2cxfGRsb2cxMHxkb21haW5faW58ZG9tYWluX3JlY3Z8ZHBvd3xkcm91bmR8ZHNpbXBsZV9pbml0fGRzaW1wbGVfbGV4aXplfGRzbm93YmFsbF9pbml0fGRzbm93YmFsbF9sZXhpemV8ZHNxcnR8ZHN5bm9ueW1faW5pdHxkc3lub255bV9sZXhpemV8ZHRydW5jfGVuY29kZXxlbnVtX2NtcHxlbnVtX2VxfGVudW1fZmlyc3R8ZW51bV9nZXxlbnVtX2d0fGVudW1faW58ZW51bV9sYXJnZXJ8ZW51bV9sYXN0fGVudW1fbGV8ZW51bV9sdHxlbnVtX25lfGVudW1fb3V0fGVudW1fcmFuZ2V8ZW51bV9yZWN2fGVudW1fc2VuZHxlbnVtX3NtYWxsZXJ8ZXFqb2luc2VsfGVxc2VsfGV1Y19jbl90b19taWN8ZXVjX2NuX3RvX3V0Zjh8ZXVjX2ppc18yMDA0X3RvX3NoaWZ0X2ppc18yMDA0fGV1Y19qaXNfMjAwNF90b191dGY4fGV1Y19qcF90b19taWN8ZXVjX2pwX3RvX3NqaXN8ZXVjX2pwX3RvX3V0Zjh8ZXVjX2tyX3RvX21pY3xldWNfa3JfdG9fdXRmOHxldWNfdHdfdG9fYmlnNXxldWNfdHdfdG9fbWljfGV1Y190d190b191dGY4fGV2ZXJ5fGV4cHxmYWN0b3JpYWx8ZmFtaWx5fGZkd19oYW5kbGVyX2lufGZkd19oYW5kbGVyX291dHxmaXJzdF92YWx1ZXxmbG9hdDR8ZmxvYXQ0OGRpdnxmbG9hdDQ4ZXF8ZmxvYXQ0OGdlfGZsb2F0NDhndHxmbG9hdDQ4bGV8ZmxvYXQ0OGx0fGZsb2F0NDhtaXxmbG9hdDQ4bXVsfGZsb2F0NDhuZXxmbG9hdDQ4cGx8ZmxvYXQ0X2FjY3VtfGZsb2F0NGFic3xmbG9hdDRkaXZ8ZmxvYXQ0ZXF8ZmxvYXQ0Z2V8ZmxvYXQ0Z3R8ZmxvYXQ0aW58ZmxvYXQ0bGFyZ2VyfGZsb2F0NGxlfGZsb2F0NGx0fGZsb2F0NG1pfGZsb2F0NG11bHxmbG9hdDRuZXxmbG9hdDRvdXR8ZmxvYXQ0cGx8ZmxvYXQ0cmVjdnxmbG9hdDRzZW5kfGZsb2F0NHNtYWxsZXJ8ZmxvYXQ0dW18ZmxvYXQ0dXB8ZmxvYXQ4fGZsb2F0ODRkaXZ8ZmxvYXQ4NGVxfGZsb2F0ODRnZXxmbG9hdDg0Z3R8ZmxvYXQ4NGxlfGZsb2F0ODRsdHxmbG9hdDg0bWl8ZmxvYXQ4NG11bHxmbG9hdDg0bmV8ZmxvYXQ4NHBsfGZsb2F0OF9hY2N1bXxmbG9hdDhfYXZnfGZsb2F0OF9jb3JyfGZsb2F0OF9jb3Zhcl9wb3B8ZmxvYXQ4X2NvdmFyX3NhbXB8ZmxvYXQ4X3JlZ3JfYWNjdW18ZmxvYXQ4X3JlZ3JfYXZneHxmbG9hdDhfcmVncl9hdmd5fGZsb2F0OF9yZWdyX2ludGVyY2VwdHxmbG9hdDhfcmVncl9yMnxmbG9hdDhfcmVncl9zbG9wZXxmbG9hdDhfcmVncl9zeHh8ZmxvYXQ4X3JlZ3Jfc3h5fGZsb2F0OF9yZWdyX3N5eXxmbG9hdDhfc3RkZGV2X3BvcHxmbG9hdDhfc3RkZGV2X3NhbXB8ZmxvYXQ4X3Zhcl9wb3B8ZmxvYXQ4X3Zhcl9zYW1wfGZsb2F0OGFic3xmbG9hdDhkaXZ8ZmxvYXQ4ZXF8ZmxvYXQ4Z2V8ZmxvYXQ4Z3R8ZmxvYXQ4aW58ZmxvYXQ4bGFyZ2VyfGZsb2F0OGxlfGZsb2F0OGx0fGZsb2F0OG1pfGZsb2F0OG11bHxmbG9hdDhuZXxmbG9hdDhvdXR8ZmxvYXQ4cGx8ZmxvYXQ4cmVjdnxmbG9hdDhzZW5kfGZsb2F0OHNtYWxsZXJ8ZmxvYXQ4dW18ZmxvYXQ4dXB8Zmxvb3J8Zmx0NF9tdWxfY2FzaHxmbHQ4X211bF9jYXNofGZtZ3JfY192YWxpZGF0b3J8Zm1ncl9pbnRlcm5hbF92YWxpZGF0b3J8Zm1ncl9zcWxfdmFsaWRhdG9yfGZvcm1hdHxmb3JtYXRfdHlwZXxnYjE4MDMwX3RvX3V0Zjh8Z2JrX3RvX3V0Zjh8Z2VuZXJhdGVfc2VyaWVzfGdlbmVyYXRlX3N1YnNjcmlwdHN8Z2V0X2JpdHxnZXRfYnl0ZXxnZXRfY3VycmVudF90c19jb25maWd8Z2V0ZGF0YWJhc2VlbmNvZGluZ3xnZXRwZ3VzZXJuYW1lfGdpbl9jbXBfcHJlZml4fGdpbl9jbXBfdHNsZXhlbWV8Z2luX2V4dHJhY3RfdHNxdWVyeXxnaW5fZXh0cmFjdF90c3ZlY3RvcnxnaW5fdHNxdWVyeV9jb25zaXN0ZW50fGdpbmFycmF5Y29uc2lzdGVudHxnaW5hcnJheWV4dHJhY3R8Z2luYmVnaW5zY2FufGdpbmJ1aWxkfGdpbmJ1aWxkZW1wdHl8Z2luYnVsa2RlbGV0ZXxnaW5jb3N0ZXN0aW1hdGV8Z2luZW5kc2NhbnxnaW5nZXRiaXRtYXB8Z2luaW5zZXJ0fGdpbm1hcmtwb3N8Z2lub3B0aW9uc3xnaW5xdWVyeWFycmF5ZXh0cmFjdHxnaW5yZXNjYW58Z2lucmVzdHJwb3N8Z2ludmFjdXVtY2xlYW51cHxnaXN0X2JveF9jb21wcmVzc3xnaXN0X2JveF9jb25zaXN0ZW50fGdpc3RfYm94X2RlY29tcHJlc3N8Z2lzdF9ib3hfcGVuYWx0eXxnaXN0X2JveF9waWNrc3BsaXR8Z2lzdF9ib3hfc2FtZXxnaXN0X2JveF91bmlvbnxnaXN0X2NpcmNsZV9jb21wcmVzc3xnaXN0X2NpcmNsZV9jb25zaXN0ZW50fGdpc3RfcG9pbnRfY29tcHJlc3N8Z2lzdF9wb2ludF9jb25zaXN0ZW50fGdpc3RfcG9pbnRfZGlzdGFuY2V8Z2lzdF9wb2x5X2NvbXByZXNzfGdpc3RfcG9seV9jb25zaXN0ZW50fGdpc3RiZWdpbnNjYW58Z2lzdGJ1aWxkfGdpc3RidWlsZGVtcHR5fGdpc3RidWxrZGVsZXRlfGdpc3Rjb3N0ZXN0aW1hdGV8Z2lzdGVuZHNjYW58Z2lzdGdldGJpdG1hcHxnaXN0Z2V0dHVwbGV8Z2lzdGluc2VydHxnaXN0bWFya3Bvc3xnaXN0b3B0aW9uc3xnaXN0cmVzY2FufGdpc3RyZXN0cnBvc3xnaXN0dmFjdXVtY2xlYW51cHxndHNxdWVyeV9jb21wcmVzc3xndHNxdWVyeV9jb25zaXN0ZW50fGd0c3F1ZXJ5X2RlY29tcHJlc3N8Z3RzcXVlcnlfcGVuYWx0eXxndHNxdWVyeV9waWNrc3BsaXR8Z3RzcXVlcnlfc2FtZXxndHNxdWVyeV91bmlvbnxndHN2ZWN0b3JfY29tcHJlc3N8Z3RzdmVjdG9yX2NvbnNpc3RlbnR8Z3RzdmVjdG9yX2RlY29tcHJlc3N8Z3RzdmVjdG9yX3BlbmFsdHl8Z3RzdmVjdG9yX3BpY2tzcGxpdHxndHN2ZWN0b3Jfc2FtZXxndHN2ZWN0b3JfdW5pb258Z3RzdmVjdG9yaW58Z3RzdmVjdG9yb3V0fGhhc19hbnlfY29sdW1uX3ByaXZpbGVnZXxoYXNfY29sdW1uX3ByaXZpbGVnZXxoYXNfZGF0YWJhc2VfcHJpdmlsZWdlfGhhc19mb3JlaWduX2RhdGFfd3JhcHBlcl9wcml2aWxlZ2V8aGFzX2Z1bmN0aW9uX3ByaXZpbGVnZXxoYXNfbGFuZ3VhZ2VfcHJpdmlsZWdlfGhhc19zY2hlbWFfcHJpdmlsZWdlfGhhc19zZXF1ZW5jZV9wcml2aWxlZ2V8aGFzX3NlcnZlcl9wcml2aWxlZ2V8aGFzX3RhYmxlX3ByaXZpbGVnZXxoYXNfdGFibGVzcGFjZV9wcml2aWxlZ2V8aGFzaF9hY2xpdGVtfGhhc2hfYXJyYXl8aGFzaF9udW1lcmljfGhhc2hiZWdpbnNjYW58aGFzaGJwY2hhcnxoYXNoYnVpbGR8aGFzaGJ1aWxkZW1wdHl8aGFzaGJ1bGtkZWxldGV8aGFzaGNoYXJ8aGFzaGNvc3Rlc3RpbWF0ZXxoYXNoZW5kc2NhbnxoYXNoZW51bXxoYXNoZmxvYXQ0fGhhc2hmbG9hdDh8aGFzaGdldGJpdG1hcHxoYXNoZ2V0dHVwbGV8aGFzaGluZXR8aGFzaGluc2VydHxoYXNoaW50MnxoYXNoaW50MnZlY3RvcnxoYXNoaW50NHxoYXNoaW50OHxoYXNobWFjYWRkcnxoYXNobWFya3Bvc3xoYXNobmFtZXxoYXNob2lkfGhhc2hvaWR2ZWN0b3J8aGFzaG9wdGlvbnN8aGFzaHJlc2NhbnxoYXNocmVzdHJwb3N8aGFzaHRleHR8aGFzaHZhY3V1bWNsZWFudXB8aGFzaHZhcmxlbmF8aGVpZ2h0fGhvc3R8aG9zdG1hc2t8aWNsaWtlam9pbnNlbHxpY2xpa2VzZWx8aWNubGlrZWpvaW5zZWx8aWNubGlrZXNlbHxpY3JlZ2V4ZXFqb2luc2VsfGljcmVnZXhlcXNlbHxpY3JlZ2V4bmVqb2luc2VsfGljcmVnZXhuZXNlbHxpbmV0X2NsaWVudF9hZGRyfGluZXRfY2xpZW50X3BvcnR8aW5ldF9pbnxpbmV0X291dHxpbmV0X3JlY3Z8aW5ldF9zZW5kfGluZXRfc2VydmVyX2FkZHJ8aW5ldF9zZXJ2ZXJfcG9ydHxpbmV0YW5kfGluZXRtaXxpbmV0bWlfaW50OHxpbmV0bm90fGluZXRvcnxpbmV0cGx8aW5pdGNhcHxpbnQyfGludDI0ZGl2fGludDI0ZXF8aW50MjRnZXxpbnQyNGd0fGludDI0bGV8aW50MjRsdHxpbnQyNG1pfGludDI0bXVsfGludDI0bmV8aW50MjRwbHxpbnQyOGRpdnxpbnQyOGVxfGludDI4Z2V8aW50MjhndHxpbnQyOGxlfGludDI4bHR8aW50MjhtaXxpbnQyOG11bHxpbnQyOG5lfGludDI4cGx8aW50Ml9hY2N1bXxpbnQyX2F2Z19hY2N1bXxpbnQyX211bF9jYXNofGludDJfc3VtfGludDJhYnN8aW50MmFuZHxpbnQyZGl2fGludDJlcXxpbnQyZ2V8aW50Mmd0fGludDJpbnxpbnQybGFyZ2VyfGludDJsZXxpbnQybHR8aW50Mm1pfGludDJtb2R8aW50Mm11bHxpbnQybmV8aW50Mm5vdHxpbnQyb3J8aW50Mm91dHxpbnQycGx8aW50MnJlY3Z8aW50MnNlbmR8aW50MnNobHxpbnQyc2hyfGludDJzbWFsbGVyfGludDJ1bXxpbnQydXB8aW50MnZlY3RvcmVxfGludDJ2ZWN0b3JpbnxpbnQydmVjdG9yb3V0fGludDJ2ZWN0b3JyZWN2fGludDJ2ZWN0b3JzZW5kfGludDJ4b3J8aW50NHxpbnQ0MmRpdnxpbnQ0MmVxfGludDQyZ2V8aW50NDJndHxpbnQ0MmxlfGludDQybHR8aW50NDJtaXxpbnQ0Mm11bHxpbnQ0Mm5lfGludDQycGx8aW50NDhkaXZ8aW50NDhlcXxpbnQ0OGdlfGludDQ4Z3R8aW50NDhsZXxpbnQ0OGx0fGludDQ4bWl8aW50NDhtdWx8aW50NDhuZXxpbnQ0OHBsfGludDRfYWNjdW18aW50NF9hdmdfYWNjdW18aW50NF9tdWxfY2FzaHxpbnQ0X3N1bXxpbnQ0YWJzfGludDRhbmR8aW50NGRpdnxpbnQ0ZXF8aW50NGdlfGludDRndHxpbnQ0aW58aW50NGluY3xpbnQ0bGFyZ2VyfGludDRsZXxpbnQ0bHR8aW50NG1pfGludDRtb2R8aW50NG11bHxpbnQ0bmV8aW50NG5vdHxpbnQ0b3J8aW50NG91dHxpbnQ0cGx8aW50NHJlY3Z8aW50NHNlbmR8aW50NHNobHxpbnQ0c2hyfGludDRzbWFsbGVyfGludDR1bXxpbnQ0dXB8aW50NHhvcnxpbnQ4fGludDgyZGl2fGludDgyZXF8aW50ODJnZXxpbnQ4Mmd0fGludDgybGV8aW50ODJsdHxpbnQ4Mm1pfGludDgybXVsfGludDgybmV8aW50ODJwbHxpbnQ4NGRpdnxpbnQ4NGVxfGludDg0Z2V8aW50ODRndHxpbnQ4NGxlfGludDg0bHR8aW50ODRtaXxpbnQ4NG11bHxpbnQ4NG5lfGludDg0cGx8aW50OF9hY2N1bXxpbnQ4X2F2Z3xpbnQ4X2F2Z19hY2N1bXxpbnQ4X3N1bXxpbnQ4YWJzfGludDhhbmR8aW50OGRpdnxpbnQ4ZXF8aW50OGdlfGludDhndHxpbnQ4aW58aW50OGluY3xpbnQ4aW5jX2FueXxpbnQ4aW5jX2Zsb2F0OF9mbG9hdDh8aW50OGxhcmdlcnxpbnQ4bGV8aW50OGx0fGludDhtaXxpbnQ4bW9kfGludDhtdWx8aW50OG5lfGludDhub3R8aW50OG9yfGludDhvdXR8aW50OHBsfGludDhwbF9pbmV0fGludDhyZWN2fGludDhzZW5kfGludDhzaGx8aW50OHNocnxpbnQ4c21hbGxlcnxpbnQ4dW18aW50OHVwfGludDh4b3J8aW50ZWdlcl9wbF9kYXRlfGludGVyX2xifGludGVyX3NifGludGVyX3NsfGludGVybmFsX2lufGludGVybmFsX291dHxpbnRlcnZhbF9hY2N1bXxpbnRlcnZhbF9hdmd8aW50ZXJ2YWxfY21wfGludGVydmFsX2RpdnxpbnRlcnZhbF9lcXxpbnRlcnZhbF9nZXxpbnRlcnZhbF9ndHxpbnRlcnZhbF9oYXNofGludGVydmFsX2lufGludGVydmFsX2xhcmdlcnxpbnRlcnZhbF9sZXxpbnRlcnZhbF9sdHxpbnRlcnZhbF9taXxpbnRlcnZhbF9tdWx8aW50ZXJ2YWxfbmV8aW50ZXJ2YWxfb3V0fGludGVydmFsX3BsfGludGVydmFsX3BsX2RhdGV8aW50ZXJ2YWxfcGxfdGltZXxpbnRlcnZhbF9wbF90aW1lc3RhbXB8aW50ZXJ2YWxfcGxfdGltZXN0YW1wdHp8aW50ZXJ2YWxfcGxfdGltZXR6fGludGVydmFsX3JlY3Z8aW50ZXJ2YWxfc2VuZHxpbnRlcnZhbF9zbWFsbGVyfGludGVydmFsX3VtfGludGVydmFsdHlwbW9kaW58aW50ZXJ2YWx0eXBtb2RvdXR8aW50aW50ZXJ2YWx8aXNjbG9zZWR8aXNmaW5pdGV8aXNob3Jpem9udGFsfGlzbzg4NTlfMV90b191dGY4fGlzbzg4NTlfdG9fdXRmOHxpc29fdG9fa29pOHJ8aXNvX3RvX21pY3xpc29fdG9fd2luMTI1MXxpc29fdG9fd2luODY2fGlzb3Blbnxpc3BhcmFsbGVsfGlzcGVycHxpc3ZlcnRpY2FsfGpvaGFiX3RvX3V0Zjh8anVzdGlmeV9kYXlzfGp1c3RpZnlfaG91cnN8anVzdGlmeV9pbnRlcnZhbHxrb2k4cl90b19pc298a29pOHJfdG9fbWljfGtvaThyX3RvX3V0Zjh8a29pOHJfdG9fd2luMTI1MXxrb2k4cl90b193aW44NjZ8a29pOHVfdG9fdXRmOHxsYWd8bGFuZ3VhZ2VfaGFuZGxlcl9pbnxsYW5ndWFnZV9oYW5kbGVyX291dHxsYXN0X3ZhbHVlfGxhc3R2YWx8bGF0aW4xX3RvX21pY3xsYXRpbjJfdG9fbWljfGxhdGluMl90b193aW4xMjUwfGxhdGluM190b19taWN8bGF0aW40X3RvX21pY3xsZWFkfGxlZnR8bGVuZ3RofGxpa2V8bGlrZV9lc2NhcGV8bGlrZWpvaW5zZWx8bGlrZXNlbHxsaW5lfGxpbmVfZGlzdGFuY2V8bGluZV9lcXxsaW5lX2hvcml6b250YWx8bGluZV9pbnxsaW5lX2ludGVycHR8bGluZV9pbnRlcnNlY3R8bGluZV9vdXR8bGluZV9wYXJhbGxlbHxsaW5lX3BlcnB8bGluZV9yZWN2fGxpbmVfc2VuZHxsaW5lX3ZlcnRpY2FsfGxufGxvX2Nsb3NlfGxvX2NyZWF0fGxvX2NyZWF0ZXxsb19leHBvcnR8bG9faW1wb3J0fGxvX2xzZWVrfGxvX29wZW58bG9fdGVsbHxsb190cnVuY2F0ZXxsb191bmxpbmt8bG9nfGxvcmVhZHxsb3dlcnxsb3dyaXRlfGxwYWR8bHNlZ3xsc2VnX2NlbnRlcnxsc2VnX2Rpc3RhbmNlfGxzZWdfZXF8bHNlZ19nZXxsc2VnX2d0fGxzZWdfaG9yaXpvbnRhbHxsc2VnX2lufGxzZWdfaW50ZXJwdHxsc2VnX2ludGVyc2VjdHxsc2VnX2xlfGxzZWdfbGVuZ3RofGxzZWdfbHR8bHNlZ19uZXxsc2VnX291dHxsc2VnX3BhcmFsbGVsfGxzZWdfcGVycHxsc2VnX3JlY3Z8bHNlZ19zZW5kfGxzZWdfdmVydGljYWx8bHRyaW18bWFjYWRkcl9jbXB8bWFjYWRkcl9lcXxtYWNhZGRyX2dlfG1hY2FkZHJfZ3R8bWFjYWRkcl9pbnxtYWNhZGRyX2xlfG1hY2FkZHJfbHR8bWFjYWRkcl9uZXxtYWNhZGRyX291dHxtYWNhZGRyX3JlY3Z8bWFjYWRkcl9zZW5kfG1ha2VhY2xpdGVtfG1hc2tsZW58bWF4fG1kNXxtaWNfdG9fYXNjaWl8bWljX3RvX2JpZzV8bWljX3RvX2V1Y19jbnxtaWNfdG9fZXVjX2pwfG1pY190b19ldWNfa3J8bWljX3RvX2V1Y190d3xtaWNfdG9faXNvfG1pY190b19rb2k4cnxtaWNfdG9fbGF0aW4xfG1pY190b19sYXRpbjJ8bWljX3RvX2xhdGluM3xtaWNfdG9fbGF0aW40fG1pY190b19zamlzfG1pY190b193aW4xMjUwfG1pY190b193aW4xMjUxfG1pY190b193aW44NjZ8bWlufG1rdGludGVydmFsfG1vZHxtb25leXxtdWxfZF9pbnRlcnZhbHxuYW1lfG5hbWVlcXxuYW1lZ2V8bmFtZWd0fG5hbWVpY2xpa2V8bmFtZWljbmxpa2V8bmFtZWljcmVnZXhlcXxuYW1laWNyZWdleG5lfG5hbWVpbnxuYW1lbGV8bmFtZWxpa2V8bmFtZWx0fG5hbWVuZXxuYW1lbmxpa2V8bmFtZW91dHxuYW1lcmVjdnxuYW1lcmVnZXhlcXxuYW1lcmVnZXhuZXxuYW1lc2VuZHxuZXFqb2luc2VsfG5lcXNlbHxuZXRtYXNrfG5ldHdvcmt8bmV0d29ya19jbXB8bmV0d29ya19lcXxuZXR3b3JrX2dlfG5ldHdvcmtfZ3R8bmV0d29ya19sZXxuZXR3b3JrX2x0fG5ldHdvcmtfbmV8bmV0d29ya19zdWJ8bmV0d29ya19zdWJlcXxuZXR3b3JrX3N1cHxuZXR3b3JrX3N1cGVxfG5leHR2YWx8bmxpa2Vqb2luc2VsfG5saWtlc2VsfG5vdGxpa2V8bm93fG5wb2ludHN8bnRoX3ZhbHVlfG50aWxlfG51bWVyaWNfYWJzfG51bWVyaWNfYWNjdW18bnVtZXJpY19hZGR8bnVtZXJpY19hdmd8bnVtZXJpY19hdmdfYWNjdW18bnVtZXJpY19jbXB8bnVtZXJpY19kaXZ8bnVtZXJpY19kaXZfdHJ1bmN8bnVtZXJpY19lcXxudW1lcmljX2V4cHxudW1lcmljX2ZhY3xudW1lcmljX2dlfG51bWVyaWNfZ3R8bnVtZXJpY19pbnxudW1lcmljX2luY3xudW1lcmljX2xhcmdlcnxudW1lcmljX2xlfG51bWVyaWNfbG58bnVtZXJpY19sb2d8bnVtZXJpY19sdHxudW1lcmljX21vZHxudW1lcmljX211bHxudW1lcmljX25lfG51bWVyaWNfb3V0fG51bWVyaWNfcG93ZXJ8bnVtZXJpY19yZWN2fG51bWVyaWNfc2VuZHxudW1lcmljX3NtYWxsZXJ8bnVtZXJpY19zcXJ0fG51bWVyaWNfc3RkZGV2X3BvcHxudW1lcmljX3N0ZGRldl9zYW1wfG51bWVyaWNfc3VifG51bWVyaWNfdW1pbnVzfG51bWVyaWNfdXBsdXN8bnVtZXJpY192YXJfcG9wfG51bWVyaWNfdmFyX3NhbXB8bnVtZXJpY3R5cG1vZGlufG51bWVyaWN0eXBtb2RvdXR8bnVtbm9kZXxvYmpfZGVzY3JpcHRpb258b2N0ZXRfbGVuZ3RofG9pZHxvaWRlcXxvaWRnZXxvaWRndHxvaWRpbnxvaWRsYXJnZXJ8b2lkbGV8b2lkbHR8b2lkbmV8b2lkb3V0fG9pZHJlY3Z8b2lkc2VuZHxvaWRzbWFsbGVyfG9pZHZlY3RvcmVxfG9pZHZlY3RvcmdlfG9pZHZlY3Rvcmd0fG9pZHZlY3RvcmlufG9pZHZlY3RvcmxlfG9pZHZlY3Rvcmx0fG9pZHZlY3Rvcm5lfG9pZHZlY3Rvcm91dHxvaWR2ZWN0b3JyZWN2fG9pZHZlY3RvcnNlbmR8b2lkdmVjdG9ydHlwZXN8b25fcGJ8b25fcGx8b25fcHBhdGh8b25fcHN8b25fc2J8b25fc2x8b3BhcXVlX2lufG9wYXF1ZV9vdXR8b3ZlcmxhcHN8b3ZlcmxheXxwYXRofHBhdGhfYWRkfHBhdGhfYWRkX3B0fHBhdGhfY2VudGVyfHBhdGhfY29udGFpbl9wdHxwYXRoX2Rpc3RhbmNlfHBhdGhfZGl2X3B0fHBhdGhfaW58cGF0aF9pbnRlcnxwYXRoX2xlbmd0aHxwYXRoX211bF9wdHxwYXRoX25fZXF8cGF0aF9uX2dlfHBhdGhfbl9ndHxwYXRoX25fbGV8cGF0aF9uX2x0fHBhdGhfbnBvaW50c3xwYXRoX291dHxwYXRoX3JlY3Z8cGF0aF9zZW5kfHBhdGhfc3ViX3B0fHBjbG9zZXxwZXJjZW50X3Jhbmt8cGdfYWR2aXNvcnlfbG9ja3xwZ19hZHZpc29yeV9sb2NrX3NoYXJlZHxwZ19hZHZpc29yeV91bmxvY2t8cGdfYWR2aXNvcnlfdW5sb2NrX2FsbHxwZ19hZHZpc29yeV91bmxvY2tfc2hhcmVkfHBnX2Fkdmlzb3J5X3hhY3RfbG9ja3xwZ19hZHZpc29yeV94YWN0X2xvY2tfc2hhcmVkfHBnX2F2YWlsYWJsZV9leHRlbnNpb25fdmVyc2lvbnN8cGdfYXZhaWxhYmxlX2V4dGVuc2lvbnN8cGdfYmFja2VuZF9waWR8cGdfY2FuY2VsX2JhY2tlbmR8cGdfY2hhcl90b19lbmNvZGluZ3xwZ19jbGllbnRfZW5jb2Rpbmd8cGdfY29sbGF0aW9uX2lzX3Zpc2libGV8cGdfY29sdW1uX3NpemV8cGdfY29uZl9sb2FkX3RpbWV8cGdfY29udmVyc2lvbl9pc192aXNpYmxlfHBnX2NyZWF0ZV9yZXN0b3JlX3BvaW50fHBnX2N1cnJlbnRfeGxvZ19pbnNlcnRfbG9jYXRpb258cGdfY3VycmVudF94bG9nX2xvY2F0aW9ufHBnX2N1cnNvcnxwZ19kYXRhYmFzZV9zaXplfHBnX2Rlc2NyaWJlX29iamVjdHxwZ19lbmNvZGluZ19tYXhfbGVuZ3RofHBnX2VuY29kaW5nX3RvX2NoYXJ8cGdfZXh0ZW5zaW9uX2NvbmZpZ19kdW1wfHBnX2V4dGVuc2lvbl91cGRhdGVfcGF0aHN8cGdfZnVuY3Rpb25faXNfdmlzaWJsZXxwZ19nZXRfY29uc3RyYWludGRlZnxwZ19nZXRfZXhwcnxwZ19nZXRfZnVuY3Rpb25fYXJndW1lbnRzfHBnX2dldF9mdW5jdGlvbl9pZGVudGl0eV9hcmd1bWVudHN8cGdfZ2V0X2Z1bmN0aW9uX3Jlc3VsdHxwZ19nZXRfZnVuY3Rpb25kZWZ8cGdfZ2V0X2luZGV4ZGVmfHBnX2dldF9rZXl3b3Jkc3xwZ19nZXRfcnVsZWRlZnxwZ19nZXRfc2VyaWFsX3NlcXVlbmNlfHBnX2dldF90cmlnZ2VyZGVmfHBnX2dldF91c2VyYnlpZHxwZ19nZXRfdmlld2RlZnxwZ19oYXNfcm9sZXxwZ19pbmRleGVzX3NpemV8cGdfaXNfaW5fcmVjb3Zlcnl8cGdfaXNfb3RoZXJfdGVtcF9zY2hlbWF8cGdfaXNfeGxvZ19yZXBsYXlfcGF1c2VkfHBnX2xhc3RfeGFjdF9yZXBsYXlfdGltZXN0YW1wfHBnX2xhc3RfeGxvZ19yZWNlaXZlX2xvY2F0aW9ufHBnX2xhc3RfeGxvZ19yZXBsYXlfbG9jYXRpb258cGdfbGlzdGVuaW5nX2NoYW5uZWxzfHBnX2xvY2tfc3RhdHVzfHBnX2xzX2RpcnxwZ19teV90ZW1wX3NjaGVtYXxwZ19ub2RlX3RyZWVfaW58cGdfbm9kZV90cmVlX291dHxwZ19ub2RlX3RyZWVfcmVjdnxwZ19ub2RlX3RyZWVfc2VuZHxwZ19ub3RpZnl8cGdfb3BjbGFzc19pc192aXNpYmxlfHBnX29wZXJhdG9yX2lzX3Zpc2libGV8cGdfb3B0aW9uc190b190YWJsZXxwZ19wb3N0bWFzdGVyX3N0YXJ0X3RpbWV8cGdfcHJlcGFyZWRfc3RhdGVtZW50fHBnX3ByZXBhcmVkX3hhY3R8cGdfcmVhZF9iaW5hcnlfZmlsZXxwZ19yZWFkX2ZpbGV8cGdfcmVsYXRpb25fZmlsZW5vZGV8cGdfcmVsYXRpb25fZmlsZXBhdGh8cGdfcmVsYXRpb25fc2l6ZXxwZ19yZWxvYWRfY29uZnxwZ19yb3RhdGVfbG9nZmlsZXxwZ19zZXF1ZW5jZV9wYXJhbWV0ZXJzfHBnX3Nob3dfYWxsX3NldHRpbmdzfHBnX3NpemVfcHJldHR5fHBnX3NsZWVwfHBnX3N0YXJ0X2JhY2t1cHxwZ19zdGF0X2NsZWFyX3NuYXBzaG90fHBnX3N0YXRfZmlsZXxwZ19zdGF0X2dldF9hY3Rpdml0eXxwZ19zdGF0X2dldF9hbmFseXplX2NvdW50fHBnX3N0YXRfZ2V0X2F1dG9hbmFseXplX2NvdW50fHBnX3N0YXRfZ2V0X2F1dG92YWN1dW1fY291bnR8cGdfc3RhdF9nZXRfYmFja2VuZF9hY3Rpdml0eXxwZ19zdGF0X2dldF9iYWNrZW5kX2FjdGl2aXR5X3N0YXJ0fHBnX3N0YXRfZ2V0X2JhY2tlbmRfY2xpZW50X2FkZHJ8cGdfc3RhdF9nZXRfYmFja2VuZF9jbGllbnRfcG9ydHxwZ19zdGF0X2dldF9iYWNrZW5kX2RiaWR8cGdfc3RhdF9nZXRfYmFja2VuZF9pZHNldHxwZ19zdGF0X2dldF9iYWNrZW5kX3BpZHxwZ19zdGF0X2dldF9iYWNrZW5kX3N0YXJ0fHBnX3N0YXRfZ2V0X2JhY2tlbmRfdXNlcmlkfHBnX3N0YXRfZ2V0X2JhY2tlbmRfd2FpdGluZ3xwZ19zdGF0X2dldF9iYWNrZW5kX3hhY3Rfc3RhcnR8cGdfc3RhdF9nZXRfYmd3cml0ZXJfYnVmX3dyaXR0ZW5fY2hlY2twb2ludHN8cGdfc3RhdF9nZXRfYmd3cml0ZXJfYnVmX3dyaXR0ZW5fY2xlYW58cGdfc3RhdF9nZXRfYmd3cml0ZXJfbWF4d3JpdHRlbl9jbGVhbnxwZ19zdGF0X2dldF9iZ3dyaXRlcl9yZXF1ZXN0ZWRfY2hlY2twb2ludHN8cGdfc3RhdF9nZXRfYmd3cml0ZXJfc3RhdF9yZXNldF90aW1lfHBnX3N0YXRfZ2V0X2Jnd3JpdGVyX3RpbWVkX2NoZWNrcG9pbnRzfHBnX3N0YXRfZ2V0X2Jsb2Nrc19mZXRjaGVkfHBnX3N0YXRfZ2V0X2Jsb2Nrc19oaXR8cGdfc3RhdF9nZXRfYnVmX2FsbG9jfHBnX3N0YXRfZ2V0X2J1Zl9mc3luY19iYWNrZW5kfHBnX3N0YXRfZ2V0X2J1Zl93cml0dGVuX2JhY2tlbmR8cGdfc3RhdF9nZXRfZGJfYmxvY2tzX2ZldGNoZWR8cGdfc3RhdF9nZXRfZGJfYmxvY2tzX2hpdHxwZ19zdGF0X2dldF9kYl9jb25mbGljdF9hbGx8cGdfc3RhdF9nZXRfZGJfY29uZmxpY3RfYnVmZmVycGlufHBnX3N0YXRfZ2V0X2RiX2NvbmZsaWN0X2xvY2t8cGdfc3RhdF9nZXRfZGJfY29uZmxpY3Rfc25hcHNob3R8cGdfc3RhdF9nZXRfZGJfY29uZmxpY3Rfc3RhcnR1cF9kZWFkbG9ja3xwZ19zdGF0X2dldF9kYl9jb25mbGljdF90YWJsZXNwYWNlfHBnX3N0YXRfZ2V0X2RiX251bWJhY2tlbmRzfHBnX3N0YXRfZ2V0X2RiX3N0YXRfcmVzZXRfdGltZXxwZ19zdGF0X2dldF9kYl90dXBsZXNfZGVsZXRlZHxwZ19zdGF0X2dldF9kYl90dXBsZXNfZmV0Y2hlZHxwZ19zdGF0X2dldF9kYl90dXBsZXNfaW5zZXJ0ZWR8cGdfc3RhdF9nZXRfZGJfdHVwbGVzX3JldHVybmVkfHBnX3N0YXRfZ2V0X2RiX3R1cGxlc191cGRhdGVkfHBnX3N0YXRfZ2V0X2RiX3hhY3RfY29tbWl0fHBnX3N0YXRfZ2V0X2RiX3hhY3Rfcm9sbGJhY2t8cGdfc3RhdF9nZXRfZGVhZF90dXBsZXN8cGdfc3RhdF9nZXRfZnVuY3Rpb25fY2FsbHN8cGdfc3RhdF9nZXRfZnVuY3Rpb25fc2VsZl90aW1lfHBnX3N0YXRfZ2V0X2Z1bmN0aW9uX3RpbWV8cGdfc3RhdF9nZXRfbGFzdF9hbmFseXplX3RpbWV8cGdfc3RhdF9nZXRfbGFzdF9hdXRvYW5hbHl6ZV90aW1lfHBnX3N0YXRfZ2V0X2xhc3RfYXV0b3ZhY3V1bV90aW1lfHBnX3N0YXRfZ2V0X2xhc3RfdmFjdXVtX3RpbWV8cGdfc3RhdF9nZXRfbGl2ZV90dXBsZXN8cGdfc3RhdF9nZXRfbnVtc2NhbnN8cGdfc3RhdF9nZXRfdHVwbGVzX2RlbGV0ZWR8cGdfc3RhdF9nZXRfdHVwbGVzX2ZldGNoZWR8cGdfc3RhdF9nZXRfdHVwbGVzX2hvdF91cGRhdGVkfHBnX3N0YXRfZ2V0X3R1cGxlc19pbnNlcnRlZHxwZ19zdGF0X2dldF90dXBsZXNfcmV0dXJuZWR8cGdfc3RhdF9nZXRfdHVwbGVzX3VwZGF0ZWR8cGdfc3RhdF9nZXRfdmFjdXVtX2NvdW50fHBnX3N0YXRfZ2V0X3dhbF9zZW5kZXJzfHBnX3N0YXRfZ2V0X3hhY3RfYmxvY2tzX2ZldGNoZWR8cGdfc3RhdF9nZXRfeGFjdF9ibG9ja3NfaGl0fHBnX3N0YXRfZ2V0X3hhY3RfZnVuY3Rpb25fY2FsbHN8cGdfc3RhdF9nZXRfeGFjdF9mdW5jdGlvbl9zZWxmX3RpbWV8cGdfc3RhdF9nZXRfeGFjdF9mdW5jdGlvbl90aW1lfHBnX3N0YXRfZ2V0X3hhY3RfbnVtc2NhbnN8cGdfc3RhdF9nZXRfeGFjdF90dXBsZXNfZGVsZXRlZHxwZ19zdGF0X2dldF94YWN0X3R1cGxlc19mZXRjaGVkfHBnX3N0YXRfZ2V0X3hhY3RfdHVwbGVzX2hvdF91cGRhdGVkfHBnX3N0YXRfZ2V0X3hhY3RfdHVwbGVzX2luc2VydGVkfHBnX3N0YXRfZ2V0X3hhY3RfdHVwbGVzX3JldHVybmVkfHBnX3N0YXRfZ2V0X3hhY3RfdHVwbGVzX3VwZGF0ZWR8cGdfc3RhdF9yZXNldHxwZ19zdGF0X3Jlc2V0X3NoYXJlZHxwZ19zdGF0X3Jlc2V0X3NpbmdsZV9mdW5jdGlvbl9jb3VudGVyc3xwZ19zdGF0X3Jlc2V0X3NpbmdsZV90YWJsZV9jb3VudGVyc3xwZ19zdG9wX2JhY2t1cHxwZ19zd2l0Y2hfeGxvZ3xwZ190YWJsZV9pc192aXNpYmxlfHBnX3RhYmxlX3NpemV8cGdfdGFibGVzcGFjZV9kYXRhYmFzZXN8cGdfdGFibGVzcGFjZV9zaXplfHBnX3Rlcm1pbmF0ZV9iYWNrZW5kfHBnX3RpbWV6b25lX2FiYnJldnN8cGdfdGltZXpvbmVfbmFtZXN8cGdfdG90YWxfcmVsYXRpb25fc2l6ZXxwZ190cnlfYWR2aXNvcnlfbG9ja3xwZ190cnlfYWR2aXNvcnlfbG9ja19zaGFyZWR8cGdfdHJ5X2Fkdmlzb3J5X3hhY3RfbG9ja3xwZ190cnlfYWR2aXNvcnlfeGFjdF9sb2NrX3NoYXJlZHxwZ190c19jb25maWdfaXNfdmlzaWJsZXxwZ190c19kaWN0X2lzX3Zpc2libGV8cGdfdHNfcGFyc2VyX2lzX3Zpc2libGV8cGdfdHNfdGVtcGxhdGVfaXNfdmlzaWJsZXxwZ190eXBlX2lzX3Zpc2libGV8cGdfdHlwZW9mfHBnX3hsb2dfcmVwbGF5X3BhdXNlfHBnX3hsb2dfcmVwbGF5X3Jlc3VtZXxwZ194bG9nZmlsZV9uYW1lfHBnX3hsb2dmaWxlX25hbWVfb2Zmc2V0fHBpfHBsYWludG9fdHNxdWVyeXxwbHBnc3FsX2NhbGxfaGFuZGxlcnxwbHBnc3FsX2lubGluZV9oYW5kbGVyfHBscGdzcWxfdmFsaWRhdG9yfHBvaW50fHBvaW50X2Fib3ZlfHBvaW50X2FkZHxwb2ludF9iZWxvd3xwb2ludF9kaXN0YW5jZXxwb2ludF9kaXZ8cG9pbnRfZXF8cG9pbnRfaG9yaXp8cG9pbnRfaW58cG9pbnRfbGVmdHxwb2ludF9tdWx8cG9pbnRfbmV8cG9pbnRfb3V0fHBvaW50X3JlY3Z8cG9pbnRfcmlnaHR8cG9pbnRfc2VuZHxwb2ludF9zdWJ8cG9pbnRfdmVydHxwb2x5X2Fib3ZlfHBvbHlfYmVsb3d8cG9seV9jZW50ZXJ8cG9seV9jb250YWlufHBvbHlfY29udGFpbl9wdHxwb2x5X2NvbnRhaW5lZHxwb2x5X2Rpc3RhbmNlfHBvbHlfaW58cG9seV9sZWZ0fHBvbHlfbnBvaW50c3xwb2x5X291dHxwb2x5X292ZXJhYm92ZXxwb2x5X292ZXJiZWxvd3xwb2x5X292ZXJsYXB8cG9seV9vdmVybGVmdHxwb2x5X292ZXJyaWdodHxwb2x5X3JlY3Z8cG9seV9yaWdodHxwb2x5X3NhbWV8cG9seV9zZW5kfHBvbHlnb258cG9wZW58cG9zaXRpb258cG9zaXRpb25qb2luc2VsfHBvc2l0aW9uc2VsfHBvc3RncmVzcWxfZmR3X3ZhbGlkYXRvcnxwb3d8cG93ZXJ8cHJzZF9lbmR8cHJzZF9oZWFkbGluZXxwcnNkX2xleHR5cGV8cHJzZF9uZXh0dG9rZW58cHJzZF9zdGFydHxwdF9jb250YWluZWRfY2lyY2xlfHB0X2NvbnRhaW5lZF9wb2x5fHF1ZXJ5X3RvX3htbHxxdWVyeV90b194bWxfYW5kX3htbHNjaGVtYXxxdWVyeV90b194bWxzY2hlbWF8cXVlcnl0cmVlfHF1b3RlX2lkZW50fHF1b3RlX2xpdGVyYWx8cXVvdGVfbnVsbGFibGV8cmFkaWFuc3xyYWRpdXN8cmFuZG9tfHJhbmt8cmVjb3JkX2VxfHJlY29yZF9nZXxyZWNvcmRfZ3R8cmVjb3JkX2lufHJlY29yZF9sZXxyZWNvcmRfbHR8cmVjb3JkX25lfHJlY29yZF9vdXR8cmVjb3JkX3JlY3Z8cmVjb3JkX3NlbmR8cmVnY2xhc3N8cmVnY2xhc3NpbnxyZWdjbGFzc291dHxyZWdjbGFzc3JlY3Z8cmVnY2xhc3NzZW5kfHJlZ2NvbmZpZ2lufHJlZ2NvbmZpZ291dHxyZWdjb25maWdyZWN2fHJlZ2NvbmZpZ3NlbmR8cmVnZGljdGlvbmFyeWlufHJlZ2RpY3Rpb25hcnlvdXR8cmVnZGljdGlvbmFyeXJlY3Z8cmVnZGljdGlvbmFyeXNlbmR8cmVnZXhlcWpvaW5zZWx8cmVnZXhlcXNlbHxyZWdleG5lam9pbnNlbHxyZWdleG5lc2VsfHJlZ2V4cF9tYXRjaGVzfHJlZ2V4cF9yZXBsYWNlfHJlZ2V4cF9zcGxpdF90b19hcnJheXxyZWdleHBfc3BsaXRfdG9fdGFibGV8cmVnb3BlcmF0b3JpbnxyZWdvcGVyYXRvcm91dHxyZWdvcGVyYXRvcnJlY3Z8cmVnb3BlcmF0b3JzZW5kfHJlZ29wZXJpbnxyZWdvcGVyb3V0fHJlZ29wZXJyZWN2fHJlZ29wZXJzZW5kfHJlZ3Byb2NlZHVyZWlufHJlZ3Byb2NlZHVyZW91dHxyZWdwcm9jZWR1cmVyZWN2fHJlZ3Byb2NlZHVyZXNlbmR8cmVncHJvY2lufHJlZ3Byb2NvdXR8cmVncHJvY3JlY3Z8cmVncHJvY3NlbmR8cmVncl9hdmd4fHJlZ3JfYXZneXxyZWdyX2NvdW50fHJlZ3JfaW50ZXJjZXB0fHJlZ3JfcjJ8cmVncl9zbG9wZXxyZWdyX3N4eHxyZWdyX3N4eXxyZWdyX3N5eXxyZWd0eXBlaW58cmVndHlwZW91dHxyZWd0eXBlcmVjdnxyZWd0eXBlc2VuZHxyZWx0aW1lfHJlbHRpbWVlcXxyZWx0aW1lZ2V8cmVsdGltZWd0fHJlbHRpbWVpbnxyZWx0aW1lbGV8cmVsdGltZWx0fHJlbHRpbWVuZXxyZWx0aW1lb3V0fHJlbHRpbWVyZWN2fHJlbHRpbWVzZW5kfHJlcGVhdHxyZXBsYWNlfHJldmVyc2V8cmlnaHR8cm91bmR8cm93X251bWJlcnxycGFkfHJ0cmltfHNjYWxhcmd0am9pbnNlbHxzY2FsYXJndHNlbHxzY2FsYXJsdGpvaW5zZWx8c2NhbGFybHRzZWx8c2NoZW1hX3RvX3htbHxzY2hlbWFfdG9feG1sX2FuZF94bWxzY2hlbWF8c2NoZW1hX3RvX3htbHNjaGVtYXxzZXNzaW9uX3VzZXJ8c2V0X2JpdHxzZXRfYnl0ZXxzZXRfY29uZmlnfHNldF9tYXNrbGVufHNldHNlZWR8c2V0dmFsfHNldHdlaWdodHxzaGVsbF9pbnxzaGVsbF9vdXR8c2hpZnRfamlzXzIwMDRfdG9fZXVjX2ppc18yMDA0fHNoaWZ0X2ppc18yMDA0X3RvX3V0Zjh8c2hvYmpfZGVzY3JpcHRpb258c2lnbnxzaW1pbGFyX2VzY2FwZXxzaW58c2ppc190b19ldWNfanB8c2ppc190b19taWN8c2ppc190b191dGY4fHNsb3BlfHNtZ3JlcXxzbWdyaW58c21ncm5lfHNtZ3JvdXR8c3BsaXRfcGFydHxzcXJ0fHN0YXRlbWVudF90aW1lc3RhbXB8c3RkZGV2fHN0ZGRldl9wb3B8c3RkZGV2X3NhbXB8c3RyaW5nX2FnZ3xzdHJpbmdfYWdnX2ZpbmFsZm58c3RyaW5nX2FnZ190cmFuc2ZufHN0cmluZ190b19hcnJheXxzdHJpcHxzdHJwb3N8c3Vic3RyfHN1YnN0cmluZ3xzdW18c3VwcHJlc3NfcmVkdW5kYW50X3VwZGF0ZXNfdHJpZ2dlcnx0YWJsZV90b194bWx8dGFibGVfdG9feG1sX2FuZF94bWxzY2hlbWF8dGFibGVfdG9feG1sc2NoZW1hfHRhbnx0ZXh0fHRleHRfZ2V8dGV4dF9ndHx0ZXh0X2xhcmdlcnx0ZXh0X2xlfHRleHRfbHR8dGV4dF9wYXR0ZXJuX2dlfHRleHRfcGF0dGVybl9ndHx0ZXh0X3BhdHRlcm5fbGV8dGV4dF9wYXR0ZXJuX2x0fHRleHRfc21hbGxlcnx0ZXh0YW55Y2F0fHRleHRjYXR8dGV4dGVxfHRleHRpY2xpa2V8dGV4dGljbmxpa2V8dGV4dGljcmVnZXhlcXx0ZXh0aWNyZWdleG5lfHRleHRpbnx0ZXh0bGVufHRleHRsaWtlfHRleHRuZXx0ZXh0bmxpa2V8dGV4dG91dHx0ZXh0cmVjdnx0ZXh0cmVnZXhlcXx0ZXh0cmVnZXhuZXx0ZXh0c2VuZHx0aGVzYXVydXNfaW5pdHx0aGVzYXVydXNfbGV4aXplfHRpZGVxfHRpZGdlfHRpZGd0fHRpZGlufHRpZGxhcmdlcnx0aWRsZXx0aWRsdHx0aWRuZXx0aWRvdXR8dGlkcmVjdnx0aWRzZW5kfHRpZHNtYWxsZXJ8dGltZV9jbXB8dGltZV9lcXx0aW1lX2dlfHRpbWVfZ3R8dGltZV9oYXNofHRpbWVfaW58dGltZV9sYXJnZXJ8dGltZV9sZXx0aW1lX2x0fHRpbWVfbWlfaW50ZXJ2YWx8dGltZV9taV90aW1lfHRpbWVfbmV8dGltZV9vdXR8dGltZV9wbF9pbnRlcnZhbHx0aW1lX3JlY3Z8dGltZV9zZW5kfHRpbWVfc21hbGxlcnx0aW1lZGF0ZV9wbHx0aW1lbWl8dGltZW5vd3x0aW1lb2ZkYXl8dGltZXBsfHRpbWVzdGFtcF9jbXB8dGltZXN0YW1wX2NtcF9kYXRlfHRpbWVzdGFtcF9jbXBfdGltZXN0YW1wdHp8dGltZXN0YW1wX2VxfHRpbWVzdGFtcF9lcV9kYXRlfHRpbWVzdGFtcF9lcV90aW1lc3RhbXB0enx0aW1lc3RhbXBfZ2V8dGltZXN0YW1wX2dlX2RhdGV8dGltZXN0YW1wX2dlX3RpbWVzdGFtcHR6fHRpbWVzdGFtcF9ndHx0aW1lc3RhbXBfZ3RfZGF0ZXx0aW1lc3RhbXBfZ3RfdGltZXN0YW1wdHp8dGltZXN0YW1wX2hhc2h8dGltZXN0YW1wX2lufHRpbWVzdGFtcF9sYXJnZXJ8dGltZXN0YW1wX2xlfHRpbWVzdGFtcF9sZV9kYXRlfHRpbWVzdGFtcF9sZV90aW1lc3RhbXB0enx0aW1lc3RhbXBfbHR8dGltZXN0YW1wX2x0X2RhdGV8dGltZXN0YW1wX2x0X3RpbWVzdGFtcHR6fHRpbWVzdGFtcF9taXx0aW1lc3RhbXBfbWlfaW50ZXJ2YWx8dGltZXN0YW1wX25lfHRpbWVzdGFtcF9uZV9kYXRlfHRpbWVzdGFtcF9uZV90aW1lc3RhbXB0enx0aW1lc3RhbXBfb3V0fHRpbWVzdGFtcF9wbF9pbnRlcnZhbHx0aW1lc3RhbXBfcmVjdnx0aW1lc3RhbXBfc2VuZHx0aW1lc3RhbXBfc21hbGxlcnx0aW1lc3RhbXB0eXBtb2Rpbnx0aW1lc3RhbXB0eXBtb2RvdXR8dGltZXN0YW1wdHpfY21wfHRpbWVzdGFtcHR6X2NtcF9kYXRlfHRpbWVzdGFtcHR6X2NtcF90aW1lc3RhbXB8dGltZXN0YW1wdHpfZXF8dGltZXN0YW1wdHpfZXFfZGF0ZXx0aW1lc3RhbXB0el9lcV90aW1lc3RhbXB8dGltZXN0YW1wdHpfZ2V8dGltZXN0YW1wdHpfZ2VfZGF0ZXx0aW1lc3RhbXB0el9nZV90aW1lc3RhbXB8dGltZXN0YW1wdHpfZ3R8dGltZXN0YW1wdHpfZ3RfZGF0ZXx0aW1lc3RhbXB0el9ndF90aW1lc3RhbXB8dGltZXN0YW1wdHpfaW58dGltZXN0YW1wdHpfbGFyZ2VyfHRpbWVzdGFtcHR6X2xlfHRpbWVzdGFtcHR6X2xlX2RhdGV8dGltZXN0YW1wdHpfbGVfdGltZXN0YW1wfHRpbWVzdGFtcHR6X2x0fHRpbWVzdGFtcHR6X2x0X2RhdGV8dGltZXN0YW1wdHpfbHRfdGltZXN0YW1wfHRpbWVzdGFtcHR6X21pfHRpbWVzdGFtcHR6X21pX2ludGVydmFsfHRpbWVzdGFtcHR6X25lfHRpbWVzdGFtcHR6X25lX2RhdGV8dGltZXN0YW1wdHpfbmVfdGltZXN0YW1wfHRpbWVzdGFtcHR6X291dHx0aW1lc3RhbXB0el9wbF9pbnRlcnZhbHx0aW1lc3RhbXB0el9yZWN2fHRpbWVzdGFtcHR6X3NlbmR8dGltZXN0YW1wdHpfc21hbGxlcnx0aW1lc3RhbXB0enR5cG1vZGlufHRpbWVzdGFtcHR6dHlwbW9kb3V0fHRpbWV0eXBtb2Rpbnx0aW1ldHlwbW9kb3V0fHRpbWV0el9jbXB8dGltZXR6X2VxfHRpbWV0el9nZXx0aW1ldHpfZ3R8dGltZXR6X2hhc2h8dGltZXR6X2lufHRpbWV0el9sYXJnZXJ8dGltZXR6X2xlfHRpbWV0el9sdHx0aW1ldHpfbWlfaW50ZXJ2YWx8dGltZXR6X25lfHRpbWV0el9vdXR8dGltZXR6X3BsX2ludGVydmFsfHRpbWV0el9yZWN2fHRpbWV0el9zZW5kfHRpbWV0el9zbWFsbGVyfHRpbWV0emRhdGVfcGx8dGltZXR6dHlwbW9kaW58dGltZXR6dHlwbW9kb3V0fHRpbWV6b25lfHRpbnRlcnZhbHx0aW50ZXJ2YWxjdHx0aW50ZXJ2YWxlbmR8dGludGVydmFsZXF8dGludGVydmFsZ2V8dGludGVydmFsZ3R8dGludGVydmFsaW58dGludGVydmFsbGV8dGludGVydmFsbGVuZXF8dGludGVydmFsbGVuZ2V8dGludGVydmFsbGVuZ3R8dGludGVydmFsbGVubGV8dGludGVydmFsbGVubHR8dGludGVydmFsbGVubmV8dGludGVydmFsbHR8dGludGVydmFsbmV8dGludGVydmFsb3V0fHRpbnRlcnZhbG92fHRpbnRlcnZhbHJlY3Z8dGludGVydmFscmVsfHRpbnRlcnZhbHNhbWV8dGludGVydmFsc2VuZHx0aW50ZXJ2YWxzdGFydHx0b19hc2NpaXx0b19jaGFyfHRvX2RhdGV8dG9faGV4fHRvX251bWJlcnx0b190aW1lc3RhbXB8dG9fdHNxdWVyeXx0b190c3ZlY3Rvcnx0cmFuc2FjdGlvbl90aW1lc3RhbXB8dHJhbnNsYXRlfHRyaWdnZXJfaW58dHJpZ2dlcl9vdXR8dHJ1bmN8dHNfZGVidWd8dHNfaGVhZGxpbmV8dHNfbGV4aXplfHRzX21hdGNoX3F2fHRzX21hdGNoX3RxfHRzX21hdGNoX3R0fHRzX21hdGNoX3ZxfHRzX3BhcnNlfHRzX3Jhbmt8dHNfcmFua19jZHx0c19yZXdyaXRlfHRzX3N0YXR8dHNfdG9rZW5fdHlwZXx0c190eXBhbmFseXplfHRzbWF0Y2hqb2luc2VsfHRzbWF0Y2hzZWx8dHNxX21jb250YWluZWR8dHNxX21jb250YWluc3x0c3F1ZXJ5X2FuZHx0c3F1ZXJ5X2NtcHx0c3F1ZXJ5X2VxfHRzcXVlcnlfZ2V8dHNxdWVyeV9ndHx0c3F1ZXJ5X2xlfHRzcXVlcnlfbHR8dHNxdWVyeV9uZXx0c3F1ZXJ5X25vdHx0c3F1ZXJ5X29yfHRzcXVlcnlpbnx0c3F1ZXJ5b3V0fHRzcXVlcnlyZWN2fHRzcXVlcnlzZW5kfHRzdmVjdG9yX2NtcHx0c3ZlY3Rvcl9jb25jYXR8dHN2ZWN0b3JfZXF8dHN2ZWN0b3JfZ2V8dHN2ZWN0b3JfZ3R8dHN2ZWN0b3JfbGV8dHN2ZWN0b3JfbHR8dHN2ZWN0b3JfbmV8dHN2ZWN0b3JfdXBkYXRlX3RyaWdnZXJ8dHN2ZWN0b3JfdXBkYXRlX3RyaWdnZXJfY29sdW1ufHRzdmVjdG9yaW58dHN2ZWN0b3JvdXR8dHN2ZWN0b3JyZWN2fHRzdmVjdG9yc2VuZHx0eGlkX2N1cnJlbnR8dHhpZF9jdXJyZW50X3NuYXBzaG90fHR4aWRfc25hcHNob3RfaW58dHhpZF9zbmFwc2hvdF9vdXR8dHhpZF9zbmFwc2hvdF9yZWN2fHR4aWRfc25hcHNob3Rfc2VuZHx0eGlkX3NuYXBzaG90X3hpcHx0eGlkX3NuYXBzaG90X3htYXh8dHhpZF9zbmFwc2hvdF94bWlufHR4aWRfdmlzaWJsZV9pbl9zbmFwc2hvdHx1aGNfdG9fdXRmOHx1bmlxdWVfa2V5X3JlY2hlY2t8dW5rbm93bmlufHVua25vd25vdXR8dW5rbm93bnJlY3Z8dW5rbm93bnNlbmR8dW5uZXN0fHVwcGVyfHV0ZjhfdG9fYXNjaWl8dXRmOF90b19iaWc1fHV0ZjhfdG9fZXVjX2NufHV0ZjhfdG9fZXVjX2ppc18yMDA0fHV0ZjhfdG9fZXVjX2pwfHV0ZjhfdG9fZXVjX2tyfHV0ZjhfdG9fZXVjX3R3fHV0ZjhfdG9fZ2IxODAzMHx1dGY4X3RvX2dia3x1dGY4X3RvX2lzbzg4NTl8dXRmOF90b19pc284ODU5XzF8dXRmOF90b19qb2hhYnx1dGY4X3RvX2tvaThyfHV0ZjhfdG9fa29pOHV8dXRmOF90b19zaGlmdF9qaXNfMjAwNHx1dGY4X3RvX3NqaXN8dXRmOF90b191aGN8dXRmOF90b193aW58dXVpZF9jbXB8dXVpZF9lcXx1dWlkX2dlfHV1aWRfZ3R8dXVpZF9oYXNofHV1aWRfaW58dXVpZF9sZXx1dWlkX2x0fHV1aWRfbmV8dXVpZF9vdXR8dXVpZF9yZWN2fHV1aWRfc2VuZHx2YXJfcG9wfHZhcl9zYW1wfHZhcmJpdF9pbnx2YXJiaXRfb3V0fHZhcmJpdF9yZWN2fHZhcmJpdF9zZW5kfHZhcmJpdGNtcHx2YXJiaXRlcXx2YXJiaXRnZXx2YXJiaXRndHx2YXJiaXRsZXx2YXJiaXRsdHx2YXJiaXRuZXx2YXJiaXR0eXBtb2Rpbnx2YXJiaXR0eXBtb2RvdXR8dmFyY2hhcmlufHZhcmNoYXJvdXR8dmFyY2hhcnJlY3Z8dmFyY2hhcnNlbmR8dmFyY2hhcnR5cG1vZGlufHZhcmNoYXJ0eXBtb2RvdXR8dmFyaWFuY2V8dmVyc2lvbnx2b2lkX2lufHZvaWRfb3V0fHZvaWRfcmVjdnx2b2lkX3NlbmR8d2lkdGh8d2lkdGhfYnVja2V0fHdpbjEyNTBfdG9fbGF0aW4yfHdpbjEyNTBfdG9fbWljfHdpbjEyNTFfdG9faXNvfHdpbjEyNTFfdG9fa29pOHJ8d2luMTI1MV90b19taWN8d2luMTI1MV90b193aW44NjZ8d2luODY2X3RvX2lzb3x3aW44NjZfdG9fa29pOHJ8d2luODY2X3RvX21pY3x3aW44NjZfdG9fd2luMTI1MXx3aW5fdG9fdXRmOHx4aWRlcXx4aWRlcWludDR8eGlkaW58eGlkb3V0fHhpZHJlY3Z8eGlkc2VuZHx4bWx8eG1sX2lufHhtbF9pc193ZWxsX2Zvcm1lZHx4bWxfaXNfd2VsbF9mb3JtZWRfY29udGVudHx4bWxfaXNfd2VsbF9mb3JtZWRfZG9jdW1lbnR8eG1sX291dHx4bWxfcmVjdnx4bWxfc2VuZHx4bWxhZ2d8eG1sY29tbWVudHx4bWxjb25jYXQyfHhtbGV4aXN0c3x4bWx2YWxpZGF0ZXx4cGF0aHx4cGF0aF9leGlzdHMiLnNwbGl0KCJ8IikpLGM9W3t0b2tlbjoic3RyaW5nIixyZWdleDoiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSJ9LHt0b2tlbjoidmFyaWFibGUubGFuZ3VhZ2UiLHJlZ2V4OiciLio/Iid9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIn0se3Rva2VuOmZ1bmN0aW9uKGMpe3JldHVybiBjPWMudG9Mb3dlckNhc2UoKSxhLmhhc093blByb3BlcnR5KGMpPyJrZXl3b3JkIjpiLmhhc093blByb3BlcnR5KGMpPyJzdXBwb3J0LmZ1bmN0aW9uIjoiaWRlbnRpZmllciJ9LHJlZ2V4OiJbYS16QS1aX11bYS16QS1aMC05XyRdKlxcYiJ9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6IiF8ISF8IX58IX5cXCp8IX5+fCF+flxcKnwjfCMjfCM8fCM8PXwjPD58Iz18Iz58Iz49fCV8XFwmfFxcJlxcJnxcXCY8fFxcJjxcXHx8XFwmPnxcXCp8XFwrfFxcLXwvfDx8PCM+fDxcXC0+fDw8fDw8PXw8PFxcfHw8PXw8Pnw8XFw/Pnw8QHw8XFxefD18Pnw+PXw+Pnw+Pj18PlxcXnxcXD8jfFxcP1xcLXxcXD9cXC1cXHx8XFw/XFx8fFxcP1xcfFxcfHxAfEBcXC1AfEA+fEBAfEBAQHxcXF58XFx8fFxcfFxcJj58XFx8L3xcXHw+PnxcXHxcXHx8XFx8XFx8L3x+fH5cXCp8fjw9fnx+PH58fj18fj49fnx+Pn58fn58fn5cXCoifSx7dG9rZW46ImxwYXJlbi5wYXJlbiIscmVnZXg6IltcXChdIn0se3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4OiJbXFwpXSJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifV07dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiItLS4qJCJ9LChuZXcgZikuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCoiLG5leHQ6ImNvbW1lbnQifSx7dG9rZW46ImtleXdvcmQuc3RhdGVtZW50QmVnaW4iLHJlZ2V4OiJeW2EtekEtWl0rIixuZXh0OiJzdGF0ZW1lbnQifSx7dG9rZW46InN1cHBvcnQuYnVpbGRpbiIscmVnZXg6Il5cXFxcW1xcU10rLiokIn1dLHN0YXRlbWVudDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLS0uKiQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCoiLG5leHQ6ImNvbW1lbnRTdGF0ZW1lbnQifSx7dG9rZW46InN0YXRlbWVudEVuZCIscmVnZXg6IjsiLG5leHQ6InN0YXJ0In0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJcXCRwZXJsXFwkIixuZXh0OiJwZXJsLXN0YXJ0In0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJcXCRweXRob25cXCQiLG5leHQ6InB5dGhvbi1zdGFydCJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiXFwkW1xcd18wLTldKlxcJCQiLG5leHQ6ImRvbGxhclNxbCJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiXFwkW1xcd18wLTldKlxcJCIsbmV4dDoiZG9sbGFyU3RhdGVtZW50U3RyaW5nIn1dLmNvbmNhdChjKSxkb2xsYXJTcWw6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii0tLiokIn0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwvXFwqIixuZXh0OiJjb21tZW50RG9sbGFyU3FsIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJeXFwkW1xcd18wLTldKlxcJCIsbmV4dDoic3RhdGVtZW50In0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJcXCRbXFx3XzAtOV0qXFwkIixuZXh0OiJkb2xsYXJTcWxTdHJpbmcifV0uY29uY2F0KGMpLGNvbW1lbnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qP1xcKlxcLyIsbmV4dDoic3RhcnQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxjb21tZW50U3RhdGVtZW50Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj9cXCpcXC8iLG5leHQ6InN0YXRlbWVudCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLGNvbW1lbnREb2xsYXJTcWw6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qP1xcKlxcLyIsbmV4dDoiZG9sbGFyU3FsIn0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV0sZG9sbGFyU3RhdGVtZW50U3RyaW5nOlt7dG9rZW46InN0cmluZyIscmVnZXg6Ii4qP1xcJFtcXHdfMC05XSpcXCQiLG5leHQ6InN0YXRlbWVudCJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV0sZG9sbGFyU3FsU3RyaW5nOlt7dG9rZW46InN0cmluZyIscmVnZXg6Ii4qP1xcJFtcXHdfMC05XSpcXCQiLG5leHQ6ImRvbGxhclNxbCJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV19LHRoaXMuZW1iZWRSdWxlcyhmLCJkb2MtIixbKG5ldyBmKS5nZXRFbmRSdWxlKCJzdGFydCIpXSksdGhpcy5lbWJlZFJ1bGVzKGgsInBlcmwtIixbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJcXCRwZXJsXFwkIixuZXh0OiJzdGF0ZW1lbnQifV0pLHRoaXMuZW1iZWRSdWxlcyhpLCJweXRob24tIixbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJcXCRweXRob25cXCQiLG5leHQ6InN0YXRlbWVudCJ9XSl9O2QuaW5oZXJpdHMoaixnKSxiLlBnc3FsSGlnaGxpZ2h0UnVsZXM9an0pLGRlZmluZSgiYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxmPWZ1bmN0aW9uKCl7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQuZG9jLnRhZyIscmVnZXg6IkBbXFx3XFxkX10rIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxccysifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiVE9ETyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJbXkBcXCpdKyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiIuIn1dfX07ZC5pbmhlcml0cyhmLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXRTdGFydFJ1bGU9ZnVuY3Rpb24oYSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKig/PVxcKikiLG5leHQ6YX19LHRoaXMuZ2V0RW5kUnVsZT1mdW5jdGlvbihhKXtyZXR1cm57dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiXFwqXFwvIixuZXh0OmF9fX0uY2FsbChmLnByb3RvdHlwZSksYi5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM9Zn0pLGRlZmluZSgiYWNlL21vZGUvcGVybF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxnPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKCJiYXNlfGNvbnN0YW50fGNvbnRpbnVlfGVsc2V8ZWxzaWZ8Zm9yfGZvcmVhY2h8Zm9ybWF0fGdvdG98aWZ8bGFzdHxsb2NhbHxteXxuZXh0fG5vfHBhY2thZ2V8cGFyZW50fHJlZG98cmVxdWlyZXxzY2FsYXJ8c3VifHVubGVzc3x1bnRpbHx3aGlsZXx1c2V8dmFycyIuc3BsaXQoInwiKSksYj1lLmFycmF5VG9NYXAoIkFSR1Z8RU5WfElOQ3xTSUciLnNwbGl0KCJ8IikpLGM9ZS5hcnJheVRvTWFwKCJnZXRwcm90b2J5bnVtYmVyfGdldHByb3RvYnluYW1lfGdldHNlcnZieW5hbWV8Z2V0aG9zdGJ5YWRkcnxnZXRob3N0YnluYW1lfGdldHNlcnZieXBvcnR8Z2V0bmV0YnlhZGRyfGdldG5ldGJ5bmFtZXxnZXRzb2NrbmFtZXxnZXRwZWVybmFtZXxzZXRwcmlvcml0eXxnZXRwcm90b2VudHxzZXRwcm90b2VudHxnZXRwcmlvcml0eXxlbmRwcm90b2VudHxnZXRzZXJ2ZW50fHNldHNlcnZlbnR8ZW5kc2VydmVudHxzZXRob3N0ZW50fHNvY2tldHBhaXJ8Z2V0c29ja29wdHxnZXRob3N0ZW50fGVuZGhvc3RlbnR8c2V0c29ja29wdHxzZXRuZXRlbnR8cXVvdGVtZXRhfGxvY2FsdGltZXxwcm90b3R5cGV8Z2V0bmV0ZW50fGVuZG5ldGVudHxyZXdpbmRkaXJ8d2FudGFycmF5fGdldHB3dWlkfGNsb3NlZGlyfGdldGxvZ2lufHJlYWRsaW5rfGVuZGdyZW50fGdldGdyZ2lkfGdldGdybmFtfHNobXdyaXRlfHNodXRkb3dufHJlYWRsaW5lfGVuZHB3ZW50fHNldGdyZW50fHJlYWRwaXBlfGZvcm1saW5lfHRydW5jYXRlfGRibWNsb3NlfHN5c3dyaXRlfHNldHB3ZW50fGdldHB3bmFtfGdldGdyZW50fGdldHB3ZW50fHVjZmlyc3R8c3lzcmVhZHxzZXRwZ3JwfHNobXJlYWR8c3lzc2Vla3xzeXNvcGVufHRlbGxkaXJ8ZGVmaW5lZHxvcGVuZGlyfGNvbm5lY3R8bGNmaXJzdHxnZXRwcGlkfGJpbm1vZGV8c3lzY2FsbHxzcHJpbnRmfGdldHBncnB8cmVhZGRpcnxzZWVrZGlyfHdhaXRwaWR8cmV2ZXJzZXx1bnNoaWZ0fHN5bWxpbmt8ZGJtb3BlbnxzZW1nZXR8bXNncmN2fHJlbmFtZXxsaXN0ZW58Y2hyb290fG1zZ3NuZHxzaG1jdGx8YWNjZXB0fHVucGFja3xleGlzdHN8ZmlsZW5vfHNobWdldHxzeXN0ZW18dW5saW5rfHByaW50ZnxnbXRpbWV8bXNnY3RsfHNlbWN0bHx2YWx1ZXN8cmluZGV4fHN1YnN0cnxzcGxpY2V8bGVuZ3RofG1zZ2dldHxzZWxlY3R8c29ja2V0fHJldHVybnxjYWxsZXJ8ZGVsZXRlfGFsYXJtfGlvY3RsfGluZGV4fHVuZGVmfGxzdGF0fHRpbWVzfHNyYW5kfGNob3dufGZjbnRsfGNsb3NlfHdyaXRlfHVtYXNrfHJtZGlyfHN0dWR5fHNsZWVwfGNob21wfHVudGllfHByaW50fHV0aW1lfG1rZGlyfGF0YW4yfHNwbGl0fGNyeXB0fGZsb2NrfGNobW9kfEJFR0lOfGJsZXNzfGNoZGlyfHNlbW9wfHNoaWZ0fHJlc2V0fGxpbmt8c3RhdHxjaG9wfGdyZXB8Zm9ya3xkdW1wfGpvaW58b3Blbnx0ZWxsfHBpcGV8ZXhpdHxnbG9ifHdhcm58ZWFjaHxiaW5kfHNvcnR8cGFja3xldmFsfHB1c2h8a2V5c3xnZXRjfGtpbGx8c2Vla3xzcXJ0fHNlbmR8d2FpdHxyYW5kfHRpZWR8cmVhZHx0aW1lfGV4ZWN8cmVjdnxlb2Z8Y2hyfGludHxvcmR8ZXhwfHBvc3xwb3B8c2lufGxvZ3xhYnN8b2N0fGhleHx0aWV8Y29zfHZlY3xFTkR8cmVmfG1hcHxkaWV8dWN8bGN8ZG8iLnNwbGl0KCJ8IikpO3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiIy4qJCJ9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6IlsvXSg/Oig/OlxcWyg/OlxcXFxdfFteXFxdXSkrXFxdKXwoPzpcXFxcL3xbXlxcXS9dKSkqWy9dXFx3KlxccyooPz1bKS4sO118JCkifSx7dG9rZW46InN0cmluZyIscmVnZXg6J1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nfSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6J1siXS4qXFxcXCQnLG5leHQ6InFxc3RyaW5nIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIn0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiJbJ10uKlxcXFwkIixuZXh0OiJxc3RyaW5nIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiMHhbMC05YS1mQS1GXStcXGIifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiJ9LHt0b2tlbjpmdW5jdGlvbihkKXtyZXR1cm4gYS5oYXNPd25Qcm9wZXJ0eShkKT8ia2V5d29yZCI6Yi5oYXNPd25Qcm9wZXJ0eShkKT8iY29uc3RhbnQubGFuZ3VhZ2UiOmMuaGFzT3duUHJvcGVydHkoZCk/InN1cHBvcnQuZnVuY3Rpb24iOiJpZGVudGlmaWVyIn0scmVnZXg6IlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiJ9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcLlxcLlxcLnxcXHxcXHw9fD4+PXw8PD18PD0+fCYmPXw9PnwhfnxcXF49fCY9fFxcfD18XFwuPXx4PXwlPXxcXC89fFxcKj18XFwtPXxcXCs9fD1+fFxcKlxcKnxcXC1cXC18XFwuXFwufFxcfFxcfHwmJnxcXCtcXCt8XFwtPnwhPXw9PXw+PXw8PXw+Pnw8PHwsfD18XFw/XFw6fFxcXnxcXHx8eHwlfFxcL3xcXCp8PHwmfFxcXFx8fnwhfD58XFwufFxcLXxcXCt8XFwtQ3xcXC1ifFxcLVN8XFwtdXxcXC10fFxcLXB8XFwtbHxcXC1kfFxcLWZ8XFwtZ3xcXC1zfFxcLXp8XFwta3xcXC1lfFxcLU98XFwtVHxcXC1CfFxcLU18XFwtQXxcXC1YfFxcLVd8XFwtY3xcXC1SfFxcLW98XFwteHxcXC13fFxcLXJ8XFxiKD86YW5kfGNtcHxlcXxnZXxndHxsZXxsdHxuZXxub3R8b3J8eG9yKSJ9LHt0b2tlbjoibHBhcmVuIixyZWdleDoiW1soe10ifSx7dG9rZW46InJwYXJlbiIscmVnZXg6IltcXF0pfV0ifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn1dLHFxc3RyaW5nOlt7dG9rZW46InN0cmluZyIscmVnZXg6Jyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJyxuZXh0OiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV0scXN0cmluZzpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OiIoPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/JyIsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfX07ZC5pbmhlcml0cyhnLGYpLGIuUGVybEhpZ2hsaWdodFJ1bGVzPWd9KSxkZWZpbmUoImFjZS9tb2RlL3B5dGhvbl9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxnPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKCJhbmR8YXN8YXNzZXJ0fGJyZWFrfGNsYXNzfGNvbnRpbnVlfGRlZnxkZWx8ZWxpZnxlbHNlfGV4Y2VwdHxleGVjfGZpbmFsbHl8Zm9yfGZyb218Z2xvYmFsfGlmfGltcG9ydHxpbnxpc3xsYW1iZGF8bm90fG9yfHBhc3N8cHJpbnR8cmFpc2V8cmV0dXJufHRyeXx3aGlsZXx3aXRofHlpZWxkIi5zcGxpdCgifCIpKSxiPWUuYXJyYXlUb01hcCgiVHJ1ZXxGYWxzZXxOb25lfE5vdEltcGxlbWVudGVkfEVsbGlwc2lzfF9fZGVidWdfXyIuc3BsaXQoInwiKSksYz1lLmFycmF5VG9NYXAoImFic3xkaXZtb2R8aW5wdXR8b3BlbnxzdGF0aWNtZXRob2R8YWxsfGVudW1lcmF0ZXxpbnR8b3JkfHN0cnxhbnl8ZXZhbHxpc2luc3RhbmNlfHBvd3xzdW18YmFzZXN0cmluZ3xleGVjZmlsZXxpc3N1YmNsYXNzfHByaW50fHN1cGVyfGJpbmZpbGV8aXRlcnxwcm9wZXJ0eXx0dXBsZXxib29sfGZpbHRlcnxsZW58cmFuZ2V8dHlwZXxieXRlYXJyYXl8ZmxvYXR8bGlzdHxyYXdfaW5wdXR8dW5pY2hyfGNhbGxhYmxlfGZvcm1hdHxsb2NhbHN8cmVkdWNlfHVuaWNvZGV8Y2hyfGZyb3plbnNldHxsb25nfHJlbG9hZHx2YXJzfGNsYXNzbWV0aG9kfGdldGF0dHJ8bWFwfHJlcHJ8eHJhbmdlfGNtcHxnbG9iYWxzfG1heHxyZXZlcnNlZHx6aXB8Y29tcGlsZXxoYXNhdHRyfG1lbW9yeXZpZXd8cm91bmR8X19pbXBvcnRfX3xjb21wbGV4fGhhc2h8bWlufHNldHxhcHBseXxkZWxhdHRyfGhlbHB8bmV4dHxzZXRhdHRyfGJ1ZmZlcnxkaWN0fGhleHxvYmplY3R8c2xpY2V8Y29lcmNlfGRpcnxpZHxvY3R8c29ydGVkfGludGVybiIuc3BsaXQoInwiKSksZD1lLmFycmF5VG9NYXAoIiIuc3BsaXQoInwiKSksZj0iKD86cnx1fHVyfFJ8VXxVUnxVcnx1Uik/IixnPSIoPzooPzpbMS05XVxcZCopfCg/OjApKSIsaD0iKD86MFtvT10/WzAtN10rKSIsaT0iKD86MFt4WF1bXFxkQS1GYS1mXSspIixqPSIoPzowW2JCXVswMV0rKSIsaz0iKD86IitnKyJ8IitoKyJ8IitpKyJ8IitqKyIpIixsPSIoPzpbZUVdWystXT9cXGQrKSIsbT0iKD86XFwuXFxkKykiLG49Iig/OlxcZCspIixvPSIoPzooPzoiK24rIj8iK20rIil8KD86IituKyJcXC4pKSIscD0iKD86KD86IitvKyJ8IituKyIpIitsKyIpIixxPSIoPzoiK3ArInwiK28rIikiO3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiIy4qJCJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDpmKyciezN9KD86W15cXFxcXXxcXFxcLikqPyJ7M30nfSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6ZisnInszfS4qJCcsbmV4dDoicXFzdHJpbmcifSx7dG9rZW46InN0cmluZyIscmVnZXg6ZisnIig/OlteXFxcXF18XFxcXC4pKj8iJ30se3Rva2VuOiJzdHJpbmciLHJlZ2V4OmYrIid7M30oPzpbXlxcXFxdfFxcXFwuKSo/J3szfSJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDpmKyInezN9LiokIixuZXh0OiJxc3RyaW5nIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OmYrIicoPzpbXlxcXFxdfFxcXFwuKSo/JyJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6Iig/OiIrcSsifFxcZCspW2pKXVxcYiJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6cX0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDprKyJbbExdXFxiIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDprKyJcXGIifSx7dG9rZW46ZnVuY3Rpb24oZSl7cmV0dXJuIGEuaGFzT3duUHJvcGVydHkoZSk/ImtleXdvcmQiOmIuaGFzT3duUHJvcGVydHkoZSk/ImNvbnN0YW50Lmxhbmd1YWdlIjpkLmhhc093blByb3BlcnR5KGUpPyJpbnZhbGlkLmlsbGVnYWwiOmMuaGFzT3duUHJvcGVydHkoZSk/InN1cHBvcnQuZnVuY3Rpb24iOmU9PSJkZWJ1Z2dlciI/ImludmFsaWQuZGVwcmVjYXRlZCI6ImlkZW50aWZpZXIifSxyZWdleDoiW2EtekEtWl8kXVthLXpBLVowLTlfJF0qXFxiIn0se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiXFwrfFxcLXxcXCp8XFwqXFwqfFxcL3xcXC9cXC98JXw8PHw+PnwmfFxcfHxcXF58fnw8fD58PD18PT58PT18IT18PD58PSJ9LHt0b2tlbjoibHBhcmVuLnBhcmVuIixyZWdleDoiW1xcW1xcKFxce10ifSx7dG9rZW46InBhcmVuLnJwYXJlbiIscmVnZXg6IltcXF1cXClcXH1dIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9XSxxcXN0cmluZzpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OicoPzpbXlxcXFxdfFxcXFwuKSo/InszfScsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLHFzdHJpbmc6W3t0b2tlbjoic3RyaW5nIixyZWdleDoiKD86W15cXFxcXXxcXFxcLikqPyd7M30iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX19O2QuaW5oZXJpdHMoZyxmKSxiLlB5dGhvbkhpZ2hsaWdodFJ1bGVzPWd9KSxmdW5jdGlvbigpe3dpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLGZ1bmN0aW9uKGEpe3dpbmRvdy5hY2V8fCh3aW5kb3cuYWNlPXt9KTtmb3IodmFyIGIgaW4gYSlhLmhhc093blByb3BlcnR5KGIpJiYoYWNlW2JdPWFbYl0pfSl9KCk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-php-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgoqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQoqCiogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwoqCiogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQoqIExpY2Vuc2UuCioKKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KKgoqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwoqIEFqYXgub3JnIEIuVi4KKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqCiogQ29udHJpYnV0b3Iocyk6CiogICAgICBBbmRyw6kgRmllZGxlciA8ZmllZGxlciBkb3QgYW5kcmUgYSB0IGdtYWlsIGRvdCBjb20+CioKKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgoqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgoqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAoqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQoqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgoqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCioKKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9waHAnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHQnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS9waHBfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCAnYWNlL3JhbmdlJywgJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnLCAnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7CnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7CnZhciBQaHBIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vcGhwX2hpZ2hsaWdodF9ydWxlcyIpLlBocEhpZ2hsaWdodFJ1bGVzOwp2YXIgTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSByZXF1aXJlKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudDsKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsKdmFyIENzdHlsZUJlaGF2aW91ciA9IHJlcXVpcmUoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cjsKdmFyIENTdHlsZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlOwoKdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IFBocEhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7CiAgICB0aGlzLiRvdXRkZW50ID0gbmV3IE1hdGNoaW5nQnJhY2VPdXRkZW50KCk7CiAgICB0aGlzLiRiZWhhdmlvdXIgPSBuZXcgQ3N0eWxlQmVoYXZpb3VyKCk7CiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBDU3R5bGVGb2xkTW9kZSgpOwp9Owpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOwoKKGZ1bmN0aW9uKCkgewoKICAgIHRoaXMudG9nZ2xlQ29tbWVudExpbmVzID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgc3RhcnRSb3csIGVuZFJvdykgewogICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsKICAgICAgICB2YXIgcmUgPSAvXihccyopIy87CgogICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykgewogICAgICAgICAgICBpZiAoIXJlLnRlc3QoZG9jLmdldExpbmUoaSkpKSB7CiAgICAgICAgICAgICAgICBvdXRkZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKG91dGRlbnQpIHsKICAgICAgICAgICAgdmFyIGRlbGV0ZVJhbmdlID0gbmV3IFJhbmdlKDAsIDAsIDAsIDApOwogICAgICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUoaSk7CiAgICAgICAgICAgICAgICB2YXIgbSA9IGxpbmUubWF0Y2gocmUpOwogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2Uuc3RhcnQucm93ID0gaTsKICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLmVuZC5yb3cgPSBpOwogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLmNvbHVtbiA9IG1bMF0ubGVuZ3RoOwogICAgICAgICAgICAgICAgZG9jLnJlcGxhY2UoZGVsZXRlUmFuZ2UsIG1bMV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBkb2MuaW5kZW50Um93cyhzdGFydFJvdywgZW5kUm93LCAiIyIpOwogICAgICAgIH0KICAgIH07CgogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsKICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGxpbmUpOwoKICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsKICAgICAgICB2YXIgdG9rZW5zID0gdG9rZW5pemVkTGluZS50b2tlbnM7CgogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7CiAgICAgICAgICAgIHJldHVybiBpbmRlbnQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoc3RhdGUgPT0gInN0YXJ0IikgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eLipbXHtcKFxbXDpdXHMqJC8pOwogICAgICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgICAgIGluZGVudCArPSB0YWI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBpbmRlbnQ7CiAgICB9OwoKICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsKICAgIH07CgogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgewogICAgICAgIHRoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoZG9jLCByb3cpOwogICAgfTsKCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOwoKZXhwb3J0cy5Nb2RlID0gTW9kZTsKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgQW5kcsOpIEZpZWRsZXIgPGZpZWRsZXIgZG90IGFuZHJlIGEgdCBnbWFpbCBkb3QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKgogKi8KCmRlZmluZSgnYWNlL21vZGUvcGhwX2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9sYW5nJywgJ2FjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOwp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM7CnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOwoKdmFyIFBocEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgZG9jQ29tbWVudCA9IG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKTsKICAgIC8vIGh0dHA6Ly9waHAubmV0L3F1aWNrcmVmLnBocAogICAgdmFyIGJ1aWx0aW5GdW5jdGlvbnMgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCdhYnN8YWNvc3xhY29zaHxhZGRjc2xhc2hlc3xhZGRzbGFzaGVzfGFnZ3JlZ2F0ZXxhZ2dyZWdhdGVfaW5mb3xhZ2dyZWdhdGVfbWV0aG9kc3xhZ2dyZWdhdGVfbWV0aG9kc19ieV9saXN0fGFnZ3JlZ2F0ZV9tZXRob2RzX2J5X3JlZ2V4cHwnICsKICAgICAgICAnYWdncmVnYXRlX3Byb3BlcnRpZXN8YWdncmVnYXRlX3Byb3BlcnRpZXNfYnlfbGlzdHxhZ2dyZWdhdGVfcHJvcGVydGllc19ieV9yZWdleHB8YWdncmVnYXRpb25faW5mb3xhbXFwY29ubmVjdGlvbnxhbXFwZXhjaGFuZ2V8YW1xcHF1ZXVlfCcgKwogICAgICAgICdhcGFjaGVfY2hpbGRfdGVybWluYXRlfGFwYWNoZV9nZXRfbW9kdWxlc3xhcGFjaGVfZ2V0X3ZlcnNpb258YXBhY2hlX2dldGVudnxhcGFjaGVfbG9va3VwX3VyaXxhcGFjaGVfbm90ZXxhcGFjaGVfcmVxdWVzdF9oZWFkZXJzfCcgKwogICAgICAgICdhcGFjaGVfcmVzZXRfdGltZW91dHxhcGFjaGVfcmVzcG9uc2VfaGVhZGVyc3xhcGFjaGVfc2V0ZW52fGFwY19hZGR8YXBjX2Jpbl9kdW1wfGFwY19iaW5fZHVtcGZpbGV8YXBjX2Jpbl9sb2FkfGFwY19iaW5fbG9hZGZpbGV8JyArCiAgICAgICAgJ2FwY19jYWNoZV9pbmZvfGFwY19jYXN8YXBjX2NsZWFyX2NhY2hlfGFwY19jb21waWxlX2ZpbGV8YXBjX2RlY3xhcGNfZGVmaW5lX2NvbnN0YW50c3xhcGNfZGVsZXRlfGFwY19kZWxldGVfZmlsZXxhcGNfZXhpc3RzfGFwY19mZXRjaHwnICsKICAgICAgICAnYXBjX2luY3xhcGNfbG9hZF9jb25zdGFudHN8YXBjX3NtYV9pbmZvfGFwY19zdG9yZXxhcGNpdGVyYXRvcnxhcGRfYnJlYWtwb2ludHxhcGRfY2FsbHN0YWNrfGFwZF9jbHVua3xhcGRfY29udGludWV8YXBkX2Nyb2FrfCcgKwogICAgICAgICdhcGRfZHVtcF9mdW5jdGlvbl90YWJsZXxhcGRfZHVtcF9wZXJzaXN0ZW50X3Jlc291cmNlc3xhcGRfZHVtcF9yZWd1bGFyX3Jlc291cmNlc3xhcGRfZWNob3xhcGRfZ2V0X2FjdGl2ZV9zeW1ib2xzfGFwZF9zZXRfcHByb2ZfdHJhY2V8JyArCiAgICAgICAgJ2FwZF9zZXRfc2Vzc2lvbnxhcGRfc2V0X3Nlc3Npb25fdHJhY2V8YXBkX3NldF9zZXNzaW9uX3RyYWNlX3NvY2tldHxhcHBlbmRpdGVyYXRvcnxhcnJheXxhcnJheV9jaGFuZ2Vfa2V5X2Nhc2V8YXJyYXlfY2h1bmt8YXJyYXlfY29tYmluZXwnICsKICAgICAgICAnYXJyYXlfY291bnRfdmFsdWVzfGFycmF5X2RpZmZ8YXJyYXlfZGlmZl9hc3NvY3xhcnJheV9kaWZmX2tleXxhcnJheV9kaWZmX3Vhc3NvY3xhcnJheV9kaWZmX3VrZXl8YXJyYXlfZmlsbHxhcnJheV9maWxsX2tleXN8YXJyYXlfZmlsdGVyfCcgKwogICAgICAgICdhcnJheV9mbGlwfGFycmF5X2ludGVyc2VjdHxhcnJheV9pbnRlcnNlY3RfYXNzb2N8YXJyYXlfaW50ZXJzZWN0X2tleXxhcnJheV9pbnRlcnNlY3RfdWFzc29jfGFycmF5X2ludGVyc2VjdF91a2V5fGFycmF5X2tleV9leGlzdHN8JyArCiAgICAgICAgJ2FycmF5X2tleXN8YXJyYXlfbWFwfGFycmF5X21lcmdlfGFycmF5X21lcmdlX3JlY3Vyc2l2ZXxhcnJheV9tdWx0aXNvcnR8YXJyYXlfcGFkfGFycmF5X3BvcHxhcnJheV9wcm9kdWN0fGFycmF5X3B1c2h8YXJyYXlfcmFuZHwnICsKICAgICAgICAnYXJyYXlfcmVkdWNlfGFycmF5X3JlcGxhY2V8YXJyYXlfcmVwbGFjZV9yZWN1cnNpdmV8YXJyYXlfcmV2ZXJzZXxhcnJheV9zZWFyY2h8YXJyYXlfc2hpZnR8YXJyYXlfc2xpY2V8YXJyYXlfc3BsaWNlfGFycmF5X3N1bXxhcnJheV91ZGlmZnwnICsKICAgICAgICAnYXJyYXlfdWRpZmZfYXNzb2N8YXJyYXlfdWRpZmZfdWFzc29jfGFycmF5X3VpbnRlcnNlY3R8YXJyYXlfdWludGVyc2VjdF9hc3NvY3xhcnJheV91aW50ZXJzZWN0X3Vhc3NvY3xhcnJheV91bmlxdWV8YXJyYXlfdW5zaGlmdHwnICsKICAgICAgICAnYXJyYXlfdmFsdWVzfGFycmF5X3dhbGt8YXJyYXlfd2Fsa19yZWN1cnNpdmV8YXJyYXlhY2Nlc3N8YXJyYXlpdGVyYXRvcnxhcnJheW9iamVjdHxhcnNvcnR8YXNpbnxhc2luaHxhc29ydHxhc3NlcnR8YXNzZXJ0X29wdGlvbnN8YXRhbnwnICsKICAgICAgICAnYXRhbjJ8YXRhbmh8YXVkaW9wcm9wZXJ0aWVzfGJhZGZ1bmN0aW9uY2FsbGV4Y2VwdGlvbnxiYWRtZXRob2RjYWxsZXhjZXB0aW9ufGJhc2U2NF9kZWNvZGV8YmFzZTY0X2VuY29kZXxiYXNlX2NvbnZlcnR8YmFzZW5hbWV8JyArCiAgICAgICAgJ2JiY29kZV9hZGRfZWxlbWVudHxiYmNvZGVfYWRkX3NtaWxleXxiYmNvZGVfY3JlYXRlfGJiY29kZV9kZXN0cm95fGJiY29kZV9wYXJzZXxiYmNvZGVfc2V0X2FyZ19wYXJzZXJ8YmJjb2RlX3NldF9mbGFnc3xiY2FkZHxiY2NvbXB8YmNkaXZ8JyArCiAgICAgICAgJ2JjbW9kfGJjbXVsfGJjb21waWxlcl9sb2FkfGJjb21waWxlcl9sb2FkX2V4ZXxiY29tcGlsZXJfcGFyc2VfY2xhc3N8YmNvbXBpbGVyX3JlYWR8YmNvbXBpbGVyX3dyaXRlX2NsYXNzfGJjb21waWxlcl93cml0ZV9jb25zdGFudHwnICsKICAgICAgICAnYmNvbXBpbGVyX3dyaXRlX2V4ZV9mb290ZXJ8YmNvbXBpbGVyX3dyaXRlX2ZpbGV8YmNvbXBpbGVyX3dyaXRlX2Zvb3RlcnxiY29tcGlsZXJfd3JpdGVfZnVuY3Rpb258YmNvbXBpbGVyX3dyaXRlX2Z1bmN0aW9uc19mcm9tX2ZpbGV8JyArCiAgICAgICAgJ2Jjb21waWxlcl93cml0ZV9oZWFkZXJ8YmNvbXBpbGVyX3dyaXRlX2luY2x1ZGVkX2ZpbGVuYW1lfGJjcG93fGJjcG93bW9kfGJjc2NhbGV8YmNzcXJ0fGJjc3VifGJpbjJoZXh8YmluZF90ZXh0ZG9tYWluX2NvZGVzZXR8YmluZGVjfCcgKwogICAgICAgICdiaW5kdGV4dGRvbWFpbnxic29uX2RlY29kZXxic29uX2VuY29kZXxidW1wVmFsdWV8YnpjbG9zZXxiemNvbXByZXNzfGJ6ZGVjb21wcmVzc3xiemVycm5vfGJ6ZXJyb3J8YnplcnJzdHJ8YnpmbHVzaHxiem9wZW58YnpyZWFkfGJ6d3JpdGV8JyArCiAgICAgICAgJ2NhY2hpbmdpdGVyYXRvcnxjYWlyb3xjYWlyb19jcmVhdGV8Y2Fpcm9fZm9udF9mYWNlX2dldF90eXBlfGNhaXJvX2ZvbnRfZmFjZV9zdGF0dXN8Y2Fpcm9fZm9udF9vcHRpb25zX2NyZWF0ZXxjYWlyb19mb250X29wdGlvbnNfZXF1YWx8JyArCiAgICAgICAgJ2NhaXJvX2ZvbnRfb3B0aW9uc19nZXRfYW50aWFsaWFzfGNhaXJvX2ZvbnRfb3B0aW9uc19nZXRfaGludF9tZXRyaWNzfGNhaXJvX2ZvbnRfb3B0aW9uc19nZXRfaGludF9zdHlsZXwnICsKICAgICAgICAnY2Fpcm9fZm9udF9vcHRpb25zX2dldF9zdWJwaXhlbF9vcmRlcnxjYWlyb19mb250X29wdGlvbnNfaGFzaHxjYWlyb19mb250X29wdGlvbnNfbWVyZ2V8Y2Fpcm9fZm9udF9vcHRpb25zX3NldF9hbnRpYWxpYXN8JyArCiAgICAgICAgJ2NhaXJvX2ZvbnRfb3B0aW9uc19zZXRfaGludF9tZXRyaWNzfGNhaXJvX2ZvbnRfb3B0aW9uc19zZXRfaGludF9zdHlsZXxjYWlyb19mb250X29wdGlvbnNfc2V0X3N1YnBpeGVsX29yZGVyfGNhaXJvX2ZvbnRfb3B0aW9uc19zdGF0dXN8JyArCiAgICAgICAgJ2NhaXJvX2Zvcm1hdF9zdHJpZGVfZm9yX3dpZHRofGNhaXJvX2ltYWdlX3N1cmZhY2VfY3JlYXRlfGNhaXJvX2ltYWdlX3N1cmZhY2VfY3JlYXRlX2Zvcl9kYXRhfGNhaXJvX2ltYWdlX3N1cmZhY2VfY3JlYXRlX2Zyb21fcG5nfCcgKwogICAgICAgICdjYWlyb19pbWFnZV9zdXJmYWNlX2dldF9kYXRhfGNhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0X2Zvcm1hdHxjYWlyb19pbWFnZV9zdXJmYWNlX2dldF9oZWlnaHR8Y2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfc3RyaWRlfCcgKwogICAgICAgICdjYWlyb19pbWFnZV9zdXJmYWNlX2dldF93aWR0aHxjYWlyb19tYXRyaXhfY3JlYXRlX3NjYWxlfGNhaXJvX21hdHJpeF9jcmVhdGVfdHJhbnNsYXRlfGNhaXJvX21hdHJpeF9pbnZlcnR8Y2Fpcm9fbWF0cml4X211bHRpcGx5fCcgKwogICAgICAgICdjYWlyb19tYXRyaXhfcm90YXRlfGNhaXJvX21hdHJpeF90cmFuc2Zvcm1fZGlzdGFuY2V8Y2Fpcm9fbWF0cml4X3RyYW5zZm9ybV9wb2ludHxjYWlyb19tYXRyaXhfdHJhbnNsYXRlfGNhaXJvX3BhdHRlcm5fYWRkX2NvbG9yX3N0b3BfcmdifCcgKwogICAgICAgICdjYWlyb19wYXR0ZXJuX2FkZF9jb2xvcl9zdG9wX3JnYmF8Y2Fpcm9fcGF0dGVybl9jcmVhdGVfZm9yX3N1cmZhY2V8Y2Fpcm9fcGF0dGVybl9jcmVhdGVfbGluZWFyfGNhaXJvX3BhdHRlcm5fY3JlYXRlX3JhZGlhbHwnICsKICAgICAgICAnY2Fpcm9fcGF0dGVybl9jcmVhdGVfcmdifGNhaXJvX3BhdHRlcm5fY3JlYXRlX3JnYmF8Y2Fpcm9fcGF0dGVybl9nZXRfY29sb3Jfc3RvcF9jb3VudHxjYWlyb19wYXR0ZXJuX2dldF9jb2xvcl9zdG9wX3JnYmF8JyArCiAgICAgICAgJ2NhaXJvX3BhdHRlcm5fZ2V0X2V4dGVuZHxjYWlyb19wYXR0ZXJuX2dldF9maWx0ZXJ8Y2Fpcm9fcGF0dGVybl9nZXRfbGluZWFyX3BvaW50c3xjYWlyb19wYXR0ZXJuX2dldF9tYXRyaXh8JyArCiAgICAgICAgJ2NhaXJvX3BhdHRlcm5fZ2V0X3JhZGlhbF9jaXJjbGVzfGNhaXJvX3BhdHRlcm5fZ2V0X3JnYmF8Y2Fpcm9fcGF0dGVybl9nZXRfc3VyZmFjZXxjYWlyb19wYXR0ZXJuX2dldF90eXBlfGNhaXJvX3BhdHRlcm5fc2V0X2V4dGVuZHwnICsKICAgICAgICAnY2Fpcm9fcGF0dGVybl9zZXRfZmlsdGVyfGNhaXJvX3BhdHRlcm5fc2V0X21hdHJpeHxjYWlyb19wYXR0ZXJuX3N0YXR1c3xjYWlyb19wZGZfc3VyZmFjZV9jcmVhdGV8Y2Fpcm9fcGRmX3N1cmZhY2Vfc2V0X3NpemV8JyArCiAgICAgICAgJ2NhaXJvX3BzX2dldF9sZXZlbHN8Y2Fpcm9fcHNfbGV2ZWxfdG9fc3RyaW5nfGNhaXJvX3BzX3N1cmZhY2VfY3JlYXRlfGNhaXJvX3BzX3N1cmZhY2VfZHNjX2JlZ2luX3BhZ2Vfc2V0dXB8JyArCiAgICAgICAgJ2NhaXJvX3BzX3N1cmZhY2VfZHNjX2JlZ2luX3NldHVwfGNhaXJvX3BzX3N1cmZhY2VfZHNjX2NvbW1lbnR8Y2Fpcm9fcHNfc3VyZmFjZV9nZXRfZXBzfGNhaXJvX3BzX3N1cmZhY2VfcmVzdHJpY3RfdG9fbGV2ZWx8JyArCiAgICAgICAgJ2NhaXJvX3BzX3N1cmZhY2Vfc2V0X2Vwc3xjYWlyb19wc19zdXJmYWNlX3NldF9zaXplfGNhaXJvX3NjYWxlZF9mb250X2NyZWF0ZXxjYWlyb19zY2FsZWRfZm9udF9leHRlbnRzfGNhaXJvX3NjYWxlZF9mb250X2dldF9jdG18JyArCiAgICAgICAgJ2NhaXJvX3NjYWxlZF9mb250X2dldF9mb250X2ZhY2V8Y2Fpcm9fc2NhbGVkX2ZvbnRfZ2V0X2ZvbnRfbWF0cml4fGNhaXJvX3NjYWxlZF9mb250X2dldF9mb250X29wdGlvbnN8Y2Fpcm9fc2NhbGVkX2ZvbnRfZ2V0X3NjYWxlX21hdHJpeHwnICsKICAgICAgICAnY2Fpcm9fc2NhbGVkX2ZvbnRfZ2V0X3R5cGV8Y2Fpcm9fc2NhbGVkX2ZvbnRfZ2x5cGhfZXh0ZW50c3xjYWlyb19zY2FsZWRfZm9udF9zdGF0dXN8Y2Fpcm9fc2NhbGVkX2ZvbnRfdGV4dF9leHRlbnRzfCcgKwogICAgICAgICdjYWlyb19zdXJmYWNlX2NvcHlfcGFnZXxjYWlyb19zdXJmYWNlX2NyZWF0ZV9zaW1pbGFyfGNhaXJvX3N1cmZhY2VfZmluaXNofGNhaXJvX3N1cmZhY2VfZmx1c2h8Y2Fpcm9fc3VyZmFjZV9nZXRfY29udGVudHwnICsKICAgICAgICAnY2Fpcm9fc3VyZmFjZV9nZXRfZGV2aWNlX29mZnNldHxjYWlyb19zdXJmYWNlX2dldF9mb250X29wdGlvbnN8Y2Fpcm9fc3VyZmFjZV9nZXRfdHlwZXxjYWlyb19zdXJmYWNlX21hcmtfZGlydHl8JyArCiAgICAgICAgJ2NhaXJvX3N1cmZhY2VfbWFya19kaXJ0eV9yZWN0YW5nbGV8Y2Fpcm9fc3VyZmFjZV9zZXRfZGV2aWNlX29mZnNldHxjYWlyb19zdXJmYWNlX3NldF9mYWxsYmFja19yZXNvbHV0aW9ufGNhaXJvX3N1cmZhY2Vfc2hvd19wYWdlfCcgKwogICAgICAgICdjYWlyb19zdXJmYWNlX3N0YXR1c3xjYWlyb19zdXJmYWNlX3dyaXRlX3RvX3BuZ3xjYWlyb19zdmdfc3VyZmFjZV9jcmVhdGV8Y2Fpcm9fc3ZnX3N1cmZhY2VfcmVzdHJpY3RfdG9fdmVyc2lvbnwnICsKICAgICAgICAnY2Fpcm9fc3ZnX3ZlcnNpb25fdG9fc3RyaW5nfGNhaXJvYW50aWFsaWFzfGNhaXJvY29udGVudHxjYWlyb2NvbnRleHR8Y2Fpcm9leGNlcHRpb258Y2Fpcm9leHRlbmR8Y2Fpcm9maWxscnVsZXxjYWlyb2ZpbHRlcnxjYWlyb2ZvbnRmYWNlfCcgKwogICAgICAgICdjYWlyb2ZvbnRvcHRpb25zfGNhaXJvZm9udHNsYW50fGNhaXJvZm9udHR5cGV8Y2Fpcm9mb250d2VpZ2h0fGNhaXJvZm9ybWF0fGNhaXJvZ3JhZGllbnRwYXR0ZXJufGNhaXJvaGludG1ldHJpY3N8Y2Fpcm9oaW50c3R5bGV8JyArCiAgICAgICAgJ2NhaXJvaW1hZ2VzdXJmYWNlfGNhaXJvbGluZWFyZ3JhZGllbnR8Y2Fpcm9saW5lY2FwfGNhaXJvbGluZWpvaW58Y2Fpcm9tYXRyaXh8Y2Fpcm9vcGVyYXRvcnxjYWlyb3BhdGh8Y2Fpcm9wYXR0ZXJufGNhaXJvcGF0dGVybnR5cGV8JyArCiAgICAgICAgJ2NhaXJvcGRmc3VyZmFjZXxjYWlyb3BzbGV2ZWx8Y2Fpcm9wc3N1cmZhY2V8Y2Fpcm9yYWRpYWxncmFkaWVudHxjYWlyb3NjYWxlZGZvbnR8Y2Fpcm9zb2xpZHBhdHRlcm58Y2Fpcm9zdGF0dXN8Y2Fpcm9zdWJwaXhlbG9yZGVyfCcgKwogICAgICAgICdjYWlyb3N1cmZhY2V8Y2Fpcm9zdXJmYWNlcGF0dGVybnxjYWlyb3N1cmZhY2V0eXBlfGNhaXJvc3Znc3VyZmFjZXxjYWlyb3N2Z3ZlcnNpb258Y2Fpcm90b3lmb250ZmFjZXxjYWxfZGF5c19pbl9tb250aHxjYWxfZnJvbV9qZHxjYWxfaW5mb3wnICsKICAgICAgICAnY2FsX3RvX2pkfGNhbGN1bF9obWFjfGNhbGN1bGhtYWN8Y2FsbF91c2VyX2Z1bmN8Y2FsbF91c2VyX2Z1bmNfYXJyYXl8Y2FsbF91c2VyX21ldGhvZHxjYWxsX3VzZXJfbWV0aG9kX2FycmF5fGNhbGxiYWNrZmlsdGVyaXRlcmF0b3J8Y2VpbHwnICsKICAgICAgICAnY2hkYnxjaGRiX2NyZWF0ZXxjaGRpcnxjaGVja2RhdGV8Y2hlY2tkbnNycnxjaGdycHxjaG1vZHxjaG9wfGNob3dufGNocnxjaHJvb3R8Y2h1bmtfc3BsaXR8Y2xhc3NfYWxpYXN8Y2xhc3NfZXhpc3RzfGNsYXNzX2ltcGxlbWVudHN8JyArCiAgICAgICAgJ2NsYXNzX3BhcmVudHN8Y2xhc3NraXRfaW1wb3J0fGNsYXNza2l0X21ldGhvZF9hZGR8Y2xhc3NraXRfbWV0aG9kX2NvcHl8Y2xhc3NraXRfbWV0aG9kX3JlZGVmaW5lfGNsYXNza2l0X21ldGhvZF9yZW1vdmV8JyArCiAgICAgICAgJ2NsYXNza2l0X21ldGhvZF9yZW5hbWV8Y2xlYXJzdGF0Y2FjaGV8Y2xvbmV8Y2xvc2VkaXJ8Y2xvc2Vsb2d8Y29sbGF0b3J8Y29tfGNvbV9hZGRyZWZ8Y29tX2NyZWF0ZV9ndWlkfGNvbV9ldmVudF9zaW5rfGNvbV9nZXR8JyArCiAgICAgICAgJ2NvbV9nZXRfYWN0aXZlX29iamVjdHxjb21faW52b2tlfGNvbV9pc2VudW18Y29tX2xvYWR8Y29tX2xvYWRfdHlwZWxpYnxjb21fbWVzc2FnZV9wdW1wfGNvbV9wcmludF90eXBlaW5mb3xjb21fcHJvcGdldHxjb21fcHJvcHB1dHwnICsKICAgICAgICAnY29tX3Byb3BzZXR8Y29tX3JlbGVhc2V8Y29tX3NldHxjb21wYWN0fGNvbm5lY3Rpb25fYWJvcnRlZHxjb25uZWN0aW9uX3N0YXR1c3xjb25uZWN0aW9uX3RpbWVvdXR8Y29uc3RhbnR8Y29uc3RydWN0fGNvbnN0cnVjdHxjb25zdHJ1Y3R8JyArCiAgICAgICAgJ2NvbnZlcnRfY3lyX3N0cmluZ3xjb252ZXJ0X3V1ZGVjb2RlfGNvbnZlcnRfdXVlbmNvZGV8Y29weXxjb3N8Y29zaHxjb3VudHxjb3VudF9jaGFyc3xjb3VudGFibGV8Y291bnRlcl9idW1wfGNvdW50ZXJfYnVtcF92YWx1ZXwnICsKICAgICAgICAnY291bnRlcl9jcmVhdGV8Y291bnRlcl9nZXR8Y291bnRlcl9nZXRfbWV0YXxjb3VudGVyX2dldF9uYW1lZHxjb3VudGVyX2dldF92YWx1ZXxjb3VudGVyX3Jlc2V0fGNvdW50ZXJfcmVzZXRfdmFsdWV8Y3JhY2tfY2hlY2t8JyArCiAgICAgICAgJ2NyYWNrX2Nsb3NlZGljdHxjcmFja19nZXRsYXN0bWVzc2FnZXxjcmFja19vcGVuZGljdHxjcmMzMnxjcmVhdGVfZnVuY3Rpb258Y3J5cHR8Y3R5cGVfYWxudW18Y3R5cGVfYWxwaGF8Y3R5cGVfY250cmx8Y3R5cGVfZGlnaXR8JyArCiAgICAgICAgJ2N0eXBlX2dyYXBofGN0eXBlX2xvd2VyfGN0eXBlX3ByaW50fGN0eXBlX3B1bmN0fGN0eXBlX3NwYWNlfGN0eXBlX3VwcGVyfGN0eXBlX3hkaWdpdHxjdWJyaWRfYWZmZWN0ZWRfcm93c3xjdWJyaWRfYmluZHwnICsKICAgICAgICAnY3VicmlkX2NsaWVudF9lbmNvZGluZ3xjdWJyaWRfY2xvc2V8Y3VicmlkX2Nsb3NlX3ByZXBhcmV8Y3VicmlkX2Nsb3NlX3JlcXVlc3R8Y3VicmlkX2NvbF9nZXR8Y3VicmlkX2NvbF9zaXplfGN1YnJpZF9jb2x1bW5fbmFtZXN8JyArCiAgICAgICAgJ2N1YnJpZF9jb2x1bW5fdHlwZXN8Y3VicmlkX2NvbW1pdHxjdWJyaWRfY29ubmVjdHxjdWJyaWRfY29ubmVjdF93aXRoX3VybHxjdWJyaWRfY3VycmVudF9vaWR8Y3VicmlkX2RhdGFfc2Vla3xjdWJyaWRfZGJfbmFtZXwnICsKICAgICAgICAnY3VicmlkX2Rpc2Nvbm5lY3R8Y3VicmlkX2Ryb3B8Y3VicmlkX2Vycm5vfGN1YnJpZF9lcnJvcnxjdWJyaWRfZXJyb3JfY29kZXxjdWJyaWRfZXJyb3JfY29kZV9mYWNpbGl0eXxjdWJyaWRfZXJyb3JfbXNnfGN1YnJpZF9leGVjdXRlfCcgKwogICAgICAgICdjdWJyaWRfZmV0Y2h8Y3VicmlkX2ZldGNoX2FycmF5fGN1YnJpZF9mZXRjaF9hc3NvY3xjdWJyaWRfZmV0Y2hfZmllbGR8Y3VicmlkX2ZldGNoX2xlbmd0aHN8Y3VicmlkX2ZldGNoX29iamVjdHxjdWJyaWRfZmV0Y2hfcm93fCcgKwogICAgICAgICdjdWJyaWRfZmllbGRfZmxhZ3N8Y3VicmlkX2ZpZWxkX2xlbnxjdWJyaWRfZmllbGRfbmFtZXxjdWJyaWRfZmllbGRfc2Vla3xjdWJyaWRfZmllbGRfdGFibGV8Y3VicmlkX2ZpZWxkX3R5cGV8Y3VicmlkX2ZyZWVfcmVzdWx0fCcgKwogICAgICAgICdjdWJyaWRfZ2V0fGN1YnJpZF9nZXRfYXV0b2NvbW1pdHxjdWJyaWRfZ2V0X2NoYXJzZXR8Y3VicmlkX2dldF9jbGFzc19uYW1lfGN1YnJpZF9nZXRfY2xpZW50X2luZm98Y3VicmlkX2dldF9kYl9wYXJhbWV0ZXJ8JyArCiAgICAgICAgJ2N1YnJpZF9nZXRfc2VydmVyX2luZm98Y3VicmlkX2luc2VydF9pZHxjdWJyaWRfaXNfaW5zdGFuY2V8Y3VicmlkX2xpc3RfZGJzfGN1YnJpZF9sb2FkX2Zyb21fZ2xvfGN1YnJpZF9sb2JfY2xvc2V8Y3VicmlkX2xvYl9leHBvcnR8JyArCiAgICAgICAgJ2N1YnJpZF9sb2JfZ2V0fGN1YnJpZF9sb2Jfc2VuZHxjdWJyaWRfbG9iX3NpemV8Y3VicmlkX2xvY2tfcmVhZHxjdWJyaWRfbG9ja193cml0ZXxjdWJyaWRfbW92ZV9jdXJzb3J8Y3VicmlkX25ld19nbG98Y3VicmlkX25leHRfcmVzdWx0fCcgKwogICAgICAgICdjdWJyaWRfbnVtX2NvbHN8Y3VicmlkX251bV9maWVsZHN8Y3VicmlkX251bV9yb3dzfGN1YnJpZF9waW5nfGN1YnJpZF9wcmVwYXJlfGN1YnJpZF9wdXR8Y3VicmlkX3F1ZXJ5fGN1YnJpZF9yZWFsX2VzY2FwZV9zdHJpbmd8JyArCiAgICAgICAgJ2N1YnJpZF9yZXN1bHR8Y3VicmlkX3JvbGxiYWNrfGN1YnJpZF9zYXZlX3RvX2dsb3xjdWJyaWRfc2NoZW1hfGN1YnJpZF9zZW5kX2dsb3xjdWJyaWRfc2VxX2Ryb3B8Y3VicmlkX3NlcV9pbnNlcnR8Y3VicmlkX3NlcV9wdXR8JyArCiAgICAgICAgJ2N1YnJpZF9zZXRfYWRkfGN1YnJpZF9zZXRfYXV0b2NvbW1pdHxjdWJyaWRfc2V0X2RiX3BhcmFtZXRlcnxjdWJyaWRfc2V0X2Ryb3B8Y3VicmlkX3VuYnVmZmVyZWRfcXVlcnl8Y3VicmlkX3ZlcnNpb258Y3VybF9jbG9zZXwnICsKICAgICAgICAnY3VybF9jb3B5X2hhbmRsZXxjdXJsX2Vycm5vfGN1cmxfZXJyb3J8Y3VybF9leGVjfGN1cmxfZ2V0aW5mb3xjdXJsX2luaXR8Y3VybF9tdWx0aV9hZGRfaGFuZGxlfGN1cmxfbXVsdGlfY2xvc2V8Y3VybF9tdWx0aV9leGVjfCcgKwogICAgICAgICdjdXJsX211bHRpX2dldGNvbnRlbnR8Y3VybF9tdWx0aV9pbmZvX3JlYWR8Y3VybF9tdWx0aV9pbml0fGN1cmxfbXVsdGlfcmVtb3ZlX2hhbmRsZXxjdXJsX211bHRpX3NlbGVjdHxjdXJsX3NldG9wdHxjdXJsX3NldG9wdF9hcnJheXwnICsKICAgICAgICAnY3VybF92ZXJzaW9ufGN1cnJlbnR8Y3lydXNfYXV0aGVudGljYXRlfGN5cnVzX2JpbmR8Y3lydXNfY2xvc2V8Y3lydXNfY29ubmVjdHxjeXJ1c19xdWVyeXxjeXJ1c191bmJpbmR8ZGF0ZXxkYXRlX2FkZHxkYXRlX2NyZWF0ZXwnICsKICAgICAgICAnZGF0ZV9jcmVhdGVfZnJvbV9mb3JtYXR8ZGF0ZV9kYXRlX3NldHxkYXRlX2RlZmF1bHRfdGltZXpvbmVfZ2V0fGRhdGVfZGVmYXVsdF90aW1lem9uZV9zZXR8ZGF0ZV9kaWZmfGRhdGVfZm9ybWF0fGRhdGVfZ2V0X2xhc3RfZXJyb3JzfCcgKwogICAgICAgICdkYXRlX2ludGVydmFsX2NyZWF0ZV9mcm9tX2RhdGVfc3RyaW5nfGRhdGVfaW50ZXJ2YWxfZm9ybWF0fGRhdGVfaXNvZGF0ZV9zZXR8ZGF0ZV9tb2RpZnl8ZGF0ZV9vZmZzZXRfZ2V0fGRhdGVfcGFyc2V8ZGF0ZV9wYXJzZV9mcm9tX2Zvcm1hdHwnICsKICAgICAgICAnZGF0ZV9zdWJ8ZGF0ZV9zdW5faW5mb3xkYXRlX3N1bnJpc2V8ZGF0ZV9zdW5zZXR8ZGF0ZV90aW1lX3NldHxkYXRlX3RpbWVzdGFtcF9nZXR8ZGF0ZV90aW1lc3RhbXBfc2V0fGRhdGVfdGltZXpvbmVfZ2V0fGRhdGVfdGltZXpvbmVfc2V0fCcgKwogICAgICAgICdkYXRlaW50ZXJ2YWx8ZGF0ZXBlcmlvZHxkYXRldGltZXxkYXRldGltZXpvbmV8ZGIyX2F1dG9jb21taXR8ZGIyX2JpbmRfcGFyYW18ZGIyX2NsaWVudF9pbmZvfGRiMl9jbG9zZXxkYjJfY29sdW1uX3ByaXZpbGVnZXN8ZGIyX2NvbHVtbnN8JyArCiAgICAgICAgJ2RiMl9jb21taXR8ZGIyX2Nvbm5fZXJyb3J8ZGIyX2Nvbm5fZXJyb3Jtc2d8ZGIyX2Nvbm5lY3R8ZGIyX2N1cnNvcl90eXBlfGRiMl9lc2NhcGVfc3RyaW5nfGRiMl9leGVjfGRiMl9leGVjdXRlfGRiMl9mZXRjaF9hcnJheXwnICsKICAgICAgICAnZGIyX2ZldGNoX2Fzc29jfGRiMl9mZXRjaF9ib3RofGRiMl9mZXRjaF9vYmplY3R8ZGIyX2ZldGNoX3Jvd3xkYjJfZmllbGRfZGlzcGxheV9zaXplfGRiMl9maWVsZF9uYW1lfGRiMl9maWVsZF9udW18ZGIyX2ZpZWxkX3ByZWNpc2lvbnwnICsKICAgICAgICAnZGIyX2ZpZWxkX3NjYWxlfGRiMl9maWVsZF90eXBlfGRiMl9maWVsZF93aWR0aHxkYjJfZm9yZWlnbl9rZXlzfGRiMl9mcmVlX3Jlc3VsdHxkYjJfZnJlZV9zdG10fGRiMl9nZXRfb3B0aW9ufGRiMl9sYXN0X2luc2VydF9pZHwnICsKICAgICAgICAnZGIyX2xvYl9yZWFkfGRiMl9uZXh0X3Jlc3VsdHxkYjJfbnVtX2ZpZWxkc3xkYjJfbnVtX3Jvd3N8ZGIyX3BjbG9zZXxkYjJfcGNvbm5lY3R8ZGIyX3ByZXBhcmV8ZGIyX3ByaW1hcnlfa2V5c3xkYjJfcHJvY2VkdXJlX2NvbHVtbnN8JyArCiAgICAgICAgJ2RiMl9wcm9jZWR1cmVzfGRiMl9yZXN1bHR8ZGIyX3JvbGxiYWNrfGRiMl9zZXJ2ZXJfaW5mb3xkYjJfc2V0X29wdGlvbnxkYjJfc3BlY2lhbF9jb2x1bW5zfGRiMl9zdGF0aXN0aWNzfGRiMl9zdG10X2Vycm9yfGRiMl9zdG10X2Vycm9ybXNnfCcgKwogICAgICAgICdkYjJfdGFibGVfcHJpdmlsZWdlc3xkYjJfdGFibGVzfGRiYV9jbG9zZXxkYmFfZGVsZXRlfGRiYV9leGlzdHN8ZGJhX2ZldGNofGRiYV9maXJzdGtleXxkYmFfaGFuZGxlcnN8ZGJhX2luc2VydHxkYmFfa2V5X3NwbGl0fGRiYV9saXN0fCcgKwogICAgICAgICdkYmFfbmV4dGtleXxkYmFfb3BlbnxkYmFfb3B0aW1pemV8ZGJhX3BvcGVufGRiYV9yZXBsYWNlfGRiYV9zeW5jfGRiYXNlX2FkZF9yZWNvcmR8ZGJhc2VfY2xvc2V8ZGJhc2VfY3JlYXRlfGRiYXNlX2RlbGV0ZV9yZWNvcmR8JyArCiAgICAgICAgJ2RiYXNlX2dldF9oZWFkZXJfaW5mb3xkYmFzZV9nZXRfcmVjb3JkfGRiYXNlX2dldF9yZWNvcmRfd2l0aF9uYW1lc3xkYmFzZV9udW1maWVsZHN8ZGJhc2VfbnVtcmVjb3Jkc3xkYmFzZV9vcGVufGRiYXNlX3BhY2t8JyArCiAgICAgICAgJ2RiYXNlX3JlcGxhY2VfcmVjb3JkfGRicGx1c19hZGR8ZGJwbHVzX2FxbHxkYnBsdXNfY2hkaXJ8ZGJwbHVzX2Nsb3NlfGRicGx1c19jdXJyfGRicGx1c19lcnJjb2RlfGRicGx1c19lcnJub3xkYnBsdXNfZmluZHxkYnBsdXNfZmlyc3R8JyArCiAgICAgICAgJ2RicGx1c19mbHVzaHxkYnBsdXNfZnJlZWFsbGxvY2tzfGRicGx1c19mcmVlbG9ja3xkYnBsdXNfZnJlZXJsb2Nrc3xkYnBsdXNfZ2V0bG9ja3xkYnBsdXNfZ2V0dW5pcXVlfGRicGx1c19pbmZvfGRicGx1c19sYXN0fGRicGx1c19sb2NrcmVsfCcgKwogICAgICAgICdkYnBsdXNfbmV4dHxkYnBsdXNfb3BlbnxkYnBsdXNfcHJldnxkYnBsdXNfcmNocGVybXxkYnBsdXNfcmNyZWF0ZXxkYnBsdXNfcmNydGV4YWN0fGRicGx1c19yY3J0bGlrZXxkYnBsdXNfcmVzb2x2ZXxkYnBsdXNfcmVzdG9yZXBvc3wnICsKICAgICAgICAnZGJwbHVzX3JrZXlzfGRicGx1c19yb3BlbnxkYnBsdXNfcnF1ZXJ5fGRicGx1c19ycmVuYW1lfGRicGx1c19yc2VjaW5kZXh8ZGJwbHVzX3J1bmxpbmt8ZGJwbHVzX3J6YXB8ZGJwbHVzX3NhdmVwb3N8ZGJwbHVzX3NldGluZGV4fCcgKwogICAgICAgICdkYnBsdXNfc2V0aW5kZXhieW51bWJlcnxkYnBsdXNfc3FsfGRicGx1c190Y2x8ZGJwbHVzX3RyZW1vdmV8ZGJwbHVzX3VuZG98ZGJwbHVzX3VuZG9wcmVwYXJlfGRicGx1c191bmxvY2tyZWx8ZGJwbHVzX3Vuc2VsZWN0fCcgKwogICAgICAgICdkYnBsdXNfdXBkYXRlfGRicGx1c194bG9ja3JlbHxkYnBsdXNfeHVubG9ja3JlbHxkYnhfY2xvc2V8ZGJ4X2NvbXBhcmV8ZGJ4X2Nvbm5lY3R8ZGJ4X2Vycm9yfGRieF9lc2NhcGVfc3RyaW5nfGRieF9mZXRjaF9yb3d8ZGJ4X3F1ZXJ5fCcgKwogICAgICAgICdkYnhfc29ydHxkY2dldHRleHR8ZGNuZ2V0dGV4dHxkZWFnZ3JlZ2F0ZXxkZWJ1Z19iYWNrdHJhY2V8ZGVidWdfcHJpbnRfYmFja3RyYWNlfGRlYnVnX3p2YWxfZHVtcHxkZWNiaW58ZGVjaGV4fGRlY29jdHxkZWZpbmV8JyArCiAgICAgICAgJ2RlZmluZV9zeXNsb2dfdmFyaWFibGVzfGRlZmluZWR8ZGVnMnJhZHxkZWxldGV8ZGdldHRleHR8ZGllfGRpb19jbG9zZXxkaW9fZmNudGx8ZGlvX29wZW58ZGlvX3JlYWR8ZGlvX3NlZWt8ZGlvX3N0YXR8ZGlvX3Rjc2V0YXR0cnwnICsKICAgICAgICAnZGlvX3RydW5jYXRlfGRpb193cml0ZXxkaXJ8ZGlyZWN0b3J5aXRlcmF0b3J8ZGlybmFtZXxkaXNrX2ZyZWVfc3BhY2V8ZGlza190b3RhbF9zcGFjZXxkaXNrZnJlZXNwYWNlfGRsfGRuZ2V0dGV4dHxkbnNfY2hlY2tfcmVjb3JkfCcgKwogICAgICAgICdkbnNfZ2V0X214fGRuc19nZXRfcmVjb3JkfGRvbV9pbXBvcnRfc2ltcGxleG1sfGRvbWFpbmV4Y2VwdGlvbnxkb21hdHRyfGRvbWF0dHJpYnV0ZV9uYW1lfGRvbWF0dHJpYnV0ZV9zZXRfdmFsdWV8ZG9tYXR0cmlidXRlX3NwZWNpZmllZHwnICsKICAgICAgICAnZG9tYXR0cmlidXRlX3ZhbHVlfGRvbWNoYXJhY3RlcmRhdGF8ZG9tY29tbWVudHxkb21kb2N1bWVudHxkb21kb2N1bWVudF9hZGRfcm9vdHxkb21kb2N1bWVudF9jcmVhdGVfYXR0cmlidXRlfCcgKwogICAgICAgICdkb21kb2N1bWVudF9jcmVhdGVfY2RhdGFfc2VjdGlvbnxkb21kb2N1bWVudF9jcmVhdGVfY29tbWVudHxkb21kb2N1bWVudF9jcmVhdGVfZWxlbWVudHxkb21kb2N1bWVudF9jcmVhdGVfZWxlbWVudF9uc3wnICsKICAgICAgICAnZG9tZG9jdW1lbnRfY3JlYXRlX2VudGl0eV9yZWZlcmVuY2V8ZG9tZG9jdW1lbnRfY3JlYXRlX3Byb2Nlc3NpbmdfaW5zdHJ1Y3Rpb258ZG9tZG9jdW1lbnRfY3JlYXRlX3RleHRfbm9kZXxkb21kb2N1bWVudF9kb2N0eXBlfCcgKwogICAgICAgICdkb21kb2N1bWVudF9kb2N1bWVudF9lbGVtZW50fGRvbWRvY3VtZW50X2R1bXBfZmlsZXxkb21kb2N1bWVudF9kdW1wX21lbXxkb21kb2N1bWVudF9nZXRfZWxlbWVudF9ieV9pZHxkb21kb2N1bWVudF9nZXRfZWxlbWVudHNfYnlfdGFnbmFtZXwnICsKICAgICAgICAnZG9tZG9jdW1lbnRfaHRtbF9kdW1wX21lbXxkb21kb2N1bWVudF94aW5jbHVkZXxkb21kb2N1bWVudGZyYWdtZW50fGRvbWRvY3VtZW50dHlwZXxkb21kb2N1bWVudHR5cGVfZW50aXRpZXN8JyArCiAgICAgICAgJ2RvbWRvY3VtZW50dHlwZV9pbnRlcm5hbF9zdWJzZXR8ZG9tZG9jdW1lbnR0eXBlX25hbWV8ZG9tZG9jdW1lbnR0eXBlX25vdGF0aW9uc3xkb21kb2N1bWVudHR5cGVfcHVibGljX2lkfGRvbWRvY3VtZW50dHlwZV9zeXN0ZW1faWR8JyArCiAgICAgICAgJ2RvbWVsZW1lbnR8ZG9tZWxlbWVudF9nZXRfYXR0cmlidXRlfGRvbWVsZW1lbnRfZ2V0X2F0dHJpYnV0ZV9ub2RlfGRvbWVsZW1lbnRfZ2V0X2VsZW1lbnRzX2J5X3RhZ25hbWV8ZG9tZWxlbWVudF9oYXNfYXR0cmlidXRlfCcgKwogICAgICAgICdkb21lbGVtZW50X3JlbW92ZV9hdHRyaWJ1dGV8ZG9tZWxlbWVudF9zZXRfYXR0cmlidXRlfGRvbWVsZW1lbnRfc2V0X2F0dHJpYnV0ZV9ub2RlfGRvbWVsZW1lbnRfdGFnbmFtZXxkb21lbnRpdHl8ZG9tZW50aXR5cmVmZXJlbmNlfCcgKwogICAgICAgICdkb21leGNlcHRpb258ZG9taW1wbGVtZW50YXRpb258ZG9tbmFtZWRub2RlbWFwfGRvbW5vZGV8ZG9tbm9kZV9hZGRfbmFtZXNwYWNlfGRvbW5vZGVfYXBwZW5kX2NoaWxkfGRvbW5vZGVfYXBwZW5kX3NpYmxpbmd8JyArCiAgICAgICAgJ2RvbW5vZGVfYXR0cmlidXRlc3xkb21ub2RlX2NoaWxkX25vZGVzfGRvbW5vZGVfY2xvbmVfbm9kZXxkb21ub2RlX2R1bXBfbm9kZXxkb21ub2RlX2ZpcnN0X2NoaWxkfGRvbW5vZGVfZ2V0X2NvbnRlbnR8JyArCiAgICAgICAgJ2RvbW5vZGVfaGFzX2F0dHJpYnV0ZXN8ZG9tbm9kZV9oYXNfY2hpbGRfbm9kZXN8ZG9tbm9kZV9pbnNlcnRfYmVmb3JlfGRvbW5vZGVfaXNfYmxhbmtfbm9kZXxkb21ub2RlX2xhc3RfY2hpbGR8ZG9tbm9kZV9uZXh0X3NpYmxpbmd8JyArCiAgICAgICAgJ2RvbW5vZGVfbm9kZV9uYW1lfGRvbW5vZGVfbm9kZV90eXBlfGRvbW5vZGVfbm9kZV92YWx1ZXxkb21ub2RlX293bmVyX2RvY3VtZW50fGRvbW5vZGVfcGFyZW50X25vZGV8ZG9tbm9kZV9wcmVmaXh8ZG9tbm9kZV9wcmV2aW91c19zaWJsaW5nfCcgKwogICAgICAgICdkb21ub2RlX3JlbW92ZV9jaGlsZHxkb21ub2RlX3JlcGxhY2VfY2hpbGR8ZG9tbm9kZV9yZXBsYWNlX25vZGV8ZG9tbm9kZV9zZXRfY29udGVudHxkb21ub2RlX3NldF9uYW1lfGRvbW5vZGVfc2V0X25hbWVzcGFjZXwnICsKICAgICAgICAnZG9tbm9kZV91bmxpbmtfbm9kZXxkb21ub2RlbGlzdHxkb21ub3RhdGlvbnxkb21wcm9jZXNzaW5naW5zdHJ1Y3Rpb258ZG9tcHJvY2Vzc2luZ2luc3RydWN0aW9uX2RhdGF8ZG9tcHJvY2Vzc2luZ2luc3RydWN0aW9uX3RhcmdldHwnICsKICAgICAgICAnZG9tdGV4dHxkb214bWxfbmV3X2RvY3xkb214bWxfb3Blbl9maWxlfGRvbXhtbF9vcGVuX21lbXxkb214bWxfdmVyc2lvbnxkb214bWxfeG1sdHJlZXxkb214bWxfeHNsdF9zdHlsZXNoZWV0fGRvbXhtbF94c2x0X3N0eWxlc2hlZXRfZG9jfCcgKwogICAgICAgICdkb214bWxfeHNsdF9zdHlsZXNoZWV0X2ZpbGV8ZG9teG1sX3hzbHRfdmVyc2lvbnxkb214cGF0aHxkb214c2x0c3R5bGVzaGVldF9wcm9jZXNzfGRvbXhzbHRzdHlsZXNoZWV0X3Jlc3VsdF9kdW1wX2ZpbGV8JyArCiAgICAgICAgJ2RvbXhzbHRzdHlsZXNoZWV0X3Jlc3VsdF9kdW1wX21lbXxkb3RuZXR8ZG90bmV0X2xvYWR8ZG91YmxldmFsfGVhY2h8ZWFzdGVyX2RhdGV8ZWFzdGVyX2RheXN8ZWNob3xlbXB0eXxlbXB0eWl0ZXJhdG9yfCcgKwogICAgICAgICdlbmNoYW50X2Jyb2tlcl9kZXNjcmliZXxlbmNoYW50X2Jyb2tlcl9kaWN0X2V4aXN0c3xlbmNoYW50X2Jyb2tlcl9mcmVlfGVuY2hhbnRfYnJva2VyX2ZyZWVfZGljdHxlbmNoYW50X2Jyb2tlcl9nZXRfZXJyb3J8JyArCiAgICAgICAgJ2VuY2hhbnRfYnJva2VyX2luaXR8ZW5jaGFudF9icm9rZXJfbGlzdF9kaWN0c3xlbmNoYW50X2Jyb2tlcl9yZXF1ZXN0X2RpY3R8ZW5jaGFudF9icm9rZXJfcmVxdWVzdF9wd2xfZGljdHxlbmNoYW50X2Jyb2tlcl9zZXRfb3JkZXJpbmd8JyArCiAgICAgICAgJ2VuY2hhbnRfZGljdF9hZGRfdG9fcGVyc29uYWx8ZW5jaGFudF9kaWN0X2FkZF90b19zZXNzaW9ufGVuY2hhbnRfZGljdF9jaGVja3xlbmNoYW50X2RpY3RfZGVzY3JpYmV8ZW5jaGFudF9kaWN0X2dldF9lcnJvcnwnICsKICAgICAgICAnZW5jaGFudF9kaWN0X2lzX2luX3Nlc3Npb258ZW5jaGFudF9kaWN0X3F1aWNrX2NoZWNrfGVuY2hhbnRfZGljdF9zdG9yZV9yZXBsYWNlbWVudHxlbmNoYW50X2RpY3Rfc3VnZ2VzdHxlbmR8ZXJlZ3xlcmVnX3JlcGxhY2V8ZXJlZ2l8JyArCiAgICAgICAgJ2VyZWdpX3JlcGxhY2V8ZXJyb3JfZ2V0X2xhc3R8ZXJyb3JfbG9nfGVycm9yX3JlcG9ydGluZ3xlcnJvcmV4Y2VwdGlvbnxlc2NhcGVzaGVsbGFyZ3xlc2NhcGVzaGVsbGNtZHxldmFsfGV2ZW50X2FkZHxldmVudF9iYXNlX2ZyZWV8JyArCiAgICAgICAgJ2V2ZW50X2Jhc2VfbG9vcHxldmVudF9iYXNlX2xvb3BicmVha3xldmVudF9iYXNlX2xvb3BleGl0fGV2ZW50X2Jhc2VfbmV3fGV2ZW50X2Jhc2VfcHJpb3JpdHlfaW5pdHxldmVudF9iYXNlX3NldHxldmVudF9idWZmZXJfYmFzZV9zZXR8JyArCiAgICAgICAgJ2V2ZW50X2J1ZmZlcl9kaXNhYmxlfGV2ZW50X2J1ZmZlcl9lbmFibGV8ZXZlbnRfYnVmZmVyX2ZkX3NldHxldmVudF9idWZmZXJfZnJlZXxldmVudF9idWZmZXJfbmV3fGV2ZW50X2J1ZmZlcl9wcmlvcml0eV9zZXR8JyArCiAgICAgICAgJ2V2ZW50X2J1ZmZlcl9yZWFkfGV2ZW50X2J1ZmZlcl9zZXRfY2FsbGJhY2t8ZXZlbnRfYnVmZmVyX3RpbWVvdXRfc2V0fGV2ZW50X2J1ZmZlcl93YXRlcm1hcmtfc2V0fGV2ZW50X2J1ZmZlcl93cml0ZXxldmVudF9kZWx8ZXZlbnRfZnJlZXwnICsKICAgICAgICAnZXZlbnRfbmV3fGV2ZW50X3NldHxleGNlcHRpb258ZXhlY3xleGlmX2ltYWdldHlwZXxleGlmX3JlYWRfZGF0YXxleGlmX3RhZ25hbWV8ZXhpZl90aHVtYm5haWx8ZXhpdHxleHB8ZXhwZWN0X2V4cGVjdGx8ZXhwZWN0X3BvcGVufGV4cGxvZGV8JyArCiAgICAgICAgJ2V4cG0xfGV4cG9ydHxleHBvcnR8ZXh0ZW5zaW9uX2xvYWRlZHxleHRyYWN0fGV6bWxtX2hhc2h8ZmFtX2NhbmNlbF9tb25pdG9yfGZhbV9jbG9zZXxmYW1fbW9uaXRvcl9jb2xsZWN0aW9ufGZhbV9tb25pdG9yX2RpcmVjdG9yeXwnICsKICAgICAgICAnZmFtX21vbml0b3JfZmlsZXxmYW1fbmV4dF9ldmVudHxmYW1fb3BlbnxmYW1fcGVuZGluZ3xmYW1fcmVzdW1lX21vbml0b3J8ZmFtX3N1c3BlbmRfbW9uaXRvcnxmYnNxbF9hZmZlY3RlZF9yb3dzfGZic3FsX2F1dG9jb21taXR8JyArCiAgICAgICAgJ2Zic3FsX2Jsb2Jfc2l6ZXxmYnNxbF9jaGFuZ2VfdXNlcnxmYnNxbF9jbG9iX3NpemV8ZmJzcWxfY2xvc2V8ZmJzcWxfY29tbWl0fGZic3FsX2Nvbm5lY3R8ZmJzcWxfY3JlYXRlX2Jsb2J8ZmJzcWxfY3JlYXRlX2Nsb2J8JyArCiAgICAgICAgJ2Zic3FsX2NyZWF0ZV9kYnxmYnNxbF9kYXRhX3NlZWt8ZmJzcWxfZGF0YWJhc2V8ZmJzcWxfZGF0YWJhc2VfcGFzc3dvcmR8ZmJzcWxfZGJfcXVlcnl8ZmJzcWxfZGJfc3RhdHVzfGZic3FsX2Ryb3BfZGJ8ZmJzcWxfZXJybm98JyArCiAgICAgICAgJ2Zic3FsX2Vycm9yfGZic3FsX2ZldGNoX2FycmF5fGZic3FsX2ZldGNoX2Fzc29jfGZic3FsX2ZldGNoX2ZpZWxkfGZic3FsX2ZldGNoX2xlbmd0aHN8ZmJzcWxfZmV0Y2hfb2JqZWN0fGZic3FsX2ZldGNoX3Jvd3wnICsKICAgICAgICAnZmJzcWxfZmllbGRfZmxhZ3N8ZmJzcWxfZmllbGRfbGVufGZic3FsX2ZpZWxkX25hbWV8ZmJzcWxfZmllbGRfc2Vla3xmYnNxbF9maWVsZF90YWJsZXxmYnNxbF9maWVsZF90eXBlfGZic3FsX2ZyZWVfcmVzdWx0fCcgKwogICAgICAgICdmYnNxbF9nZXRfYXV0b3N0YXJ0X2luZm98ZmJzcWxfaG9zdG5hbWV8ZmJzcWxfaW5zZXJ0X2lkfGZic3FsX2xpc3RfZGJzfGZic3FsX2xpc3RfZmllbGRzfGZic3FsX2xpc3RfdGFibGVzfGZic3FsX25leHRfcmVzdWx0fCcgKwogICAgICAgICdmYnNxbF9udW1fZmllbGRzfGZic3FsX251bV9yb3dzfGZic3FsX3Bhc3N3b3JkfGZic3FsX3Bjb25uZWN0fGZic3FsX3F1ZXJ5fGZic3FsX3JlYWRfYmxvYnxmYnNxbF9yZWFkX2Nsb2J8ZmJzcWxfcmVzdWx0fGZic3FsX3JvbGxiYWNrfCcgKwogICAgICAgICdmYnNxbF9yb3dzX2ZldGNoZWR8ZmJzcWxfc2VsZWN0X2RifGZic3FsX3NldF9jaGFyYWN0ZXJzZXR8ZmJzcWxfc2V0X2xvYl9tb2RlfGZic3FsX3NldF9wYXNzd29yZHxmYnNxbF9zZXRfdHJhbnNhY3Rpb258ZmJzcWxfc3RhcnRfZGJ8JyArCiAgICAgICAgJ2Zic3FsX3N0b3BfZGJ8ZmJzcWxfdGFibGVfbmFtZXxmYnNxbF90YWJsZW5hbWV8ZmJzcWxfdXNlcm5hbWV8ZmJzcWxfd2FybmluZ3N8ZmNsb3NlfGZkZl9hZGRfZG9jX2phdmFzY3JpcHR8ZmRmX2FkZF90ZW1wbGF0ZXxmZGZfY2xvc2V8JyArCiAgICAgICAgJ2ZkZl9jcmVhdGV8ZmRmX2VudW1fdmFsdWVzfGZkZl9lcnJub3xmZGZfZXJyb3J8ZmRmX2dldF9hcHxmZGZfZ2V0X2F0dGFjaG1lbnR8ZmRmX2dldF9lbmNvZGluZ3xmZGZfZ2V0X2ZpbGV8ZmRmX2dldF9mbGFnc3xmZGZfZ2V0X29wdHwnICsKICAgICAgICAnZmRmX2dldF9zdGF0dXN8ZmRmX2dldF92YWx1ZXxmZGZfZ2V0X3ZlcnNpb258ZmRmX2hlYWRlcnxmZGZfbmV4dF9maWVsZF9uYW1lfGZkZl9vcGVufGZkZl9vcGVuX3N0cmluZ3xmZGZfcmVtb3ZlX2l0ZW18ZmRmX3NhdmV8JyArCiAgICAgICAgJ2ZkZl9zYXZlX3N0cmluZ3xmZGZfc2V0X2FwfGZkZl9zZXRfZW5jb2Rpbmd8ZmRmX3NldF9maWxlfGZkZl9zZXRfZmxhZ3N8ZmRmX3NldF9qYXZhc2NyaXB0X2FjdGlvbnxmZGZfc2V0X29uX2ltcG9ydF9qYXZhc2NyaXB0fGZkZl9zZXRfb3B0fCcgKwogICAgICAgICdmZGZfc2V0X3N0YXR1c3xmZGZfc2V0X3N1Ym1pdF9mb3JtX2FjdGlvbnxmZGZfc2V0X3RhcmdldF9mcmFtZXxmZGZfc2V0X3ZhbHVlfGZkZl9zZXRfdmVyc2lvbnxmZW9mfGZmbHVzaHxmZ2V0Y3xmZ2V0Y3N2fGZnZXRzfGZnZXRzc3xmaWxlfCcgKwogICAgICAgICdmaWxlX2V4aXN0c3xmaWxlX2dldF9jb250ZW50c3xmaWxlX3B1dF9jb250ZW50c3xmaWxlYXRpbWV8ZmlsZWN0aW1lfGZpbGVncm91cHxmaWxlaW5vZGV8ZmlsZW10aW1lfGZpbGVvd25lcnxmaWxlcGVybXN8ZmlsZXByb3wnICsKICAgICAgICAnZmlsZXByb19maWVsZGNvdW50fGZpbGVwcm9fZmllbGRuYW1lfGZpbGVwcm9fZmllbGR0eXBlfGZpbGVwcm9fZmllbGR3aWR0aHxmaWxlcHJvX3JldHJpZXZlfGZpbGVwcm9fcm93Y291bnR8ZmlsZXNpemV8ZmlsZXN5c3RlbWl0ZXJhdG9yfCcgKwogICAgICAgICdmaWxldHlwZXxmaWx0ZXJfaGFzX3ZhcnxmaWx0ZXJfaWR8ZmlsdGVyX2lucHV0fGZpbHRlcl9pbnB1dF9hcnJheXxmaWx0ZXJfbGlzdHxmaWx0ZXJfdmFyfGZpbHRlcl92YXJfYXJyYXl8ZmlsdGVyaXRlcmF0b3J8ZmluZm9fYnVmZmVyfCcgKwogICAgICAgICdmaW5mb19jbG9zZXxmaW5mb19maWxlfGZpbmZvX29wZW58ZmluZm9fc2V0X2ZsYWdzfGZsb2F0dmFsfGZsb2NrfGZsb29yfGZsdXNofGZtb2R8Zm5tYXRjaHxmb3Blbnxmb3J3YXJkX3N0YXRpY19jYWxsfCcgKwogICAgICAgICdmb3J3YXJkX3N0YXRpY19jYWxsX2FycmF5fGZwYXNzdGhydXxmcHJpbnRmfGZwdXRjc3Z8ZnB1dHN8ZnJlYWR8ZnJlbmNodG9qZHxmcmliaWRpX2xvZzJ2aXN8ZnNjYW5mfGZzZWVrfGZzb2Nrb3Blbnxmc3RhdHxmdGVsbHxmdG9rfCcgKwogICAgICAgICdmdHBfYWxsb2N8ZnRwX2NkdXB8ZnRwX2NoZGlyfGZ0cF9jaG1vZHxmdHBfY2xvc2V8ZnRwX2Nvbm5lY3R8ZnRwX2RlbGV0ZXxmdHBfZXhlY3xmdHBfZmdldHxmdHBfZnB1dHxmdHBfZ2V0fGZ0cF9nZXRfb3B0aW9ufGZ0cF9sb2dpbnwnICsKICAgICAgICAnZnRwX21kdG18ZnRwX21rZGlyfGZ0cF9uYl9jb250aW51ZXxmdHBfbmJfZmdldHxmdHBfbmJfZnB1dHxmdHBfbmJfZ2V0fGZ0cF9uYl9wdXR8ZnRwX25saXN0fGZ0cF9wYXN2fGZ0cF9wdXR8ZnRwX3B3ZHxmdHBfcXVpdHxmdHBfcmF3fCcgKwogICAgICAgICdmdHBfcmF3bGlzdHxmdHBfcmVuYW1lfGZ0cF9ybWRpcnxmdHBfc2V0X29wdGlvbnxmdHBfc2l0ZXxmdHBfc2l6ZXxmdHBfc3NsX2Nvbm5lY3R8ZnRwX3N5c3R5cGV8ZnRydW5jYXRlfGZ1bmNfZ2V0X2FyZ3xmdW5jX2dldF9hcmdzfCcgKwogICAgICAgICdmdW5jX251bV9hcmdzfGZ1bmN0aW9uX2V4aXN0c3xmd3JpdGV8Z2NfY29sbGVjdF9jeWNsZXN8Z2NfZGlzYWJsZXxnY19lbmFibGV8Z2NfZW5hYmxlZHxnZF9pbmZvfGdlYXJtYW5jbGllbnR8Z2Vhcm1hbmpvYnxnZWFybWFudGFza3wnICsKICAgICAgICAnZ2Vhcm1hbndvcmtlcnxnZW9pcF9jb250aW5lbnRfY29kZV9ieV9uYW1lfGdlb2lwX2NvdW50cnlfY29kZTNfYnlfbmFtZXxnZW9pcF9jb3VudHJ5X2NvZGVfYnlfbmFtZXxnZW9pcF9jb3VudHJ5X25hbWVfYnlfbmFtZXwnICsKICAgICAgICAnZ2VvaXBfZGF0YWJhc2VfaW5mb3xnZW9pcF9kYl9hdmFpbHxnZW9pcF9kYl9maWxlbmFtZXxnZW9pcF9kYl9nZXRfYWxsX2luZm98Z2VvaXBfaWRfYnlfbmFtZXxnZW9pcF9pc3BfYnlfbmFtZXxnZW9pcF9vcmdfYnlfbmFtZXwnICsKICAgICAgICAnZ2VvaXBfcmVjb3JkX2J5X25hbWV8Z2VvaXBfcmVnaW9uX2J5X25hbWV8Z2VvaXBfcmVnaW9uX25hbWVfYnlfY29kZXxnZW9pcF90aW1lX3pvbmVfYnlfY291bnRyeV9hbmRfcmVnaW9ufGdldE1ldGF8Z2V0TmFtZWR8Z2V0VmFsdWV8JyArCiAgICAgICAgJ2dldF9icm93c2VyfGdldF9jYWxsZWRfY2xhc3N8Z2V0X2NmZ192YXJ8Z2V0X2NsYXNzfGdldF9jbGFzc19tZXRob2RzfGdldF9jbGFzc192YXJzfGdldF9jdXJyZW50X3VzZXJ8Z2V0X2RlY2xhcmVkX2NsYXNzZXN8JyArCiAgICAgICAgJ2dldF9kZWNsYXJlZF9pbnRlcmZhY2VzfGdldF9kZWZpbmVkX2NvbnN0YW50c3xnZXRfZGVmaW5lZF9mdW5jdGlvbnN8Z2V0X2RlZmluZWRfdmFyc3xnZXRfZXh0ZW5zaW9uX2Z1bmNzfGdldF9oZWFkZXJzfCcgKwogICAgICAgICdnZXRfaHRtbF90cmFuc2xhdGlvbl90YWJsZXxnZXRfaW5jbHVkZV9wYXRofGdldF9pbmNsdWRlZF9maWxlc3xnZXRfbG9hZGVkX2V4dGVuc2lvbnN8Z2V0X21hZ2ljX3F1b3Rlc19ncGN8Z2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lfCcgKwogICAgICAgICdnZXRfbWV0YV90YWdzfGdldF9vYmplY3RfdmFyc3xnZXRfcGFyZW50X2NsYXNzfGdldF9yZXF1aXJlZF9maWxlc3xnZXRfcmVzb3VyY2VfdHlwZXxnZXRhbGxoZWFkZXJzfGdldGNvbnN0YW50fGdldGNvbnN0YW50c3xnZXRjb25zdHJ1Y3RvcnwnICsKICAgICAgICAnZ2V0Y3dkfGdldGRhdGV8Z2V0ZGVmYXVsdHByb3BlcnRpZXN8Z2V0ZG9jY29tbWVudHxnZXRlbmRsaW5lfGdldGVudnxnZXRleHRlbnNpb258Z2V0ZXh0ZW5zaW9ubmFtZXxnZXRmaWxlbmFtZXxnZXRob3N0YnlhZGRyfGdldGhvc3RieW5hbWV8JyArCiAgICAgICAgJ2dldGhvc3RieW5hbWVsfGdldGhvc3RuYW1lfGdldGltYWdlc2l6ZXxnZXRpbnRlcmZhY2VuYW1lc3xnZXRpbnRlcmZhY2VzfGdldGxhc3Rtb2R8Z2V0bWV0aG9kfGdldG1ldGhvZHN8Z2V0bW9kaWZpZXJzfGdldG14cnJ8Z2V0bXlnaWR8JyArCiAgICAgICAgJ2dldG15aW5vZGV8Z2V0bXlwaWR8Z2V0bXl1aWR8Z2V0bmFtZXxnZXRuYW1lc3BhY2VuYW1lfGdldG9wdHxnZXRwYXJlbnRjbGFzc3xnZXRwcm9wZXJ0aWVzfGdldHByb3BlcnR5fGdldHByb3RvYnluYW1lfGdldHByb3RvYnludW1iZXJ8JyArCiAgICAgICAgJ2dldHJhbmRtYXh8Z2V0cnVzYWdlfGdldHNlcnZieW5hbWV8Z2V0c2VydmJ5cG9ydHxnZXRzaG9ydG5hbWV8Z2V0c3RhcnRsaW5lfGdldHN0YXRpY3Byb3BlcnRpZXN8Z2V0c3RhdGljcHJvcGVydHl2YWx1ZXxnZXR0ZXh0fCcgKwogICAgICAgICdnZXR0aW1lb2ZkYXl8Z2V0dHlwZXxnbG9ifGdsb2JpdGVyYXRvcnxnbWFnaWNrfGdtYWdpY2tkcmF3fGdtYWdpY2twaXhlbHxnbWRhdGV8Z21ta3RpbWV8Z21wX2Fic3xnbXBfYWRkfGdtcF9hbmR8Z21wX2NscmJpdHxnbXBfY21wfCcgKwogICAgICAgICdnbXBfY29tfGdtcF9kaXZ8Z21wX2Rpdl9xfGdtcF9kaXZfcXJ8Z21wX2Rpdl9yfGdtcF9kaXZleGFjdHxnbXBfZmFjdHxnbXBfZ2NkfGdtcF9nY2RleHR8Z21wX2hhbWRpc3R8Z21wX2luaXR8Z21wX2ludHZhbHxnbXBfaW52ZXJ0fCcgKwogICAgICAgICdnbXBfamFjb2JpfGdtcF9sZWdlbmRyZXxnbXBfbW9kfGdtcF9tdWx8Z21wX25lZ3xnbXBfbmV4dHByaW1lfGdtcF9vcnxnbXBfcGVyZmVjdF9zcXVhcmV8Z21wX3BvcGNvdW50fGdtcF9wb3d8Z21wX3Bvd218Z21wX3Byb2JfcHJpbWV8JyArCiAgICAgICAgJ2dtcF9yYW5kb218Z21wX3NjYW4wfGdtcF9zY2FuMXxnbXBfc2V0Yml0fGdtcF9zaWdufGdtcF9zcXJ0fGdtcF9zcXJ0cmVtfGdtcF9zdHJ2YWx8Z21wX3N1YnxnbXBfdGVzdGJpdHxnbXBfeG9yfGdtc3RyZnRpbWV8JyArCiAgICAgICAgJ2dudXBnX2FkZGRlY3J5cHRrZXl8Z251cGdfYWRkZW5jcnlwdGtleXxnbnVwZ19hZGRzaWdua2V5fGdudXBnX2NsZWFyZGVjcnlwdGtleXN8Z251cGdfY2xlYXJlbmNyeXB0a2V5c3xnbnVwZ19jbGVhcnNpZ25rZXlzfGdudXBnX2RlY3J5cHR8JyArCiAgICAgICAgJ2dudXBnX2RlY3J5cHR2ZXJpZnl8Z251cGdfZW5jcnlwdHxnbnVwZ19lbmNyeXB0c2lnbnxnbnVwZ19leHBvcnR8Z251cGdfZ2V0ZXJyb3J8Z251cGdfZ2V0cHJvdG9jb2x8Z251cGdfaW1wb3J0fGdudXBnX2luaXR8Z251cGdfa2V5aW5mb3wnICsKICAgICAgICAnZ251cGdfc2V0YXJtb3J8Z251cGdfc2V0ZXJyb3Jtb2RlfGdudXBnX3NldHNpZ25tb2RlfGdudXBnX3NpZ258Z251cGdfdmVyaWZ5fGdvcGhlcl9wYXJzZWRpcnxncmFwaGVtZV9leHRyYWN0fGdyYXBoZW1lX3N0cmlwb3N8JyArCiAgICAgICAgJ2dyYXBoZW1lX3N0cmlzdHJ8Z3JhcGhlbWVfc3RybGVufGdyYXBoZW1lX3N0cnBvc3xncmFwaGVtZV9zdHJyaXBvc3xncmFwaGVtZV9zdHJycG9zfGdyYXBoZW1lX3N0cnN0cnxncmFwaGVtZV9zdWJzdHJ8Z3JlZ29yaWFudG9qZHwnICsKICAgICAgICAnZ3VwbnBfY29udGV4dF9nZXRfaG9zdF9pcHxndXBucF9jb250ZXh0X2dldF9wb3J0fGd1cG5wX2NvbnRleHRfZ2V0X3N1YnNjcmlwdGlvbl90aW1lb3V0fGd1cG5wX2NvbnRleHRfaG9zdF9wYXRofGd1cG5wX2NvbnRleHRfbmV3fCcgKwogICAgICAgICdndXBucF9jb250ZXh0X3NldF9zdWJzY3JpcHRpb25fdGltZW91dHxndXBucF9jb250ZXh0X3RpbWVvdXRfYWRkfGd1cG5wX2NvbnRleHRfdW5ob3N0X3BhdGh8Z3VwbnBfY29udHJvbF9wb2ludF9icm93c2Vfc3RhcnR8JyArCiAgICAgICAgJ2d1cG5wX2NvbnRyb2xfcG9pbnRfYnJvd3NlX3N0b3B8Z3VwbnBfY29udHJvbF9wb2ludF9jYWxsYmFja19zZXR8Z3VwbnBfY29udHJvbF9wb2ludF9uZXd8Z3VwbnBfZGV2aWNlX2FjdGlvbl9jYWxsYmFja19zZXR8JyArCiAgICAgICAgJ2d1cG5wX2RldmljZV9pbmZvX2dldHxndXBucF9kZXZpY2VfaW5mb19nZXRfc2VydmljZXxndXBucF9yb290X2RldmljZV9nZXRfYXZhaWxhYmxlfGd1cG5wX3Jvb3RfZGV2aWNlX2dldF9yZWxhdGl2ZV9sb2NhdGlvbnwnICsKICAgICAgICAnZ3VwbnBfcm9vdF9kZXZpY2VfbmV3fGd1cG5wX3Jvb3RfZGV2aWNlX3NldF9hdmFpbGFibGV8Z3VwbnBfcm9vdF9kZXZpY2Vfc3RhcnR8Z3VwbnBfcm9vdF9kZXZpY2Vfc3RvcHxndXBucF9zZXJ2aWNlX2FjdGlvbl9nZXR8JyArCiAgICAgICAgJ2d1cG5wX3NlcnZpY2VfYWN0aW9uX3JldHVybnxndXBucF9zZXJ2aWNlX2FjdGlvbl9yZXR1cm5fZXJyb3J8Z3VwbnBfc2VydmljZV9hY3Rpb25fc2V0fGd1cG5wX3NlcnZpY2VfZnJlZXplX25vdGlmeXxndXBucF9zZXJ2aWNlX2luZm9fZ2V0fCcgKwogICAgICAgICdndXBucF9zZXJ2aWNlX2luZm9fZ2V0X2ludHJvc3BlY3Rpb258Z3VwbnBfc2VydmljZV9pbnRyb3NwZWN0aW9uX2dldF9zdGF0ZV92YXJpYWJsZXxndXBucF9zZXJ2aWNlX25vdGlmeXxndXBucF9zZXJ2aWNlX3Byb3h5X2FjdGlvbl9nZXR8JyArCiAgICAgICAgJ2d1cG5wX3NlcnZpY2VfcHJveHlfYWN0aW9uX3NldHxndXBucF9zZXJ2aWNlX3Byb3h5X2FkZF9ub3RpZnl8Z3VwbnBfc2VydmljZV9wcm94eV9jYWxsYmFja19zZXR8Z3VwbnBfc2VydmljZV9wcm94eV9nZXRfc3Vic2NyaWJlZHwnICsKICAgICAgICAnZ3VwbnBfc2VydmljZV9wcm94eV9yZW1vdmVfbm90aWZ5fGd1cG5wX3NlcnZpY2VfcHJveHlfc2V0X3N1YnNjcmliZWR8Z3VwbnBfc2VydmljZV90aGF3X25vdGlmeXxnemNsb3NlfGd6Y29tcHJlc3N8Z3pkZWNvZGV8Z3pkZWZsYXRlfCcgKwogICAgICAgICdnemVuY29kZXxnemVvZnxnemZpbGV8Z3pnZXRjfGd6Z2V0c3xnemdldHNzfGd6aW5mbGF0ZXxnem9wZW58Z3pwYXNzdGhydXxnenB1dHN8Z3pyZWFkfGd6cmV3aW5kfGd6c2Vla3xnenRlbGx8Z3p1bmNvbXByZXNzfGd6d3JpdGV8JyArCiAgICAgICAgJ2hhbHRfY29tcGlsZXJ8aGFydWFubm90YXRpb258aGFydWFubm90YXRpb25fc2V0Ym9yZGVyc3R5bGV8aGFydWFubm90YXRpb25fc2V0aGlnaGxpZ2h0bW9kZXxoYXJ1YW5ub3RhdGlvbl9zZXRpY29ufCcgKwogICAgICAgICdoYXJ1YW5ub3RhdGlvbl9zZXRvcGVuZWR8aGFydWRlc3RpbmF0aW9ufGhhcnVkZXN0aW5hdGlvbl9zZXRmaXR8aGFydWRlc3RpbmF0aW9uX3NldGZpdGJ8aGFydWRlc3RpbmF0aW9uX3NldGZpdGJofGhhcnVkZXN0aW5hdGlvbl9zZXRmaXRidnwnICsKICAgICAgICAnaGFydWRlc3RpbmF0aW9uX3NldGZpdGh8aGFydWRlc3RpbmF0aW9uX3NldGZpdHJ8aGFydWRlc3RpbmF0aW9uX3NldGZpdHZ8aGFydWRlc3RpbmF0aW9uX3NldHh5enxoYXJ1ZG9jfGhhcnVkb2NfYWRkcGFnZXwnICsKICAgICAgICAnaGFydWRvY19hZGRwYWdlbGFiZWx8aGFydWRvY19jb25zdHJ1Y3R8aGFydWRvY19jcmVhdGVvdXRsaW5lfGhhcnVkb2NfZ2V0Y3VycmVudGVuY29kZXJ8aGFydWRvY19nZXRjdXJyZW50cGFnZXxoYXJ1ZG9jX2dldGVuY29kZXJ8JyArCiAgICAgICAgJ2hhcnVkb2NfZ2V0Zm9udHxoYXJ1ZG9jX2dldGluZm9hdHRyfGhhcnVkb2NfZ2V0cGFnZWxheW91dHxoYXJ1ZG9jX2dldHBhZ2Vtb2RlfGhhcnVkb2NfZ2V0c3RyZWFtc2l6ZXxoYXJ1ZG9jX2luc2VydHBhZ2V8aGFydWRvY19sb2FkanBlZ3wnICsKICAgICAgICAnaGFydWRvY19sb2FkcG5nfGhhcnVkb2NfbG9hZHJhd3xoYXJ1ZG9jX2xvYWR0dGN8aGFydWRvY19sb2FkdHRmfGhhcnVkb2NfbG9hZHR5cGUxfGhhcnVkb2Nfb3V0cHV0fGhhcnVkb2NfcmVhZGZyb21zdHJlYW18JyArCiAgICAgICAgJ2hhcnVkb2NfcmVzZXRlcnJvcnxoYXJ1ZG9jX3Jlc2V0c3RyZWFtfGhhcnVkb2Nfc2F2ZXxoYXJ1ZG9jX3NhdmV0b3N0cmVhbXxoYXJ1ZG9jX3NldGNvbXByZXNzaW9ubW9kZXxoYXJ1ZG9jX3NldGN1cnJlbnRlbmNvZGVyfCcgKwogICAgICAgICdoYXJ1ZG9jX3NldGVuY3J5cHRpb25tb2RlfGhhcnVkb2Nfc2V0aW5mb2F0dHJ8aGFydWRvY19zZXRpbmZvZGF0ZWF0dHJ8aGFydWRvY19zZXRvcGVuYWN0aW9ufGhhcnVkb2Nfc2V0cGFnZWxheW91dHxoYXJ1ZG9jX3NldHBhZ2Vtb2RlfCcgKwogICAgICAgICdoYXJ1ZG9jX3NldHBhZ2VzY29uZmlndXJhdGlvbnxoYXJ1ZG9jX3NldHBhc3N3b3JkfGhhcnVkb2Nfc2V0cGVybWlzc2lvbnxoYXJ1ZG9jX3VzZWNuc2VuY29kaW5nc3xoYXJ1ZG9jX3VzZWNuc2ZvbnRzfCcgKwogICAgICAgICdoYXJ1ZG9jX3VzZWNudGVuY29kaW5nc3xoYXJ1ZG9jX3VzZWNudGZvbnRzfGhhcnVkb2NfdXNlanBlbmNvZGluZ3N8aGFydWRvY191c2VqcGZvbnRzfGhhcnVkb2NfdXNla3JlbmNvZGluZ3N8aGFydWRvY191c2VrcmZvbnRzfCcgKwogICAgICAgICdoYXJ1ZW5jb2RlcnxoYXJ1ZW5jb2Rlcl9nZXRieXRldHlwZXxoYXJ1ZW5jb2Rlcl9nZXR0eXBlfGhhcnVlbmNvZGVyX2dldHVuaWNvZGV8aGFydWVuY29kZXJfZ2V0d3JpdGluZ21vZGV8aGFydWV4Y2VwdGlvbnxoYXJ1Zm9udHwnICsKICAgICAgICAnaGFydWZvbnRfZ2V0YXNjZW50fGhhcnVmb250X2dldGNhcGhlaWdodHxoYXJ1Zm9udF9nZXRkZXNjZW50fGhhcnVmb250X2dldGVuY29kaW5nbmFtZXxoYXJ1Zm9udF9nZXRmb250bmFtZXxoYXJ1Zm9udF9nZXR0ZXh0d2lkdGh8JyArCiAgICAgICAgJ2hhcnVmb250X2dldHVuaWNvZGV3aWR0aHxoYXJ1Zm9udF9nZXR4aGVpZ2h0fGhhcnVmb250X21lYXN1cmV0ZXh0fGhhcnVpbWFnZXxoYXJ1aW1hZ2VfZ2V0Yml0c3BlcmNvbXBvbmVudHxoYXJ1aW1hZ2VfZ2V0Y29sb3JzcGFjZXwnICsKICAgICAgICAnaGFydWltYWdlX2dldGhlaWdodHxoYXJ1aW1hZ2VfZ2V0c2l6ZXxoYXJ1aW1hZ2VfZ2V0d2lkdGh8aGFydWltYWdlX3NldGNvbG9ybWFza3xoYXJ1aW1hZ2Vfc2V0bWFza2ltYWdlfGhhcnVvdXRsaW5lfCcgKwogICAgICAgICdoYXJ1b3V0bGluZV9zZXRkZXN0aW5hdGlvbnxoYXJ1b3V0bGluZV9zZXRvcGVuZWR8aGFydXBhZ2V8aGFydXBhZ2VfYXJjfGhhcnVwYWdlX2JlZ2ludGV4dHxoYXJ1cGFnZV9jaXJjbGV8aGFydXBhZ2VfY2xvc2VwYXRofCcgKwogICAgICAgICdoYXJ1cGFnZV9jb25jYXR8aGFydXBhZ2VfY3JlYXRlZGVzdGluYXRpb258aGFydXBhZ2VfY3JlYXRlbGlua2Fubm90YXRpb258aGFydXBhZ2VfY3JlYXRldGV4dGFubm90YXRpb258aGFydXBhZ2VfY3JlYXRldXJsYW5ub3RhdGlvbnwnICsKICAgICAgICAnaGFydXBhZ2VfY3VydmV0b3xoYXJ1cGFnZV9jdXJ2ZXRvMnxoYXJ1cGFnZV9jdXJ2ZXRvM3xoYXJ1cGFnZV9kcmF3aW1hZ2V8aGFydXBhZ2VfZWxsaXBzZXxoYXJ1cGFnZV9lbmRwYXRofGhhcnVwYWdlX2VuZHRleHR8JyArCiAgICAgICAgJ2hhcnVwYWdlX2VvZmlsbHxoYXJ1cGFnZV9lb2ZpbGxzdHJva2V8aGFydXBhZ2VfZmlsbHxoYXJ1cGFnZV9maWxsc3Ryb2tlfGhhcnVwYWdlX2dldGNoYXJzcGFjZXxoYXJ1cGFnZV9nZXRjbXlrZmlsbHxoYXJ1cGFnZV9nZXRjbXlrc3Ryb2tlfCcgKwogICAgICAgICdoYXJ1cGFnZV9nZXRjdXJyZW50Zm9udHxoYXJ1cGFnZV9nZXRjdXJyZW50Zm9udHNpemV8aGFydXBhZ2VfZ2V0Y3VycmVudHBvc3xoYXJ1cGFnZV9nZXRjdXJyZW50dGV4dHBvc3xoYXJ1cGFnZV9nZXRkYXNofCcgKwogICAgICAgICdoYXJ1cGFnZV9nZXRmaWxsaW5nY29sb3JzcGFjZXxoYXJ1cGFnZV9nZXRmbGF0bmVzc3xoYXJ1cGFnZV9nZXRnbW9kZXxoYXJ1cGFnZV9nZXRncmF5ZmlsbHxoYXJ1cGFnZV9nZXRncmF5c3Ryb2tlfGhhcnVwYWdlX2dldGhlaWdodHwnICsKICAgICAgICAnaGFydXBhZ2VfZ2V0aG9yaXpvbnRhbHNjYWxpbmd8aGFydXBhZ2VfZ2V0bGluZWNhcHxoYXJ1cGFnZV9nZXRsaW5lam9pbnxoYXJ1cGFnZV9nZXRsaW5ld2lkdGh8aGFydXBhZ2VfZ2V0bWl0ZXJsaW1pdHxoYXJ1cGFnZV9nZXRyZ2JmaWxsfCcgKwogICAgICAgICdoYXJ1cGFnZV9nZXRyZ2JzdHJva2V8aGFydXBhZ2VfZ2V0c3Ryb2tpbmdjb2xvcnNwYWNlfGhhcnVwYWdlX2dldHRleHRsZWFkaW5nfGhhcnVwYWdlX2dldHRleHRtYXRyaXh8aGFydXBhZ2VfZ2V0dGV4dHJlbmRlcmluZ21vZGV8JyArCiAgICAgICAgJ2hhcnVwYWdlX2dldHRleHRyaXNlfGhhcnVwYWdlX2dldHRleHR3aWR0aHxoYXJ1cGFnZV9nZXR0cmFuc21hdHJpeHxoYXJ1cGFnZV9nZXR3aWR0aHxoYXJ1cGFnZV9nZXR3b3Jkc3BhY2V8aGFydXBhZ2VfbGluZXRvfCcgKwogICAgICAgICdoYXJ1cGFnZV9tZWFzdXJldGV4dHxoYXJ1cGFnZV9tb3ZldGV4dHBvc3xoYXJ1cGFnZV9tb3ZldG98aGFydXBhZ2VfbW92ZXRvbmV4dGxpbmV8aGFydXBhZ2VfcmVjdGFuZ2xlfGhhcnVwYWdlX3NldGNoYXJzcGFjZXwnICsKICAgICAgICAnaGFydXBhZ2Vfc2V0Y215a2ZpbGx8aGFydXBhZ2Vfc2V0Y215a3N0cm9rZXxoYXJ1cGFnZV9zZXRkYXNofGhhcnVwYWdlX3NldGZsYXRuZXNzfGhhcnVwYWdlX3NldGZvbnRhbmRzaXplfGhhcnVwYWdlX3NldGdyYXlmaWxsfCcgKwogICAgICAgICdoYXJ1cGFnZV9zZXRncmF5c3Ryb2tlfGhhcnVwYWdlX3NldGhlaWdodHxoYXJ1cGFnZV9zZXRob3Jpem9udGFsc2NhbGluZ3xoYXJ1cGFnZV9zZXRsaW5lY2FwfGhhcnVwYWdlX3NldGxpbmVqb2lufGhhcnVwYWdlX3NldGxpbmV3aWR0aHwnICsKICAgICAgICAnaGFydXBhZ2Vfc2V0bWl0ZXJsaW1pdHxoYXJ1cGFnZV9zZXRyZ2JmaWxsfGhhcnVwYWdlX3NldHJnYnN0cm9rZXxoYXJ1cGFnZV9zZXRyb3RhdGV8aGFydXBhZ2Vfc2V0c2l6ZXxoYXJ1cGFnZV9zZXRzbGlkZXNob3d8JyArCiAgICAgICAgJ2hhcnVwYWdlX3NldHRleHRsZWFkaW5nfGhhcnVwYWdlX3NldHRleHRtYXRyaXh8aGFydXBhZ2Vfc2V0dGV4dHJlbmRlcmluZ21vZGV8aGFydXBhZ2Vfc2V0dGV4dHJpc2V8aGFydXBhZ2Vfc2V0d2lkdGh8aGFydXBhZ2Vfc2V0d29yZHNwYWNlfCcgKwogICAgICAgICdoYXJ1cGFnZV9zaG93dGV4dHxoYXJ1cGFnZV9zaG93dGV4dG5leHRsaW5lfGhhcnVwYWdlX3N0cm9rZXxoYXJ1cGFnZV90ZXh0b3V0fGhhcnVwYWdlX3RleHRyZWN0fGhhc2NvbnN0YW50fGhhc2h8aGFzaF9hbGdvc3xoYXNoX2NvcHl8JyArCiAgICAgICAgJ2hhc2hfZmlsZXxoYXNoX2ZpbmFsfGhhc2hfaG1hY3xoYXNoX2htYWNfZmlsZXxoYXNoX2luaXR8aGFzaF91cGRhdGV8aGFzaF91cGRhdGVfZmlsZXxoYXNoX3VwZGF0ZV9zdHJlYW18aGFzbWV0aG9kfGhhc3Byb3BlcnR5fGhlYWRlcnwnICsKICAgICAgICAnaGVhZGVyX3JlZ2lzdGVyX2NhbGxiYWNrfGhlYWRlcl9yZW1vdmV8aGVhZGVyc19saXN0fGhlYWRlcnNfc2VudHxoZWJyZXZ8aGVicmV2Y3xoZXgyYmlufGhleGRlY3xoaWdobGlnaHRfZmlsZXxoaWdobGlnaHRfc3RyaW5nfCcgKwogICAgICAgICdodG1sX2VudGl0eV9kZWNvZGV8aHRtbGVudGl0aWVzfGh0bWxzcGVjaWFsY2hhcnN8aHRtbHNwZWNpYWxjaGFyc19kZWNvZGV8aHR0cF9idWlsZF9jb29raWV8aHR0cF9idWlsZF9xdWVyeXxodHRwX2J1aWxkX3N0cnxodHRwX2J1aWxkX3VybHwnICsKICAgICAgICAnaHR0cF9jYWNoZV9ldGFnfGh0dHBfY2FjaGVfbGFzdF9tb2RpZmllZHxodHRwX2NodW5rZWRfZGVjb2RlfGh0dHBfZGF0ZXxodHRwX2RlZmxhdGV8aHR0cF9nZXR8aHR0cF9nZXRfcmVxdWVzdF9ib2R5fCcgKwogICAgICAgICdodHRwX2dldF9yZXF1ZXN0X2JvZHlfc3RyZWFtfGh0dHBfZ2V0X3JlcXVlc3RfaGVhZGVyc3xodHRwX2hlYWR8aHR0cF9pbmZsYXRlfGh0dHBfbWF0Y2hfZXRhZ3xodHRwX21hdGNoX21vZGlmaWVkfCcgKwogICAgICAgICdodHRwX21hdGNoX3JlcXVlc3RfaGVhZGVyfGh0dHBfbmVnb3RpYXRlX2NoYXJzZXR8aHR0cF9uZWdvdGlhdGVfY29udGVudF90eXBlfGh0dHBfbmVnb3RpYXRlX2xhbmd1YWdlfGh0dHBfcGFyc2VfY29va2llfGh0dHBfcGFyc2VfaGVhZGVyc3wnICsKICAgICAgICAnaHR0cF9wYXJzZV9tZXNzYWdlfGh0dHBfcGFyc2VfcGFyYW1zfGh0dHBfcGVyc2lzdGVudF9oYW5kbGVzX2NsZWFufGh0dHBfcGVyc2lzdGVudF9oYW5kbGVzX2NvdW50fGh0dHBfcGVyc2lzdGVudF9oYW5kbGVzX2lkZW50fCcgKwogICAgICAgICdodHRwX3Bvc3RfZGF0YXxodHRwX3Bvc3RfZmllbGRzfGh0dHBfcHV0X2RhdGF8aHR0cF9wdXRfZmlsZXxodHRwX3B1dF9zdHJlYW18aHR0cF9yZWRpcmVjdHxodHRwX3JlcXVlc3R8aHR0cF9yZXF1ZXN0X2JvZHlfZW5jb2RlfCcgKwogICAgICAgICdodHRwX3JlcXVlc3RfbWV0aG9kX2V4aXN0c3xodHRwX3JlcXVlc3RfbWV0aG9kX25hbWV8aHR0cF9yZXF1ZXN0X21ldGhvZF9yZWdpc3RlcnxodHRwX3JlcXVlc3RfbWV0aG9kX3VucmVnaXN0ZXJ8aHR0cF9yZXNwb25zZV9jb2RlfCcgKwogICAgICAgICdodHRwX3NlbmRfY29udGVudF9kaXNwb3NpdGlvbnxodHRwX3NlbmRfY29udGVudF90eXBlfGh0dHBfc2VuZF9kYXRhfGh0dHBfc2VuZF9maWxlfGh0dHBfc2VuZF9sYXN0X21vZGlmaWVkfGh0dHBfc2VuZF9zdGF0dXN8JyArCiAgICAgICAgJ2h0dHBfc2VuZF9zdHJlYW18aHR0cF9zdXBwb3J0fGh0dHBfdGhyb3R0bGV8aHR0cGRlZmxhdGVzdHJlYW18aHR0cGRlZmxhdGVzdHJlYW1fY29uc3RydWN0fGh0dHBkZWZsYXRlc3RyZWFtX2ZhY3Rvcnl8JyArCiAgICAgICAgJ2h0dHBkZWZsYXRlc3RyZWFtX2ZpbmlzaHxodHRwZGVmbGF0ZXN0cmVhbV9mbHVzaHxodHRwZGVmbGF0ZXN0cmVhbV91cGRhdGV8aHR0cGluZmxhdGVzdHJlYW18aHR0cGluZmxhdGVzdHJlYW1fY29uc3RydWN0fCcgKwogICAgICAgICdodHRwaW5mbGF0ZXN0cmVhbV9mYWN0b3J5fGh0dHBpbmZsYXRlc3RyZWFtX2ZpbmlzaHxodHRwaW5mbGF0ZXN0cmVhbV9mbHVzaHxodHRwaW5mbGF0ZXN0cmVhbV91cGRhdGV8aHR0cG1lc3NhZ2V8aHR0cG1lc3NhZ2VfYWRkaGVhZGVyc3wnICsKICAgICAgICAnaHR0cG1lc3NhZ2VfY29uc3RydWN0fGh0dHBtZXNzYWdlX2RldGFjaHxodHRwbWVzc2FnZV9mYWN0b3J5fGh0dHBtZXNzYWdlX2Zyb21lbnZ8aHR0cG1lc3NhZ2VfZnJvbXN0cmluZ3xodHRwbWVzc2FnZV9nZXRib2R5fCcgKwogICAgICAgICdodHRwbWVzc2FnZV9nZXRoZWFkZXJ8aHR0cG1lc3NhZ2VfZ2V0aGVhZGVyc3xodHRwbWVzc2FnZV9nZXRodHRwdmVyc2lvbnxodHRwbWVzc2FnZV9nZXRwYXJlbnRtZXNzYWdlfGh0dHBtZXNzYWdlX2dldHJlcXVlc3RtZXRob2R8JyArCiAgICAgICAgJ2h0dHBtZXNzYWdlX2dldHJlcXVlc3R1cmx8aHR0cG1lc3NhZ2VfZ2V0cmVzcG9uc2Vjb2RlfGh0dHBtZXNzYWdlX2dldHJlc3BvbnNlc3RhdHVzfGh0dHBtZXNzYWdlX2dldHR5cGV8aHR0cG1lc3NhZ2VfZ3Vlc3Njb250ZW50dHlwZXwnICsKICAgICAgICAnaHR0cG1lc3NhZ2VfcHJlcGVuZHxodHRwbWVzc2FnZV9yZXZlcnNlfGh0dHBtZXNzYWdlX3NlbmR8aHR0cG1lc3NhZ2Vfc2V0Ym9keXxodHRwbWVzc2FnZV9zZXRoZWFkZXJzfGh0dHBtZXNzYWdlX3NldGh0dHB2ZXJzaW9ufCcgKwogICAgICAgICdodHRwbWVzc2FnZV9zZXRyZXF1ZXN0bWV0aG9kfGh0dHBtZXNzYWdlX3NldHJlcXVlc3R1cmx8aHR0cG1lc3NhZ2Vfc2V0cmVzcG9uc2Vjb2RlfGh0dHBtZXNzYWdlX3NldHJlc3BvbnNlc3RhdHVzfGh0dHBtZXNzYWdlX3NldHR5cGV8JyArCiAgICAgICAgJ2h0dHBtZXNzYWdlX3RvbWVzc2FnZXR5cGVvYmplY3R8aHR0cG1lc3NhZ2VfdG9zdHJpbmd8aHR0cHF1ZXJ5c3RyaW5nfGh0dHBxdWVyeXN0cmluZ19jb25zdHJ1Y3R8aHR0cHF1ZXJ5c3RyaW5nX2dldHxodHRwcXVlcnlzdHJpbmdfbW9kfCcgKwogICAgICAgICdodHRwcXVlcnlzdHJpbmdfc2V0fGh0dHBxdWVyeXN0cmluZ19zaW5nbGV0b258aHR0cHF1ZXJ5c3RyaW5nX3RvYXJyYXl8aHR0cHF1ZXJ5c3RyaW5nX3Rvc3RyaW5nfGh0dHBxdWVyeXN0cmluZ194bGF0ZXxodHRwcmVxdWVzdHwnICsKICAgICAgICAnaHR0cHJlcXVlc3RfYWRkY29va2llc3xodHRwcmVxdWVzdF9hZGRoZWFkZXJzfGh0dHByZXF1ZXN0X2FkZHBvc3RmaWVsZHN8aHR0cHJlcXVlc3RfYWRkcG9zdGZpbGV8aHR0cHJlcXVlc3RfYWRkcHV0ZGF0YXwnICsKICAgICAgICAnaHR0cHJlcXVlc3RfYWRkcXVlcnlkYXRhfGh0dHByZXF1ZXN0X2FkZHJhd3Bvc3RkYXRhfGh0dHByZXF1ZXN0X2FkZHNzbG9wdGlvbnN8aHR0cHJlcXVlc3RfY2xlYXJoaXN0b3J5fGh0dHByZXF1ZXN0X2NvbnN0cnVjdHwnICsKICAgICAgICAnaHR0cHJlcXVlc3RfZW5hYmxlY29va2llc3xodHRwcmVxdWVzdF9nZXRjb250ZW50dHlwZXxodHRwcmVxdWVzdF9nZXRjb29raWVzfGh0dHByZXF1ZXN0X2dldGhlYWRlcnN8aHR0cHJlcXVlc3RfZ2V0aGlzdG9yeXwnICsKICAgICAgICAnaHR0cHJlcXVlc3RfZ2V0bWV0aG9kfGh0dHByZXF1ZXN0X2dldG9wdGlvbnN8aHR0cHJlcXVlc3RfZ2V0cG9zdGZpZWxkc3xodHRwcmVxdWVzdF9nZXRwb3N0ZmlsZXN8aHR0cHJlcXVlc3RfZ2V0cHV0ZGF0YXwnICsKICAgICAgICAnaHR0cHJlcXVlc3RfZ2V0cHV0ZmlsZXxodHRwcmVxdWVzdF9nZXRxdWVyeWRhdGF8aHR0cHJlcXVlc3RfZ2V0cmF3cG9zdGRhdGF8aHR0cHJlcXVlc3RfZ2V0cmF3cmVxdWVzdG1lc3NhZ2V8JyArCiAgICAgICAgJ2h0dHByZXF1ZXN0X2dldHJhd3Jlc3BvbnNlbWVzc2FnZXxodHRwcmVxdWVzdF9nZXRyZXF1ZXN0bWVzc2FnZXxodHRwcmVxdWVzdF9nZXRyZXNwb25zZWJvZHl8aHR0cHJlcXVlc3RfZ2V0cmVzcG9uc2Vjb2RlfCcgKwogICAgICAgICdodHRwcmVxdWVzdF9nZXRyZXNwb25zZWNvb2tpZXN8aHR0cHJlcXVlc3RfZ2V0cmVzcG9uc2VkYXRhfGh0dHByZXF1ZXN0X2dldHJlc3BvbnNlaGVhZGVyfGh0dHByZXF1ZXN0X2dldHJlc3BvbnNlaW5mb3wnICsKICAgICAgICAnaHR0cHJlcXVlc3RfZ2V0cmVzcG9uc2VtZXNzYWdlfGh0dHByZXF1ZXN0X2dldHJlc3BvbnNlc3RhdHVzfGh0dHByZXF1ZXN0X2dldHNzbG9wdGlvbnN8aHR0cHJlcXVlc3RfZ2V0dXJsfGh0dHByZXF1ZXN0X3Jlc2V0Y29va2llc3wnICsKICAgICAgICAnaHR0cHJlcXVlc3Rfc2VuZHxodHRwcmVxdWVzdF9zZXRjb250ZW50dHlwZXxodHRwcmVxdWVzdF9zZXRjb29raWVzfGh0dHByZXF1ZXN0X3NldGhlYWRlcnN8aHR0cHJlcXVlc3Rfc2V0bWV0aG9kfGh0dHByZXF1ZXN0X3NldG9wdGlvbnN8JyArCiAgICAgICAgJ2h0dHByZXF1ZXN0X3NldHBvc3RmaWVsZHN8aHR0cHJlcXVlc3Rfc2V0cG9zdGZpbGVzfGh0dHByZXF1ZXN0X3NldHB1dGRhdGF8aHR0cHJlcXVlc3Rfc2V0cHV0ZmlsZXxodHRwcmVxdWVzdF9zZXRxdWVyeWRhdGF8JyArCiAgICAgICAgJ2h0dHByZXF1ZXN0X3NldHJhd3Bvc3RkYXRhfGh0dHByZXF1ZXN0X3NldHNzbG9wdGlvbnN8aHR0cHJlcXVlc3Rfc2V0dXJsfGh0dHByZXF1ZXN0cG9vbHxodHRwcmVxdWVzdHBvb2xfYXR0YWNofGh0dHByZXF1ZXN0cG9vbF9jb25zdHJ1Y3R8JyArCiAgICAgICAgJ2h0dHByZXF1ZXN0cG9vbF9kZXN0cnVjdHxodHRwcmVxdWVzdHBvb2xfZGV0YWNofGh0dHByZXF1ZXN0cG9vbF9nZXRhdHRhY2hlZHJlcXVlc3RzfGh0dHByZXF1ZXN0cG9vbF9nZXRmaW5pc2hlZHJlcXVlc3RzfCcgKwogICAgICAgICdodHRwcmVxdWVzdHBvb2xfcmVzZXR8aHR0cHJlcXVlc3Rwb29sX3NlbmR8aHR0cHJlcXVlc3Rwb29sX3NvY2tldHBlcmZvcm18aHR0cHJlcXVlc3Rwb29sX3NvY2tldHNlbGVjdHxodHRwcmVzcG9uc2V8aHR0cHJlc3BvbnNlX2NhcHR1cmV8JyArCiAgICAgICAgJ2h0dHByZXNwb25zZV9nZXRidWZmZXJzaXplfGh0dHByZXNwb25zZV9nZXRjYWNoZXxodHRwcmVzcG9uc2VfZ2V0Y2FjaGVjb250cm9sfGh0dHByZXNwb25zZV9nZXRjb250ZW50ZGlzcG9zaXRpb258JyArCiAgICAgICAgJ2h0dHByZXNwb25zZV9nZXRjb250ZW50dHlwZXxodHRwcmVzcG9uc2VfZ2V0ZGF0YXxodHRwcmVzcG9uc2VfZ2V0ZXRhZ3xodHRwcmVzcG9uc2VfZ2V0ZmlsZXxodHRwcmVzcG9uc2VfZ2V0Z3ppcHxodHRwcmVzcG9uc2VfZ2V0aGVhZGVyfCcgKwogICAgICAgICdodHRwcmVzcG9uc2VfZ2V0bGFzdG1vZGlmaWVkfGh0dHByZXNwb25zZV9nZXRyZXF1ZXN0Ym9keXxodHRwcmVzcG9uc2VfZ2V0cmVxdWVzdGJvZHlzdHJlYW18aHR0cHJlc3BvbnNlX2dldHJlcXVlc3RoZWFkZXJzfCcgKwogICAgICAgICdodHRwcmVzcG9uc2VfZ2V0c3RyZWFtfGh0dHByZXNwb25zZV9nZXR0aHJvdHRsZWRlbGF5fGh0dHByZXNwb25zZV9ndWVzc2NvbnRlbnR0eXBlfGh0dHByZXNwb25zZV9yZWRpcmVjdHxodHRwcmVzcG9uc2Vfc2VuZHwnICsKICAgICAgICAnaHR0cHJlc3BvbnNlX3NldGJ1ZmZlcnNpemV8aHR0cHJlc3BvbnNlX3NldGNhY2hlfGh0dHByZXNwb25zZV9zZXRjYWNoZWNvbnRyb2x8aHR0cHJlc3BvbnNlX3NldGNvbnRlbnRkaXNwb3NpdGlvbnwnICsKICAgICAgICAnaHR0cHJlc3BvbnNlX3NldGNvbnRlbnR0eXBlfGh0dHByZXNwb25zZV9zZXRkYXRhfGh0dHByZXNwb25zZV9zZXRldGFnfGh0dHByZXNwb25zZV9zZXRmaWxlfGh0dHByZXNwb25zZV9zZXRnemlwfGh0dHByZXNwb25zZV9zZXRoZWFkZXJ8JyArCiAgICAgICAgJ2h0dHByZXNwb25zZV9zZXRsYXN0bW9kaWZpZWR8aHR0cHJlc3BvbnNlX3NldHN0cmVhbXxodHRwcmVzcG9uc2Vfc2V0dGhyb3R0bGVkZWxheXxodHRwcmVzcG9uc2Vfc3RhdHVzfGh3X2FycmF5Mm9ianJlY3xod19jaGFuZ2VvYmplY3R8JyArCiAgICAgICAgJ2h3X2NoaWxkcmVufGh3X2NoaWxkcmVub2JqfGh3X2Nsb3NlfGh3X2Nvbm5lY3R8aHdfY29ubmVjdGlvbl9pbmZvfGh3X2NwfGh3X2RlbGV0ZW9iamVjdHxod19kb2NieWFuY2hvcnxod19kb2NieWFuY2hvcm9ianwnICsKICAgICAgICAnaHdfZG9jdW1lbnRfYXR0cmlidXRlc3xod19kb2N1bWVudF9ib2R5dGFnfGh3X2RvY3VtZW50X2NvbnRlbnR8aHdfZG9jdW1lbnRfc2V0Y29udGVudHxod19kb2N1bWVudF9zaXplfGh3X2R1bW15fGh3X2VkaXR0ZXh0fGh3X2Vycm9yfCcgKwogICAgICAgICdod19lcnJvcm1zZ3xod19mcmVlX2RvY3VtZW50fGh3X2dldGFuY2hvcnN8aHdfZ2V0YW5jaG9yc29ianxod19nZXRhbmRsb2NrfGh3X2dldGNoaWxkY29sbHxod19nZXRjaGlsZGNvbGxvYmp8aHdfZ2V0Y2hpbGRkb2Njb2xsfCcgKwogICAgICAgICdod19nZXRjaGlsZGRvY2NvbGxvYmp8aHdfZ2V0b2JqZWN0fGh3X2dldG9iamVjdGJ5cXVlcnl8aHdfZ2V0b2JqZWN0YnlxdWVyeWNvbGx8aHdfZ2V0b2JqZWN0YnlxdWVyeWNvbGxvYmp8aHdfZ2V0b2JqZWN0YnlxdWVyeW9ianwnICsKICAgICAgICAnaHdfZ2V0cGFyZW50c3xod19nZXRwYXJlbnRzb2JqfGh3X2dldHJlbGxpbmt8aHdfZ2V0cmVtb3RlfGh3X2dldHJlbW90ZWNoaWxkcmVufGh3X2dldHNyY2J5ZGVzdG9ianxod19nZXR0ZXh0fGh3X2dldHVzZXJuYW1lfGh3X2lkZW50aWZ5fCcgKwogICAgICAgICdod19pbmNvbGxlY3Rpb25zfGh3X2luZm98aHdfaW5zY29sbHxod19pbnNkb2N8aHdfaW5zZXJ0YW5jaG9yc3xod19pbnNlcnRkb2N1bWVudHxod19pbnNlcnRvYmplY3R8aHdfbWFwaWR8aHdfbW9kaWZ5b2JqZWN0fGh3X212fCcgKwogICAgICAgICdod19uZXdfZG9jdW1lbnR8aHdfb2JqcmVjMmFycmF5fGh3X291dHB1dF9kb2N1bWVudHxod19wY29ubmVjdHxod19waXBlZG9jdW1lbnR8aHdfcm9vdHxod19zZXRsaW5rcm9vdHxod19zdGF0fGh3X3VubG9ja3xod193aG98JyArCiAgICAgICAgJ2h3YXBpX2F0dHJpYnV0ZXxod2FwaV9hdHRyaWJ1dGVfa2V5fGh3YXBpX2F0dHJpYnV0ZV9sYW5nZGVwdmFsdWV8aHdhcGlfYXR0cmlidXRlX3ZhbHVlfGh3YXBpX2F0dHJpYnV0ZV92YWx1ZXN8aHdhcGlfY2hlY2tpbnwnICsKICAgICAgICAnaHdhcGlfY2hlY2tvdXR8aHdhcGlfY2hpbGRyZW58aHdhcGlfY29udGVudHxod2FwaV9jb250ZW50X21pbWV0eXBlfGh3YXBpX2NvbnRlbnRfcmVhZHxod2FwaV9jb3B5fGh3YXBpX2Ric3RhdHxod2FwaV9kY3N0YXR8JyArCiAgICAgICAgJ2h3YXBpX2RzdGFuY2hvcnN8aHdhcGlfZHN0b2ZzcmNhbmNob3J8aHdhcGlfZXJyb3JfY291bnR8aHdhcGlfZXJyb3JfcmVhc29ufGh3YXBpX2ZpbmR8aHdhcGlfZnRzdGF0fGh3YXBpX2hnY3NwfGh3YXBpX2h3c3RhdHwnICsKICAgICAgICAnaHdhcGlfaWRlbnRpZnl8aHdhcGlfaW5mb3xod2FwaV9pbnNlcnR8aHdhcGlfaW5zZXJ0YW5jaG9yfGh3YXBpX2luc2VydGNvbGxlY3Rpb258aHdhcGlfaW5zZXJ0ZG9jdW1lbnR8aHdhcGlfbGlua3xod2FwaV9sb2NrfGh3YXBpX21vdmV8JyArCiAgICAgICAgJ2h3YXBpX25ld19jb250ZW50fGh3YXBpX29iamVjdHxod2FwaV9vYmplY3RfYXNzaWdufGh3YXBpX29iamVjdF9hdHRyZWRpdGFibGV8aHdhcGlfb2JqZWN0X2NvdW50fGh3YXBpX29iamVjdF9pbnNlcnR8aHdhcGlfb2JqZWN0X25ld3wnICsKICAgICAgICAnaHdhcGlfb2JqZWN0X3JlbW92ZXxod2FwaV9vYmplY3RfdGl0bGV8aHdhcGlfb2JqZWN0X3ZhbHVlfGh3YXBpX29iamVjdGJ5YW5jaG9yfGh3YXBpX3BhcmVudHN8aHdhcGlfcmVhc29uX2Rlc2NyaXB0aW9ufGh3YXBpX3JlYXNvbl90eXBlfCcgKwogICAgICAgICdod2FwaV9yZW1vdmV8aHdhcGlfcmVwbGFjZXxod2FwaV9zZXRjb21taXR0ZWR2ZXJzaW9ufGh3YXBpX3NyY2FuY2hvcnN8aHdhcGlfc3Jjc29mZHN0fGh3YXBpX3VubG9ja3xod2FwaV91c2VyfGh3YXBpX3VzZXJsaXN0fGh5cG90fCcgKwogICAgICAgICdpYmFzZV9hZGRfdXNlcnxpYmFzZV9hZmZlY3RlZF9yb3dzfGliYXNlX2JhY2t1cHxpYmFzZV9ibG9iX2FkZHxpYmFzZV9ibG9iX2NhbmNlbHxpYmFzZV9ibG9iX2Nsb3NlfGliYXNlX2Jsb2JfY3JlYXRlfGliYXNlX2Jsb2JfZWNob3wnICsKICAgICAgICAnaWJhc2VfYmxvYl9nZXR8aWJhc2VfYmxvYl9pbXBvcnR8aWJhc2VfYmxvYl9pbmZvfGliYXNlX2Jsb2Jfb3BlbnxpYmFzZV9jbG9zZXxpYmFzZV9jb21taXR8aWJhc2VfY29tbWl0X3JldHxpYmFzZV9jb25uZWN0fGliYXNlX2RiX2luZm98JyArCiAgICAgICAgJ2liYXNlX2RlbGV0ZV91c2VyfGliYXNlX2Ryb3BfZGJ8aWJhc2VfZXJyY29kZXxpYmFzZV9lcnJtc2d8aWJhc2VfZXhlY3V0ZXxpYmFzZV9mZXRjaF9hc3NvY3xpYmFzZV9mZXRjaF9vYmplY3R8aWJhc2VfZmV0Y2hfcm93fCcgKwogICAgICAgICdpYmFzZV9maWVsZF9pbmZvfGliYXNlX2ZyZWVfZXZlbnRfaGFuZGxlcnxpYmFzZV9mcmVlX3F1ZXJ5fGliYXNlX2ZyZWVfcmVzdWx0fGliYXNlX2dlbl9pZHxpYmFzZV9tYWludGFpbl9kYnxpYmFzZV9tb2RpZnlfdXNlcnwnICsKICAgICAgICAnaWJhc2VfbmFtZV9yZXN1bHR8aWJhc2VfbnVtX2ZpZWxkc3xpYmFzZV9udW1fcGFyYW1zfGliYXNlX3BhcmFtX2luZm98aWJhc2VfcGNvbm5lY3R8aWJhc2VfcHJlcGFyZXxpYmFzZV9xdWVyeXxpYmFzZV9yZXN0b3JlfCcgKwogICAgICAgICdpYmFzZV9yb2xsYmFja3xpYmFzZV9yb2xsYmFja19yZXR8aWJhc2Vfc2VydmVyX2luZm98aWJhc2Vfc2VydmljZV9hdHRhY2h8aWJhc2Vfc2VydmljZV9kZXRhY2h8aWJhc2Vfc2V0X2V2ZW50X2hhbmRsZXJ8aWJhc2VfdGltZWZtdHwnICsKICAgICAgICAnaWJhc2VfdHJhbnN8aWJhc2Vfd2FpdF9ldmVudHxpY29udnxpY29udl9nZXRfZW5jb2Rpbmd8aWNvbnZfbWltZV9kZWNvZGV8aWNvbnZfbWltZV9kZWNvZGVfaGVhZGVyc3xpY29udl9taW1lX2VuY29kZXxpY29udl9zZXRfZW5jb2Rpbmd8JyArCiAgICAgICAgJ2ljb252X3N0cmxlbnxpY29udl9zdHJwb3N8aWNvbnZfc3RycnBvc3xpY29udl9zdWJzdHJ8aWQzX2dldF9mcmFtZV9sb25nX25hbWV8aWQzX2dldF9mcmFtZV9zaG9ydF9uYW1lfGlkM19nZXRfZ2VucmVfaWR8aWQzX2dldF9nZW5yZV9saXN0fCcgKwogICAgICAgICdpZDNfZ2V0X2dlbnJlX25hbWV8aWQzX2dldF90YWd8aWQzX2dldF92ZXJzaW9ufGlkM19yZW1vdmVfdGFnfGlkM19zZXRfdGFnfGlkM3YyYXR0YWNoZWRwaWN0dXJlZnJhbWV8aWQzdjJmcmFtZXxpZDN2MnRhZ3xpZGF0ZXwnICsKICAgICAgICAnaWRuX3RvX2FzY2lpfGlkbl90b191bmljb2RlfGlkbl90b191dGY4fGlmeF9hZmZlY3RlZF9yb3dzfGlmeF9ibG9iaW5maWxlX21vZGV8aWZ4X2J5dGVhc3ZhcmNoYXJ8aWZ4X2Nsb3NlfGlmeF9jb25uZWN0fGlmeF9jb3B5X2Jsb2J8JyArCiAgICAgICAgJ2lmeF9jcmVhdGVfYmxvYnxpZnhfY3JlYXRlX2NoYXJ8aWZ4X2RvfGlmeF9lcnJvcnxpZnhfZXJyb3Jtc2d8aWZ4X2ZldGNoX3Jvd3xpZnhfZmllbGRwcm9wZXJ0aWVzfGlmeF9maWVsZHR5cGVzfGlmeF9mcmVlX2Jsb2J8JyArCiAgICAgICAgJ2lmeF9mcmVlX2NoYXJ8aWZ4X2ZyZWVfcmVzdWx0fGlmeF9nZXRfYmxvYnxpZnhfZ2V0X2NoYXJ8aWZ4X2dldHNxbGNhfGlmeF9odG1sdGJsX3Jlc3VsdHxpZnhfbnVsbGZvcm1hdHxpZnhfbnVtX2ZpZWxkc3xpZnhfbnVtX3Jvd3N8JyArCiAgICAgICAgJ2lmeF9wY29ubmVjdHxpZnhfcHJlcGFyZXxpZnhfcXVlcnl8aWZ4X3RleHRhc3ZhcmNoYXJ8aWZ4X3VwZGF0ZV9ibG9ifGlmeF91cGRhdGVfY2hhcnxpZnh1c19jbG9zZV9zbG9ifGlmeHVzX2NyZWF0ZV9zbG9ifGlmeHVzX2ZyZWVfc2xvYnwnICsKICAgICAgICAnaWZ4dXNfb3Blbl9zbG9ifGlmeHVzX3JlYWRfc2xvYnxpZnh1c19zZWVrX3Nsb2J8aWZ4dXNfdGVsbF9zbG9ifGlmeHVzX3dyaXRlX3Nsb2J8aWdub3JlX3VzZXJfYWJvcnR8aWlzX2FkZF9zZXJ2ZXJ8aWlzX2dldF9kaXJfc2VjdXJpdHl8JyArCiAgICAgICAgJ2lpc19nZXRfc2NyaXB0X21hcHxpaXNfZ2V0X3NlcnZlcl9ieV9jb21tZW50fGlpc19nZXRfc2VydmVyX2J5X3BhdGh8aWlzX2dldF9zZXJ2ZXJfcmlnaHRzfGlpc19nZXRfc2VydmljZV9zdGF0ZXxpaXNfcmVtb3ZlX3NlcnZlcnwnICsKICAgICAgICAnaWlzX3NldF9hcHBfc2V0dGluZ3N8aWlzX3NldF9kaXJfc2VjdXJpdHl8aWlzX3NldF9zY3JpcHRfbWFwfGlpc19zZXRfc2VydmVyX3JpZ2h0c3xpaXNfc3RhcnRfc2VydmVyfGlpc19zdGFydF9zZXJ2aWNlfGlpc19zdG9wX3NlcnZlcnwnICsKICAgICAgICAnaWlzX3N0b3Bfc2VydmljZXxpbWFnZTJ3Ym1wfGltYWdlX3R5cGVfdG9fZXh0ZW5zaW9ufGltYWdlX3R5cGVfdG9fbWltZV90eXBlfGltYWdlYWxwaGFibGVuZGluZ3xpbWFnZWFudGlhbGlhc3xpbWFnZWFyY3xpbWFnZWNoYXJ8JyArCiAgICAgICAgJ2ltYWdlY2hhcnVwfGltYWdlY29sb3JhbGxvY2F0ZXxpbWFnZWNvbG9yYWxsb2NhdGVhbHBoYXxpbWFnZWNvbG9yYXR8aW1hZ2Vjb2xvcmNsb3Nlc3R8aW1hZ2Vjb2xvcmNsb3Nlc3RhbHBoYXxpbWFnZWNvbG9yY2xvc2VzdGh3YnwnICsKICAgICAgICAnaW1hZ2Vjb2xvcmRlYWxsb2NhdGV8aW1hZ2Vjb2xvcmV4YWN0fGltYWdlY29sb3JleGFjdGFscGhhfGltYWdlY29sb3JtYXRjaHxpbWFnZWNvbG9ycmVzb2x2ZXxpbWFnZWNvbG9ycmVzb2x2ZWFscGhhfGltYWdlY29sb3JzZXR8JyArCiAgICAgICAgJ2ltYWdlY29sb3JzZm9yaW5kZXh8aW1hZ2Vjb2xvcnN0b3RhbHxpbWFnZWNvbG9ydHJhbnNwYXJlbnR8aW1hZ2Vjb252b2x1dGlvbnxpbWFnZWNvcHl8aW1hZ2Vjb3B5bWVyZ2V8aW1hZ2Vjb3B5bWVyZ2VncmF5fCcgKwogICAgICAgICdpbWFnZWNvcHlyZXNhbXBsZWR8aW1hZ2Vjb3B5cmVzaXplZHxpbWFnZWNyZWF0ZXxpbWFnZWNyZWF0ZWZyb21nZHxpbWFnZWNyZWF0ZWZyb21nZDJ8aW1hZ2VjcmVhdGVmcm9tZ2QycGFydHxpbWFnZWNyZWF0ZWZyb21naWZ8JyArCiAgICAgICAgJ2ltYWdlY3JlYXRlZnJvbWpwZWd8aW1hZ2VjcmVhdGVmcm9tcG5nfGltYWdlY3JlYXRlZnJvbXN0cmluZ3xpbWFnZWNyZWF0ZWZyb213Ym1wfGltYWdlY3JlYXRlZnJvbXhibXxpbWFnZWNyZWF0ZWZyb214cG18JyArCiAgICAgICAgJ2ltYWdlY3JlYXRldHJ1ZWNvbG9yfGltYWdlZGFzaGVkbGluZXxpbWFnZWRlc3Ryb3l8aW1hZ2VlbGxpcHNlfGltYWdlZmlsbHxpbWFnZWZpbGxlZGFyY3xpbWFnZWZpbGxlZGVsbGlwc2V8aW1hZ2VmaWxsZWRwb2x5Z29ufCcgKwogICAgICAgICdpbWFnZWZpbGxlZHJlY3RhbmdsZXxpbWFnZWZpbGx0b2JvcmRlcnxpbWFnZWZpbHRlcnxpbWFnZWZvbnRoZWlnaHR8aW1hZ2Vmb250d2lkdGh8aW1hZ2VmdGJib3h8aW1hZ2VmdHRleHR8aW1hZ2VnYW1tYWNvcnJlY3R8aW1hZ2VnZHwnICsKICAgICAgICAnaW1hZ2VnZDJ8aW1hZ2VnaWZ8aW1hZ2VncmFic2NyZWVufGltYWdlZ3JhYndpbmRvd3xpbWFnZWludGVybGFjZXxpbWFnZWlzdHJ1ZWNvbG9yfGltYWdlanBlZ3xpbWFnZWxheWVyZWZmZWN0fGltYWdlbGluZXxpbWFnZWxvYWRmb250fCcgKwogICAgICAgICdpbWFnZXBhbGV0dGVjb3B5fGltYWdlcG5nfGltYWdlcG9seWdvbnxpbWFnZXBzYmJveHxpbWFnZXBzZW5jb2RlZm9udHxpbWFnZXBzZXh0ZW5kZm9udHxpbWFnZXBzZnJlZWZvbnR8aW1hZ2Vwc2xvYWRmb250fGltYWdlcHNzbGFudGZvbnR8JyArCiAgICAgICAgJ2ltYWdlcHN0ZXh0fGltYWdlcmVjdGFuZ2xlfGltYWdlcm90YXRlfGltYWdlc2F2ZWFscGhhfGltYWdlc2V0YnJ1c2h8aW1hZ2VzZXRwaXhlbHxpbWFnZXNldHN0eWxlfGltYWdlc2V0dGhpY2tuZXNzfGltYWdlc2V0dGlsZXwnICsKICAgICAgICAnaW1hZ2VzdHJpbmd8aW1hZ2VzdHJpbmd1cHxpbWFnZXN4fGltYWdlc3l8aW1hZ2V0cnVlY29sb3J0b3BhbGV0dGV8aW1hZ2V0dGZiYm94fGltYWdldHRmdGV4dHxpbWFnZXR5cGVzfGltYWdld2JtcHxpbWFnZXhibXxpbWFnaWNrfCcgKwogICAgICAgICdpbWFnaWNrX2FkYXB0aXZlYmx1cmltYWdlfGltYWdpY2tfYWRhcHRpdmVyZXNpemVpbWFnZXxpbWFnaWNrX2FkYXB0aXZlc2hhcnBlbmltYWdlfGltYWdpY2tfYWRhcHRpdmV0aHJlc2hvbGRpbWFnZXxpbWFnaWNrX2FkZGltYWdlfCcgKwogICAgICAgICdpbWFnaWNrX2FkZG5vaXNlaW1hZ2V8aW1hZ2lja19hZmZpbmV0cmFuc2Zvcm1pbWFnZXxpbWFnaWNrX2FuaW1hdGVpbWFnZXN8aW1hZ2lja19hbm5vdGF0ZWltYWdlfGltYWdpY2tfYXBwZW5kaW1hZ2VzfGltYWdpY2tfYXZlcmFnZWltYWdlc3wnICsKICAgICAgICAnaW1hZ2lja19ibGFja3RocmVzaG9sZGltYWdlfGltYWdpY2tfYmx1cmltYWdlfGltYWdpY2tfYm9yZGVyaW1hZ2V8aW1hZ2lja19jaGFyY29hbGltYWdlfGltYWdpY2tfY2hvcGltYWdlfGltYWdpY2tfY2xlYXJ8aW1hZ2lja19jbGlwaW1hZ2V8JyArCiAgICAgICAgJ2ltYWdpY2tfY2xpcHBhdGhpbWFnZXxpbWFnaWNrX2Nsb25lfGltYWdpY2tfY2x1dGltYWdlfGltYWdpY2tfY29hbGVzY2VpbWFnZXN8aW1hZ2lja19jb2xvcmZsb29kZmlsbGltYWdlfGltYWdpY2tfY29sb3JpemVpbWFnZXwnICsKICAgICAgICAnaW1hZ2lja19jb21iaW5laW1hZ2VzfGltYWdpY2tfY29tbWVudGltYWdlfGltYWdpY2tfY29tcGFyZWltYWdlY2hhbm5lbHN8aW1hZ2lja19jb21wYXJlaW1hZ2VsYXllcnN8aW1hZ2lja19jb21wYXJlaW1hZ2VzfCcgKwogICAgICAgICdpbWFnaWNrX2NvbXBvc2l0ZWltYWdlfGltYWdpY2tfY29uc3RydWN0fGltYWdpY2tfY29udHJhc3RpbWFnZXxpbWFnaWNrX2NvbnRyYXN0c3RyZXRjaGltYWdlfGltYWdpY2tfY29udm9sdmVpbWFnZXxpbWFnaWNrX2Nyb3BpbWFnZXwnICsKICAgICAgICAnaW1hZ2lja19jcm9wdGh1bWJuYWlsaW1hZ2V8aW1hZ2lja19jdXJyZW50fGltYWdpY2tfY3ljbGVjb2xvcm1hcGltYWdlfGltYWdpY2tfZGVjaXBoZXJpbWFnZXxpbWFnaWNrX2RlY29uc3RydWN0aW1hZ2VzfCcgKwogICAgICAgICdpbWFnaWNrX2RlbGV0ZWltYWdlYXJ0aWZhY3R8aW1hZ2lja19kZXNwZWNrbGVpbWFnZXxpbWFnaWNrX2Rlc3Ryb3l8aW1hZ2lja19kaXNwbGF5aW1hZ2V8aW1hZ2lja19kaXNwbGF5aW1hZ2VzfGltYWdpY2tfZGlzdG9ydGltYWdlfCcgKwogICAgICAgICdpbWFnaWNrX2RyYXdpbWFnZXxpbWFnaWNrX2VkZ2VpbWFnZXxpbWFnaWNrX2VtYm9zc2ltYWdlfGltYWdpY2tfZW5jaXBoZXJpbWFnZXxpbWFnaWNrX2VuaGFuY2VpbWFnZXxpbWFnaWNrX2VxdWFsaXplaW1hZ2V8JyArCiAgICAgICAgJ2ltYWdpY2tfZXZhbHVhdGVpbWFnZXxpbWFnaWNrX2V4dGVudGltYWdlfGltYWdpY2tfZmxhdHRlbmltYWdlc3xpbWFnaWNrX2ZsaXBpbWFnZXxpbWFnaWNrX2Zsb29kZmlsbHBhaW50aW1hZ2V8aW1hZ2lja19mbG9waW1hZ2V8JyArCiAgICAgICAgJ2ltYWdpY2tfZnJhbWVpbWFnZXxpbWFnaWNrX2Z4aW1hZ2V8aW1hZ2lja19nYW1tYWltYWdlfGltYWdpY2tfZ2F1c3NpYW5ibHVyaW1hZ2V8aW1hZ2lja19nZXRjb2xvcnNwYWNlfGltYWdpY2tfZ2V0Y29tcHJlc3Npb258JyArCiAgICAgICAgJ2ltYWdpY2tfZ2V0Y29tcHJlc3Npb25xdWFsaXR5fGltYWdpY2tfZ2V0Y29weXJpZ2h0fGltYWdpY2tfZ2V0ZmlsZW5hbWV8aW1hZ2lja19nZXRmb250fGltYWdpY2tfZ2V0Zm9ybWF0fGltYWdpY2tfZ2V0Z3Jhdml0eXwnICsKICAgICAgICAnaW1hZ2lja19nZXRob21ldXJsfGltYWdpY2tfZ2V0aW1hZ2V8aW1hZ2lja19nZXRpbWFnZWFscGhhY2hhbm5lbHxpbWFnaWNrX2dldGltYWdlYXJ0aWZhY3R8aW1hZ2lja19nZXRpbWFnZWJhY2tncm91bmRjb2xvcnwnICsKICAgICAgICAnaW1hZ2lja19nZXRpbWFnZWJsb2J8aW1hZ2lja19nZXRpbWFnZWJsdWVwcmltYXJ5fGltYWdpY2tfZ2V0aW1hZ2Vib3JkZXJjb2xvcnxpbWFnaWNrX2dldGltYWdlY2hhbm5lbGRlcHRofCcgKwogICAgICAgICdpbWFnaWNrX2dldGltYWdlY2hhbm5lbGRpc3RvcnRpb258aW1hZ2lja19nZXRpbWFnZWNoYW5uZWxkaXN0b3J0aW9uc3xpbWFnaWNrX2dldGltYWdlY2hhbm5lbGV4dHJlbWF8aW1hZ2lja19nZXRpbWFnZWNoYW5uZWxtZWFufCcgKwogICAgICAgICdpbWFnaWNrX2dldGltYWdlY2hhbm5lbHJhbmdlfGltYWdpY2tfZ2V0aW1hZ2VjaGFubmVsc3RhdGlzdGljc3xpbWFnaWNrX2dldGltYWdlY2xpcG1hc2t8aW1hZ2lja19nZXRpbWFnZWNvbG9ybWFwY29sb3J8JyArCiAgICAgICAgJ2ltYWdpY2tfZ2V0aW1hZ2Vjb2xvcnN8aW1hZ2lja19nZXRpbWFnZWNvbG9yc3BhY2V8aW1hZ2lja19nZXRpbWFnZWNvbXBvc2V8aW1hZ2lja19nZXRpbWFnZWNvbXByZXNzaW9ufGltYWdpY2tfZ2V0aW1hZ2Vjb21wcmVzc2lvbnF1YWxpdHl8JyArCiAgICAgICAgJ2ltYWdpY2tfZ2V0aW1hZ2VkZWxheXxpbWFnaWNrX2dldGltYWdlZGVwdGh8aW1hZ2lja19nZXRpbWFnZWRpc3Bvc2V8aW1hZ2lja19nZXRpbWFnZWRpc3RvcnRpb258aW1hZ2lja19nZXRpbWFnZWV4dHJlbWF8JyArCiAgICAgICAgJ2ltYWdpY2tfZ2V0aW1hZ2VmaWxlbmFtZXxpbWFnaWNrX2dldGltYWdlZm9ybWF0fGltYWdpY2tfZ2V0aW1hZ2VnYW1tYXxpbWFnaWNrX2dldGltYWdlZ2VvbWV0cnl8aW1hZ2lja19nZXRpbWFnZWdyYXZpdHl8JyArCiAgICAgICAgJ2ltYWdpY2tfZ2V0aW1hZ2VncmVlbnByaW1hcnl8aW1hZ2lja19nZXRpbWFnZWhlaWdodHxpbWFnaWNrX2dldGltYWdlaGlzdG9ncmFtfGltYWdpY2tfZ2V0aW1hZ2VpbmRleHxpbWFnaWNrX2dldGltYWdlaW50ZXJsYWNlc2NoZW1lfCcgKwogICAgICAgICdpbWFnaWNrX2dldGltYWdlaW50ZXJwb2xhdGVtZXRob2R8aW1hZ2lja19nZXRpbWFnZWl0ZXJhdGlvbnN8aW1hZ2lja19nZXRpbWFnZWxlbmd0aHxpbWFnaWNrX2dldGltYWdlbWFnaWNrbGljZW5zZXxpbWFnaWNrX2dldGltYWdlbWF0dGV8JyArCiAgICAgICAgJ2ltYWdpY2tfZ2V0aW1hZ2VtYXR0ZWNvbG9yfGltYWdpY2tfZ2V0aW1hZ2VvcmllbnRhdGlvbnxpbWFnaWNrX2dldGltYWdlcGFnZXxpbWFnaWNrX2dldGltYWdlcGl4ZWxjb2xvcnxpbWFnaWNrX2dldGltYWdlcHJvZmlsZXwnICsKICAgICAgICAnaW1hZ2lja19nZXRpbWFnZXByb2ZpbGVzfGltYWdpY2tfZ2V0aW1hZ2Vwcm9wZXJ0aWVzfGltYWdpY2tfZ2V0aW1hZ2Vwcm9wZXJ0eXxpbWFnaWNrX2dldGltYWdlcmVkcHJpbWFyeXxpbWFnaWNrX2dldGltYWdlcmVnaW9ufCcgKwogICAgICAgICdpbWFnaWNrX2dldGltYWdlcmVuZGVyaW5naW50ZW50fGltYWdpY2tfZ2V0aW1hZ2VyZXNvbHV0aW9ufGltYWdpY2tfZ2V0aW1hZ2VzYmxvYnxpbWFnaWNrX2dldGltYWdlc2NlbmV8aW1hZ2lja19nZXRpbWFnZXNpZ25hdHVyZXwnICsKICAgICAgICAnaW1hZ2lja19nZXRpbWFnZXNpemV8aW1hZ2lja19nZXRpbWFnZXRpY2tzcGVyc2Vjb25kfGltYWdpY2tfZ2V0aW1hZ2V0b3RhbGlua2RlbnNpdHl8aW1hZ2lja19nZXRpbWFnZXR5cGV8aW1hZ2lja19nZXRpbWFnZXVuaXRzfCcgKwogICAgICAgICdpbWFnaWNrX2dldGltYWdldmlydHVhbHBpeGVsbWV0aG9kfGltYWdpY2tfZ2V0aW1hZ2V3aGl0ZXBvaW50fGltYWdpY2tfZ2V0aW1hZ2V3aWR0aHxpbWFnaWNrX2dldGludGVybGFjZXNjaGVtZXxpbWFnaWNrX2dldGl0ZXJhdG9yaW5kZXh8JyArCiAgICAgICAgJ2ltYWdpY2tfZ2V0bnVtYmVyaW1hZ2VzfGltYWdpY2tfZ2V0b3B0aW9ufGltYWdpY2tfZ2V0cGFja2FnZW5hbWV8aW1hZ2lja19nZXRwYWdlfGltYWdpY2tfZ2V0cGl4ZWxpdGVyYXRvcnxpbWFnaWNrX2dldHBpeGVscmVnaW9uaXRlcmF0b3J8JyArCiAgICAgICAgJ2ltYWdpY2tfZ2V0cG9pbnRzaXplfGltYWdpY2tfZ2V0cXVhbnR1bWRlcHRofGltYWdpY2tfZ2V0cXVhbnR1bXJhbmdlfGltYWdpY2tfZ2V0cmVsZWFzZWRhdGV8aW1hZ2lja19nZXRyZXNvdXJjZXxpbWFnaWNrX2dldHJlc291cmNlbGltaXR8JyArCiAgICAgICAgJ2ltYWdpY2tfZ2V0c2FtcGxpbmdmYWN0b3JzfGltYWdpY2tfZ2V0c2l6ZXxpbWFnaWNrX2dldHNpemVvZmZzZXR8aW1hZ2lja19nZXR2ZXJzaW9ufGltYWdpY2tfaGFzbmV4dGltYWdlfGltYWdpY2tfaGFzcHJldmlvdXNpbWFnZXwnICsKICAgICAgICAnaW1hZ2lja19pZGVudGlmeWltYWdlfGltYWdpY2tfaW1wbG9kZWltYWdlfGltYWdpY2tfbGFiZWxpbWFnZXxpbWFnaWNrX2xldmVsaW1hZ2V8aW1hZ2lja19saW5lYXJzdHJldGNoaW1hZ2V8aW1hZ2lja19saXF1aWRyZXNjYWxlaW1hZ2V8JyArCiAgICAgICAgJ2ltYWdpY2tfbWFnbmlmeWltYWdlfGltYWdpY2tfbWFwaW1hZ2V8aW1hZ2lja19tYXR0ZWZsb29kZmlsbGltYWdlfGltYWdpY2tfbWVkaWFuZmlsdGVyaW1hZ2V8aW1hZ2lja19tZXJnZWltYWdlbGF5ZXJzfGltYWdpY2tfbWluaWZ5aW1hZ2V8JyArCiAgICAgICAgJ2ltYWdpY2tfbW9kdWxhdGVpbWFnZXxpbWFnaWNrX21vbnRhZ2VpbWFnZXxpbWFnaWNrX21vcnBoaW1hZ2VzfGltYWdpY2tfbW9zYWljaW1hZ2VzfGltYWdpY2tfbW90aW9uYmx1cmltYWdlfGltYWdpY2tfbmVnYXRlaW1hZ2V8JyArCiAgICAgICAgJ2ltYWdpY2tfbmV3aW1hZ2V8aW1hZ2lja19uZXdwc2V1ZG9pbWFnZXxpbWFnaWNrX25leHRpbWFnZXxpbWFnaWNrX25vcm1hbGl6ZWltYWdlfGltYWdpY2tfb2lscGFpbnRpbWFnZXxpbWFnaWNrX29wYXF1ZXBhaW50aW1hZ2V8JyArCiAgICAgICAgJ2ltYWdpY2tfb3B0aW1pemVpbWFnZWxheWVyc3xpbWFnaWNrX29yZGVyZWRwb3N0ZXJpemVpbWFnZXxpbWFnaWNrX3BhaW50Zmxvb2RmaWxsaW1hZ2V8aW1hZ2lja19wYWludG9wYXF1ZWltYWdlfCcgKwogICAgICAgICdpbWFnaWNrX3BhaW50dHJhbnNwYXJlbnRpbWFnZXxpbWFnaWNrX3BpbmdpbWFnZXxpbWFnaWNrX3BpbmdpbWFnZWJsb2J8aW1hZ2lja19waW5naW1hZ2VmaWxlfGltYWdpY2tfcG9sYXJvaWRpbWFnZXxpbWFnaWNrX3Bvc3Rlcml6ZWltYWdlfCcgKwogICAgICAgICdpbWFnaWNrX3ByZXZpZXdpbWFnZXN8aW1hZ2lja19wcmV2aW91c2ltYWdlfGltYWdpY2tfcHJvZmlsZWltYWdlfGltYWdpY2tfcXVhbnRpemVpbWFnZXxpbWFnaWNrX3F1YW50aXplaW1hZ2VzfGltYWdpY2tfcXVlcnlmb250bWV0cmljc3wnICsKICAgICAgICAnaW1hZ2lja19xdWVyeWZvbnRzfGltYWdpY2tfcXVlcnlmb3JtYXRzfGltYWdpY2tfcmFkaWFsYmx1cmltYWdlfGltYWdpY2tfcmFpc2VpbWFnZXxpbWFnaWNrX3JhbmRvbXRocmVzaG9sZGltYWdlfGltYWdpY2tfcmVhZGltYWdlfCcgKwogICAgICAgICdpbWFnaWNrX3JlYWRpbWFnZWJsb2J8aW1hZ2lja19yZWFkaW1hZ2VmaWxlfGltYWdpY2tfcmVjb2xvcmltYWdlfGltYWdpY2tfcmVkdWNlbm9pc2VpbWFnZXxpbWFnaWNrX3JlbW92ZWltYWdlfGltYWdpY2tfcmVtb3ZlaW1hZ2Vwcm9maWxlfCcgKwogICAgICAgICdpbWFnaWNrX3JlbmRlcnxpbWFnaWNrX3Jlc2FtcGxlaW1hZ2V8aW1hZ2lja19yZXNldGltYWdlcGFnZXxpbWFnaWNrX3Jlc2l6ZWltYWdlfGltYWdpY2tfcm9sbGltYWdlfGltYWdpY2tfcm90YXRlaW1hZ2V8JyArCiAgICAgICAgJ2ltYWdpY2tfcm91bmRjb3JuZXJzfGltYWdpY2tfc2FtcGxlaW1hZ2V8aW1hZ2lja19zY2FsZWltYWdlfGltYWdpY2tfc2VwYXJhdGVpbWFnZWNoYW5uZWx8aW1hZ2lja19zZXBpYXRvbmVpbWFnZXwnICsKICAgICAgICAnaW1hZ2lja19zZXRiYWNrZ3JvdW5kY29sb3J8aW1hZ2lja19zZXRjb2xvcnNwYWNlfGltYWdpY2tfc2V0Y29tcHJlc3Npb258aW1hZ2lja19zZXRjb21wcmVzc2lvbnF1YWxpdHl8aW1hZ2lja19zZXRmaWxlbmFtZXwnICsKICAgICAgICAnaW1hZ2lja19zZXRmaXJzdGl0ZXJhdG9yfGltYWdpY2tfc2V0Zm9udHxpbWFnaWNrX3NldGZvcm1hdHxpbWFnaWNrX3NldGdyYXZpdHl8aW1hZ2lja19zZXRpbWFnZXxpbWFnaWNrX3NldGltYWdlYWxwaGFjaGFubmVsfCcgKwogICAgICAgICdpbWFnaWNrX3NldGltYWdlYXJ0aWZhY3R8aW1hZ2lja19zZXRpbWFnZWJhY2tncm91bmRjb2xvcnxpbWFnaWNrX3NldGltYWdlYmlhc3xpbWFnaWNrX3NldGltYWdlYmx1ZXByaW1hcnl8aW1hZ2lja19zZXRpbWFnZWJvcmRlcmNvbG9yfCcgKwogICAgICAgICdpbWFnaWNrX3NldGltYWdlY2hhbm5lbGRlcHRofGltYWdpY2tfc2V0aW1hZ2VjbGlwbWFza3xpbWFnaWNrX3NldGltYWdlY29sb3JtYXBjb2xvcnxpbWFnaWNrX3NldGltYWdlY29sb3JzcGFjZXxpbWFnaWNrX3NldGltYWdlY29tcG9zZXwnICsKICAgICAgICAnaW1hZ2lja19zZXRpbWFnZWNvbXByZXNzaW9ufGltYWdpY2tfc2V0aW1hZ2Vjb21wcmVzc2lvbnF1YWxpdHl8aW1hZ2lja19zZXRpbWFnZWRlbGF5fGltYWdpY2tfc2V0aW1hZ2VkZXB0aHxpbWFnaWNrX3NldGltYWdlZGlzcG9zZXwnICsKICAgICAgICAnaW1hZ2lja19zZXRpbWFnZWV4dGVudHxpbWFnaWNrX3NldGltYWdlZmlsZW5hbWV8aW1hZ2lja19zZXRpbWFnZWZvcm1hdHxpbWFnaWNrX3NldGltYWdlZ2FtbWF8aW1hZ2lja19zZXRpbWFnZWdyYXZpdHl8JyArCiAgICAgICAgJ2ltYWdpY2tfc2V0aW1hZ2VncmVlbnByaW1hcnl8aW1hZ2lja19zZXRpbWFnZWluZGV4fGltYWdpY2tfc2V0aW1hZ2VpbnRlcmxhY2VzY2hlbWV8aW1hZ2lja19zZXRpbWFnZWludGVycG9sYXRlbWV0aG9kfCcgKwogICAgICAgICdpbWFnaWNrX3NldGltYWdlaXRlcmF0aW9uc3xpbWFnaWNrX3NldGltYWdlbWF0dGV8aW1hZ2lja19zZXRpbWFnZW1hdHRlY29sb3J8aW1hZ2lja19zZXRpbWFnZW9wYWNpdHl8aW1hZ2lja19zZXRpbWFnZW9yaWVudGF0aW9ufCcgKwogICAgICAgICdpbWFnaWNrX3NldGltYWdlcGFnZXxpbWFnaWNrX3NldGltYWdlcHJvZmlsZXxpbWFnaWNrX3NldGltYWdlcHJvcGVydHl8aW1hZ2lja19zZXRpbWFnZXJlZHByaW1hcnl8aW1hZ2lja19zZXRpbWFnZXJlbmRlcmluZ2ludGVudHwnICsKICAgICAgICAnaW1hZ2lja19zZXRpbWFnZXJlc29sdXRpb258aW1hZ2lja19zZXRpbWFnZXNjZW5lfGltYWdpY2tfc2V0aW1hZ2V0aWNrc3BlcnNlY29uZHxpbWFnaWNrX3NldGltYWdldHlwZXxpbWFnaWNrX3NldGltYWdldW5pdHN8JyArCiAgICAgICAgJ2ltYWdpY2tfc2V0aW1hZ2V2aXJ0dWFscGl4ZWxtZXRob2R8aW1hZ2lja19zZXRpbWFnZXdoaXRlcG9pbnR8aW1hZ2lja19zZXRpbnRlcmxhY2VzY2hlbWV8aW1hZ2lja19zZXRpdGVyYXRvcmluZGV4fGltYWdpY2tfc2V0bGFzdGl0ZXJhdG9yfCcgKwogICAgICAgICdpbWFnaWNrX3NldG9wdGlvbnxpbWFnaWNrX3NldHBhZ2V8aW1hZ2lja19zZXRwb2ludHNpemV8aW1hZ2lja19zZXRyZXNvbHV0aW9ufGltYWdpY2tfc2V0cmVzb3VyY2VsaW1pdHxpbWFnaWNrX3NldHNhbXBsaW5nZmFjdG9yc3wnICsKICAgICAgICAnaW1hZ2lja19zZXRzaXplfGltYWdpY2tfc2V0c2l6ZW9mZnNldHxpbWFnaWNrX3NldHR5cGV8aW1hZ2lja19zaGFkZWltYWdlfGltYWdpY2tfc2hhZG93aW1hZ2V8aW1hZ2lja19zaGFycGVuaW1hZ2V8aW1hZ2lja19zaGF2ZWltYWdlfCcgKwogICAgICAgICdpbWFnaWNrX3NoZWFyaW1hZ2V8aW1hZ2lja19zaWdtb2lkYWxjb250cmFzdGltYWdlfGltYWdpY2tfc2tldGNoaW1hZ2V8aW1hZ2lja19zb2xhcml6ZWltYWdlfGltYWdpY2tfc3BsaWNlaW1hZ2V8aW1hZ2lja19zcHJlYWRpbWFnZXwnICsKICAgICAgICAnaW1hZ2lja19zdGVnYW5vaW1hZ2V8aW1hZ2lja19zdGVyZW9pbWFnZXxpbWFnaWNrX3N0cmlwaW1hZ2V8aW1hZ2lja19zd2lybGltYWdlfGltYWdpY2tfdGV4dHVyZWltYWdlfGltYWdpY2tfdGhyZXNob2xkaW1hZ2V8JyArCiAgICAgICAgJ2ltYWdpY2tfdGh1bWJuYWlsaW1hZ2V8aW1hZ2lja190aW50aW1hZ2V8aW1hZ2lja190cmFuc2Zvcm1pbWFnZXxpbWFnaWNrX3RyYW5zcGFyZW50cGFpbnRpbWFnZXxpbWFnaWNrX3RyYW5zcG9zZWltYWdlfCcgKwogICAgICAgICdpbWFnaWNrX3RyYW5zdmVyc2VpbWFnZXxpbWFnaWNrX3RyaW1pbWFnZXxpbWFnaWNrX3VuaXF1ZWltYWdlY29sb3JzfGltYWdpY2tfdW5zaGFycG1hc2tpbWFnZXxpbWFnaWNrX3ZhbGlkfGltYWdpY2tfdmlnbmV0dGVpbWFnZXwnICsKICAgICAgICAnaW1hZ2lja193YXZlaW1hZ2V8aW1hZ2lja193aGl0ZXRocmVzaG9sZGltYWdlfGltYWdpY2tfd3JpdGVpbWFnZXxpbWFnaWNrX3dyaXRlaW1hZ2VmaWxlfGltYWdpY2tfd3JpdGVpbWFnZXN8aW1hZ2lja193cml0ZWltYWdlc2ZpbGV8JyArCiAgICAgICAgJ2ltYWdpY2tkcmF3fGltYWdpY2tkcmF3X2FmZmluZXxpbWFnaWNrZHJhd19hbm5vdGF0aW9ufGltYWdpY2tkcmF3X2FyY3xpbWFnaWNrZHJhd19iZXppZXJ8aW1hZ2lja2RyYXdfY2lyY2xlfGltYWdpY2tkcmF3X2NsZWFyfCcgKwogICAgICAgICdpbWFnaWNrZHJhd19jbG9uZXxpbWFnaWNrZHJhd19jb2xvcnxpbWFnaWNrZHJhd19jb21tZW50fGltYWdpY2tkcmF3X2NvbXBvc2l0ZXxpbWFnaWNrZHJhd19jb25zdHJ1Y3R8aW1hZ2lja2RyYXdfZGVzdHJveXwnICsKICAgICAgICAnaW1hZ2lja2RyYXdfZWxsaXBzZXxpbWFnaWNrZHJhd19nZXRjbGlwcGF0aHxpbWFnaWNrZHJhd19nZXRjbGlwcnVsZXxpbWFnaWNrZHJhd19nZXRjbGlwdW5pdHN8aW1hZ2lja2RyYXdfZ2V0ZmlsbGNvbG9yfCcgKwogICAgICAgICdpbWFnaWNrZHJhd19nZXRmaWxsb3BhY2l0eXxpbWFnaWNrZHJhd19nZXRmaWxscnVsZXxpbWFnaWNrZHJhd19nZXRmb250fGltYWdpY2tkcmF3X2dldGZvbnRmYW1pbHl8aW1hZ2lja2RyYXdfZ2V0Zm9udHNpemV8JyArCiAgICAgICAgJ2ltYWdpY2tkcmF3X2dldGZvbnRzdHlsZXxpbWFnaWNrZHJhd19nZXRmb250d2VpZ2h0fGltYWdpY2tkcmF3X2dldGdyYXZpdHl8aW1hZ2lja2RyYXdfZ2V0c3Ryb2tlYW50aWFsaWFzfGltYWdpY2tkcmF3X2dldHN0cm9rZWNvbG9yfCcgKwogICAgICAgICdpbWFnaWNrZHJhd19nZXRzdHJva2VkYXNoYXJyYXl8aW1hZ2lja2RyYXdfZ2V0c3Ryb2tlZGFzaG9mZnNldHxpbWFnaWNrZHJhd19nZXRzdHJva2VsaW5lY2FwfGltYWdpY2tkcmF3X2dldHN0cm9rZWxpbmVqb2lufCcgKwogICAgICAgICdpbWFnaWNrZHJhd19nZXRzdHJva2VtaXRlcmxpbWl0fGltYWdpY2tkcmF3X2dldHN0cm9rZW9wYWNpdHl8aW1hZ2lja2RyYXdfZ2V0c3Ryb2tld2lkdGh8aW1hZ2lja2RyYXdfZ2V0dGV4dGFsaWdubWVudHwnICsKICAgICAgICAnaW1hZ2lja2RyYXdfZ2V0dGV4dGFudGlhbGlhc3xpbWFnaWNrZHJhd19nZXR0ZXh0ZGVjb3JhdGlvbnxpbWFnaWNrZHJhd19nZXR0ZXh0ZW5jb2Rpbmd8aW1hZ2lja2RyYXdfZ2V0dGV4dHVuZGVyY29sb3J8JyArCiAgICAgICAgJ2ltYWdpY2tkcmF3X2dldHZlY3RvcmdyYXBoaWNzfGltYWdpY2tkcmF3X2xpbmV8aW1hZ2lja2RyYXdfbWF0dGV8aW1hZ2lja2RyYXdfcGF0aGNsb3NlfGltYWdpY2tkcmF3X3BhdGhjdXJ2ZXRvYWJzb2x1dGV8JyArCiAgICAgICAgJ2ltYWdpY2tkcmF3X3BhdGhjdXJ2ZXRvcXVhZHJhdGljYmV6aWVyYWJzb2x1dGV8aW1hZ2lja2RyYXdfcGF0aGN1cnZldG9xdWFkcmF0aWNiZXppZXJyZWxhdGl2ZXwnICsKICAgICAgICAnaW1hZ2lja2RyYXdfcGF0aGN1cnZldG9xdWFkcmF0aWNiZXppZXJzbW9vdGhhYnNvbHV0ZXxpbWFnaWNrZHJhd19wYXRoY3VydmV0b3F1YWRyYXRpY2JlemllcnNtb290aHJlbGF0aXZlfGltYWdpY2tkcmF3X3BhdGhjdXJ2ZXRvcmVsYXRpdmV8JyArCiAgICAgICAgJ2ltYWdpY2tkcmF3X3BhdGhjdXJ2ZXRvc21vb3RoYWJzb2x1dGV8aW1hZ2lja2RyYXdfcGF0aGN1cnZldG9zbW9vdGhyZWxhdGl2ZXxpbWFnaWNrZHJhd19wYXRoZWxsaXB0aWNhcmNhYnNvbHV0ZXwnICsKICAgICAgICAnaW1hZ2lja2RyYXdfcGF0aGVsbGlwdGljYXJjcmVsYXRpdmV8aW1hZ2lja2RyYXdfcGF0aGZpbmlzaHxpbWFnaWNrZHJhd19wYXRobGluZXRvYWJzb2x1dGV8aW1hZ2lja2RyYXdfcGF0aGxpbmV0b2hvcml6b250YWxhYnNvbHV0ZXwnICsKICAgICAgICAnaW1hZ2lja2RyYXdfcGF0aGxpbmV0b2hvcml6b250YWxyZWxhdGl2ZXxpbWFnaWNrZHJhd19wYXRobGluZXRvcmVsYXRpdmV8aW1hZ2lja2RyYXdfcGF0aGxpbmV0b3ZlcnRpY2FsYWJzb2x1dGV8JyArCiAgICAgICAgJ2ltYWdpY2tkcmF3X3BhdGhsaW5ldG92ZXJ0aWNhbHJlbGF0aXZlfGltYWdpY2tkcmF3X3BhdGhtb3ZldG9hYnNvbHV0ZXxpbWFnaWNrZHJhd19wYXRobW92ZXRvcmVsYXRpdmV8aW1hZ2lja2RyYXdfcGF0aHN0YXJ0fCcgKwogICAgICAgICdpbWFnaWNrZHJhd19wb2ludHxpbWFnaWNrZHJhd19wb2x5Z29ufGltYWdpY2tkcmF3X3BvbHlsaW5lfGltYWdpY2tkcmF3X3BvcHxpbWFnaWNrZHJhd19wb3BjbGlwcGF0aHxpbWFnaWNrZHJhd19wb3BkZWZzfCcgKwogICAgICAgICdpbWFnaWNrZHJhd19wb3BwYXR0ZXJufGltYWdpY2tkcmF3X3B1c2h8aW1hZ2lja2RyYXdfcHVzaGNsaXBwYXRofGltYWdpY2tkcmF3X3B1c2hkZWZzfGltYWdpY2tkcmF3X3B1c2hwYXR0ZXJufGltYWdpY2tkcmF3X3JlY3RhbmdsZXwnICsKICAgICAgICAnaW1hZ2lja2RyYXdfcmVuZGVyfGltYWdpY2tkcmF3X3JvdGF0ZXxpbWFnaWNrZHJhd19yb3VuZHJlY3RhbmdsZXxpbWFnaWNrZHJhd19zY2FsZXxpbWFnaWNrZHJhd19zZXRjbGlwcGF0aHxpbWFnaWNrZHJhd19zZXRjbGlwcnVsZXwnICsKICAgICAgICAnaW1hZ2lja2RyYXdfc2V0Y2xpcHVuaXRzfGltYWdpY2tkcmF3X3NldGZpbGxhbHBoYXxpbWFnaWNrZHJhd19zZXRmaWxsY29sb3J8aW1hZ2lja2RyYXdfc2V0ZmlsbG9wYWNpdHl8aW1hZ2lja2RyYXdfc2V0ZmlsbHBhdHRlcm51cmx8JyArCiAgICAgICAgJ2ltYWdpY2tkcmF3X3NldGZpbGxydWxlfGltYWdpY2tkcmF3X3NldGZvbnR8aW1hZ2lja2RyYXdfc2V0Zm9udGZhbWlseXxpbWFnaWNrZHJhd19zZXRmb250c2l6ZXxpbWFnaWNrZHJhd19zZXRmb250c3RyZXRjaHwnICsKICAgICAgICAnaW1hZ2lja2RyYXdfc2V0Zm9udHN0eWxlfGltYWdpY2tkcmF3X3NldGZvbnR3ZWlnaHR8aW1hZ2lja2RyYXdfc2V0Z3Jhdml0eXxpbWFnaWNrZHJhd19zZXRzdHJva2VhbHBoYXxpbWFnaWNrZHJhd19zZXRzdHJva2VhbnRpYWxpYXN8JyArCiAgICAgICAgJ2ltYWdpY2tkcmF3X3NldHN0cm9rZWNvbG9yfGltYWdpY2tkcmF3X3NldHN0cm9rZWRhc2hhcnJheXxpbWFnaWNrZHJhd19zZXRzdHJva2VkYXNob2Zmc2V0fGltYWdpY2tkcmF3X3NldHN0cm9rZWxpbmVjYXB8JyArCiAgICAgICAgJ2ltYWdpY2tkcmF3X3NldHN0cm9rZWxpbmVqb2lufGltYWdpY2tkcmF3X3NldHN0cm9rZW1pdGVybGltaXR8aW1hZ2lja2RyYXdfc2V0c3Ryb2tlb3BhY2l0eXxpbWFnaWNrZHJhd19zZXRzdHJva2VwYXR0ZXJudXJsfCcgKwogICAgICAgICdpbWFnaWNrZHJhd19zZXRzdHJva2V3aWR0aHxpbWFnaWNrZHJhd19zZXR0ZXh0YWxpZ25tZW50fGltYWdpY2tkcmF3X3NldHRleHRhbnRpYWxpYXN8aW1hZ2lja2RyYXdfc2V0dGV4dGRlY29yYXRpb258JyArCiAgICAgICAgJ2ltYWdpY2tkcmF3X3NldHRleHRlbmNvZGluZ3xpbWFnaWNrZHJhd19zZXR0ZXh0dW5kZXJjb2xvcnxpbWFnaWNrZHJhd19zZXR2ZWN0b3JncmFwaGljc3xpbWFnaWNrZHJhd19zZXR2aWV3Ym94fGltYWdpY2tkcmF3X3NrZXd4fCcgKwogICAgICAgICdpbWFnaWNrZHJhd19za2V3eXxpbWFnaWNrZHJhd190cmFuc2xhdGV8aW1hZ2lja3BpeGVsfGltYWdpY2twaXhlbF9jbGVhcnxpbWFnaWNrcGl4ZWxfY29uc3RydWN0fGltYWdpY2twaXhlbF9kZXN0cm95fGltYWdpY2twaXhlbF9nZXRjb2xvcnwnICsKICAgICAgICAnaW1hZ2lja3BpeGVsX2dldGNvbG9yYXNzdHJpbmd8aW1hZ2lja3BpeGVsX2dldGNvbG9yY291bnR8aW1hZ2lja3BpeGVsX2dldGNvbG9ydmFsdWV8aW1hZ2lja3BpeGVsX2dldGhzbHxpbWFnaWNrcGl4ZWxfaXNzaW1pbGFyfCcgKwogICAgICAgICdpbWFnaWNrcGl4ZWxfc2V0Y29sb3J8aW1hZ2lja3BpeGVsX3NldGNvbG9ydmFsdWV8aW1hZ2lja3BpeGVsX3NldGhzbHxpbWFnaWNrcGl4ZWxpdGVyYXRvcnxpbWFnaWNrcGl4ZWxpdGVyYXRvcl9jbGVhcnwnICsKICAgICAgICAnaW1hZ2lja3BpeGVsaXRlcmF0b3JfY29uc3RydWN0fGltYWdpY2twaXhlbGl0ZXJhdG9yX2Rlc3Ryb3l8aW1hZ2lja3BpeGVsaXRlcmF0b3JfZ2V0Y3VycmVudGl0ZXJhdG9ycm93fCcgKwogICAgICAgICdpbWFnaWNrcGl4ZWxpdGVyYXRvcl9nZXRpdGVyYXRvcnJvd3xpbWFnaWNrcGl4ZWxpdGVyYXRvcl9nZXRuZXh0aXRlcmF0b3Jyb3d8aW1hZ2lja3BpeGVsaXRlcmF0b3JfZ2V0cHJldmlvdXNpdGVyYXRvcnJvd3wnICsKICAgICAgICAnaW1hZ2lja3BpeGVsaXRlcmF0b3JfbmV3cGl4ZWxpdGVyYXRvcnxpbWFnaWNrcGl4ZWxpdGVyYXRvcl9uZXdwaXhlbHJlZ2lvbml0ZXJhdG9yfGltYWdpY2twaXhlbGl0ZXJhdG9yX3Jlc2V0aXRlcmF0b3J8JyArCiAgICAgICAgJ2ltYWdpY2twaXhlbGl0ZXJhdG9yX3NldGl0ZXJhdG9yZmlyc3Ryb3d8aW1hZ2lja3BpeGVsaXRlcmF0b3Jfc2V0aXRlcmF0b3JsYXN0cm93fGltYWdpY2twaXhlbGl0ZXJhdG9yX3NldGl0ZXJhdG9ycm93fCcgKwogICAgICAgICdpbWFnaWNrcGl4ZWxpdGVyYXRvcl9zeW5jaXRlcmF0b3J8aW1hcF84Yml0fGltYXBfYWxlcnRzfGltYXBfYXBwZW5kfGltYXBfYmFzZTY0fGltYXBfYmluYXJ5fGltYXBfYm9keXxpbWFwX2JvZHlzdHJ1Y3R8aW1hcF9jaGVja3wnICsKICAgICAgICAnaW1hcF9jbGVhcmZsYWdfZnVsbHxpbWFwX2Nsb3NlfGltYXBfY3JlYXRlfGltYXBfY3JlYXRlbWFpbGJveHxpbWFwX2RlbGV0ZXxpbWFwX2RlbGV0ZW1haWxib3h8aW1hcF9lcnJvcnN8aW1hcF9leHB1bmdlfGltYXBfZmV0Y2hfb3ZlcnZpZXd8JyArCiAgICAgICAgJ2ltYXBfZmV0Y2hib2R5fGltYXBfZmV0Y2hoZWFkZXJ8aW1hcF9mZXRjaG1pbWV8aW1hcF9mZXRjaHN0cnVjdHVyZXxpbWFwX2ZldGNodGV4dHxpbWFwX2djfGltYXBfZ2V0X3F1b3RhfGltYXBfZ2V0X3F1b3Rhcm9vdHxpbWFwX2dldGFjbHwnICsKICAgICAgICAnaW1hcF9nZXRtYWlsYm94ZXN8aW1hcF9nZXRzdWJzY3JpYmVkfGltYXBfaGVhZGVyfGltYXBfaGVhZGVyaW5mb3xpbWFwX2hlYWRlcnN8aW1hcF9sYXN0X2Vycm9yfGltYXBfbGlzdHxpbWFwX2xpc3RtYWlsYm94fGltYXBfbGlzdHNjYW58JyArCiAgICAgICAgJ2ltYXBfbGlzdHN1YnNjcmliZWR8aW1hcF9sc3VifGltYXBfbWFpbHxpbWFwX21haWxfY29tcG9zZXxpbWFwX21haWxfY29weXxpbWFwX21haWxfbW92ZXxpbWFwX21haWxib3htc2dpbmZvfGltYXBfbWltZV9oZWFkZXJfZGVjb2RlfCcgKwogICAgICAgICdpbWFwX21zZ25vfGltYXBfbnVtX21zZ3xpbWFwX251bV9yZWNlbnR8aW1hcF9vcGVufGltYXBfcGluZ3xpbWFwX3FwcmludHxpbWFwX3JlbmFtZXxpbWFwX3JlbmFtZW1haWxib3h8aW1hcF9yZW9wZW58JyArCiAgICAgICAgJ2ltYXBfcmZjODIyX3BhcnNlX2Fkcmxpc3R8aW1hcF9yZmM4MjJfcGFyc2VfaGVhZGVyc3xpbWFwX3JmYzgyMl93cml0ZV9hZGRyZXNzfGltYXBfc2F2ZWJvZHl8aW1hcF9zY2FufGltYXBfc2Nhbm1haWxib3h8aW1hcF9zZWFyY2h8JyArCiAgICAgICAgJ2ltYXBfc2V0X3F1b3RhfGltYXBfc2V0YWNsfGltYXBfc2V0ZmxhZ19mdWxsfGltYXBfc29ydHxpbWFwX3N0YXR1c3xpbWFwX3N1YnNjcmliZXxpbWFwX3RocmVhZHxpbWFwX3RpbWVvdXR8aW1hcF91aWR8aW1hcF91bmRlbGV0ZXwnICsKICAgICAgICAnaW1hcF91bnN1YnNjcmliZXxpbWFwX3V0ZjdfZGVjb2RlfGltYXBfdXRmN19lbmNvZGV8aW1hcF91dGY4fGltcGxlbWVudHNpbnRlcmZhY2V8aW1wbG9kZXxpbXBvcnRfcmVxdWVzdF92YXJpYWJsZXN8aW5fYXJyYXl8aW5jbHVkZXwnICsKICAgICAgICAnaW5jbHVkZV9vbmNlfGluY2x1ZWRfZ2V0X2RhdGF8aW5ldF9udG9wfGluZXRfcHRvbnxpbmZpbml0ZWl0ZXJhdG9yfGluZ3Jlc19hdXRvY29tbWl0fGluZ3Jlc19hdXRvY29tbWl0X3N0YXRlfGluZ3Jlc19jaGFyc2V0fGluZ3Jlc19jbG9zZXwnICsKICAgICAgICAnaW5ncmVzX2NvbW1pdHxpbmdyZXNfY29ubmVjdHxpbmdyZXNfY3Vyc29yfGluZ3Jlc19lcnJub3xpbmdyZXNfZXJyb3J8aW5ncmVzX2VycnNxbHN0YXRlfGluZ3Jlc19lc2NhcGVfc3RyaW5nfGluZ3Jlc19leGVjdXRlfCcgKwogICAgICAgICdpbmdyZXNfZmV0Y2hfYXJyYXl8aW5ncmVzX2ZldGNoX2Fzc29jfGluZ3Jlc19mZXRjaF9vYmplY3R8aW5ncmVzX2ZldGNoX3Byb2NfcmV0dXJufGluZ3Jlc19mZXRjaF9yb3d8aW5ncmVzX2ZpZWxkX2xlbmd0aHxpbmdyZXNfZmllbGRfbmFtZXwnICsKICAgICAgICAnaW5ncmVzX2ZpZWxkX251bGxhYmxlfGluZ3Jlc19maWVsZF9wcmVjaXNpb258aW5ncmVzX2ZpZWxkX3NjYWxlfGluZ3Jlc19maWVsZF90eXBlfGluZ3Jlc19mcmVlX3Jlc3VsdHxpbmdyZXNfbmV4dF9lcnJvcnxpbmdyZXNfbnVtX2ZpZWxkc3wnICsKICAgICAgICAnaW5ncmVzX251bV9yb3dzfGluZ3Jlc19wY29ubmVjdHxpbmdyZXNfcHJlcGFyZXxpbmdyZXNfcXVlcnl8aW5ncmVzX3Jlc3VsdF9zZWVrfGluZ3Jlc19yb2xsYmFja3xpbmdyZXNfc2V0X2Vudmlyb25tZW50fCcgKwogICAgICAgICdpbmdyZXNfdW5idWZmZXJlZF9xdWVyeXxpbmlfYWx0ZXJ8aW5pX2dldHxpbmlfZ2V0X2FsbHxpbmlfcmVzdG9yZXxpbmlfc2V0fGlubmFtZXNwYWNlfGlub3RpZnlfYWRkX3dhdGNofGlub3RpZnlfaW5pdHxpbm90aWZ5X3F1ZXVlX2xlbnwnICsKICAgICAgICAnaW5vdGlmeV9yZWFkfGlub3RpZnlfcm1fd2F0Y2h8aW50ZXJmYWNlX2V4aXN0c3xpbnRsX2Vycm9yX25hbWV8aW50bF9nZXRfZXJyb3JfY29kZXxpbnRsX2dldF9lcnJvcl9tZXNzYWdlfGludGxfaXNfZmFpbHVyZXwnICsKICAgICAgICAnaW50bGRhdGVmb3JtYXR0ZXJ8aW50dmFsfGludmFsaWRhcmd1bWVudGV4Y2VwdGlvbnxpbnZva2V8aW52b2tlYXJnc3xpcDJsb25nfGlwdGNlbWJlZHxpcHRjcGFyc2V8aXNfYXxpc19hcnJheXxpc19ib29sfGlzX2NhbGxhYmxlfGlzX2RpcnwnICsKICAgICAgICAnaXNfZG91YmxlfGlzX2V4ZWN1dGFibGV8aXNfZmlsZXxpc19maW5pdGV8aXNfZmxvYXR8aXNfaW5maW5pdGV8aXNfaW50fGlzX2ludGVnZXJ8aXNfbGlua3xpc19sb25nfGlzX25hbnxpc19udWxsfGlzX251bWVyaWN8aXNfb2JqZWN0fCcgKwogICAgICAgICdpc19yZWFkYWJsZXxpc19yZWFsfGlzX3Jlc291cmNlfGlzX3NjYWxhcnxpc19zb2FwX2ZhdWx0fGlzX3N0cmluZ3xpc19zdWJjbGFzc19vZnxpc191cGxvYWRlZF9maWxlfGlzX3dyaXRhYmxlfGlzX3dyaXRlYWJsZXxpc2Fic3RyYWN0fCcgKwogICAgICAgICdpc2Nsb25lYWJsZXxpc2Rpc2FibGVkfGlzZmluYWx8aXNpbnN0YW5jZXxpc2luc3RhbnRpYWJsZXxpc2ludGVyZmFjZXxpc2ludGVybmFsfGlzaXRlcmF0ZWFibGV8aXNzZXR8aXNzdWJjbGFzc29mfGlzdXNlcmRlZmluZWR8aXRlcmF0b3J8JyArCiAgICAgICAgJ2l0ZXJhdG9yX2FwcGx5fGl0ZXJhdG9yX2NvdW50fGl0ZXJhdG9yX3RvX2FycmF5fGl0ZXJhdG9yYWdncmVnYXRlfGl0ZXJhdG9yaXRlcmF0b3J8amF2YV9sYXN0X2V4Y2VwdGlvbl9jbGVhcnxqYXZhX2xhc3RfZXhjZXB0aW9uX2dldHwnICsKICAgICAgICAnamRkYXlvZndlZWt8amRtb250aG5hbWV8amR0b2ZyZW5jaHxqZHRvZ3JlZ29yaWFufGpkdG9qZXdpc2h8amR0b2p1bGlhbnxqZHRvdW5peHxqZXdpc2h0b2pkfGpvaW58anBlZzJ3Ym1wfGpzb25fZGVjb2RlfGpzb25fZW5jb2RlfCcgKwogICAgICAgICdqc29uX2xhc3RfZXJyb3J8anNvbnNlcmlhbGl6YWJsZXxqdWR5fGp1ZHlfdHlwZXxqdWR5X3ZlcnNpb258anVsaWFudG9qZHxrYWRtNV9jaHBhc3NfcHJpbmNpcGFsfGthZG01X2NyZWF0ZV9wcmluY2lwYWx8JyArCiAgICAgICAgJ2thZG01X2RlbGV0ZV9wcmluY2lwYWx8a2FkbTVfZGVzdHJveXxrYWRtNV9mbHVzaHxrYWRtNV9nZXRfcG9saWNpZXN8a2FkbTVfZ2V0X3ByaW5jaXBhbHxrYWRtNV9nZXRfcHJpbmNpcGFsc3xrYWRtNV9pbml0X3dpdGhfcGFzc3dvcmR8JyArCiAgICAgICAgJ2thZG01X21vZGlmeV9wcmluY2lwYWx8a2V5fGtyc29ydHxrc29ydHxsY2ZpcnN0fGxjZ192YWx1ZXxsY2hncnB8bGNob3dufGxkYXBfODg1OV90b190NjF8bGRhcF9hZGR8bGRhcF9iaW5kfGxkYXBfY2xvc2V8bGRhcF9jb21wYXJlfCcgKwogICAgICAgICdsZGFwX2Nvbm5lY3R8bGRhcF9jb3VudF9lbnRyaWVzfGxkYXBfZGVsZXRlfGxkYXBfZG4ydWZufGxkYXBfZXJyMnN0cnxsZGFwX2Vycm5vfGxkYXBfZXJyb3J8bGRhcF9leHBsb2RlX2RufGxkYXBfZmlyc3RfYXR0cmlidXRlfCcgKwogICAgICAgICdsZGFwX2ZpcnN0X2VudHJ5fGxkYXBfZmlyc3RfcmVmZXJlbmNlfGxkYXBfZnJlZV9yZXN1bHR8bGRhcF9nZXRfYXR0cmlidXRlc3xsZGFwX2dldF9kbnxsZGFwX2dldF9lbnRyaWVzfGxkYXBfZ2V0X29wdGlvbnxsZGFwX2dldF92YWx1ZXN8JyArCiAgICAgICAgJ2xkYXBfZ2V0X3ZhbHVlc19sZW58bGRhcF9saXN0fGxkYXBfbW9kX2FkZHxsZGFwX21vZF9kZWx8bGRhcF9tb2RfcmVwbGFjZXxsZGFwX21vZGlmeXxsZGFwX25leHRfYXR0cmlidXRlfGxkYXBfbmV4dF9lbnRyeXwnICsKICAgICAgICAnbGRhcF9uZXh0X3JlZmVyZW5jZXxsZGFwX3BhcnNlX3JlZmVyZW5jZXxsZGFwX3BhcnNlX3Jlc3VsdHxsZGFwX3JlYWR8bGRhcF9yZW5hbWV8bGRhcF9zYXNsX2JpbmR8bGRhcF9zZWFyY2h8bGRhcF9zZXRfb3B0aW9ufCcgKwogICAgICAgICdsZGFwX3NldF9yZWJpbmRfcHJvY3xsZGFwX3NvcnR8bGRhcF9zdGFydF90bHN8bGRhcF90NjFfdG9fODg1OXxsZGFwX3VuYmluZHxsZW5ndGhleGNlcHRpb258bGV2ZW5zaHRlaW58bGlieG1sX2NsZWFyX2Vycm9yc3wnICsKICAgICAgICAnbGlieG1sX2Rpc2FibGVfZW50aXR5X2xvYWRlcnxsaWJ4bWxfZ2V0X2Vycm9yc3xsaWJ4bWxfZ2V0X2xhc3RfZXJyb3J8bGlieG1sX3NldF9zdHJlYW1zX2NvbnRleHR8bGlieG1sX3VzZV9pbnRlcm5hbF9lcnJvcnN8bGlieG1sZXJyb3J8JyArCiAgICAgICAgJ2xpbWl0aXRlcmF0b3J8bGlua3xsaW5raW5mb3xsaXN0fGxvY2FsZXxsb2NhbGVjb252fGxvY2FsdGltZXxsb2d8bG9nMTB8bG9nMXB8bG9naWNleGNlcHRpb258bG9uZzJpcHxsc3RhdHxsdHJpbXxsemZfY29tcHJlc3N8JyArCiAgICAgICAgJ2x6Zl9kZWNvbXByZXNzfGx6Zl9vcHRpbWl6ZWRfZm9yfG1fY2hlY2tzdGF0dXN8bV9jb21wbGV0ZWF1dGhvcml6YXRpb25zfG1fY29ubmVjdHxtX2Nvbm5lY3Rpb25lcnJvcnxtX2RlbGV0ZXRyYW5zfG1fZGVzdHJveWNvbm58JyArCiAgICAgICAgJ21fZGVzdHJveWVuZ2luZXxtX2dldGNlbGx8bV9nZXRjZWxsYnludW18bV9nZXRjb21tYWRlbGltaXRlZHxtX2dldGhlYWRlcnxtX2luaXRjb25ufG1faW5pdGVuZ2luZXxtX2lzY29tbWFkZWxpbWl0ZWR8bV9tYXhjb25udGltZW91dHwnICsKICAgICAgICAnbV9tb25pdG9yfG1fbnVtY29sdW1uc3xtX251bXJvd3N8bV9wYXJzZWNvbW1hZGVsaW1pdGVkfG1fcmVzcG9uc2VrZXlzfG1fcmVzcG9uc2VwYXJhbXxtX3JldHVybnN0YXR1c3xtX3NldGJsb2NraW5nfG1fc2V0ZHJvcGZpbGV8bV9zZXRpcHwnICsKICAgICAgICAnbV9zZXRzc2x8bV9zZXRzc2xfY2FmaWxlfG1fc2V0c3NsX2ZpbGVzfG1fc2V0dGltZW91dHxtX3NzbGNlcnRfZ2VuX2hhc2h8bV90cmFuc2FjdGlvbnNzZW50fG1fdHJhbnNpbnF1ZXVlfG1fdHJhbnNrZXl2YWx8bV90cmFuc25ld3wnICsKICAgICAgICAnbV90cmFuc3NlbmR8bV91d2FpdHxtX3ZhbGlkYXRlaWRlbnRpZmllcnxtX3ZlcmlmeWNvbm5lY3Rpb258bV92ZXJpZnlzc2xjZXJ0fG1hZ2ljX3F1b3Rlc19ydW50aW1lfG1haWx8JyArCiAgICAgICAgJ21haWxwYXJzZV9kZXRlcm1pbmVfYmVzdF94ZmVyX2VuY29kaW5nfG1haWxwYXJzZV9tc2dfY3JlYXRlfG1haWxwYXJzZV9tc2dfZXh0cmFjdF9wYXJ0fG1haWxwYXJzZV9tc2dfZXh0cmFjdF9wYXJ0X2ZpbGV8JyArCiAgICAgICAgJ21haWxwYXJzZV9tc2dfZXh0cmFjdF93aG9sZV9wYXJ0X2ZpbGV8bWFpbHBhcnNlX21zZ19mcmVlfG1haWxwYXJzZV9tc2dfZ2V0X3BhcnR8bWFpbHBhcnNlX21zZ19nZXRfcGFydF9kYXRhfG1haWxwYXJzZV9tc2dfZ2V0X3N0cnVjdHVyZXwnICsKICAgICAgICAnbWFpbHBhcnNlX21zZ19wYXJzZXxtYWlscGFyc2VfbXNnX3BhcnNlX2ZpbGV8bWFpbHBhcnNlX3JmYzgyMl9wYXJzZV9hZGRyZXNzZXN8bWFpbHBhcnNlX3N0cmVhbV9lbmNvZGV8bWFpbHBhcnNlX3V1ZGVjb2RlX2FsbHxtYWlufG1heHwnICsKICAgICAgICAnbWF4ZGJfYWZmZWN0ZWRfcm93c3xtYXhkYl9hdXRvY29tbWl0fG1heGRiX2JpbmRfcGFyYW18bWF4ZGJfYmluZF9yZXN1bHR8bWF4ZGJfY2hhbmdlX3VzZXJ8bWF4ZGJfY2hhcmFjdGVyX3NldF9uYW1lfG1heGRiX2NsaWVudF9lbmNvZGluZ3wnICsKICAgICAgICAnbWF4ZGJfY2xvc2V8bWF4ZGJfY2xvc2VfbG9uZ19kYXRhfG1heGRiX2NvbW1pdHxtYXhkYl9jb25uZWN0fG1heGRiX2Nvbm5lY3RfZXJybm98bWF4ZGJfY29ubmVjdF9lcnJvcnxtYXhkYl9kYXRhX3NlZWt8bWF4ZGJfZGVidWd8JyArCiAgICAgICAgJ21heGRiX2Rpc2FibGVfcmVhZHNfZnJvbV9tYXN0ZXJ8bWF4ZGJfZGlzYWJsZV9ycGxfcGFyc2V8bWF4ZGJfZHVtcF9kZWJ1Z19pbmZvfG1heGRiX2VtYmVkZGVkX2Nvbm5lY3R8bWF4ZGJfZW5hYmxlX3JlYWRzX2Zyb21fbWFzdGVyfCcgKwogICAgICAgICdtYXhkYl9lbmFibGVfcnBsX3BhcnNlfG1heGRiX2Vycm5vfG1heGRiX2Vycm9yfG1heGRiX2VzY2FwZV9zdHJpbmd8bWF4ZGJfZXhlY3V0ZXxtYXhkYl9mZXRjaHxtYXhkYl9mZXRjaF9hcnJheXxtYXhkYl9mZXRjaF9hc3NvY3wnICsKICAgICAgICAnbWF4ZGJfZmV0Y2hfZmllbGR8bWF4ZGJfZmV0Y2hfZmllbGRfZGlyZWN0fG1heGRiX2ZldGNoX2ZpZWxkc3xtYXhkYl9mZXRjaF9sZW5ndGhzfG1heGRiX2ZldGNoX29iamVjdHxtYXhkYl9mZXRjaF9yb3d8bWF4ZGJfZmllbGRfY291bnR8JyArCiAgICAgICAgJ21heGRiX2ZpZWxkX3NlZWt8bWF4ZGJfZmllbGRfdGVsbHxtYXhkYl9mcmVlX3Jlc3VsdHxtYXhkYl9nZXRfY2xpZW50X2luZm98bWF4ZGJfZ2V0X2NsaWVudF92ZXJzaW9ufG1heGRiX2dldF9ob3N0X2luZm98bWF4ZGJfZ2V0X21ldGFkYXRhfCcgKwogICAgICAgICdtYXhkYl9nZXRfcHJvdG9faW5mb3xtYXhkYl9nZXRfc2VydmVyX2luZm98bWF4ZGJfZ2V0X3NlcnZlcl92ZXJzaW9ufG1heGRiX2luZm98bWF4ZGJfaW5pdHxtYXhkYl9pbnNlcnRfaWR8bWF4ZGJfa2lsbHxtYXhkYl9tYXN0ZXJfcXVlcnl8JyArCiAgICAgICAgJ21heGRiX21vcmVfcmVzdWx0c3xtYXhkYl9tdWx0aV9xdWVyeXxtYXhkYl9uZXh0X3Jlc3VsdHxtYXhkYl9udW1fZmllbGRzfG1heGRiX251bV9yb3dzfG1heGRiX29wdGlvbnN8bWF4ZGJfcGFyYW1fY291bnR8bWF4ZGJfcGluZ3wnICsKICAgICAgICAnbWF4ZGJfcHJlcGFyZXxtYXhkYl9xdWVyeXxtYXhkYl9yZWFsX2Nvbm5lY3R8bWF4ZGJfcmVhbF9lc2NhcGVfc3RyaW5nfG1heGRiX3JlYWxfcXVlcnl8bWF4ZGJfcmVwb3J0fG1heGRiX3JvbGxiYWNrfCcgKwogICAgICAgICdtYXhkYl9ycGxfcGFyc2VfZW5hYmxlZHxtYXhkYl9ycGxfcHJvYmV8bWF4ZGJfcnBsX3F1ZXJ5X3R5cGV8bWF4ZGJfc2VsZWN0X2RifG1heGRiX3NlbmRfbG9uZ19kYXRhfG1heGRiX3NlbmRfcXVlcnl8bWF4ZGJfc2VydmVyX2VuZHwnICsKICAgICAgICAnbWF4ZGJfc2VydmVyX2luaXR8bWF4ZGJfc2V0X29wdHxtYXhkYl9zcWxzdGF0ZXxtYXhkYl9zc2xfc2V0fG1heGRiX3N0YXR8bWF4ZGJfc3RtdF9hZmZlY3RlZF9yb3dzfG1heGRiX3N0bXRfYmluZF9wYXJhbXwnICsKICAgICAgICAnbWF4ZGJfc3RtdF9iaW5kX3Jlc3VsdHxtYXhkYl9zdG10X2Nsb3NlfG1heGRiX3N0bXRfY2xvc2VfbG9uZ19kYXRhfG1heGRiX3N0bXRfZGF0YV9zZWVrfG1heGRiX3N0bXRfZXJybm98bWF4ZGJfc3RtdF9lcnJvcnwnICsKICAgICAgICAnbWF4ZGJfc3RtdF9leGVjdXRlfG1heGRiX3N0bXRfZmV0Y2h8bWF4ZGJfc3RtdF9mcmVlX3Jlc3VsdHxtYXhkYl9zdG10X2luaXR8bWF4ZGJfc3RtdF9udW1fcm93c3xtYXhkYl9zdG10X3BhcmFtX2NvdW50fG1heGRiX3N0bXRfcHJlcGFyZXwnICsKICAgICAgICAnbWF4ZGJfc3RtdF9yZXNldHxtYXhkYl9zdG10X3Jlc3VsdF9tZXRhZGF0YXxtYXhkYl9zdG10X3NlbmRfbG9uZ19kYXRhfG1heGRiX3N0bXRfc3Fsc3RhdGV8bWF4ZGJfc3RtdF9zdG9yZV9yZXN1bHR8bWF4ZGJfc3RvcmVfcmVzdWx0fCcgKwogICAgICAgICdtYXhkYl90aHJlYWRfaWR8bWF4ZGJfdGhyZWFkX3NhZmV8bWF4ZGJfdXNlX3Jlc3VsdHxtYXhkYl93YXJuaW5nX2NvdW50fG1iX2NoZWNrX2VuY29kaW5nfG1iX2NvbnZlcnRfY2FzZXxtYl9jb252ZXJ0X2VuY29kaW5nfCcgKwogICAgICAgICdtYl9jb252ZXJ0X2thbmF8bWJfY29udmVydF92YXJpYWJsZXN8bWJfZGVjb2RlX21pbWVoZWFkZXJ8bWJfZGVjb2RlX251bWVyaWNlbnRpdHl8bWJfZGV0ZWN0X2VuY29kaW5nfG1iX2RldGVjdF9vcmRlcnxtYl9lbmNvZGVfbWltZWhlYWRlcnwnICsKICAgICAgICAnbWJfZW5jb2RlX251bWVyaWNlbnRpdHl8bWJfZW5jb2RpbmdfYWxpYXNlc3xtYl9lcmVnfG1iX2VyZWdfbWF0Y2h8bWJfZXJlZ19yZXBsYWNlfG1iX2VyZWdfc2VhcmNofG1iX2VyZWdfc2VhcmNoX2dldHBvc3wnICsKICAgICAgICAnbWJfZXJlZ19zZWFyY2hfZ2V0cmVnc3xtYl9lcmVnX3NlYXJjaF9pbml0fG1iX2VyZWdfc2VhcmNoX3Bvc3xtYl9lcmVnX3NlYXJjaF9yZWdzfG1iX2VyZWdfc2VhcmNoX3NldHBvc3xtYl9lcmVnaXxtYl9lcmVnaV9yZXBsYWNlfCcgKwogICAgICAgICdtYl9nZXRfaW5mb3xtYl9odHRwX2lucHV0fG1iX2h0dHBfb3V0cHV0fG1iX2ludGVybmFsX2VuY29kaW5nfG1iX2xhbmd1YWdlfG1iX2xpc3RfZW5jb2RpbmdzfG1iX291dHB1dF9oYW5kbGVyfG1iX3BhcnNlX3N0cnwnICsKICAgICAgICAnbWJfcHJlZmVycmVkX21pbWVfbmFtZXxtYl9yZWdleF9lbmNvZGluZ3xtYl9yZWdleF9zZXRfb3B0aW9uc3xtYl9zZW5kX21haWx8bWJfc3BsaXR8bWJfc3RyY3V0fG1iX3N0cmltd2lkdGh8bWJfc3RyaXBvc3xtYl9zdHJpc3RyfCcgKwogICAgICAgICdtYl9zdHJsZW58bWJfc3RycG9zfG1iX3N0cnJjaHJ8bWJfc3RycmljaHJ8bWJfc3Rycmlwb3N8bWJfc3RycnBvc3xtYl9zdHJzdHJ8bWJfc3RydG9sb3dlcnxtYl9zdHJ0b3VwcGVyfG1iX3N0cndpZHRofCcgKwogICAgICAgICdtYl9zdWJzdGl0dXRlX2NoYXJhY3RlcnxtYl9zdWJzdHJ8bWJfc3Vic3RyX2NvdW50fG1jcnlwdF9jYmN8bWNyeXB0X2NmYnxtY3J5cHRfY3JlYXRlX2l2fG1jcnlwdF9kZWNyeXB0fG1jcnlwdF9lY2J8JyArCiAgICAgICAgJ21jcnlwdF9lbmNfZ2V0X2FsZ29yaXRobXNfbmFtZXxtY3J5cHRfZW5jX2dldF9ibG9ja19zaXplfG1jcnlwdF9lbmNfZ2V0X2l2X3NpemV8bWNyeXB0X2VuY19nZXRfa2V5X3NpemV8bWNyeXB0X2VuY19nZXRfbW9kZXNfbmFtZXwnICsKICAgICAgICAnbWNyeXB0X2VuY19nZXRfc3VwcG9ydGVkX2tleV9zaXplc3xtY3J5cHRfZW5jX2lzX2Jsb2NrX2FsZ29yaXRobXxtY3J5cHRfZW5jX2lzX2Jsb2NrX2FsZ29yaXRobV9tb2RlfG1jcnlwdF9lbmNfaXNfYmxvY2tfbW9kZXwnICsKICAgICAgICAnbWNyeXB0X2VuY19zZWxmX3Rlc3R8bWNyeXB0X2VuY3J5cHR8bWNyeXB0X2dlbmVyaWN8bWNyeXB0X2dlbmVyaWNfZGVpbml0fG1jcnlwdF9nZW5lcmljX2VuZHxtY3J5cHRfZ2VuZXJpY19pbml0fG1jcnlwdF9nZXRfYmxvY2tfc2l6ZXwnICsKICAgICAgICAnbWNyeXB0X2dldF9jaXBoZXJfbmFtZXxtY3J5cHRfZ2V0X2l2X3NpemV8bWNyeXB0X2dldF9rZXlfc2l6ZXxtY3J5cHRfbGlzdF9hbGdvcml0aG1zfG1jcnlwdF9saXN0X21vZGVzfG1jcnlwdF9tb2R1bGVfY2xvc2V8JyArCiAgICAgICAgJ21jcnlwdF9tb2R1bGVfZ2V0X2FsZ29fYmxvY2tfc2l6ZXxtY3J5cHRfbW9kdWxlX2dldF9hbGdvX2tleV9zaXplfG1jcnlwdF9tb2R1bGVfZ2V0X3N1cHBvcnRlZF9rZXlfc2l6ZXN8bWNyeXB0X21vZHVsZV9pc19ibG9ja19hbGdvcml0aG18JyArCiAgICAgICAgJ21jcnlwdF9tb2R1bGVfaXNfYmxvY2tfYWxnb3JpdGhtX21vZGV8bWNyeXB0X21vZHVsZV9pc19ibG9ja19tb2RlfG1jcnlwdF9tb2R1bGVfb3BlbnxtY3J5cHRfbW9kdWxlX3NlbGZfdGVzdHxtY3J5cHRfb2ZifG1kNXxtZDVfZmlsZXwnICsKICAgICAgICAnbWRlY3J5cHRfZ2VuZXJpY3xtZW1jYWNoZXxtZW1jYWNoZV9kZWJ1Z3xtZW1jYWNoZWR8bWVtb3J5X2dldF9wZWFrX3VzYWdlfG1lbW9yeV9nZXRfdXNhZ2V8bWVzc2FnZWZvcm1hdHRlcnxtZXRhcGhvbmV8bWV0aG9kX2V4aXN0c3xtaGFzaHwnICsKICAgICAgICAnbWhhc2hfY291bnR8bWhhc2hfZ2V0X2Jsb2NrX3NpemV8bWhhc2hfZ2V0X2hhc2hfbmFtZXxtaGFzaF9rZXlnZW5fczJrfG1pY3JvdGltZXxtaW1lX2NvbnRlbnRfdHlwZXxtaW58bWluZ19rZXlwcmVzc3wnICsKICAgICAgICAnbWluZ19zZXRjdWJpY3RocmVzaG9sZHxtaW5nX3NldHNjYWxlfG1pbmdfc2V0c3dmY29tcHJlc3Npb258bWluZ191c2Vjb25zdGFudHN8bWluZ191c2Vzd2Z2ZXJzaW9ufG1rZGlyfG1rdGltZXxtb25leV9mb3JtYXR8bW9uZ298JyArCiAgICAgICAgJ21vbmdvYmluZGF0YXxtb25nb2NvZGV8bW9uZ29jb2xsZWN0aW9ufG1vbmdvY29ubmVjdGlvbmV4Y2VwdGlvbnxtb25nb2N1cnNvcnxtb25nb2N1cnNvcmV4Y2VwdGlvbnxtb25nb2N1cnNvcnRpbWVvdXRleGNlcHRpb258bW9uZ29kYXRlfCcgKwogICAgICAgICdtb25nb2RifG1vbmdvZGJyZWZ8bW9uZ29leGNlcHRpb258bW9uZ29ncmlkZnN8bW9uZ29ncmlkZnNjdXJzb3J8bW9uZ29ncmlkZnNleGNlcHRpb258bW9uZ29ncmlkZnNmaWxlfG1vbmdvaWR8bW9uZ29pbnQzMnxtb25nb2ludDY0fCcgKwogICAgICAgICdtb25nb21heGtleXxtb25nb21pbmtleXxtb25nb3JlZ2V4fG1vbmdvdGltZXN0YW1wfG1vdmVfdXBsb2FkZWRfZmlsZXxtcGVnZmlsZXxtcXNlcmllc19iYWNrfG1xc2VyaWVzX2JlZ2lufG1xc2VyaWVzX2Nsb3NlfG1xc2VyaWVzX2NtaXR8JyArCiAgICAgICAgJ21xc2VyaWVzX2Nvbm58bXFzZXJpZXNfY29ubnh8bXFzZXJpZXNfZGlzY3xtcXNlcmllc19nZXR8bXFzZXJpZXNfaW5xfG1xc2VyaWVzX29wZW58bXFzZXJpZXNfcHV0fG1xc2VyaWVzX3B1dDF8bXFzZXJpZXNfc2V0fCcgKwogICAgICAgICdtcXNlcmllc19zdHJlcnJvcnxtc2Vzc2lvbl9jb25uZWN0fG1zZXNzaW9uX2NvdW50fG1zZXNzaW9uX2NyZWF0ZXxtc2Vzc2lvbl9kZXN0cm95fG1zZXNzaW9uX2Rpc2Nvbm5lY3R8bXNlc3Npb25fZmluZHxtc2Vzc2lvbl9nZXR8JyArCiAgICAgICAgJ21zZXNzaW9uX2dldF9hcnJheXxtc2Vzc2lvbl9nZXRfZGF0YXxtc2Vzc2lvbl9pbmN8bXNlc3Npb25fbGlzdHxtc2Vzc2lvbl9saXN0dmFyfG1zZXNzaW9uX2xvY2t8bXNlc3Npb25fcGx1Z2lufG1zZXNzaW9uX3JhbmRzdHJ8JyArCiAgICAgICAgJ21zZXNzaW9uX3NldHxtc2Vzc2lvbl9zZXRfYXJyYXl8bXNlc3Npb25fc2V0X2RhdGF8bXNlc3Npb25fdGltZW91dHxtc2Vzc2lvbl91bmlxfG1zZXNzaW9uX3VubG9ja3xtc2dfZ2V0X3F1ZXVlfG1zZ19xdWV1ZV9leGlzdHN8JyArCiAgICAgICAgJ21zZ19yZWNlaXZlfG1zZ19yZW1vdmVfcXVldWV8bXNnX3NlbmR8bXNnX3NldF9xdWV1ZXxtc2dfc3RhdF9xdWV1ZXxtc3FsfG1zcWxfYWZmZWN0ZWRfcm93c3xtc3FsX2Nsb3NlfG1zcWxfY29ubmVjdHxtc3FsX2NyZWF0ZV9kYnwnICsKICAgICAgICAnbXNxbF9jcmVhdGVkYnxtc3FsX2RhdGFfc2Vla3xtc3FsX2RiX3F1ZXJ5fG1zcWxfZGJuYW1lfG1zcWxfZHJvcF9kYnxtc3FsX2Vycm9yfG1zcWxfZmV0Y2hfYXJyYXl8bXNxbF9mZXRjaF9maWVsZHxtc3FsX2ZldGNoX29iamVjdHwnICsKICAgICAgICAnbXNxbF9mZXRjaF9yb3d8bXNxbF9maWVsZF9mbGFnc3xtc3FsX2ZpZWxkX2xlbnxtc3FsX2ZpZWxkX25hbWV8bXNxbF9maWVsZF9zZWVrfG1zcWxfZmllbGRfdGFibGV8bXNxbF9maWVsZF90eXBlfG1zcWxfZmllbGRmbGFnc3wnICsKICAgICAgICAnbXNxbF9maWVsZGxlbnxtc3FsX2ZpZWxkbmFtZXxtc3FsX2ZpZWxkdGFibGV8bXNxbF9maWVsZHR5cGV8bXNxbF9mcmVlX3Jlc3VsdHxtc3FsX2xpc3RfZGJzfG1zcWxfbGlzdF9maWVsZHN8bXNxbF9saXN0X3RhYmxlc3wnICsKICAgICAgICAnbXNxbF9udW1fZmllbGRzfG1zcWxfbnVtX3Jvd3N8bXNxbF9udW1maWVsZHN8bXNxbF9udW1yb3dzfG1zcWxfcGNvbm5lY3R8bXNxbF9xdWVyeXxtc3FsX3JlZ2Nhc2V8bXNxbF9yZXN1bHR8bXNxbF9zZWxlY3RfZGJ8bXNxbF90YWJsZW5hbWV8JyArCiAgICAgICAgJ21zc3FsX2JpbmR8bXNzcWxfY2xvc2V8bXNzcWxfY29ubmVjdHxtc3NxbF9kYXRhX3NlZWt8bXNzcWxfZXhlY3V0ZXxtc3NxbF9mZXRjaF9hcnJheXxtc3NxbF9mZXRjaF9hc3NvY3xtc3NxbF9mZXRjaF9iYXRjaHwnICsKICAgICAgICAnbXNzcWxfZmV0Y2hfZmllbGR8bXNzcWxfZmV0Y2hfb2JqZWN0fG1zc3FsX2ZldGNoX3Jvd3xtc3NxbF9maWVsZF9sZW5ndGh8bXNzcWxfZmllbGRfbmFtZXxtc3NxbF9maWVsZF9zZWVrfG1zc3FsX2ZpZWxkX3R5cGV8JyArCiAgICAgICAgJ21zc3FsX2ZyZWVfcmVzdWx0fG1zc3FsX2ZyZWVfc3RhdGVtZW50fG1zc3FsX2dldF9sYXN0X21lc3NhZ2V8bXNzcWxfZ3VpZF9zdHJpbmd8bXNzcWxfaW5pdHxtc3NxbF9taW5fZXJyb3Jfc2V2ZXJpdHl8JyArCiAgICAgICAgJ21zc3FsX21pbl9tZXNzYWdlX3NldmVyaXR5fG1zc3FsX25leHRfcmVzdWx0fG1zc3FsX251bV9maWVsZHN8bXNzcWxfbnVtX3Jvd3N8bXNzcWxfcGNvbm5lY3R8bXNzcWxfcXVlcnl8bXNzcWxfcmVzdWx0fG1zc3FsX3Jvd3NfYWZmZWN0ZWR8JyArCiAgICAgICAgJ21zc3FsX3NlbGVjdF9kYnxtdF9nZXRyYW5kbWF4fG10X3JhbmR8bXRfc3JhbmR8bXVsdGlwbGVpdGVyYXRvcnxteXNxbF9hZmZlY3RlZF9yb3dzfG15c3FsX2NsaWVudF9lbmNvZGluZ3xteXNxbF9jbG9zZXxteXNxbF9jb25uZWN0fCcgKwogICAgICAgICdteXNxbF9jcmVhdGVfZGJ8bXlzcWxfZGF0YV9zZWVrfG15c3FsX2RiX25hbWV8bXlzcWxfZGJfcXVlcnl8bXlzcWxfZHJvcF9kYnxteXNxbF9lcnJub3xteXNxbF9lcnJvcnxteXNxbF9lc2NhcGVfc3RyaW5nfG15c3FsX2ZldGNoX2FycmF5fCcgKwogICAgICAgICdteXNxbF9mZXRjaF9hc3NvY3xteXNxbF9mZXRjaF9maWVsZHxteXNxbF9mZXRjaF9sZW5ndGhzfG15c3FsX2ZldGNoX29iamVjdHxteXNxbF9mZXRjaF9yb3d8bXlzcWxfZmllbGRfZmxhZ3N8bXlzcWxfZmllbGRfbGVufCcgKwogICAgICAgICdteXNxbF9maWVsZF9uYW1lfG15c3FsX2ZpZWxkX3NlZWt8bXlzcWxfZmllbGRfdGFibGV8bXlzcWxfZmllbGRfdHlwZXxteXNxbF9mcmVlX3Jlc3VsdHxteXNxbF9nZXRfY2xpZW50X2luZm98bXlzcWxfZ2V0X2hvc3RfaW5mb3wnICsKICAgICAgICAnbXlzcWxfZ2V0X3Byb3RvX2luZm98bXlzcWxfZ2V0X3NlcnZlcl9pbmZvfG15c3FsX2luZm98bXlzcWxfaW5zZXJ0X2lkfG15c3FsX2xpc3RfZGJzfG15c3FsX2xpc3RfZmllbGRzfG15c3FsX2xpc3RfcHJvY2Vzc2VzfCcgKwogICAgICAgICdteXNxbF9saXN0X3RhYmxlc3xteXNxbF9udW1fZmllbGRzfG15c3FsX251bV9yb3dzfG15c3FsX3Bjb25uZWN0fG15c3FsX3Bpbmd8bXlzcWxfcXVlcnl8bXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nfG15c3FsX3Jlc3VsdHwnICsKICAgICAgICAnbXlzcWxfc2VsZWN0X2RifG15c3FsX3NldF9jaGFyc2V0fG15c3FsX3N0YXR8bXlzcWxfdGFibGVuYW1lfG15c3FsX3RocmVhZF9pZHxteXNxbF91bmJ1ZmZlcmVkX3F1ZXJ5fG15c3FsaXxteXNxbGlfYmluZF9wYXJhbXwnICsKICAgICAgICAnbXlzcWxpX2JpbmRfcmVzdWx0fG15c3FsaV9jbGllbnRfZW5jb2Rpbmd8bXlzcWxpX2Nvbm5lY3R8bXlzcWxpX2Rpc2FibGVfcmVhZHNfZnJvbV9tYXN0ZXJ8bXlzcWxpX2Rpc2FibGVfcnBsX3BhcnNlfG15c3FsaV9kcml2ZXJ8JyArCiAgICAgICAgJ215c3FsaV9lbmFibGVfcmVhZHNfZnJvbV9tYXN0ZXJ8bXlzcWxpX2VuYWJsZV9ycGxfcGFyc2V8bXlzcWxpX2VzY2FwZV9zdHJpbmd8bXlzcWxpX2V4ZWN1dGV8bXlzcWxpX2ZldGNofG15c3FsaV9nZXRfbWV0YWRhdGF8JyArCiAgICAgICAgJ215c3FsaV9tYXN0ZXJfcXVlcnl8bXlzcWxpX3BhcmFtX2NvdW50fG15c3FsaV9yZXBvcnR8bXlzcWxpX3Jlc3VsdHxteXNxbGlfcnBsX3BhcnNlX2VuYWJsZWR8bXlzcWxpX3JwbF9wcm9iZXxteXNxbGlfcnBsX3F1ZXJ5X3R5cGV8JyArCiAgICAgICAgJ215c3FsaV9zZW5kX2xvbmdfZGF0YXxteXNxbGlfc2VuZF9xdWVyeXxteXNxbGlfc2V0X29wdHxteXNxbGlfc2xhdmVfcXVlcnl8bXlzcWxpX3N0bXR8bXlzcWxpX3dhcm5pbmd8bXlzcWxuZF9tc19nZXRfc3RhdHN8JyArCiAgICAgICAgJ215c3FsbmRfbXNfcXVlcnlfaXNfc2VsZWN0fG15c3FsbmRfbXNfc2V0X3VzZXJfcGlja19zZXJ2ZXJ8bXlzcWxuZF9xY19jaGFuZ2VfaGFuZGxlcnxteXNxbG5kX3FjX2NsZWFyX2NhY2hlfG15c3FsbmRfcWNfZ2V0X2NhY2hlX2luZm98JyArCiAgICAgICAgJ215c3FsbmRfcWNfZ2V0X2NvcmVfc3RhdHN8bXlzcWxuZF9xY19nZXRfaGFuZGxlcnxteXNxbG5kX3FjX2dldF9xdWVyeV90cmFjZV9sb2d8bXlzcWxuZF9xY19zZXRfdXNlcl9oYW5kbGVyc3xuYXRjYXNlc29ydHxuYXRzb3J0fCcgKwogICAgICAgICduY3Vyc2VzX2FkZGNofG5jdXJzZXNfYWRkY2huc3RyfG5jdXJzZXNfYWRkY2hzdHJ8bmN1cnNlc19hZGRuc3RyfG5jdXJzZXNfYWRkc3RyfG5jdXJzZXNfYXNzdW1lX2RlZmF1bHRfY29sb3JzfG5jdXJzZXNfYXR0cm9mZnwnICsKICAgICAgICAnbmN1cnNlc19hdHRyb258bmN1cnNlc19hdHRyc2V0fG5jdXJzZXNfYmF1ZHJhdGV8bmN1cnNlc19iZWVwfG5jdXJzZXNfYmtnZHxuY3Vyc2VzX2JrZ2RzZXR8bmN1cnNlc19ib3JkZXJ8bmN1cnNlc19ib3R0b21fcGFuZWx8JyArCiAgICAgICAgJ25jdXJzZXNfY2FuX2NoYW5nZV9jb2xvcnxuY3Vyc2VzX2NicmVha3xuY3Vyc2VzX2NsZWFyfG5jdXJzZXNfY2xydG9ib3R8bmN1cnNlc19jbHJ0b2VvbHxuY3Vyc2VzX2NvbG9yX2NvbnRlbnR8bmN1cnNlc19jb2xvcl9zZXR8JyArCiAgICAgICAgJ25jdXJzZXNfY3Vyc19zZXR8bmN1cnNlc19kZWZfcHJvZ19tb2RlfG5jdXJzZXNfZGVmX3NoZWxsX21vZGV8bmN1cnNlc19kZWZpbmVfa2V5fG5jdXJzZXNfZGVsX3BhbmVsfG5jdXJzZXNfZGVsYXlfb3V0cHV0fG5jdXJzZXNfZGVsY2h8JyArCiAgICAgICAgJ25jdXJzZXNfZGVsZXRlbG58bmN1cnNlc19kZWx3aW58bmN1cnNlc19kb3VwZGF0ZXxuY3Vyc2VzX2VjaG98bmN1cnNlc19lY2hvY2hhcnxuY3Vyc2VzX2VuZHxuY3Vyc2VzX2VyYXNlfG5jdXJzZXNfZXJhc2VjaGFyfG5jdXJzZXNfZmlsdGVyfCcgKwogICAgICAgICduY3Vyc2VzX2ZsYXNofG5jdXJzZXNfZmx1c2hpbnB8bmN1cnNlc19nZXRjaHxuY3Vyc2VzX2dldG1heHl4fG5jdXJzZXNfZ2V0bW91c2V8bmN1cnNlc19nZXR5eHxuY3Vyc2VzX2hhbGZkZWxheXxuY3Vyc2VzX2hhc19jb2xvcnN8JyArCiAgICAgICAgJ25jdXJzZXNfaGFzX2ljfG5jdXJzZXNfaGFzX2lsfG5jdXJzZXNfaGFzX2tleXxuY3Vyc2VzX2hpZGVfcGFuZWx8bmN1cnNlc19obGluZXxuY3Vyc2VzX2luY2h8bmN1cnNlc19pbml0fG5jdXJzZXNfaW5pdF9jb2xvcnwnICsKICAgICAgICAnbmN1cnNlc19pbml0X3BhaXJ8bmN1cnNlc19pbnNjaHxuY3Vyc2VzX2luc2RlbGxufG5jdXJzZXNfaW5zZXJ0bG58bmN1cnNlc19pbnNzdHJ8bmN1cnNlc19pbnN0cnxuY3Vyc2VzX2lzZW5kd2lufG5jdXJzZXNfa2V5b2t8JyArCiAgICAgICAgJ25jdXJzZXNfa2V5cGFkfG5jdXJzZXNfa2lsbGNoYXJ8bmN1cnNlc19sb25nbmFtZXxuY3Vyc2VzX21ldGF8bmN1cnNlc19tb3VzZV90cmFmb3xuY3Vyc2VzX21vdXNlaW50ZXJ2YWx8bmN1cnNlc19tb3VzZW1hc2t8bmN1cnNlc19tb3ZlfCcgKwogICAgICAgICduY3Vyc2VzX21vdmVfcGFuZWx8bmN1cnNlc19tdmFkZGNofG5jdXJzZXNfbXZhZGRjaG5zdHJ8bmN1cnNlc19tdmFkZGNoc3RyfG5jdXJzZXNfbXZhZGRuc3RyfG5jdXJzZXNfbXZhZGRzdHJ8bmN1cnNlc19tdmN1cnwnICsKICAgICAgICAnbmN1cnNlc19tdmRlbGNofG5jdXJzZXNfbXZnZXRjaHxuY3Vyc2VzX212aGxpbmV8bmN1cnNlc19tdmluY2h8bmN1cnNlc19tdnZsaW5lfG5jdXJzZXNfbXZ3YWRkc3RyfG5jdXJzZXNfbmFwbXN8bmN1cnNlc19uZXdfcGFuZWx8JyArCiAgICAgICAgJ25jdXJzZXNfbmV3cGFkfG5jdXJzZXNfbmV3d2lufG5jdXJzZXNfbmx8bmN1cnNlc19ub2NicmVha3xuY3Vyc2VzX25vZWNob3xuY3Vyc2VzX25vbmx8bmN1cnNlc19ub3FpZmx1c2h8bmN1cnNlc19ub3Jhd3wnICsKICAgICAgICAnbmN1cnNlc19wYWlyX2NvbnRlbnR8bmN1cnNlc19wYW5lbF9hYm92ZXxuY3Vyc2VzX3BhbmVsX2JlbG93fG5jdXJzZXNfcGFuZWxfd2luZG93fG5jdXJzZXNfcG5vdXRyZWZyZXNofG5jdXJzZXNfcHJlZnJlc2h8bmN1cnNlc19wdXRwfCcgKwogICAgICAgICduY3Vyc2VzX3FpZmx1c2h8bmN1cnNlc19yYXd8bmN1cnNlc19yZWZyZXNofG5jdXJzZXNfcmVwbGFjZV9wYW5lbHxuY3Vyc2VzX3Jlc2V0X3Byb2dfbW9kZXxuY3Vyc2VzX3Jlc2V0X3NoZWxsX21vZGV8bmN1cnNlc19yZXNldHR5fCcgKwogICAgICAgICduY3Vyc2VzX3NhdmV0dHl8bmN1cnNlc19zY3JfZHVtcHxuY3Vyc2VzX3Njcl9pbml0fG5jdXJzZXNfc2NyX3Jlc3RvcmV8bmN1cnNlc19zY3Jfc2V0fG5jdXJzZXNfc2NybHxuY3Vyc2VzX3Nob3dfcGFuZWx8bmN1cnNlc19zbGtfYXR0cnwnICsKICAgICAgICAnbmN1cnNlc19zbGtfYXR0cm9mZnxuY3Vyc2VzX3Nsa19hdHRyb258bmN1cnNlc19zbGtfYXR0cnNldHxuY3Vyc2VzX3Nsa19jbGVhcnxuY3Vyc2VzX3Nsa19jb2xvcnxuY3Vyc2VzX3Nsa19pbml0fG5jdXJzZXNfc2xrX25vdXRyZWZyZXNofCcgKwogICAgICAgICduY3Vyc2VzX3Nsa19yZWZyZXNofG5jdXJzZXNfc2xrX3Jlc3RvcmV8bmN1cnNlc19zbGtfc2V0fG5jdXJzZXNfc2xrX3RvdWNofG5jdXJzZXNfc3RhbmRlbmR8bmN1cnNlc19zdGFuZG91dHxuY3Vyc2VzX3N0YXJ0X2NvbG9yfCcgKwogICAgICAgICduY3Vyc2VzX3Rlcm1hdHRyc3xuY3Vyc2VzX3Rlcm1uYW1lfG5jdXJzZXNfdGltZW91dHxuY3Vyc2VzX3RvcF9wYW5lbHxuY3Vyc2VzX3R5cGVhaGVhZHxuY3Vyc2VzX3VuZ2V0Y2h8bmN1cnNlc191bmdldG1vdXNlfCcgKwogICAgICAgICduY3Vyc2VzX3VwZGF0ZV9wYW5lbHN8bmN1cnNlc191c2VfZGVmYXVsdF9jb2xvcnN8bmN1cnNlc191c2VfZW52fG5jdXJzZXNfdXNlX2V4dGVuZGVkX25hbWVzfG5jdXJzZXNfdmlkYXR0cnxuY3Vyc2VzX3ZsaW5lfG5jdXJzZXNfd2FkZGNofCcgKwogICAgICAgICduY3Vyc2VzX3dhZGRzdHJ8bmN1cnNlc193YXR0cm9mZnxuY3Vyc2VzX3dhdHRyb258bmN1cnNlc193YXR0cnNldHxuY3Vyc2VzX3dib3JkZXJ8bmN1cnNlc193Y2xlYXJ8bmN1cnNlc193Y29sb3Jfc2V0fG5jdXJzZXNfd2VyYXNlfCcgKwogICAgICAgICduY3Vyc2VzX3dnZXRjaHxuY3Vyc2VzX3dobGluZXxuY3Vyc2VzX3dtb3VzZV90cmFmb3xuY3Vyc2VzX3dtb3ZlfG5jdXJzZXNfd25vdXRyZWZyZXNofG5jdXJzZXNfd3JlZnJlc2h8bmN1cnNlc193c3RhbmRlbmR8JyArCiAgICAgICAgJ25jdXJzZXNfd3N0YW5kb3V0fG5jdXJzZXNfd3ZsaW5lfG5ld2luc3RhbmNlfG5ld2luc3RhbmNlYXJnc3xuZXd0X2JlbGx8bmV3dF9idXR0b258bmV3dF9idXR0b25fYmFyfG5ld3RfY2VudGVyZWRfd2luZG93fG5ld3RfY2hlY2tib3h8JyArCiAgICAgICAgJ25ld3RfY2hlY2tib3hfZ2V0X3ZhbHVlfG5ld3RfY2hlY2tib3hfc2V0X2ZsYWdzfG5ld3RfY2hlY2tib3hfc2V0X3ZhbHVlfG5ld3RfY2hlY2tib3hfdHJlZXxuZXd0X2NoZWNrYm94X3RyZWVfYWRkX2l0ZW18JyArCiAgICAgICAgJ25ld3RfY2hlY2tib3hfdHJlZV9maW5kX2l0ZW18bmV3dF9jaGVja2JveF90cmVlX2dldF9jdXJyZW50fG5ld3RfY2hlY2tib3hfdHJlZV9nZXRfZW50cnlfdmFsdWV8bmV3dF9jaGVja2JveF90cmVlX2dldF9tdWx0aV9zZWxlY3Rpb258JyArCiAgICAgICAgJ25ld3RfY2hlY2tib3hfdHJlZV9nZXRfc2VsZWN0aW9ufG5ld3RfY2hlY2tib3hfdHJlZV9tdWx0aXxuZXd0X2NoZWNrYm94X3RyZWVfc2V0X2N1cnJlbnR8bmV3dF9jaGVja2JveF90cmVlX3NldF9lbnRyeXwnICsKICAgICAgICAnbmV3dF9jaGVja2JveF90cmVlX3NldF9lbnRyeV92YWx1ZXxuZXd0X2NoZWNrYm94X3RyZWVfc2V0X3dpZHRofG5ld3RfY2xlYXJfa2V5X2J1ZmZlcnxuZXd0X2Nsc3xuZXd0X2NvbXBhY3RfYnV0dG9ufCcgKwogICAgICAgICduZXd0X2NvbXBvbmVudF9hZGRfY2FsbGJhY2t8bmV3dF9jb21wb25lbnRfdGFrZXNfZm9jdXN8bmV3dF9jcmVhdGVfZ3JpZHxuZXd0X2N1cnNvcl9vZmZ8bmV3dF9jdXJzb3Jfb258bmV3dF9kZWxheXxuZXd0X2RyYXdfZm9ybXwnICsKICAgICAgICAnbmV3dF9kcmF3X3Jvb3RfdGV4dHxuZXd0X2VudHJ5fG5ld3RfZW50cnlfZ2V0X3ZhbHVlfG5ld3RfZW50cnlfc2V0fG5ld3RfZW50cnlfc2V0X2ZpbHRlcnxuZXd0X2VudHJ5X3NldF9mbGFnc3xuZXd0X2ZpbmlzaGVkfG5ld3RfZm9ybXwnICsKICAgICAgICAnbmV3dF9mb3JtX2FkZF9jb21wb25lbnR8bmV3dF9mb3JtX2FkZF9jb21wb25lbnRzfG5ld3RfZm9ybV9hZGRfaG90X2tleXxuZXd0X2Zvcm1fZGVzdHJveXxuZXd0X2Zvcm1fZ2V0X2N1cnJlbnR8bmV3dF9mb3JtX3J1bnwnICsKICAgICAgICAnbmV3dF9mb3JtX3NldF9iYWNrZ3JvdW5kfG5ld3RfZm9ybV9zZXRfaGVpZ2h0fG5ld3RfZm9ybV9zZXRfc2l6ZXxuZXd0X2Zvcm1fc2V0X3RpbWVyfG5ld3RfZm9ybV9zZXRfd2lkdGh8bmV3dF9mb3JtX3dhdGNoX2ZkfCcgKwogICAgICAgICduZXd0X2dldF9zY3JlZW5fc2l6ZXxuZXd0X2dyaWRfYWRkX2NvbXBvbmVudHNfdG9fZm9ybXxuZXd0X2dyaWRfYmFzaWNfd2luZG93fG5ld3RfZ3JpZF9mcmVlfG5ld3RfZ3JpZF9nZXRfc2l6ZXxuZXd0X2dyaWRfaF9jbG9zZV9zdGFja2VkfCcgKwogICAgICAgICduZXd0X2dyaWRfaF9zdGFja2VkfG5ld3RfZ3JpZF9wbGFjZXxuZXd0X2dyaWRfc2V0X2ZpZWxkfG5ld3RfZ3JpZF9zaW1wbGVfd2luZG93fG5ld3RfZ3JpZF92X2Nsb3NlX3N0YWNrZWR8bmV3dF9ncmlkX3Zfc3RhY2tlZHwnICsKICAgICAgICAnbmV3dF9ncmlkX3dyYXBwZWRfd2luZG93fG5ld3RfZ3JpZF93cmFwcGVkX3dpbmRvd19hdHxuZXd0X2luaXR8bmV3dF9sYWJlbHxuZXd0X2xhYmVsX3NldF90ZXh0fG5ld3RfbGlzdGJveHxuZXd0X2xpc3Rib3hfYXBwZW5kX2VudHJ5fCcgKwogICAgICAgICduZXd0X2xpc3Rib3hfY2xlYXJ8bmV3dF9saXN0Ym94X2NsZWFyX3NlbGVjdGlvbnxuZXd0X2xpc3Rib3hfZGVsZXRlX2VudHJ5fG5ld3RfbGlzdGJveF9nZXRfY3VycmVudHxuZXd0X2xpc3Rib3hfZ2V0X3NlbGVjdGlvbnwnICsKICAgICAgICAnbmV3dF9saXN0Ym94X2luc2VydF9lbnRyeXxuZXd0X2xpc3Rib3hfaXRlbV9jb3VudHxuZXd0X2xpc3Rib3hfc2VsZWN0X2l0ZW18bmV3dF9saXN0Ym94X3NldF9jdXJyZW50fG5ld3RfbGlzdGJveF9zZXRfY3VycmVudF9ieV9rZXl8JyArCiAgICAgICAgJ25ld3RfbGlzdGJveF9zZXRfZGF0YXxuZXd0X2xpc3Rib3hfc2V0X2VudHJ5fG5ld3RfbGlzdGJveF9zZXRfd2lkdGh8bmV3dF9saXN0aXRlbXxuZXd0X2xpc3RpdGVtX2dldF9kYXRhfG5ld3RfbGlzdGl0ZW1fc2V0fCcgKwogICAgICAgICduZXd0X29wZW5fd2luZG93fG5ld3RfcG9wX2hlbHBfbGluZXxuZXd0X3BvcF93aW5kb3d8bmV3dF9wdXNoX2hlbHBfbGluZXxuZXd0X3JhZGlvX2dldF9jdXJyZW50fG5ld3RfcmFkaW9idXR0b258bmV3dF9yZWRyYXdfaGVscF9saW5lfCcgKwogICAgICAgICduZXd0X3JlZmxvd190ZXh0fG5ld3RfcmVmcmVzaHxuZXd0X3Jlc2l6ZV9zY3JlZW58bmV3dF9yZXN1bWV8bmV3dF9ydW5fZm9ybXxuZXd0X3NjYWxlfG5ld3Rfc2NhbGVfc2V0fG5ld3Rfc2Nyb2xsYmFyX3NldHwnICsKICAgICAgICAnbmV3dF9zZXRfaGVscF9jYWxsYmFja3xuZXd0X3NldF9zdXNwZW5kX2NhbGxiYWNrfG5ld3Rfc3VzcGVuZHxuZXd0X3RleHRib3h8bmV3dF90ZXh0Ym94X2dldF9udW1fbGluZXN8bmV3dF90ZXh0Ym94X3JlZmxvd2VkfCcgKwogICAgICAgICduZXd0X3RleHRib3hfc2V0X2hlaWdodHxuZXd0X3RleHRib3hfc2V0X3RleHR8bmV3dF92ZXJ0aWNhbF9zY3JvbGxiYXJ8bmV3dF93YWl0X2Zvcl9rZXl8bmV3dF93aW5fY2hvaWNlfG5ld3Rfd2luX2VudHJpZXN8bmV3dF93aW5fbWVudXwnICsKICAgICAgICAnbmV3dF93aW5fbWVzc2FnZXxuZXd0X3dpbl9tZXNzYWdldnxuZXd0X3dpbl90ZXJuYXJ5fG5leHR8bmdldHRleHR8bmwyYnJ8bmxfbGFuZ2luZm98bm9yZXdpbmRpdGVyYXRvcnxub3JtYWxpemVyfG5vdGVzX2JvZHl8bm90ZXNfY29weV9kYnwnICsKICAgICAgICAnbm90ZXNfY3JlYXRlX2RifG5vdGVzX2NyZWF0ZV9ub3RlfG5vdGVzX2Ryb3BfZGJ8bm90ZXNfZmluZF9ub3RlfG5vdGVzX2hlYWRlcl9pbmZvfG5vdGVzX2xpc3RfbXNnc3xub3Rlc19tYXJrX3JlYWR8bm90ZXNfbWFya191bnJlYWR8JyArCiAgICAgICAgJ25vdGVzX25hdl9jcmVhdGV8bm90ZXNfc2VhcmNofG5vdGVzX3VucmVhZHxub3Rlc192ZXJzaW9ufG5zYXBpX3JlcXVlc3RfaGVhZGVyc3xuc2FwaV9yZXNwb25zZV9oZWFkZXJzfG5zYXBpX3ZpcnR1YWx8bnRobWFjfG51bWJlcl9mb3JtYXR8JyArCiAgICAgICAgJ251bWJlcmZvcm1hdHRlcnxvYXV0aHxvYXV0aF9nZXRfc2JzfG9hdXRoX3VybGVuY29kZXxvYXV0aGV4Y2VwdGlvbnxvYXV0aHByb3ZpZGVyfG9iX2NsZWFufG9iX2RlZmxhdGVoYW5kbGVyfG9iX2VuZF9jbGVhbnxvYl9lbmRfZmx1c2h8JyArCiAgICAgICAgJ29iX2V0YWdoYW5kbGVyfG9iX2ZsdXNofG9iX2dldF9jbGVhbnxvYl9nZXRfY29udGVudHN8b2JfZ2V0X2ZsdXNofG9iX2dldF9sZW5ndGh8b2JfZ2V0X2xldmVsfG9iX2dldF9zdGF0dXN8b2JfZ3poYW5kbGVyfG9iX2ljb252X2hhbmRsZXJ8JyArCiAgICAgICAgJ29iX2ltcGxpY2l0X2ZsdXNofG9iX2luZmxhdGVoYW5kbGVyfG9iX2xpc3RfaGFuZGxlcnN8b2Jfc3RhcnR8b2JfdGlkeWhhbmRsZXJ8b2NpX2JpbmRfYXJyYXlfYnlfbmFtZXxvY2lfYmluZF9ieV9uYW1lfG9jaV9jYW5jZWx8JyArCiAgICAgICAgJ29jaV9jbGllbnRfdmVyc2lvbnxvY2lfY2xvc2V8b2NpX2NvbGxlY3Rpb25fYXBwZW5kfG9jaV9jb2xsZWN0aW9uX2Fzc2lnbnxvY2lfY29sbGVjdGlvbl9lbGVtZW50X2Fzc2lnbnxvY2lfY29sbGVjdGlvbl9lbGVtZW50X2dldHwnICsKICAgICAgICAnb2NpX2NvbGxlY3Rpb25fZnJlZXxvY2lfY29sbGVjdGlvbl9tYXh8b2NpX2NvbGxlY3Rpb25fc2l6ZXxvY2lfY29sbGVjdGlvbl90cmltfG9jaV9jb21taXR8b2NpX2Nvbm5lY3R8b2NpX2RlZmluZV9ieV9uYW1lfG9jaV9lcnJvcnwnICsKICAgICAgICAnb2NpX2V4ZWN1dGV8b2NpX2ZldGNofG9jaV9mZXRjaF9hbGx8b2NpX2ZldGNoX2FycmF5fG9jaV9mZXRjaF9hc3NvY3xvY2lfZmV0Y2hfb2JqZWN0fG9jaV9mZXRjaF9yb3d8b2NpX2ZpZWxkX2lzX251bGx8b2NpX2ZpZWxkX25hbWV8JyArCiAgICAgICAgJ29jaV9maWVsZF9wcmVjaXNpb258b2NpX2ZpZWxkX3NjYWxlfG9jaV9maWVsZF9zaXplfG9jaV9maWVsZF90eXBlfG9jaV9maWVsZF90eXBlX3Jhd3xvY2lfZnJlZV9zdGF0ZW1lbnR8b2NpX2ludGVybmFsX2RlYnVnfG9jaV9sb2JfYXBwZW5kfCcgKwogICAgICAgICdvY2lfbG9iX2Nsb3NlfG9jaV9sb2JfY29weXxvY2lfbG9iX2VvZnxvY2lfbG9iX2VyYXNlfG9jaV9sb2JfZXhwb3J0fG9jaV9sb2JfZmx1c2h8b2NpX2xvYl9mcmVlfG9jaV9sb2JfZ2V0YnVmZmVyaW5nfG9jaV9sb2JfaW1wb3J0fCcgKwogICAgICAgICdvY2lfbG9iX2lzX2VxdWFsfG9jaV9sb2JfbG9hZHxvY2lfbG9iX3JlYWR8b2NpX2xvYl9yZXdpbmR8b2NpX2xvYl9zYXZlfG9jaV9sb2Jfc2F2ZWZpbGV8b2NpX2xvYl9zZWVrfG9jaV9sb2Jfc2V0YnVmZmVyaW5nfG9jaV9sb2Jfc2l6ZXwnICsKICAgICAgICAnb2NpX2xvYl90ZWxsfG9jaV9sb2JfdHJ1bmNhdGV8b2NpX2xvYl93cml0ZXxvY2lfbG9iX3dyaXRldGVtcG9yYXJ5fG9jaV9sb2Jfd3JpdGV0b2ZpbGV8b2NpX25ld19jb2xsZWN0aW9ufG9jaV9uZXdfY29ubmVjdHxvY2lfbmV3X2N1cnNvcnwnICsKICAgICAgICAnb2NpX25ld19kZXNjcmlwdG9yfG9jaV9udW1fZmllbGRzfG9jaV9udW1fcm93c3xvY2lfcGFyc2V8b2NpX3Bhc3N3b3JkX2NoYW5nZXxvY2lfcGNvbm5lY3R8b2NpX3Jlc3VsdHxvY2lfcm9sbGJhY2t8b2NpX3NlcnZlcl92ZXJzaW9ufCcgKwogICAgICAgICdvY2lfc2V0X2FjdGlvbnxvY2lfc2V0X2NsaWVudF9pZGVudGlmaWVyfG9jaV9zZXRfY2xpZW50X2luZm98b2NpX3NldF9lZGl0aW9ufG9jaV9zZXRfbW9kdWxlX25hbWV8b2NpX3NldF9wcmVmZXRjaHxvY2lfc3RhdGVtZW50X3R5cGV8JyArCiAgICAgICAgJ29jaWJpbmRieW5hbWV8b2NpY2FuY2VsfG9jaWNsb3NlbG9ifG9jaWNvbGxhcHBlbmR8b2NpY29sbGFzc2lnbnxvY2ljb2xsYXNzaWduZWxlbXxvY2ljb2xsZ2V0ZWxlbXxvY2ljb2xsbWF4fG9jaWNvbGxzaXplfG9jaWNvbGx0cmltfCcgKwogICAgICAgICdvY2ljb2x1bW5pc251bGx8b2NpY29sdW1ubmFtZXxvY2ljb2x1bW5wcmVjaXNpb258b2NpY29sdW1uc2NhbGV8b2NpY29sdW1uc2l6ZXxvY2ljb2x1bW50eXBlfG9jaWNvbHVtbnR5cGVyYXd8b2NpY29tbWl0fG9jaWRlZmluZWJ5bmFtZXwnICsKICAgICAgICAnb2NpZXJyb3J8b2NpZXhlY3V0ZXxvY2lmZXRjaHxvY2lmZXRjaGludG98b2NpZmV0Y2hzdGF0ZW1lbnR8b2NpZnJlZWNvbGxlY3Rpb258b2NpZnJlZWN1cnNvcnxvY2lmcmVlZGVzY3xvY2lmcmVlc3RhdGVtZW50fG9jaWludGVybmFsZGVidWd8JyArCiAgICAgICAgJ29jaWxvYWRsb2J8b2NpbG9nb2ZmfG9jaWxvZ29ufG9jaW5ld2NvbGxlY3Rpb258b2NpbmV3Y3Vyc29yfG9jaW5ld2Rlc2NyaXB0b3J8b2NpbmxvZ29ufG9jaW51bWNvbHN8b2NpcGFyc2V8b2NpcGxvZ29ufG9jaXJlc3VsdHwnICsKICAgICAgICAnb2Npcm9sbGJhY2t8b2Npcm93Y291bnR8b2Npc2F2ZWxvYnxvY2lzYXZlbG9iZmlsZXxvY2lzZXJ2ZXJ2ZXJzaW9ufG9jaXNldHByZWZldGNofG9jaXN0YXRlbWVudHR5cGV8b2Npd3JpdGVsb2J0b2ZpbGV8b2Npd3JpdGV0ZW1wb3Jhcnlsb2J8JyArCiAgICAgICAgJ29jdGRlY3xvZGJjX2F1dG9jb21taXR8b2RiY19iaW5tb2RlfG9kYmNfY2xvc2V8b2RiY19jbG9zZV9hbGx8b2RiY19jb2x1bW5wcml2aWxlZ2VzfG9kYmNfY29sdW1uc3xvZGJjX2NvbW1pdHxvZGJjX2Nvbm5lY3R8b2RiY19jdXJzb3J8JyArCiAgICAgICAgJ29kYmNfZGF0YV9zb3VyY2V8b2RiY19kb3xvZGJjX2Vycm9yfG9kYmNfZXJyb3Jtc2d8b2RiY19leGVjfG9kYmNfZXhlY3V0ZXxvZGJjX2ZldGNoX2FycmF5fG9kYmNfZmV0Y2hfaW50b3xvZGJjX2ZldGNoX29iamVjdHwnICsKICAgICAgICAnb2RiY19mZXRjaF9yb3d8b2RiY19maWVsZF9sZW58b2RiY19maWVsZF9uYW1lfG9kYmNfZmllbGRfbnVtfG9kYmNfZmllbGRfcHJlY2lzaW9ufG9kYmNfZmllbGRfc2NhbGV8b2RiY19maWVsZF90eXBlfG9kYmNfZm9yZWlnbmtleXN8JyArCiAgICAgICAgJ29kYmNfZnJlZV9yZXN1bHR8b2RiY19nZXR0eXBlaW5mb3xvZGJjX2xvbmdyZWFkbGVufG9kYmNfbmV4dF9yZXN1bHR8b2RiY19udW1fZmllbGRzfG9kYmNfbnVtX3Jvd3N8b2RiY19wY29ubmVjdHxvZGJjX3ByZXBhcmV8JyArCiAgICAgICAgJ29kYmNfcHJpbWFyeWtleXN8b2RiY19wcm9jZWR1cmVjb2x1bW5zfG9kYmNfcHJvY2VkdXJlc3xvZGJjX3Jlc3VsdHxvZGJjX3Jlc3VsdF9hbGx8b2RiY19yb2xsYmFja3xvZGJjX3NldG9wdGlvbnxvZGJjX3NwZWNpYWxjb2x1bW5zfCcgKwogICAgICAgICdvZGJjX3N0YXRpc3RpY3N8b2RiY190YWJsZXByaXZpbGVnZXN8b2RiY190YWJsZXN8b3BlbmFsX2J1ZmZlcl9jcmVhdGV8b3BlbmFsX2J1ZmZlcl9kYXRhfG9wZW5hbF9idWZmZXJfZGVzdHJveXxvcGVuYWxfYnVmZmVyX2dldHwnICsKICAgICAgICAnb3BlbmFsX2J1ZmZlcl9sb2Fkd2F2fG9wZW5hbF9jb250ZXh0X2NyZWF0ZXxvcGVuYWxfY29udGV4dF9jdXJyZW50fG9wZW5hbF9jb250ZXh0X2Rlc3Ryb3l8b3BlbmFsX2NvbnRleHRfcHJvY2Vzc3xvcGVuYWxfY29udGV4dF9zdXNwZW5kfCcgKwogICAgICAgICdvcGVuYWxfZGV2aWNlX2Nsb3NlfG9wZW5hbF9kZXZpY2Vfb3BlbnxvcGVuYWxfbGlzdGVuZXJfZ2V0fG9wZW5hbF9saXN0ZW5lcl9zZXR8b3BlbmFsX3NvdXJjZV9jcmVhdGV8b3BlbmFsX3NvdXJjZV9kZXN0cm95fCcgKwogICAgICAgICdvcGVuYWxfc291cmNlX2dldHxvcGVuYWxfc291cmNlX3BhdXNlfG9wZW5hbF9zb3VyY2VfcGxheXxvcGVuYWxfc291cmNlX3Jld2luZHxvcGVuYWxfc291cmNlX3NldHxvcGVuYWxfc291cmNlX3N0b3B8b3BlbmFsX3N0cmVhbXxvcGVuZGlyfCcgKwogICAgICAgICdvcGVubG9nfG9wZW5zc2xfY2lwaGVyX2l2X2xlbmd0aHxvcGVuc3NsX2Nzcl9leHBvcnR8b3BlbnNzbF9jc3JfZXhwb3J0X3RvX2ZpbGV8b3BlbnNzbF9jc3JfZ2V0X3B1YmxpY19rZXl8b3BlbnNzbF9jc3JfZ2V0X3N1YmplY3R8JyArCiAgICAgICAgJ29wZW5zc2xfY3NyX25ld3xvcGVuc3NsX2Nzcl9zaWdufG9wZW5zc2xfZGVjcnlwdHxvcGVuc3NsX2RoX2NvbXB1dGVfa2V5fG9wZW5zc2xfZGlnZXN0fG9wZW5zc2xfZW5jcnlwdHxvcGVuc3NsX2Vycm9yX3N0cmluZ3wnICsKICAgICAgICAnb3BlbnNzbF9mcmVlX2tleXxvcGVuc3NsX2dldF9jaXBoZXJfbWV0aG9kc3xvcGVuc3NsX2dldF9tZF9tZXRob2RzfG9wZW5zc2xfZ2V0X3ByaXZhdGVrZXl8b3BlbnNzbF9nZXRfcHVibGlja2V5fG9wZW5zc2xfb3BlbnwnICsKICAgICAgICAnb3BlbnNzbF9wa2NzMTJfZXhwb3J0fG9wZW5zc2xfcGtjczEyX2V4cG9ydF90b19maWxlfG9wZW5zc2xfcGtjczEyX3JlYWR8b3BlbnNzbF9wa2NzN19kZWNyeXB0fG9wZW5zc2xfcGtjczdfZW5jcnlwdHxvcGVuc3NsX3BrY3M3X3NpZ258JyArCiAgICAgICAgJ29wZW5zc2xfcGtjczdfdmVyaWZ5fG9wZW5zc2xfcGtleV9leHBvcnR8b3BlbnNzbF9wa2V5X2V4cG9ydF90b19maWxlfG9wZW5zc2xfcGtleV9mcmVlfG9wZW5zc2xfcGtleV9nZXRfZGV0YWlsc3xvcGVuc3NsX3BrZXlfZ2V0X3ByaXZhdGV8JyArCiAgICAgICAgJ29wZW5zc2xfcGtleV9nZXRfcHVibGljfG9wZW5zc2xfcGtleV9uZXd8b3BlbnNzbF9wcml2YXRlX2RlY3J5cHR8b3BlbnNzbF9wcml2YXRlX2VuY3J5cHR8b3BlbnNzbF9wdWJsaWNfZGVjcnlwdHxvcGVuc3NsX3B1YmxpY19lbmNyeXB0fCcgKwogICAgICAgICdvcGVuc3NsX3JhbmRvbV9wc2V1ZG9fYnl0ZXN8b3BlbnNzbF9zZWFsfG9wZW5zc2xfc2lnbnxvcGVuc3NsX3ZlcmlmeXxvcGVuc3NsX3g1MDlfY2hlY2tfcHJpdmF0ZV9rZXl8b3BlbnNzbF94NTA5X2NoZWNrcHVycG9zZXwnICsKICAgICAgICAnb3BlbnNzbF94NTA5X2V4cG9ydHxvcGVuc3NsX3g1MDlfZXhwb3J0X3RvX2ZpbGV8b3BlbnNzbF94NTA5X2ZyZWV8b3BlbnNzbF94NTA5X3BhcnNlfG9wZW5zc2xfeDUwOV9yZWFkfG9yZHxvdXRlcml0ZXJhdG9yfCcgKwogICAgICAgICdvdXRvZmJvdW5kc2V4Y2VwdGlvbnxvdXRvZnJhbmdlZXhjZXB0aW9ufG91dHB1dF9hZGRfcmV3cml0ZV92YXJ8b3V0cHV0X3Jlc2V0X3Jld3JpdGVfdmFyc3xvdmVyZmxvd2V4Y2VwdGlvbnxvdmVybG9hZHxvdmVycmlkZV9mdW5jdGlvbnwnICsKICAgICAgICAnb3ZyaW1vc19jbG9zZXxvdnJpbW9zX2NvbW1pdHxvdnJpbW9zX2Nvbm5lY3R8b3ZyaW1vc19jdXJzb3J8b3ZyaW1vc19leGVjfG92cmltb3NfZXhlY3V0ZXxvdnJpbW9zX2ZldGNoX2ludG98b3ZyaW1vc19mZXRjaF9yb3d8JyArCiAgICAgICAgJ292cmltb3NfZmllbGRfbGVufG92cmltb3NfZmllbGRfbmFtZXxvdnJpbW9zX2ZpZWxkX251bXxvdnJpbW9zX2ZpZWxkX3R5cGV8b3ZyaW1vc19mcmVlX3Jlc3VsdHxvdnJpbW9zX2xvbmdyZWFkbGVufG92cmltb3NfbnVtX2ZpZWxkc3wnICsKICAgICAgICAnb3ZyaW1vc19udW1fcm93c3xvdnJpbW9zX3ByZXBhcmV8b3ZyaW1vc19yZXN1bHR8b3ZyaW1vc19yZXN1bHRfYWxsfG92cmltb3Nfcm9sbGJhY2t8cGFja3xwYXJlbnRpdGVyYXRvcnxwYXJzZV9pbmlfZmlsZXxwYXJzZV9pbmlfc3RyaW5nfCcgKwogICAgICAgICdwYXJzZV9zdHJ8cGFyc2VfdXJsfHBhcnNla2l0X2NvbXBpbGVfZmlsZXxwYXJzZWtpdF9jb21waWxlX3N0cmluZ3xwYXJzZWtpdF9mdW5jX2FyZ2luZm98cGFzc3RocnV8cGF0aGluZm98cGNsb3NlfHBjbnRsX2FsYXJtfHBjbnRsX2V4ZWN8JyArCiAgICAgICAgJ3BjbnRsX2Zvcmt8cGNudGxfZ2V0cHJpb3JpdHl8cGNudGxfc2V0cHJpb3JpdHl8cGNudGxfc2lnbmFsfHBjbnRsX3NpZ25hbF9kaXNwYXRjaHxwY250bF9zaWdwcm9jbWFza3xwY250bF9zaWd0aW1lZHdhaXR8cGNudGxfc2lnd2FpdGluZm98JyArCiAgICAgICAgJ3BjbnRsX3dhaXR8cGNudGxfd2FpdHBpZHxwY250bF93ZXhpdHN0YXR1c3xwY250bF93aWZleGl0ZWR8cGNudGxfd2lmc2lnbmFsZWR8cGNudGxfd2lmc3RvcHBlZHxwY250bF93c3RvcHNpZ3xwY250bF93dGVybXNpZ3wnICsKICAgICAgICAncGRmX2FjdGl2YXRlX2l0ZW18cGRmX2FkZF9hbm5vdGF0aW9ufHBkZl9hZGRfYm9va21hcmt8cGRmX2FkZF9sYXVuY2hsaW5rfHBkZl9hZGRfbG9jYWxsaW5rfHBkZl9hZGRfbmFtZWRkZXN0fHBkZl9hZGRfbm90ZXxwZGZfYWRkX291dGxpbmV8JyArCiAgICAgICAgJ3BkZl9hZGRfcGRmbGlua3xwZGZfYWRkX3RhYmxlX2NlbGx8cGRmX2FkZF90ZXh0Zmxvd3xwZGZfYWRkX3RodW1ibmFpbHxwZGZfYWRkX3dlYmxpbmt8cGRmX2FyY3xwZGZfYXJjbnxwZGZfYXR0YWNoX2ZpbGV8cGRmX2JlZ2luX2RvY3VtZW50fCcgKwogICAgICAgICdwZGZfYmVnaW5fZm9udHxwZGZfYmVnaW5fZ2x5cGh8cGRmX2JlZ2luX2l0ZW18cGRmX2JlZ2luX2xheWVyfHBkZl9iZWdpbl9wYWdlfHBkZl9iZWdpbl9wYWdlX2V4dHxwZGZfYmVnaW5fcGF0dGVybnxwZGZfYmVnaW5fdGVtcGxhdGV8JyArCiAgICAgICAgJ3BkZl9iZWdpbl90ZW1wbGF0ZV9leHR8cGRmX2NpcmNsZXxwZGZfY2xpcHxwZGZfY2xvc2V8cGRmX2Nsb3NlX2ltYWdlfHBkZl9jbG9zZV9wZGl8cGRmX2Nsb3NlX3BkaV9wYWdlfHBkZl9jbG9zZXBhdGh8JyArCiAgICAgICAgJ3BkZl9jbG9zZXBhdGhfZmlsbF9zdHJva2V8cGRmX2Nsb3NlcGF0aF9zdHJva2V8cGRmX2NvbmNhdHxwZGZfY29udGludWVfdGV4dHxwZGZfY3JlYXRlXzNkdmlld3xwZGZfY3JlYXRlX2FjdGlvbnxwZGZfY3JlYXRlX2Fubm90YXRpb258JyArCiAgICAgICAgJ3BkZl9jcmVhdGVfYm9va21hcmt8cGRmX2NyZWF0ZV9maWVsZHxwZGZfY3JlYXRlX2ZpZWxkZ3JvdXB8cGRmX2NyZWF0ZV9nc3RhdGV8cGRmX2NyZWF0ZV9wdmZ8cGRmX2NyZWF0ZV90ZXh0Zmxvd3xwZGZfY3VydmV0b3wnICsKICAgICAgICAncGRmX2RlZmluZV9sYXllcnxwZGZfZGVsZXRlfHBkZl9kZWxldGVfcHZmfHBkZl9kZWxldGVfdGFibGV8cGRmX2RlbGV0ZV90ZXh0Zmxvd3xwZGZfZW5jb2Rpbmdfc2V0X2NoYXJ8cGRmX2VuZF9kb2N1bWVudHxwZGZfZW5kX2ZvbnR8JyArCiAgICAgICAgJ3BkZl9lbmRfZ2x5cGh8cGRmX2VuZF9pdGVtfHBkZl9lbmRfbGF5ZXJ8cGRmX2VuZF9wYWdlfHBkZl9lbmRfcGFnZV9leHR8cGRmX2VuZF9wYXR0ZXJufHBkZl9lbmRfdGVtcGxhdGV8cGRmX2VuZHBhdGh8cGRmX2ZpbGx8JyArCiAgICAgICAgJ3BkZl9maWxsX2ltYWdlYmxvY2t8cGRmX2ZpbGxfcGRmYmxvY2t8cGRmX2ZpbGxfc3Ryb2tlfHBkZl9maWxsX3RleHRibG9ja3xwZGZfZmluZGZvbnR8cGRmX2ZpdF9pbWFnZXxwZGZfZml0X3BkaV9wYWdlfHBkZl9maXRfdGFibGV8JyArCiAgICAgICAgJ3BkZl9maXRfdGV4dGZsb3d8cGRmX2ZpdF90ZXh0bGluZXxwZGZfZ2V0X2FwaW5hbWV8cGRmX2dldF9idWZmZXJ8cGRmX2dldF9lcnJtc2d8cGRmX2dldF9lcnJudW18cGRmX2dldF9mb250fHBkZl9nZXRfZm9udG5hbWV8JyArCiAgICAgICAgJ3BkZl9nZXRfZm9udHNpemV8cGRmX2dldF9pbWFnZV9oZWlnaHR8cGRmX2dldF9pbWFnZV93aWR0aHxwZGZfZ2V0X21ham9ydmVyc2lvbnxwZGZfZ2V0X21pbm9ydmVyc2lvbnxwZGZfZ2V0X3BhcmFtZXRlcnwnICsKICAgICAgICAncGRmX2dldF9wZGlfcGFyYW1ldGVyfHBkZl9nZXRfcGRpX3ZhbHVlfHBkZl9nZXRfdmFsdWV8cGRmX2luZm9fZm9udHxwZGZfaW5mb19tYXRjaGJveHxwZGZfaW5mb190YWJsZXxwZGZfaW5mb190ZXh0Zmxvd3xwZGZfaW5mb190ZXh0bGluZXwnICsKICAgICAgICAncGRmX2luaXRncmFwaGljc3xwZGZfbGluZXRvfHBkZl9sb2FkXzNkZGF0YXxwZGZfbG9hZF9mb250fHBkZl9sb2FkX2ljY3Byb2ZpbGV8cGRmX2xvYWRfaW1hZ2V8cGRmX21ha2VzcG90Y29sb3J8cGRmX21vdmV0b3xwZGZfbmV3fCcgKwogICAgICAgICdwZGZfb3Blbl9jY2l0dHxwZGZfb3Blbl9maWxlfHBkZl9vcGVuX2dpZnxwZGZfb3Blbl9pbWFnZXxwZGZfb3Blbl9pbWFnZV9maWxlfHBkZl9vcGVuX2pwZWd8cGRmX29wZW5fbWVtb3J5X2ltYWdlfHBkZl9vcGVuX3BkaXwnICsKICAgICAgICAncGRmX29wZW5fcGRpX2RvY3VtZW50fHBkZl9vcGVuX3BkaV9wYWdlfHBkZl9vcGVuX3RpZmZ8cGRmX3Bjb3NfZ2V0X251bWJlcnxwZGZfcGNvc19nZXRfc3RyZWFtfHBkZl9wY29zX2dldF9zdHJpbmd8cGRmX3BsYWNlX2ltYWdlfCcgKwogICAgICAgICdwZGZfcGxhY2VfcGRpX3BhZ2V8cGRmX3Byb2Nlc3NfcGRpfHBkZl9yZWN0fHBkZl9yZXN0b3JlfHBkZl9yZXN1bWVfcGFnZXxwZGZfcm90YXRlfHBkZl9zYXZlfHBkZl9zY2FsZXxwZGZfc2V0X2JvcmRlcl9jb2xvcnwnICsKICAgICAgICAncGRmX3NldF9ib3JkZXJfZGFzaHxwZGZfc2V0X2JvcmRlcl9zdHlsZXxwZGZfc2V0X2NoYXJfc3BhY2luZ3xwZGZfc2V0X2R1cmF0aW9ufHBkZl9zZXRfZ3N0YXRlfHBkZl9zZXRfaG9yaXpfc2NhbGluZ3xwZGZfc2V0X2luZm98JyArCiAgICAgICAgJ3BkZl9zZXRfaW5mb19hdXRob3J8cGRmX3NldF9pbmZvX2NyZWF0b3J8cGRmX3NldF9pbmZvX2tleXdvcmRzfHBkZl9zZXRfaW5mb19zdWJqZWN0fHBkZl9zZXRfaW5mb190aXRsZXxwZGZfc2V0X2xheWVyX2RlcGVuZGVuY3l8JyArCiAgICAgICAgJ3BkZl9zZXRfbGVhZGluZ3xwZGZfc2V0X3BhcmFtZXRlcnxwZGZfc2V0X3RleHRfbWF0cml4fHBkZl9zZXRfdGV4dF9wb3N8cGRmX3NldF90ZXh0X3JlbmRlcmluZ3xwZGZfc2V0X3RleHRfcmlzZXxwZGZfc2V0X3ZhbHVlfCcgKwogICAgICAgICdwZGZfc2V0X3dvcmRfc3BhY2luZ3xwZGZfc2V0Y29sb3J8cGRmX3NldGRhc2h8cGRmX3NldGRhc2hwYXR0ZXJufHBkZl9zZXRmbGF0fHBkZl9zZXRmb250fHBkZl9zZXRncmF5fHBkZl9zZXRncmF5X2ZpbGx8cGRmX3NldGdyYXlfc3Ryb2tlfCcgKwogICAgICAgICdwZGZfc2V0bGluZWNhcHxwZGZfc2V0bGluZWpvaW58cGRmX3NldGxpbmV3aWR0aHxwZGZfc2V0bWF0cml4fHBkZl9zZXRtaXRlcmxpbWl0fHBkZl9zZXRwb2x5ZGFzaHxwZGZfc2V0cmdiY29sb3J8cGRmX3NldHJnYmNvbG9yX2ZpbGx8JyArCiAgICAgICAgJ3BkZl9zZXRyZ2Jjb2xvcl9zdHJva2V8cGRmX3NoYWRpbmd8cGRmX3NoYWRpbmdfcGF0dGVybnxwZGZfc2hmaWxsfHBkZl9zaG93fHBkZl9zaG93X2JveGVkfHBkZl9zaG93X3h5fHBkZl9za2V3fHBkZl9zdHJpbmd3aWR0aHxwZGZfc3Ryb2tlfCcgKwogICAgICAgICdwZGZfc3VzcGVuZF9wYWdlfHBkZl90cmFuc2xhdGV8cGRmX3V0ZjE2X3RvX3V0Zjh8cGRmX3V0ZjMyX3RvX3V0ZjE2fHBkZl91dGY4X3RvX3V0ZjE2fHBkb3xwZG9fY3VicmlkX3NjaGVtYXxwZG9fcGdzcWxsb2JjcmVhdGV8JyArCiAgICAgICAgJ3Bkb19wZ3NxbGxvYm9wZW58cGRvX3Bnc3FsbG9idW5saW5rfHBkb19zcWxpdGVjcmVhdGVhZ2dyZWdhdGV8cGRvX3NxbGl0ZWNyZWF0ZWZ1bmN0aW9ufHBkb2V4Y2VwdGlvbnxwZG9zdGF0ZW1lbnR8cGZzb2Nrb3BlbnwnICsKICAgICAgICAncGdfYWZmZWN0ZWRfcm93c3xwZ19jYW5jZWxfcXVlcnl8cGdfY2xpZW50X2VuY29kaW5nfHBnX2Nsb3NlfHBnX2Nvbm5lY3R8cGdfY29ubmVjdGlvbl9idXN5fHBnX2Nvbm5lY3Rpb25fcmVzZXR8cGdfY29ubmVjdGlvbl9zdGF0dXN8JyArCiAgICAgICAgJ3BnX2NvbnZlcnR8cGdfY29weV9mcm9tfHBnX2NvcHlfdG98cGdfZGJuYW1lfHBnX2RlbGV0ZXxwZ19lbmRfY29weXxwZ19lc2NhcGVfYnl0ZWF8cGdfZXNjYXBlX3N0cmluZ3xwZ19leGVjdXRlfHBnX2ZldGNoX2FsbHwnICsKICAgICAgICAncGdfZmV0Y2hfYWxsX2NvbHVtbnN8cGdfZmV0Y2hfYXJyYXl8cGdfZmV0Y2hfYXNzb2N8cGdfZmV0Y2hfb2JqZWN0fHBnX2ZldGNoX3Jlc3VsdHxwZ19mZXRjaF9yb3d8cGdfZmllbGRfaXNfbnVsbHxwZ19maWVsZF9uYW1lfCcgKwogICAgICAgICdwZ19maWVsZF9udW18cGdfZmllbGRfcHJ0bGVufHBnX2ZpZWxkX3NpemV8cGdfZmllbGRfdGFibGV8cGdfZmllbGRfdHlwZXxwZ19maWVsZF90eXBlX29pZHxwZ19mcmVlX3Jlc3VsdHxwZ19nZXRfbm90aWZ5fHBnX2dldF9waWR8JyArCiAgICAgICAgJ3BnX2dldF9yZXN1bHR8cGdfaG9zdHxwZ19pbnNlcnR8cGdfbGFzdF9lcnJvcnxwZ19sYXN0X25vdGljZXxwZ19sYXN0X29pZHxwZ19sb19jbG9zZXxwZ19sb19jcmVhdGV8cGdfbG9fZXhwb3J0fHBnX2xvX2ltcG9ydHxwZ19sb19vcGVufCcgKwogICAgICAgICdwZ19sb19yZWFkfHBnX2xvX3JlYWRfYWxsfHBnX2xvX3NlZWt8cGdfbG9fdGVsbHxwZ19sb191bmxpbmt8cGdfbG9fd3JpdGV8cGdfbWV0YV9kYXRhfHBnX251bV9maWVsZHN8cGdfbnVtX3Jvd3N8cGdfb3B0aW9uc3wnICsKICAgICAgICAncGdfcGFyYW1ldGVyX3N0YXR1c3xwZ19wY29ubmVjdHxwZ19waW5nfHBnX3BvcnR8cGdfcHJlcGFyZXxwZ19wdXRfbGluZXxwZ19xdWVyeXxwZ19xdWVyeV9wYXJhbXN8cGdfcmVzdWx0X2Vycm9yfHBnX3Jlc3VsdF9lcnJvcl9maWVsZHwnICsKICAgICAgICAncGdfcmVzdWx0X3NlZWt8cGdfcmVzdWx0X3N0YXR1c3xwZ19zZWxlY3R8cGdfc2VuZF9leGVjdXRlfHBnX3NlbmRfcHJlcGFyZXxwZ19zZW5kX3F1ZXJ5fHBnX3NlbmRfcXVlcnlfcGFyYW1zfHBnX3NldF9jbGllbnRfZW5jb2Rpbmd8JyArCiAgICAgICAgJ3BnX3NldF9lcnJvcl92ZXJib3NpdHl8cGdfdHJhY2V8cGdfdHJhbnNhY3Rpb25fc3RhdHVzfHBnX3R0eXxwZ191bmVzY2FwZV9ieXRlYXxwZ191bnRyYWNlfHBnX3VwZGF0ZXxwZ192ZXJzaW9ufHBocF9jaGVja19zeW50YXh8JyArCiAgICAgICAgJ3BocF9pbmlfbG9hZGVkX2ZpbGV8cGhwX2luaV9zY2FubmVkX2ZpbGVzfHBocF9sb2dvX2d1aWR8cGhwX3NhcGlfbmFtZXxwaHBfc3RyaXBfd2hpdGVzcGFjZXxwaHBfdW5hbWV8cGhwY3JlZGl0c3xwaHBpbmZvfHBocHZlcnNpb258cGl8JyArCiAgICAgICAgJ3BuZzJ3Ym1wfHBvcGVufHBvc3xwb3NpeF9hY2Nlc3N8cG9zaXhfY3Rlcm1pZHxwb3NpeF9lcnJub3xwb3NpeF9nZXRfbGFzdF9lcnJvcnxwb3NpeF9nZXRjd2R8cG9zaXhfZ2V0ZWdpZHxwb3NpeF9nZXRldWlkfHBvc2l4X2dldGdpZHwnICsKICAgICAgICAncG9zaXhfZ2V0Z3JnaWR8cG9zaXhfZ2V0Z3JuYW18cG9zaXhfZ2V0Z3JvdXBzfHBvc2l4X2dldGxvZ2lufHBvc2l4X2dldHBnaWR8cG9zaXhfZ2V0cGdycHxwb3NpeF9nZXRwaWR8cG9zaXhfZ2V0cHBpZHxwb3NpeF9nZXRwd25hbXwnICsKICAgICAgICAncG9zaXhfZ2V0cHd1aWR8cG9zaXhfZ2V0cmxpbWl0fHBvc2l4X2dldHNpZHxwb3NpeF9nZXR1aWR8cG9zaXhfaW5pdGdyb3Vwc3xwb3NpeF9pc2F0dHl8cG9zaXhfa2lsbHxwb3NpeF9ta2ZpZm98cG9zaXhfbWtub2R8cG9zaXhfc2V0ZWdpZHwnICsKICAgICAgICAncG9zaXhfc2V0ZXVpZHxwb3NpeF9zZXRnaWR8cG9zaXhfc2V0cGdpZHxwb3NpeF9zZXRzaWR8cG9zaXhfc2V0dWlkfHBvc2l4X3N0cmVycm9yfHBvc2l4X3RpbWVzfHBvc2l4X3R0eW5hbWV8cG9zaXhfdW5hbWV8cG93fHByZWdfZmlsdGVyfCcgKwogICAgICAgICdwcmVnX2dyZXB8cHJlZ19sYXN0X2Vycm9yfHByZWdfbWF0Y2h8cHJlZ19tYXRjaF9hbGx8cHJlZ19xdW90ZXxwcmVnX3JlcGxhY2V8cHJlZ19yZXBsYWNlX2NhbGxiYWNrfHByZWdfc3BsaXR8cHJldnxwcmludHxwcmludF9yfCcgKwogICAgICAgICdwcmludGVyX2Fib3J0fHByaW50ZXJfY2xvc2V8cHJpbnRlcl9jcmVhdGVfYnJ1c2h8cHJpbnRlcl9jcmVhdGVfZGN8cHJpbnRlcl9jcmVhdGVfZm9udHxwcmludGVyX2NyZWF0ZV9wZW58cHJpbnRlcl9kZWxldGVfYnJ1c2h8JyArCiAgICAgICAgJ3ByaW50ZXJfZGVsZXRlX2RjfHByaW50ZXJfZGVsZXRlX2ZvbnR8cHJpbnRlcl9kZWxldGVfcGVufHByaW50ZXJfZHJhd19ibXB8cHJpbnRlcl9kcmF3X2Nob3JkfHByaW50ZXJfZHJhd19lbGlwc2V8cHJpbnRlcl9kcmF3X2xpbmV8JyArCiAgICAgICAgJ3ByaW50ZXJfZHJhd19waWV8cHJpbnRlcl9kcmF3X3JlY3RhbmdsZXxwcmludGVyX2RyYXdfcm91bmRyZWN0fHByaW50ZXJfZHJhd190ZXh0fHByaW50ZXJfZW5kX2RvY3xwcmludGVyX2VuZF9wYWdlfHByaW50ZXJfZ2V0X29wdGlvbnwnICsKICAgICAgICAncHJpbnRlcl9saXN0fHByaW50ZXJfbG9naWNhbF9mb250aGVpZ2h0fHByaW50ZXJfb3BlbnxwcmludGVyX3NlbGVjdF9icnVzaHxwcmludGVyX3NlbGVjdF9mb250fHByaW50ZXJfc2VsZWN0X3BlbnxwcmludGVyX3NldF9vcHRpb258JyArCiAgICAgICAgJ3ByaW50ZXJfc3RhcnRfZG9jfHByaW50ZXJfc3RhcnRfcGFnZXxwcmludGVyX3dyaXRlfHByaW50Znxwcm9jX2Nsb3NlfHByb2NfZ2V0X3N0YXR1c3xwcm9jX25pY2V8cHJvY19vcGVufHByb2NfdGVybWluYXRlfHByb3BlcnR5X2V4aXN0c3wnICsKICAgICAgICAncHNfYWRkX2Jvb2ttYXJrfHBzX2FkZF9sYXVuY2hsaW5rfHBzX2FkZF9sb2NhbGxpbmt8cHNfYWRkX25vdGV8cHNfYWRkX3BkZmxpbmt8cHNfYWRkX3dlYmxpbmt8cHNfYXJjfHBzX2FyY258cHNfYmVnaW5fcGFnZXwnICsKICAgICAgICAncHNfYmVnaW5fcGF0dGVybnxwc19iZWdpbl90ZW1wbGF0ZXxwc19jaXJjbGV8cHNfY2xpcHxwc19jbG9zZXxwc19jbG9zZV9pbWFnZXxwc19jbG9zZXBhdGh8cHNfY2xvc2VwYXRoX3N0cm9rZXxwc19jb250aW51ZV90ZXh0fHBzX2N1cnZldG98JyArCiAgICAgICAgJ3BzX2RlbGV0ZXxwc19lbmRfcGFnZXxwc19lbmRfcGF0dGVybnxwc19lbmRfdGVtcGxhdGV8cHNfZmlsbHxwc19maWxsX3N0cm9rZXxwc19maW5kZm9udHxwc19nZXRfYnVmZmVyfHBzX2dldF9wYXJhbWV0ZXJ8cHNfZ2V0X3ZhbHVlfCcgKwogICAgICAgICdwc19oeXBoZW5hdGV8cHNfaW5jbHVkZV9maWxlfHBzX2xpbmV0b3xwc19tYWtlc3BvdGNvbG9yfHBzX21vdmV0b3xwc19uZXd8cHNfb3Blbl9maWxlfHBzX29wZW5faW1hZ2V8cHNfb3Blbl9pbWFnZV9maWxlfCcgKwogICAgICAgICdwc19vcGVuX21lbW9yeV9pbWFnZXxwc19wbGFjZV9pbWFnZXxwc19yZWN0fHBzX3Jlc3RvcmV8cHNfcm90YXRlfHBzX3NhdmV8cHNfc2NhbGV8cHNfc2V0X2JvcmRlcl9jb2xvcnxwc19zZXRfYm9yZGVyX2Rhc2h8JyArCiAgICAgICAgJ3BzX3NldF9ib3JkZXJfc3R5bGV8cHNfc2V0X2luZm98cHNfc2V0X3BhcmFtZXRlcnxwc19zZXRfdGV4dF9wb3N8cHNfc2V0X3ZhbHVlfHBzX3NldGNvbG9yfHBzX3NldGRhc2h8cHNfc2V0ZmxhdHxwc19zZXRmb250fHBzX3NldGdyYXl8JyArCiAgICAgICAgJ3BzX3NldGxpbmVjYXB8cHNfc2V0bGluZWpvaW58cHNfc2V0bGluZXdpZHRofHBzX3NldG1pdGVybGltaXR8cHNfc2V0b3ZlcnByaW50bW9kZXxwc19zZXRwb2x5ZGFzaHxwc19zaGFkaW5nfHBzX3NoYWRpbmdfcGF0dGVybnxwc19zaGZpbGx8JyArCiAgICAgICAgJ3BzX3Nob3d8cHNfc2hvdzJ8cHNfc2hvd19ib3hlZHxwc19zaG93X3h5fHBzX3Nob3dfeHkyfHBzX3N0cmluZ19nZW9tZXRyeXxwc19zdHJpbmd3aWR0aHxwc19zdHJva2V8cHNfc3ltYm9sfHBzX3N5bWJvbF9uYW1lfCcgKwogICAgICAgICdwc19zeW1ib2xfd2lkdGh8cHNfdHJhbnNsYXRlfHBzcGVsbF9hZGRfdG9fcGVyc29uYWx8cHNwZWxsX2FkZF90b19zZXNzaW9ufHBzcGVsbF9jaGVja3xwc3BlbGxfY2xlYXJfc2Vzc2lvbnxwc3BlbGxfY29uZmlnX2NyZWF0ZXwnICsKICAgICAgICAncHNwZWxsX2NvbmZpZ19kYXRhX2Rpcnxwc3BlbGxfY29uZmlnX2RpY3RfZGlyfHBzcGVsbF9jb25maWdfaWdub3JlfHBzcGVsbF9jb25maWdfbW9kZXxwc3BlbGxfY29uZmlnX3BlcnNvbmFsfHBzcGVsbF9jb25maWdfcmVwbHwnICsKICAgICAgICAncHNwZWxsX2NvbmZpZ19ydW50b2dldGhlcnxwc3BlbGxfY29uZmlnX3NhdmVfcmVwbHxwc3BlbGxfbmV3fHBzcGVsbF9uZXdfY29uZmlnfHBzcGVsbF9uZXdfcGVyc29uYWx8cHNwZWxsX3NhdmVfd29yZGxpc3R8JyArCiAgICAgICAgJ3BzcGVsbF9zdG9yZV9yZXBsYWNlbWVudHxwc3BlbGxfc3VnZ2VzdHxwdXRlbnZ8cHhfY2xvc2V8cHhfY3JlYXRlX2ZwfHB4X2RhdGUyc3RyaW5nfHB4X2RlbGV0ZXxweF9kZWxldGVfcmVjb3JkfHB4X2dldF9maWVsZHxweF9nZXRfaW5mb3wnICsKICAgICAgICAncHhfZ2V0X3BhcmFtZXRlcnxweF9nZXRfcmVjb3JkfHB4X2dldF9zY2hlbWF8cHhfZ2V0X3ZhbHVlfHB4X2luc2VydF9yZWNvcmR8cHhfbmV3fHB4X251bWZpZWxkc3xweF9udW1yZWNvcmRzfHB4X29wZW5fZnB8cHhfcHV0X3JlY29yZHwnICsKICAgICAgICAncHhfcmV0cmlldmVfcmVjb3JkfHB4X3NldF9ibG9iX2ZpbGV8cHhfc2V0X3BhcmFtZXRlcnxweF9zZXRfdGFibGVuYW1lfHB4X3NldF90YXJnZXRlbmNvZGluZ3xweF9zZXRfdmFsdWV8cHhfdGltZXN0YW1wMnN0cmluZ3wnICsKICAgICAgICAncHhfdXBkYXRlX3JlY29yZHxxZG9tX2Vycm9yfHFkb21fdHJlZXxxdW90ZWRfcHJpbnRhYmxlX2RlY29kZXxxdW90ZWRfcHJpbnRhYmxlX2VuY29kZXxxdW90ZW1ldGF8cmFkMmRlZ3xyYWRpdXNfYWNjdF9vcGVufCcgKwogICAgICAgICdyYWRpdXNfYWRkX3NlcnZlcnxyYWRpdXNfYXV0aF9vcGVufHJhZGl1c19jbG9zZXxyYWRpdXNfY29uZmlnfHJhZGl1c19jcmVhdGVfcmVxdWVzdHxyYWRpdXNfY3Z0X2FkZHJ8cmFkaXVzX2N2dF9pbnR8cmFkaXVzX2N2dF9zdHJpbmd8JyArCiAgICAgICAgJ3JhZGl1c19kZW1hbmdsZXxyYWRpdXNfZGVtYW5nbGVfbXBwZV9rZXl8cmFkaXVzX2dldF9hdHRyfHJhZGl1c19nZXRfdmVuZG9yX2F0dHJ8cmFkaXVzX3B1dF9hZGRyfHJhZGl1c19wdXRfYXR0cnxyYWRpdXNfcHV0X2ludHwnICsKICAgICAgICAncmFkaXVzX3B1dF9zdHJpbmd8cmFkaXVzX3B1dF92ZW5kb3JfYWRkcnxyYWRpdXNfcHV0X3ZlbmRvcl9hdHRyfHJhZGl1c19wdXRfdmVuZG9yX2ludHxyYWRpdXNfcHV0X3ZlbmRvcl9zdHJpbmd8JyArCiAgICAgICAgJ3JhZGl1c19yZXF1ZXN0X2F1dGhlbnRpY2F0b3J8cmFkaXVzX3NlbmRfcmVxdWVzdHxyYWRpdXNfc2VydmVyX3NlY3JldHxyYWRpdXNfc3RyZXJyb3J8cmFuZHxyYW5nZXxyYW5nZWV4Y2VwdGlvbnxyYXJfd3JhcHBlcl9jYWNoZV9zdGF0c3wnICsKICAgICAgICAncmFyYXJjaGl2ZXxyYXJlbnRyeXxyYXJleGNlcHRpb258cmF3dXJsZGVjb2RlfHJhd3VybGVuY29kZXxyZWFkX2V4aWZfZGF0YXxyZWFkZGlyfHJlYWRmaWxlfHJlYWRnemZpbGV8cmVhZGxpbmV8cmVhZGxpbmVfYWRkX2hpc3Rvcnl8JyArCiAgICAgICAgJ3JlYWRsaW5lX2NhbGxiYWNrX2hhbmRsZXJfaW5zdGFsbHxyZWFkbGluZV9jYWxsYmFja19oYW5kbGVyX3JlbW92ZXxyZWFkbGluZV9jYWxsYmFja19yZWFkX2NoYXJ8cmVhZGxpbmVfY2xlYXJfaGlzdG9yeXwnICsKICAgICAgICAncmVhZGxpbmVfY29tcGxldGlvbl9mdW5jdGlvbnxyZWFkbGluZV9pbmZvfHJlYWRsaW5lX2xpc3RfaGlzdG9yeXxyZWFkbGluZV9vbl9uZXdfbGluZXxyZWFkbGluZV9yZWFkX2hpc3Rvcnl8cmVhZGxpbmVfcmVkaXNwbGF5fCcgKwogICAgICAgICdyZWFkbGluZV93cml0ZV9oaXN0b3J5fHJlYWRsaW5rfHJlYWxwYXRofHJlYWxwYXRoX2NhY2hlX2dldHxyZWFscGF0aF9jYWNoZV9zaXplfHJlY29kZXxyZWNvZGVfZmlsZXxyZWNvZGVfc3RyaW5nfHJlY3Vyc2l2ZWFycmF5aXRlcmF0b3J8JyArCiAgICAgICAgJ3JlY3Vyc2l2ZWNhY2hpbmdpdGVyYXRvcnxyZWN1cnNpdmVjYWxsYmFja2ZpbHRlcml0ZXJhdG9yfHJlY3Vyc2l2ZWRpcmVjdG9yeWl0ZXJhdG9yfHJlY3Vyc2l2ZWZpbHRlcml0ZXJhdG9yfHJlY3Vyc2l2ZWl0ZXJhdG9yfCcgKwogICAgICAgICdyZWN1cnNpdmVpdGVyYXRvcml0ZXJhdG9yfHJlY3Vyc2l2ZXJlZ2V4aXRlcmF0b3J8cmVjdXJzaXZldHJlZWl0ZXJhdG9yfHJlZmxlY3Rpb258cmVmbGVjdGlvbmNsYXNzfHJlZmxlY3Rpb25leGNlcHRpb258cmVmbGVjdGlvbmV4dGVuc2lvbnwnICsKICAgICAgICAncmVmbGVjdGlvbmZ1bmN0aW9ufHJlZmxlY3Rpb25mdW5jdGlvbmFic3RyYWN0fHJlZmxlY3Rpb25tZXRob2R8cmVmbGVjdGlvbm9iamVjdHxyZWZsZWN0aW9ucGFyYW1ldGVyfHJlZmxlY3Rpb25wcm9wZXJ0eXxyZWZsZWN0b3J8JyArCiAgICAgICAgJ3JlZ2V4aXRlcmF0b3J8cmVnaXN0ZXJfc2h1dGRvd25fZnVuY3Rpb258cmVnaXN0ZXJfdGlja19mdW5jdGlvbnxyZW5hbWV8cmVuYW1lX2Z1bmN0aW9ufHJlcXVpcmV8cmVxdWlyZV9vbmNlfHJlc2V0fHJlc2V0VmFsdWV8JyArCiAgICAgICAgJ3Jlc291cmNlYnVuZGxlfHJlc3RvcmVfZXJyb3JfaGFuZGxlcnxyZXN0b3JlX2V4Y2VwdGlvbl9oYW5kbGVyfHJlc3RvcmVfaW5jbHVkZV9wYXRofHJldHVybnxyZXdpbmR8cmV3aW5kZGlyfHJtZGlyfHJvdW5kfHJwbV9jbG9zZXwnICsKICAgICAgICAncnBtX2dldF90YWd8cnBtX2lzX3ZhbGlkfHJwbV9vcGVufHJwbV92ZXJzaW9ufHJyZF9jcmVhdGV8cnJkX2Vycm9yfHJyZF9mZXRjaHxycmRfZmlyc3R8cnJkX2dyYXBofHJyZF9pbmZvfHJyZF9sYXN0fHJyZF9sYXN0dXBkYXRlfCcgKwogICAgICAgICdycmRfcmVzdG9yZXxycmRfdHVuZXxycmRfdXBkYXRlfHJyZF94cG9ydHxycmRjcmVhdG9yfHJyZGdyYXBofHJyZHVwZGF0ZXJ8cnNvcnR8cnRyaW18cnVua2l0X2NsYXNzX2Fkb3B0fHJ1bmtpdF9jbGFzc19lbWFuY2lwYXRlfCcgKwogICAgICAgICdydW5raXRfY29uc3RhbnRfYWRkfHJ1bmtpdF9jb25zdGFudF9yZWRlZmluZXxydW5raXRfY29uc3RhbnRfcmVtb3ZlfHJ1bmtpdF9mdW5jdGlvbl9hZGR8cnVua2l0X2Z1bmN0aW9uX2NvcHl8cnVua2l0X2Z1bmN0aW9uX3JlZGVmaW5lfCcgKwogICAgICAgICdydW5raXRfZnVuY3Rpb25fcmVtb3ZlfHJ1bmtpdF9mdW5jdGlvbl9yZW5hbWV8cnVua2l0X2ltcG9ydHxydW5raXRfbGludHxydW5raXRfbGludF9maWxlfHJ1bmtpdF9tZXRob2RfYWRkfHJ1bmtpdF9tZXRob2RfY29weXwnICsKICAgICAgICAncnVua2l0X21ldGhvZF9yZWRlZmluZXxydW5raXRfbWV0aG9kX3JlbW92ZXxydW5raXRfbWV0aG9kX3JlbmFtZXxydW5raXRfcmV0dXJuX3ZhbHVlX3VzZWR8cnVua2l0X3NhbmRib3hfb3V0cHV0X2hhbmRsZXJ8JyArCiAgICAgICAgJ3J1bmtpdF9zdXBlcmdsb2JhbHN8cnVudGltZWV4Y2VwdGlvbnxzYW1jb25uZWN0aW9uX2NvbW1pdHxzYW1jb25uZWN0aW9uX2Nvbm5lY3R8c2FtY29ubmVjdGlvbl9jb25zdHJ1Y3RvcnxzYW1jb25uZWN0aW9uX2Rpc2Nvbm5lY3R8JyArCiAgICAgICAgJ3NhbWNvbm5lY3Rpb25fZXJybm98c2FtY29ubmVjdGlvbl9lcnJvcnxzYW1jb25uZWN0aW9uX2lzY29ubmVjdGVkfHNhbWNvbm5lY3Rpb25fcGVla3xzYW1jb25uZWN0aW9uX3BlZWthbGx8c2FtY29ubmVjdGlvbl9yZWNlaXZlfCcgKwogICAgICAgICdzYW1jb25uZWN0aW9uX3JlbW92ZXxzYW1jb25uZWN0aW9uX3JvbGxiYWNrfHNhbWNvbm5lY3Rpb25fc2VuZHxzYW1jb25uZWN0aW9uX3NldERlYnVnfHNhbWNvbm5lY3Rpb25fc3Vic2NyaWJlfHNhbWNvbm5lY3Rpb25fdW5zdWJzY3JpYmV8JyArCiAgICAgICAgJ3NhbW1lc3NhZ2VfYm9keXxzYW1tZXNzYWdlX2NvbnN0cnVjdG9yfHNhbW1lc3NhZ2VfaGVhZGVyfHNjYV9jcmVhdGVkYXRhb2JqZWN0fHNjYV9nZXRzZXJ2aWNlfHNjYV9sb2NhbHByb3h5X2NyZWF0ZWRhdGFvYmplY3R8JyArCiAgICAgICAgJ3NjYV9zb2FwcHJveHlfY3JlYXRlZGF0YW9iamVjdHxzY2FuZGlyfHNkb19kYXNfY2hhbmdlc3VtbWFyeV9iZWdpbmxvZ2dpbmd8c2RvX2Rhc19jaGFuZ2VzdW1tYXJ5X2VuZGxvZ2dpbmd8JyArCiAgICAgICAgJ3Nkb19kYXNfY2hhbmdlc3VtbWFyeV9nZXRjaGFuZ2VkZGF0YW9iamVjdHN8c2RvX2Rhc19jaGFuZ2VzdW1tYXJ5X2dldGNoYW5nZXR5cGV8c2RvX2Rhc19jaGFuZ2VzdW1tYXJ5X2dldG9sZGNvbnRhaW5lcnwnICsKICAgICAgICAnc2RvX2Rhc19jaGFuZ2VzdW1tYXJ5X2dldG9sZHZhbHVlc3xzZG9fZGFzX2NoYW5nZXN1bW1hcnlfaXNsb2dnaW5nfHNkb19kYXNfZGF0YWZhY3RvcnlfYWRkcHJvcGVydHl0b3R5cGV8c2RvX2Rhc19kYXRhZmFjdG9yeV9hZGR0eXBlfCcgKwogICAgICAgICdzZG9fZGFzX2RhdGFmYWN0b3J5X2dldGRhdGFmYWN0b3J5fHNkb19kYXNfZGF0YW9iamVjdF9nZXRjaGFuZ2VzdW1tYXJ5fHNkb19kYXNfcmVsYXRpb25hbF9hcHBseWNoYW5nZXN8c2RvX2Rhc19yZWxhdGlvbmFsX2NvbnN0cnVjdHwnICsKICAgICAgICAnc2RvX2Rhc19yZWxhdGlvbmFsX2NyZWF0ZXJvb3RkYXRhb2JqZWN0fHNkb19kYXNfcmVsYXRpb25hbF9leGVjdXRlcHJlcGFyZWRxdWVyeXxzZG9fZGFzX3JlbGF0aW9uYWxfZXhlY3V0ZXF1ZXJ5fCcgKwogICAgICAgICdzZG9fZGFzX3NldHRpbmdfZ2V0bGlzdGluZGV4fHNkb19kYXNfc2V0dGluZ19nZXRwcm9wZXJ0eWluZGV4fHNkb19kYXNfc2V0dGluZ19nZXRwcm9wZXJ0eW5hbWV8c2RvX2Rhc19zZXR0aW5nX2dldHZhbHVlfCcgKwogICAgICAgICdzZG9fZGFzX3NldHRpbmdfaXNzZXR8c2RvX2Rhc194bWxfYWRkdHlwZXN8c2RvX2Rhc194bWxfY3JlYXRlfHNkb19kYXNfeG1sX2NyZWF0ZWRhdGFvYmplY3R8c2RvX2Rhc194bWxfY3JlYXRlZG9jdW1lbnR8JyArCiAgICAgICAgJ3Nkb19kYXNfeG1sX2RvY3VtZW50X2dldHJvb3RkYXRhb2JqZWN0fHNkb19kYXNfeG1sX2RvY3VtZW50X2dldHJvb3RlbGVtZW50bmFtZXxzZG9fZGFzX3htbF9kb2N1bWVudF9nZXRyb290ZWxlbWVudHVyaXwnICsKICAgICAgICAnc2RvX2Rhc194bWxfZG9jdW1lbnRfc2V0ZW5jb2Rpbmd8c2RvX2Rhc194bWxfZG9jdW1lbnRfc2V0eG1sZGVjbGFyYXRpb258c2RvX2Rhc194bWxfZG9jdW1lbnRfc2V0eG1sdmVyc2lvbnxzZG9fZGFzX3htbF9sb2FkZmlsZXwnICsKICAgICAgICAnc2RvX2Rhc194bWxfbG9hZHN0cmluZ3xzZG9fZGFzX3htbF9zYXZlZmlsZXxzZG9fZGFzX3htbF9zYXZlc3RyaW5nfHNkb19kYXRhZmFjdG9yeV9jcmVhdGV8c2RvX2RhdGFvYmplY3RfY2xlYXJ8JyArCiAgICAgICAgJ3Nkb19kYXRhb2JqZWN0X2NyZWF0ZWRhdGFvYmplY3R8c2RvX2RhdGFvYmplY3RfZ2V0Y29udGFpbmVyfHNkb19kYXRhb2JqZWN0X2dldHNlcXVlbmNlfHNkb19kYXRhb2JqZWN0X2dldHR5cGVuYW1lfCcgKwogICAgICAgICdzZG9fZGF0YW9iamVjdF9nZXR0eXBlbmFtZXNwYWNldXJpfHNkb19leGNlcHRpb25fZ2V0Y2F1c2V8c2RvX2xpc3RfaW5zZXJ0fHNkb19tb2RlbF9wcm9wZXJ0eV9nZXRjb250YWluaW5ndHlwZXwnICsKICAgICAgICAnc2RvX21vZGVsX3Byb3BlcnR5X2dldGRlZmF1bHR8c2RvX21vZGVsX3Byb3BlcnR5X2dldG5hbWV8c2RvX21vZGVsX3Byb3BlcnR5X2dldHR5cGV8c2RvX21vZGVsX3Byb3BlcnR5X2lzY29udGFpbm1lbnR8JyArCiAgICAgICAgJ3Nkb19tb2RlbF9wcm9wZXJ0eV9pc21hbnl8c2RvX21vZGVsX3JlZmxlY3Rpb25kYXRhb2JqZWN0X2NvbnN0cnVjdHxzZG9fbW9kZWxfcmVmbGVjdGlvbmRhdGFvYmplY3RfZXhwb3J0fCcgKwogICAgICAgICdzZG9fbW9kZWxfcmVmbGVjdGlvbmRhdGFvYmplY3RfZ2V0Y29udGFpbm1lbnRwcm9wZXJ0eXxzZG9fbW9kZWxfcmVmbGVjdGlvbmRhdGFvYmplY3RfZ2V0aW5zdGFuY2Vwcm9wZXJ0aWVzfCcgKwogICAgICAgICdzZG9fbW9kZWxfcmVmbGVjdGlvbmRhdGFvYmplY3RfZ2V0dHlwZXxzZG9fbW9kZWxfdHlwZV9nZXRiYXNldHlwZXxzZG9fbW9kZWxfdHlwZV9nZXRuYW1lfHNkb19tb2RlbF90eXBlX2dldG5hbWVzcGFjZXVyaXwnICsKICAgICAgICAnc2RvX21vZGVsX3R5cGVfZ2V0cHJvcGVydGllc3xzZG9fbW9kZWxfdHlwZV9nZXRwcm9wZXJ0eXxzZG9fbW9kZWxfdHlwZV9pc2Fic3RyYWN0dHlwZXxzZG9fbW9kZWxfdHlwZV9pc2RhdGF0eXBlfHNkb19tb2RlbF90eXBlX2lzaW5zdGFuY2V8JyArCiAgICAgICAgJ3Nkb19tb2RlbF90eXBlX2lzb3BlbnR5cGV8c2RvX21vZGVsX3R5cGVfaXNzZXF1ZW5jZWR0eXBlfHNkb19zZXF1ZW5jZV9nZXRwcm9wZXJ0eXxzZG9fc2VxdWVuY2VfaW5zZXJ0fHNkb19zZXF1ZW5jZV9tb3ZlfHNlZWthYmxlaXRlcmF0b3J8JyArCiAgICAgICAgJ3NlbV9hY3F1aXJlfHNlbV9nZXR8c2VtX3JlbGVhc2V8c2VtX3JlbW92ZXxzZXJpYWxpemFibGV8c2VyaWFsaXplfHNlc3Npb25fY2FjaGVfZXhwaXJlfHNlc3Npb25fY2FjaGVfbGltaXRlcnxzZXNzaW9uX2NvbW1pdHwnICsKICAgICAgICAnc2Vzc2lvbl9kZWNvZGV8c2Vzc2lvbl9kZXN0cm95fHNlc3Npb25fZW5jb2RlfHNlc3Npb25fZ2V0X2Nvb2tpZV9wYXJhbXN8c2Vzc2lvbl9pZHxzZXNzaW9uX2lzX3JlZ2lzdGVyZWR8c2Vzc2lvbl9tb2R1bGVfbmFtZXxzZXNzaW9uX25hbWV8JyArCiAgICAgICAgJ3Nlc3Npb25fcGdzcWxfYWRkX2Vycm9yfHNlc3Npb25fcGdzcWxfZ2V0X2Vycm9yfHNlc3Npb25fcGdzcWxfZ2V0X2ZpZWxkfHNlc3Npb25fcGdzcWxfcmVzZXR8c2Vzc2lvbl9wZ3NxbF9zZXRfZmllbGR8c2Vzc2lvbl9wZ3NxbF9zdGF0dXN8JyArCiAgICAgICAgJ3Nlc3Npb25fcmVnZW5lcmF0ZV9pZHxzZXNzaW9uX3JlZ2lzdGVyfHNlc3Npb25fc2F2ZV9wYXRofHNlc3Npb25fc2V0X2Nvb2tpZV9wYXJhbXN8c2Vzc2lvbl9zZXRfc2F2ZV9oYW5kbGVyfHNlc3Npb25fc3RhcnR8JyArCiAgICAgICAgJ3Nlc3Npb25fdW5yZWdpc3RlcnxzZXNzaW9uX3Vuc2V0fHNlc3Npb25fd3JpdGVfY2xvc2V8c2V0Q291bnRlckNsYXNzfHNldF9lcnJvcl9oYW5kbGVyfHNldF9leGNlcHRpb25faGFuZGxlcnxzZXRfZmlsZV9idWZmZXJ8JyArCiAgICAgICAgJ3NldF9pbmNsdWRlX3BhdGh8c2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lfHNldF9zb2NrZXRfYmxvY2tpbmd8c2V0X3RpbWVfbGltaXR8c2V0Y29va2llfHNldGxvY2FsZXxzZXRwcm9jdGl0bGV8c2V0cmF3Y29va2llfCcgKwogICAgICAgICdzZXRzdGF0aWNwcm9wZXJ0eXZhbHVlfHNldHRocmVhZHRpdGxlfHNldHR5cGV8c2hhMXxzaGExX2ZpbGV8c2hlbGxfZXhlY3xzaG1fYXR0YWNofHNobV9kZXRhY2h8c2htX2dldF92YXJ8c2htX2hhc192YXJ8c2htX3B1dF92YXJ8JyArCiAgICAgICAgJ3NobV9yZW1vdmV8c2htX3JlbW92ZV92YXJ8c2htb3BfY2xvc2V8c2htb3BfZGVsZXRlfHNobW9wX29wZW58c2htb3BfcmVhZHxzaG1vcF9zaXplfHNobW9wX3dyaXRlfHNob3dfc291cmNlfHNodWZmbGV8c2lnbmV1cmxwYWllbWVudHwnICsKICAgICAgICAnc2ltaWxhcl90ZXh0fHNpbXBsZXhtbF9pbXBvcnRfZG9tfHNpbXBsZXhtbF9sb2FkX2ZpbGV8c2ltcGxleG1sX2xvYWRfc3RyaW5nfHNpbXBsZXhtbGVsZW1lbnR8c2ltcGxleG1saXRlcmF0b3J8c2lufHNpbmh8c2l6ZW9mfHNsZWVwfHNubXB8JyArCiAgICAgICAgJ3NubXAyX2dldHxzbm1wMl9nZXRuZXh0fHNubXAyX3JlYWxfd2Fsa3xzbm1wMl9zZXR8c25tcDJfd2Fsa3xzbm1wM19nZXR8c25tcDNfZ2V0bmV4dHxzbm1wM19yZWFsX3dhbGt8c25tcDNfc2V0fHNubXAzX3dhbGt8JyArCiAgICAgICAgJ3NubXBfZ2V0X3F1aWNrX3ByaW50fHNubXBfZ2V0X3ZhbHVlcmV0cmlldmFsfHNubXBfcmVhZF9taWJ8c25tcF9zZXRfZW51bV9wcmludHxzbm1wX3NldF9vaWRfbnVtZXJpY19wcmludHxzbm1wX3NldF9vaWRfb3V0cHV0X2Zvcm1hdHwnICsKICAgICAgICAnc25tcF9zZXRfcXVpY2tfcHJpbnR8c25tcF9zZXRfdmFsdWVyZXRyaWV2YWx8c25tcGdldHxzbm1wZ2V0bmV4dHxzbm1wcmVhbHdhbGt8c25tcHNldHxzbm1wd2Fsa3xzbm1wd2Fsa29pZHxzb2FwY2xpZW50fHNvYXBmYXVsdHwnICsKICAgICAgICAnc29hcGhlYWRlcnxzb2FwcGFyYW18c29hcHNlcnZlcnxzb2FwdmFyfHNvY2tldF9hY2NlcHR8c29ja2V0X2JpbmR8c29ja2V0X2NsZWFyX2Vycm9yfHNvY2tldF9jbG9zZXxzb2NrZXRfY29ubmVjdHxzb2NrZXRfY3JlYXRlfCcgKwogICAgICAgICdzb2NrZXRfY3JlYXRlX2xpc3Rlbnxzb2NrZXRfY3JlYXRlX3BhaXJ8c29ja2V0X2dldF9vcHRpb258c29ja2V0X2dldF9zdGF0dXN8c29ja2V0X2dldHBlZXJuYW1lfHNvY2tldF9nZXRzb2NrbmFtZXxzb2NrZXRfbGFzdF9lcnJvcnwnICsKICAgICAgICAnc29ja2V0X2xpc3Rlbnxzb2NrZXRfcmVhZHxzb2NrZXRfcmVjdnxzb2NrZXRfcmVjdmZyb218c29ja2V0X3NlbGVjdHxzb2NrZXRfc2VuZHxzb2NrZXRfc2VuZHRvfHNvY2tldF9zZXRfYmxvY2t8c29ja2V0X3NldF9ibG9ja2luZ3wnICsKICAgICAgICAnc29ja2V0X3NldF9ub25ibG9ja3xzb2NrZXRfc2V0X29wdGlvbnxzb2NrZXRfc2V0X3RpbWVvdXR8c29ja2V0X3NodXRkb3dufHNvY2tldF9zdHJlcnJvcnxzb2NrZXRfd3JpdGV8c29scl9nZXRfdmVyc2lvbnxzb2xyY2xpZW50fCcgKwogICAgICAgICdzb2xyY2xpZW50ZXhjZXB0aW9ufHNvbHJkb2N1bWVudHxzb2xyZG9jdW1lbnRmaWVsZHxzb2xyZXhjZXB0aW9ufHNvbHJnZW5lcmljcmVzcG9uc2V8c29scmlsbGVnYWxhcmd1bWVudGV4Y2VwdGlvbnwnICsKICAgICAgICAnc29scmlsbGVnYWxvcGVyYXRpb25leGNlcHRpb258c29scmlucHV0ZG9jdW1lbnR8c29scm1vZGlmaWFibGVwYXJhbXN8c29scm9iamVjdHxzb2xycGFyYW1zfHNvbHJwaW5ncmVzcG9uc2V8c29scnF1ZXJ5fHNvbHJxdWVyeXJlc3BvbnNlfCcgKwogICAgICAgICdzb2xycmVzcG9uc2V8c29scnVwZGF0ZXJlc3BvbnNlfHNvbHJ1dGlsc3xzb3J0fHNvdW5kZXh8c3BoaW54Y2xpZW50fHNwbF9hdXRvbG9hZHxzcGxfYXV0b2xvYWRfY2FsbHxzcGxfYXV0b2xvYWRfZXh0ZW5zaW9uc3wnICsKICAgICAgICAnc3BsX2F1dG9sb2FkX2Z1bmN0aW9uc3xzcGxfYXV0b2xvYWRfcmVnaXN0ZXJ8c3BsX2F1dG9sb2FkX3VucmVnaXN0ZXJ8c3BsX2NsYXNzZXN8c3BsX29iamVjdF9oYXNofHNwbGJvb2x8c3BsZG91Ymx5bGlua2VkbGlzdHxzcGxlbnVtfCcgKwogICAgICAgICdzcGxmaWxlaW5mb3xzcGxmaWxlb2JqZWN0fHNwbGZpeGVkYXJyYXl8c3BsZmxvYXR8c3BsaGVhcHxzcGxpbnR8c3BsaXR8c3BsaXRpfHNwbG1heGhlYXB8c3BsbWluaGVhcHxzcGxvYmplY3RzdG9yYWdlfHNwbG9ic2VydmVyfCcgKwogICAgICAgICdzcGxwcmlvcml0eXF1ZXVlfHNwbHF1ZXVlfHNwbHN0YWNrfHNwbHN0cmluZ3xzcGxzdWJqZWN0fHNwbHRlbXBmaWxlb2JqZWN0fHNwb29mY2hlY2tlcnxzcHJpbnRmfHNxbF9yZWdjYXNlfHNxbGl0ZTN8c3FsaXRlM3Jlc3VsdHwnICsKICAgICAgICAnc3FsaXRlM3N0bXR8c3FsaXRlX2FycmF5X3F1ZXJ5fHNxbGl0ZV9idXN5X3RpbWVvdXR8c3FsaXRlX2NoYW5nZXN8c3FsaXRlX2Nsb3NlfHNxbGl0ZV9jb2x1bW58c3FsaXRlX2NyZWF0ZV9hZ2dyZWdhdGV8JyArCiAgICAgICAgJ3NxbGl0ZV9jcmVhdGVfZnVuY3Rpb258c3FsaXRlX2N1cnJlbnR8c3FsaXRlX2Vycm9yX3N0cmluZ3xzcWxpdGVfZXNjYXBlX3N0cmluZ3xzcWxpdGVfZXhlY3xzcWxpdGVfZmFjdG9yeXxzcWxpdGVfZmV0Y2hfYWxsfCcgKwogICAgICAgICdzcWxpdGVfZmV0Y2hfYXJyYXl8c3FsaXRlX2ZldGNoX2NvbHVtbl90eXBlc3xzcWxpdGVfZmV0Y2hfb2JqZWN0fHNxbGl0ZV9mZXRjaF9zaW5nbGV8c3FsaXRlX2ZldGNoX3N0cmluZ3xzcWxpdGVfZmllbGRfbmFtZXwnICsKICAgICAgICAnc3FsaXRlX2hhc19tb3JlfHNxbGl0ZV9oYXNfcHJldnxzcWxpdGVfa2V5fHNxbGl0ZV9sYXN0X2Vycm9yfHNxbGl0ZV9sYXN0X2luc2VydF9yb3dpZHxzcWxpdGVfbGliZW5jb2Rpbmd8c3FsaXRlX2xpYnZlcnNpb258c3FsaXRlX25leHR8JyArCiAgICAgICAgJ3NxbGl0ZV9udW1fZmllbGRzfHNxbGl0ZV9udW1fcm93c3xzcWxpdGVfb3BlbnxzcWxpdGVfcG9wZW58c3FsaXRlX3ByZXZ8c3FsaXRlX3F1ZXJ5fHNxbGl0ZV9yZXdpbmR8c3FsaXRlX3NlZWt8c3FsaXRlX3NpbmdsZV9xdWVyeXwnICsKICAgICAgICAnc3FsaXRlX3VkZl9kZWNvZGVfYmluYXJ5fHNxbGl0ZV91ZGZfZW5jb2RlX2JpbmFyeXxzcWxpdGVfdW5idWZmZXJlZF9xdWVyeXxzcWxpdGVfdmFsaWR8c3FydHxzcmFuZHxzc2NhbmZ8c3NkZWVwX2Z1enp5X2NvbXBhcmV8JyArCiAgICAgICAgJ3NzZGVlcF9mdXp6eV9oYXNofHNzZGVlcF9mdXp6eV9oYXNoX2ZpbGVuYW1lfHNzaDJfYXV0aF9ob3N0YmFzZWRfZmlsZXxzc2gyX2F1dGhfbm9uZXxzc2gyX2F1dGhfcGFzc3dvcmR8c3NoMl9hdXRoX3B1YmtleV9maWxlfCcgKwogICAgICAgICdzc2gyX2Nvbm5lY3R8c3NoMl9leGVjfHNzaDJfZmV0Y2hfc3RyZWFtfHNzaDJfZmluZ2VycHJpbnR8c3NoMl9tZXRob2RzX25lZ290aWF0ZWR8c3NoMl9wdWJsaWNrZXlfYWRkfHNzaDJfcHVibGlja2V5X2luaXR8JyArCiAgICAgICAgJ3NzaDJfcHVibGlja2V5X2xpc3R8c3NoMl9wdWJsaWNrZXlfcmVtb3ZlfHNzaDJfc2NwX3JlY3Z8c3NoMl9zY3Bfc2VuZHxzc2gyX3NmdHB8c3NoMl9zZnRwX2xzdGF0fHNzaDJfc2Z0cF9ta2Rpcnxzc2gyX3NmdHBfcmVhZGxpbmt8JyArCiAgICAgICAgJ3NzaDJfc2Z0cF9yZWFscGF0aHxzc2gyX3NmdHBfcmVuYW1lfHNzaDJfc2Z0cF9ybWRpcnxzc2gyX3NmdHBfc3RhdHxzc2gyX3NmdHBfc3ltbGlua3xzc2gyX3NmdHBfdW5saW5rfHNzaDJfc2hlbGx8c3NoMl90dW5uZWx8c3RhdHwnICsKICAgICAgICAnc3RhdHNfYWJzb2x1dGVfZGV2aWF0aW9ufHN0YXRzX2NkZl9iZXRhfHN0YXRzX2NkZl9iaW5vbWlhbHxzdGF0c19jZGZfY2F1Y2h5fHN0YXRzX2NkZl9jaGlzcXVhcmV8c3RhdHNfY2RmX2V4cG9uZW50aWFsfHN0YXRzX2NkZl9mfCcgKwogICAgICAgICdzdGF0c19jZGZfZ2FtbWF8c3RhdHNfY2RmX2xhcGxhY2V8c3RhdHNfY2RmX2xvZ2lzdGljfHN0YXRzX2NkZl9uZWdhdGl2ZV9iaW5vbWlhbHxzdGF0c19jZGZfbm9uY2VudHJhbF9jaGlzcXVhcmV8c3RhdHNfY2RmX25vbmNlbnRyYWxfZnwnICsKICAgICAgICAnc3RhdHNfY2RmX3BvaXNzb258c3RhdHNfY2RmX3R8c3RhdHNfY2RmX3VuaWZvcm18c3RhdHNfY2RmX3dlaWJ1bGx8c3RhdHNfY292YXJpYW5jZXxzdGF0c19kZW5fdW5pZm9ybXxzdGF0c19kZW5zX2JldGF8c3RhdHNfZGVuc19jYXVjaHl8JyArCiAgICAgICAgJ3N0YXRzX2RlbnNfY2hpc3F1YXJlfHN0YXRzX2RlbnNfZXhwb25lbnRpYWx8c3RhdHNfZGVuc19mfHN0YXRzX2RlbnNfZ2FtbWF8c3RhdHNfZGVuc19sYXBsYWNlfHN0YXRzX2RlbnNfbG9naXN0aWN8JyArCiAgICAgICAgJ3N0YXRzX2RlbnNfbmVnYXRpdmVfYmlub21pYWx8c3RhdHNfZGVuc19ub3JtYWx8c3RhdHNfZGVuc19wbWZfYmlub21pYWx8c3RhdHNfZGVuc19wbWZfaHlwZXJnZW9tZXRyaWN8c3RhdHNfZGVuc19wbWZfcG9pc3NvbnxzdGF0c19kZW5zX3R8JyArCiAgICAgICAgJ3N0YXRzX2RlbnNfd2VpYnVsbHxzdGF0c19oYXJtb25pY19tZWFufHN0YXRzX2t1cnRvc2lzfHN0YXRzX3JhbmRfZ2VuX2JldGF8c3RhdHNfcmFuZF9nZW5fY2hpc3F1YXJlfHN0YXRzX3JhbmRfZ2VuX2V4cG9uZW50aWFsfCcgKwogICAgICAgICdzdGF0c19yYW5kX2dlbl9mfHN0YXRzX3JhbmRfZ2VuX2Z1bmlmb3JtfHN0YXRzX3JhbmRfZ2VuX2dhbW1hfHN0YXRzX3JhbmRfZ2VuX2liaW5vbWlhbHxzdGF0c19yYW5kX2dlbl9pYmlub21pYWxfbmVnYXRpdmV8JyArCiAgICAgICAgJ3N0YXRzX3JhbmRfZ2VuX2ludHxzdGF0c19yYW5kX2dlbl9pcG9pc3NvbnxzdGF0c19yYW5kX2dlbl9pdW5pZm9ybXxzdGF0c19yYW5kX2dlbl9ub25jZW5yYWxfY2hpc3F1YXJlfHN0YXRzX3JhbmRfZ2VuX25vbmNlbnRyYWxfZnwnICsKICAgICAgICAnc3RhdHNfcmFuZF9nZW5fbm9uY2VudHJhbF90fHN0YXRzX3JhbmRfZ2VuX25vcm1hbHxzdGF0c19yYW5kX2dlbl90fHN0YXRzX3JhbmRfZ2V0X3NlZWRzfHN0YXRzX3JhbmRfcGhyYXNlX3RvX3NlZWRzfHN0YXRzX3JhbmRfcmFuZnwnICsKICAgICAgICAnc3RhdHNfcmFuZF9zZXRhbGx8c3RhdHNfc2tld3xzdGF0c19zdGFuZGFyZF9kZXZpYXRpb258c3RhdHNfc3RhdF9iaW5vbWlhbF9jb2VmfHN0YXRzX3N0YXRfY29ycmVsYXRpb258c3RhdHNfc3RhdF9nZW5uY2h8JyArCiAgICAgICAgJ3N0YXRzX3N0YXRfaW5kZXBlbmRlbnRfdHxzdGF0c19zdGF0X2lubmVycHJvZHVjdHxzdGF0c19zdGF0X25vbmNlbnRyYWxfdHxzdGF0c19zdGF0X3BhaXJlZF90fHN0YXRzX3N0YXRfcGVyY2VudGlsZXxzdGF0c19zdGF0X3Bvd2Vyc3VtfCcgKwogICAgICAgICdzdGF0c192YXJpYW5jZXxzdG9tcHxzdG9tcF9jb25uZWN0X2Vycm9yfHN0b21wX3ZlcnNpb258c3RvbXBleGNlcHRpb258c3RvbXBmcmFtZXxzdHJfZ2V0Y3N2fHN0cl9pcmVwbGFjZXxzdHJfcGFkfHN0cl9yZXBlYXR8c3RyX3JlcGxhY2V8JyArCiAgICAgICAgJ3N0cl9yb3QxM3xzdHJfc2h1ZmZsZXxzdHJfc3BsaXR8c3RyX3dvcmRfY291bnR8c3RyY2FzZWNtcHxzdHJjaHJ8c3RyY21wfHN0cmNvbGx8c3RyY3NwbnxzdHJlYW1fYnVja2V0X2FwcGVuZHxzdHJlYW1fYnVja2V0X21ha2Vfd3JpdGVhYmxlfCcgKwogICAgICAgICdzdHJlYW1fYnVja2V0X25ld3xzdHJlYW1fYnVja2V0X3ByZXBlbmR8c3RyZWFtX2NvbnRleHRfY3JlYXRlfHN0cmVhbV9jb250ZXh0X2dldF9kZWZhdWx0fHN0cmVhbV9jb250ZXh0X2dldF9vcHRpb25zfCcgKwogICAgICAgICdzdHJlYW1fY29udGV4dF9nZXRfcGFyYW1zfHN0cmVhbV9jb250ZXh0X3NldF9kZWZhdWx0fHN0cmVhbV9jb250ZXh0X3NldF9vcHRpb258c3RyZWFtX2NvbnRleHRfc2V0X3BhcmFtc3xzdHJlYW1fY29weV90b19zdHJlYW18JyArCiAgICAgICAgJ3N0cmVhbV9lbmNvZGluZ3xzdHJlYW1fZmlsdGVyX2FwcGVuZHxzdHJlYW1fZmlsdGVyX3ByZXBlbmR8c3RyZWFtX2ZpbHRlcl9yZWdpc3RlcnxzdHJlYW1fZmlsdGVyX3JlbW92ZXxzdHJlYW1fZ2V0X2NvbnRlbnRzfCcgKwogICAgICAgICdzdHJlYW1fZ2V0X2ZpbHRlcnN8c3RyZWFtX2dldF9saW5lfHN0cmVhbV9nZXRfbWV0YV9kYXRhfHN0cmVhbV9nZXRfdHJhbnNwb3J0c3xzdHJlYW1fZ2V0X3dyYXBwZXJzfHN0cmVhbV9pc19sb2NhbHwnICsKICAgICAgICAnc3RyZWFtX25vdGlmaWNhdGlvbl9jYWxsYmFja3xzdHJlYW1fcmVnaXN0ZXJfd3JhcHBlcnxzdHJlYW1fcmVzb2x2ZV9pbmNsdWRlX3BhdGh8c3RyZWFtX3NlbGVjdHxzdHJlYW1fc2V0X2Jsb2NraW5nfHN0cmVhbV9zZXRfcmVhZF9idWZmZXJ8JyArCiAgICAgICAgJ3N0cmVhbV9zZXRfdGltZW91dHxzdHJlYW1fc2V0X3dyaXRlX2J1ZmZlcnxzdHJlYW1fc29ja2V0X2FjY2VwdHxzdHJlYW1fc29ja2V0X2NsaWVudHxzdHJlYW1fc29ja2V0X2VuYWJsZV9jcnlwdG98c3RyZWFtX3NvY2tldF9nZXRfbmFtZXwnICsKICAgICAgICAnc3RyZWFtX3NvY2tldF9wYWlyfHN0cmVhbV9zb2NrZXRfcmVjdmZyb218c3RyZWFtX3NvY2tldF9zZW5kdG98c3RyZWFtX3NvY2tldF9zZXJ2ZXJ8c3RyZWFtX3NvY2tldF9zaHV0ZG93bnxzdHJlYW1fc3VwcG9ydHNfbG9ja3wnICsKICAgICAgICAnc3RyZWFtX3dyYXBwZXJfcmVnaXN0ZXJ8c3RyZWFtX3dyYXBwZXJfcmVzdG9yZXxzdHJlYW1fd3JhcHBlcl91bnJlZ2lzdGVyfHN0cmVhbXdyYXBwZXJ8c3RyZnRpbWV8c3RyaXBfdGFnc3xzdHJpcGNzbGFzaGVzfHN0cmlwb3N8JyArCiAgICAgICAgJ3N0cmlwc2xhc2hlc3xzdHJpc3RyfHN0cmxlbnxzdHJuYXRjYXNlY21wfHN0cm5hdGNtcHxzdHJuY2FzZWNtcHxzdHJuY21wfHN0cnBicmt8c3RycG9zfHN0cnB0aW1lfHN0cnJjaHJ8c3RycmV2fHN0cnJpcG9zfHN0cnJwb3N8c3Ryc3BufCcgKwogICAgICAgICdzdHJzdHJ8c3RydG9rfHN0cnRvbG93ZXJ8c3RydG90aW1lfHN0cnRvdXBwZXJ8c3RydHJ8c3RydmFsfHN1YnN0cnxzdWJzdHJfY29tcGFyZXxzdWJzdHJfY291bnR8c3Vic3RyX3JlcGxhY2V8c3ZtfHN2bW1vZGVsfHN2bl9hZGR8JyArCiAgICAgICAgJ3N2bl9hdXRoX2dldF9wYXJhbWV0ZXJ8c3ZuX2F1dGhfc2V0X3BhcmFtZXRlcnxzdm5fYmxhbWV8c3ZuX2NhdHxzdm5fY2hlY2tvdXR8c3ZuX2NsZWFudXB8c3ZuX2NsaWVudF92ZXJzaW9ufHN2bl9jb21taXR8c3ZuX2RlbGV0ZXwnICsKICAgICAgICAnc3ZuX2RpZmZ8c3ZuX2V4cG9ydHxzdm5fZnNfYWJvcnRfdHhufHN2bl9mc19hcHBseV90ZXh0fHN2bl9mc19iZWdpbl90eG4yfHN2bl9mc19jaGFuZ2Vfbm9kZV9wcm9wfHN2bl9mc19jaGVja19wYXRofCcgKwogICAgICAgICdzdm5fZnNfY29udGVudHNfY2hhbmdlZHxzdm5fZnNfY29weXxzdm5fZnNfZGVsZXRlfHN2bl9mc19kaXJfZW50cmllc3xzdm5fZnNfZmlsZV9jb250ZW50c3xzdm5fZnNfZmlsZV9sZW5ndGh8c3ZuX2ZzX2lzX2Rpcnxzdm5fZnNfaXNfZmlsZXwnICsKICAgICAgICAnc3ZuX2ZzX21ha2VfZGlyfHN2bl9mc19tYWtlX2ZpbGV8c3ZuX2ZzX25vZGVfY3JlYXRlZF9yZXZ8c3ZuX2ZzX25vZGVfcHJvcHxzdm5fZnNfcHJvcHNfY2hhbmdlZHxzdm5fZnNfcmV2aXNpb25fcHJvcHxzdm5fZnNfcmV2aXNpb25fcm9vdHwnICsKICAgICAgICAnc3ZuX2ZzX3R4bl9yb290fHN2bl9mc195b3VuZ2VzdF9yZXZ8c3ZuX2ltcG9ydHxzdm5fbG9nfHN2bl9sc3xzdm5fbWtkaXJ8c3ZuX3JlcG9zX2NyZWF0ZXxzdm5fcmVwb3NfZnN8c3ZuX3JlcG9zX2ZzX2JlZ2luX3R4bl9mb3JfY29tbWl0fCcgKwogICAgICAgICdzdm5fcmVwb3NfZnNfY29tbWl0X3R4bnxzdm5fcmVwb3NfaG90Y29weXxzdm5fcmVwb3Nfb3Blbnxzdm5fcmVwb3NfcmVjb3Zlcnxzdm5fcmV2ZXJ0fHN2bl9zdGF0dXN8c3ZuX3VwZGF0ZXxzd2ZfYWN0aW9uZ2V0dXJsfCcgKwogICAgICAgICdzd2ZfYWN0aW9uZ290b2ZyYW1lfHN3Zl9hY3Rpb25nb3RvbGFiZWx8c3dmX2FjdGlvbm5leHRmcmFtZXxzd2ZfYWN0aW9ucGxheXxzd2ZfYWN0aW9ucHJldmZyYW1lfHN3Zl9hY3Rpb25zZXR0YXJnZXR8c3dmX2FjdGlvbnN0b3B8JyArCiAgICAgICAgJ3N3Zl9hY3Rpb250b2dnbGVxdWFsaXR5fHN3Zl9hY3Rpb253YWl0Zm9yZnJhbWV8c3dmX2FkZGJ1dHRvbnJlY29yZHxzd2ZfYWRkY29sb3J8c3dmX2Nsb3NlZmlsZXxzd2ZfZGVmaW5lYml0bWFwfHN3Zl9kZWZpbmVmb250fCcgKwogICAgICAgICdzd2ZfZGVmaW5lbGluZXxzd2ZfZGVmaW5lcG9seXxzd2ZfZGVmaW5lcmVjdHxzd2ZfZGVmaW5ldGV4dHxzd2ZfZW5kYnV0dG9ufHN3Zl9lbmRkb2FjdGlvbnxzd2ZfZW5kc2hhcGV8c3dmX2VuZHN5bWJvbHxzd2ZfZm9udHNpemV8JyArCiAgICAgICAgJ3N3Zl9mb250c2xhbnR8c3dmX2ZvbnR0cmFja2luZ3xzd2ZfZ2V0Yml0bWFwaW5mb3xzd2ZfZ2V0Zm9udGluZm98c3dmX2dldGZyYW1lfHN3Zl9sYWJlbGZyYW1lfHN3Zl9sb29rYXR8c3dmX21vZGlmeW9iamVjdHxzd2ZfbXVsY29sb3J8JyArCiAgICAgICAgJ3N3Zl9uZXh0aWR8c3dmX29uY29uZGl0aW9ufHN3Zl9vcGVuZmlsZXxzd2Zfb3J0aG98c3dmX29ydGhvMnxzd2ZfcGVyc3BlY3RpdmV8c3dmX3BsYWNlb2JqZWN0fHN3Zl9wb2xhcnZpZXd8c3dmX3BvcG1hdHJpeHxzd2ZfcG9zcm91bmR8JyArCiAgICAgICAgJ3N3Zl9wdXNobWF0cml4fHN3Zl9yZW1vdmVvYmplY3R8c3dmX3JvdGF0ZXxzd2Zfc2NhbGV8c3dmX3NldGZvbnR8c3dmX3NldGZyYW1lfHN3Zl9zaGFwZWFyY3xzd2Zfc2hhcGVjdXJ2ZXRvfHN3Zl9zaGFwZWN1cnZldG8zfCcgKwogICAgICAgICdzd2Zfc2hhcGVmaWxsYml0bWFwY2xpcHxzd2Zfc2hhcGVmaWxsYml0bWFwdGlsZXxzd2Zfc2hhcGVmaWxsb2ZmfHN3Zl9zaGFwZWZpbGxzb2xpZHxzd2Zfc2hhcGVsaW5lc29saWR8c3dmX3NoYXBlbGluZXRvfHN3Zl9zaGFwZW1vdmV0b3wnICsKICAgICAgICAnc3dmX3Nob3dmcmFtZXxzd2Zfc3RhcnRidXR0b258c3dmX3N0YXJ0ZG9hY3Rpb258c3dmX3N0YXJ0c2hhcGV8c3dmX3N0YXJ0c3ltYm9sfHN3Zl90ZXh0d2lkdGh8c3dmX3RyYW5zbGF0ZXxzd2Zfdmlld3BvcnR8c3dmYWN0aW9ufCcgKwogICAgICAgICdzd2ZiaXRtYXB8c3dmYnV0dG9ufHN3ZmRpc3BsYXlpdGVtfHN3ZmZpbGx8c3dmZm9udHxzd2Zmb250Y2hhcnxzd2ZncmFkaWVudHxzd2Ztb3JwaHxzd2Ztb3ZpZXxzd2ZwcmVidWlsdGNsaXB8c3dmc2hhcGV8c3dmc291bmR8JyArCiAgICAgICAgJ3N3ZnNvdW5kaW5zdGFuY2V8c3dmc3ByaXRlfHN3ZnRleHR8c3dmdGV4dGZpZWxkfHN3ZnZpZGVvc3RyZWFtfHN3aXNoX2NvbnN0cnVjdHxzd2lzaF9nZXRtZXRhbGlzdHxzd2lzaF9nZXRwcm9wZXJ0eWxpc3R8c3dpc2hfcHJlcGFyZXwnICsKICAgICAgICAnc3dpc2hfcXVlcnl8c3dpc2hyZXN1bHRfZ2V0bWV0YWxpc3R8c3dpc2hyZXN1bHRfc3RlbXxzd2lzaHJlc3VsdHNfZ2V0cGFyc2Vkd29yZHN8c3dpc2hyZXN1bHRzX2dldHJlbW92ZWRzdG9wd29yZHN8c3dpc2hyZXN1bHRzX25leHRyZXN1bHR8JyArCiAgICAgICAgJ3N3aXNocmVzdWx0c19zZWVrcmVzdWx0fHN3aXNoc2VhcmNoX2V4ZWN1dGV8c3dpc2hzZWFyY2hfcmVzZXRsaW1pdHxzd2lzaHNlYXJjaF9zZXRsaW1pdHxzd2lzaHNlYXJjaF9zZXRwaHJhc2VkZWxpbWl0ZXJ8JyArCiAgICAgICAgJ3N3aXNoc2VhcmNoX3NldHNvcnR8c3dpc2hzZWFyY2hfc2V0c3RydWN0dXJlfHN5YmFzZV9hZmZlY3RlZF9yb3dzfHN5YmFzZV9jbG9zZXxzeWJhc2VfY29ubmVjdHxzeWJhc2VfZGF0YV9zZWVrfCcgKwogICAgICAgICdzeWJhc2VfZGVhZGxvY2tfcmV0cnlfY291bnR8c3liYXNlX2ZldGNoX2FycmF5fHN5YmFzZV9mZXRjaF9hc3NvY3xzeWJhc2VfZmV0Y2hfZmllbGR8c3liYXNlX2ZldGNoX29iamVjdHxzeWJhc2VfZmV0Y2hfcm93fCcgKwogICAgICAgICdzeWJhc2VfZmllbGRfc2Vla3xzeWJhc2VfZnJlZV9yZXN1bHR8c3liYXNlX2dldF9sYXN0X21lc3NhZ2V8c3liYXNlX21pbl9jbGllbnRfc2V2ZXJpdHl8c3liYXNlX21pbl9lcnJvcl9zZXZlcml0eXwnICsKICAgICAgICAnc3liYXNlX21pbl9tZXNzYWdlX3NldmVyaXR5fHN5YmFzZV9taW5fc2VydmVyX3NldmVyaXR5fHN5YmFzZV9udW1fZmllbGRzfHN5YmFzZV9udW1fcm93c3xzeWJhc2VfcGNvbm5lY3R8c3liYXNlX3F1ZXJ5fHN5YmFzZV9yZXN1bHR8JyArCiAgICAgICAgJ3N5YmFzZV9zZWxlY3RfZGJ8c3liYXNlX3NldF9tZXNzYWdlX2hhbmRsZXJ8c3liYXNlX3VuYnVmZmVyZWRfcXVlcnl8c3ltbGlua3xzeXNfZ2V0X3RlbXBfZGlyfHN5c19nZXRsb2FkYXZnfHN5c2xvZ3xzeXN0ZW18dGFnfHRhbnx0YW5ofCcgKwogICAgICAgICd0Y3B3cmFwX2NoZWNrfHRlbXBuYW18dGV4dGRvbWFpbnx0aWR5fHRpZHlfYWNjZXNzX2NvdW50fHRpZHlfY29uZmlnX2NvdW50fHRpZHlfZGlhZ25vc2V8dGlkeV9lcnJvcl9jb3VudHx0aWR5X2dldF9lcnJvcl9idWZmZXJ8JyArCiAgICAgICAgJ3RpZHlfZ2V0X291dHB1dHx0aWR5X2xvYWRfY29uZmlnfHRpZHlfcmVzZXRfY29uZmlnfHRpZHlfc2F2ZV9jb25maWd8dGlkeV9zZXRfZW5jb2Rpbmd8dGlkeV9zZXRvcHR8dGlkeV93YXJuaW5nX2NvdW50fHRpZHlub2RlfHRpbWV8JyArCiAgICAgICAgJ3RpbWVfbmFub3NsZWVwfHRpbWVfc2xlZXBfdW50aWx8dGltZXpvbmVfYWJicmV2aWF0aW9uc19saXN0fHRpbWV6b25lX2lkZW50aWZpZXJzX2xpc3R8dGltZXpvbmVfbG9jYXRpb25fZ2V0fHRpbWV6b25lX25hbWVfZnJvbV9hYmJyfCcgKwogICAgICAgICd0aW1lem9uZV9uYW1lX2dldHx0aW1lem9uZV9vZmZzZXRfZ2V0fHRpbWV6b25lX29wZW58dGltZXpvbmVfdHJhbnNpdGlvbnNfZ2V0fHRpbWV6b25lX3ZlcnNpb25fZ2V0fHRtcGZpbGV8dG9rZW5fZ2V0X2FsbHx0b2tlbl9uYW1lfCcgKwogICAgICAgICd0b2t5b3R5cmFudHx0b2t5b3R5cmFudHF1ZXJ5fHRva3lvdHlyYW50dGFibGV8dG9zdHJpbmd8dG9zdHJpbmd8dG91Y2h8dHJhbnNsaXRlcmF0b3J8dHJhdmVyc2FibGV8dHJpZ2dlcl9lcnJvcnx0cmltfHVhc29ydHx1Y2ZpcnN0fCcgKwogICAgICAgICd1Y3dvcmRzfHVkbV9hZGRfc2VhcmNoX2xpbWl0fHVkbV9hbGxvY19hZ2VudHx1ZG1fYWxsb2NfYWdlbnRfYXJyYXl8dWRtX2FwaV92ZXJzaW9ufHVkbV9jYXRfbGlzdHx1ZG1fY2F0X3BhdGh8dWRtX2NoZWNrX2NoYXJzZXR8JyArCiAgICAgICAgJ3VkbV9jaGVja19zdG9yZWR8dWRtX2NsZWFyX3NlYXJjaF9saW1pdHN8dWRtX2Nsb3NlX3N0b3JlZHx1ZG1fY3JjMzJ8dWRtX2Vycm5vfHVkbV9lcnJvcnx1ZG1fZmluZHx1ZG1fZnJlZV9hZ2VudHx1ZG1fZnJlZV9pc3BlbGxfZGF0YXwnICsKICAgICAgICAndWRtX2ZyZWVfcmVzfHVkbV9nZXRfZG9jX2NvdW50fHVkbV9nZXRfcmVzX2ZpZWxkfHVkbV9nZXRfcmVzX3BhcmFtfHVkbV9oYXNoMzJ8dWRtX2xvYWRfaXNwZWxsX2RhdGF8dWRtX29wZW5fc3RvcmVkfHVkbV9zZXRfYWdlbnRfcGFyYW18JyArCiAgICAgICAgJ3Vrc29ydHx1bWFza3x1bmRlcmZsb3dleGNlcHRpb258dW5leHBlY3RlZHZhbHVlZXhjZXB0aW9ufHVuaXFpZHx1bml4dG9qZHx1bmxpbmt8dW5wYWNrfHVucmVnaXN0ZXJfdGlja19mdW5jdGlvbnx1bnNlcmlhbGl6ZXx1bnNldHwnICsKICAgICAgICAndXJsZGVjb2RlfHVybGVuY29kZXx1c2Vfc29hcF9lcnJvcl9oYW5kbGVyfHVzZXJfZXJyb3J8dXNsZWVwfHVzb3J0fHV0ZjhfZGVjb2RlfHV0ZjhfZW5jb2RlfHY4anN8djhqc2V4Y2VwdGlvbnx2YXJfZHVtcHx2YXJfZXhwb3J0fHZhcmlhbnR8JyArCiAgICAgICAgJ3ZhcmlhbnRfYWJzfHZhcmlhbnRfYWRkfHZhcmlhbnRfYW5kfHZhcmlhbnRfY2FzdHx2YXJpYW50X2NhdHx2YXJpYW50X2NtcHx2YXJpYW50X2RhdGVfZnJvbV90aW1lc3RhbXB8dmFyaWFudF9kYXRlX3RvX3RpbWVzdGFtcHwnICsKICAgICAgICAndmFyaWFudF9kaXZ8dmFyaWFudF9lcXZ8dmFyaWFudF9maXh8dmFyaWFudF9nZXRfdHlwZXx2YXJpYW50X2lkaXZ8dmFyaWFudF9pbXB8dmFyaWFudF9pbnR8dmFyaWFudF9tb2R8dmFyaWFudF9tdWx8dmFyaWFudF9uZWd8dmFyaWFudF9ub3R8JyArCiAgICAgICAgJ3ZhcmlhbnRfb3J8dmFyaWFudF9wb3d8dmFyaWFudF9yb3VuZHx2YXJpYW50X3NldHx2YXJpYW50X3NldF90eXBlfHZhcmlhbnRfc3VifHZhcmlhbnRfeG9yfHZlcnNpb25fY29tcGFyZXx2ZnByaW50Znx2aXJ0dWFsfCcgKwogICAgICAgICd2cG9wbWFpbF9hZGRfYWxpYXNfZG9tYWlufHZwb3BtYWlsX2FkZF9hbGlhc19kb21haW5fZXh8dnBvcG1haWxfYWRkX2RvbWFpbnx2cG9wbWFpbF9hZGRfZG9tYWluX2V4fHZwb3BtYWlsX2FkZF91c2VyfHZwb3BtYWlsX2FsaWFzX2FkZHwnICsKICAgICAgICAndnBvcG1haWxfYWxpYXNfZGVsfHZwb3BtYWlsX2FsaWFzX2RlbF9kb21haW58dnBvcG1haWxfYWxpYXNfZ2V0fHZwb3BtYWlsX2FsaWFzX2dldF9hbGx8dnBvcG1haWxfYXV0aF91c2VyfHZwb3BtYWlsX2RlbF9kb21haW58JyArCiAgICAgICAgJ3Zwb3BtYWlsX2RlbF9kb21haW5fZXh8dnBvcG1haWxfZGVsX3VzZXJ8dnBvcG1haWxfZXJyb3J8dnBvcG1haWxfcGFzc3dkfHZwb3BtYWlsX3NldF91c2VyX3F1b3RhfHZwcmludGZ8dnNwcmludGZ8dzMyYXBpX2RlZnR5cGV8JyArCiAgICAgICAgJ3czMmFwaV9pbml0X2R0eXBlfHczMmFwaV9pbnZva2VfZnVuY3Rpb258dzMyYXBpX3JlZ2lzdGVyX2Z1bmN0aW9ufHczMmFwaV9zZXRfY2FsbF9tZXRob2R8d2RkeF9hZGRfdmFyc3x3ZGR4X2Rlc2VyaWFsaXplfHdkZHhfcGFja2V0X2VuZHwnICsKICAgICAgICAnd2RkeF9wYWNrZXRfc3RhcnR8d2RkeF9zZXJpYWxpemVfdmFsdWV8d2RkeF9zZXJpYWxpemVfdmFyc3x3aW4zMl9jb250aW51ZV9zZXJ2aWNlfHdpbjMyX2NyZWF0ZV9zZXJ2aWNlfHdpbjMyX2RlbGV0ZV9zZXJ2aWNlfCcgKwogICAgICAgICd3aW4zMl9nZXRfbGFzdF9jb250cm9sX21lc3NhZ2V8d2luMzJfcGF1c2Vfc2VydmljZXx3aW4zMl9wc19saXN0X3Byb2NzfHdpbjMyX3BzX3N0YXRfbWVtfHdpbjMyX3BzX3N0YXRfcHJvY3x3aW4zMl9xdWVyeV9zZXJ2aWNlX3N0YXR1c3wnICsKICAgICAgICAnd2luMzJfc2V0X3NlcnZpY2Vfc3RhdHVzfHdpbjMyX3N0YXJ0X3NlcnZpY2V8d2luMzJfc3RhcnRfc2VydmljZV9jdHJsX2Rpc3BhdGNoZXJ8d2luMzJfc3RvcF9zZXJ2aWNlfHdpbmNhY2hlX2ZjYWNoZV9maWxlaW5mb3wnICsKICAgICAgICAnd2luY2FjaGVfZmNhY2hlX21lbWluZm98d2luY2FjaGVfbG9ja3x3aW5jYWNoZV9vY2FjaGVfZmlsZWluZm98d2luY2FjaGVfb2NhY2hlX21lbWluZm98d2luY2FjaGVfcmVmcmVzaF9pZl9jaGFuZ2VkfCcgKwogICAgICAgICd3aW5jYWNoZV9ycGxpc3RfZmlsZWluZm98d2luY2FjaGVfcnBsaXN0X21lbWluZm98d2luY2FjaGVfc2NhY2hlX2luZm98d2luY2FjaGVfc2NhY2hlX21lbWluZm98d2luY2FjaGVfdWNhY2hlX2FkZHx3aW5jYWNoZV91Y2FjaGVfY2FzfCcgKwogICAgICAgICd3aW5jYWNoZV91Y2FjaGVfY2xlYXJ8d2luY2FjaGVfdWNhY2hlX2RlY3x3aW5jYWNoZV91Y2FjaGVfZGVsZXRlfHdpbmNhY2hlX3VjYWNoZV9leGlzdHN8d2luY2FjaGVfdWNhY2hlX2dldHx3aW5jYWNoZV91Y2FjaGVfaW5jfCcgKwogICAgICAgICd3aW5jYWNoZV91Y2FjaGVfaW5mb3x3aW5jYWNoZV91Y2FjaGVfbWVtaW5mb3x3aW5jYWNoZV91Y2FjaGVfc2V0fHdpbmNhY2hlX3VubG9ja3x3b3Jkd3JhcHx4YXR0cl9nZXR8eGF0dHJfbGlzdHx4YXR0cl9yZW1vdmV8eGF0dHJfc2V0fCcgKwogICAgICAgICd4YXR0cl9zdXBwb3J0ZWR8eGRpZmZfZmlsZV9iZGlmZnx4ZGlmZl9maWxlX2JkaWZmX3NpemV8eGRpZmZfZmlsZV9icGF0Y2h8eGRpZmZfZmlsZV9kaWZmfHhkaWZmX2ZpbGVfZGlmZl9iaW5hcnl8eGRpZmZfZmlsZV9tZXJnZTN8JyArCiAgICAgICAgJ3hkaWZmX2ZpbGVfcGF0Y2h8eGRpZmZfZmlsZV9wYXRjaF9iaW5hcnl8eGRpZmZfZmlsZV9yYWJkaWZmfHhkaWZmX3N0cmluZ19iZGlmZnx4ZGlmZl9zdHJpbmdfYmRpZmZfc2l6ZXx4ZGlmZl9zdHJpbmdfYnBhdGNofCcgKwogICAgICAgICd4ZGlmZl9zdHJpbmdfZGlmZnx4ZGlmZl9zdHJpbmdfZGlmZl9iaW5hcnl8eGRpZmZfc3RyaW5nX21lcmdlM3x4ZGlmZl9zdHJpbmdfcGF0Y2h8eGRpZmZfc3RyaW5nX3BhdGNoX2JpbmFyeXx4ZGlmZl9zdHJpbmdfcmFiZGlmZnwnICsKICAgICAgICAneGhwcm9mX2Rpc2FibGV8eGhwcm9mX2VuYWJsZXx4aHByb2Zfc2FtcGxlX2Rpc2FibGV8eGhwcm9mX3NhbXBsZV9lbmFibGV8eG1sX2Vycm9yX3N0cmluZ3x4bWxfZ2V0X2N1cnJlbnRfYnl0ZV9pbmRleHwnICsKICAgICAgICAneG1sX2dldF9jdXJyZW50X2NvbHVtbl9udW1iZXJ8eG1sX2dldF9jdXJyZW50X2xpbmVfbnVtYmVyfHhtbF9nZXRfZXJyb3JfY29kZXx4bWxfcGFyc2V8eG1sX3BhcnNlX2ludG9fc3RydWN0fHhtbF9wYXJzZXJfY3JlYXRlfCcgKwogICAgICAgICd4bWxfcGFyc2VyX2NyZWF0ZV9uc3x4bWxfcGFyc2VyX2ZyZWV8eG1sX3BhcnNlcl9nZXRfb3B0aW9ufHhtbF9wYXJzZXJfc2V0X29wdGlvbnx4bWxfc2V0X2NoYXJhY3Rlcl9kYXRhX2hhbmRsZXJ8eG1sX3NldF9kZWZhdWx0X2hhbmRsZXJ8JyArCiAgICAgICAgJ3htbF9zZXRfZWxlbWVudF9oYW5kbGVyfHhtbF9zZXRfZW5kX25hbWVzcGFjZV9kZWNsX2hhbmRsZXJ8eG1sX3NldF9leHRlcm5hbF9lbnRpdHlfcmVmX2hhbmRsZXJ8eG1sX3NldF9ub3RhdGlvbl9kZWNsX2hhbmRsZXJ8JyArCiAgICAgICAgJ3htbF9zZXRfb2JqZWN0fHhtbF9zZXRfcHJvY2Vzc2luZ19pbnN0cnVjdGlvbl9oYW5kbGVyfHhtbF9zZXRfc3RhcnRfbmFtZXNwYWNlX2RlY2xfaGFuZGxlcnx4bWxfc2V0X3VucGFyc2VkX2VudGl0eV9kZWNsX2hhbmRsZXJ8eG1scmVhZGVyfCcgKwogICAgICAgICd4bWxycGNfZGVjb2RlfHhtbHJwY19kZWNvZGVfcmVxdWVzdHx4bWxycGNfZW5jb2RlfHhtbHJwY19lbmNvZGVfcmVxdWVzdHx4bWxycGNfZ2V0X3R5cGV8eG1scnBjX2lzX2ZhdWx0fHhtbHJwY19wYXJzZV9tZXRob2RfZGVzY3JpcHRpb25zfCcgKwogICAgICAgICd4bWxycGNfc2VydmVyX2FkZF9pbnRyb3NwZWN0aW9uX2RhdGF8eG1scnBjX3NlcnZlcl9jYWxsX21ldGhvZHx4bWxycGNfc2VydmVyX2NyZWF0ZXx4bWxycGNfc2VydmVyX2Rlc3Ryb3l8JyArCiAgICAgICAgJ3htbHJwY19zZXJ2ZXJfcmVnaXN0ZXJfaW50cm9zcGVjdGlvbl9jYWxsYmFja3x4bWxycGNfc2VydmVyX3JlZ2lzdGVyX21ldGhvZHx4bWxycGNfc2V0X3R5cGV8eG1sd3JpdGVyX2VuZF9hdHRyaWJ1dGV8eG1sd3JpdGVyX2VuZF9jZGF0YXwnICsKICAgICAgICAneG1sd3JpdGVyX2VuZF9jb21tZW50fHhtbHdyaXRlcl9lbmRfZG9jdW1lbnR8eG1sd3JpdGVyX2VuZF9kdGR8eG1sd3JpdGVyX2VuZF9kdGRfYXR0bGlzdHx4bWx3cml0ZXJfZW5kX2R0ZF9lbGVtZW50fCcgKwogICAgICAgICd4bWx3cml0ZXJfZW5kX2R0ZF9lbnRpdHl8eG1sd3JpdGVyX2VuZF9lbGVtZW50fHhtbHdyaXRlcl9lbmRfcGl8eG1sd3JpdGVyX2ZsdXNofHhtbHdyaXRlcl9mdWxsX2VuZF9lbGVtZW50fHhtbHdyaXRlcl9vcGVuX21lbW9yeXwnICsKICAgICAgICAneG1sd3JpdGVyX29wZW5fdXJpfHhtbHdyaXRlcl9vdXRwdXRfbWVtb3J5fHhtbHdyaXRlcl9zZXRfaW5kZW50fHhtbHdyaXRlcl9zZXRfaW5kZW50X3N0cmluZ3x4bWx3cml0ZXJfc3RhcnRfYXR0cmlidXRlfCcgKwogICAgICAgICd4bWx3cml0ZXJfc3RhcnRfYXR0cmlidXRlX25zfHhtbHdyaXRlcl9zdGFydF9jZGF0YXx4bWx3cml0ZXJfc3RhcnRfY29tbWVudHx4bWx3cml0ZXJfc3RhcnRfZG9jdW1lbnR8eG1sd3JpdGVyX3N0YXJ0X2R0ZHwnICsKICAgICAgICAneG1sd3JpdGVyX3N0YXJ0X2R0ZF9hdHRsaXN0fHhtbHdyaXRlcl9zdGFydF9kdGRfZWxlbWVudHx4bWx3cml0ZXJfc3RhcnRfZHRkX2VudGl0eXx4bWx3cml0ZXJfc3RhcnRfZWxlbWVudHx4bWx3cml0ZXJfc3RhcnRfZWxlbWVudF9uc3wnICsKICAgICAgICAneG1sd3JpdGVyX3N0YXJ0X3BpfHhtbHdyaXRlcl90ZXh0fHhtbHdyaXRlcl93cml0ZV9hdHRyaWJ1dGV8eG1sd3JpdGVyX3dyaXRlX2F0dHJpYnV0ZV9uc3x4bWx3cml0ZXJfd3JpdGVfY2RhdGF8eG1sd3JpdGVyX3dyaXRlX2NvbW1lbnR8JyArCiAgICAgICAgJ3htbHdyaXRlcl93cml0ZV9kdGR8eG1sd3JpdGVyX3dyaXRlX2R0ZF9hdHRsaXN0fHhtbHdyaXRlcl93cml0ZV9kdGRfZWxlbWVudHx4bWx3cml0ZXJfd3JpdGVfZHRkX2VudGl0eXx4bWx3cml0ZXJfd3JpdGVfZWxlbWVudHwnICsKICAgICAgICAneG1sd3JpdGVyX3dyaXRlX2VsZW1lbnRfbnN8eG1sd3JpdGVyX3dyaXRlX3BpfHhtbHdyaXRlcl93cml0ZV9yYXd8eHBhdGhfZXZhbHx4cGF0aF9ldmFsX2V4cHJlc3Npb258eHBhdGhfbmV3X2NvbnRleHR8eHBhdGhfcmVnaXN0ZXJfbnN8JyArCiAgICAgICAgJ3hwYXRoX3JlZ2lzdGVyX25zX2F1dG98eHB0cl9ldmFsfHhwdHJfbmV3X2NvbnRleHR8eHNsdF9iYWNrZW5kX2luZm98eHNsdF9iYWNrZW5kX25hbWV8eHNsdF9iYWNrZW5kX3ZlcnNpb258eHNsdF9jcmVhdGV8eHNsdF9lcnJub3wnICsKICAgICAgICAneHNsdF9lcnJvcnx4c2x0X2ZyZWV8eHNsdF9nZXRvcHR8eHNsdF9wcm9jZXNzfHhzbHRfc2V0X2Jhc2V8eHNsdF9zZXRfZW5jb2Rpbmd8eHNsdF9zZXRfZXJyb3JfaGFuZGxlcnx4c2x0X3NldF9sb2d8eHNsdF9zZXRfb2JqZWN0fCcgKwogICAgICAgICd4c2x0X3NldF9zYXhfaGFuZGxlcnx4c2x0X3NldF9zYXhfaGFuZGxlcnN8eHNsdF9zZXRfc2NoZW1lX2hhbmRsZXJ8eHNsdF9zZXRfc2NoZW1lX2hhbmRsZXJzfHhzbHRfc2V0b3B0fHhzbHRwcm9jZXNzb3J8eWFtbF9lbWl0fCcgKwogICAgICAgICd5YW1sX2VtaXRfZmlsZXx5YW1sX3BhcnNlfHlhbWxfcGFyc2VfZmlsZXx5YW1sX3BhcnNlX3VybHx5YXpfYWRkaW5mb3x5YXpfY2NsX2NvbmZ8eWF6X2NjbF9wYXJzZXx5YXpfY2xvc2V8eWF6X2Nvbm5lY3R8eWF6X2RhdGFiYXNlfCcgKwogICAgICAgICd5YXpfZWxlbWVudHx5YXpfZXJybm98eWF6X2Vycm9yfHlhel9lc3x5YXpfZXNfcmVzdWx0fHlhel9nZXRfb3B0aW9ufHlhel9oaXRzfHlhel9pdGVtb3JkZXJ8eWF6X3ByZXNlbnR8eWF6X3JhbmdlfHlhel9yZWNvcmR8eWF6X3NjYW58JyArCiAgICAgICAgJ3lhel9zY2FuX3Jlc3VsdHx5YXpfc2NoZW1hfHlhel9zZWFyY2h8eWF6X3NldF9vcHRpb258eWF6X3NvcnR8eWF6X3N5bnRheHx5YXpfd2FpdHx5cF9hbGx8eXBfY2F0fHlwX2Vycl9zdHJpbmd8eXBfZXJybm98eXBfZmlyc3R8JyArCiAgICAgICAgJ3lwX2dldF9kZWZhdWx0X2RvbWFpbnx5cF9tYXN0ZXJ8eXBfbWF0Y2h8eXBfbmV4dHx5cF9vcmRlcnx6ZW5kX2xvZ29fZ3VpZHx6ZW5kX3RocmVhZF9pZHx6ZW5kX3ZlcnNpb258emlwX2Nsb3NlfHppcF9lbnRyeV9jbG9zZXwnICsKICAgICAgICAnemlwX2VudHJ5X2NvbXByZXNzZWRzaXplfHppcF9lbnRyeV9jb21wcmVzc2lvbm1ldGhvZHx6aXBfZW50cnlfZmlsZXNpemV8emlwX2VudHJ5X25hbWV8emlwX2VudHJ5X29wZW58emlwX2VudHJ5X3JlYWR8emlwX29wZW58emlwX3JlYWR8JyArCiAgICAgICAgJ3ppcGFyY2hpdmV8emlwYXJjaGl2ZV9hZGRlbXB0eWRpcnx6aXBhcmNoaXZlX2FkZGZpbGV8emlwYXJjaGl2ZV9hZGRmcm9tc3RyaW5nfHppcGFyY2hpdmVfY2xvc2V8emlwYXJjaGl2ZV9kZWxldGVpbmRleHwnICsKICAgICAgICAnemlwYXJjaGl2ZV9kZWxldGVuYW1lfHppcGFyY2hpdmVfZXh0cmFjdHRvfHppcGFyY2hpdmVfZ2V0YXJjaGl2ZWNvbW1lbnR8emlwYXJjaGl2ZV9nZXRjb21tZW50aW5kZXh8emlwYXJjaGl2ZV9nZXRjb21tZW50bmFtZXwnICsKICAgICAgICAnemlwYXJjaGl2ZV9nZXRmcm9taW5kZXh8emlwYXJjaGl2ZV9nZXRmcm9tbmFtZXx6aXBhcmNoaXZlX2dldG5hbWVpbmRleHx6aXBhcmNoaXZlX2dldHN0YXR1c3N0cmluZ3x6aXBhcmNoaXZlX2dldHN0cmVhbXwnICsKICAgICAgICAnemlwYXJjaGl2ZV9sb2NhdGVuYW1lfHppcGFyY2hpdmVfb3Blbnx6aXBhcmNoaXZlX3JlbmFtZWluZGV4fHppcGFyY2hpdmVfcmVuYW1lbmFtZXx6aXBhcmNoaXZlX3NldENvbW1lbnROYW1lfHppcGFyY2hpdmVfc2V0YXJjaGl2ZWNvbW1lbnR8JyArCiAgICAgICAgJ3ppcGFyY2hpdmVfc2V0Y29tbWVudGluZGV4fHppcGFyY2hpdmVfc3RhdGluZGV4fHppcGFyY2hpdmVfc3RhdG5hbWV8emlwYXJjaGl2ZV91bmNoYW5nZWFsbHx6aXBhcmNoaXZlX3VuY2hhbmdlYXJjaGl2ZXwnICsKICAgICAgICAnemlwYXJjaGl2ZV91bmNoYW5nZWluZGV4fHppcGFyY2hpdmVfdW5jaGFuZ2VuYW1lfHpsaWJfZ2V0X2NvZGluZ190eXBlJykuc3BsaXQoJ3wnKQogICAgKTsKCiAgICAvLyBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vcmVzZXJ2ZWQua2V5d29yZHMucGhwCiAgICB2YXIga2V5d29yZHMgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCdhYnN0cmFjdHxhbmR8YXJyYXl8YXN8YnJlYWt8Y2FzZXxjYXRjaHxjbGFzc3xjbG9uZXxjb25zdHxjb250aW51ZXxkZWNsYXJlfGRlZmF1bHR8ZG98ZWxzZXxlbHNlaWZ8ZW5kZGVjbGFyZXxlbmRmb3J8ZW5kZm9yZWFjaHxlbmRpZnwnICsKICAgICAgICAnZW5kc3dpdGNofGVuZHdoaWxlfGV4dGVuZHN8ZmluYWx8Zm9yfGZvcmVhY2h8ZnVuY3Rpb258Z2xvYmFsfGdvdG98aWZ8aW1wbGVtZW50c3xpbnRlcmZhY2V8aW5zdGFuY2VvZnxuYW1lc3BhY2V8bmV3fG9yfHByaXZhdGV8cHJvdGVjdGVkfCcgKwogICAgICAgICdwdWJsaWN8c3RhdGljfHN3aXRjaHx0aHJvd3x0cnl8dXNlfHZhcnx3aGlsZXx4b3InKS5zcGxpdCgnfCcpCiAgICApOwoKICAgIC8vIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9yZXNlcnZlZC5rZXl3b3Jkcy5waHAKICAgIHZhciBsYW5ndWFnZUNvbnN0cnVjdHMgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCdkaWV8ZWNob3xlbXB0eXxleGl0fGV2YWx8aW5jbHVkZXxpbmNsdWRlX29uY2V8aXNzZXR8bGlzdHxyZXF1aXJlfHJlcXVpcmVfb25jZXxyZXR1cm58cHJpbnR8dW5zZXQnKS5zcGxpdCgnfCcpCiAgICApOwoKICAgIHZhciBidWlsdGluQ29uc3RhbnRzID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgndHJ1ZXxmYWxzZXxudWxsfF9fQ0xBU1NfX3xfX0RJUl9ffF9fRklMRV9ffF9fTElORV9ffF9fTUVUSE9EX198X19GVU5DVElPTl9ffF9fTkFNRVNQQUNFX18nKS5zcGxpdCgnfCcpCiAgICApOwoKICAgIHZhciBidWlsdGluVmFyaWFibGVzID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgnJEdMT0JBTFN8JF9TRVJWRVJ8JF9HRVR8JF9QT1NUfCRfRklMRVN8JF9SRVFVRVNUfCRfU0VTU0lPTnwkX0VOVnwkX0NPT0tJRXwkcGhwX2Vycm9ybXNnfCRIVFRQX1JBV19QT1NUX0RBVEF8JyArCiAgICAgICAgJyRodHRwX3Jlc3BvbnNlX2hlYWRlcnwkYXJnY3wkYXJndicpLnNwbGl0KCd8JykKICAgICk7CgogICAgLy8gRGlzY292ZXJ5IGRvbmUgYnkgZG93bmxvYWRpbmcgJ01hbnkgSFRNTCBmaWxlcycgZnJvbTogIGh0dHA6Ly9waHAubmV0L2Rvd25sb2FkLWRvY3MucGhwCiAgICAvLyBUaGVuIHNlYXJjaCBmb3IgZmlsZXMgY29udGFpbmluZyAnZGVwcmVjYXRlZCcgKGNhc2UtaW5zZW5zaXRpdmUpIGFuZCBsb29rIGF0IGVhY2ggZmlsZSB0aGF0IHR1cm5zIHVwLgogICAgdmFyIGJ1aWx0aW5GdW5jdGlvbnNEZXByZWNhdGVkID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgna2V5X2V4aXN0c3xjYWlyb19tYXRyaXhfY3JlYXRlX3NjYWxlfGNhaXJvX21hdHJpeF9jcmVhdGVfdHJhbnNsYXRlfGNhbGxfdXNlcl9tZXRob2R8Y2FsbF91c2VyX21ldGhvZF9hcnJheXxjb21fYWRkcmVmfGNvbV9nZXR8JyArCiAgICAgICAgJ2NvbV9pbnZva2V8Y29tX2lzZW51bXxjb21fbG9hZHxjb21fcmVsZWFzZXxjb21fc2V0fGNvbm5lY3Rpb25fdGltZW91dHxjdWJyaWRfbG9hZF9mcm9tX2dsb3xjdWJyaWRfbmV3X2dsb3xjdWJyaWRfc2F2ZV90b19nbG98JyArCiAgICAgICAgJ2N1YnJpZF9zZW5kX2dsb3xkZWZpbmVfc3lzbG9nX3ZhcmlhYmxlc3xkbHxlcmVnfGVyZWdfcmVwbGFjZXxlcmVnaXxlcmVnaV9yZXBsYWNlfGh3X2RvY3VtZW50YXR0cmlidXRlc3xod19kb2N1bWVudGJvZHl0YWd8JyArCiAgICAgICAgJ2h3X2RvY3VtZW50c2l6ZXxod19vdXRwdXRkb2N1bWVudHxpbWFnZWRhc2hlZGxpbmV8bWF4ZGJfYmluZF9wYXJhbXxtYXhkYl9iaW5kX3Jlc3VsdHxtYXhkYl9jbGllbnRfZW5jb2Rpbmd8bWF4ZGJfY2xvc2VfbG9uZ19kYXRhfCcgKwogICAgICAgICdtYXhkYl9leGVjdXRlfG1heGRiX2ZldGNofG1heGRiX2dldF9tZXRhZGF0YXxtYXhkYl9wYXJhbV9jb3VudHxtYXhkYl9zZW5kX2xvbmdfZGF0YXxtY3J5cHRfZWNifG1jcnlwdF9nZW5lcmljX2VuZHxtaW1lX2NvbnRlbnRfdHlwZXwnICsKICAgICAgICAnbXlzcWxfY3JlYXRlZGJ8bXlzcWxfZGJuYW1lfG15c3FsX2RiX3F1ZXJ5fG15c3FsX2Ryb3BfZGJ8bXlzcWxfZHJvcGRifG15c3FsX2VzY2FwZV9zdHJpbmd8bXlzcWxfZmllbGRmbGFnc3xteXNxbF9maWVsZGZsYWdzfCcgKwogICAgICAgICdteXNxbF9maWVsZG5hbWV8bXlzcWxfZmllbGR0YWJsZXxteXNxbF9maWVsZHR5cGV8bXlzcWxfZnJlZXJlc3VsdHxteXNxbF9saXN0ZGJzfG15c3FsX2xpc3RfZmllbGRzfG15c3FsX2xpc3RmaWVsZHN8bXlzcWxfbGlzdF90YWJsZXN8JyArCiAgICAgICAgJ215c3FsX2xpc3R0YWJsZXN8bXlzcWxfbnVtZmllbGRzfG15c3FsX251bXJvd3N8bXlzcWxfc2VsZWN0ZGJ8bXlzcWxfdGFibGVuYW1lfG15c3FsaV9iaW5kX3BhcmFtfG15c3FsaV9iaW5kX3Jlc3VsdHwnICsKICAgICAgICAnbXlzcWxpX2Rpc2FibGVfcmVhZHNfZnJvbV9tYXN0ZXJ8bXlzcWxpX2Rpc2FibGVfcnBsX3BhcnNlfG15c3FsaV9lbmFibGVfcmVhZHNfZnJvbV9tYXN0ZXJ8bXlzcWxpX2VuYWJsZV9ycGxfcGFyc2V8bXlzcWxpX2V4ZWN1dGV8JyArCiAgICAgICAgJ215c3FsaV9mZXRjaHxteXNxbGlfZ2V0X21ldGFkYXRhfG15c3FsaV9tYXN0ZXJfcXVlcnl8bXlzcWxpX3BhcmFtX2NvdW50fG15c3FsaV9ycGxfcGFyc2VfZW5hYmxlZHxteXNxbGlfcnBsX3Byb2JlfG15c3FsaV9ycGxfcXVlcnlfdHlwZXwnICsKICAgICAgICAnbXlzcWxpX3NlbmRfbG9uZ19kYXRhfG15c3FsaV9zZW5kX3F1ZXJ5fG15c3FsaV9zbGF2ZV9xdWVyeXxvY2liaW5kYnluYW1lfG9jaWNhbmNlbHxvY2ljbG9zZWxvYnxvY2ljb2xsYXBwZW5kfG9jaWNvbGxhc3NpZ258JyArCiAgICAgICAgJ29jaWNvbGxhc3NpZ25lbGVtfG9jaWNvbGxnZXRlbGVtfG9jaWNvbGxtYXh8b2NpY29sbHNpemV8b2NpY29sbHRyaW18b2NpY29sdW1uaXNudWxsfG9jaWNvbHVtbm5hbWV8b2NpY29sdW1ucHJlY2lzaW9ufG9jaWNvbHVtbnNjYWxlfCcgKwogICAgICAgICdvY2ljb2x1bW5zaXplfG9jaWNvbHVtbnR5cGV8b2NpY29sdW1udHlwZXJhd3xvY2ljb21taXR8b2NpZGVmaW5lYnluYW1lfG9jaWVycm9yfG9jaWV4ZWN1dGV8b2NpZmV0Y2h8b2NpZmV0Y2hpbnRvfG9jaWZldGNoc3RhdGVtZW50fCcgKwogICAgICAgICdvY2lmcmVlY29sbGVjdGlvbnxvY2lmcmVlY3Vyc29yfG9jaWZyZWVkZXNjfG9jaWZyZWVzdGF0ZW1lbnR8b2NpaW50ZXJuYWxkZWJ1Z3xvY2lsb2FkbG9ifG9jaWxvZ29mZnxvY2lsb2dvbnxvY2luZXdjb2xsZWN0aW9ufCcgKwogICAgICAgICdvY2luZXdjdXJzb3J8b2NpbmV3ZGVzY3JpcHRvcnxvY2lubG9nb258b2NpbnVtY29sc3xvY2lwYXJzZXxvY2lwbG9nb258b2NpcmVzdWx0fG9jaXJvbGxiYWNrfG9jaXJvd2NvdW50fG9jaXNhdmVsb2J8b2Npc2F2ZWxvYmZpbGV8JyArCiAgICAgICAgJ29jaXNlcnZlcnZlcnNpb258b2Npc2V0cHJlZmV0Y2h8b2Npc3RhdGVtZW50dHlwZXxvY2l3cml0ZWxvYnRvZmlsZXxvY2l3cml0ZXRlbXBvcmFyeWxvYnxQREZfYWRkX2Fubm90YXRpb258UERGX2FkZF9ib29rbWFya3wnICsKICAgICAgICAnUERGX2FkZF9sYXVuY2hsaW5rfFBERl9hZGRfbG9jYWxsaW5rfFBERl9hZGRfbm90ZXxQREZfYWRkX291dGxpbmV8UERGX2FkZF9wZGZsaW5rfFBERl9hZGRfd2VibGlua3xQREZfYXR0YWNoX2ZpbGV8UERGX2JlZ2luX3BhZ2V8JyArCiAgICAgICAgJ1BERl9iZWdpbl90ZW1wbGF0ZXxQREZfY2xvc2VfcGRpfFBERl9jbG9zZXxQREZfZmluZGZvbnR8UERGX2dldF9mb250fFBERl9nZXRfZm9udG5hbWV8UERGX2dldF9mb250c2l6ZXxQREZfZ2V0X2ltYWdlX2hlaWdodHwnICsKICAgICAgICAnUERGX2dldF9pbWFnZV93aWR0aHxQREZfZ2V0X21ham9ydmVyc2lvbnxQREZfZ2V0X21pbm9ydmVyc2lvbnxQREZfZ2V0X3BkaV9wYXJhbWV0ZXJ8UERGX2dldF9wZGlfdmFsdWV8UERGX29wZW5fY2NpdHR8UERGX29wZW5fZmlsZXwnICsKICAgICAgICAnUERGX29wZW5fZ2lmfFBERl9vcGVuX2ltYWdlX2ZpbGV8UERGX29wZW5faW1hZ2V8UERGX29wZW5fanBlZ3xQREZfb3Blbl9wZGl8UERGX29wZW5fdGlmZnxQREZfcGxhY2VfaW1hZ2V8UERGX3BsYWNlX3BkaV9wYWdlfCcgKwogICAgICAgICdQREZfc2V0X2JvcmRlcl9jb2xvcnxQREZfc2V0X2JvcmRlcl9kYXNofFBERl9zZXRfYm9yZGVyX3N0eWxlfFBERl9zZXRfY2hhcl9zcGFjaW5nfFBERl9zZXRfZHVyYXRpb258UERGX3NldF9ob3Jpel9zY2FsaW5nfCcgKwogICAgICAgICdQREZfc2V0X2luZm9fYXV0aG9yfFBERl9zZXRfaW5mb19jcmVhdG9yfFBERl9zZXRfaW5mb19rZXl3b3Jkc3xQREZfc2V0X2luZm9fc3ViamVjdHxQREZfc2V0X2luZm9fdGl0bGV8UERGX3NldF9sZWFkaW5nfCcgKwogICAgICAgICdQREZfc2V0X3RleHRfbWF0cml4fFBERl9zZXRfdGV4dF9yZW5kZXJpbmd8UERGX3NldF90ZXh0X3Jpc2V8UERGX3NldF93b3JkX3NwYWNpbmd8UERGX3NldGdyYXlfZmlsbHxQREZfc2V0Z3JheV9zdHJva2V8UERGX3NldGdyYXl8JyArCiAgICAgICAgJ1BERl9zZXRwb2x5ZGFzaHxQREZfc2V0cmdiY29sb3JfZmlsbHxQREZfc2V0cmdiY29sb3Jfc3Ryb2tlfFBERl9zZXRyZ2Jjb2xvcnxQREZfc2hvd19ib3hlZHxwaHBfY2hlY2tfc3ludGF4fHB4X3NldF90YWJsZW5hbWV8JyArCiAgICAgICAgJ3B4X3NldF90YXJnZXRlbmNvZGluZ3xydW5raXRfc2FuZGJveF9vdXRwdXRfaGFuZGxlcnxzZXNzaW9uX2lzX3JlZ2lzdGVyZWR8c2Vzc2lvbl9yZWdpc3RlcnxzZXNzaW9uX3VucmVnaXN0ZXInICsKICAgICAgICAnc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lfG1hZ2ljX3F1b3Rlc19ydW50aW1lfHNldF9zb2NrZXRfYmxvY2tpbmd8c29ja2V0X3NldF9ibG9ja2luZ3xzZXRfc29ja2V0X3RpbWVvdXR8c29ja2V0X3NldF90aW1lb3V0fHNwbGl0fHNwbGl0aXwnICsKICAgICAgICAnc3FsX3JlZ2Nhc2UnKS5zcGxpdCgnfCcpCiAgICApOwoKICAgIHZhciBrZXl3b3Jkc0RlcHJlY2F0ZWQgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCdjZnVuY3Rpb258b2xkX2Z1bmN0aW9uJykuc3BsaXQoJ3wnKQogICAgKTsKCiAgICB2YXIgZnV0dXJlUmVzZXJ2ZWQgPSBsYW5nLmFycmF5VG9NYXAoW10pOwoKICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcy4gVXNlICg/OikgaW5zdGVhZC4KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQKCiAgICB0aGlzLiRydWxlcyA9IHsKICAgICAgICAic3RhcnQiIDogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdXBwb3J0LnBocF90YWciLCAvLyBwaHAgb3BlbiB0YWcKICAgICAgICAgICAgICAgIHJlZ2V4IDogIjxcXD8oPzpwaHB8XFw9KSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3VwcG9ydC5waHBfdGFnIiwgLy8gcGhwIGNsb3NlIHRhZwogICAgICAgICAgICAgICAgcmVnZXggOiAiXFw/PiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICI8XFwhLS0iLAogICAgICAgICAgICAgICAgbmV4dCA6ICJodG1sY29tbWVudCIKICAgICAgICAgICAgfSwgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogIm1ldGEudGFnIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIjxzdHlsZSIsCiAgICAgICAgICAgICAgICBuZXh0IDogImNzcyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAibWV0YS50YWciLCAvLyBvcGVuaW5nIHRhZwogICAgICAgICAgICAgICAgcmVnZXggOiAiPFxcLz9bLV9hLXpBLVowLTk6XSsiLAogICAgICAgICAgICAgICAgbmV4dCA6ICJodG1sdGFnIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICdtZXRhLnRhZycsCiAgICAgICAgICAgICAgICByZWdleCA6ICc8XCFET0NUWVBFLio/PicKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXC8uKiQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgICAgIHJlZ2V4IDogIiMuKiQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGRvY0NvbW1lbnQuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwKICAgICAgICAgICAgICAgIG5leHQgOiAiY29tbWVudCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nLnJlZ2V4cCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJbL10oPzooPzpcXFsoPzpcXFxcXXxbXlxcXV0pK1xcXSl8KD86XFxcXC98W15cXF0vXSkpKlsvXVtnaW15XSpcXHMqKD89WykuLDtdfCQpIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXScKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQKICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXS4qXFxcXCQnLAogICAgICAgICAgICAgICAgbmV4dCA6ICJxcXN0cmluZyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10iCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0CiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10uKlxcXFwkIiwKICAgICAgICAgICAgICAgIG5leHQgOiAicXN0cmluZyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleAogICAgICAgICAgICAgICAgcmVnZXggOiAiMFt4WF1bMC05YS1mQS1GXStcXGIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdAogICAgICAgICAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lmxhbmd1YWdlIiwgLy8gY29uc3RhbnRzCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXGIoPzpERUZBVUxUX0lOQ0xVREVfUEFUSHxFXyg/OkFMTHxDTyg/Ok1QSUxFXyg/OkVSUk9SfFdBUk5JTkcpfFJFXyg/OkVSUk9SfFdBUk5JTkcpKXwiICsKICAgICAgICAgICAgICAgICAgICAgICAgIkVSUk9SfE5PVElDRXxQQVJTRXxTVFJJQ1R8VVNFUl8oPzpFUlJPUnxOT1RJQ0V8V0FSTklORyl8V0FSTklORyl8UCg/OkVBUl8oPzpFWFRFTlNJT05fRElSfElOU1RBTExfRElSKXwiICsKICAgICAgICAgICAgICAgICAgICAgICAgIkhQXyg/OkJJTkRJUnxDT05GSUdfRklMRV8oPzpQQVRIfFNDQU5fRElSKXxEQVRBRElSfEUoPzpPTHxYVEVOU0lPTl9ESVIpfElOVF8oPzpNQVh8U0laRSl8IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJMKD86SUJESVJ8T0NBTFNUQVRFRElSKXxPKD86U3xVVFBVVF9IQU5ETEVSXyg/OkNPTlR8RU5EfFNUQVJUKSl8UFJFRklYfFMoPzpBUEl8SExJQl9TVUZGSVh8WVNDT05GRElSKXwiICsKICAgICAgICAgICAgICAgICAgICAgICAgIlZFUlNJT04pKXxfX0NPTVBJTEVSX0hBTFRfT0ZGU0VUX18pXFxiIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5sYW5ndWFnZSIsIC8vIGNvbnN0YW50cwogICAgICAgICAgICAgICAgcmVnZXggOiAiXFxiKD86QSg/OkIoPzpEQVlfKD86MXwyfDN8NHw1fDZ8Nyl8TU9OXyg/OjEoPzowfDF8MnwpfDJ8M3w0fDV8Nnw3fDh8OSkpfExUX0RJR0lUU3xNX1NUUnwiICsKICAgICAgICAgICAgICAgICAgICAgICAgIlNTRVJUXyg/OkFDVElWRXxCQUlMfENBTExCQUNLfFFVSUVUX0VWQUx8V0FSTklORykpfEMoPzpBU0VfKD86TE9XRVJ8VVBQRVIpfEhBUl9NQVh8IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJPKD86REVTRVR8Tk5FQ1RJT05fKD86QUJPUlRFRHxOT1JNQUx8VElNRU9VVCl8VU5UXyg/Ok5PUk1BTHxSRUNVUlNJVkUpKXwiICsKICAgICAgICAgICAgICAgICAgICAgICAgIlIoPzpFRElUU18oPzpBTEx8RE9DU3xGVUxMUEFHRXxHKD86RU5FUkFMfFJPVVApfE1PRFVMRVN8UUF8U0FQSSl8TkNZU1RSfCIgKwogICAgICAgICAgICAgICAgICAgICAgICAiWVBUXyg/OkJMT1dGSVNIfEVYVF9ERVN8TUQ1fFMoPzpBTFRfTEVOR1RIfFREX0RFUykpKXxVUlJFTkNZX1NZTUJPTCl8RCg/OkFZXyg/OjF8MnwzfDR8NXw2fDcpfCIgKwogICAgICAgICAgICAgICAgICAgICAgICAiRUNJTUFMX1BPSU5UfElSRUNUT1JZX1NFUEFSQVRPUnxfKD86Rk1UfFRfRk1UKSl8RSg/Ok5UXyg/OkNPTVBBVHxOT1FVT1RFU3xRVU9URVMpfFJBKD86Xyg/OkRfKD86Rk1UfFRfRk1UKXwiICsKICAgICAgICAgICAgICAgICAgICAgICAgIlRfRk1UfFlFQVIpfCl8WFRSXyg/OklGX0VYSVNUU3xPVkVSV1JJVEV8UFJFRklYXyg/OkFMTHxJKD86Rl9FWElTVFN8TlZBTElEKXxTQU1FKXxTS0lQKSl8RlJBQ19ESUdJVFN8R1JPVVBJTkd8IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJIVE1MXyg/OkVOVElUSUVTfFNQRUNJQUxDSEFSUyl8SU4oPzpGT18oPzpBTEx8Qyg/Ok9ORklHVVJBVElPTnxSRURJVFMpfEVOVklST05NRU5UfEdFTkVSQUx8TElDRU5TRXxNT0RVTEVTfFZBUklBQkxFUyl8IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJJXyg/OkFMTHxQRVJESVJ8U1lTVEVNfFVTRVIpfFRfKD86Q1VSUl9TWU1CT0x8RlJBQ19ESUdJVFMpKXxMKD86Q18oPzpBTEx8Qyg/Ok9MTEFURXxUWVBFKXxNKD86RVNTQUdFU3xPTkVUQVJZKXxOVU1FUklDfFRJTUUpfCIgKwogICAgICAgICAgICAgICAgICAgICAgICAiTyg/OkNLXyg/OkVYfE5CfFNIfFVOKXxHXyg/OkEoPzpMRVJUfFVUSCg/OlBSSVZ8KSl8Qyg/Ok9OU3xSKD86SVR8T04pKXxEKD86QUVNT058RUJVRyl8RSg/Ok1FUkd8UlIpfElORk98S0VSTnwiICsKICAgICAgICAgICAgICAgICAgICAgICAgIkwoPzpPQ0FMKD86MHwxfDJ8M3w0fDV8Nnw3KXxQUil8TUFJTHxOKD86REVMQVl8RVdTfE8oPzpUSUNFfFdBSVQpKXxPREVMQVl8UCg/OkVSUk9SfElEKXxTWVNMT0d8VSg/OlNFUnxVQ1ApfFdBUk5JTkcpKSl8IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJNKD86T05fKD86MSg/OjB8MXwyfCl8MnwzfDR8NXw2fDd8OHw5fERFQ0lNQUxfUE9JTlR8R1JPVVBJTkd8VEhPVVNBTkRTX1NFUCl8Xyg/OjFfUEl8Ml8oPzpQSXxTUVJUUEkpfEV8TCg/Ok4oPzoxMHwyKXwiICsKICAgICAgICAgICAgICAgICAgICAgICAgIk9HKD86MTBFfDJFKSl8UEkoPzpfKD86Mnw0KXwpfFNRUlQoPzoxXzJ8MikpKXxOKD86RUdBVElWRV9TSUdOfE8oPzpFWFBSfFNUUil8Xyg/OkNTX1BSRUNFREVTfFMoPzpFUF9CWV9TUEFDRXxJR05fUE9TTikpKXwiICsKICAgICAgICAgICAgICAgICAgICAgICAgIlAoPzpBVEgoPzpJTkZPXyg/OkJBU0VOQU1FfERJUk5BTUV8RVhURU5TSU9OKXxfU0VQQVJBVE9SKXxNX1NUUnxPU0lUSVZFX1NJR058Xyg/OkNTX1BSRUNFREVTfFMoPzpFUF9CWV9TUEFDRXxJR05fUE9TTikpKXwiICsKICAgICAgICAgICAgICAgICAgICAgICAgIlJBRElYQ0hBUnxTKD86RUVLXyg/OkNVUnxFTkR8U0VUKXxPUlRfKD86QVNDfERFU0N8TlVNRVJJQ3xSRUdVTEFSfFNUUklORyl8VFJfUEFEXyg/OkJPVEh8TEVGVHxSSUdIVCkpfCIgKwogICAgICAgICAgICAgICAgICAgICAgICAiVCg/OkhPVVMoPzpBTkRTX1NFUHxFUCl8X0ZNVCg/Ol9BTVBNfCkpfFlFUyg/OkVYUFJ8U1RSKXxTVEQoPzpJTnxPVVR8RVJSKSlcXGIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoa2V5d29yZHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWx0aW5Db25zdGFudHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImNvbnN0YW50Lmxhbmd1YWdlIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsdGluVmFyaWFibGVzLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS5sYW5ndWFnZSI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZnV0dXJlUmVzZXJ2ZWQuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuaWxsZWdhbCI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYnVpbHRpbkZ1bmN0aW9ucy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5mdW5jdGlvbiI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPT0gImRlYnVnZ2VyIikKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkLmRlcHJlY2F0ZWQiOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgaWYodmFsdWUubWF0Y2goL14oXCRbYS16QS1aXVthLXpBLVowLTlfXSp8c2VsZnxwYXJlbnQpJC8pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2YXJpYWJsZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgLy8gVE9ETzogVW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBVbmljb2RlIGlkZW50aWZpZXJzCiAgICAgICAgICAgICAgICByZWdleCA6ICJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJscGFyZW4iLAogICAgICAgICAgICAgICAgcmVnZXggOiAiW1soe10iCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInJwYXJlbiIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJjb21tZW50IiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudAogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwKICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUKICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIgogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAicXFzdHJpbmciIDogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgcmVnZXggOiAnKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqPyInLAogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJwogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAicXN0cmluZyIgOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgICAgICByZWdleCA6ICIoPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/JyIsCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgcmVnZXggOiAnLisnCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJodG1sY29tbWVudCIgOiBbCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgICAgICAgcmVnZXggOiAiLio/LS0+IiwKICAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0IgogICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLAogICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIgogICAgICAgICAgICAgfSAKICAgICAgICAgXSwKICAgICAgICAgImh0bWx0YWciIDogWyAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB0b2tlbiA6ICJtZXRhLnRhZyIsCiAgICAgICAgICAgICAgICAgcmVnZXggOiAiPiIsCiAgICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCIKICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgICByZWdleCA6ICJbLV9hLXpBLVowLTk6XSsiCiAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgcmVnZXggOiAiXFxzKyIKICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgIHJlZ2V4IDogJyIuKj8iJwogICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgcmVnZXggOiAiJy4qPyciCiAgICAgICAgICAgICB9IAogICAgICAgICBdLAogICAgICAgICJjc3MiIDogWyAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB0b2tlbiA6ICJtZXRhLnRhZyIsCiAgICAgICAgICAgICAgICAgcmVnZXggOiAiPFwvc3R5bGU+IiwKICAgICAgICAgICAgICAgICBuZXh0IDogImh0bWx0YWciCiAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgdG9rZW4gOiAibWV0YS50YWciLAogICAgICAgICAgICAgICAgIHJlZ2V4IDogIj4iLAogICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIHRva2VuIDogJ3RleHQnLAogICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/Om1lZGlhfHR5cGV8aHJlZikiCiAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgdG9rZW4gOiAnc3RyaW5nJywKICAgICAgICAgICAgICAgICByZWdleCA6ICc9Ii4qPyInCiAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ubHBhcmVuIiwKICAgICAgICAgICAgICAgICByZWdleCA6ICJceyIsCiAgICAgICAgICAgICAgICAgbmV4dCA6ICJjc3NkZWNsYXJhdGlvbiIsCiAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZCIsCiAgICAgICAgICAgICAgICAgcmVnZXggOiAiI1tBLVphLXowLTlcLVxfXC5dKyIKICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICB0b2tlbiA6ICJ2YXJpYWJsZSIsCiAgICAgICAgICAgICAgICAgcmVnZXggOiAiXFwuW0EtWmEtejAtOVwtXF9cLl0rIgogICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50IiwKICAgICAgICAgICAgICAgICByZWdleCA6ICJbQS1aYS16MC05XSsiCiAgICAgICAgICAgICB9CiAgICAgICAgIF0sCiAgICAgICAgICJjc3NkZWNsYXJhdGlvbiIgOiBbCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdG9rZW4gOiAic3VwcG9ydC50eXBlIiwKICAgICAgICAgICAgICAgICByZWdleCA6ICJbXC1hLXpBLVpdKyIsCiAgICAgICAgICAgICAgICAgbmV4dCAgOiAiY3NzdmFsdWUiCiAgICAgICAgICAgICB9LCAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5ycGFyZW4iLAogICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1x9JywKICAgICAgICAgICAgICAgICBuZXh0IDogImNzcyIKICAgICAgICAgICAgIH0KICAgICAgICAgXSwKICAgICAgICAgImNzc3ZhbHVlIiA6IFsKICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICByZWdleCA6ICJcOiIKICAgICAgICAgICAgICAgfSwgCiAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50IiwKICAgICAgICAgICAgICAgICAgIHJlZ2V4IDogIiNbMC05YS16QS1aXSsiCiAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgICAgICAgICAgICAgcmVnZXggOiAiW1wtXF8wLTlhLXpBLVpcIicgLCVdKyIKICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsCiAgICAgICAgICAgICAgICAgICByZWdleCA6ICI7IiwKICAgICAgICAgICAgICAgICAgIG5leHQgOiAiY3NzZGVjbGFyYXRpb24iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgXSwKICAgIH07CgogICAgdGhpcy5lbWJlZFJ1bGVzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgImRvYy0iLAogICAgICAgIFsgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldEVuZFJ1bGUoInN0YXJ0IikgXSk7Cn07Cgpvb3AuaW5oZXJpdHMoUGhwSGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7CgpleHBvcnRzLlBocEhpZ2hsaWdodFJ1bGVzID0gUGhwSGlnaGxpZ2h0UnVsZXM7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOwoKdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuJHJ1bGVzID0gewogICAgICAgICJzdGFydCIgOiBbIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MudGFnIiwKICAgICAgICAgICAgcmVnZXggOiAiQFtcXHdcXGRfXSsiIC8vIFRPRE86IGZpeCBlbWFpbCBhZGRyZXNzZXMKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICJcXHMrIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlRPRE8iCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiW15AXFwqXSsiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiLiIKICAgICAgICB9XQogICAgfTsKfTsKCm9vcC5pbmhlcml0cyhEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5nZXRTdGFydFJ1bGUgPSBmdW5jdGlvbihzdGFydCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gZG9jIGNvbW1lbnQKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICJcXC9cXCooPz1cXCopIiwKICAgICAgICAgICAgbmV4dCAgOiBzdGFydAogICAgICAgIH07CiAgICB9OwogICAgCiAgICB0aGlzLmdldEVuZFJ1bGUgPSBmdW5jdGlvbiAoc3RhcnQpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsIC8vIGNsb3NpbmcgY29tbWVudAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlxcKlxcLyIsCiAgICAgICAgICAgIG5leHQgIDogc3RhcnQKICAgICAgICB9OwogICAgfTsKCn0pLmNhbGwoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLnByb3RvdHlwZSk7CgpleHBvcnRzLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsKCn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsKCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IGZ1bmN0aW9uKCkge307CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihsaW5lLCBpbnB1dCkgewogICAgICAgIGlmICghIC9eXHMrJC8udGVzdChsaW5lKSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgICByZXR1cm4gL15ccypcfS8udGVzdChpbnB1dCk7CiAgICB9OwoKICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihkb2MsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocm93KTsKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKlx9KS8pOwoKICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDsKCiAgICAgICAgdmFyIGNvbHVtbiA9IG1hdGNoWzFdLmxlbmd0aDsKICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gZG9jLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn0pOwoKICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcyB8fCBvcGVuQnJhY2VQb3Mucm93ID09IHJvdykgcmV0dXJuIDA7CgogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOwogICAgICAgIGRvYy5yZXBsYWNlKG5ldyBSYW5nZShyb3csIDAsIHJvdywgY29sdW1uLTEpLCBpbmRlbnQpOwogICAgfTsKCiAgICB0aGlzLiRnZXRJbmRlbnQgPSBmdW5jdGlvbihsaW5lKSB7CiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAiIjsKICAgIH07Cgp9KS5jYWxsKE1hdGNoaW5nQnJhY2VPdXRkZW50LnByb3RvdHlwZSk7CgpleHBvcnRzLk1hdGNoaW5nQnJhY2VPdXRkZW50ID0gTWF0Y2hpbmdCcmFjZU91dGRlbnQ7Cn0pOwovKiB2aW06dHM9NDpzdHM9NDpzdz00OgogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIENocmlzIFNwZW5jZXIgPGNocmlzLmFnLnNwZW5jZXIgQVQgZ29vZ2xlbWFpbCBET1QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9iZWhhdmlvdXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7CnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCcuLi9iZWhhdmlvdXInKS5CZWhhdmlvdXI7Cgp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gZnVuY3Rpb24gKCkgewoKICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgewogICAgICAgIGlmICh0ZXh0ID09ICd7JykgewogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7CiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7JyArIHNlbGVjdGVkICsgJ30nLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3t9JywKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICd9JykgewogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsKICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsKICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsKICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnfScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsKICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAiXG4iKSB7CiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9JykgewogICAgICAgICAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IHNlc3Npb24uZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiBjdXJzb3Iucm93LCBjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxfSk7CiAgICAgICAgICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcykKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CgogICAgICAgICAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQoc3RhdGUsIGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUubGVuZ3RoIC0gMSksIHNlc3Npb24uZ2V0VGFiU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgdmFyIG5leHRfaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOwoKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xuJyArIGluZGVudCArICdcbicgKyBuZXh0X2luZGVudCwKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCBpbmRlbnQubGVuZ3RoLCAxLCBpbmRlbnQubGVuZ3RoXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoImJyYWNlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7CiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsKICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJ3snKSB7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2UuZW5kLmNvbHVtbiwgcmFuZ2UuZW5kLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9JykgewogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOwogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoInBhcmVucyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7CiAgICAgICAgaWYgKHRleHQgPT0gJygnKSB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7CiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygnICsgc2VsZWN0ZWQgKyAnKScsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCknLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJyknKSB7CiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgewogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCcpJywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOwogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoInBhcmVucyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7CiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsKICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJygnKSB7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgewogICAgICAgIGlmICh0ZXh0ID09ICciJykgewogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7CiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICciJyArIHNlbGVjdGVkICsgJyInLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsKICAgICAgICAgICAgICAgIHZhciBsZWZ0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4tMSwgY3Vyc29yLmNvbHVtbik7CgogICAgICAgICAgICAgICAgLy8gV2UncmUgZXNjYXBlZC4KICAgICAgICAgICAgICAgIGlmIChsZWZ0Q2hhciA9PSAnXFwnKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gRmluZCB3aGF0IHRva2VuIHdlJ3JlIGluc2lkZS4KICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzZXNzaW9uLmdldFRva2VucyhzZWxlY3Rpb24uc3RhcnQucm93LCBzZWxlY3Rpb24uc3RhcnQucm93KVswXS50b2tlbnM7CiAgICAgICAgICAgICAgICB2YXIgY29sID0gMCwgdG9rZW47CiAgICAgICAgICAgICAgICB2YXIgcXVvdGVwb3MgPSAtMTsgLy8gVHJhY2sgd2hldGhlciB3ZSdyZSBpbnNpZGUgYW4gb3BlbiBxdW90ZS4KCiAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRva2Vucy5sZW5ndGg7IHgrKykgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW3hdOwogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IC0xOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocXVvdGVwb3MgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IHRva2VuLnZhbHVlLmluZGV4T2YoJyInKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0b2tlbi52YWx1ZS5sZW5ndGggKyBjb2wpID4gc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbikgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29sICs9IHRva2Vuc1t4XS52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gVHJ5IGFuZCBiZSBzbWFydCBhYm91dCB3aGVuIHdlIGF1dG8gaW5zZXJ0LgogICAgICAgICAgICAgICAgaWYgKCF0b2tlbiB8fCAocXVvdGVwb3MgPCAwICYmIHRva2VuLnR5cGUgIT09ICJjb21tZW50IiAmJiAodG9rZW4udHlwZSAhPT0gInN0cmluZyIgfHwgKChzZWxlY3Rpb24uc3RhcnQuY29sdW1uICE9PSB0b2tlbi52YWx1ZS5sZW5ndGgrY29sLTEpICYmIHRva2VuLnZhbHVlLmxhc3RJbmRleE9mKCciJykgPT09IHRva2VuLnZhbHVlLmxlbmd0aC0xKSkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJyIiJywKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwxXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gJiYgdG9rZW4udHlwZSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaW5wdXQgYW5kIG1vdmUgcmlnaHQgb25lIGlmIHdlJ3JlIHR5cGluZyBvdmVyIHRoZSBjbG9zaW5nIHF1b3RlLgogICAgICAgICAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7CiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsKICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJyInKSB7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCn0Kb29wLmluaGVyaXRzKENzdHlsZUJlaGF2aW91ciwgQmVoYXZpb3VyKTsKCmV4cG9ydHMuQ3N0eWxlQmVoYXZpb3VyID0gQ3N0eWxlQmVoYXZpb3VyOwp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7CnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7CnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOwoKdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307Cm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IC8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvOwogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IC9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLzsKICAgIAogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXg7CgogICAgICAgICAgICBpZiAobWF0Y2hbMV0pCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKHNlc3Npb24sIG1hdGNoWzFdLCByb3csIGkpOwoKICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSArIG1hdGNoWzBdLmxlbmd0aCk7CiAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsKICAgICAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGZvbGRTdHlsZSAhPT0gIm1hcmtiZWdpbmVuZCIpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDsKCiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkgewogICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSk7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiByb3csIGNvbHVtbjogaX07CiAgICAgICAgICAgIHZhciBzdGFydCA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldChtYXRjaFsxXSwgZW5kKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICghc3RhcnQpCiAgICAgICAgICAgICAgICByZXR1cm47CgogICAgICAgICAgICBzdGFydC5jb2x1bW4rKzsKICAgICAgICAgICAgZW5kLmNvbHVtbi0tOwoKICAgICAgICAgICAgcmV0dXJuICBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOwogICAgICAgIH0KICAgIH07CiAgICAKfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOwoKfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOwoKdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSBudWxsOwogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7CgogICAgLy8gbXVzdCByZXR1cm4gIiIgaWYgdGhlcmUncyBubyBmb2xkLCB0byBlbmFibGUgY2FjaGluZwogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsKICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOwogICAgICAgIGlmICh0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGxpbmUpKQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsKICAgICAgICBpZiAoZm9sZFN0eWxlID09ICJtYXJrYmVnaW5lbmQiCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpCiAgICAgICAgICAgIHJldHVybiAiZW5kIjsKICAgICAgICByZXR1cm4gIiI7CiAgICB9OwogICAgCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7CiAgICAgICAgdmFyIHJlID0gL15ccyovOwogICAgICAgIHZhciBzdGFydFJvdyA9IHJvdzsKICAgICAgICB2YXIgZW5kUm93ID0gcm93OwogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgdmFyIHN0YXJ0Q29sdW1uID0gY29sdW1uIHx8IGxpbmUubGVuZ3RoOwogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOwogICAgICAgIHZhciBtYXhSb3cgPSBzZXNzaW9uLmdldExlbmd0aCgpCiAgICAgICAgCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7CiAgICAgICAgICAgIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICAgICAgdmFyIGxldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOwoKICAgICAgICAgICAgaWYgKGxldmVsID09IGxpbmUubGVuZ3RoKQogICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICBpZiAobGV2ZWwgPD0gc3RhcnRMZXZlbCkKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgZW5kUm93ID0gcm93OwogICAgICAgIH0KCiAgICAgICAgaWYgKGVuZFJvdyA+IHN0YXJ0Um93KSB7CiAgICAgICAgICAgIHZhciBlbmRDb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kUm93KS5sZW5ndGg7CiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7CiAgICAgICAgfQogICAgfTsKCiAgICB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCBicmFja2V0LCByb3csIGNvbHVtbikgewogICAgICAgIHZhciBzdGFydCA9IHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW4gKyAxfTsKICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsKICAgICAgICBpZiAoIWVuZCkKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICB2YXIgZncgPSBzZXNzaW9uLmZvbGRXaWRnZXRzW2VuZC5yb3ddOwogICAgICAgIGlmIChmdyA9PSBudWxsKQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsKCiAgICAgICAgaWYgKGZ3ID09ICJzdGFydCIpIHsKICAgICAgICAgICAgZW5kLnJvdyAtLTsKICAgICAgICAgICAgZW5kLmNvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmQucm93KS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOwogICAgfTsKCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsKCn0pOwo7CiAgICAgICAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAg]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-php.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9waHAiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvcGhwX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLCJhY2UvcmFuZ2UiLCJhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlIiwiYWNlL21vZGUvZm9sZGluZy9jc3R5bGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dCIpLk1vZGUsZj1hKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXIsZz1hKCIuL3BocF9oaWdobGlnaHRfcnVsZXMiKS5QaHBIaWdobGlnaHRSdWxlcyxoPWEoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50LGk9YSgiLi4vcmFuZ2UiKS5SYW5nZSxqPWEoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cixrPWEoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZSxsPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSksdGhpcy4kb3V0ZGVudD1uZXcgaCx0aGlzLiRiZWhhdmlvdXI9bmV3IGosdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGt9O2QuaW5oZXJpdHMobCxlKSxmdW5jdGlvbigpe3RoaXMudG9nZ2xlQ29tbWVudExpbmVzPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSEwLGY9L14oXHMqKSMvO2Zvcih2YXIgZz1jO2c8PWQ7ZysrKWlmKCFmLnRlc3QoYi5nZXRMaW5lKGcpKSl7ZT0hMTticmVha31pZihlKXt2YXIgaD1uZXcgaSgwLDAsMCwwKTtmb3IodmFyIGc9YztnPD1kO2crKyl7dmFyIGo9Yi5nZXRMaW5lKGcpLGs9ai5tYXRjaChmKTtoLnN0YXJ0LnJvdz1nLGguZW5kLnJvdz1nLGguZW5kLmNvbHVtbj1rWzBdLmxlbmd0aCxiLnJlcGxhY2UoaCxrWzFdKX19ZWxzZSBiLmluZGVudFJvd3MoYyxkLCIjIil9LHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuJGdldEluZGVudChiKSxlPXRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGIsYSksZj1lLnRva2VucztpZihmLmxlbmd0aCYmZltmLmxlbmd0aC0xXS50eXBlPT0iY29tbWVudCIpcmV0dXJuIGQ7aWYoYT09InN0YXJ0Iil7dmFyIGc9Yi5tYXRjaCgvXi4qW1x7XChcW1w6XVxzKiQvKTtnJiYoZCs9Yyl9cmV0dXJuIGR9LHRoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQoYixjKX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7dGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChiLGMpfX0uY2FsbChsLnByb3RvdHlwZSksYi5Nb2RlPWx9KSxkZWZpbmUoImFjZS9tb2RlL3BocF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsZz1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGg9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgZixiPWUuYXJyYXlUb01hcCgiYWJzfGFjb3N8YWNvc2h8YWRkY3NsYXNoZXN8YWRkc2xhc2hlc3xhZ2dyZWdhdGV8YWdncmVnYXRlX2luZm98YWdncmVnYXRlX21ldGhvZHN8YWdncmVnYXRlX21ldGhvZHNfYnlfbGlzdHxhZ2dyZWdhdGVfbWV0aG9kc19ieV9yZWdleHB8YWdncmVnYXRlX3Byb3BlcnRpZXN8YWdncmVnYXRlX3Byb3BlcnRpZXNfYnlfbGlzdHxhZ2dyZWdhdGVfcHJvcGVydGllc19ieV9yZWdleHB8YWdncmVnYXRpb25faW5mb3xhbXFwY29ubmVjdGlvbnxhbXFwZXhjaGFuZ2V8YW1xcHF1ZXVlfGFwYWNoZV9jaGlsZF90ZXJtaW5hdGV8YXBhY2hlX2dldF9tb2R1bGVzfGFwYWNoZV9nZXRfdmVyc2lvbnxhcGFjaGVfZ2V0ZW52fGFwYWNoZV9sb29rdXBfdXJpfGFwYWNoZV9ub3RlfGFwYWNoZV9yZXF1ZXN0X2hlYWRlcnN8YXBhY2hlX3Jlc2V0X3RpbWVvdXR8YXBhY2hlX3Jlc3BvbnNlX2hlYWRlcnN8YXBhY2hlX3NldGVudnxhcGNfYWRkfGFwY19iaW5fZHVtcHxhcGNfYmluX2R1bXBmaWxlfGFwY19iaW5fbG9hZHxhcGNfYmluX2xvYWRmaWxlfGFwY19jYWNoZV9pbmZvfGFwY19jYXN8YXBjX2NsZWFyX2NhY2hlfGFwY19jb21waWxlX2ZpbGV8YXBjX2RlY3xhcGNfZGVmaW5lX2NvbnN0YW50c3xhcGNfZGVsZXRlfGFwY19kZWxldGVfZmlsZXxhcGNfZXhpc3RzfGFwY19mZXRjaHxhcGNfaW5jfGFwY19sb2FkX2NvbnN0YW50c3xhcGNfc21hX2luZm98YXBjX3N0b3JlfGFwY2l0ZXJhdG9yfGFwZF9icmVha3BvaW50fGFwZF9jYWxsc3RhY2t8YXBkX2NsdW5rfGFwZF9jb250aW51ZXxhcGRfY3JvYWt8YXBkX2R1bXBfZnVuY3Rpb25fdGFibGV8YXBkX2R1bXBfcGVyc2lzdGVudF9yZXNvdXJjZXN8YXBkX2R1bXBfcmVndWxhcl9yZXNvdXJjZXN8YXBkX2VjaG98YXBkX2dldF9hY3RpdmVfc3ltYm9sc3xhcGRfc2V0X3Bwcm9mX3RyYWNlfGFwZF9zZXRfc2Vzc2lvbnxhcGRfc2V0X3Nlc3Npb25fdHJhY2V8YXBkX3NldF9zZXNzaW9uX3RyYWNlX3NvY2tldHxhcHBlbmRpdGVyYXRvcnxhcnJheXxhcnJheV9jaGFuZ2Vfa2V5X2Nhc2V8YXJyYXlfY2h1bmt8YXJyYXlfY29tYmluZXxhcnJheV9jb3VudF92YWx1ZXN8YXJyYXlfZGlmZnxhcnJheV9kaWZmX2Fzc29jfGFycmF5X2RpZmZfa2V5fGFycmF5X2RpZmZfdWFzc29jfGFycmF5X2RpZmZfdWtleXxhcnJheV9maWxsfGFycmF5X2ZpbGxfa2V5c3xhcnJheV9maWx0ZXJ8YXJyYXlfZmxpcHxhcnJheV9pbnRlcnNlY3R8YXJyYXlfaW50ZXJzZWN0X2Fzc29jfGFycmF5X2ludGVyc2VjdF9rZXl8YXJyYXlfaW50ZXJzZWN0X3Vhc3NvY3xhcnJheV9pbnRlcnNlY3RfdWtleXxhcnJheV9rZXlfZXhpc3RzfGFycmF5X2tleXN8YXJyYXlfbWFwfGFycmF5X21lcmdlfGFycmF5X21lcmdlX3JlY3Vyc2l2ZXxhcnJheV9tdWx0aXNvcnR8YXJyYXlfcGFkfGFycmF5X3BvcHxhcnJheV9wcm9kdWN0fGFycmF5X3B1c2h8YXJyYXlfcmFuZHxhcnJheV9yZWR1Y2V8YXJyYXlfcmVwbGFjZXxhcnJheV9yZXBsYWNlX3JlY3Vyc2l2ZXxhcnJheV9yZXZlcnNlfGFycmF5X3NlYXJjaHxhcnJheV9zaGlmdHxhcnJheV9zbGljZXxhcnJheV9zcGxpY2V8YXJyYXlfc3VtfGFycmF5X3VkaWZmfGFycmF5X3VkaWZmX2Fzc29jfGFycmF5X3VkaWZmX3Vhc3NvY3xhcnJheV91aW50ZXJzZWN0fGFycmF5X3VpbnRlcnNlY3RfYXNzb2N8YXJyYXlfdWludGVyc2VjdF91YXNzb2N8YXJyYXlfdW5pcXVlfGFycmF5X3Vuc2hpZnR8YXJyYXlfdmFsdWVzfGFycmF5X3dhbGt8YXJyYXlfd2Fsa19yZWN1cnNpdmV8YXJyYXlhY2Nlc3N8YXJyYXlpdGVyYXRvcnxhcnJheW9iamVjdHxhcnNvcnR8YXNpbnxhc2luaHxhc29ydHxhc3NlcnR8YXNzZXJ0X29wdGlvbnN8YXRhbnxhdGFuMnxhdGFuaHxhdWRpb3Byb3BlcnRpZXN8YmFkZnVuY3Rpb25jYWxsZXhjZXB0aW9ufGJhZG1ldGhvZGNhbGxleGNlcHRpb258YmFzZTY0X2RlY29kZXxiYXNlNjRfZW5jb2RlfGJhc2VfY29udmVydHxiYXNlbmFtZXxiYmNvZGVfYWRkX2VsZW1lbnR8YmJjb2RlX2FkZF9zbWlsZXl8YmJjb2RlX2NyZWF0ZXxiYmNvZGVfZGVzdHJveXxiYmNvZGVfcGFyc2V8YmJjb2RlX3NldF9hcmdfcGFyc2VyfGJiY29kZV9zZXRfZmxhZ3N8YmNhZGR8YmNjb21wfGJjZGl2fGJjbW9kfGJjbXVsfGJjb21waWxlcl9sb2FkfGJjb21waWxlcl9sb2FkX2V4ZXxiY29tcGlsZXJfcGFyc2VfY2xhc3N8YmNvbXBpbGVyX3JlYWR8YmNvbXBpbGVyX3dyaXRlX2NsYXNzfGJjb21waWxlcl93cml0ZV9jb25zdGFudHxiY29tcGlsZXJfd3JpdGVfZXhlX2Zvb3RlcnxiY29tcGlsZXJfd3JpdGVfZmlsZXxiY29tcGlsZXJfd3JpdGVfZm9vdGVyfGJjb21waWxlcl93cml0ZV9mdW5jdGlvbnxiY29tcGlsZXJfd3JpdGVfZnVuY3Rpb25zX2Zyb21fZmlsZXxiY29tcGlsZXJfd3JpdGVfaGVhZGVyfGJjb21waWxlcl93cml0ZV9pbmNsdWRlZF9maWxlbmFtZXxiY3Bvd3xiY3Bvd21vZHxiY3NjYWxlfGJjc3FydHxiY3N1YnxiaW4yaGV4fGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0fGJpbmRlY3xiaW5kdGV4dGRvbWFpbnxic29uX2RlY29kZXxic29uX2VuY29kZXxidW1wVmFsdWV8YnpjbG9zZXxiemNvbXByZXNzfGJ6ZGVjb21wcmVzc3xiemVycm5vfGJ6ZXJyb3J8YnplcnJzdHJ8YnpmbHVzaHxiem9wZW58YnpyZWFkfGJ6d3JpdGV8Y2FjaGluZ2l0ZXJhdG9yfGNhaXJvfGNhaXJvX2NyZWF0ZXxjYWlyb19mb250X2ZhY2VfZ2V0X3R5cGV8Y2Fpcm9fZm9udF9mYWNlX3N0YXR1c3xjYWlyb19mb250X29wdGlvbnNfY3JlYXRlfGNhaXJvX2ZvbnRfb3B0aW9uc19lcXVhbHxjYWlyb19mb250X29wdGlvbnNfZ2V0X2FudGlhbGlhc3xjYWlyb19mb250X29wdGlvbnNfZ2V0X2hpbnRfbWV0cmljc3xjYWlyb19mb250X29wdGlvbnNfZ2V0X2hpbnRfc3R5bGV8Y2Fpcm9fZm9udF9vcHRpb25zX2dldF9zdWJwaXhlbF9vcmRlcnxjYWlyb19mb250X29wdGlvbnNfaGFzaHxjYWlyb19mb250X29wdGlvbnNfbWVyZ2V8Y2Fpcm9fZm9udF9vcHRpb25zX3NldF9hbnRpYWxpYXN8Y2Fpcm9fZm9udF9vcHRpb25zX3NldF9oaW50X21ldHJpY3N8Y2Fpcm9fZm9udF9vcHRpb25zX3NldF9oaW50X3N0eWxlfGNhaXJvX2ZvbnRfb3B0aW9uc19zZXRfc3VicGl4ZWxfb3JkZXJ8Y2Fpcm9fZm9udF9vcHRpb25zX3N0YXR1c3xjYWlyb19mb3JtYXRfc3RyaWRlX2Zvcl93aWR0aHxjYWlyb19pbWFnZV9zdXJmYWNlX2NyZWF0ZXxjYWlyb19pbWFnZV9zdXJmYWNlX2NyZWF0ZV9mb3JfZGF0YXxjYWlyb19pbWFnZV9zdXJmYWNlX2NyZWF0ZV9mcm9tX3BuZ3xjYWlyb19pbWFnZV9zdXJmYWNlX2dldF9kYXRhfGNhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0X2Zvcm1hdHxjYWlyb19pbWFnZV9zdXJmYWNlX2dldF9oZWlnaHR8Y2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfc3RyaWRlfGNhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0X3dpZHRofGNhaXJvX21hdHJpeF9jcmVhdGVfc2NhbGV8Y2Fpcm9fbWF0cml4X2NyZWF0ZV90cmFuc2xhdGV8Y2Fpcm9fbWF0cml4X2ludmVydHxjYWlyb19tYXRyaXhfbXVsdGlwbHl8Y2Fpcm9fbWF0cml4X3JvdGF0ZXxjYWlyb19tYXRyaXhfdHJhbnNmb3JtX2Rpc3RhbmNlfGNhaXJvX21hdHJpeF90cmFuc2Zvcm1fcG9pbnR8Y2Fpcm9fbWF0cml4X3RyYW5zbGF0ZXxjYWlyb19wYXR0ZXJuX2FkZF9jb2xvcl9zdG9wX3JnYnxjYWlyb19wYXR0ZXJuX2FkZF9jb2xvcl9zdG9wX3JnYmF8Y2Fpcm9fcGF0dGVybl9jcmVhdGVfZm9yX3N1cmZhY2V8Y2Fpcm9fcGF0dGVybl9jcmVhdGVfbGluZWFyfGNhaXJvX3BhdHRlcm5fY3JlYXRlX3JhZGlhbHxjYWlyb19wYXR0ZXJuX2NyZWF0ZV9yZ2J8Y2Fpcm9fcGF0dGVybl9jcmVhdGVfcmdiYXxjYWlyb19wYXR0ZXJuX2dldF9jb2xvcl9zdG9wX2NvdW50fGNhaXJvX3BhdHRlcm5fZ2V0X2NvbG9yX3N0b3BfcmdiYXxjYWlyb19wYXR0ZXJuX2dldF9leHRlbmR8Y2Fpcm9fcGF0dGVybl9nZXRfZmlsdGVyfGNhaXJvX3BhdHRlcm5fZ2V0X2xpbmVhcl9wb2ludHN8Y2Fpcm9fcGF0dGVybl9nZXRfbWF0cml4fGNhaXJvX3BhdHRlcm5fZ2V0X3JhZGlhbF9jaXJjbGVzfGNhaXJvX3BhdHRlcm5fZ2V0X3JnYmF8Y2Fpcm9fcGF0dGVybl9nZXRfc3VyZmFjZXxjYWlyb19wYXR0ZXJuX2dldF90eXBlfGNhaXJvX3BhdHRlcm5fc2V0X2V4dGVuZHxjYWlyb19wYXR0ZXJuX3NldF9maWx0ZXJ8Y2Fpcm9fcGF0dGVybl9zZXRfbWF0cml4fGNhaXJvX3BhdHRlcm5fc3RhdHVzfGNhaXJvX3BkZl9zdXJmYWNlX2NyZWF0ZXxjYWlyb19wZGZfc3VyZmFjZV9zZXRfc2l6ZXxjYWlyb19wc19nZXRfbGV2ZWxzfGNhaXJvX3BzX2xldmVsX3RvX3N0cmluZ3xjYWlyb19wc19zdXJmYWNlX2NyZWF0ZXxjYWlyb19wc19zdXJmYWNlX2RzY19iZWdpbl9wYWdlX3NldHVwfGNhaXJvX3BzX3N1cmZhY2VfZHNjX2JlZ2luX3NldHVwfGNhaXJvX3BzX3N1cmZhY2VfZHNjX2NvbW1lbnR8Y2Fpcm9fcHNfc3VyZmFjZV9nZXRfZXBzfGNhaXJvX3BzX3N1cmZhY2VfcmVzdHJpY3RfdG9fbGV2ZWx8Y2Fpcm9fcHNfc3VyZmFjZV9zZXRfZXBzfGNhaXJvX3BzX3N1cmZhY2Vfc2V0X3NpemV8Y2Fpcm9fc2NhbGVkX2ZvbnRfY3JlYXRlfGNhaXJvX3NjYWxlZF9mb250X2V4dGVudHN8Y2Fpcm9fc2NhbGVkX2ZvbnRfZ2V0X2N0bXxjYWlyb19zY2FsZWRfZm9udF9nZXRfZm9udF9mYWNlfGNhaXJvX3NjYWxlZF9mb250X2dldF9mb250X21hdHJpeHxjYWlyb19zY2FsZWRfZm9udF9nZXRfZm9udF9vcHRpb25zfGNhaXJvX3NjYWxlZF9mb250X2dldF9zY2FsZV9tYXRyaXh8Y2Fpcm9fc2NhbGVkX2ZvbnRfZ2V0X3R5cGV8Y2Fpcm9fc2NhbGVkX2ZvbnRfZ2x5cGhfZXh0ZW50c3xjYWlyb19zY2FsZWRfZm9udF9zdGF0dXN8Y2Fpcm9fc2NhbGVkX2ZvbnRfdGV4dF9leHRlbnRzfGNhaXJvX3N1cmZhY2VfY29weV9wYWdlfGNhaXJvX3N1cmZhY2VfY3JlYXRlX3NpbWlsYXJ8Y2Fpcm9fc3VyZmFjZV9maW5pc2h8Y2Fpcm9fc3VyZmFjZV9mbHVzaHxjYWlyb19zdXJmYWNlX2dldF9jb250ZW50fGNhaXJvX3N1cmZhY2VfZ2V0X2RldmljZV9vZmZzZXR8Y2Fpcm9fc3VyZmFjZV9nZXRfZm9udF9vcHRpb25zfGNhaXJvX3N1cmZhY2VfZ2V0X3R5cGV8Y2Fpcm9fc3VyZmFjZV9tYXJrX2RpcnR5fGNhaXJvX3N1cmZhY2VfbWFya19kaXJ0eV9yZWN0YW5nbGV8Y2Fpcm9fc3VyZmFjZV9zZXRfZGV2aWNlX29mZnNldHxjYWlyb19zdXJmYWNlX3NldF9mYWxsYmFja19yZXNvbHV0aW9ufGNhaXJvX3N1cmZhY2Vfc2hvd19wYWdlfGNhaXJvX3N1cmZhY2Vfc3RhdHVzfGNhaXJvX3N1cmZhY2Vfd3JpdGVfdG9fcG5nfGNhaXJvX3N2Z19zdXJmYWNlX2NyZWF0ZXxjYWlyb19zdmdfc3VyZmFjZV9yZXN0cmljdF90b192ZXJzaW9ufGNhaXJvX3N2Z192ZXJzaW9uX3RvX3N0cmluZ3xjYWlyb2FudGlhbGlhc3xjYWlyb2NvbnRlbnR8Y2Fpcm9jb250ZXh0fGNhaXJvZXhjZXB0aW9ufGNhaXJvZXh0ZW5kfGNhaXJvZmlsbHJ1bGV8Y2Fpcm9maWx0ZXJ8Y2Fpcm9mb250ZmFjZXxjYWlyb2ZvbnRvcHRpb25zfGNhaXJvZm9udHNsYW50fGNhaXJvZm9udHR5cGV8Y2Fpcm9mb250d2VpZ2h0fGNhaXJvZm9ybWF0fGNhaXJvZ3JhZGllbnRwYXR0ZXJufGNhaXJvaGludG1ldHJpY3N8Y2Fpcm9oaW50c3R5bGV8Y2Fpcm9pbWFnZXN1cmZhY2V8Y2Fpcm9saW5lYXJncmFkaWVudHxjYWlyb2xpbmVjYXB8Y2Fpcm9saW5lam9pbnxjYWlyb21hdHJpeHxjYWlyb29wZXJhdG9yfGNhaXJvcGF0aHxjYWlyb3BhdHRlcm58Y2Fpcm9wYXR0ZXJudHlwZXxjYWlyb3BkZnN1cmZhY2V8Y2Fpcm9wc2xldmVsfGNhaXJvcHNzdXJmYWNlfGNhaXJvcmFkaWFsZ3JhZGllbnR8Y2Fpcm9zY2FsZWRmb250fGNhaXJvc29saWRwYXR0ZXJufGNhaXJvc3RhdHVzfGNhaXJvc3VicGl4ZWxvcmRlcnxjYWlyb3N1cmZhY2V8Y2Fpcm9zdXJmYWNlcGF0dGVybnxjYWlyb3N1cmZhY2V0eXBlfGNhaXJvc3Znc3VyZmFjZXxjYWlyb3N2Z3ZlcnNpb258Y2Fpcm90b3lmb250ZmFjZXxjYWxfZGF5c19pbl9tb250aHxjYWxfZnJvbV9qZHxjYWxfaW5mb3xjYWxfdG9famR8Y2FsY3VsX2htYWN8Y2FsY3VsaG1hY3xjYWxsX3VzZXJfZnVuY3xjYWxsX3VzZXJfZnVuY19hcnJheXxjYWxsX3VzZXJfbWV0aG9kfGNhbGxfdXNlcl9tZXRob2RfYXJyYXl8Y2FsbGJhY2tmaWx0ZXJpdGVyYXRvcnxjZWlsfGNoZGJ8Y2hkYl9jcmVhdGV8Y2hkaXJ8Y2hlY2tkYXRlfGNoZWNrZG5zcnJ8Y2hncnB8Y2htb2R8Y2hvcHxjaG93bnxjaHJ8Y2hyb290fGNodW5rX3NwbGl0fGNsYXNzX2FsaWFzfGNsYXNzX2V4aXN0c3xjbGFzc19pbXBsZW1lbnRzfGNsYXNzX3BhcmVudHN8Y2xhc3NraXRfaW1wb3J0fGNsYXNza2l0X21ldGhvZF9hZGR8Y2xhc3NraXRfbWV0aG9kX2NvcHl8Y2xhc3NraXRfbWV0aG9kX3JlZGVmaW5lfGNsYXNza2l0X21ldGhvZF9yZW1vdmV8Y2xhc3NraXRfbWV0aG9kX3JlbmFtZXxjbGVhcnN0YXRjYWNoZXxjbG9uZXxjbG9zZWRpcnxjbG9zZWxvZ3xjb2xsYXRvcnxjb218Y29tX2FkZHJlZnxjb21fY3JlYXRlX2d1aWR8Y29tX2V2ZW50X3Npbmt8Y29tX2dldHxjb21fZ2V0X2FjdGl2ZV9vYmplY3R8Y29tX2ludm9rZXxjb21faXNlbnVtfGNvbV9sb2FkfGNvbV9sb2FkX3R5cGVsaWJ8Y29tX21lc3NhZ2VfcHVtcHxjb21fcHJpbnRfdHlwZWluZm98Y29tX3Byb3BnZXR8Y29tX3Byb3BwdXR8Y29tX3Byb3BzZXR8Y29tX3JlbGVhc2V8Y29tX3NldHxjb21wYWN0fGNvbm5lY3Rpb25fYWJvcnRlZHxjb25uZWN0aW9uX3N0YXR1c3xjb25uZWN0aW9uX3RpbWVvdXR8Y29uc3RhbnR8Y29uc3RydWN0fGNvbnN0cnVjdHxjb25zdHJ1Y3R8Y29udmVydF9jeXJfc3RyaW5nfGNvbnZlcnRfdXVkZWNvZGV8Y29udmVydF91dWVuY29kZXxjb3B5fGNvc3xjb3NofGNvdW50fGNvdW50X2NoYXJzfGNvdW50YWJsZXxjb3VudGVyX2J1bXB8Y291bnRlcl9idW1wX3ZhbHVlfGNvdW50ZXJfY3JlYXRlfGNvdW50ZXJfZ2V0fGNvdW50ZXJfZ2V0X21ldGF8Y291bnRlcl9nZXRfbmFtZWR8Y291bnRlcl9nZXRfdmFsdWV8Y291bnRlcl9yZXNldHxjb3VudGVyX3Jlc2V0X3ZhbHVlfGNyYWNrX2NoZWNrfGNyYWNrX2Nsb3NlZGljdHxjcmFja19nZXRsYXN0bWVzc2FnZXxjcmFja19vcGVuZGljdHxjcmMzMnxjcmVhdGVfZnVuY3Rpb258Y3J5cHR8Y3R5cGVfYWxudW18Y3R5cGVfYWxwaGF8Y3R5cGVfY250cmx8Y3R5cGVfZGlnaXR8Y3R5cGVfZ3JhcGh8Y3R5cGVfbG93ZXJ8Y3R5cGVfcHJpbnR8Y3R5cGVfcHVuY3R8Y3R5cGVfc3BhY2V8Y3R5cGVfdXBwZXJ8Y3R5cGVfeGRpZ2l0fGN1YnJpZF9hZmZlY3RlZF9yb3dzfGN1YnJpZF9iaW5kfGN1YnJpZF9jbGllbnRfZW5jb2Rpbmd8Y3VicmlkX2Nsb3NlfGN1YnJpZF9jbG9zZV9wcmVwYXJlfGN1YnJpZF9jbG9zZV9yZXF1ZXN0fGN1YnJpZF9jb2xfZ2V0fGN1YnJpZF9jb2xfc2l6ZXxjdWJyaWRfY29sdW1uX25hbWVzfGN1YnJpZF9jb2x1bW5fdHlwZXN8Y3VicmlkX2NvbW1pdHxjdWJyaWRfY29ubmVjdHxjdWJyaWRfY29ubmVjdF93aXRoX3VybHxjdWJyaWRfY3VycmVudF9vaWR8Y3VicmlkX2RhdGFfc2Vla3xjdWJyaWRfZGJfbmFtZXxjdWJyaWRfZGlzY29ubmVjdHxjdWJyaWRfZHJvcHxjdWJyaWRfZXJybm98Y3VicmlkX2Vycm9yfGN1YnJpZF9lcnJvcl9jb2RlfGN1YnJpZF9lcnJvcl9jb2RlX2ZhY2lsaXR5fGN1YnJpZF9lcnJvcl9tc2d8Y3VicmlkX2V4ZWN1dGV8Y3VicmlkX2ZldGNofGN1YnJpZF9mZXRjaF9hcnJheXxjdWJyaWRfZmV0Y2hfYXNzb2N8Y3VicmlkX2ZldGNoX2ZpZWxkfGN1YnJpZF9mZXRjaF9sZW5ndGhzfGN1YnJpZF9mZXRjaF9vYmplY3R8Y3VicmlkX2ZldGNoX3Jvd3xjdWJyaWRfZmllbGRfZmxhZ3N8Y3VicmlkX2ZpZWxkX2xlbnxjdWJyaWRfZmllbGRfbmFtZXxjdWJyaWRfZmllbGRfc2Vla3xjdWJyaWRfZmllbGRfdGFibGV8Y3VicmlkX2ZpZWxkX3R5cGV8Y3VicmlkX2ZyZWVfcmVzdWx0fGN1YnJpZF9nZXR8Y3VicmlkX2dldF9hdXRvY29tbWl0fGN1YnJpZF9nZXRfY2hhcnNldHxjdWJyaWRfZ2V0X2NsYXNzX25hbWV8Y3VicmlkX2dldF9jbGllbnRfaW5mb3xjdWJyaWRfZ2V0X2RiX3BhcmFtZXRlcnxjdWJyaWRfZ2V0X3NlcnZlcl9pbmZvfGN1YnJpZF9pbnNlcnRfaWR8Y3VicmlkX2lzX2luc3RhbmNlfGN1YnJpZF9saXN0X2Ric3xjdWJyaWRfbG9hZF9mcm9tX2dsb3xjdWJyaWRfbG9iX2Nsb3NlfGN1YnJpZF9sb2JfZXhwb3J0fGN1YnJpZF9sb2JfZ2V0fGN1YnJpZF9sb2Jfc2VuZHxjdWJyaWRfbG9iX3NpemV8Y3VicmlkX2xvY2tfcmVhZHxjdWJyaWRfbG9ja193cml0ZXxjdWJyaWRfbW92ZV9jdXJzb3J8Y3VicmlkX25ld19nbG98Y3VicmlkX25leHRfcmVzdWx0fGN1YnJpZF9udW1fY29sc3xjdWJyaWRfbnVtX2ZpZWxkc3xjdWJyaWRfbnVtX3Jvd3N8Y3VicmlkX3Bpbmd8Y3VicmlkX3ByZXBhcmV8Y3VicmlkX3B1dHxjdWJyaWRfcXVlcnl8Y3VicmlkX3JlYWxfZXNjYXBlX3N0cmluZ3xjdWJyaWRfcmVzdWx0fGN1YnJpZF9yb2xsYmFja3xjdWJyaWRfc2F2ZV90b19nbG98Y3VicmlkX3NjaGVtYXxjdWJyaWRfc2VuZF9nbG98Y3VicmlkX3NlcV9kcm9wfGN1YnJpZF9zZXFfaW5zZXJ0fGN1YnJpZF9zZXFfcHV0fGN1YnJpZF9zZXRfYWRkfGN1YnJpZF9zZXRfYXV0b2NvbW1pdHxjdWJyaWRfc2V0X2RiX3BhcmFtZXRlcnxjdWJyaWRfc2V0X2Ryb3B8Y3VicmlkX3VuYnVmZmVyZWRfcXVlcnl8Y3VicmlkX3ZlcnNpb258Y3VybF9jbG9zZXxjdXJsX2NvcHlfaGFuZGxlfGN1cmxfZXJybm98Y3VybF9lcnJvcnxjdXJsX2V4ZWN8Y3VybF9nZXRpbmZvfGN1cmxfaW5pdHxjdXJsX211bHRpX2FkZF9oYW5kbGV8Y3VybF9tdWx0aV9jbG9zZXxjdXJsX211bHRpX2V4ZWN8Y3VybF9tdWx0aV9nZXRjb250ZW50fGN1cmxfbXVsdGlfaW5mb19yZWFkfGN1cmxfbXVsdGlfaW5pdHxjdXJsX211bHRpX3JlbW92ZV9oYW5kbGV8Y3VybF9tdWx0aV9zZWxlY3R8Y3VybF9zZXRvcHR8Y3VybF9zZXRvcHRfYXJyYXl8Y3VybF92ZXJzaW9ufGN1cnJlbnR8Y3lydXNfYXV0aGVudGljYXRlfGN5cnVzX2JpbmR8Y3lydXNfY2xvc2V8Y3lydXNfY29ubmVjdHxjeXJ1c19xdWVyeXxjeXJ1c191bmJpbmR8ZGF0ZXxkYXRlX2FkZHxkYXRlX2NyZWF0ZXxkYXRlX2NyZWF0ZV9mcm9tX2Zvcm1hdHxkYXRlX2RhdGVfc2V0fGRhdGVfZGVmYXVsdF90aW1lem9uZV9nZXR8ZGF0ZV9kZWZhdWx0X3RpbWV6b25lX3NldHxkYXRlX2RpZmZ8ZGF0ZV9mb3JtYXR8ZGF0ZV9nZXRfbGFzdF9lcnJvcnN8ZGF0ZV9pbnRlcnZhbF9jcmVhdGVfZnJvbV9kYXRlX3N0cmluZ3xkYXRlX2ludGVydmFsX2Zvcm1hdHxkYXRlX2lzb2RhdGVfc2V0fGRhdGVfbW9kaWZ5fGRhdGVfb2Zmc2V0X2dldHxkYXRlX3BhcnNlfGRhdGVfcGFyc2VfZnJvbV9mb3JtYXR8ZGF0ZV9zdWJ8ZGF0ZV9zdW5faW5mb3xkYXRlX3N1bnJpc2V8ZGF0ZV9zdW5zZXR8ZGF0ZV90aW1lX3NldHxkYXRlX3RpbWVzdGFtcF9nZXR8ZGF0ZV90aW1lc3RhbXBfc2V0fGRhdGVfdGltZXpvbmVfZ2V0fGRhdGVfdGltZXpvbmVfc2V0fGRhdGVpbnRlcnZhbHxkYXRlcGVyaW9kfGRhdGV0aW1lfGRhdGV0aW1lem9uZXxkYjJfYXV0b2NvbW1pdHxkYjJfYmluZF9wYXJhbXxkYjJfY2xpZW50X2luZm98ZGIyX2Nsb3NlfGRiMl9jb2x1bW5fcHJpdmlsZWdlc3xkYjJfY29sdW1uc3xkYjJfY29tbWl0fGRiMl9jb25uX2Vycm9yfGRiMl9jb25uX2Vycm9ybXNnfGRiMl9jb25uZWN0fGRiMl9jdXJzb3JfdHlwZXxkYjJfZXNjYXBlX3N0cmluZ3xkYjJfZXhlY3xkYjJfZXhlY3V0ZXxkYjJfZmV0Y2hfYXJyYXl8ZGIyX2ZldGNoX2Fzc29jfGRiMl9mZXRjaF9ib3RofGRiMl9mZXRjaF9vYmplY3R8ZGIyX2ZldGNoX3Jvd3xkYjJfZmllbGRfZGlzcGxheV9zaXplfGRiMl9maWVsZF9uYW1lfGRiMl9maWVsZF9udW18ZGIyX2ZpZWxkX3ByZWNpc2lvbnxkYjJfZmllbGRfc2NhbGV8ZGIyX2ZpZWxkX3R5cGV8ZGIyX2ZpZWxkX3dpZHRofGRiMl9mb3JlaWduX2tleXN8ZGIyX2ZyZWVfcmVzdWx0fGRiMl9mcmVlX3N0bXR8ZGIyX2dldF9vcHRpb258ZGIyX2xhc3RfaW5zZXJ0X2lkfGRiMl9sb2JfcmVhZHxkYjJfbmV4dF9yZXN1bHR8ZGIyX251bV9maWVsZHN8ZGIyX251bV9yb3dzfGRiMl9wY2xvc2V8ZGIyX3Bjb25uZWN0fGRiMl9wcmVwYXJlfGRiMl9wcmltYXJ5X2tleXN8ZGIyX3Byb2NlZHVyZV9jb2x1bW5zfGRiMl9wcm9jZWR1cmVzfGRiMl9yZXN1bHR8ZGIyX3JvbGxiYWNrfGRiMl9zZXJ2ZXJfaW5mb3xkYjJfc2V0X29wdGlvbnxkYjJfc3BlY2lhbF9jb2x1bW5zfGRiMl9zdGF0aXN0aWNzfGRiMl9zdG10X2Vycm9yfGRiMl9zdG10X2Vycm9ybXNnfGRiMl90YWJsZV9wcml2aWxlZ2VzfGRiMl90YWJsZXN8ZGJhX2Nsb3NlfGRiYV9kZWxldGV8ZGJhX2V4aXN0c3xkYmFfZmV0Y2h8ZGJhX2ZpcnN0a2V5fGRiYV9oYW5kbGVyc3xkYmFfaW5zZXJ0fGRiYV9rZXlfc3BsaXR8ZGJhX2xpc3R8ZGJhX25leHRrZXl8ZGJhX29wZW58ZGJhX29wdGltaXplfGRiYV9wb3BlbnxkYmFfcmVwbGFjZXxkYmFfc3luY3xkYmFzZV9hZGRfcmVjb3JkfGRiYXNlX2Nsb3NlfGRiYXNlX2NyZWF0ZXxkYmFzZV9kZWxldGVfcmVjb3JkfGRiYXNlX2dldF9oZWFkZXJfaW5mb3xkYmFzZV9nZXRfcmVjb3JkfGRiYXNlX2dldF9yZWNvcmRfd2l0aF9uYW1lc3xkYmFzZV9udW1maWVsZHN8ZGJhc2VfbnVtcmVjb3Jkc3xkYmFzZV9vcGVufGRiYXNlX3BhY2t8ZGJhc2VfcmVwbGFjZV9yZWNvcmR8ZGJwbHVzX2FkZHxkYnBsdXNfYXFsfGRicGx1c19jaGRpcnxkYnBsdXNfY2xvc2V8ZGJwbHVzX2N1cnJ8ZGJwbHVzX2VycmNvZGV8ZGJwbHVzX2Vycm5vfGRicGx1c19maW5kfGRicGx1c19maXJzdHxkYnBsdXNfZmx1c2h8ZGJwbHVzX2ZyZWVhbGxsb2Nrc3xkYnBsdXNfZnJlZWxvY2t8ZGJwbHVzX2ZyZWVybG9ja3N8ZGJwbHVzX2dldGxvY2t8ZGJwbHVzX2dldHVuaXF1ZXxkYnBsdXNfaW5mb3xkYnBsdXNfbGFzdHxkYnBsdXNfbG9ja3JlbHxkYnBsdXNfbmV4dHxkYnBsdXNfb3BlbnxkYnBsdXNfcHJldnxkYnBsdXNfcmNocGVybXxkYnBsdXNfcmNyZWF0ZXxkYnBsdXNfcmNydGV4YWN0fGRicGx1c19yY3J0bGlrZXxkYnBsdXNfcmVzb2x2ZXxkYnBsdXNfcmVzdG9yZXBvc3xkYnBsdXNfcmtleXN8ZGJwbHVzX3JvcGVufGRicGx1c19ycXVlcnl8ZGJwbHVzX3JyZW5hbWV8ZGJwbHVzX3JzZWNpbmRleHxkYnBsdXNfcnVubGlua3xkYnBsdXNfcnphcHxkYnBsdXNfc2F2ZXBvc3xkYnBsdXNfc2V0aW5kZXh8ZGJwbHVzX3NldGluZGV4YnludW1iZXJ8ZGJwbHVzX3NxbHxkYnBsdXNfdGNsfGRicGx1c190cmVtb3ZlfGRicGx1c191bmRvfGRicGx1c191bmRvcHJlcGFyZXxkYnBsdXNfdW5sb2NrcmVsfGRicGx1c191bnNlbGVjdHxkYnBsdXNfdXBkYXRlfGRicGx1c194bG9ja3JlbHxkYnBsdXNfeHVubG9ja3JlbHxkYnhfY2xvc2V8ZGJ4X2NvbXBhcmV8ZGJ4X2Nvbm5lY3R8ZGJ4X2Vycm9yfGRieF9lc2NhcGVfc3RyaW5nfGRieF9mZXRjaF9yb3d8ZGJ4X3F1ZXJ5fGRieF9zb3J0fGRjZ2V0dGV4dHxkY25nZXR0ZXh0fGRlYWdncmVnYXRlfGRlYnVnX2JhY2t0cmFjZXxkZWJ1Z19wcmludF9iYWNrdHJhY2V8ZGVidWdfenZhbF9kdW1wfGRlY2JpbnxkZWNoZXh8ZGVjb2N0fGRlZmluZXxkZWZpbmVfc3lzbG9nX3ZhcmlhYmxlc3xkZWZpbmVkfGRlZzJyYWR8ZGVsZXRlfGRnZXR0ZXh0fGRpZXxkaW9fY2xvc2V8ZGlvX2ZjbnRsfGRpb19vcGVufGRpb19yZWFkfGRpb19zZWVrfGRpb19zdGF0fGRpb190Y3NldGF0dHJ8ZGlvX3RydW5jYXRlfGRpb193cml0ZXxkaXJ8ZGlyZWN0b3J5aXRlcmF0b3J8ZGlybmFtZXxkaXNrX2ZyZWVfc3BhY2V8ZGlza190b3RhbF9zcGFjZXxkaXNrZnJlZXNwYWNlfGRsfGRuZ2V0dGV4dHxkbnNfY2hlY2tfcmVjb3JkfGRuc19nZXRfbXh8ZG5zX2dldF9yZWNvcmR8ZG9tX2ltcG9ydF9zaW1wbGV4bWx8ZG9tYWluZXhjZXB0aW9ufGRvbWF0dHJ8ZG9tYXR0cmlidXRlX25hbWV8ZG9tYXR0cmlidXRlX3NldF92YWx1ZXxkb21hdHRyaWJ1dGVfc3BlY2lmaWVkfGRvbWF0dHJpYnV0ZV92YWx1ZXxkb21jaGFyYWN0ZXJkYXRhfGRvbWNvbW1lbnR8ZG9tZG9jdW1lbnR8ZG9tZG9jdW1lbnRfYWRkX3Jvb3R8ZG9tZG9jdW1lbnRfY3JlYXRlX2F0dHJpYnV0ZXxkb21kb2N1bWVudF9jcmVhdGVfY2RhdGFfc2VjdGlvbnxkb21kb2N1bWVudF9jcmVhdGVfY29tbWVudHxkb21kb2N1bWVudF9jcmVhdGVfZWxlbWVudHxkb21kb2N1bWVudF9jcmVhdGVfZWxlbWVudF9uc3xkb21kb2N1bWVudF9jcmVhdGVfZW50aXR5X3JlZmVyZW5jZXxkb21kb2N1bWVudF9jcmVhdGVfcHJvY2Vzc2luZ19pbnN0cnVjdGlvbnxkb21kb2N1bWVudF9jcmVhdGVfdGV4dF9ub2RlfGRvbWRvY3VtZW50X2RvY3R5cGV8ZG9tZG9jdW1lbnRfZG9jdW1lbnRfZWxlbWVudHxkb21kb2N1bWVudF9kdW1wX2ZpbGV8ZG9tZG9jdW1lbnRfZHVtcF9tZW18ZG9tZG9jdW1lbnRfZ2V0X2VsZW1lbnRfYnlfaWR8ZG9tZG9jdW1lbnRfZ2V0X2VsZW1lbnRzX2J5X3RhZ25hbWV8ZG9tZG9jdW1lbnRfaHRtbF9kdW1wX21lbXxkb21kb2N1bWVudF94aW5jbHVkZXxkb21kb2N1bWVudGZyYWdtZW50fGRvbWRvY3VtZW50dHlwZXxkb21kb2N1bWVudHR5cGVfZW50aXRpZXN8ZG9tZG9jdW1lbnR0eXBlX2ludGVybmFsX3N1YnNldHxkb21kb2N1bWVudHR5cGVfbmFtZXxkb21kb2N1bWVudHR5cGVfbm90YXRpb25zfGRvbWRvY3VtZW50dHlwZV9wdWJsaWNfaWR8ZG9tZG9jdW1lbnR0eXBlX3N5c3RlbV9pZHxkb21lbGVtZW50fGRvbWVsZW1lbnRfZ2V0X2F0dHJpYnV0ZXxkb21lbGVtZW50X2dldF9hdHRyaWJ1dGVfbm9kZXxkb21lbGVtZW50X2dldF9lbGVtZW50c19ieV90YWduYW1lfGRvbWVsZW1lbnRfaGFzX2F0dHJpYnV0ZXxkb21lbGVtZW50X3JlbW92ZV9hdHRyaWJ1dGV8ZG9tZWxlbWVudF9zZXRfYXR0cmlidXRlfGRvbWVsZW1lbnRfc2V0X2F0dHJpYnV0ZV9ub2RlfGRvbWVsZW1lbnRfdGFnbmFtZXxkb21lbnRpdHl8ZG9tZW50aXR5cmVmZXJlbmNlfGRvbWV4Y2VwdGlvbnxkb21pbXBsZW1lbnRhdGlvbnxkb21uYW1lZG5vZGVtYXB8ZG9tbm9kZXxkb21ub2RlX2FkZF9uYW1lc3BhY2V8ZG9tbm9kZV9hcHBlbmRfY2hpbGR8ZG9tbm9kZV9hcHBlbmRfc2libGluZ3xkb21ub2RlX2F0dHJpYnV0ZXN8ZG9tbm9kZV9jaGlsZF9ub2Rlc3xkb21ub2RlX2Nsb25lX25vZGV8ZG9tbm9kZV9kdW1wX25vZGV8ZG9tbm9kZV9maXJzdF9jaGlsZHxkb21ub2RlX2dldF9jb250ZW50fGRvbW5vZGVfaGFzX2F0dHJpYnV0ZXN8ZG9tbm9kZV9oYXNfY2hpbGRfbm9kZXN8ZG9tbm9kZV9pbnNlcnRfYmVmb3JlfGRvbW5vZGVfaXNfYmxhbmtfbm9kZXxkb21ub2RlX2xhc3RfY2hpbGR8ZG9tbm9kZV9uZXh0X3NpYmxpbmd8ZG9tbm9kZV9ub2RlX25hbWV8ZG9tbm9kZV9ub2RlX3R5cGV8ZG9tbm9kZV9ub2RlX3ZhbHVlfGRvbW5vZGVfb3duZXJfZG9jdW1lbnR8ZG9tbm9kZV9wYXJlbnRfbm9kZXxkb21ub2RlX3ByZWZpeHxkb21ub2RlX3ByZXZpb3VzX3NpYmxpbmd8ZG9tbm9kZV9yZW1vdmVfY2hpbGR8ZG9tbm9kZV9yZXBsYWNlX2NoaWxkfGRvbW5vZGVfcmVwbGFjZV9ub2RlfGRvbW5vZGVfc2V0X2NvbnRlbnR8ZG9tbm9kZV9zZXRfbmFtZXxkb21ub2RlX3NldF9uYW1lc3BhY2V8ZG9tbm9kZV91bmxpbmtfbm9kZXxkb21ub2RlbGlzdHxkb21ub3RhdGlvbnxkb21wcm9jZXNzaW5naW5zdHJ1Y3Rpb258ZG9tcHJvY2Vzc2luZ2luc3RydWN0aW9uX2RhdGF8ZG9tcHJvY2Vzc2luZ2luc3RydWN0aW9uX3RhcmdldHxkb210ZXh0fGRvbXhtbF9uZXdfZG9jfGRvbXhtbF9vcGVuX2ZpbGV8ZG9teG1sX29wZW5fbWVtfGRvbXhtbF92ZXJzaW9ufGRvbXhtbF94bWx0cmVlfGRvbXhtbF94c2x0X3N0eWxlc2hlZXR8ZG9teG1sX3hzbHRfc3R5bGVzaGVldF9kb2N8ZG9teG1sX3hzbHRfc3R5bGVzaGVldF9maWxlfGRvbXhtbF94c2x0X3ZlcnNpb258ZG9teHBhdGh8ZG9teHNsdHN0eWxlc2hlZXRfcHJvY2Vzc3xkb214c2x0c3R5bGVzaGVldF9yZXN1bHRfZHVtcF9maWxlfGRvbXhzbHRzdHlsZXNoZWV0X3Jlc3VsdF9kdW1wX21lbXxkb3RuZXR8ZG90bmV0X2xvYWR8ZG91YmxldmFsfGVhY2h8ZWFzdGVyX2RhdGV8ZWFzdGVyX2RheXN8ZWNob3xlbXB0eXxlbXB0eWl0ZXJhdG9yfGVuY2hhbnRfYnJva2VyX2Rlc2NyaWJlfGVuY2hhbnRfYnJva2VyX2RpY3RfZXhpc3RzfGVuY2hhbnRfYnJva2VyX2ZyZWV8ZW5jaGFudF9icm9rZXJfZnJlZV9kaWN0fGVuY2hhbnRfYnJva2VyX2dldF9lcnJvcnxlbmNoYW50X2Jyb2tlcl9pbml0fGVuY2hhbnRfYnJva2VyX2xpc3RfZGljdHN8ZW5jaGFudF9icm9rZXJfcmVxdWVzdF9kaWN0fGVuY2hhbnRfYnJva2VyX3JlcXVlc3RfcHdsX2RpY3R8ZW5jaGFudF9icm9rZXJfc2V0X29yZGVyaW5nfGVuY2hhbnRfZGljdF9hZGRfdG9fcGVyc29uYWx8ZW5jaGFudF9kaWN0X2FkZF90b19zZXNzaW9ufGVuY2hhbnRfZGljdF9jaGVja3xlbmNoYW50X2RpY3RfZGVzY3JpYmV8ZW5jaGFudF9kaWN0X2dldF9lcnJvcnxlbmNoYW50X2RpY3RfaXNfaW5fc2Vzc2lvbnxlbmNoYW50X2RpY3RfcXVpY2tfY2hlY2t8ZW5jaGFudF9kaWN0X3N0b3JlX3JlcGxhY2VtZW50fGVuY2hhbnRfZGljdF9zdWdnZXN0fGVuZHxlcmVnfGVyZWdfcmVwbGFjZXxlcmVnaXxlcmVnaV9yZXBsYWNlfGVycm9yX2dldF9sYXN0fGVycm9yX2xvZ3xlcnJvcl9yZXBvcnRpbmd8ZXJyb3JleGNlcHRpb258ZXNjYXBlc2hlbGxhcmd8ZXNjYXBlc2hlbGxjbWR8ZXZhbHxldmVudF9hZGR8ZXZlbnRfYmFzZV9mcmVlfGV2ZW50X2Jhc2VfbG9vcHxldmVudF9iYXNlX2xvb3BicmVha3xldmVudF9iYXNlX2xvb3BleGl0fGV2ZW50X2Jhc2VfbmV3fGV2ZW50X2Jhc2VfcHJpb3JpdHlfaW5pdHxldmVudF9iYXNlX3NldHxldmVudF9idWZmZXJfYmFzZV9zZXR8ZXZlbnRfYnVmZmVyX2Rpc2FibGV8ZXZlbnRfYnVmZmVyX2VuYWJsZXxldmVudF9idWZmZXJfZmRfc2V0fGV2ZW50X2J1ZmZlcl9mcmVlfGV2ZW50X2J1ZmZlcl9uZXd8ZXZlbnRfYnVmZmVyX3ByaW9yaXR5X3NldHxldmVudF9idWZmZXJfcmVhZHxldmVudF9idWZmZXJfc2V0X2NhbGxiYWNrfGV2ZW50X2J1ZmZlcl90aW1lb3V0X3NldHxldmVudF9idWZmZXJfd2F0ZXJtYXJrX3NldHxldmVudF9idWZmZXJfd3JpdGV8ZXZlbnRfZGVsfGV2ZW50X2ZyZWV8ZXZlbnRfbmV3fGV2ZW50X3NldHxleGNlcHRpb258ZXhlY3xleGlmX2ltYWdldHlwZXxleGlmX3JlYWRfZGF0YXxleGlmX3RhZ25hbWV8ZXhpZl90aHVtYm5haWx8ZXhpdHxleHB8ZXhwZWN0X2V4cGVjdGx8ZXhwZWN0X3BvcGVufGV4cGxvZGV8ZXhwbTF8ZXhwb3J0fGV4cG9ydHxleHRlbnNpb25fbG9hZGVkfGV4dHJhY3R8ZXptbG1faGFzaHxmYW1fY2FuY2VsX21vbml0b3J8ZmFtX2Nsb3NlfGZhbV9tb25pdG9yX2NvbGxlY3Rpb258ZmFtX21vbml0b3JfZGlyZWN0b3J5fGZhbV9tb25pdG9yX2ZpbGV8ZmFtX25leHRfZXZlbnR8ZmFtX29wZW58ZmFtX3BlbmRpbmd8ZmFtX3Jlc3VtZV9tb25pdG9yfGZhbV9zdXNwZW5kX21vbml0b3J8ZmJzcWxfYWZmZWN0ZWRfcm93c3xmYnNxbF9hdXRvY29tbWl0fGZic3FsX2Jsb2Jfc2l6ZXxmYnNxbF9jaGFuZ2VfdXNlcnxmYnNxbF9jbG9iX3NpemV8ZmJzcWxfY2xvc2V8ZmJzcWxfY29tbWl0fGZic3FsX2Nvbm5lY3R8ZmJzcWxfY3JlYXRlX2Jsb2J8ZmJzcWxfY3JlYXRlX2Nsb2J8ZmJzcWxfY3JlYXRlX2RifGZic3FsX2RhdGFfc2Vla3xmYnNxbF9kYXRhYmFzZXxmYnNxbF9kYXRhYmFzZV9wYXNzd29yZHxmYnNxbF9kYl9xdWVyeXxmYnNxbF9kYl9zdGF0dXN8ZmJzcWxfZHJvcF9kYnxmYnNxbF9lcnJub3xmYnNxbF9lcnJvcnxmYnNxbF9mZXRjaF9hcnJheXxmYnNxbF9mZXRjaF9hc3NvY3xmYnNxbF9mZXRjaF9maWVsZHxmYnNxbF9mZXRjaF9sZW5ndGhzfGZic3FsX2ZldGNoX29iamVjdHxmYnNxbF9mZXRjaF9yb3d8ZmJzcWxfZmllbGRfZmxhZ3N8ZmJzcWxfZmllbGRfbGVufGZic3FsX2ZpZWxkX25hbWV8ZmJzcWxfZmllbGRfc2Vla3xmYnNxbF9maWVsZF90YWJsZXxmYnNxbF9maWVsZF90eXBlfGZic3FsX2ZyZWVfcmVzdWx0fGZic3FsX2dldF9hdXRvc3RhcnRfaW5mb3xmYnNxbF9ob3N0bmFtZXxmYnNxbF9pbnNlcnRfaWR8ZmJzcWxfbGlzdF9kYnN8ZmJzcWxfbGlzdF9maWVsZHN8ZmJzcWxfbGlzdF90YWJsZXN8ZmJzcWxfbmV4dF9yZXN1bHR8ZmJzcWxfbnVtX2ZpZWxkc3xmYnNxbF9udW1fcm93c3xmYnNxbF9wYXNzd29yZHxmYnNxbF9wY29ubmVjdHxmYnNxbF9xdWVyeXxmYnNxbF9yZWFkX2Jsb2J8ZmJzcWxfcmVhZF9jbG9ifGZic3FsX3Jlc3VsdHxmYnNxbF9yb2xsYmFja3xmYnNxbF9yb3dzX2ZldGNoZWR8ZmJzcWxfc2VsZWN0X2RifGZic3FsX3NldF9jaGFyYWN0ZXJzZXR8ZmJzcWxfc2V0X2xvYl9tb2RlfGZic3FsX3NldF9wYXNzd29yZHxmYnNxbF9zZXRfdHJhbnNhY3Rpb258ZmJzcWxfc3RhcnRfZGJ8ZmJzcWxfc3RvcF9kYnxmYnNxbF90YWJsZV9uYW1lfGZic3FsX3RhYmxlbmFtZXxmYnNxbF91c2VybmFtZXxmYnNxbF93YXJuaW5nc3xmY2xvc2V8ZmRmX2FkZF9kb2NfamF2YXNjcmlwdHxmZGZfYWRkX3RlbXBsYXRlfGZkZl9jbG9zZXxmZGZfY3JlYXRlfGZkZl9lbnVtX3ZhbHVlc3xmZGZfZXJybm98ZmRmX2Vycm9yfGZkZl9nZXRfYXB8ZmRmX2dldF9hdHRhY2htZW50fGZkZl9nZXRfZW5jb2Rpbmd8ZmRmX2dldF9maWxlfGZkZl9nZXRfZmxhZ3N8ZmRmX2dldF9vcHR8ZmRmX2dldF9zdGF0dXN8ZmRmX2dldF92YWx1ZXxmZGZfZ2V0X3ZlcnNpb258ZmRmX2hlYWRlcnxmZGZfbmV4dF9maWVsZF9uYW1lfGZkZl9vcGVufGZkZl9vcGVuX3N0cmluZ3xmZGZfcmVtb3ZlX2l0ZW18ZmRmX3NhdmV8ZmRmX3NhdmVfc3RyaW5nfGZkZl9zZXRfYXB8ZmRmX3NldF9lbmNvZGluZ3xmZGZfc2V0X2ZpbGV8ZmRmX3NldF9mbGFnc3xmZGZfc2V0X2phdmFzY3JpcHRfYWN0aW9ufGZkZl9zZXRfb25faW1wb3J0X2phdmFzY3JpcHR8ZmRmX3NldF9vcHR8ZmRmX3NldF9zdGF0dXN8ZmRmX3NldF9zdWJtaXRfZm9ybV9hY3Rpb258ZmRmX3NldF90YXJnZXRfZnJhbWV8ZmRmX3NldF92YWx1ZXxmZGZfc2V0X3ZlcnNpb258ZmVvZnxmZmx1c2h8ZmdldGN8ZmdldGNzdnxmZ2V0c3xmZ2V0c3N8ZmlsZXxmaWxlX2V4aXN0c3xmaWxlX2dldF9jb250ZW50c3xmaWxlX3B1dF9jb250ZW50c3xmaWxlYXRpbWV8ZmlsZWN0aW1lfGZpbGVncm91cHxmaWxlaW5vZGV8ZmlsZW10aW1lfGZpbGVvd25lcnxmaWxlcGVybXN8ZmlsZXByb3xmaWxlcHJvX2ZpZWxkY291bnR8ZmlsZXByb19maWVsZG5hbWV8ZmlsZXByb19maWVsZHR5cGV8ZmlsZXByb19maWVsZHdpZHRofGZpbGVwcm9fcmV0cmlldmV8ZmlsZXByb19yb3djb3VudHxmaWxlc2l6ZXxmaWxlc3lzdGVtaXRlcmF0b3J8ZmlsZXR5cGV8ZmlsdGVyX2hhc192YXJ8ZmlsdGVyX2lkfGZpbHRlcl9pbnB1dHxmaWx0ZXJfaW5wdXRfYXJyYXl8ZmlsdGVyX2xpc3R8ZmlsdGVyX3ZhcnxmaWx0ZXJfdmFyX2FycmF5fGZpbHRlcml0ZXJhdG9yfGZpbmZvX2J1ZmZlcnxmaW5mb19jbG9zZXxmaW5mb19maWxlfGZpbmZvX29wZW58ZmluZm9fc2V0X2ZsYWdzfGZsb2F0dmFsfGZsb2NrfGZsb29yfGZsdXNofGZtb2R8Zm5tYXRjaHxmb3Blbnxmb3J3YXJkX3N0YXRpY19jYWxsfGZvcndhcmRfc3RhdGljX2NhbGxfYXJyYXl8ZnBhc3N0aHJ1fGZwcmludGZ8ZnB1dGNzdnxmcHV0c3xmcmVhZHxmcmVuY2h0b2pkfGZyaWJpZGlfbG9nMnZpc3xmc2NhbmZ8ZnNlZWt8ZnNvY2tvcGVufGZzdGF0fGZ0ZWxsfGZ0b2t8ZnRwX2FsbG9jfGZ0cF9jZHVwfGZ0cF9jaGRpcnxmdHBfY2htb2R8ZnRwX2Nsb3NlfGZ0cF9jb25uZWN0fGZ0cF9kZWxldGV8ZnRwX2V4ZWN8ZnRwX2ZnZXR8ZnRwX2ZwdXR8ZnRwX2dldHxmdHBfZ2V0X29wdGlvbnxmdHBfbG9naW58ZnRwX21kdG18ZnRwX21rZGlyfGZ0cF9uYl9jb250aW51ZXxmdHBfbmJfZmdldHxmdHBfbmJfZnB1dHxmdHBfbmJfZ2V0fGZ0cF9uYl9wdXR8ZnRwX25saXN0fGZ0cF9wYXN2fGZ0cF9wdXR8ZnRwX3B3ZHxmdHBfcXVpdHxmdHBfcmF3fGZ0cF9yYXdsaXN0fGZ0cF9yZW5hbWV8ZnRwX3JtZGlyfGZ0cF9zZXRfb3B0aW9ufGZ0cF9zaXRlfGZ0cF9zaXplfGZ0cF9zc2xfY29ubmVjdHxmdHBfc3lzdHlwZXxmdHJ1bmNhdGV8ZnVuY19nZXRfYXJnfGZ1bmNfZ2V0X2FyZ3N8ZnVuY19udW1fYXJnc3xmdW5jdGlvbl9leGlzdHN8ZndyaXRlfGdjX2NvbGxlY3RfY3ljbGVzfGdjX2Rpc2FibGV8Z2NfZW5hYmxlfGdjX2VuYWJsZWR8Z2RfaW5mb3xnZWFybWFuY2xpZW50fGdlYXJtYW5qb2J8Z2Vhcm1hbnRhc2t8Z2Vhcm1hbndvcmtlcnxnZW9pcF9jb250aW5lbnRfY29kZV9ieV9uYW1lfGdlb2lwX2NvdW50cnlfY29kZTNfYnlfbmFtZXxnZW9pcF9jb3VudHJ5X2NvZGVfYnlfbmFtZXxnZW9pcF9jb3VudHJ5X25hbWVfYnlfbmFtZXxnZW9pcF9kYXRhYmFzZV9pbmZvfGdlb2lwX2RiX2F2YWlsfGdlb2lwX2RiX2ZpbGVuYW1lfGdlb2lwX2RiX2dldF9hbGxfaW5mb3xnZW9pcF9pZF9ieV9uYW1lfGdlb2lwX2lzcF9ieV9uYW1lfGdlb2lwX29yZ19ieV9uYW1lfGdlb2lwX3JlY29yZF9ieV9uYW1lfGdlb2lwX3JlZ2lvbl9ieV9uYW1lfGdlb2lwX3JlZ2lvbl9uYW1lX2J5X2NvZGV8Z2VvaXBfdGltZV96b25lX2J5X2NvdW50cnlfYW5kX3JlZ2lvbnxnZXRNZXRhfGdldE5hbWVkfGdldFZhbHVlfGdldF9icm93c2VyfGdldF9jYWxsZWRfY2xhc3N8Z2V0X2NmZ192YXJ8Z2V0X2NsYXNzfGdldF9jbGFzc19tZXRob2RzfGdldF9jbGFzc192YXJzfGdldF9jdXJyZW50X3VzZXJ8Z2V0X2RlY2xhcmVkX2NsYXNzZXN8Z2V0X2RlY2xhcmVkX2ludGVyZmFjZXN8Z2V0X2RlZmluZWRfY29uc3RhbnRzfGdldF9kZWZpbmVkX2Z1bmN0aW9uc3xnZXRfZGVmaW5lZF92YXJzfGdldF9leHRlbnNpb25fZnVuY3N8Z2V0X2hlYWRlcnN8Z2V0X2h0bWxfdHJhbnNsYXRpb25fdGFibGV8Z2V0X2luY2x1ZGVfcGF0aHxnZXRfaW5jbHVkZWRfZmlsZXN8Z2V0X2xvYWRlZF9leHRlbnNpb25zfGdldF9tYWdpY19xdW90ZXNfZ3BjfGdldF9tYWdpY19xdW90ZXNfcnVudGltZXxnZXRfbWV0YV90YWdzfGdldF9vYmplY3RfdmFyc3xnZXRfcGFyZW50X2NsYXNzfGdldF9yZXF1aXJlZF9maWxlc3xnZXRfcmVzb3VyY2VfdHlwZXxnZXRhbGxoZWFkZXJzfGdldGNvbnN0YW50fGdldGNvbnN0YW50c3xnZXRjb25zdHJ1Y3RvcnxnZXRjd2R8Z2V0ZGF0ZXxnZXRkZWZhdWx0cHJvcGVydGllc3xnZXRkb2Njb21tZW50fGdldGVuZGxpbmV8Z2V0ZW52fGdldGV4dGVuc2lvbnxnZXRleHRlbnNpb25uYW1lfGdldGZpbGVuYW1lfGdldGhvc3RieWFkZHJ8Z2V0aG9zdGJ5bmFtZXxnZXRob3N0YnluYW1lbHxnZXRob3N0bmFtZXxnZXRpbWFnZXNpemV8Z2V0aW50ZXJmYWNlbmFtZXN8Z2V0aW50ZXJmYWNlc3xnZXRsYXN0bW9kfGdldG1ldGhvZHxnZXRtZXRob2RzfGdldG1vZGlmaWVyc3xnZXRteHJyfGdldG15Z2lkfGdldG15aW5vZGV8Z2V0bXlwaWR8Z2V0bXl1aWR8Z2V0bmFtZXxnZXRuYW1lc3BhY2VuYW1lfGdldG9wdHxnZXRwYXJlbnRjbGFzc3xnZXRwcm9wZXJ0aWVzfGdldHByb3BlcnR5fGdldHByb3RvYnluYW1lfGdldHByb3RvYnludW1iZXJ8Z2V0cmFuZG1heHxnZXRydXNhZ2V8Z2V0c2VydmJ5bmFtZXxnZXRzZXJ2Ynlwb3J0fGdldHNob3J0bmFtZXxnZXRzdGFydGxpbmV8Z2V0c3RhdGljcHJvcGVydGllc3xnZXRzdGF0aWNwcm9wZXJ0eXZhbHVlfGdldHRleHR8Z2V0dGltZW9mZGF5fGdldHR5cGV8Z2xvYnxnbG9iaXRlcmF0b3J8Z21hZ2lja3xnbWFnaWNrZHJhd3xnbWFnaWNrcGl4ZWx8Z21kYXRlfGdtbWt0aW1lfGdtcF9hYnN8Z21wX2FkZHxnbXBfYW5kfGdtcF9jbHJiaXR8Z21wX2NtcHxnbXBfY29tfGdtcF9kaXZ8Z21wX2Rpdl9xfGdtcF9kaXZfcXJ8Z21wX2Rpdl9yfGdtcF9kaXZleGFjdHxnbXBfZmFjdHxnbXBfZ2NkfGdtcF9nY2RleHR8Z21wX2hhbWRpc3R8Z21wX2luaXR8Z21wX2ludHZhbHxnbXBfaW52ZXJ0fGdtcF9qYWNvYml8Z21wX2xlZ2VuZHJlfGdtcF9tb2R8Z21wX211bHxnbXBfbmVnfGdtcF9uZXh0cHJpbWV8Z21wX29yfGdtcF9wZXJmZWN0X3NxdWFyZXxnbXBfcG9wY291bnR8Z21wX3Bvd3xnbXBfcG93bXxnbXBfcHJvYl9wcmltZXxnbXBfcmFuZG9tfGdtcF9zY2FuMHxnbXBfc2NhbjF8Z21wX3NldGJpdHxnbXBfc2lnbnxnbXBfc3FydHxnbXBfc3FydHJlbXxnbXBfc3RydmFsfGdtcF9zdWJ8Z21wX3Rlc3RiaXR8Z21wX3hvcnxnbXN0cmZ0aW1lfGdudXBnX2FkZGRlY3J5cHRrZXl8Z251cGdfYWRkZW5jcnlwdGtleXxnbnVwZ19hZGRzaWdua2V5fGdudXBnX2NsZWFyZGVjcnlwdGtleXN8Z251cGdfY2xlYXJlbmNyeXB0a2V5c3xnbnVwZ19jbGVhcnNpZ25rZXlzfGdudXBnX2RlY3J5cHR8Z251cGdfZGVjcnlwdHZlcmlmeXxnbnVwZ19lbmNyeXB0fGdudXBnX2VuY3J5cHRzaWdufGdudXBnX2V4cG9ydHxnbnVwZ19nZXRlcnJvcnxnbnVwZ19nZXRwcm90b2NvbHxnbnVwZ19pbXBvcnR8Z251cGdfaW5pdHxnbnVwZ19rZXlpbmZvfGdudXBnX3NldGFybW9yfGdudXBnX3NldGVycm9ybW9kZXxnbnVwZ19zZXRzaWdubW9kZXxnbnVwZ19zaWdufGdudXBnX3ZlcmlmeXxnb3BoZXJfcGFyc2VkaXJ8Z3JhcGhlbWVfZXh0cmFjdHxncmFwaGVtZV9zdHJpcG9zfGdyYXBoZW1lX3N0cmlzdHJ8Z3JhcGhlbWVfc3RybGVufGdyYXBoZW1lX3N0cnBvc3xncmFwaGVtZV9zdHJyaXBvc3xncmFwaGVtZV9zdHJycG9zfGdyYXBoZW1lX3N0cnN0cnxncmFwaGVtZV9zdWJzdHJ8Z3JlZ29yaWFudG9qZHxndXBucF9jb250ZXh0X2dldF9ob3N0X2lwfGd1cG5wX2NvbnRleHRfZ2V0X3BvcnR8Z3VwbnBfY29udGV4dF9nZXRfc3Vic2NyaXB0aW9uX3RpbWVvdXR8Z3VwbnBfY29udGV4dF9ob3N0X3BhdGh8Z3VwbnBfY29udGV4dF9uZXd8Z3VwbnBfY29udGV4dF9zZXRfc3Vic2NyaXB0aW9uX3RpbWVvdXR8Z3VwbnBfY29udGV4dF90aW1lb3V0X2FkZHxndXBucF9jb250ZXh0X3VuaG9zdF9wYXRofGd1cG5wX2NvbnRyb2xfcG9pbnRfYnJvd3NlX3N0YXJ0fGd1cG5wX2NvbnRyb2xfcG9pbnRfYnJvd3NlX3N0b3B8Z3VwbnBfY29udHJvbF9wb2ludF9jYWxsYmFja19zZXR8Z3VwbnBfY29udHJvbF9wb2ludF9uZXd8Z3VwbnBfZGV2aWNlX2FjdGlvbl9jYWxsYmFja19zZXR8Z3VwbnBfZGV2aWNlX2luZm9fZ2V0fGd1cG5wX2RldmljZV9pbmZvX2dldF9zZXJ2aWNlfGd1cG5wX3Jvb3RfZGV2aWNlX2dldF9hdmFpbGFibGV8Z3VwbnBfcm9vdF9kZXZpY2VfZ2V0X3JlbGF0aXZlX2xvY2F0aW9ufGd1cG5wX3Jvb3RfZGV2aWNlX25ld3xndXBucF9yb290X2RldmljZV9zZXRfYXZhaWxhYmxlfGd1cG5wX3Jvb3RfZGV2aWNlX3N0YXJ0fGd1cG5wX3Jvb3RfZGV2aWNlX3N0b3B8Z3VwbnBfc2VydmljZV9hY3Rpb25fZ2V0fGd1cG5wX3NlcnZpY2VfYWN0aW9uX3JldHVybnxndXBucF9zZXJ2aWNlX2FjdGlvbl9yZXR1cm5fZXJyb3J8Z3VwbnBfc2VydmljZV9hY3Rpb25fc2V0fGd1cG5wX3NlcnZpY2VfZnJlZXplX25vdGlmeXxndXBucF9zZXJ2aWNlX2luZm9fZ2V0fGd1cG5wX3NlcnZpY2VfaW5mb19nZXRfaW50cm9zcGVjdGlvbnxndXBucF9zZXJ2aWNlX2ludHJvc3BlY3Rpb25fZ2V0X3N0YXRlX3ZhcmlhYmxlfGd1cG5wX3NlcnZpY2Vfbm90aWZ5fGd1cG5wX3NlcnZpY2VfcHJveHlfYWN0aW9uX2dldHxndXBucF9zZXJ2aWNlX3Byb3h5X2FjdGlvbl9zZXR8Z3VwbnBfc2VydmljZV9wcm94eV9hZGRfbm90aWZ5fGd1cG5wX3NlcnZpY2VfcHJveHlfY2FsbGJhY2tfc2V0fGd1cG5wX3NlcnZpY2VfcHJveHlfZ2V0X3N1YnNjcmliZWR8Z3VwbnBfc2VydmljZV9wcm94eV9yZW1vdmVfbm90aWZ5fGd1cG5wX3NlcnZpY2VfcHJveHlfc2V0X3N1YnNjcmliZWR8Z3VwbnBfc2VydmljZV90aGF3X25vdGlmeXxnemNsb3NlfGd6Y29tcHJlc3N8Z3pkZWNvZGV8Z3pkZWZsYXRlfGd6ZW5jb2RlfGd6ZW9mfGd6ZmlsZXxnemdldGN8Z3pnZXRzfGd6Z2V0c3N8Z3ppbmZsYXRlfGd6b3BlbnxnenBhc3N0aHJ1fGd6cHV0c3xnenJlYWR8Z3pyZXdpbmR8Z3pzZWVrfGd6dGVsbHxnenVuY29tcHJlc3N8Z3p3cml0ZXxoYWx0X2NvbXBpbGVyfGhhcnVhbm5vdGF0aW9ufGhhcnVhbm5vdGF0aW9uX3NldGJvcmRlcnN0eWxlfGhhcnVhbm5vdGF0aW9uX3NldGhpZ2hsaWdodG1vZGV8aGFydWFubm90YXRpb25fc2V0aWNvbnxoYXJ1YW5ub3RhdGlvbl9zZXRvcGVuZWR8aGFydWRlc3RpbmF0aW9ufGhhcnVkZXN0aW5hdGlvbl9zZXRmaXR8aGFydWRlc3RpbmF0aW9uX3NldGZpdGJ8aGFydWRlc3RpbmF0aW9uX3NldGZpdGJofGhhcnVkZXN0aW5hdGlvbl9zZXRmaXRidnxoYXJ1ZGVzdGluYXRpb25fc2V0Zml0aHxoYXJ1ZGVzdGluYXRpb25fc2V0Zml0cnxoYXJ1ZGVzdGluYXRpb25fc2V0Zml0dnxoYXJ1ZGVzdGluYXRpb25fc2V0eHl6fGhhcnVkb2N8aGFydWRvY19hZGRwYWdlfGhhcnVkb2NfYWRkcGFnZWxhYmVsfGhhcnVkb2NfY29uc3RydWN0fGhhcnVkb2NfY3JlYXRlb3V0bGluZXxoYXJ1ZG9jX2dldGN1cnJlbnRlbmNvZGVyfGhhcnVkb2NfZ2V0Y3VycmVudHBhZ2V8aGFydWRvY19nZXRlbmNvZGVyfGhhcnVkb2NfZ2V0Zm9udHxoYXJ1ZG9jX2dldGluZm9hdHRyfGhhcnVkb2NfZ2V0cGFnZWxheW91dHxoYXJ1ZG9jX2dldHBhZ2Vtb2RlfGhhcnVkb2NfZ2V0c3RyZWFtc2l6ZXxoYXJ1ZG9jX2luc2VydHBhZ2V8aGFydWRvY19sb2FkanBlZ3xoYXJ1ZG9jX2xvYWRwbmd8aGFydWRvY19sb2FkcmF3fGhhcnVkb2NfbG9hZHR0Y3xoYXJ1ZG9jX2xvYWR0dGZ8aGFydWRvY19sb2FkdHlwZTF8aGFydWRvY19vdXRwdXR8aGFydWRvY19yZWFkZnJvbXN0cmVhbXxoYXJ1ZG9jX3Jlc2V0ZXJyb3J8aGFydWRvY19yZXNldHN0cmVhbXxoYXJ1ZG9jX3NhdmV8aGFydWRvY19zYXZldG9zdHJlYW18aGFydWRvY19zZXRjb21wcmVzc2lvbm1vZGV8aGFydWRvY19zZXRjdXJyZW50ZW5jb2RlcnxoYXJ1ZG9jX3NldGVuY3J5cHRpb25tb2RlfGhhcnVkb2Nfc2V0aW5mb2F0dHJ8aGFydWRvY19zZXRpbmZvZGF0ZWF0dHJ8aGFydWRvY19zZXRvcGVuYWN0aW9ufGhhcnVkb2Nfc2V0cGFnZWxheW91dHxoYXJ1ZG9jX3NldHBhZ2Vtb2RlfGhhcnVkb2Nfc2V0cGFnZXNjb25maWd1cmF0aW9ufGhhcnVkb2Nfc2V0cGFzc3dvcmR8aGFydWRvY19zZXRwZXJtaXNzaW9ufGhhcnVkb2NfdXNlY25zZW5jb2RpbmdzfGhhcnVkb2NfdXNlY25zZm9udHN8aGFydWRvY191c2VjbnRlbmNvZGluZ3N8aGFydWRvY191c2VjbnRmb250c3xoYXJ1ZG9jX3VzZWpwZW5jb2RpbmdzfGhhcnVkb2NfdXNlanBmb250c3xoYXJ1ZG9jX3VzZWtyZW5jb2RpbmdzfGhhcnVkb2NfdXNla3Jmb250c3xoYXJ1ZW5jb2RlcnxoYXJ1ZW5jb2Rlcl9nZXRieXRldHlwZXxoYXJ1ZW5jb2Rlcl9nZXR0eXBlfGhhcnVlbmNvZGVyX2dldHVuaWNvZGV8aGFydWVuY29kZXJfZ2V0d3JpdGluZ21vZGV8aGFydWV4Y2VwdGlvbnxoYXJ1Zm9udHxoYXJ1Zm9udF9nZXRhc2NlbnR8aGFydWZvbnRfZ2V0Y2FwaGVpZ2h0fGhhcnVmb250X2dldGRlc2NlbnR8aGFydWZvbnRfZ2V0ZW5jb2RpbmduYW1lfGhhcnVmb250X2dldGZvbnRuYW1lfGhhcnVmb250X2dldHRleHR3aWR0aHxoYXJ1Zm9udF9nZXR1bmljb2Rld2lkdGh8aGFydWZvbnRfZ2V0eGhlaWdodHxoYXJ1Zm9udF9tZWFzdXJldGV4dHxoYXJ1aW1hZ2V8aGFydWltYWdlX2dldGJpdHNwZXJjb21wb25lbnR8aGFydWltYWdlX2dldGNvbG9yc3BhY2V8aGFydWltYWdlX2dldGhlaWdodHxoYXJ1aW1hZ2VfZ2V0c2l6ZXxoYXJ1aW1hZ2VfZ2V0d2lkdGh8aGFydWltYWdlX3NldGNvbG9ybWFza3xoYXJ1aW1hZ2Vfc2V0bWFza2ltYWdlfGhhcnVvdXRsaW5lfGhhcnVvdXRsaW5lX3NldGRlc3RpbmF0aW9ufGhhcnVvdXRsaW5lX3NldG9wZW5lZHxoYXJ1cGFnZXxoYXJ1cGFnZV9hcmN8aGFydXBhZ2VfYmVnaW50ZXh0fGhhcnVwYWdlX2NpcmNsZXxoYXJ1cGFnZV9jbG9zZXBhdGh8aGFydXBhZ2VfY29uY2F0fGhhcnVwYWdlX2NyZWF0ZWRlc3RpbmF0aW9ufGhhcnVwYWdlX2NyZWF0ZWxpbmthbm5vdGF0aW9ufGhhcnVwYWdlX2NyZWF0ZXRleHRhbm5vdGF0aW9ufGhhcnVwYWdlX2NyZWF0ZXVybGFubm90YXRpb258aGFydXBhZ2VfY3VydmV0b3xoYXJ1cGFnZV9jdXJ2ZXRvMnxoYXJ1cGFnZV9jdXJ2ZXRvM3xoYXJ1cGFnZV9kcmF3aW1hZ2V8aGFydXBhZ2VfZWxsaXBzZXxoYXJ1cGFnZV9lbmRwYXRofGhhcnVwYWdlX2VuZHRleHR8aGFydXBhZ2VfZW9maWxsfGhhcnVwYWdlX2VvZmlsbHN0cm9rZXxoYXJ1cGFnZV9maWxsfGhhcnVwYWdlX2ZpbGxzdHJva2V8aGFydXBhZ2VfZ2V0Y2hhcnNwYWNlfGhhcnVwYWdlX2dldGNteWtmaWxsfGhhcnVwYWdlX2dldGNteWtzdHJva2V8aGFydXBhZ2VfZ2V0Y3VycmVudGZvbnR8aGFydXBhZ2VfZ2V0Y3VycmVudGZvbnRzaXplfGhhcnVwYWdlX2dldGN1cnJlbnRwb3N8aGFydXBhZ2VfZ2V0Y3VycmVudHRleHRwb3N8aGFydXBhZ2VfZ2V0ZGFzaHxoYXJ1cGFnZV9nZXRmaWxsaW5nY29sb3JzcGFjZXxoYXJ1cGFnZV9nZXRmbGF0bmVzc3xoYXJ1cGFnZV9nZXRnbW9kZXxoYXJ1cGFnZV9nZXRncmF5ZmlsbHxoYXJ1cGFnZV9nZXRncmF5c3Ryb2tlfGhhcnVwYWdlX2dldGhlaWdodHxoYXJ1cGFnZV9nZXRob3Jpem9udGFsc2NhbGluZ3xoYXJ1cGFnZV9nZXRsaW5lY2FwfGhhcnVwYWdlX2dldGxpbmVqb2lufGhhcnVwYWdlX2dldGxpbmV3aWR0aHxoYXJ1cGFnZV9nZXRtaXRlcmxpbWl0fGhhcnVwYWdlX2dldHJnYmZpbGx8aGFydXBhZ2VfZ2V0cmdic3Ryb2tlfGhhcnVwYWdlX2dldHN0cm9raW5nY29sb3JzcGFjZXxoYXJ1cGFnZV9nZXR0ZXh0bGVhZGluZ3xoYXJ1cGFnZV9nZXR0ZXh0bWF0cml4fGhhcnVwYWdlX2dldHRleHRyZW5kZXJpbmdtb2RlfGhhcnVwYWdlX2dldHRleHRyaXNlfGhhcnVwYWdlX2dldHRleHR3aWR0aHxoYXJ1cGFnZV9nZXR0cmFuc21hdHJpeHxoYXJ1cGFnZV9nZXR3aWR0aHxoYXJ1cGFnZV9nZXR3b3Jkc3BhY2V8aGFydXBhZ2VfbGluZXRvfGhhcnVwYWdlX21lYXN1cmV0ZXh0fGhhcnVwYWdlX21vdmV0ZXh0cG9zfGhhcnVwYWdlX21vdmV0b3xoYXJ1cGFnZV9tb3ZldG9uZXh0bGluZXxoYXJ1cGFnZV9yZWN0YW5nbGV8aGFydXBhZ2Vfc2V0Y2hhcnNwYWNlfGhhcnVwYWdlX3NldGNteWtmaWxsfGhhcnVwYWdlX3NldGNteWtzdHJva2V8aGFydXBhZ2Vfc2V0ZGFzaHxoYXJ1cGFnZV9zZXRmbGF0bmVzc3xoYXJ1cGFnZV9zZXRmb250YW5kc2l6ZXxoYXJ1cGFnZV9zZXRncmF5ZmlsbHxoYXJ1cGFnZV9zZXRncmF5c3Ryb2tlfGhhcnVwYWdlX3NldGhlaWdodHxoYXJ1cGFnZV9zZXRob3Jpem9udGFsc2NhbGluZ3xoYXJ1cGFnZV9zZXRsaW5lY2FwfGhhcnVwYWdlX3NldGxpbmVqb2lufGhhcnVwYWdlX3NldGxpbmV3aWR0aHxoYXJ1cGFnZV9zZXRtaXRlcmxpbWl0fGhhcnVwYWdlX3NldHJnYmZpbGx8aGFydXBhZ2Vfc2V0cmdic3Ryb2tlfGhhcnVwYWdlX3NldHJvdGF0ZXxoYXJ1cGFnZV9zZXRzaXplfGhhcnVwYWdlX3NldHNsaWRlc2hvd3xoYXJ1cGFnZV9zZXR0ZXh0bGVhZGluZ3xoYXJ1cGFnZV9zZXR0ZXh0bWF0cml4fGhhcnVwYWdlX3NldHRleHRyZW5kZXJpbmdtb2RlfGhhcnVwYWdlX3NldHRleHRyaXNlfGhhcnVwYWdlX3NldHdpZHRofGhhcnVwYWdlX3NldHdvcmRzcGFjZXxoYXJ1cGFnZV9zaG93dGV4dHxoYXJ1cGFnZV9zaG93dGV4dG5leHRsaW5lfGhhcnVwYWdlX3N0cm9rZXxoYXJ1cGFnZV90ZXh0b3V0fGhhcnVwYWdlX3RleHRyZWN0fGhhc2NvbnN0YW50fGhhc2h8aGFzaF9hbGdvc3xoYXNoX2NvcHl8aGFzaF9maWxlfGhhc2hfZmluYWx8aGFzaF9obWFjfGhhc2hfaG1hY19maWxlfGhhc2hfaW5pdHxoYXNoX3VwZGF0ZXxoYXNoX3VwZGF0ZV9maWxlfGhhc2hfdXBkYXRlX3N0cmVhbXxoYXNtZXRob2R8aGFzcHJvcGVydHl8aGVhZGVyfGhlYWRlcl9yZWdpc3Rlcl9jYWxsYmFja3xoZWFkZXJfcmVtb3ZlfGhlYWRlcnNfbGlzdHxoZWFkZXJzX3NlbnR8aGVicmV2fGhlYnJldmN8aGV4MmJpbnxoZXhkZWN8aGlnaGxpZ2h0X2ZpbGV8aGlnaGxpZ2h0X3N0cmluZ3xodG1sX2VudGl0eV9kZWNvZGV8aHRtbGVudGl0aWVzfGh0bWxzcGVjaWFsY2hhcnN8aHRtbHNwZWNpYWxjaGFyc19kZWNvZGV8aHR0cF9idWlsZF9jb29raWV8aHR0cF9idWlsZF9xdWVyeXxodHRwX2J1aWxkX3N0cnxodHRwX2J1aWxkX3VybHxodHRwX2NhY2hlX2V0YWd8aHR0cF9jYWNoZV9sYXN0X21vZGlmaWVkfGh0dHBfY2h1bmtlZF9kZWNvZGV8aHR0cF9kYXRlfGh0dHBfZGVmbGF0ZXxodHRwX2dldHxodHRwX2dldF9yZXF1ZXN0X2JvZHl8aHR0cF9nZXRfcmVxdWVzdF9ib2R5X3N0cmVhbXxodHRwX2dldF9yZXF1ZXN0X2hlYWRlcnN8aHR0cF9oZWFkfGh0dHBfaW5mbGF0ZXxodHRwX21hdGNoX2V0YWd8aHR0cF9tYXRjaF9tb2RpZmllZHxodHRwX21hdGNoX3JlcXVlc3RfaGVhZGVyfGh0dHBfbmVnb3RpYXRlX2NoYXJzZXR8aHR0cF9uZWdvdGlhdGVfY29udGVudF90eXBlfGh0dHBfbmVnb3RpYXRlX2xhbmd1YWdlfGh0dHBfcGFyc2VfY29va2llfGh0dHBfcGFyc2VfaGVhZGVyc3xodHRwX3BhcnNlX21lc3NhZ2V8aHR0cF9wYXJzZV9wYXJhbXN8aHR0cF9wZXJzaXN0ZW50X2hhbmRsZXNfY2xlYW58aHR0cF9wZXJzaXN0ZW50X2hhbmRsZXNfY291bnR8aHR0cF9wZXJzaXN0ZW50X2hhbmRsZXNfaWRlbnR8aHR0cF9wb3N0X2RhdGF8aHR0cF9wb3N0X2ZpZWxkc3xodHRwX3B1dF9kYXRhfGh0dHBfcHV0X2ZpbGV8aHR0cF9wdXRfc3RyZWFtfGh0dHBfcmVkaXJlY3R8aHR0cF9yZXF1ZXN0fGh0dHBfcmVxdWVzdF9ib2R5X2VuY29kZXxodHRwX3JlcXVlc3RfbWV0aG9kX2V4aXN0c3xodHRwX3JlcXVlc3RfbWV0aG9kX25hbWV8aHR0cF9yZXF1ZXN0X21ldGhvZF9yZWdpc3RlcnxodHRwX3JlcXVlc3RfbWV0aG9kX3VucmVnaXN0ZXJ8aHR0cF9yZXNwb25zZV9jb2RlfGh0dHBfc2VuZF9jb250ZW50X2Rpc3Bvc2l0aW9ufGh0dHBfc2VuZF9jb250ZW50X3R5cGV8aHR0cF9zZW5kX2RhdGF8aHR0cF9zZW5kX2ZpbGV8aHR0cF9zZW5kX2xhc3RfbW9kaWZpZWR8aHR0cF9zZW5kX3N0YXR1c3xodHRwX3NlbmRfc3RyZWFtfGh0dHBfc3VwcG9ydHxodHRwX3Rocm90dGxlfGh0dHBkZWZsYXRlc3RyZWFtfGh0dHBkZWZsYXRlc3RyZWFtX2NvbnN0cnVjdHxodHRwZGVmbGF0ZXN0cmVhbV9mYWN0b3J5fGh0dHBkZWZsYXRlc3RyZWFtX2ZpbmlzaHxodHRwZGVmbGF0ZXN0cmVhbV9mbHVzaHxodHRwZGVmbGF0ZXN0cmVhbV91cGRhdGV8aHR0cGluZmxhdGVzdHJlYW18aHR0cGluZmxhdGVzdHJlYW1fY29uc3RydWN0fGh0dHBpbmZsYXRlc3RyZWFtX2ZhY3Rvcnl8aHR0cGluZmxhdGVzdHJlYW1fZmluaXNofGh0dHBpbmZsYXRlc3RyZWFtX2ZsdXNofGh0dHBpbmZsYXRlc3RyZWFtX3VwZGF0ZXxodHRwbWVzc2FnZXxodHRwbWVzc2FnZV9hZGRoZWFkZXJzfGh0dHBtZXNzYWdlX2NvbnN0cnVjdHxodHRwbWVzc2FnZV9kZXRhY2h8aHR0cG1lc3NhZ2VfZmFjdG9yeXxodHRwbWVzc2FnZV9mcm9tZW52fGh0dHBtZXNzYWdlX2Zyb21zdHJpbmd8aHR0cG1lc3NhZ2VfZ2V0Ym9keXxodHRwbWVzc2FnZV9nZXRoZWFkZXJ8aHR0cG1lc3NhZ2VfZ2V0aGVhZGVyc3xodHRwbWVzc2FnZV9nZXRodHRwdmVyc2lvbnxodHRwbWVzc2FnZV9nZXRwYXJlbnRtZXNzYWdlfGh0dHBtZXNzYWdlX2dldHJlcXVlc3RtZXRob2R8aHR0cG1lc3NhZ2VfZ2V0cmVxdWVzdHVybHxodHRwbWVzc2FnZV9nZXRyZXNwb25zZWNvZGV8aHR0cG1lc3NhZ2VfZ2V0cmVzcG9uc2VzdGF0dXN8aHR0cG1lc3NhZ2VfZ2V0dHlwZXxodHRwbWVzc2FnZV9ndWVzc2NvbnRlbnR0eXBlfGh0dHBtZXNzYWdlX3ByZXBlbmR8aHR0cG1lc3NhZ2VfcmV2ZXJzZXxodHRwbWVzc2FnZV9zZW5kfGh0dHBtZXNzYWdlX3NldGJvZHl8aHR0cG1lc3NhZ2Vfc2V0aGVhZGVyc3xodHRwbWVzc2FnZV9zZXRodHRwdmVyc2lvbnxodHRwbWVzc2FnZV9zZXRyZXF1ZXN0bWV0aG9kfGh0dHBtZXNzYWdlX3NldHJlcXVlc3R1cmx8aHR0cG1lc3NhZ2Vfc2V0cmVzcG9uc2Vjb2RlfGh0dHBtZXNzYWdlX3NldHJlc3BvbnNlc3RhdHVzfGh0dHBtZXNzYWdlX3NldHR5cGV8aHR0cG1lc3NhZ2VfdG9tZXNzYWdldHlwZW9iamVjdHxodHRwbWVzc2FnZV90b3N0cmluZ3xodHRwcXVlcnlzdHJpbmd8aHR0cHF1ZXJ5c3RyaW5nX2NvbnN0cnVjdHxodHRwcXVlcnlzdHJpbmdfZ2V0fGh0dHBxdWVyeXN0cmluZ19tb2R8aHR0cHF1ZXJ5c3RyaW5nX3NldHxodHRwcXVlcnlzdHJpbmdfc2luZ2xldG9ufGh0dHBxdWVyeXN0cmluZ190b2FycmF5fGh0dHBxdWVyeXN0cmluZ190b3N0cmluZ3xodHRwcXVlcnlzdHJpbmdfeGxhdGV8aHR0cHJlcXVlc3R8aHR0cHJlcXVlc3RfYWRkY29va2llc3xodHRwcmVxdWVzdF9hZGRoZWFkZXJzfGh0dHByZXF1ZXN0X2FkZHBvc3RmaWVsZHN8aHR0cHJlcXVlc3RfYWRkcG9zdGZpbGV8aHR0cHJlcXVlc3RfYWRkcHV0ZGF0YXxodHRwcmVxdWVzdF9hZGRxdWVyeWRhdGF8aHR0cHJlcXVlc3RfYWRkcmF3cG9zdGRhdGF8aHR0cHJlcXVlc3RfYWRkc3Nsb3B0aW9uc3xodHRwcmVxdWVzdF9jbGVhcmhpc3Rvcnl8aHR0cHJlcXVlc3RfY29uc3RydWN0fGh0dHByZXF1ZXN0X2VuYWJsZWNvb2tpZXN8aHR0cHJlcXVlc3RfZ2V0Y29udGVudHR5cGV8aHR0cHJlcXVlc3RfZ2V0Y29va2llc3xodHRwcmVxdWVzdF9nZXRoZWFkZXJzfGh0dHByZXF1ZXN0X2dldGhpc3Rvcnl8aHR0cHJlcXVlc3RfZ2V0bWV0aG9kfGh0dHByZXF1ZXN0X2dldG9wdGlvbnN8aHR0cHJlcXVlc3RfZ2V0cG9zdGZpZWxkc3xodHRwcmVxdWVzdF9nZXRwb3N0ZmlsZXN8aHR0cHJlcXVlc3RfZ2V0cHV0ZGF0YXxodHRwcmVxdWVzdF9nZXRwdXRmaWxlfGh0dHByZXF1ZXN0X2dldHF1ZXJ5ZGF0YXxodHRwcmVxdWVzdF9nZXRyYXdwb3N0ZGF0YXxodHRwcmVxdWVzdF9nZXRyYXdyZXF1ZXN0bWVzc2FnZXxodHRwcmVxdWVzdF9nZXRyYXdyZXNwb25zZW1lc3NhZ2V8aHR0cHJlcXVlc3RfZ2V0cmVxdWVzdG1lc3NhZ2V8aHR0cHJlcXVlc3RfZ2V0cmVzcG9uc2Vib2R5fGh0dHByZXF1ZXN0X2dldHJlc3BvbnNlY29kZXxodHRwcmVxdWVzdF9nZXRyZXNwb25zZWNvb2tpZXN8aHR0cHJlcXVlc3RfZ2V0cmVzcG9uc2VkYXRhfGh0dHByZXF1ZXN0X2dldHJlc3BvbnNlaGVhZGVyfGh0dHByZXF1ZXN0X2dldHJlc3BvbnNlaW5mb3xodHRwcmVxdWVzdF9nZXRyZXNwb25zZW1lc3NhZ2V8aHR0cHJlcXVlc3RfZ2V0cmVzcG9uc2VzdGF0dXN8aHR0cHJlcXVlc3RfZ2V0c3Nsb3B0aW9uc3xodHRwcmVxdWVzdF9nZXR1cmx8aHR0cHJlcXVlc3RfcmVzZXRjb29raWVzfGh0dHByZXF1ZXN0X3NlbmR8aHR0cHJlcXVlc3Rfc2V0Y29udGVudHR5cGV8aHR0cHJlcXVlc3Rfc2V0Y29va2llc3xodHRwcmVxdWVzdF9zZXRoZWFkZXJzfGh0dHByZXF1ZXN0X3NldG1ldGhvZHxodHRwcmVxdWVzdF9zZXRvcHRpb25zfGh0dHByZXF1ZXN0X3NldHBvc3RmaWVsZHN8aHR0cHJlcXVlc3Rfc2V0cG9zdGZpbGVzfGh0dHByZXF1ZXN0X3NldHB1dGRhdGF8aHR0cHJlcXVlc3Rfc2V0cHV0ZmlsZXxodHRwcmVxdWVzdF9zZXRxdWVyeWRhdGF8aHR0cHJlcXVlc3Rfc2V0cmF3cG9zdGRhdGF8aHR0cHJlcXVlc3Rfc2V0c3Nsb3B0aW9uc3xodHRwcmVxdWVzdF9zZXR1cmx8aHR0cHJlcXVlc3Rwb29sfGh0dHByZXF1ZXN0cG9vbF9hdHRhY2h8aHR0cHJlcXVlc3Rwb29sX2NvbnN0cnVjdHxodHRwcmVxdWVzdHBvb2xfZGVzdHJ1Y3R8aHR0cHJlcXVlc3Rwb29sX2RldGFjaHxodHRwcmVxdWVzdHBvb2xfZ2V0YXR0YWNoZWRyZXF1ZXN0c3xodHRwcmVxdWVzdHBvb2xfZ2V0ZmluaXNoZWRyZXF1ZXN0c3xodHRwcmVxdWVzdHBvb2xfcmVzZXR8aHR0cHJlcXVlc3Rwb29sX3NlbmR8aHR0cHJlcXVlc3Rwb29sX3NvY2tldHBlcmZvcm18aHR0cHJlcXVlc3Rwb29sX3NvY2tldHNlbGVjdHxodHRwcmVzcG9uc2V8aHR0cHJlc3BvbnNlX2NhcHR1cmV8aHR0cHJlc3BvbnNlX2dldGJ1ZmZlcnNpemV8aHR0cHJlc3BvbnNlX2dldGNhY2hlfGh0dHByZXNwb25zZV9nZXRjYWNoZWNvbnRyb2x8aHR0cHJlc3BvbnNlX2dldGNvbnRlbnRkaXNwb3NpdGlvbnxodHRwcmVzcG9uc2VfZ2V0Y29udGVudHR5cGV8aHR0cHJlc3BvbnNlX2dldGRhdGF8aHR0cHJlc3BvbnNlX2dldGV0YWd8aHR0cHJlc3BvbnNlX2dldGZpbGV8aHR0cHJlc3BvbnNlX2dldGd6aXB8aHR0cHJlc3BvbnNlX2dldGhlYWRlcnxodHRwcmVzcG9uc2VfZ2V0bGFzdG1vZGlmaWVkfGh0dHByZXNwb25zZV9nZXRyZXF1ZXN0Ym9keXxodHRwcmVzcG9uc2VfZ2V0cmVxdWVzdGJvZHlzdHJlYW18aHR0cHJlc3BvbnNlX2dldHJlcXVlc3RoZWFkZXJzfGh0dHByZXNwb25zZV9nZXRzdHJlYW18aHR0cHJlc3BvbnNlX2dldHRocm90dGxlZGVsYXl8aHR0cHJlc3BvbnNlX2d1ZXNzY29udGVudHR5cGV8aHR0cHJlc3BvbnNlX3JlZGlyZWN0fGh0dHByZXNwb25zZV9zZW5kfGh0dHByZXNwb25zZV9zZXRidWZmZXJzaXplfGh0dHByZXNwb25zZV9zZXRjYWNoZXxodHRwcmVzcG9uc2Vfc2V0Y2FjaGVjb250cm9sfGh0dHByZXNwb25zZV9zZXRjb250ZW50ZGlzcG9zaXRpb258aHR0cHJlc3BvbnNlX3NldGNvbnRlbnR0eXBlfGh0dHByZXNwb25zZV9zZXRkYXRhfGh0dHByZXNwb25zZV9zZXRldGFnfGh0dHByZXNwb25zZV9zZXRmaWxlfGh0dHByZXNwb25zZV9zZXRnemlwfGh0dHByZXNwb25zZV9zZXRoZWFkZXJ8aHR0cHJlc3BvbnNlX3NldGxhc3Rtb2RpZmllZHxodHRwcmVzcG9uc2Vfc2V0c3RyZWFtfGh0dHByZXNwb25zZV9zZXR0aHJvdHRsZWRlbGF5fGh0dHByZXNwb25zZV9zdGF0dXN8aHdfYXJyYXkyb2JqcmVjfGh3X2NoYW5nZW9iamVjdHxod19jaGlsZHJlbnxod19jaGlsZHJlbm9ianxod19jbG9zZXxod19jb25uZWN0fGh3X2Nvbm5lY3Rpb25faW5mb3xod19jcHxod19kZWxldGVvYmplY3R8aHdfZG9jYnlhbmNob3J8aHdfZG9jYnlhbmNob3JvYmp8aHdfZG9jdW1lbnRfYXR0cmlidXRlc3xod19kb2N1bWVudF9ib2R5dGFnfGh3X2RvY3VtZW50X2NvbnRlbnR8aHdfZG9jdW1lbnRfc2V0Y29udGVudHxod19kb2N1bWVudF9zaXplfGh3X2R1bW15fGh3X2VkaXR0ZXh0fGh3X2Vycm9yfGh3X2Vycm9ybXNnfGh3X2ZyZWVfZG9jdW1lbnR8aHdfZ2V0YW5jaG9yc3xod19nZXRhbmNob3Jzb2JqfGh3X2dldGFuZGxvY2t8aHdfZ2V0Y2hpbGRjb2xsfGh3X2dldGNoaWxkY29sbG9ianxod19nZXRjaGlsZGRvY2NvbGx8aHdfZ2V0Y2hpbGRkb2Njb2xsb2JqfGh3X2dldG9iamVjdHxod19nZXRvYmplY3RieXF1ZXJ5fGh3X2dldG9iamVjdGJ5cXVlcnljb2xsfGh3X2dldG9iamVjdGJ5cXVlcnljb2xsb2JqfGh3X2dldG9iamVjdGJ5cXVlcnlvYmp8aHdfZ2V0cGFyZW50c3xod19nZXRwYXJlbnRzb2JqfGh3X2dldHJlbGxpbmt8aHdfZ2V0cmVtb3RlfGh3X2dldHJlbW90ZWNoaWxkcmVufGh3X2dldHNyY2J5ZGVzdG9ianxod19nZXR0ZXh0fGh3X2dldHVzZXJuYW1lfGh3X2lkZW50aWZ5fGh3X2luY29sbGVjdGlvbnN8aHdfaW5mb3xod19pbnNjb2xsfGh3X2luc2RvY3xod19pbnNlcnRhbmNob3JzfGh3X2luc2VydGRvY3VtZW50fGh3X2luc2VydG9iamVjdHxod19tYXBpZHxod19tb2RpZnlvYmplY3R8aHdfbXZ8aHdfbmV3X2RvY3VtZW50fGh3X29ianJlYzJhcnJheXxod19vdXRwdXRfZG9jdW1lbnR8aHdfcGNvbm5lY3R8aHdfcGlwZWRvY3VtZW50fGh3X3Jvb3R8aHdfc2V0bGlua3Jvb3R8aHdfc3RhdHxod191bmxvY2t8aHdfd2hvfGh3YXBpX2F0dHJpYnV0ZXxod2FwaV9hdHRyaWJ1dGVfa2V5fGh3YXBpX2F0dHJpYnV0ZV9sYW5nZGVwdmFsdWV8aHdhcGlfYXR0cmlidXRlX3ZhbHVlfGh3YXBpX2F0dHJpYnV0ZV92YWx1ZXN8aHdhcGlfY2hlY2tpbnxod2FwaV9jaGVja291dHxod2FwaV9jaGlsZHJlbnxod2FwaV9jb250ZW50fGh3YXBpX2NvbnRlbnRfbWltZXR5cGV8aHdhcGlfY29udGVudF9yZWFkfGh3YXBpX2NvcHl8aHdhcGlfZGJzdGF0fGh3YXBpX2Rjc3RhdHxod2FwaV9kc3RhbmNob3JzfGh3YXBpX2RzdG9mc3JjYW5jaG9yfGh3YXBpX2Vycm9yX2NvdW50fGh3YXBpX2Vycm9yX3JlYXNvbnxod2FwaV9maW5kfGh3YXBpX2Z0c3RhdHxod2FwaV9oZ2NzcHxod2FwaV9od3N0YXR8aHdhcGlfaWRlbnRpZnl8aHdhcGlfaW5mb3xod2FwaV9pbnNlcnR8aHdhcGlfaW5zZXJ0YW5jaG9yfGh3YXBpX2luc2VydGNvbGxlY3Rpb258aHdhcGlfaW5zZXJ0ZG9jdW1lbnR8aHdhcGlfbGlua3xod2FwaV9sb2NrfGh3YXBpX21vdmV8aHdhcGlfbmV3X2NvbnRlbnR8aHdhcGlfb2JqZWN0fGh3YXBpX29iamVjdF9hc3NpZ258aHdhcGlfb2JqZWN0X2F0dHJlZGl0YWJsZXxod2FwaV9vYmplY3RfY291bnR8aHdhcGlfb2JqZWN0X2luc2VydHxod2FwaV9vYmplY3RfbmV3fGh3YXBpX29iamVjdF9yZW1vdmV8aHdhcGlfb2JqZWN0X3RpdGxlfGh3YXBpX29iamVjdF92YWx1ZXxod2FwaV9vYmplY3RieWFuY2hvcnxod2FwaV9wYXJlbnRzfGh3YXBpX3JlYXNvbl9kZXNjcmlwdGlvbnxod2FwaV9yZWFzb25fdHlwZXxod2FwaV9yZW1vdmV8aHdhcGlfcmVwbGFjZXxod2FwaV9zZXRjb21taXR0ZWR2ZXJzaW9ufGh3YXBpX3NyY2FuY2hvcnN8aHdhcGlfc3Jjc29mZHN0fGh3YXBpX3VubG9ja3xod2FwaV91c2VyfGh3YXBpX3VzZXJsaXN0fGh5cG90fGliYXNlX2FkZF91c2VyfGliYXNlX2FmZmVjdGVkX3Jvd3N8aWJhc2VfYmFja3VwfGliYXNlX2Jsb2JfYWRkfGliYXNlX2Jsb2JfY2FuY2VsfGliYXNlX2Jsb2JfY2xvc2V8aWJhc2VfYmxvYl9jcmVhdGV8aWJhc2VfYmxvYl9lY2hvfGliYXNlX2Jsb2JfZ2V0fGliYXNlX2Jsb2JfaW1wb3J0fGliYXNlX2Jsb2JfaW5mb3xpYmFzZV9ibG9iX29wZW58aWJhc2VfY2xvc2V8aWJhc2VfY29tbWl0fGliYXNlX2NvbW1pdF9yZXR8aWJhc2VfY29ubmVjdHxpYmFzZV9kYl9pbmZvfGliYXNlX2RlbGV0ZV91c2VyfGliYXNlX2Ryb3BfZGJ8aWJhc2VfZXJyY29kZXxpYmFzZV9lcnJtc2d8aWJhc2VfZXhlY3V0ZXxpYmFzZV9mZXRjaF9hc3NvY3xpYmFzZV9mZXRjaF9vYmplY3R8aWJhc2VfZmV0Y2hfcm93fGliYXNlX2ZpZWxkX2luZm98aWJhc2VfZnJlZV9ldmVudF9oYW5kbGVyfGliYXNlX2ZyZWVfcXVlcnl8aWJhc2VfZnJlZV9yZXN1bHR8aWJhc2VfZ2VuX2lkfGliYXNlX21haW50YWluX2RifGliYXNlX21vZGlmeV91c2VyfGliYXNlX25hbWVfcmVzdWx0fGliYXNlX251bV9maWVsZHN8aWJhc2VfbnVtX3BhcmFtc3xpYmFzZV9wYXJhbV9pbmZvfGliYXNlX3Bjb25uZWN0fGliYXNlX3ByZXBhcmV8aWJhc2VfcXVlcnl8aWJhc2VfcmVzdG9yZXxpYmFzZV9yb2xsYmFja3xpYmFzZV9yb2xsYmFja19yZXR8aWJhc2Vfc2VydmVyX2luZm98aWJhc2Vfc2VydmljZV9hdHRhY2h8aWJhc2Vfc2VydmljZV9kZXRhY2h8aWJhc2Vfc2V0X2V2ZW50X2hhbmRsZXJ8aWJhc2VfdGltZWZtdHxpYmFzZV90cmFuc3xpYmFzZV93YWl0X2V2ZW50fGljb252fGljb252X2dldF9lbmNvZGluZ3xpY29udl9taW1lX2RlY29kZXxpY29udl9taW1lX2RlY29kZV9oZWFkZXJzfGljb252X21pbWVfZW5jb2RlfGljb252X3NldF9lbmNvZGluZ3xpY29udl9zdHJsZW58aWNvbnZfc3RycG9zfGljb252X3N0cnJwb3N8aWNvbnZfc3Vic3RyfGlkM19nZXRfZnJhbWVfbG9uZ19uYW1lfGlkM19nZXRfZnJhbWVfc2hvcnRfbmFtZXxpZDNfZ2V0X2dlbnJlX2lkfGlkM19nZXRfZ2VucmVfbGlzdHxpZDNfZ2V0X2dlbnJlX25hbWV8aWQzX2dldF90YWd8aWQzX2dldF92ZXJzaW9ufGlkM19yZW1vdmVfdGFnfGlkM19zZXRfdGFnfGlkM3YyYXR0YWNoZWRwaWN0dXJlZnJhbWV8aWQzdjJmcmFtZXxpZDN2MnRhZ3xpZGF0ZXxpZG5fdG9fYXNjaWl8aWRuX3RvX3VuaWNvZGV8aWRuX3RvX3V0Zjh8aWZ4X2FmZmVjdGVkX3Jvd3N8aWZ4X2Jsb2JpbmZpbGVfbW9kZXxpZnhfYnl0ZWFzdmFyY2hhcnxpZnhfY2xvc2V8aWZ4X2Nvbm5lY3R8aWZ4X2NvcHlfYmxvYnxpZnhfY3JlYXRlX2Jsb2J8aWZ4X2NyZWF0ZV9jaGFyfGlmeF9kb3xpZnhfZXJyb3J8aWZ4X2Vycm9ybXNnfGlmeF9mZXRjaF9yb3d8aWZ4X2ZpZWxkcHJvcGVydGllc3xpZnhfZmllbGR0eXBlc3xpZnhfZnJlZV9ibG9ifGlmeF9mcmVlX2NoYXJ8aWZ4X2ZyZWVfcmVzdWx0fGlmeF9nZXRfYmxvYnxpZnhfZ2V0X2NoYXJ8aWZ4X2dldHNxbGNhfGlmeF9odG1sdGJsX3Jlc3VsdHxpZnhfbnVsbGZvcm1hdHxpZnhfbnVtX2ZpZWxkc3xpZnhfbnVtX3Jvd3N8aWZ4X3Bjb25uZWN0fGlmeF9wcmVwYXJlfGlmeF9xdWVyeXxpZnhfdGV4dGFzdmFyY2hhcnxpZnhfdXBkYXRlX2Jsb2J8aWZ4X3VwZGF0ZV9jaGFyfGlmeHVzX2Nsb3NlX3Nsb2J8aWZ4dXNfY3JlYXRlX3Nsb2J8aWZ4dXNfZnJlZV9zbG9ifGlmeHVzX29wZW5fc2xvYnxpZnh1c19yZWFkX3Nsb2J8aWZ4dXNfc2Vla19zbG9ifGlmeHVzX3RlbGxfc2xvYnxpZnh1c193cml0ZV9zbG9ifGlnbm9yZV91c2VyX2Fib3J0fGlpc19hZGRfc2VydmVyfGlpc19nZXRfZGlyX3NlY3VyaXR5fGlpc19nZXRfc2NyaXB0X21hcHxpaXNfZ2V0X3NlcnZlcl9ieV9jb21tZW50fGlpc19nZXRfc2VydmVyX2J5X3BhdGh8aWlzX2dldF9zZXJ2ZXJfcmlnaHRzfGlpc19nZXRfc2VydmljZV9zdGF0ZXxpaXNfcmVtb3ZlX3NlcnZlcnxpaXNfc2V0X2FwcF9zZXR0aW5nc3xpaXNfc2V0X2Rpcl9zZWN1cml0eXxpaXNfc2V0X3NjcmlwdF9tYXB8aWlzX3NldF9zZXJ2ZXJfcmlnaHRzfGlpc19zdGFydF9zZXJ2ZXJ8aWlzX3N0YXJ0X3NlcnZpY2V8aWlzX3N0b3Bfc2VydmVyfGlpc19zdG9wX3NlcnZpY2V8aW1hZ2Uyd2JtcHxpbWFnZV90eXBlX3RvX2V4dGVuc2lvbnxpbWFnZV90eXBlX3RvX21pbWVfdHlwZXxpbWFnZWFscGhhYmxlbmRpbmd8aW1hZ2VhbnRpYWxpYXN8aW1hZ2VhcmN8aW1hZ2VjaGFyfGltYWdlY2hhcnVwfGltYWdlY29sb3JhbGxvY2F0ZXxpbWFnZWNvbG9yYWxsb2NhdGVhbHBoYXxpbWFnZWNvbG9yYXR8aW1hZ2Vjb2xvcmNsb3Nlc3R8aW1hZ2Vjb2xvcmNsb3Nlc3RhbHBoYXxpbWFnZWNvbG9yY2xvc2VzdGh3YnxpbWFnZWNvbG9yZGVhbGxvY2F0ZXxpbWFnZWNvbG9yZXhhY3R8aW1hZ2Vjb2xvcmV4YWN0YWxwaGF8aW1hZ2Vjb2xvcm1hdGNofGltYWdlY29sb3JyZXNvbHZlfGltYWdlY29sb3JyZXNvbHZlYWxwaGF8aW1hZ2Vjb2xvcnNldHxpbWFnZWNvbG9yc2ZvcmluZGV4fGltYWdlY29sb3JzdG90YWx8aW1hZ2Vjb2xvcnRyYW5zcGFyZW50fGltYWdlY29udm9sdXRpb258aW1hZ2Vjb3B5fGltYWdlY29weW1lcmdlfGltYWdlY29weW1lcmdlZ3JheXxpbWFnZWNvcHlyZXNhbXBsZWR8aW1hZ2Vjb3B5cmVzaXplZHxpbWFnZWNyZWF0ZXxpbWFnZWNyZWF0ZWZyb21nZHxpbWFnZWNyZWF0ZWZyb21nZDJ8aW1hZ2VjcmVhdGVmcm9tZ2QycGFydHxpbWFnZWNyZWF0ZWZyb21naWZ8aW1hZ2VjcmVhdGVmcm9tanBlZ3xpbWFnZWNyZWF0ZWZyb21wbmd8aW1hZ2VjcmVhdGVmcm9tc3RyaW5nfGltYWdlY3JlYXRlZnJvbXdibXB8aW1hZ2VjcmVhdGVmcm9teGJtfGltYWdlY3JlYXRlZnJvbXhwbXxpbWFnZWNyZWF0ZXRydWVjb2xvcnxpbWFnZWRhc2hlZGxpbmV8aW1hZ2VkZXN0cm95fGltYWdlZWxsaXBzZXxpbWFnZWZpbGx8aW1hZ2VmaWxsZWRhcmN8aW1hZ2VmaWxsZWRlbGxpcHNlfGltYWdlZmlsbGVkcG9seWdvbnxpbWFnZWZpbGxlZHJlY3RhbmdsZXxpbWFnZWZpbGx0b2JvcmRlcnxpbWFnZWZpbHRlcnxpbWFnZWZvbnRoZWlnaHR8aW1hZ2Vmb250d2lkdGh8aW1hZ2VmdGJib3h8aW1hZ2VmdHRleHR8aW1hZ2VnYW1tYWNvcnJlY3R8aW1hZ2VnZHxpbWFnZWdkMnxpbWFnZWdpZnxpbWFnZWdyYWJzY3JlZW58aW1hZ2VncmFid2luZG93fGltYWdlaW50ZXJsYWNlfGltYWdlaXN0cnVlY29sb3J8aW1hZ2VqcGVnfGltYWdlbGF5ZXJlZmZlY3R8aW1hZ2VsaW5lfGltYWdlbG9hZGZvbnR8aW1hZ2VwYWxldHRlY29weXxpbWFnZXBuZ3xpbWFnZXBvbHlnb258aW1hZ2Vwc2Jib3h8aW1hZ2Vwc2VuY29kZWZvbnR8aW1hZ2Vwc2V4dGVuZGZvbnR8aW1hZ2Vwc2ZyZWVmb250fGltYWdlcHNsb2FkZm9udHxpbWFnZXBzc2xhbnRmb250fGltYWdlcHN0ZXh0fGltYWdlcmVjdGFuZ2xlfGltYWdlcm90YXRlfGltYWdlc2F2ZWFscGhhfGltYWdlc2V0YnJ1c2h8aW1hZ2VzZXRwaXhlbHxpbWFnZXNldHN0eWxlfGltYWdlc2V0dGhpY2tuZXNzfGltYWdlc2V0dGlsZXxpbWFnZXN0cmluZ3xpbWFnZXN0cmluZ3VwfGltYWdlc3h8aW1hZ2VzeXxpbWFnZXRydWVjb2xvcnRvcGFsZXR0ZXxpbWFnZXR0ZmJib3h8aW1hZ2V0dGZ0ZXh0fGltYWdldHlwZXN8aW1hZ2V3Ym1wfGltYWdleGJtfGltYWdpY2t8aW1hZ2lja19hZGFwdGl2ZWJsdXJpbWFnZXxpbWFnaWNrX2FkYXB0aXZlcmVzaXplaW1hZ2V8aW1hZ2lja19hZGFwdGl2ZXNoYXJwZW5pbWFnZXxpbWFnaWNrX2FkYXB0aXZldGhyZXNob2xkaW1hZ2V8aW1hZ2lja19hZGRpbWFnZXxpbWFnaWNrX2FkZG5vaXNlaW1hZ2V8aW1hZ2lja19hZmZpbmV0cmFuc2Zvcm1pbWFnZXxpbWFnaWNrX2FuaW1hdGVpbWFnZXN8aW1hZ2lja19hbm5vdGF0ZWltYWdlfGltYWdpY2tfYXBwZW5kaW1hZ2VzfGltYWdpY2tfYXZlcmFnZWltYWdlc3xpbWFnaWNrX2JsYWNrdGhyZXNob2xkaW1hZ2V8aW1hZ2lja19ibHVyaW1hZ2V8aW1hZ2lja19ib3JkZXJpbWFnZXxpbWFnaWNrX2NoYXJjb2FsaW1hZ2V8aW1hZ2lja19jaG9waW1hZ2V8aW1hZ2lja19jbGVhcnxpbWFnaWNrX2NsaXBpbWFnZXxpbWFnaWNrX2NsaXBwYXRoaW1hZ2V8aW1hZ2lja19jbG9uZXxpbWFnaWNrX2NsdXRpbWFnZXxpbWFnaWNrX2NvYWxlc2NlaW1hZ2VzfGltYWdpY2tfY29sb3JmbG9vZGZpbGxpbWFnZXxpbWFnaWNrX2NvbG9yaXplaW1hZ2V8aW1hZ2lja19jb21iaW5laW1hZ2VzfGltYWdpY2tfY29tbWVudGltYWdlfGltYWdpY2tfY29tcGFyZWltYWdlY2hhbm5lbHN8aW1hZ2lja19jb21wYXJlaW1hZ2VsYXllcnN8aW1hZ2lja19jb21wYXJlaW1hZ2VzfGltYWdpY2tfY29tcG9zaXRlaW1hZ2V8aW1hZ2lja19jb25zdHJ1Y3R8aW1hZ2lja19jb250cmFzdGltYWdlfGltYWdpY2tfY29udHJhc3RzdHJldGNoaW1hZ2V8aW1hZ2lja19jb252b2x2ZWltYWdlfGltYWdpY2tfY3JvcGltYWdlfGltYWdpY2tfY3JvcHRodW1ibmFpbGltYWdlfGltYWdpY2tfY3VycmVudHxpbWFnaWNrX2N5Y2xlY29sb3JtYXBpbWFnZXxpbWFnaWNrX2RlY2lwaGVyaW1hZ2V8aW1hZ2lja19kZWNvbnN0cnVjdGltYWdlc3xpbWFnaWNrX2RlbGV0ZWltYWdlYXJ0aWZhY3R8aW1hZ2lja19kZXNwZWNrbGVpbWFnZXxpbWFnaWNrX2Rlc3Ryb3l8aW1hZ2lja19kaXNwbGF5aW1hZ2V8aW1hZ2lja19kaXNwbGF5aW1hZ2VzfGltYWdpY2tfZGlzdG9ydGltYWdlfGltYWdpY2tfZHJhd2ltYWdlfGltYWdpY2tfZWRnZWltYWdlfGltYWdpY2tfZW1ib3NzaW1hZ2V8aW1hZ2lja19lbmNpcGhlcmltYWdlfGltYWdpY2tfZW5oYW5jZWltYWdlfGltYWdpY2tfZXF1YWxpemVpbWFnZXxpbWFnaWNrX2V2YWx1YXRlaW1hZ2V8aW1hZ2lja19leHRlbnRpbWFnZXxpbWFnaWNrX2ZsYXR0ZW5pbWFnZXN8aW1hZ2lja19mbGlwaW1hZ2V8aW1hZ2lja19mbG9vZGZpbGxwYWludGltYWdlfGltYWdpY2tfZmxvcGltYWdlfGltYWdpY2tfZnJhbWVpbWFnZXxpbWFnaWNrX2Z4aW1hZ2V8aW1hZ2lja19nYW1tYWltYWdlfGltYWdpY2tfZ2F1c3NpYW5ibHVyaW1hZ2V8aW1hZ2lja19nZXRjb2xvcnNwYWNlfGltYWdpY2tfZ2V0Y29tcHJlc3Npb258aW1hZ2lja19nZXRjb21wcmVzc2lvbnF1YWxpdHl8aW1hZ2lja19nZXRjb3B5cmlnaHR8aW1hZ2lja19nZXRmaWxlbmFtZXxpbWFnaWNrX2dldGZvbnR8aW1hZ2lja19nZXRmb3JtYXR8aW1hZ2lja19nZXRncmF2aXR5fGltYWdpY2tfZ2V0aG9tZXVybHxpbWFnaWNrX2dldGltYWdlfGltYWdpY2tfZ2V0aW1hZ2VhbHBoYWNoYW5uZWx8aW1hZ2lja19nZXRpbWFnZWFydGlmYWN0fGltYWdpY2tfZ2V0aW1hZ2ViYWNrZ3JvdW5kY29sb3J8aW1hZ2lja19nZXRpbWFnZWJsb2J8aW1hZ2lja19nZXRpbWFnZWJsdWVwcmltYXJ5fGltYWdpY2tfZ2V0aW1hZ2Vib3JkZXJjb2xvcnxpbWFnaWNrX2dldGltYWdlY2hhbm5lbGRlcHRofGltYWdpY2tfZ2V0aW1hZ2VjaGFubmVsZGlzdG9ydGlvbnxpbWFnaWNrX2dldGltYWdlY2hhbm5lbGRpc3RvcnRpb25zfGltYWdpY2tfZ2V0aW1hZ2VjaGFubmVsZXh0cmVtYXxpbWFnaWNrX2dldGltYWdlY2hhbm5lbG1lYW58aW1hZ2lja19nZXRpbWFnZWNoYW5uZWxyYW5nZXxpbWFnaWNrX2dldGltYWdlY2hhbm5lbHN0YXRpc3RpY3N8aW1hZ2lja19nZXRpbWFnZWNsaXBtYXNrfGltYWdpY2tfZ2V0aW1hZ2Vjb2xvcm1hcGNvbG9yfGltYWdpY2tfZ2V0aW1hZ2Vjb2xvcnN8aW1hZ2lja19nZXRpbWFnZWNvbG9yc3BhY2V8aW1hZ2lja19nZXRpbWFnZWNvbXBvc2V8aW1hZ2lja19nZXRpbWFnZWNvbXByZXNzaW9ufGltYWdpY2tfZ2V0aW1hZ2Vjb21wcmVzc2lvbnF1YWxpdHl8aW1hZ2lja19nZXRpbWFnZWRlbGF5fGltYWdpY2tfZ2V0aW1hZ2VkZXB0aHxpbWFnaWNrX2dldGltYWdlZGlzcG9zZXxpbWFnaWNrX2dldGltYWdlZGlzdG9ydGlvbnxpbWFnaWNrX2dldGltYWdlZXh0cmVtYXxpbWFnaWNrX2dldGltYWdlZmlsZW5hbWV8aW1hZ2lja19nZXRpbWFnZWZvcm1hdHxpbWFnaWNrX2dldGltYWdlZ2FtbWF8aW1hZ2lja19nZXRpbWFnZWdlb21ldHJ5fGltYWdpY2tfZ2V0aW1hZ2VncmF2aXR5fGltYWdpY2tfZ2V0aW1hZ2VncmVlbnByaW1hcnl8aW1hZ2lja19nZXRpbWFnZWhlaWdodHxpbWFnaWNrX2dldGltYWdlaGlzdG9ncmFtfGltYWdpY2tfZ2V0aW1hZ2VpbmRleHxpbWFnaWNrX2dldGltYWdlaW50ZXJsYWNlc2NoZW1lfGltYWdpY2tfZ2V0aW1hZ2VpbnRlcnBvbGF0ZW1ldGhvZHxpbWFnaWNrX2dldGltYWdlaXRlcmF0aW9uc3xpbWFnaWNrX2dldGltYWdlbGVuZ3RofGltYWdpY2tfZ2V0aW1hZ2VtYWdpY2tsaWNlbnNlfGltYWdpY2tfZ2V0aW1hZ2VtYXR0ZXxpbWFnaWNrX2dldGltYWdlbWF0dGVjb2xvcnxpbWFnaWNrX2dldGltYWdlb3JpZW50YXRpb258aW1hZ2lja19nZXRpbWFnZXBhZ2V8aW1hZ2lja19nZXRpbWFnZXBpeGVsY29sb3J8aW1hZ2lja19nZXRpbWFnZXByb2ZpbGV8aW1hZ2lja19nZXRpbWFnZXByb2ZpbGVzfGltYWdpY2tfZ2V0aW1hZ2Vwcm9wZXJ0aWVzfGltYWdpY2tfZ2V0aW1hZ2Vwcm9wZXJ0eXxpbWFnaWNrX2dldGltYWdlcmVkcHJpbWFyeXxpbWFnaWNrX2dldGltYWdlcmVnaW9ufGltYWdpY2tfZ2V0aW1hZ2VyZW5kZXJpbmdpbnRlbnR8aW1hZ2lja19nZXRpbWFnZXJlc29sdXRpb258aW1hZ2lja19nZXRpbWFnZXNibG9ifGltYWdpY2tfZ2V0aW1hZ2VzY2VuZXxpbWFnaWNrX2dldGltYWdlc2lnbmF0dXJlfGltYWdpY2tfZ2V0aW1hZ2VzaXplfGltYWdpY2tfZ2V0aW1hZ2V0aWNrc3BlcnNlY29uZHxpbWFnaWNrX2dldGltYWdldG90YWxpbmtkZW5zaXR5fGltYWdpY2tfZ2V0aW1hZ2V0eXBlfGltYWdpY2tfZ2V0aW1hZ2V1bml0c3xpbWFnaWNrX2dldGltYWdldmlydHVhbHBpeGVsbWV0aG9kfGltYWdpY2tfZ2V0aW1hZ2V3aGl0ZXBvaW50fGltYWdpY2tfZ2V0aW1hZ2V3aWR0aHxpbWFnaWNrX2dldGludGVybGFjZXNjaGVtZXxpbWFnaWNrX2dldGl0ZXJhdG9yaW5kZXh8aW1hZ2lja19nZXRudW1iZXJpbWFnZXN8aW1hZ2lja19nZXRvcHRpb258aW1hZ2lja19nZXRwYWNrYWdlbmFtZXxpbWFnaWNrX2dldHBhZ2V8aW1hZ2lja19nZXRwaXhlbGl0ZXJhdG9yfGltYWdpY2tfZ2V0cGl4ZWxyZWdpb25pdGVyYXRvcnxpbWFnaWNrX2dldHBvaW50c2l6ZXxpbWFnaWNrX2dldHF1YW50dW1kZXB0aHxpbWFnaWNrX2dldHF1YW50dW1yYW5nZXxpbWFnaWNrX2dldHJlbGVhc2VkYXRlfGltYWdpY2tfZ2V0cmVzb3VyY2V8aW1hZ2lja19nZXRyZXNvdXJjZWxpbWl0fGltYWdpY2tfZ2V0c2FtcGxpbmdmYWN0b3JzfGltYWdpY2tfZ2V0c2l6ZXxpbWFnaWNrX2dldHNpemVvZmZzZXR8aW1hZ2lja19nZXR2ZXJzaW9ufGltYWdpY2tfaGFzbmV4dGltYWdlfGltYWdpY2tfaGFzcHJldmlvdXNpbWFnZXxpbWFnaWNrX2lkZW50aWZ5aW1hZ2V8aW1hZ2lja19pbXBsb2RlaW1hZ2V8aW1hZ2lja19sYWJlbGltYWdlfGltYWdpY2tfbGV2ZWxpbWFnZXxpbWFnaWNrX2xpbmVhcnN0cmV0Y2hpbWFnZXxpbWFnaWNrX2xpcXVpZHJlc2NhbGVpbWFnZXxpbWFnaWNrX21hZ25pZnlpbWFnZXxpbWFnaWNrX21hcGltYWdlfGltYWdpY2tfbWF0dGVmbG9vZGZpbGxpbWFnZXxpbWFnaWNrX21lZGlhbmZpbHRlcmltYWdlfGltYWdpY2tfbWVyZ2VpbWFnZWxheWVyc3xpbWFnaWNrX21pbmlmeWltYWdlfGltYWdpY2tfbW9kdWxhdGVpbWFnZXxpbWFnaWNrX21vbnRhZ2VpbWFnZXxpbWFnaWNrX21vcnBoaW1hZ2VzfGltYWdpY2tfbW9zYWljaW1hZ2VzfGltYWdpY2tfbW90aW9uYmx1cmltYWdlfGltYWdpY2tfbmVnYXRlaW1hZ2V8aW1hZ2lja19uZXdpbWFnZXxpbWFnaWNrX25ld3BzZXVkb2ltYWdlfGltYWdpY2tfbmV4dGltYWdlfGltYWdpY2tfbm9ybWFsaXplaW1hZ2V8aW1hZ2lja19vaWxwYWludGltYWdlfGltYWdpY2tfb3BhcXVlcGFpbnRpbWFnZXxpbWFnaWNrX29wdGltaXplaW1hZ2VsYXllcnN8aW1hZ2lja19vcmRlcmVkcG9zdGVyaXplaW1hZ2V8aW1hZ2lja19wYWludGZsb29kZmlsbGltYWdlfGltYWdpY2tfcGFpbnRvcGFxdWVpbWFnZXxpbWFnaWNrX3BhaW50dHJhbnNwYXJlbnRpbWFnZXxpbWFnaWNrX3BpbmdpbWFnZXxpbWFnaWNrX3BpbmdpbWFnZWJsb2J8aW1hZ2lja19waW5naW1hZ2VmaWxlfGltYWdpY2tfcG9sYXJvaWRpbWFnZXxpbWFnaWNrX3Bvc3Rlcml6ZWltYWdlfGltYWdpY2tfcHJldmlld2ltYWdlc3xpbWFnaWNrX3ByZXZpb3VzaW1hZ2V8aW1hZ2lja19wcm9maWxlaW1hZ2V8aW1hZ2lja19xdWFudGl6ZWltYWdlfGltYWdpY2tfcXVhbnRpemVpbWFnZXN8aW1hZ2lja19xdWVyeWZvbnRtZXRyaWNzfGltYWdpY2tfcXVlcnlmb250c3xpbWFnaWNrX3F1ZXJ5Zm9ybWF0c3xpbWFnaWNrX3JhZGlhbGJsdXJpbWFnZXxpbWFnaWNrX3JhaXNlaW1hZ2V8aW1hZ2lja19yYW5kb210aHJlc2hvbGRpbWFnZXxpbWFnaWNrX3JlYWRpbWFnZXxpbWFnaWNrX3JlYWRpbWFnZWJsb2J8aW1hZ2lja19yZWFkaW1hZ2VmaWxlfGltYWdpY2tfcmVjb2xvcmltYWdlfGltYWdpY2tfcmVkdWNlbm9pc2VpbWFnZXxpbWFnaWNrX3JlbW92ZWltYWdlfGltYWdpY2tfcmVtb3ZlaW1hZ2Vwcm9maWxlfGltYWdpY2tfcmVuZGVyfGltYWdpY2tfcmVzYW1wbGVpbWFnZXxpbWFnaWNrX3Jlc2V0aW1hZ2VwYWdlfGltYWdpY2tfcmVzaXplaW1hZ2V8aW1hZ2lja19yb2xsaW1hZ2V8aW1hZ2lja19yb3RhdGVpbWFnZXxpbWFnaWNrX3JvdW5kY29ybmVyc3xpbWFnaWNrX3NhbXBsZWltYWdlfGltYWdpY2tfc2NhbGVpbWFnZXxpbWFnaWNrX3NlcGFyYXRlaW1hZ2VjaGFubmVsfGltYWdpY2tfc2VwaWF0b25laW1hZ2V8aW1hZ2lja19zZXRiYWNrZ3JvdW5kY29sb3J8aW1hZ2lja19zZXRjb2xvcnNwYWNlfGltYWdpY2tfc2V0Y29tcHJlc3Npb258aW1hZ2lja19zZXRjb21wcmVzc2lvbnF1YWxpdHl8aW1hZ2lja19zZXRmaWxlbmFtZXxpbWFnaWNrX3NldGZpcnN0aXRlcmF0b3J8aW1hZ2lja19zZXRmb250fGltYWdpY2tfc2V0Zm9ybWF0fGltYWdpY2tfc2V0Z3Jhdml0eXxpbWFnaWNrX3NldGltYWdlfGltYWdpY2tfc2V0aW1hZ2VhbHBoYWNoYW5uZWx8aW1hZ2lja19zZXRpbWFnZWFydGlmYWN0fGltYWdpY2tfc2V0aW1hZ2ViYWNrZ3JvdW5kY29sb3J8aW1hZ2lja19zZXRpbWFnZWJpYXN8aW1hZ2lja19zZXRpbWFnZWJsdWVwcmltYXJ5fGltYWdpY2tfc2V0aW1hZ2Vib3JkZXJjb2xvcnxpbWFnaWNrX3NldGltYWdlY2hhbm5lbGRlcHRofGltYWdpY2tfc2V0aW1hZ2VjbGlwbWFza3xpbWFnaWNrX3NldGltYWdlY29sb3JtYXBjb2xvcnxpbWFnaWNrX3NldGltYWdlY29sb3JzcGFjZXxpbWFnaWNrX3NldGltYWdlY29tcG9zZXxpbWFnaWNrX3NldGltYWdlY29tcHJlc3Npb258aW1hZ2lja19zZXRpbWFnZWNvbXByZXNzaW9ucXVhbGl0eXxpbWFnaWNrX3NldGltYWdlZGVsYXl8aW1hZ2lja19zZXRpbWFnZWRlcHRofGltYWdpY2tfc2V0aW1hZ2VkaXNwb3NlfGltYWdpY2tfc2V0aW1hZ2VleHRlbnR8aW1hZ2lja19zZXRpbWFnZWZpbGVuYW1lfGltYWdpY2tfc2V0aW1hZ2Vmb3JtYXR8aW1hZ2lja19zZXRpbWFnZWdhbW1hfGltYWdpY2tfc2V0aW1hZ2VncmF2aXR5fGltYWdpY2tfc2V0aW1hZ2VncmVlbnByaW1hcnl8aW1hZ2lja19zZXRpbWFnZWluZGV4fGltYWdpY2tfc2V0aW1hZ2VpbnRlcmxhY2VzY2hlbWV8aW1hZ2lja19zZXRpbWFnZWludGVycG9sYXRlbWV0aG9kfGltYWdpY2tfc2V0aW1hZ2VpdGVyYXRpb25zfGltYWdpY2tfc2V0aW1hZ2VtYXR0ZXxpbWFnaWNrX3NldGltYWdlbWF0dGVjb2xvcnxpbWFnaWNrX3NldGltYWdlb3BhY2l0eXxpbWFnaWNrX3NldGltYWdlb3JpZW50YXRpb258aW1hZ2lja19zZXRpbWFnZXBhZ2V8aW1hZ2lja19zZXRpbWFnZXByb2ZpbGV8aW1hZ2lja19zZXRpbWFnZXByb3BlcnR5fGltYWdpY2tfc2V0aW1hZ2VyZWRwcmltYXJ5fGltYWdpY2tfc2V0aW1hZ2VyZW5kZXJpbmdpbnRlbnR8aW1hZ2lja19zZXRpbWFnZXJlc29sdXRpb258aW1hZ2lja19zZXRpbWFnZXNjZW5lfGltYWdpY2tfc2V0aW1hZ2V0aWNrc3BlcnNlY29uZHxpbWFnaWNrX3NldGltYWdldHlwZXxpbWFnaWNrX3NldGltYWdldW5pdHN8aW1hZ2lja19zZXRpbWFnZXZpcnR1YWxwaXhlbG1ldGhvZHxpbWFnaWNrX3NldGltYWdld2hpdGVwb2ludHxpbWFnaWNrX3NldGludGVybGFjZXNjaGVtZXxpbWFnaWNrX3NldGl0ZXJhdG9yaW5kZXh8aW1hZ2lja19zZXRsYXN0aXRlcmF0b3J8aW1hZ2lja19zZXRvcHRpb258aW1hZ2lja19zZXRwYWdlfGltYWdpY2tfc2V0cG9pbnRzaXplfGltYWdpY2tfc2V0cmVzb2x1dGlvbnxpbWFnaWNrX3NldHJlc291cmNlbGltaXR8aW1hZ2lja19zZXRzYW1wbGluZ2ZhY3RvcnN8aW1hZ2lja19zZXRzaXplfGltYWdpY2tfc2V0c2l6ZW9mZnNldHxpbWFnaWNrX3NldHR5cGV8aW1hZ2lja19zaGFkZWltYWdlfGltYWdpY2tfc2hhZG93aW1hZ2V8aW1hZ2lja19zaGFycGVuaW1hZ2V8aW1hZ2lja19zaGF2ZWltYWdlfGltYWdpY2tfc2hlYXJpbWFnZXxpbWFnaWNrX3NpZ21vaWRhbGNvbnRyYXN0aW1hZ2V8aW1hZ2lja19za2V0Y2hpbWFnZXxpbWFnaWNrX3NvbGFyaXplaW1hZ2V8aW1hZ2lja19zcGxpY2VpbWFnZXxpbWFnaWNrX3NwcmVhZGltYWdlfGltYWdpY2tfc3RlZ2Fub2ltYWdlfGltYWdpY2tfc3RlcmVvaW1hZ2V8aW1hZ2lja19zdHJpcGltYWdlfGltYWdpY2tfc3dpcmxpbWFnZXxpbWFnaWNrX3RleHR1cmVpbWFnZXxpbWFnaWNrX3RocmVzaG9sZGltYWdlfGltYWdpY2tfdGh1bWJuYWlsaW1hZ2V8aW1hZ2lja190aW50aW1hZ2V8aW1hZ2lja190cmFuc2Zvcm1pbWFnZXxpbWFnaWNrX3RyYW5zcGFyZW50cGFpbnRpbWFnZXxpbWFnaWNrX3RyYW5zcG9zZWltYWdlfGltYWdpY2tfdHJhbnN2ZXJzZWltYWdlfGltYWdpY2tfdHJpbWltYWdlfGltYWdpY2tfdW5pcXVlaW1hZ2Vjb2xvcnN8aW1hZ2lja191bnNoYXJwbWFza2ltYWdlfGltYWdpY2tfdmFsaWR8aW1hZ2lja192aWduZXR0ZWltYWdlfGltYWdpY2tfd2F2ZWltYWdlfGltYWdpY2tfd2hpdGV0aHJlc2hvbGRpbWFnZXxpbWFnaWNrX3dyaXRlaW1hZ2V8aW1hZ2lja193cml0ZWltYWdlZmlsZXxpbWFnaWNrX3dyaXRlaW1hZ2VzfGltYWdpY2tfd3JpdGVpbWFnZXNmaWxlfGltYWdpY2tkcmF3fGltYWdpY2tkcmF3X2FmZmluZXxpbWFnaWNrZHJhd19hbm5vdGF0aW9ufGltYWdpY2tkcmF3X2FyY3xpbWFnaWNrZHJhd19iZXppZXJ8aW1hZ2lja2RyYXdfY2lyY2xlfGltYWdpY2tkcmF3X2NsZWFyfGltYWdpY2tkcmF3X2Nsb25lfGltYWdpY2tkcmF3X2NvbG9yfGltYWdpY2tkcmF3X2NvbW1lbnR8aW1hZ2lja2RyYXdfY29tcG9zaXRlfGltYWdpY2tkcmF3X2NvbnN0cnVjdHxpbWFnaWNrZHJhd19kZXN0cm95fGltYWdpY2tkcmF3X2VsbGlwc2V8aW1hZ2lja2RyYXdfZ2V0Y2xpcHBhdGh8aW1hZ2lja2RyYXdfZ2V0Y2xpcHJ1bGV8aW1hZ2lja2RyYXdfZ2V0Y2xpcHVuaXRzfGltYWdpY2tkcmF3X2dldGZpbGxjb2xvcnxpbWFnaWNrZHJhd19nZXRmaWxsb3BhY2l0eXxpbWFnaWNrZHJhd19nZXRmaWxscnVsZXxpbWFnaWNrZHJhd19nZXRmb250fGltYWdpY2tkcmF3X2dldGZvbnRmYW1pbHl8aW1hZ2lja2RyYXdfZ2V0Zm9udHNpemV8aW1hZ2lja2RyYXdfZ2V0Zm9udHN0eWxlfGltYWdpY2tkcmF3X2dldGZvbnR3ZWlnaHR8aW1hZ2lja2RyYXdfZ2V0Z3Jhdml0eXxpbWFnaWNrZHJhd19nZXRzdHJva2VhbnRpYWxpYXN8aW1hZ2lja2RyYXdfZ2V0c3Ryb2tlY29sb3J8aW1hZ2lja2RyYXdfZ2V0c3Ryb2tlZGFzaGFycmF5fGltYWdpY2tkcmF3X2dldHN0cm9rZWRhc2hvZmZzZXR8aW1hZ2lja2RyYXdfZ2V0c3Ryb2tlbGluZWNhcHxpbWFnaWNrZHJhd19nZXRzdHJva2VsaW5lam9pbnxpbWFnaWNrZHJhd19nZXRzdHJva2VtaXRlcmxpbWl0fGltYWdpY2tkcmF3X2dldHN0cm9rZW9wYWNpdHl8aW1hZ2lja2RyYXdfZ2V0c3Ryb2tld2lkdGh8aW1hZ2lja2RyYXdfZ2V0dGV4dGFsaWdubWVudHxpbWFnaWNrZHJhd19nZXR0ZXh0YW50aWFsaWFzfGltYWdpY2tkcmF3X2dldHRleHRkZWNvcmF0aW9ufGltYWdpY2tkcmF3X2dldHRleHRlbmNvZGluZ3xpbWFnaWNrZHJhd19nZXR0ZXh0dW5kZXJjb2xvcnxpbWFnaWNrZHJhd19nZXR2ZWN0b3JncmFwaGljc3xpbWFnaWNrZHJhd19saW5lfGltYWdpY2tkcmF3X21hdHRlfGltYWdpY2tkcmF3X3BhdGhjbG9zZXxpbWFnaWNrZHJhd19wYXRoY3VydmV0b2Fic29sdXRlfGltYWdpY2tkcmF3X3BhdGhjdXJ2ZXRvcXVhZHJhdGljYmV6aWVyYWJzb2x1dGV8aW1hZ2lja2RyYXdfcGF0aGN1cnZldG9xdWFkcmF0aWNiZXppZXJyZWxhdGl2ZXxpbWFnaWNrZHJhd19wYXRoY3VydmV0b3F1YWRyYXRpY2JlemllcnNtb290aGFic29sdXRlfGltYWdpY2tkcmF3X3BhdGhjdXJ2ZXRvcXVhZHJhdGljYmV6aWVyc21vb3RocmVsYXRpdmV8aW1hZ2lja2RyYXdfcGF0aGN1cnZldG9yZWxhdGl2ZXxpbWFnaWNrZHJhd19wYXRoY3VydmV0b3Ntb290aGFic29sdXRlfGltYWdpY2tkcmF3X3BhdGhjdXJ2ZXRvc21vb3RocmVsYXRpdmV8aW1hZ2lja2RyYXdfcGF0aGVsbGlwdGljYXJjYWJzb2x1dGV8aW1hZ2lja2RyYXdfcGF0aGVsbGlwdGljYXJjcmVsYXRpdmV8aW1hZ2lja2RyYXdfcGF0aGZpbmlzaHxpbWFnaWNrZHJhd19wYXRobGluZXRvYWJzb2x1dGV8aW1hZ2lja2RyYXdfcGF0aGxpbmV0b2hvcml6b250YWxhYnNvbHV0ZXxpbWFnaWNrZHJhd19wYXRobGluZXRvaG9yaXpvbnRhbHJlbGF0aXZlfGltYWdpY2tkcmF3X3BhdGhsaW5ldG9yZWxhdGl2ZXxpbWFnaWNrZHJhd19wYXRobGluZXRvdmVydGljYWxhYnNvbHV0ZXxpbWFnaWNrZHJhd19wYXRobGluZXRvdmVydGljYWxyZWxhdGl2ZXxpbWFnaWNrZHJhd19wYXRobW92ZXRvYWJzb2x1dGV8aW1hZ2lja2RyYXdfcGF0aG1vdmV0b3JlbGF0aXZlfGltYWdpY2tkcmF3X3BhdGhzdGFydHxpbWFnaWNrZHJhd19wb2ludHxpbWFnaWNrZHJhd19wb2x5Z29ufGltYWdpY2tkcmF3X3BvbHlsaW5lfGltYWdpY2tkcmF3X3BvcHxpbWFnaWNrZHJhd19wb3BjbGlwcGF0aHxpbWFnaWNrZHJhd19wb3BkZWZzfGltYWdpY2tkcmF3X3BvcHBhdHRlcm58aW1hZ2lja2RyYXdfcHVzaHxpbWFnaWNrZHJhd19wdXNoY2xpcHBhdGh8aW1hZ2lja2RyYXdfcHVzaGRlZnN8aW1hZ2lja2RyYXdfcHVzaHBhdHRlcm58aW1hZ2lja2RyYXdfcmVjdGFuZ2xlfGltYWdpY2tkcmF3X3JlbmRlcnxpbWFnaWNrZHJhd19yb3RhdGV8aW1hZ2lja2RyYXdfcm91bmRyZWN0YW5nbGV8aW1hZ2lja2RyYXdfc2NhbGV8aW1hZ2lja2RyYXdfc2V0Y2xpcHBhdGh8aW1hZ2lja2RyYXdfc2V0Y2xpcHJ1bGV8aW1hZ2lja2RyYXdfc2V0Y2xpcHVuaXRzfGltYWdpY2tkcmF3X3NldGZpbGxhbHBoYXxpbWFnaWNrZHJhd19zZXRmaWxsY29sb3J8aW1hZ2lja2RyYXdfc2V0ZmlsbG9wYWNpdHl8aW1hZ2lja2RyYXdfc2V0ZmlsbHBhdHRlcm51cmx8aW1hZ2lja2RyYXdfc2V0ZmlsbHJ1bGV8aW1hZ2lja2RyYXdfc2V0Zm9udHxpbWFnaWNrZHJhd19zZXRmb250ZmFtaWx5fGltYWdpY2tkcmF3X3NldGZvbnRzaXplfGltYWdpY2tkcmF3X3NldGZvbnRzdHJldGNofGltYWdpY2tkcmF3X3NldGZvbnRzdHlsZXxpbWFnaWNrZHJhd19zZXRmb250d2VpZ2h0fGltYWdpY2tkcmF3X3NldGdyYXZpdHl8aW1hZ2lja2RyYXdfc2V0c3Ryb2tlYWxwaGF8aW1hZ2lja2RyYXdfc2V0c3Ryb2tlYW50aWFsaWFzfGltYWdpY2tkcmF3X3NldHN0cm9rZWNvbG9yfGltYWdpY2tkcmF3X3NldHN0cm9rZWRhc2hhcnJheXxpbWFnaWNrZHJhd19zZXRzdHJva2VkYXNob2Zmc2V0fGltYWdpY2tkcmF3X3NldHN0cm9rZWxpbmVjYXB8aW1hZ2lja2RyYXdfc2V0c3Ryb2tlbGluZWpvaW58aW1hZ2lja2RyYXdfc2V0c3Ryb2tlbWl0ZXJsaW1pdHxpbWFnaWNrZHJhd19zZXRzdHJva2VvcGFjaXR5fGltYWdpY2tkcmF3X3NldHN0cm9rZXBhdHRlcm51cmx8aW1hZ2lja2RyYXdfc2V0c3Ryb2tld2lkdGh8aW1hZ2lja2RyYXdfc2V0dGV4dGFsaWdubWVudHxpbWFnaWNrZHJhd19zZXR0ZXh0YW50aWFsaWFzfGltYWdpY2tkcmF3X3NldHRleHRkZWNvcmF0aW9ufGltYWdpY2tkcmF3X3NldHRleHRlbmNvZGluZ3xpbWFnaWNrZHJhd19zZXR0ZXh0dW5kZXJjb2xvcnxpbWFnaWNrZHJhd19zZXR2ZWN0b3JncmFwaGljc3xpbWFnaWNrZHJhd19zZXR2aWV3Ym94fGltYWdpY2tkcmF3X3NrZXd4fGltYWdpY2tkcmF3X3NrZXd5fGltYWdpY2tkcmF3X3RyYW5zbGF0ZXxpbWFnaWNrcGl4ZWx8aW1hZ2lja3BpeGVsX2NsZWFyfGltYWdpY2twaXhlbF9jb25zdHJ1Y3R8aW1hZ2lja3BpeGVsX2Rlc3Ryb3l8aW1hZ2lja3BpeGVsX2dldGNvbG9yfGltYWdpY2twaXhlbF9nZXRjb2xvcmFzc3RyaW5nfGltYWdpY2twaXhlbF9nZXRjb2xvcmNvdW50fGltYWdpY2twaXhlbF9nZXRjb2xvcnZhbHVlfGltYWdpY2twaXhlbF9nZXRoc2x8aW1hZ2lja3BpeGVsX2lzc2ltaWxhcnxpbWFnaWNrcGl4ZWxfc2V0Y29sb3J8aW1hZ2lja3BpeGVsX3NldGNvbG9ydmFsdWV8aW1hZ2lja3BpeGVsX3NldGhzbHxpbWFnaWNrcGl4ZWxpdGVyYXRvcnxpbWFnaWNrcGl4ZWxpdGVyYXRvcl9jbGVhcnxpbWFnaWNrcGl4ZWxpdGVyYXRvcl9jb25zdHJ1Y3R8aW1hZ2lja3BpeGVsaXRlcmF0b3JfZGVzdHJveXxpbWFnaWNrcGl4ZWxpdGVyYXRvcl9nZXRjdXJyZW50aXRlcmF0b3Jyb3d8aW1hZ2lja3BpeGVsaXRlcmF0b3JfZ2V0aXRlcmF0b3Jyb3d8aW1hZ2lja3BpeGVsaXRlcmF0b3JfZ2V0bmV4dGl0ZXJhdG9ycm93fGltYWdpY2twaXhlbGl0ZXJhdG9yX2dldHByZXZpb3VzaXRlcmF0b3Jyb3d8aW1hZ2lja3BpeGVsaXRlcmF0b3JfbmV3cGl4ZWxpdGVyYXRvcnxpbWFnaWNrcGl4ZWxpdGVyYXRvcl9uZXdwaXhlbHJlZ2lvbml0ZXJhdG9yfGltYWdpY2twaXhlbGl0ZXJhdG9yX3Jlc2V0aXRlcmF0b3J8aW1hZ2lja3BpeGVsaXRlcmF0b3Jfc2V0aXRlcmF0b3JmaXJzdHJvd3xpbWFnaWNrcGl4ZWxpdGVyYXRvcl9zZXRpdGVyYXRvcmxhc3Ryb3d8aW1hZ2lja3BpeGVsaXRlcmF0b3Jfc2V0aXRlcmF0b3Jyb3d8aW1hZ2lja3BpeGVsaXRlcmF0b3Jfc3luY2l0ZXJhdG9yfGltYXBfOGJpdHxpbWFwX2FsZXJ0c3xpbWFwX2FwcGVuZHxpbWFwX2Jhc2U2NHxpbWFwX2JpbmFyeXxpbWFwX2JvZHl8aW1hcF9ib2R5c3RydWN0fGltYXBfY2hlY2t8aW1hcF9jbGVhcmZsYWdfZnVsbHxpbWFwX2Nsb3NlfGltYXBfY3JlYXRlfGltYXBfY3JlYXRlbWFpbGJveHxpbWFwX2RlbGV0ZXxpbWFwX2RlbGV0ZW1haWxib3h8aW1hcF9lcnJvcnN8aW1hcF9leHB1bmdlfGltYXBfZmV0Y2hfb3ZlcnZpZXd8aW1hcF9mZXRjaGJvZHl8aW1hcF9mZXRjaGhlYWRlcnxpbWFwX2ZldGNobWltZXxpbWFwX2ZldGNoc3RydWN0dXJlfGltYXBfZmV0Y2h0ZXh0fGltYXBfZ2N8aW1hcF9nZXRfcXVvdGF8aW1hcF9nZXRfcXVvdGFyb290fGltYXBfZ2V0YWNsfGltYXBfZ2V0bWFpbGJveGVzfGltYXBfZ2V0c3Vic2NyaWJlZHxpbWFwX2hlYWRlcnxpbWFwX2hlYWRlcmluZm98aW1hcF9oZWFkZXJzfGltYXBfbGFzdF9lcnJvcnxpbWFwX2xpc3R8aW1hcF9saXN0bWFpbGJveHxpbWFwX2xpc3RzY2FufGltYXBfbGlzdHN1YnNjcmliZWR8aW1hcF9sc3VifGltYXBfbWFpbHxpbWFwX21haWxfY29tcG9zZXxpbWFwX21haWxfY29weXxpbWFwX21haWxfbW92ZXxpbWFwX21haWxib3htc2dpbmZvfGltYXBfbWltZV9oZWFkZXJfZGVjb2RlfGltYXBfbXNnbm98aW1hcF9udW1fbXNnfGltYXBfbnVtX3JlY2VudHxpbWFwX29wZW58aW1hcF9waW5nfGltYXBfcXByaW50fGltYXBfcmVuYW1lfGltYXBfcmVuYW1lbWFpbGJveHxpbWFwX3Jlb3BlbnxpbWFwX3JmYzgyMl9wYXJzZV9hZHJsaXN0fGltYXBfcmZjODIyX3BhcnNlX2hlYWRlcnN8aW1hcF9yZmM4MjJfd3JpdGVfYWRkcmVzc3xpbWFwX3NhdmVib2R5fGltYXBfc2NhbnxpbWFwX3NjYW5tYWlsYm94fGltYXBfc2VhcmNofGltYXBfc2V0X3F1b3RhfGltYXBfc2V0YWNsfGltYXBfc2V0ZmxhZ19mdWxsfGltYXBfc29ydHxpbWFwX3N0YXR1c3xpbWFwX3N1YnNjcmliZXxpbWFwX3RocmVhZHxpbWFwX3RpbWVvdXR8aW1hcF91aWR8aW1hcF91bmRlbGV0ZXxpbWFwX3Vuc3Vic2NyaWJlfGltYXBfdXRmN19kZWNvZGV8aW1hcF91dGY3X2VuY29kZXxpbWFwX3V0Zjh8aW1wbGVtZW50c2ludGVyZmFjZXxpbXBsb2RlfGltcG9ydF9yZXF1ZXN0X3ZhcmlhYmxlc3xpbl9hcnJheXxpbmNsdWRlfGluY2x1ZGVfb25jZXxpbmNsdWVkX2dldF9kYXRhfGluZXRfbnRvcHxpbmV0X3B0b258aW5maW5pdGVpdGVyYXRvcnxpbmdyZXNfYXV0b2NvbW1pdHxpbmdyZXNfYXV0b2NvbW1pdF9zdGF0ZXxpbmdyZXNfY2hhcnNldHxpbmdyZXNfY2xvc2V8aW5ncmVzX2NvbW1pdHxpbmdyZXNfY29ubmVjdHxpbmdyZXNfY3Vyc29yfGluZ3Jlc19lcnJub3xpbmdyZXNfZXJyb3J8aW5ncmVzX2VycnNxbHN0YXRlfGluZ3Jlc19lc2NhcGVfc3RyaW5nfGluZ3Jlc19leGVjdXRlfGluZ3Jlc19mZXRjaF9hcnJheXxpbmdyZXNfZmV0Y2hfYXNzb2N8aW5ncmVzX2ZldGNoX29iamVjdHxpbmdyZXNfZmV0Y2hfcHJvY19yZXR1cm58aW5ncmVzX2ZldGNoX3Jvd3xpbmdyZXNfZmllbGRfbGVuZ3RofGluZ3Jlc19maWVsZF9uYW1lfGluZ3Jlc19maWVsZF9udWxsYWJsZXxpbmdyZXNfZmllbGRfcHJlY2lzaW9ufGluZ3Jlc19maWVsZF9zY2FsZXxpbmdyZXNfZmllbGRfdHlwZXxpbmdyZXNfZnJlZV9yZXN1bHR8aW5ncmVzX25leHRfZXJyb3J8aW5ncmVzX251bV9maWVsZHN8aW5ncmVzX251bV9yb3dzfGluZ3Jlc19wY29ubmVjdHxpbmdyZXNfcHJlcGFyZXxpbmdyZXNfcXVlcnl8aW5ncmVzX3Jlc3VsdF9zZWVrfGluZ3Jlc19yb2xsYmFja3xpbmdyZXNfc2V0X2Vudmlyb25tZW50fGluZ3Jlc191bmJ1ZmZlcmVkX3F1ZXJ5fGluaV9hbHRlcnxpbmlfZ2V0fGluaV9nZXRfYWxsfGluaV9yZXN0b3JlfGluaV9zZXR8aW5uYW1lc3BhY2V8aW5vdGlmeV9hZGRfd2F0Y2h8aW5vdGlmeV9pbml0fGlub3RpZnlfcXVldWVfbGVufGlub3RpZnlfcmVhZHxpbm90aWZ5X3JtX3dhdGNofGludGVyZmFjZV9leGlzdHN8aW50bF9lcnJvcl9uYW1lfGludGxfZ2V0X2Vycm9yX2NvZGV8aW50bF9nZXRfZXJyb3JfbWVzc2FnZXxpbnRsX2lzX2ZhaWx1cmV8aW50bGRhdGVmb3JtYXR0ZXJ8aW50dmFsfGludmFsaWRhcmd1bWVudGV4Y2VwdGlvbnxpbnZva2V8aW52b2tlYXJnc3xpcDJsb25nfGlwdGNlbWJlZHxpcHRjcGFyc2V8aXNfYXxpc19hcnJheXxpc19ib29sfGlzX2NhbGxhYmxlfGlzX2Rpcnxpc19kb3VibGV8aXNfZXhlY3V0YWJsZXxpc19maWxlfGlzX2Zpbml0ZXxpc19mbG9hdHxpc19pbmZpbml0ZXxpc19pbnR8aXNfaW50ZWdlcnxpc19saW5rfGlzX2xvbmd8aXNfbmFufGlzX251bGx8aXNfbnVtZXJpY3xpc19vYmplY3R8aXNfcmVhZGFibGV8aXNfcmVhbHxpc19yZXNvdXJjZXxpc19zY2FsYXJ8aXNfc29hcF9mYXVsdHxpc19zdHJpbmd8aXNfc3ViY2xhc3Nfb2Z8aXNfdXBsb2FkZWRfZmlsZXxpc193cml0YWJsZXxpc193cml0ZWFibGV8aXNhYnN0cmFjdHxpc2Nsb25lYWJsZXxpc2Rpc2FibGVkfGlzZmluYWx8aXNpbnN0YW5jZXxpc2luc3RhbnRpYWJsZXxpc2ludGVyZmFjZXxpc2ludGVybmFsfGlzaXRlcmF0ZWFibGV8aXNzZXR8aXNzdWJjbGFzc29mfGlzdXNlcmRlZmluZWR8aXRlcmF0b3J8aXRlcmF0b3JfYXBwbHl8aXRlcmF0b3JfY291bnR8aXRlcmF0b3JfdG9fYXJyYXl8aXRlcmF0b3JhZ2dyZWdhdGV8aXRlcmF0b3JpdGVyYXRvcnxqYXZhX2xhc3RfZXhjZXB0aW9uX2NsZWFyfGphdmFfbGFzdF9leGNlcHRpb25fZ2V0fGpkZGF5b2Z3ZWVrfGpkbW9udGhuYW1lfGpkdG9mcmVuY2h8amR0b2dyZWdvcmlhbnxqZHRvamV3aXNofGpkdG9qdWxpYW58amR0b3VuaXh8amV3aXNodG9qZHxqb2lufGpwZWcyd2JtcHxqc29uX2RlY29kZXxqc29uX2VuY29kZXxqc29uX2xhc3RfZXJyb3J8anNvbnNlcmlhbGl6YWJsZXxqdWR5fGp1ZHlfdHlwZXxqdWR5X3ZlcnNpb258anVsaWFudG9qZHxrYWRtNV9jaHBhc3NfcHJpbmNpcGFsfGthZG01X2NyZWF0ZV9wcmluY2lwYWx8a2FkbTVfZGVsZXRlX3ByaW5jaXBhbHxrYWRtNV9kZXN0cm95fGthZG01X2ZsdXNofGthZG01X2dldF9wb2xpY2llc3xrYWRtNV9nZXRfcHJpbmNpcGFsfGthZG01X2dldF9wcmluY2lwYWxzfGthZG01X2luaXRfd2l0aF9wYXNzd29yZHxrYWRtNV9tb2RpZnlfcHJpbmNpcGFsfGtleXxrcnNvcnR8a3NvcnR8bGNmaXJzdHxsY2dfdmFsdWV8bGNoZ3JwfGxjaG93bnxsZGFwXzg4NTlfdG9fdDYxfGxkYXBfYWRkfGxkYXBfYmluZHxsZGFwX2Nsb3NlfGxkYXBfY29tcGFyZXxsZGFwX2Nvbm5lY3R8bGRhcF9jb3VudF9lbnRyaWVzfGxkYXBfZGVsZXRlfGxkYXBfZG4ydWZufGxkYXBfZXJyMnN0cnxsZGFwX2Vycm5vfGxkYXBfZXJyb3J8bGRhcF9leHBsb2RlX2RufGxkYXBfZmlyc3RfYXR0cmlidXRlfGxkYXBfZmlyc3RfZW50cnl8bGRhcF9maXJzdF9yZWZlcmVuY2V8bGRhcF9mcmVlX3Jlc3VsdHxsZGFwX2dldF9hdHRyaWJ1dGVzfGxkYXBfZ2V0X2RufGxkYXBfZ2V0X2VudHJpZXN8bGRhcF9nZXRfb3B0aW9ufGxkYXBfZ2V0X3ZhbHVlc3xsZGFwX2dldF92YWx1ZXNfbGVufGxkYXBfbGlzdHxsZGFwX21vZF9hZGR8bGRhcF9tb2RfZGVsfGxkYXBfbW9kX3JlcGxhY2V8bGRhcF9tb2RpZnl8bGRhcF9uZXh0X2F0dHJpYnV0ZXxsZGFwX25leHRfZW50cnl8bGRhcF9uZXh0X3JlZmVyZW5jZXxsZGFwX3BhcnNlX3JlZmVyZW5jZXxsZGFwX3BhcnNlX3Jlc3VsdHxsZGFwX3JlYWR8bGRhcF9yZW5hbWV8bGRhcF9zYXNsX2JpbmR8bGRhcF9zZWFyY2h8bGRhcF9zZXRfb3B0aW9ufGxkYXBfc2V0X3JlYmluZF9wcm9jfGxkYXBfc29ydHxsZGFwX3N0YXJ0X3Rsc3xsZGFwX3Q2MV90b184ODU5fGxkYXBfdW5iaW5kfGxlbmd0aGV4Y2VwdGlvbnxsZXZlbnNodGVpbnxsaWJ4bWxfY2xlYXJfZXJyb3JzfGxpYnhtbF9kaXNhYmxlX2VudGl0eV9sb2FkZXJ8bGlieG1sX2dldF9lcnJvcnN8bGlieG1sX2dldF9sYXN0X2Vycm9yfGxpYnhtbF9zZXRfc3RyZWFtc19jb250ZXh0fGxpYnhtbF91c2VfaW50ZXJuYWxfZXJyb3JzfGxpYnhtbGVycm9yfGxpbWl0aXRlcmF0b3J8bGlua3xsaW5raW5mb3xsaXN0fGxvY2FsZXxsb2NhbGVjb252fGxvY2FsdGltZXxsb2d8bG9nMTB8bG9nMXB8bG9naWNleGNlcHRpb258bG9uZzJpcHxsc3RhdHxsdHJpbXxsemZfY29tcHJlc3N8bHpmX2RlY29tcHJlc3N8bHpmX29wdGltaXplZF9mb3J8bV9jaGVja3N0YXR1c3xtX2NvbXBsZXRlYXV0aG9yaXphdGlvbnN8bV9jb25uZWN0fG1fY29ubmVjdGlvbmVycm9yfG1fZGVsZXRldHJhbnN8bV9kZXN0cm95Y29ubnxtX2Rlc3Ryb3llbmdpbmV8bV9nZXRjZWxsfG1fZ2V0Y2VsbGJ5bnVtfG1fZ2V0Y29tbWFkZWxpbWl0ZWR8bV9nZXRoZWFkZXJ8bV9pbml0Y29ubnxtX2luaXRlbmdpbmV8bV9pc2NvbW1hZGVsaW1pdGVkfG1fbWF4Y29ubnRpbWVvdXR8bV9tb25pdG9yfG1fbnVtY29sdW1uc3xtX251bXJvd3N8bV9wYXJzZWNvbW1hZGVsaW1pdGVkfG1fcmVzcG9uc2VrZXlzfG1fcmVzcG9uc2VwYXJhbXxtX3JldHVybnN0YXR1c3xtX3NldGJsb2NraW5nfG1fc2V0ZHJvcGZpbGV8bV9zZXRpcHxtX3NldHNzbHxtX3NldHNzbF9jYWZpbGV8bV9zZXRzc2xfZmlsZXN8bV9zZXR0aW1lb3V0fG1fc3NsY2VydF9nZW5faGFzaHxtX3RyYW5zYWN0aW9uc3NlbnR8bV90cmFuc2lucXVldWV8bV90cmFuc2tleXZhbHxtX3RyYW5zbmV3fG1fdHJhbnNzZW5kfG1fdXdhaXR8bV92YWxpZGF0ZWlkZW50aWZpZXJ8bV92ZXJpZnljb25uZWN0aW9ufG1fdmVyaWZ5c3NsY2VydHxtYWdpY19xdW90ZXNfcnVudGltZXxtYWlsfG1haWxwYXJzZV9kZXRlcm1pbmVfYmVzdF94ZmVyX2VuY29kaW5nfG1haWxwYXJzZV9tc2dfY3JlYXRlfG1haWxwYXJzZV9tc2dfZXh0cmFjdF9wYXJ0fG1haWxwYXJzZV9tc2dfZXh0cmFjdF9wYXJ0X2ZpbGV8bWFpbHBhcnNlX21zZ19leHRyYWN0X3dob2xlX3BhcnRfZmlsZXxtYWlscGFyc2VfbXNnX2ZyZWV8bWFpbHBhcnNlX21zZ19nZXRfcGFydHxtYWlscGFyc2VfbXNnX2dldF9wYXJ0X2RhdGF8bWFpbHBhcnNlX21zZ19nZXRfc3RydWN0dXJlfG1haWxwYXJzZV9tc2dfcGFyc2V8bWFpbHBhcnNlX21zZ19wYXJzZV9maWxlfG1haWxwYXJzZV9yZmM4MjJfcGFyc2VfYWRkcmVzc2VzfG1haWxwYXJzZV9zdHJlYW1fZW5jb2RlfG1haWxwYXJzZV91dWRlY29kZV9hbGx8bWFpbnxtYXh8bWF4ZGJfYWZmZWN0ZWRfcm93c3xtYXhkYl9hdXRvY29tbWl0fG1heGRiX2JpbmRfcGFyYW18bWF4ZGJfYmluZF9yZXN1bHR8bWF4ZGJfY2hhbmdlX3VzZXJ8bWF4ZGJfY2hhcmFjdGVyX3NldF9uYW1lfG1heGRiX2NsaWVudF9lbmNvZGluZ3xtYXhkYl9jbG9zZXxtYXhkYl9jbG9zZV9sb25nX2RhdGF8bWF4ZGJfY29tbWl0fG1heGRiX2Nvbm5lY3R8bWF4ZGJfY29ubmVjdF9lcnJub3xtYXhkYl9jb25uZWN0X2Vycm9yfG1heGRiX2RhdGFfc2Vla3xtYXhkYl9kZWJ1Z3xtYXhkYl9kaXNhYmxlX3JlYWRzX2Zyb21fbWFzdGVyfG1heGRiX2Rpc2FibGVfcnBsX3BhcnNlfG1heGRiX2R1bXBfZGVidWdfaW5mb3xtYXhkYl9lbWJlZGRlZF9jb25uZWN0fG1heGRiX2VuYWJsZV9yZWFkc19mcm9tX21hc3RlcnxtYXhkYl9lbmFibGVfcnBsX3BhcnNlfG1heGRiX2Vycm5vfG1heGRiX2Vycm9yfG1heGRiX2VzY2FwZV9zdHJpbmd8bWF4ZGJfZXhlY3V0ZXxtYXhkYl9mZXRjaHxtYXhkYl9mZXRjaF9hcnJheXxtYXhkYl9mZXRjaF9hc3NvY3xtYXhkYl9mZXRjaF9maWVsZHxtYXhkYl9mZXRjaF9maWVsZF9kaXJlY3R8bWF4ZGJfZmV0Y2hfZmllbGRzfG1heGRiX2ZldGNoX2xlbmd0aHN8bWF4ZGJfZmV0Y2hfb2JqZWN0fG1heGRiX2ZldGNoX3Jvd3xtYXhkYl9maWVsZF9jb3VudHxtYXhkYl9maWVsZF9zZWVrfG1heGRiX2ZpZWxkX3RlbGx8bWF4ZGJfZnJlZV9yZXN1bHR8bWF4ZGJfZ2V0X2NsaWVudF9pbmZvfG1heGRiX2dldF9jbGllbnRfdmVyc2lvbnxtYXhkYl9nZXRfaG9zdF9pbmZvfG1heGRiX2dldF9tZXRhZGF0YXxtYXhkYl9nZXRfcHJvdG9faW5mb3xtYXhkYl9nZXRfc2VydmVyX2luZm98bWF4ZGJfZ2V0X3NlcnZlcl92ZXJzaW9ufG1heGRiX2luZm98bWF4ZGJfaW5pdHxtYXhkYl9pbnNlcnRfaWR8bWF4ZGJfa2lsbHxtYXhkYl9tYXN0ZXJfcXVlcnl8bWF4ZGJfbW9yZV9yZXN1bHRzfG1heGRiX211bHRpX3F1ZXJ5fG1heGRiX25leHRfcmVzdWx0fG1heGRiX251bV9maWVsZHN8bWF4ZGJfbnVtX3Jvd3N8bWF4ZGJfb3B0aW9uc3xtYXhkYl9wYXJhbV9jb3VudHxtYXhkYl9waW5nfG1heGRiX3ByZXBhcmV8bWF4ZGJfcXVlcnl8bWF4ZGJfcmVhbF9jb25uZWN0fG1heGRiX3JlYWxfZXNjYXBlX3N0cmluZ3xtYXhkYl9yZWFsX3F1ZXJ5fG1heGRiX3JlcG9ydHxtYXhkYl9yb2xsYmFja3xtYXhkYl9ycGxfcGFyc2VfZW5hYmxlZHxtYXhkYl9ycGxfcHJvYmV8bWF4ZGJfcnBsX3F1ZXJ5X3R5cGV8bWF4ZGJfc2VsZWN0X2RifG1heGRiX3NlbmRfbG9uZ19kYXRhfG1heGRiX3NlbmRfcXVlcnl8bWF4ZGJfc2VydmVyX2VuZHxtYXhkYl9zZXJ2ZXJfaW5pdHxtYXhkYl9zZXRfb3B0fG1heGRiX3NxbHN0YXRlfG1heGRiX3NzbF9zZXR8bWF4ZGJfc3RhdHxtYXhkYl9zdG10X2FmZmVjdGVkX3Jvd3N8bWF4ZGJfc3RtdF9iaW5kX3BhcmFtfG1heGRiX3N0bXRfYmluZF9yZXN1bHR8bWF4ZGJfc3RtdF9jbG9zZXxtYXhkYl9zdG10X2Nsb3NlX2xvbmdfZGF0YXxtYXhkYl9zdG10X2RhdGFfc2Vla3xtYXhkYl9zdG10X2Vycm5vfG1heGRiX3N0bXRfZXJyb3J8bWF4ZGJfc3RtdF9leGVjdXRlfG1heGRiX3N0bXRfZmV0Y2h8bWF4ZGJfc3RtdF9mcmVlX3Jlc3VsdHxtYXhkYl9zdG10X2luaXR8bWF4ZGJfc3RtdF9udW1fcm93c3xtYXhkYl9zdG10X3BhcmFtX2NvdW50fG1heGRiX3N0bXRfcHJlcGFyZXxtYXhkYl9zdG10X3Jlc2V0fG1heGRiX3N0bXRfcmVzdWx0X21ldGFkYXRhfG1heGRiX3N0bXRfc2VuZF9sb25nX2RhdGF8bWF4ZGJfc3RtdF9zcWxzdGF0ZXxtYXhkYl9zdG10X3N0b3JlX3Jlc3VsdHxtYXhkYl9zdG9yZV9yZXN1bHR8bWF4ZGJfdGhyZWFkX2lkfG1heGRiX3RocmVhZF9zYWZlfG1heGRiX3VzZV9yZXN1bHR8bWF4ZGJfd2FybmluZ19jb3VudHxtYl9jaGVja19lbmNvZGluZ3xtYl9jb252ZXJ0X2Nhc2V8bWJfY29udmVydF9lbmNvZGluZ3xtYl9jb252ZXJ0X2thbmF8bWJfY29udmVydF92YXJpYWJsZXN8bWJfZGVjb2RlX21pbWVoZWFkZXJ8bWJfZGVjb2RlX251bWVyaWNlbnRpdHl8bWJfZGV0ZWN0X2VuY29kaW5nfG1iX2RldGVjdF9vcmRlcnxtYl9lbmNvZGVfbWltZWhlYWRlcnxtYl9lbmNvZGVfbnVtZXJpY2VudGl0eXxtYl9lbmNvZGluZ19hbGlhc2VzfG1iX2VyZWd8bWJfZXJlZ19tYXRjaHxtYl9lcmVnX3JlcGxhY2V8bWJfZXJlZ19zZWFyY2h8bWJfZXJlZ19zZWFyY2hfZ2V0cG9zfG1iX2VyZWdfc2VhcmNoX2dldHJlZ3N8bWJfZXJlZ19zZWFyY2hfaW5pdHxtYl9lcmVnX3NlYXJjaF9wb3N8bWJfZXJlZ19zZWFyY2hfcmVnc3xtYl9lcmVnX3NlYXJjaF9zZXRwb3N8bWJfZXJlZ2l8bWJfZXJlZ2lfcmVwbGFjZXxtYl9nZXRfaW5mb3xtYl9odHRwX2lucHV0fG1iX2h0dHBfb3V0cHV0fG1iX2ludGVybmFsX2VuY29kaW5nfG1iX2xhbmd1YWdlfG1iX2xpc3RfZW5jb2RpbmdzfG1iX291dHB1dF9oYW5kbGVyfG1iX3BhcnNlX3N0cnxtYl9wcmVmZXJyZWRfbWltZV9uYW1lfG1iX3JlZ2V4X2VuY29kaW5nfG1iX3JlZ2V4X3NldF9vcHRpb25zfG1iX3NlbmRfbWFpbHxtYl9zcGxpdHxtYl9zdHJjdXR8bWJfc3RyaW13aWR0aHxtYl9zdHJpcG9zfG1iX3N0cmlzdHJ8bWJfc3RybGVufG1iX3N0cnBvc3xtYl9zdHJyY2hyfG1iX3N0cnJpY2hyfG1iX3N0cnJpcG9zfG1iX3N0cnJwb3N8bWJfc3Ryc3RyfG1iX3N0cnRvbG93ZXJ8bWJfc3RydG91cHBlcnxtYl9zdHJ3aWR0aHxtYl9zdWJzdGl0dXRlX2NoYXJhY3RlcnxtYl9zdWJzdHJ8bWJfc3Vic3RyX2NvdW50fG1jcnlwdF9jYmN8bWNyeXB0X2NmYnxtY3J5cHRfY3JlYXRlX2l2fG1jcnlwdF9kZWNyeXB0fG1jcnlwdF9lY2J8bWNyeXB0X2VuY19nZXRfYWxnb3JpdGhtc19uYW1lfG1jcnlwdF9lbmNfZ2V0X2Jsb2NrX3NpemV8bWNyeXB0X2VuY19nZXRfaXZfc2l6ZXxtY3J5cHRfZW5jX2dldF9rZXlfc2l6ZXxtY3J5cHRfZW5jX2dldF9tb2Rlc19uYW1lfG1jcnlwdF9lbmNfZ2V0X3N1cHBvcnRlZF9rZXlfc2l6ZXN8bWNyeXB0X2VuY19pc19ibG9ja19hbGdvcml0aG18bWNyeXB0X2VuY19pc19ibG9ja19hbGdvcml0aG1fbW9kZXxtY3J5cHRfZW5jX2lzX2Jsb2NrX21vZGV8bWNyeXB0X2VuY19zZWxmX3Rlc3R8bWNyeXB0X2VuY3J5cHR8bWNyeXB0X2dlbmVyaWN8bWNyeXB0X2dlbmVyaWNfZGVpbml0fG1jcnlwdF9nZW5lcmljX2VuZHxtY3J5cHRfZ2VuZXJpY19pbml0fG1jcnlwdF9nZXRfYmxvY2tfc2l6ZXxtY3J5cHRfZ2V0X2NpcGhlcl9uYW1lfG1jcnlwdF9nZXRfaXZfc2l6ZXxtY3J5cHRfZ2V0X2tleV9zaXplfG1jcnlwdF9saXN0X2FsZ29yaXRobXN8bWNyeXB0X2xpc3RfbW9kZXN8bWNyeXB0X21vZHVsZV9jbG9zZXxtY3J5cHRfbW9kdWxlX2dldF9hbGdvX2Jsb2NrX3NpemV8bWNyeXB0X21vZHVsZV9nZXRfYWxnb19rZXlfc2l6ZXxtY3J5cHRfbW9kdWxlX2dldF9zdXBwb3J0ZWRfa2V5X3NpemVzfG1jcnlwdF9tb2R1bGVfaXNfYmxvY2tfYWxnb3JpdGhtfG1jcnlwdF9tb2R1bGVfaXNfYmxvY2tfYWxnb3JpdGhtX21vZGV8bWNyeXB0X21vZHVsZV9pc19ibG9ja19tb2RlfG1jcnlwdF9tb2R1bGVfb3BlbnxtY3J5cHRfbW9kdWxlX3NlbGZfdGVzdHxtY3J5cHRfb2ZifG1kNXxtZDVfZmlsZXxtZGVjcnlwdF9nZW5lcmljfG1lbWNhY2hlfG1lbWNhY2hlX2RlYnVnfG1lbWNhY2hlZHxtZW1vcnlfZ2V0X3BlYWtfdXNhZ2V8bWVtb3J5X2dldF91c2FnZXxtZXNzYWdlZm9ybWF0dGVyfG1ldGFwaG9uZXxtZXRob2RfZXhpc3RzfG1oYXNofG1oYXNoX2NvdW50fG1oYXNoX2dldF9ibG9ja19zaXplfG1oYXNoX2dldF9oYXNoX25hbWV8bWhhc2hfa2V5Z2VuX3Mya3xtaWNyb3RpbWV8bWltZV9jb250ZW50X3R5cGV8bWlufG1pbmdfa2V5cHJlc3N8bWluZ19zZXRjdWJpY3RocmVzaG9sZHxtaW5nX3NldHNjYWxlfG1pbmdfc2V0c3dmY29tcHJlc3Npb258bWluZ191c2Vjb25zdGFudHN8bWluZ191c2Vzd2Z2ZXJzaW9ufG1rZGlyfG1rdGltZXxtb25leV9mb3JtYXR8bW9uZ298bW9uZ29iaW5kYXRhfG1vbmdvY29kZXxtb25nb2NvbGxlY3Rpb258bW9uZ29jb25uZWN0aW9uZXhjZXB0aW9ufG1vbmdvY3Vyc29yfG1vbmdvY3Vyc29yZXhjZXB0aW9ufG1vbmdvY3Vyc29ydGltZW91dGV4Y2VwdGlvbnxtb25nb2RhdGV8bW9uZ29kYnxtb25nb2RicmVmfG1vbmdvZXhjZXB0aW9ufG1vbmdvZ3JpZGZzfG1vbmdvZ3JpZGZzY3Vyc29yfG1vbmdvZ3JpZGZzZXhjZXB0aW9ufG1vbmdvZ3JpZGZzZmlsZXxtb25nb2lkfG1vbmdvaW50MzJ8bW9uZ29pbnQ2NHxtb25nb21heGtleXxtb25nb21pbmtleXxtb25nb3JlZ2V4fG1vbmdvdGltZXN0YW1wfG1vdmVfdXBsb2FkZWRfZmlsZXxtcGVnZmlsZXxtcXNlcmllc19iYWNrfG1xc2VyaWVzX2JlZ2lufG1xc2VyaWVzX2Nsb3NlfG1xc2VyaWVzX2NtaXR8bXFzZXJpZXNfY29ubnxtcXNlcmllc19jb25ueHxtcXNlcmllc19kaXNjfG1xc2VyaWVzX2dldHxtcXNlcmllc19pbnF8bXFzZXJpZXNfb3BlbnxtcXNlcmllc19wdXR8bXFzZXJpZXNfcHV0MXxtcXNlcmllc19zZXR8bXFzZXJpZXNfc3RyZXJyb3J8bXNlc3Npb25fY29ubmVjdHxtc2Vzc2lvbl9jb3VudHxtc2Vzc2lvbl9jcmVhdGV8bXNlc3Npb25fZGVzdHJveXxtc2Vzc2lvbl9kaXNjb25uZWN0fG1zZXNzaW9uX2ZpbmR8bXNlc3Npb25fZ2V0fG1zZXNzaW9uX2dldF9hcnJheXxtc2Vzc2lvbl9nZXRfZGF0YXxtc2Vzc2lvbl9pbmN8bXNlc3Npb25fbGlzdHxtc2Vzc2lvbl9saXN0dmFyfG1zZXNzaW9uX2xvY2t8bXNlc3Npb25fcGx1Z2lufG1zZXNzaW9uX3JhbmRzdHJ8bXNlc3Npb25fc2V0fG1zZXNzaW9uX3NldF9hcnJheXxtc2Vzc2lvbl9zZXRfZGF0YXxtc2Vzc2lvbl90aW1lb3V0fG1zZXNzaW9uX3VuaXF8bXNlc3Npb25fdW5sb2NrfG1zZ19nZXRfcXVldWV8bXNnX3F1ZXVlX2V4aXN0c3xtc2dfcmVjZWl2ZXxtc2dfcmVtb3ZlX3F1ZXVlfG1zZ19zZW5kfG1zZ19zZXRfcXVldWV8bXNnX3N0YXRfcXVldWV8bXNxbHxtc3FsX2FmZmVjdGVkX3Jvd3N8bXNxbF9jbG9zZXxtc3FsX2Nvbm5lY3R8bXNxbF9jcmVhdGVfZGJ8bXNxbF9jcmVhdGVkYnxtc3FsX2RhdGFfc2Vla3xtc3FsX2RiX3F1ZXJ5fG1zcWxfZGJuYW1lfG1zcWxfZHJvcF9kYnxtc3FsX2Vycm9yfG1zcWxfZmV0Y2hfYXJyYXl8bXNxbF9mZXRjaF9maWVsZHxtc3FsX2ZldGNoX29iamVjdHxtc3FsX2ZldGNoX3Jvd3xtc3FsX2ZpZWxkX2ZsYWdzfG1zcWxfZmllbGRfbGVufG1zcWxfZmllbGRfbmFtZXxtc3FsX2ZpZWxkX3NlZWt8bXNxbF9maWVsZF90YWJsZXxtc3FsX2ZpZWxkX3R5cGV8bXNxbF9maWVsZGZsYWdzfG1zcWxfZmllbGRsZW58bXNxbF9maWVsZG5hbWV8bXNxbF9maWVsZHRhYmxlfG1zcWxfZmllbGR0eXBlfG1zcWxfZnJlZV9yZXN1bHR8bXNxbF9saXN0X2Ric3xtc3FsX2xpc3RfZmllbGRzfG1zcWxfbGlzdF90YWJsZXN8bXNxbF9udW1fZmllbGRzfG1zcWxfbnVtX3Jvd3N8bXNxbF9udW1maWVsZHN8bXNxbF9udW1yb3dzfG1zcWxfcGNvbm5lY3R8bXNxbF9xdWVyeXxtc3FsX3JlZ2Nhc2V8bXNxbF9yZXN1bHR8bXNxbF9zZWxlY3RfZGJ8bXNxbF90YWJsZW5hbWV8bXNzcWxfYmluZHxtc3NxbF9jbG9zZXxtc3NxbF9jb25uZWN0fG1zc3FsX2RhdGFfc2Vla3xtc3NxbF9leGVjdXRlfG1zc3FsX2ZldGNoX2FycmF5fG1zc3FsX2ZldGNoX2Fzc29jfG1zc3FsX2ZldGNoX2JhdGNofG1zc3FsX2ZldGNoX2ZpZWxkfG1zc3FsX2ZldGNoX29iamVjdHxtc3NxbF9mZXRjaF9yb3d8bXNzcWxfZmllbGRfbGVuZ3RofG1zc3FsX2ZpZWxkX25hbWV8bXNzcWxfZmllbGRfc2Vla3xtc3NxbF9maWVsZF90eXBlfG1zc3FsX2ZyZWVfcmVzdWx0fG1zc3FsX2ZyZWVfc3RhdGVtZW50fG1zc3FsX2dldF9sYXN0X21lc3NhZ2V8bXNzcWxfZ3VpZF9zdHJpbmd8bXNzcWxfaW5pdHxtc3NxbF9taW5fZXJyb3Jfc2V2ZXJpdHl8bXNzcWxfbWluX21lc3NhZ2Vfc2V2ZXJpdHl8bXNzcWxfbmV4dF9yZXN1bHR8bXNzcWxfbnVtX2ZpZWxkc3xtc3NxbF9udW1fcm93c3xtc3NxbF9wY29ubmVjdHxtc3NxbF9xdWVyeXxtc3NxbF9yZXN1bHR8bXNzcWxfcm93c19hZmZlY3RlZHxtc3NxbF9zZWxlY3RfZGJ8bXRfZ2V0cmFuZG1heHxtdF9yYW5kfG10X3NyYW5kfG11bHRpcGxlaXRlcmF0b3J8bXlzcWxfYWZmZWN0ZWRfcm93c3xteXNxbF9jbGllbnRfZW5jb2Rpbmd8bXlzcWxfY2xvc2V8bXlzcWxfY29ubmVjdHxteXNxbF9jcmVhdGVfZGJ8bXlzcWxfZGF0YV9zZWVrfG15c3FsX2RiX25hbWV8bXlzcWxfZGJfcXVlcnl8bXlzcWxfZHJvcF9kYnxteXNxbF9lcnJub3xteXNxbF9lcnJvcnxteXNxbF9lc2NhcGVfc3RyaW5nfG15c3FsX2ZldGNoX2FycmF5fG15c3FsX2ZldGNoX2Fzc29jfG15c3FsX2ZldGNoX2ZpZWxkfG15c3FsX2ZldGNoX2xlbmd0aHN8bXlzcWxfZmV0Y2hfb2JqZWN0fG15c3FsX2ZldGNoX3Jvd3xteXNxbF9maWVsZF9mbGFnc3xteXNxbF9maWVsZF9sZW58bXlzcWxfZmllbGRfbmFtZXxteXNxbF9maWVsZF9zZWVrfG15c3FsX2ZpZWxkX3RhYmxlfG15c3FsX2ZpZWxkX3R5cGV8bXlzcWxfZnJlZV9yZXN1bHR8bXlzcWxfZ2V0X2NsaWVudF9pbmZvfG15c3FsX2dldF9ob3N0X2luZm98bXlzcWxfZ2V0X3Byb3RvX2luZm98bXlzcWxfZ2V0X3NlcnZlcl9pbmZvfG15c3FsX2luZm98bXlzcWxfaW5zZXJ0X2lkfG15c3FsX2xpc3RfZGJzfG15c3FsX2xpc3RfZmllbGRzfG15c3FsX2xpc3RfcHJvY2Vzc2VzfG15c3FsX2xpc3RfdGFibGVzfG15c3FsX251bV9maWVsZHN8bXlzcWxfbnVtX3Jvd3N8bXlzcWxfcGNvbm5lY3R8bXlzcWxfcGluZ3xteXNxbF9xdWVyeXxteXNxbF9yZWFsX2VzY2FwZV9zdHJpbmd8bXlzcWxfcmVzdWx0fG15c3FsX3NlbGVjdF9kYnxteXNxbF9zZXRfY2hhcnNldHxteXNxbF9zdGF0fG15c3FsX3RhYmxlbmFtZXxteXNxbF90aHJlYWRfaWR8bXlzcWxfdW5idWZmZXJlZF9xdWVyeXxteXNxbGl8bXlzcWxpX2JpbmRfcGFyYW18bXlzcWxpX2JpbmRfcmVzdWx0fG15c3FsaV9jbGllbnRfZW5jb2Rpbmd8bXlzcWxpX2Nvbm5lY3R8bXlzcWxpX2Rpc2FibGVfcmVhZHNfZnJvbV9tYXN0ZXJ8bXlzcWxpX2Rpc2FibGVfcnBsX3BhcnNlfG15c3FsaV9kcml2ZXJ8bXlzcWxpX2VuYWJsZV9yZWFkc19mcm9tX21hc3RlcnxteXNxbGlfZW5hYmxlX3JwbF9wYXJzZXxteXNxbGlfZXNjYXBlX3N0cmluZ3xteXNxbGlfZXhlY3V0ZXxteXNxbGlfZmV0Y2h8bXlzcWxpX2dldF9tZXRhZGF0YXxteXNxbGlfbWFzdGVyX3F1ZXJ5fG15c3FsaV9wYXJhbV9jb3VudHxteXNxbGlfcmVwb3J0fG15c3FsaV9yZXN1bHR8bXlzcWxpX3JwbF9wYXJzZV9lbmFibGVkfG15c3FsaV9ycGxfcHJvYmV8bXlzcWxpX3JwbF9xdWVyeV90eXBlfG15c3FsaV9zZW5kX2xvbmdfZGF0YXxteXNxbGlfc2VuZF9xdWVyeXxteXNxbGlfc2V0X29wdHxteXNxbGlfc2xhdmVfcXVlcnl8bXlzcWxpX3N0bXR8bXlzcWxpX3dhcm5pbmd8bXlzcWxuZF9tc19nZXRfc3RhdHN8bXlzcWxuZF9tc19xdWVyeV9pc19zZWxlY3R8bXlzcWxuZF9tc19zZXRfdXNlcl9waWNrX3NlcnZlcnxteXNxbG5kX3FjX2NoYW5nZV9oYW5kbGVyfG15c3FsbmRfcWNfY2xlYXJfY2FjaGV8bXlzcWxuZF9xY19nZXRfY2FjaGVfaW5mb3xteXNxbG5kX3FjX2dldF9jb3JlX3N0YXRzfG15c3FsbmRfcWNfZ2V0X2hhbmRsZXJ8bXlzcWxuZF9xY19nZXRfcXVlcnlfdHJhY2VfbG9nfG15c3FsbmRfcWNfc2V0X3VzZXJfaGFuZGxlcnN8bmF0Y2FzZXNvcnR8bmF0c29ydHxuY3Vyc2VzX2FkZGNofG5jdXJzZXNfYWRkY2huc3RyfG5jdXJzZXNfYWRkY2hzdHJ8bmN1cnNlc19hZGRuc3RyfG5jdXJzZXNfYWRkc3RyfG5jdXJzZXNfYXNzdW1lX2RlZmF1bHRfY29sb3JzfG5jdXJzZXNfYXR0cm9mZnxuY3Vyc2VzX2F0dHJvbnxuY3Vyc2VzX2F0dHJzZXR8bmN1cnNlc19iYXVkcmF0ZXxuY3Vyc2VzX2JlZXB8bmN1cnNlc19ia2dkfG5jdXJzZXNfYmtnZHNldHxuY3Vyc2VzX2JvcmRlcnxuY3Vyc2VzX2JvdHRvbV9wYW5lbHxuY3Vyc2VzX2Nhbl9jaGFuZ2VfY29sb3J8bmN1cnNlc19jYnJlYWt8bmN1cnNlc19jbGVhcnxuY3Vyc2VzX2NscnRvYm90fG5jdXJzZXNfY2xydG9lb2x8bmN1cnNlc19jb2xvcl9jb250ZW50fG5jdXJzZXNfY29sb3Jfc2V0fG5jdXJzZXNfY3Vyc19zZXR8bmN1cnNlc19kZWZfcHJvZ19tb2RlfG5jdXJzZXNfZGVmX3NoZWxsX21vZGV8bmN1cnNlc19kZWZpbmVfa2V5fG5jdXJzZXNfZGVsX3BhbmVsfG5jdXJzZXNfZGVsYXlfb3V0cHV0fG5jdXJzZXNfZGVsY2h8bmN1cnNlc19kZWxldGVsbnxuY3Vyc2VzX2RlbHdpbnxuY3Vyc2VzX2RvdXBkYXRlfG5jdXJzZXNfZWNob3xuY3Vyc2VzX2VjaG9jaGFyfG5jdXJzZXNfZW5kfG5jdXJzZXNfZXJhc2V8bmN1cnNlc19lcmFzZWNoYXJ8bmN1cnNlc19maWx0ZXJ8bmN1cnNlc19mbGFzaHxuY3Vyc2VzX2ZsdXNoaW5wfG5jdXJzZXNfZ2V0Y2h8bmN1cnNlc19nZXRtYXh5eHxuY3Vyc2VzX2dldG1vdXNlfG5jdXJzZXNfZ2V0eXh8bmN1cnNlc19oYWxmZGVsYXl8bmN1cnNlc19oYXNfY29sb3JzfG5jdXJzZXNfaGFzX2ljfG5jdXJzZXNfaGFzX2lsfG5jdXJzZXNfaGFzX2tleXxuY3Vyc2VzX2hpZGVfcGFuZWx8bmN1cnNlc19obGluZXxuY3Vyc2VzX2luY2h8bmN1cnNlc19pbml0fG5jdXJzZXNfaW5pdF9jb2xvcnxuY3Vyc2VzX2luaXRfcGFpcnxuY3Vyc2VzX2luc2NofG5jdXJzZXNfaW5zZGVsbG58bmN1cnNlc19pbnNlcnRsbnxuY3Vyc2VzX2luc3N0cnxuY3Vyc2VzX2luc3RyfG5jdXJzZXNfaXNlbmR3aW58bmN1cnNlc19rZXlva3xuY3Vyc2VzX2tleXBhZHxuY3Vyc2VzX2tpbGxjaGFyfG5jdXJzZXNfbG9uZ25hbWV8bmN1cnNlc19tZXRhfG5jdXJzZXNfbW91c2VfdHJhZm98bmN1cnNlc19tb3VzZWludGVydmFsfG5jdXJzZXNfbW91c2VtYXNrfG5jdXJzZXNfbW92ZXxuY3Vyc2VzX21vdmVfcGFuZWx8bmN1cnNlc19tdmFkZGNofG5jdXJzZXNfbXZhZGRjaG5zdHJ8bmN1cnNlc19tdmFkZGNoc3RyfG5jdXJzZXNfbXZhZGRuc3RyfG5jdXJzZXNfbXZhZGRzdHJ8bmN1cnNlc19tdmN1cnxuY3Vyc2VzX212ZGVsY2h8bmN1cnNlc19tdmdldGNofG5jdXJzZXNfbXZobGluZXxuY3Vyc2VzX212aW5jaHxuY3Vyc2VzX212dmxpbmV8bmN1cnNlc19tdndhZGRzdHJ8bmN1cnNlc19uYXBtc3xuY3Vyc2VzX25ld19wYW5lbHxuY3Vyc2VzX25ld3BhZHxuY3Vyc2VzX25ld3dpbnxuY3Vyc2VzX25sfG5jdXJzZXNfbm9jYnJlYWt8bmN1cnNlc19ub2VjaG98bmN1cnNlc19ub25sfG5jdXJzZXNfbm9xaWZsdXNofG5jdXJzZXNfbm9yYXd8bmN1cnNlc19wYWlyX2NvbnRlbnR8bmN1cnNlc19wYW5lbF9hYm92ZXxuY3Vyc2VzX3BhbmVsX2JlbG93fG5jdXJzZXNfcGFuZWxfd2luZG93fG5jdXJzZXNfcG5vdXRyZWZyZXNofG5jdXJzZXNfcHJlZnJlc2h8bmN1cnNlc19wdXRwfG5jdXJzZXNfcWlmbHVzaHxuY3Vyc2VzX3Jhd3xuY3Vyc2VzX3JlZnJlc2h8bmN1cnNlc19yZXBsYWNlX3BhbmVsfG5jdXJzZXNfcmVzZXRfcHJvZ19tb2RlfG5jdXJzZXNfcmVzZXRfc2hlbGxfbW9kZXxuY3Vyc2VzX3Jlc2V0dHl8bmN1cnNlc19zYXZldHR5fG5jdXJzZXNfc2NyX2R1bXB8bmN1cnNlc19zY3JfaW5pdHxuY3Vyc2VzX3Njcl9yZXN0b3JlfG5jdXJzZXNfc2NyX3NldHxuY3Vyc2VzX3Njcmx8bmN1cnNlc19zaG93X3BhbmVsfG5jdXJzZXNfc2xrX2F0dHJ8bmN1cnNlc19zbGtfYXR0cm9mZnxuY3Vyc2VzX3Nsa19hdHRyb258bmN1cnNlc19zbGtfYXR0cnNldHxuY3Vyc2VzX3Nsa19jbGVhcnxuY3Vyc2VzX3Nsa19jb2xvcnxuY3Vyc2VzX3Nsa19pbml0fG5jdXJzZXNfc2xrX25vdXRyZWZyZXNofG5jdXJzZXNfc2xrX3JlZnJlc2h8bmN1cnNlc19zbGtfcmVzdG9yZXxuY3Vyc2VzX3Nsa19zZXR8bmN1cnNlc19zbGtfdG91Y2h8bmN1cnNlc19zdGFuZGVuZHxuY3Vyc2VzX3N0YW5kb3V0fG5jdXJzZXNfc3RhcnRfY29sb3J8bmN1cnNlc190ZXJtYXR0cnN8bmN1cnNlc190ZXJtbmFtZXxuY3Vyc2VzX3RpbWVvdXR8bmN1cnNlc190b3BfcGFuZWx8bmN1cnNlc190eXBlYWhlYWR8bmN1cnNlc191bmdldGNofG5jdXJzZXNfdW5nZXRtb3VzZXxuY3Vyc2VzX3VwZGF0ZV9wYW5lbHN8bmN1cnNlc191c2VfZGVmYXVsdF9jb2xvcnN8bmN1cnNlc191c2VfZW52fG5jdXJzZXNfdXNlX2V4dGVuZGVkX25hbWVzfG5jdXJzZXNfdmlkYXR0cnxuY3Vyc2VzX3ZsaW5lfG5jdXJzZXNfd2FkZGNofG5jdXJzZXNfd2FkZHN0cnxuY3Vyc2VzX3dhdHRyb2ZmfG5jdXJzZXNfd2F0dHJvbnxuY3Vyc2VzX3dhdHRyc2V0fG5jdXJzZXNfd2JvcmRlcnxuY3Vyc2VzX3djbGVhcnxuY3Vyc2VzX3djb2xvcl9zZXR8bmN1cnNlc193ZXJhc2V8bmN1cnNlc193Z2V0Y2h8bmN1cnNlc193aGxpbmV8bmN1cnNlc193bW91c2VfdHJhZm98bmN1cnNlc193bW92ZXxuY3Vyc2VzX3dub3V0cmVmcmVzaHxuY3Vyc2VzX3dyZWZyZXNofG5jdXJzZXNfd3N0YW5kZW5kfG5jdXJzZXNfd3N0YW5kb3V0fG5jdXJzZXNfd3ZsaW5lfG5ld2luc3RhbmNlfG5ld2luc3RhbmNlYXJnc3xuZXd0X2JlbGx8bmV3dF9idXR0b258bmV3dF9idXR0b25fYmFyfG5ld3RfY2VudGVyZWRfd2luZG93fG5ld3RfY2hlY2tib3h8bmV3dF9jaGVja2JveF9nZXRfdmFsdWV8bmV3dF9jaGVja2JveF9zZXRfZmxhZ3N8bmV3dF9jaGVja2JveF9zZXRfdmFsdWV8bmV3dF9jaGVja2JveF90cmVlfG5ld3RfY2hlY2tib3hfdHJlZV9hZGRfaXRlbXxuZXd0X2NoZWNrYm94X3RyZWVfZmluZF9pdGVtfG5ld3RfY2hlY2tib3hfdHJlZV9nZXRfY3VycmVudHxuZXd0X2NoZWNrYm94X3RyZWVfZ2V0X2VudHJ5X3ZhbHVlfG5ld3RfY2hlY2tib3hfdHJlZV9nZXRfbXVsdGlfc2VsZWN0aW9ufG5ld3RfY2hlY2tib3hfdHJlZV9nZXRfc2VsZWN0aW9ufG5ld3RfY2hlY2tib3hfdHJlZV9tdWx0aXxuZXd0X2NoZWNrYm94X3RyZWVfc2V0X2N1cnJlbnR8bmV3dF9jaGVja2JveF90cmVlX3NldF9lbnRyeXxuZXd0X2NoZWNrYm94X3RyZWVfc2V0X2VudHJ5X3ZhbHVlfG5ld3RfY2hlY2tib3hfdHJlZV9zZXRfd2lkdGh8bmV3dF9jbGVhcl9rZXlfYnVmZmVyfG5ld3RfY2xzfG5ld3RfY29tcGFjdF9idXR0b258bmV3dF9jb21wb25lbnRfYWRkX2NhbGxiYWNrfG5ld3RfY29tcG9uZW50X3Rha2VzX2ZvY3VzfG5ld3RfY3JlYXRlX2dyaWR8bmV3dF9jdXJzb3Jfb2ZmfG5ld3RfY3Vyc29yX29ufG5ld3RfZGVsYXl8bmV3dF9kcmF3X2Zvcm18bmV3dF9kcmF3X3Jvb3RfdGV4dHxuZXd0X2VudHJ5fG5ld3RfZW50cnlfZ2V0X3ZhbHVlfG5ld3RfZW50cnlfc2V0fG5ld3RfZW50cnlfc2V0X2ZpbHRlcnxuZXd0X2VudHJ5X3NldF9mbGFnc3xuZXd0X2ZpbmlzaGVkfG5ld3RfZm9ybXxuZXd0X2Zvcm1fYWRkX2NvbXBvbmVudHxuZXd0X2Zvcm1fYWRkX2NvbXBvbmVudHN8bmV3dF9mb3JtX2FkZF9ob3Rfa2V5fG5ld3RfZm9ybV9kZXN0cm95fG5ld3RfZm9ybV9nZXRfY3VycmVudHxuZXd0X2Zvcm1fcnVufG5ld3RfZm9ybV9zZXRfYmFja2dyb3VuZHxuZXd0X2Zvcm1fc2V0X2hlaWdodHxuZXd0X2Zvcm1fc2V0X3NpemV8bmV3dF9mb3JtX3NldF90aW1lcnxuZXd0X2Zvcm1fc2V0X3dpZHRofG5ld3RfZm9ybV93YXRjaF9mZHxuZXd0X2dldF9zY3JlZW5fc2l6ZXxuZXd0X2dyaWRfYWRkX2NvbXBvbmVudHNfdG9fZm9ybXxuZXd0X2dyaWRfYmFzaWNfd2luZG93fG5ld3RfZ3JpZF9mcmVlfG5ld3RfZ3JpZF9nZXRfc2l6ZXxuZXd0X2dyaWRfaF9jbG9zZV9zdGFja2VkfG5ld3RfZ3JpZF9oX3N0YWNrZWR8bmV3dF9ncmlkX3BsYWNlfG5ld3RfZ3JpZF9zZXRfZmllbGR8bmV3dF9ncmlkX3NpbXBsZV93aW5kb3d8bmV3dF9ncmlkX3ZfY2xvc2Vfc3RhY2tlZHxuZXd0X2dyaWRfdl9zdGFja2VkfG5ld3RfZ3JpZF93cmFwcGVkX3dpbmRvd3xuZXd0X2dyaWRfd3JhcHBlZF93aW5kb3dfYXR8bmV3dF9pbml0fG5ld3RfbGFiZWx8bmV3dF9sYWJlbF9zZXRfdGV4dHxuZXd0X2xpc3Rib3h8bmV3dF9saXN0Ym94X2FwcGVuZF9lbnRyeXxuZXd0X2xpc3Rib3hfY2xlYXJ8bmV3dF9saXN0Ym94X2NsZWFyX3NlbGVjdGlvbnxuZXd0X2xpc3Rib3hfZGVsZXRlX2VudHJ5fG5ld3RfbGlzdGJveF9nZXRfY3VycmVudHxuZXd0X2xpc3Rib3hfZ2V0X3NlbGVjdGlvbnxuZXd0X2xpc3Rib3hfaW5zZXJ0X2VudHJ5fG5ld3RfbGlzdGJveF9pdGVtX2NvdW50fG5ld3RfbGlzdGJveF9zZWxlY3RfaXRlbXxuZXd0X2xpc3Rib3hfc2V0X2N1cnJlbnR8bmV3dF9saXN0Ym94X3NldF9jdXJyZW50X2J5X2tleXxuZXd0X2xpc3Rib3hfc2V0X2RhdGF8bmV3dF9saXN0Ym94X3NldF9lbnRyeXxuZXd0X2xpc3Rib3hfc2V0X3dpZHRofG5ld3RfbGlzdGl0ZW18bmV3dF9saXN0aXRlbV9nZXRfZGF0YXxuZXd0X2xpc3RpdGVtX3NldHxuZXd0X29wZW5fd2luZG93fG5ld3RfcG9wX2hlbHBfbGluZXxuZXd0X3BvcF93aW5kb3d8bmV3dF9wdXNoX2hlbHBfbGluZXxuZXd0X3JhZGlvX2dldF9jdXJyZW50fG5ld3RfcmFkaW9idXR0b258bmV3dF9yZWRyYXdfaGVscF9saW5lfG5ld3RfcmVmbG93X3RleHR8bmV3dF9yZWZyZXNofG5ld3RfcmVzaXplX3NjcmVlbnxuZXd0X3Jlc3VtZXxuZXd0X3J1bl9mb3JtfG5ld3Rfc2NhbGV8bmV3dF9zY2FsZV9zZXR8bmV3dF9zY3JvbGxiYXJfc2V0fG5ld3Rfc2V0X2hlbHBfY2FsbGJhY2t8bmV3dF9zZXRfc3VzcGVuZF9jYWxsYmFja3xuZXd0X3N1c3BlbmR8bmV3dF90ZXh0Ym94fG5ld3RfdGV4dGJveF9nZXRfbnVtX2xpbmVzfG5ld3RfdGV4dGJveF9yZWZsb3dlZHxuZXd0X3RleHRib3hfc2V0X2hlaWdodHxuZXd0X3RleHRib3hfc2V0X3RleHR8bmV3dF92ZXJ0aWNhbF9zY3JvbGxiYXJ8bmV3dF93YWl0X2Zvcl9rZXl8bmV3dF93aW5fY2hvaWNlfG5ld3Rfd2luX2VudHJpZXN8bmV3dF93aW5fbWVudXxuZXd0X3dpbl9tZXNzYWdlfG5ld3Rfd2luX21lc3NhZ2V2fG5ld3Rfd2luX3Rlcm5hcnl8bmV4dHxuZ2V0dGV4dHxubDJicnxubF9sYW5naW5mb3xub3Jld2luZGl0ZXJhdG9yfG5vcm1hbGl6ZXJ8bm90ZXNfYm9keXxub3Rlc19jb3B5X2RifG5vdGVzX2NyZWF0ZV9kYnxub3Rlc19jcmVhdGVfbm90ZXxub3Rlc19kcm9wX2RifG5vdGVzX2ZpbmRfbm90ZXxub3Rlc19oZWFkZXJfaW5mb3xub3Rlc19saXN0X21zZ3N8bm90ZXNfbWFya19yZWFkfG5vdGVzX21hcmtfdW5yZWFkfG5vdGVzX25hdl9jcmVhdGV8bm90ZXNfc2VhcmNofG5vdGVzX3VucmVhZHxub3Rlc192ZXJzaW9ufG5zYXBpX3JlcXVlc3RfaGVhZGVyc3xuc2FwaV9yZXNwb25zZV9oZWFkZXJzfG5zYXBpX3ZpcnR1YWx8bnRobWFjfG51bWJlcl9mb3JtYXR8bnVtYmVyZm9ybWF0dGVyfG9hdXRofG9hdXRoX2dldF9zYnN8b2F1dGhfdXJsZW5jb2RlfG9hdXRoZXhjZXB0aW9ufG9hdXRocHJvdmlkZXJ8b2JfY2xlYW58b2JfZGVmbGF0ZWhhbmRsZXJ8b2JfZW5kX2NsZWFufG9iX2VuZF9mbHVzaHxvYl9ldGFnaGFuZGxlcnxvYl9mbHVzaHxvYl9nZXRfY2xlYW58b2JfZ2V0X2NvbnRlbnRzfG9iX2dldF9mbHVzaHxvYl9nZXRfbGVuZ3RofG9iX2dldF9sZXZlbHxvYl9nZXRfc3RhdHVzfG9iX2d6aGFuZGxlcnxvYl9pY29udl9oYW5kbGVyfG9iX2ltcGxpY2l0X2ZsdXNofG9iX2luZmxhdGVoYW5kbGVyfG9iX2xpc3RfaGFuZGxlcnN8b2Jfc3RhcnR8b2JfdGlkeWhhbmRsZXJ8b2NpX2JpbmRfYXJyYXlfYnlfbmFtZXxvY2lfYmluZF9ieV9uYW1lfG9jaV9jYW5jZWx8b2NpX2NsaWVudF92ZXJzaW9ufG9jaV9jbG9zZXxvY2lfY29sbGVjdGlvbl9hcHBlbmR8b2NpX2NvbGxlY3Rpb25fYXNzaWdufG9jaV9jb2xsZWN0aW9uX2VsZW1lbnRfYXNzaWdufG9jaV9jb2xsZWN0aW9uX2VsZW1lbnRfZ2V0fG9jaV9jb2xsZWN0aW9uX2ZyZWV8b2NpX2NvbGxlY3Rpb25fbWF4fG9jaV9jb2xsZWN0aW9uX3NpemV8b2NpX2NvbGxlY3Rpb25fdHJpbXxvY2lfY29tbWl0fG9jaV9jb25uZWN0fG9jaV9kZWZpbmVfYnlfbmFtZXxvY2lfZXJyb3J8b2NpX2V4ZWN1dGV8b2NpX2ZldGNofG9jaV9mZXRjaF9hbGx8b2NpX2ZldGNoX2FycmF5fG9jaV9mZXRjaF9hc3NvY3xvY2lfZmV0Y2hfb2JqZWN0fG9jaV9mZXRjaF9yb3d8b2NpX2ZpZWxkX2lzX251bGx8b2NpX2ZpZWxkX25hbWV8b2NpX2ZpZWxkX3ByZWNpc2lvbnxvY2lfZmllbGRfc2NhbGV8b2NpX2ZpZWxkX3NpemV8b2NpX2ZpZWxkX3R5cGV8b2NpX2ZpZWxkX3R5cGVfcmF3fG9jaV9mcmVlX3N0YXRlbWVudHxvY2lfaW50ZXJuYWxfZGVidWd8b2NpX2xvYl9hcHBlbmR8b2NpX2xvYl9jbG9zZXxvY2lfbG9iX2NvcHl8b2NpX2xvYl9lb2Z8b2NpX2xvYl9lcmFzZXxvY2lfbG9iX2V4cG9ydHxvY2lfbG9iX2ZsdXNofG9jaV9sb2JfZnJlZXxvY2lfbG9iX2dldGJ1ZmZlcmluZ3xvY2lfbG9iX2ltcG9ydHxvY2lfbG9iX2lzX2VxdWFsfG9jaV9sb2JfbG9hZHxvY2lfbG9iX3JlYWR8b2NpX2xvYl9yZXdpbmR8b2NpX2xvYl9zYXZlfG9jaV9sb2Jfc2F2ZWZpbGV8b2NpX2xvYl9zZWVrfG9jaV9sb2Jfc2V0YnVmZmVyaW5nfG9jaV9sb2Jfc2l6ZXxvY2lfbG9iX3RlbGx8b2NpX2xvYl90cnVuY2F0ZXxvY2lfbG9iX3dyaXRlfG9jaV9sb2Jfd3JpdGV0ZW1wb3Jhcnl8b2NpX2xvYl93cml0ZXRvZmlsZXxvY2lfbmV3X2NvbGxlY3Rpb258b2NpX25ld19jb25uZWN0fG9jaV9uZXdfY3Vyc29yfG9jaV9uZXdfZGVzY3JpcHRvcnxvY2lfbnVtX2ZpZWxkc3xvY2lfbnVtX3Jvd3N8b2NpX3BhcnNlfG9jaV9wYXNzd29yZF9jaGFuZ2V8b2NpX3Bjb25uZWN0fG9jaV9yZXN1bHR8b2NpX3JvbGxiYWNrfG9jaV9zZXJ2ZXJfdmVyc2lvbnxvY2lfc2V0X2FjdGlvbnxvY2lfc2V0X2NsaWVudF9pZGVudGlmaWVyfG9jaV9zZXRfY2xpZW50X2luZm98b2NpX3NldF9lZGl0aW9ufG9jaV9zZXRfbW9kdWxlX25hbWV8b2NpX3NldF9wcmVmZXRjaHxvY2lfc3RhdGVtZW50X3R5cGV8b2NpYmluZGJ5bmFtZXxvY2ljYW5jZWx8b2NpY2xvc2Vsb2J8b2NpY29sbGFwcGVuZHxvY2ljb2xsYXNzaWdufG9jaWNvbGxhc3NpZ25lbGVtfG9jaWNvbGxnZXRlbGVtfG9jaWNvbGxtYXh8b2NpY29sbHNpemV8b2NpY29sbHRyaW18b2NpY29sdW1uaXNudWxsfG9jaWNvbHVtbm5hbWV8b2NpY29sdW1ucHJlY2lzaW9ufG9jaWNvbHVtbnNjYWxlfG9jaWNvbHVtbnNpemV8b2NpY29sdW1udHlwZXxvY2ljb2x1bW50eXBlcmF3fG9jaWNvbW1pdHxvY2lkZWZpbmVieW5hbWV8b2NpZXJyb3J8b2NpZXhlY3V0ZXxvY2lmZXRjaHxvY2lmZXRjaGludG98b2NpZmV0Y2hzdGF0ZW1lbnR8b2NpZnJlZWNvbGxlY3Rpb258b2NpZnJlZWN1cnNvcnxvY2lmcmVlZGVzY3xvY2lmcmVlc3RhdGVtZW50fG9jaWludGVybmFsZGVidWd8b2NpbG9hZGxvYnxvY2lsb2dvZmZ8b2NpbG9nb258b2NpbmV3Y29sbGVjdGlvbnxvY2luZXdjdXJzb3J8b2NpbmV3ZGVzY3JpcHRvcnxvY2lubG9nb258b2NpbnVtY29sc3xvY2lwYXJzZXxvY2lwbG9nb258b2NpcmVzdWx0fG9jaXJvbGxiYWNrfG9jaXJvd2NvdW50fG9jaXNhdmVsb2J8b2Npc2F2ZWxvYmZpbGV8b2Npc2VydmVydmVyc2lvbnxvY2lzZXRwcmVmZXRjaHxvY2lzdGF0ZW1lbnR0eXBlfG9jaXdyaXRlbG9idG9maWxlfG9jaXdyaXRldGVtcG9yYXJ5bG9ifG9jdGRlY3xvZGJjX2F1dG9jb21taXR8b2RiY19iaW5tb2RlfG9kYmNfY2xvc2V8b2RiY19jbG9zZV9hbGx8b2RiY19jb2x1bW5wcml2aWxlZ2VzfG9kYmNfY29sdW1uc3xvZGJjX2NvbW1pdHxvZGJjX2Nvbm5lY3R8b2RiY19jdXJzb3J8b2RiY19kYXRhX3NvdXJjZXxvZGJjX2RvfG9kYmNfZXJyb3J8b2RiY19lcnJvcm1zZ3xvZGJjX2V4ZWN8b2RiY19leGVjdXRlfG9kYmNfZmV0Y2hfYXJyYXl8b2RiY19mZXRjaF9pbnRvfG9kYmNfZmV0Y2hfb2JqZWN0fG9kYmNfZmV0Y2hfcm93fG9kYmNfZmllbGRfbGVufG9kYmNfZmllbGRfbmFtZXxvZGJjX2ZpZWxkX251bXxvZGJjX2ZpZWxkX3ByZWNpc2lvbnxvZGJjX2ZpZWxkX3NjYWxlfG9kYmNfZmllbGRfdHlwZXxvZGJjX2ZvcmVpZ25rZXlzfG9kYmNfZnJlZV9yZXN1bHR8b2RiY19nZXR0eXBlaW5mb3xvZGJjX2xvbmdyZWFkbGVufG9kYmNfbmV4dF9yZXN1bHR8b2RiY19udW1fZmllbGRzfG9kYmNfbnVtX3Jvd3N8b2RiY19wY29ubmVjdHxvZGJjX3ByZXBhcmV8b2RiY19wcmltYXJ5a2V5c3xvZGJjX3Byb2NlZHVyZWNvbHVtbnN8b2RiY19wcm9jZWR1cmVzfG9kYmNfcmVzdWx0fG9kYmNfcmVzdWx0X2FsbHxvZGJjX3JvbGxiYWNrfG9kYmNfc2V0b3B0aW9ufG9kYmNfc3BlY2lhbGNvbHVtbnN8b2RiY19zdGF0aXN0aWNzfG9kYmNfdGFibGVwcml2aWxlZ2VzfG9kYmNfdGFibGVzfG9wZW5hbF9idWZmZXJfY3JlYXRlfG9wZW5hbF9idWZmZXJfZGF0YXxvcGVuYWxfYnVmZmVyX2Rlc3Ryb3l8b3BlbmFsX2J1ZmZlcl9nZXR8b3BlbmFsX2J1ZmZlcl9sb2Fkd2F2fG9wZW5hbF9jb250ZXh0X2NyZWF0ZXxvcGVuYWxfY29udGV4dF9jdXJyZW50fG9wZW5hbF9jb250ZXh0X2Rlc3Ryb3l8b3BlbmFsX2NvbnRleHRfcHJvY2Vzc3xvcGVuYWxfY29udGV4dF9zdXNwZW5kfG9wZW5hbF9kZXZpY2VfY2xvc2V8b3BlbmFsX2RldmljZV9vcGVufG9wZW5hbF9saXN0ZW5lcl9nZXR8b3BlbmFsX2xpc3RlbmVyX3NldHxvcGVuYWxfc291cmNlX2NyZWF0ZXxvcGVuYWxfc291cmNlX2Rlc3Ryb3l8b3BlbmFsX3NvdXJjZV9nZXR8b3BlbmFsX3NvdXJjZV9wYXVzZXxvcGVuYWxfc291cmNlX3BsYXl8b3BlbmFsX3NvdXJjZV9yZXdpbmR8b3BlbmFsX3NvdXJjZV9zZXR8b3BlbmFsX3NvdXJjZV9zdG9wfG9wZW5hbF9zdHJlYW18b3BlbmRpcnxvcGVubG9nfG9wZW5zc2xfY2lwaGVyX2l2X2xlbmd0aHxvcGVuc3NsX2Nzcl9leHBvcnR8b3BlbnNzbF9jc3JfZXhwb3J0X3RvX2ZpbGV8b3BlbnNzbF9jc3JfZ2V0X3B1YmxpY19rZXl8b3BlbnNzbF9jc3JfZ2V0X3N1YmplY3R8b3BlbnNzbF9jc3JfbmV3fG9wZW5zc2xfY3NyX3NpZ258b3BlbnNzbF9kZWNyeXB0fG9wZW5zc2xfZGhfY29tcHV0ZV9rZXl8b3BlbnNzbF9kaWdlc3R8b3BlbnNzbF9lbmNyeXB0fG9wZW5zc2xfZXJyb3Jfc3RyaW5nfG9wZW5zc2xfZnJlZV9rZXl8b3BlbnNzbF9nZXRfY2lwaGVyX21ldGhvZHN8b3BlbnNzbF9nZXRfbWRfbWV0aG9kc3xvcGVuc3NsX2dldF9wcml2YXRla2V5fG9wZW5zc2xfZ2V0X3B1YmxpY2tleXxvcGVuc3NsX29wZW58b3BlbnNzbF9wa2NzMTJfZXhwb3J0fG9wZW5zc2xfcGtjczEyX2V4cG9ydF90b19maWxlfG9wZW5zc2xfcGtjczEyX3JlYWR8b3BlbnNzbF9wa2NzN19kZWNyeXB0fG9wZW5zc2xfcGtjczdfZW5jcnlwdHxvcGVuc3NsX3BrY3M3X3NpZ258b3BlbnNzbF9wa2NzN192ZXJpZnl8b3BlbnNzbF9wa2V5X2V4cG9ydHxvcGVuc3NsX3BrZXlfZXhwb3J0X3RvX2ZpbGV8b3BlbnNzbF9wa2V5X2ZyZWV8b3BlbnNzbF9wa2V5X2dldF9kZXRhaWxzfG9wZW5zc2xfcGtleV9nZXRfcHJpdmF0ZXxvcGVuc3NsX3BrZXlfZ2V0X3B1YmxpY3xvcGVuc3NsX3BrZXlfbmV3fG9wZW5zc2xfcHJpdmF0ZV9kZWNyeXB0fG9wZW5zc2xfcHJpdmF0ZV9lbmNyeXB0fG9wZW5zc2xfcHVibGljX2RlY3J5cHR8b3BlbnNzbF9wdWJsaWNfZW5jcnlwdHxvcGVuc3NsX3JhbmRvbV9wc2V1ZG9fYnl0ZXN8b3BlbnNzbF9zZWFsfG9wZW5zc2xfc2lnbnxvcGVuc3NsX3ZlcmlmeXxvcGVuc3NsX3g1MDlfY2hlY2tfcHJpdmF0ZV9rZXl8b3BlbnNzbF94NTA5X2NoZWNrcHVycG9zZXxvcGVuc3NsX3g1MDlfZXhwb3J0fG9wZW5zc2xfeDUwOV9leHBvcnRfdG9fZmlsZXxvcGVuc3NsX3g1MDlfZnJlZXxvcGVuc3NsX3g1MDlfcGFyc2V8b3BlbnNzbF94NTA5X3JlYWR8b3JkfG91dGVyaXRlcmF0b3J8b3V0b2Zib3VuZHNleGNlcHRpb258b3V0b2ZyYW5nZWV4Y2VwdGlvbnxvdXRwdXRfYWRkX3Jld3JpdGVfdmFyfG91dHB1dF9yZXNldF9yZXdyaXRlX3ZhcnN8b3ZlcmZsb3dleGNlcHRpb258b3ZlcmxvYWR8b3ZlcnJpZGVfZnVuY3Rpb258b3ZyaW1vc19jbG9zZXxvdnJpbW9zX2NvbW1pdHxvdnJpbW9zX2Nvbm5lY3R8b3ZyaW1vc19jdXJzb3J8b3ZyaW1vc19leGVjfG92cmltb3NfZXhlY3V0ZXxvdnJpbW9zX2ZldGNoX2ludG98b3ZyaW1vc19mZXRjaF9yb3d8b3ZyaW1vc19maWVsZF9sZW58b3ZyaW1vc19maWVsZF9uYW1lfG92cmltb3NfZmllbGRfbnVtfG92cmltb3NfZmllbGRfdHlwZXxvdnJpbW9zX2ZyZWVfcmVzdWx0fG92cmltb3NfbG9uZ3JlYWRsZW58b3ZyaW1vc19udW1fZmllbGRzfG92cmltb3NfbnVtX3Jvd3N8b3ZyaW1vc19wcmVwYXJlfG92cmltb3NfcmVzdWx0fG92cmltb3NfcmVzdWx0X2FsbHxvdnJpbW9zX3JvbGxiYWNrfHBhY2t8cGFyZW50aXRlcmF0b3J8cGFyc2VfaW5pX2ZpbGV8cGFyc2VfaW5pX3N0cmluZ3xwYXJzZV9zdHJ8cGFyc2VfdXJsfHBhcnNla2l0X2NvbXBpbGVfZmlsZXxwYXJzZWtpdF9jb21waWxlX3N0cmluZ3xwYXJzZWtpdF9mdW5jX2FyZ2luZm98cGFzc3RocnV8cGF0aGluZm98cGNsb3NlfHBjbnRsX2FsYXJtfHBjbnRsX2V4ZWN8cGNudGxfZm9ya3xwY250bF9nZXRwcmlvcml0eXxwY250bF9zZXRwcmlvcml0eXxwY250bF9zaWduYWx8cGNudGxfc2lnbmFsX2Rpc3BhdGNofHBjbnRsX3NpZ3Byb2NtYXNrfHBjbnRsX3NpZ3RpbWVkd2FpdHxwY250bF9zaWd3YWl0aW5mb3xwY250bF93YWl0fHBjbnRsX3dhaXRwaWR8cGNudGxfd2V4aXRzdGF0dXN8cGNudGxfd2lmZXhpdGVkfHBjbnRsX3dpZnNpZ25hbGVkfHBjbnRsX3dpZnN0b3BwZWR8cGNudGxfd3N0b3BzaWd8cGNudGxfd3Rlcm1zaWd8cGRmX2FjdGl2YXRlX2l0ZW18cGRmX2FkZF9hbm5vdGF0aW9ufHBkZl9hZGRfYm9va21hcmt8cGRmX2FkZF9sYXVuY2hsaW5rfHBkZl9hZGRfbG9jYWxsaW5rfHBkZl9hZGRfbmFtZWRkZXN0fHBkZl9hZGRfbm90ZXxwZGZfYWRkX291dGxpbmV8cGRmX2FkZF9wZGZsaW5rfHBkZl9hZGRfdGFibGVfY2VsbHxwZGZfYWRkX3RleHRmbG93fHBkZl9hZGRfdGh1bWJuYWlsfHBkZl9hZGRfd2VibGlua3xwZGZfYXJjfHBkZl9hcmNufHBkZl9hdHRhY2hfZmlsZXxwZGZfYmVnaW5fZG9jdW1lbnR8cGRmX2JlZ2luX2ZvbnR8cGRmX2JlZ2luX2dseXBofHBkZl9iZWdpbl9pdGVtfHBkZl9iZWdpbl9sYXllcnxwZGZfYmVnaW5fcGFnZXxwZGZfYmVnaW5fcGFnZV9leHR8cGRmX2JlZ2luX3BhdHRlcm58cGRmX2JlZ2luX3RlbXBsYXRlfHBkZl9iZWdpbl90ZW1wbGF0ZV9leHR8cGRmX2NpcmNsZXxwZGZfY2xpcHxwZGZfY2xvc2V8cGRmX2Nsb3NlX2ltYWdlfHBkZl9jbG9zZV9wZGl8cGRmX2Nsb3NlX3BkaV9wYWdlfHBkZl9jbG9zZXBhdGh8cGRmX2Nsb3NlcGF0aF9maWxsX3N0cm9rZXxwZGZfY2xvc2VwYXRoX3N0cm9rZXxwZGZfY29uY2F0fHBkZl9jb250aW51ZV90ZXh0fHBkZl9jcmVhdGVfM2R2aWV3fHBkZl9jcmVhdGVfYWN0aW9ufHBkZl9jcmVhdGVfYW5ub3RhdGlvbnxwZGZfY3JlYXRlX2Jvb2ttYXJrfHBkZl9jcmVhdGVfZmllbGR8cGRmX2NyZWF0ZV9maWVsZGdyb3VwfHBkZl9jcmVhdGVfZ3N0YXRlfHBkZl9jcmVhdGVfcHZmfHBkZl9jcmVhdGVfdGV4dGZsb3d8cGRmX2N1cnZldG98cGRmX2RlZmluZV9sYXllcnxwZGZfZGVsZXRlfHBkZl9kZWxldGVfcHZmfHBkZl9kZWxldGVfdGFibGV8cGRmX2RlbGV0ZV90ZXh0Zmxvd3xwZGZfZW5jb2Rpbmdfc2V0X2NoYXJ8cGRmX2VuZF9kb2N1bWVudHxwZGZfZW5kX2ZvbnR8cGRmX2VuZF9nbHlwaHxwZGZfZW5kX2l0ZW18cGRmX2VuZF9sYXllcnxwZGZfZW5kX3BhZ2V8cGRmX2VuZF9wYWdlX2V4dHxwZGZfZW5kX3BhdHRlcm58cGRmX2VuZF90ZW1wbGF0ZXxwZGZfZW5kcGF0aHxwZGZfZmlsbHxwZGZfZmlsbF9pbWFnZWJsb2NrfHBkZl9maWxsX3BkZmJsb2NrfHBkZl9maWxsX3N0cm9rZXxwZGZfZmlsbF90ZXh0YmxvY2t8cGRmX2ZpbmRmb250fHBkZl9maXRfaW1hZ2V8cGRmX2ZpdF9wZGlfcGFnZXxwZGZfZml0X3RhYmxlfHBkZl9maXRfdGV4dGZsb3d8cGRmX2ZpdF90ZXh0bGluZXxwZGZfZ2V0X2FwaW5hbWV8cGRmX2dldF9idWZmZXJ8cGRmX2dldF9lcnJtc2d8cGRmX2dldF9lcnJudW18cGRmX2dldF9mb250fHBkZl9nZXRfZm9udG5hbWV8cGRmX2dldF9mb250c2l6ZXxwZGZfZ2V0X2ltYWdlX2hlaWdodHxwZGZfZ2V0X2ltYWdlX3dpZHRofHBkZl9nZXRfbWFqb3J2ZXJzaW9ufHBkZl9nZXRfbWlub3J2ZXJzaW9ufHBkZl9nZXRfcGFyYW1ldGVyfHBkZl9nZXRfcGRpX3BhcmFtZXRlcnxwZGZfZ2V0X3BkaV92YWx1ZXxwZGZfZ2V0X3ZhbHVlfHBkZl9pbmZvX2ZvbnR8cGRmX2luZm9fbWF0Y2hib3h8cGRmX2luZm9fdGFibGV8cGRmX2luZm9fdGV4dGZsb3d8cGRmX2luZm9fdGV4dGxpbmV8cGRmX2luaXRncmFwaGljc3xwZGZfbGluZXRvfHBkZl9sb2FkXzNkZGF0YXxwZGZfbG9hZF9mb250fHBkZl9sb2FkX2ljY3Byb2ZpbGV8cGRmX2xvYWRfaW1hZ2V8cGRmX21ha2VzcG90Y29sb3J8cGRmX21vdmV0b3xwZGZfbmV3fHBkZl9vcGVuX2NjaXR0fHBkZl9vcGVuX2ZpbGV8cGRmX29wZW5fZ2lmfHBkZl9vcGVuX2ltYWdlfHBkZl9vcGVuX2ltYWdlX2ZpbGV8cGRmX29wZW5fanBlZ3xwZGZfb3Blbl9tZW1vcnlfaW1hZ2V8cGRmX29wZW5fcGRpfHBkZl9vcGVuX3BkaV9kb2N1bWVudHxwZGZfb3Blbl9wZGlfcGFnZXxwZGZfb3Blbl90aWZmfHBkZl9wY29zX2dldF9udW1iZXJ8cGRmX3Bjb3NfZ2V0X3N0cmVhbXxwZGZfcGNvc19nZXRfc3RyaW5nfHBkZl9wbGFjZV9pbWFnZXxwZGZfcGxhY2VfcGRpX3BhZ2V8cGRmX3Byb2Nlc3NfcGRpfHBkZl9yZWN0fHBkZl9yZXN0b3JlfHBkZl9yZXN1bWVfcGFnZXxwZGZfcm90YXRlfHBkZl9zYXZlfHBkZl9zY2FsZXxwZGZfc2V0X2JvcmRlcl9jb2xvcnxwZGZfc2V0X2JvcmRlcl9kYXNofHBkZl9zZXRfYm9yZGVyX3N0eWxlfHBkZl9zZXRfY2hhcl9zcGFjaW5nfHBkZl9zZXRfZHVyYXRpb258cGRmX3NldF9nc3RhdGV8cGRmX3NldF9ob3Jpel9zY2FsaW5nfHBkZl9zZXRfaW5mb3xwZGZfc2V0X2luZm9fYXV0aG9yfHBkZl9zZXRfaW5mb19jcmVhdG9yfHBkZl9zZXRfaW5mb19rZXl3b3Jkc3xwZGZfc2V0X2luZm9fc3ViamVjdHxwZGZfc2V0X2luZm9fdGl0bGV8cGRmX3NldF9sYXllcl9kZXBlbmRlbmN5fHBkZl9zZXRfbGVhZGluZ3xwZGZfc2V0X3BhcmFtZXRlcnxwZGZfc2V0X3RleHRfbWF0cml4fHBkZl9zZXRfdGV4dF9wb3N8cGRmX3NldF90ZXh0X3JlbmRlcmluZ3xwZGZfc2V0X3RleHRfcmlzZXxwZGZfc2V0X3ZhbHVlfHBkZl9zZXRfd29yZF9zcGFjaW5nfHBkZl9zZXRjb2xvcnxwZGZfc2V0ZGFzaHxwZGZfc2V0ZGFzaHBhdHRlcm58cGRmX3NldGZsYXR8cGRmX3NldGZvbnR8cGRmX3NldGdyYXl8cGRmX3NldGdyYXlfZmlsbHxwZGZfc2V0Z3JheV9zdHJva2V8cGRmX3NldGxpbmVjYXB8cGRmX3NldGxpbmVqb2lufHBkZl9zZXRsaW5ld2lkdGh8cGRmX3NldG1hdHJpeHxwZGZfc2V0bWl0ZXJsaW1pdHxwZGZfc2V0cG9seWRhc2h8cGRmX3NldHJnYmNvbG9yfHBkZl9zZXRyZ2Jjb2xvcl9maWxsfHBkZl9zZXRyZ2Jjb2xvcl9zdHJva2V8cGRmX3NoYWRpbmd8cGRmX3NoYWRpbmdfcGF0dGVybnxwZGZfc2hmaWxsfHBkZl9zaG93fHBkZl9zaG93X2JveGVkfHBkZl9zaG93X3h5fHBkZl9za2V3fHBkZl9zdHJpbmd3aWR0aHxwZGZfc3Ryb2tlfHBkZl9zdXNwZW5kX3BhZ2V8cGRmX3RyYW5zbGF0ZXxwZGZfdXRmMTZfdG9fdXRmOHxwZGZfdXRmMzJfdG9fdXRmMTZ8cGRmX3V0ZjhfdG9fdXRmMTZ8cGRvfHBkb19jdWJyaWRfc2NoZW1hfHBkb19wZ3NxbGxvYmNyZWF0ZXxwZG9fcGdzcWxsb2JvcGVufHBkb19wZ3NxbGxvYnVubGlua3xwZG9fc3FsaXRlY3JlYXRlYWdncmVnYXRlfHBkb19zcWxpdGVjcmVhdGVmdW5jdGlvbnxwZG9leGNlcHRpb258cGRvc3RhdGVtZW50fHBmc29ja29wZW58cGdfYWZmZWN0ZWRfcm93c3xwZ19jYW5jZWxfcXVlcnl8cGdfY2xpZW50X2VuY29kaW5nfHBnX2Nsb3NlfHBnX2Nvbm5lY3R8cGdfY29ubmVjdGlvbl9idXN5fHBnX2Nvbm5lY3Rpb25fcmVzZXR8cGdfY29ubmVjdGlvbl9zdGF0dXN8cGdfY29udmVydHxwZ19jb3B5X2Zyb218cGdfY29weV90b3xwZ19kYm5hbWV8cGdfZGVsZXRlfHBnX2VuZF9jb3B5fHBnX2VzY2FwZV9ieXRlYXxwZ19lc2NhcGVfc3RyaW5nfHBnX2V4ZWN1dGV8cGdfZmV0Y2hfYWxsfHBnX2ZldGNoX2FsbF9jb2x1bW5zfHBnX2ZldGNoX2FycmF5fHBnX2ZldGNoX2Fzc29jfHBnX2ZldGNoX29iamVjdHxwZ19mZXRjaF9yZXN1bHR8cGdfZmV0Y2hfcm93fHBnX2ZpZWxkX2lzX251bGx8cGdfZmllbGRfbmFtZXxwZ19maWVsZF9udW18cGdfZmllbGRfcHJ0bGVufHBnX2ZpZWxkX3NpemV8cGdfZmllbGRfdGFibGV8cGdfZmllbGRfdHlwZXxwZ19maWVsZF90eXBlX29pZHxwZ19mcmVlX3Jlc3VsdHxwZ19nZXRfbm90aWZ5fHBnX2dldF9waWR8cGdfZ2V0X3Jlc3VsdHxwZ19ob3N0fHBnX2luc2VydHxwZ19sYXN0X2Vycm9yfHBnX2xhc3Rfbm90aWNlfHBnX2xhc3Rfb2lkfHBnX2xvX2Nsb3NlfHBnX2xvX2NyZWF0ZXxwZ19sb19leHBvcnR8cGdfbG9faW1wb3J0fHBnX2xvX29wZW58cGdfbG9fcmVhZHxwZ19sb19yZWFkX2FsbHxwZ19sb19zZWVrfHBnX2xvX3RlbGx8cGdfbG9fdW5saW5rfHBnX2xvX3dyaXRlfHBnX21ldGFfZGF0YXxwZ19udW1fZmllbGRzfHBnX251bV9yb3dzfHBnX29wdGlvbnN8cGdfcGFyYW1ldGVyX3N0YXR1c3xwZ19wY29ubmVjdHxwZ19waW5nfHBnX3BvcnR8cGdfcHJlcGFyZXxwZ19wdXRfbGluZXxwZ19xdWVyeXxwZ19xdWVyeV9wYXJhbXN8cGdfcmVzdWx0X2Vycm9yfHBnX3Jlc3VsdF9lcnJvcl9maWVsZHxwZ19yZXN1bHRfc2Vla3xwZ19yZXN1bHRfc3RhdHVzfHBnX3NlbGVjdHxwZ19zZW5kX2V4ZWN1dGV8cGdfc2VuZF9wcmVwYXJlfHBnX3NlbmRfcXVlcnl8cGdfc2VuZF9xdWVyeV9wYXJhbXN8cGdfc2V0X2NsaWVudF9lbmNvZGluZ3xwZ19zZXRfZXJyb3JfdmVyYm9zaXR5fHBnX3RyYWNlfHBnX3RyYW5zYWN0aW9uX3N0YXR1c3xwZ190dHl8cGdfdW5lc2NhcGVfYnl0ZWF8cGdfdW50cmFjZXxwZ191cGRhdGV8cGdfdmVyc2lvbnxwaHBfY2hlY2tfc3ludGF4fHBocF9pbmlfbG9hZGVkX2ZpbGV8cGhwX2luaV9zY2FubmVkX2ZpbGVzfHBocF9sb2dvX2d1aWR8cGhwX3NhcGlfbmFtZXxwaHBfc3RyaXBfd2hpdGVzcGFjZXxwaHBfdW5hbWV8cGhwY3JlZGl0c3xwaHBpbmZvfHBocHZlcnNpb258cGl8cG5nMndibXB8cG9wZW58cG9zfHBvc2l4X2FjY2Vzc3xwb3NpeF9jdGVybWlkfHBvc2l4X2Vycm5vfHBvc2l4X2dldF9sYXN0X2Vycm9yfHBvc2l4X2dldGN3ZHxwb3NpeF9nZXRlZ2lkfHBvc2l4X2dldGV1aWR8cG9zaXhfZ2V0Z2lkfHBvc2l4X2dldGdyZ2lkfHBvc2l4X2dldGdybmFtfHBvc2l4X2dldGdyb3Vwc3xwb3NpeF9nZXRsb2dpbnxwb3NpeF9nZXRwZ2lkfHBvc2l4X2dldHBncnB8cG9zaXhfZ2V0cGlkfHBvc2l4X2dldHBwaWR8cG9zaXhfZ2V0cHduYW18cG9zaXhfZ2V0cHd1aWR8cG9zaXhfZ2V0cmxpbWl0fHBvc2l4X2dldHNpZHxwb3NpeF9nZXR1aWR8cG9zaXhfaW5pdGdyb3Vwc3xwb3NpeF9pc2F0dHl8cG9zaXhfa2lsbHxwb3NpeF9ta2ZpZm98cG9zaXhfbWtub2R8cG9zaXhfc2V0ZWdpZHxwb3NpeF9zZXRldWlkfHBvc2l4X3NldGdpZHxwb3NpeF9zZXRwZ2lkfHBvc2l4X3NldHNpZHxwb3NpeF9zZXR1aWR8cG9zaXhfc3RyZXJyb3J8cG9zaXhfdGltZXN8cG9zaXhfdHR5bmFtZXxwb3NpeF91bmFtZXxwb3d8cHJlZ19maWx0ZXJ8cHJlZ19ncmVwfHByZWdfbGFzdF9lcnJvcnxwcmVnX21hdGNofHByZWdfbWF0Y2hfYWxsfHByZWdfcXVvdGV8cHJlZ19yZXBsYWNlfHByZWdfcmVwbGFjZV9jYWxsYmFja3xwcmVnX3NwbGl0fHByZXZ8cHJpbnR8cHJpbnRfcnxwcmludGVyX2Fib3J0fHByaW50ZXJfY2xvc2V8cHJpbnRlcl9jcmVhdGVfYnJ1c2h8cHJpbnRlcl9jcmVhdGVfZGN8cHJpbnRlcl9jcmVhdGVfZm9udHxwcmludGVyX2NyZWF0ZV9wZW58cHJpbnRlcl9kZWxldGVfYnJ1c2h8cHJpbnRlcl9kZWxldGVfZGN8cHJpbnRlcl9kZWxldGVfZm9udHxwcmludGVyX2RlbGV0ZV9wZW58cHJpbnRlcl9kcmF3X2JtcHxwcmludGVyX2RyYXdfY2hvcmR8cHJpbnRlcl9kcmF3X2VsaXBzZXxwcmludGVyX2RyYXdfbGluZXxwcmludGVyX2RyYXdfcGllfHByaW50ZXJfZHJhd19yZWN0YW5nbGV8cHJpbnRlcl9kcmF3X3JvdW5kcmVjdHxwcmludGVyX2RyYXdfdGV4dHxwcmludGVyX2VuZF9kb2N8cHJpbnRlcl9lbmRfcGFnZXxwcmludGVyX2dldF9vcHRpb258cHJpbnRlcl9saXN0fHByaW50ZXJfbG9naWNhbF9mb250aGVpZ2h0fHByaW50ZXJfb3BlbnxwcmludGVyX3NlbGVjdF9icnVzaHxwcmludGVyX3NlbGVjdF9mb250fHByaW50ZXJfc2VsZWN0X3BlbnxwcmludGVyX3NldF9vcHRpb258cHJpbnRlcl9zdGFydF9kb2N8cHJpbnRlcl9zdGFydF9wYWdlfHByaW50ZXJfd3JpdGV8cHJpbnRmfHByb2NfY2xvc2V8cHJvY19nZXRfc3RhdHVzfHByb2NfbmljZXxwcm9jX29wZW58cHJvY190ZXJtaW5hdGV8cHJvcGVydHlfZXhpc3RzfHBzX2FkZF9ib29rbWFya3xwc19hZGRfbGF1bmNobGlua3xwc19hZGRfbG9jYWxsaW5rfHBzX2FkZF9ub3RlfHBzX2FkZF9wZGZsaW5rfHBzX2FkZF93ZWJsaW5rfHBzX2FyY3xwc19hcmNufHBzX2JlZ2luX3BhZ2V8cHNfYmVnaW5fcGF0dGVybnxwc19iZWdpbl90ZW1wbGF0ZXxwc19jaXJjbGV8cHNfY2xpcHxwc19jbG9zZXxwc19jbG9zZV9pbWFnZXxwc19jbG9zZXBhdGh8cHNfY2xvc2VwYXRoX3N0cm9rZXxwc19jb250aW51ZV90ZXh0fHBzX2N1cnZldG98cHNfZGVsZXRlfHBzX2VuZF9wYWdlfHBzX2VuZF9wYXR0ZXJufHBzX2VuZF90ZW1wbGF0ZXxwc19maWxsfHBzX2ZpbGxfc3Ryb2tlfHBzX2ZpbmRmb250fHBzX2dldF9idWZmZXJ8cHNfZ2V0X3BhcmFtZXRlcnxwc19nZXRfdmFsdWV8cHNfaHlwaGVuYXRlfHBzX2luY2x1ZGVfZmlsZXxwc19saW5ldG98cHNfbWFrZXNwb3Rjb2xvcnxwc19tb3ZldG98cHNfbmV3fHBzX29wZW5fZmlsZXxwc19vcGVuX2ltYWdlfHBzX29wZW5faW1hZ2VfZmlsZXxwc19vcGVuX21lbW9yeV9pbWFnZXxwc19wbGFjZV9pbWFnZXxwc19yZWN0fHBzX3Jlc3RvcmV8cHNfcm90YXRlfHBzX3NhdmV8cHNfc2NhbGV8cHNfc2V0X2JvcmRlcl9jb2xvcnxwc19zZXRfYm9yZGVyX2Rhc2h8cHNfc2V0X2JvcmRlcl9zdHlsZXxwc19zZXRfaW5mb3xwc19zZXRfcGFyYW1ldGVyfHBzX3NldF90ZXh0X3Bvc3xwc19zZXRfdmFsdWV8cHNfc2V0Y29sb3J8cHNfc2V0ZGFzaHxwc19zZXRmbGF0fHBzX3NldGZvbnR8cHNfc2V0Z3JheXxwc19zZXRsaW5lY2FwfHBzX3NldGxpbmVqb2lufHBzX3NldGxpbmV3aWR0aHxwc19zZXRtaXRlcmxpbWl0fHBzX3NldG92ZXJwcmludG1vZGV8cHNfc2V0cG9seWRhc2h8cHNfc2hhZGluZ3xwc19zaGFkaW5nX3BhdHRlcm58cHNfc2hmaWxsfHBzX3Nob3d8cHNfc2hvdzJ8cHNfc2hvd19ib3hlZHxwc19zaG93X3h5fHBzX3Nob3dfeHkyfHBzX3N0cmluZ19nZW9tZXRyeXxwc19zdHJpbmd3aWR0aHxwc19zdHJva2V8cHNfc3ltYm9sfHBzX3N5bWJvbF9uYW1lfHBzX3N5bWJvbF93aWR0aHxwc190cmFuc2xhdGV8cHNwZWxsX2FkZF90b19wZXJzb25hbHxwc3BlbGxfYWRkX3RvX3Nlc3Npb258cHNwZWxsX2NoZWNrfHBzcGVsbF9jbGVhcl9zZXNzaW9ufHBzcGVsbF9jb25maWdfY3JlYXRlfHBzcGVsbF9jb25maWdfZGF0YV9kaXJ8cHNwZWxsX2NvbmZpZ19kaWN0X2Rpcnxwc3BlbGxfY29uZmlnX2lnbm9yZXxwc3BlbGxfY29uZmlnX21vZGV8cHNwZWxsX2NvbmZpZ19wZXJzb25hbHxwc3BlbGxfY29uZmlnX3JlcGx8cHNwZWxsX2NvbmZpZ19ydW50b2dldGhlcnxwc3BlbGxfY29uZmlnX3NhdmVfcmVwbHxwc3BlbGxfbmV3fHBzcGVsbF9uZXdfY29uZmlnfHBzcGVsbF9uZXdfcGVyc29uYWx8cHNwZWxsX3NhdmVfd29yZGxpc3R8cHNwZWxsX3N0b3JlX3JlcGxhY2VtZW50fHBzcGVsbF9zdWdnZXN0fHB1dGVudnxweF9jbG9zZXxweF9jcmVhdGVfZnB8cHhfZGF0ZTJzdHJpbmd8cHhfZGVsZXRlfHB4X2RlbGV0ZV9yZWNvcmR8cHhfZ2V0X2ZpZWxkfHB4X2dldF9pbmZvfHB4X2dldF9wYXJhbWV0ZXJ8cHhfZ2V0X3JlY29yZHxweF9nZXRfc2NoZW1hfHB4X2dldF92YWx1ZXxweF9pbnNlcnRfcmVjb3JkfHB4X25ld3xweF9udW1maWVsZHN8cHhfbnVtcmVjb3Jkc3xweF9vcGVuX2ZwfHB4X3B1dF9yZWNvcmR8cHhfcmV0cmlldmVfcmVjb3JkfHB4X3NldF9ibG9iX2ZpbGV8cHhfc2V0X3BhcmFtZXRlcnxweF9zZXRfdGFibGVuYW1lfHB4X3NldF90YXJnZXRlbmNvZGluZ3xweF9zZXRfdmFsdWV8cHhfdGltZXN0YW1wMnN0cmluZ3xweF91cGRhdGVfcmVjb3JkfHFkb21fZXJyb3J8cWRvbV90cmVlfHF1b3RlZF9wcmludGFibGVfZGVjb2RlfHF1b3RlZF9wcmludGFibGVfZW5jb2RlfHF1b3RlbWV0YXxyYWQyZGVnfHJhZGl1c19hY2N0X29wZW58cmFkaXVzX2FkZF9zZXJ2ZXJ8cmFkaXVzX2F1dGhfb3BlbnxyYWRpdXNfY2xvc2V8cmFkaXVzX2NvbmZpZ3xyYWRpdXNfY3JlYXRlX3JlcXVlc3R8cmFkaXVzX2N2dF9hZGRyfHJhZGl1c19jdnRfaW50fHJhZGl1c19jdnRfc3RyaW5nfHJhZGl1c19kZW1hbmdsZXxyYWRpdXNfZGVtYW5nbGVfbXBwZV9rZXl8cmFkaXVzX2dldF9hdHRyfHJhZGl1c19nZXRfdmVuZG9yX2F0dHJ8cmFkaXVzX3B1dF9hZGRyfHJhZGl1c19wdXRfYXR0cnxyYWRpdXNfcHV0X2ludHxyYWRpdXNfcHV0X3N0cmluZ3xyYWRpdXNfcHV0X3ZlbmRvcl9hZGRyfHJhZGl1c19wdXRfdmVuZG9yX2F0dHJ8cmFkaXVzX3B1dF92ZW5kb3JfaW50fHJhZGl1c19wdXRfdmVuZG9yX3N0cmluZ3xyYWRpdXNfcmVxdWVzdF9hdXRoZW50aWNhdG9yfHJhZGl1c19zZW5kX3JlcXVlc3R8cmFkaXVzX3NlcnZlcl9zZWNyZXR8cmFkaXVzX3N0cmVycm9yfHJhbmR8cmFuZ2V8cmFuZ2VleGNlcHRpb258cmFyX3dyYXBwZXJfY2FjaGVfc3RhdHN8cmFyYXJjaGl2ZXxyYXJlbnRyeXxyYXJleGNlcHRpb258cmF3dXJsZGVjb2RlfHJhd3VybGVuY29kZXxyZWFkX2V4aWZfZGF0YXxyZWFkZGlyfHJlYWRmaWxlfHJlYWRnemZpbGV8cmVhZGxpbmV8cmVhZGxpbmVfYWRkX2hpc3Rvcnl8cmVhZGxpbmVfY2FsbGJhY2tfaGFuZGxlcl9pbnN0YWxsfHJlYWRsaW5lX2NhbGxiYWNrX2hhbmRsZXJfcmVtb3ZlfHJlYWRsaW5lX2NhbGxiYWNrX3JlYWRfY2hhcnxyZWFkbGluZV9jbGVhcl9oaXN0b3J5fHJlYWRsaW5lX2NvbXBsZXRpb25fZnVuY3Rpb258cmVhZGxpbmVfaW5mb3xyZWFkbGluZV9saXN0X2hpc3Rvcnl8cmVhZGxpbmVfb25fbmV3X2xpbmV8cmVhZGxpbmVfcmVhZF9oaXN0b3J5fHJlYWRsaW5lX3JlZGlzcGxheXxyZWFkbGluZV93cml0ZV9oaXN0b3J5fHJlYWRsaW5rfHJlYWxwYXRofHJlYWxwYXRoX2NhY2hlX2dldHxyZWFscGF0aF9jYWNoZV9zaXplfHJlY29kZXxyZWNvZGVfZmlsZXxyZWNvZGVfc3RyaW5nfHJlY3Vyc2l2ZWFycmF5aXRlcmF0b3J8cmVjdXJzaXZlY2FjaGluZ2l0ZXJhdG9yfHJlY3Vyc2l2ZWNhbGxiYWNrZmlsdGVyaXRlcmF0b3J8cmVjdXJzaXZlZGlyZWN0b3J5aXRlcmF0b3J8cmVjdXJzaXZlZmlsdGVyaXRlcmF0b3J8cmVjdXJzaXZlaXRlcmF0b3J8cmVjdXJzaXZlaXRlcmF0b3JpdGVyYXRvcnxyZWN1cnNpdmVyZWdleGl0ZXJhdG9yfHJlY3Vyc2l2ZXRyZWVpdGVyYXRvcnxyZWZsZWN0aW9ufHJlZmxlY3Rpb25jbGFzc3xyZWZsZWN0aW9uZXhjZXB0aW9ufHJlZmxlY3Rpb25leHRlbnNpb258cmVmbGVjdGlvbmZ1bmN0aW9ufHJlZmxlY3Rpb25mdW5jdGlvbmFic3RyYWN0fHJlZmxlY3Rpb25tZXRob2R8cmVmbGVjdGlvbm9iamVjdHxyZWZsZWN0aW9ucGFyYW1ldGVyfHJlZmxlY3Rpb25wcm9wZXJ0eXxyZWZsZWN0b3J8cmVnZXhpdGVyYXRvcnxyZWdpc3Rlcl9zaHV0ZG93bl9mdW5jdGlvbnxyZWdpc3Rlcl90aWNrX2Z1bmN0aW9ufHJlbmFtZXxyZW5hbWVfZnVuY3Rpb258cmVxdWlyZXxyZXF1aXJlX29uY2V8cmVzZXR8cmVzZXRWYWx1ZXxyZXNvdXJjZWJ1bmRsZXxyZXN0b3JlX2Vycm9yX2hhbmRsZXJ8cmVzdG9yZV9leGNlcHRpb25faGFuZGxlcnxyZXN0b3JlX2luY2x1ZGVfcGF0aHxyZXR1cm58cmV3aW5kfHJld2luZGRpcnxybWRpcnxyb3VuZHxycG1fY2xvc2V8cnBtX2dldF90YWd8cnBtX2lzX3ZhbGlkfHJwbV9vcGVufHJwbV92ZXJzaW9ufHJyZF9jcmVhdGV8cnJkX2Vycm9yfHJyZF9mZXRjaHxycmRfZmlyc3R8cnJkX2dyYXBofHJyZF9pbmZvfHJyZF9sYXN0fHJyZF9sYXN0dXBkYXRlfHJyZF9yZXN0b3JlfHJyZF90dW5lfHJyZF91cGRhdGV8cnJkX3hwb3J0fHJyZGNyZWF0b3J8cnJkZ3JhcGh8cnJkdXBkYXRlcnxyc29ydHxydHJpbXxydW5raXRfY2xhc3NfYWRvcHR8cnVua2l0X2NsYXNzX2VtYW5jaXBhdGV8cnVua2l0X2NvbnN0YW50X2FkZHxydW5raXRfY29uc3RhbnRfcmVkZWZpbmV8cnVua2l0X2NvbnN0YW50X3JlbW92ZXxydW5raXRfZnVuY3Rpb25fYWRkfHJ1bmtpdF9mdW5jdGlvbl9jb3B5fHJ1bmtpdF9mdW5jdGlvbl9yZWRlZmluZXxydW5raXRfZnVuY3Rpb25fcmVtb3ZlfHJ1bmtpdF9mdW5jdGlvbl9yZW5hbWV8cnVua2l0X2ltcG9ydHxydW5raXRfbGludHxydW5raXRfbGludF9maWxlfHJ1bmtpdF9tZXRob2RfYWRkfHJ1bmtpdF9tZXRob2RfY29weXxydW5raXRfbWV0aG9kX3JlZGVmaW5lfHJ1bmtpdF9tZXRob2RfcmVtb3ZlfHJ1bmtpdF9tZXRob2RfcmVuYW1lfHJ1bmtpdF9yZXR1cm5fdmFsdWVfdXNlZHxydW5raXRfc2FuZGJveF9vdXRwdXRfaGFuZGxlcnxydW5raXRfc3VwZXJnbG9iYWxzfHJ1bnRpbWVleGNlcHRpb258c2FtY29ubmVjdGlvbl9jb21taXR8c2FtY29ubmVjdGlvbl9jb25uZWN0fHNhbWNvbm5lY3Rpb25fY29uc3RydWN0b3J8c2FtY29ubmVjdGlvbl9kaXNjb25uZWN0fHNhbWNvbm5lY3Rpb25fZXJybm98c2FtY29ubmVjdGlvbl9lcnJvcnxzYW1jb25uZWN0aW9uX2lzY29ubmVjdGVkfHNhbWNvbm5lY3Rpb25fcGVla3xzYW1jb25uZWN0aW9uX3BlZWthbGx8c2FtY29ubmVjdGlvbl9yZWNlaXZlfHNhbWNvbm5lY3Rpb25fcmVtb3ZlfHNhbWNvbm5lY3Rpb25fcm9sbGJhY2t8c2FtY29ubmVjdGlvbl9zZW5kfHNhbWNvbm5lY3Rpb25fc2V0RGVidWd8c2FtY29ubmVjdGlvbl9zdWJzY3JpYmV8c2FtY29ubmVjdGlvbl91bnN1YnNjcmliZXxzYW1tZXNzYWdlX2JvZHl8c2FtbWVzc2FnZV9jb25zdHJ1Y3RvcnxzYW1tZXNzYWdlX2hlYWRlcnxzY2FfY3JlYXRlZGF0YW9iamVjdHxzY2FfZ2V0c2VydmljZXxzY2FfbG9jYWxwcm94eV9jcmVhdGVkYXRhb2JqZWN0fHNjYV9zb2FwcHJveHlfY3JlYXRlZGF0YW9iamVjdHxzY2FuZGlyfHNkb19kYXNfY2hhbmdlc3VtbWFyeV9iZWdpbmxvZ2dpbmd8c2RvX2Rhc19jaGFuZ2VzdW1tYXJ5X2VuZGxvZ2dpbmd8c2RvX2Rhc19jaGFuZ2VzdW1tYXJ5X2dldGNoYW5nZWRkYXRhb2JqZWN0c3xzZG9fZGFzX2NoYW5nZXN1bW1hcnlfZ2V0Y2hhbmdldHlwZXxzZG9fZGFzX2NoYW5nZXN1bW1hcnlfZ2V0b2xkY29udGFpbmVyfHNkb19kYXNfY2hhbmdlc3VtbWFyeV9nZXRvbGR2YWx1ZXN8c2RvX2Rhc19jaGFuZ2VzdW1tYXJ5X2lzbG9nZ2luZ3xzZG9fZGFzX2RhdGFmYWN0b3J5X2FkZHByb3BlcnR5dG90eXBlfHNkb19kYXNfZGF0YWZhY3RvcnlfYWRkdHlwZXxzZG9fZGFzX2RhdGFmYWN0b3J5X2dldGRhdGFmYWN0b3J5fHNkb19kYXNfZGF0YW9iamVjdF9nZXRjaGFuZ2VzdW1tYXJ5fHNkb19kYXNfcmVsYXRpb25hbF9hcHBseWNoYW5nZXN8c2RvX2Rhc19yZWxhdGlvbmFsX2NvbnN0cnVjdHxzZG9fZGFzX3JlbGF0aW9uYWxfY3JlYXRlcm9vdGRhdGFvYmplY3R8c2RvX2Rhc19yZWxhdGlvbmFsX2V4ZWN1dGVwcmVwYXJlZHF1ZXJ5fHNkb19kYXNfcmVsYXRpb25hbF9leGVjdXRlcXVlcnl8c2RvX2Rhc19zZXR0aW5nX2dldGxpc3RpbmRleHxzZG9fZGFzX3NldHRpbmdfZ2V0cHJvcGVydHlpbmRleHxzZG9fZGFzX3NldHRpbmdfZ2V0cHJvcGVydHluYW1lfHNkb19kYXNfc2V0dGluZ19nZXR2YWx1ZXxzZG9fZGFzX3NldHRpbmdfaXNzZXR8c2RvX2Rhc194bWxfYWRkdHlwZXN8c2RvX2Rhc194bWxfY3JlYXRlfHNkb19kYXNfeG1sX2NyZWF0ZWRhdGFvYmplY3R8c2RvX2Rhc194bWxfY3JlYXRlZG9jdW1lbnR8c2RvX2Rhc194bWxfZG9jdW1lbnRfZ2V0cm9vdGRhdGFvYmplY3R8c2RvX2Rhc194bWxfZG9jdW1lbnRfZ2V0cm9vdGVsZW1lbnRuYW1lfHNkb19kYXNfeG1sX2RvY3VtZW50X2dldHJvb3RlbGVtZW50dXJpfHNkb19kYXNfeG1sX2RvY3VtZW50X3NldGVuY29kaW5nfHNkb19kYXNfeG1sX2RvY3VtZW50X3NldHhtbGRlY2xhcmF0aW9ufHNkb19kYXNfeG1sX2RvY3VtZW50X3NldHhtbHZlcnNpb258c2RvX2Rhc194bWxfbG9hZGZpbGV8c2RvX2Rhc194bWxfbG9hZHN0cmluZ3xzZG9fZGFzX3htbF9zYXZlZmlsZXxzZG9fZGFzX3htbF9zYXZlc3RyaW5nfHNkb19kYXRhZmFjdG9yeV9jcmVhdGV8c2RvX2RhdGFvYmplY3RfY2xlYXJ8c2RvX2RhdGFvYmplY3RfY3JlYXRlZGF0YW9iamVjdHxzZG9fZGF0YW9iamVjdF9nZXRjb250YWluZXJ8c2RvX2RhdGFvYmplY3RfZ2V0c2VxdWVuY2V8c2RvX2RhdGFvYmplY3RfZ2V0dHlwZW5hbWV8c2RvX2RhdGFvYmplY3RfZ2V0dHlwZW5hbWVzcGFjZXVyaXxzZG9fZXhjZXB0aW9uX2dldGNhdXNlfHNkb19saXN0X2luc2VydHxzZG9fbW9kZWxfcHJvcGVydHlfZ2V0Y29udGFpbmluZ3R5cGV8c2RvX21vZGVsX3Byb3BlcnR5X2dldGRlZmF1bHR8c2RvX21vZGVsX3Byb3BlcnR5X2dldG5hbWV8c2RvX21vZGVsX3Byb3BlcnR5X2dldHR5cGV8c2RvX21vZGVsX3Byb3BlcnR5X2lzY29udGFpbm1lbnR8c2RvX21vZGVsX3Byb3BlcnR5X2lzbWFueXxzZG9fbW9kZWxfcmVmbGVjdGlvbmRhdGFvYmplY3RfY29uc3RydWN0fHNkb19tb2RlbF9yZWZsZWN0aW9uZGF0YW9iamVjdF9leHBvcnR8c2RvX21vZGVsX3JlZmxlY3Rpb25kYXRhb2JqZWN0X2dldGNvbnRhaW5tZW50cHJvcGVydHl8c2RvX21vZGVsX3JlZmxlY3Rpb25kYXRhb2JqZWN0X2dldGluc3RhbmNlcHJvcGVydGllc3xzZG9fbW9kZWxfcmVmbGVjdGlvbmRhdGFvYmplY3RfZ2V0dHlwZXxzZG9fbW9kZWxfdHlwZV9nZXRiYXNldHlwZXxzZG9fbW9kZWxfdHlwZV9nZXRuYW1lfHNkb19tb2RlbF90eXBlX2dldG5hbWVzcGFjZXVyaXxzZG9fbW9kZWxfdHlwZV9nZXRwcm9wZXJ0aWVzfHNkb19tb2RlbF90eXBlX2dldHByb3BlcnR5fHNkb19tb2RlbF90eXBlX2lzYWJzdHJhY3R0eXBlfHNkb19tb2RlbF90eXBlX2lzZGF0YXR5cGV8c2RvX21vZGVsX3R5cGVfaXNpbnN0YW5jZXxzZG9fbW9kZWxfdHlwZV9pc29wZW50eXBlfHNkb19tb2RlbF90eXBlX2lzc2VxdWVuY2VkdHlwZXxzZG9fc2VxdWVuY2VfZ2V0cHJvcGVydHl8c2RvX3NlcXVlbmNlX2luc2VydHxzZG9fc2VxdWVuY2VfbW92ZXxzZWVrYWJsZWl0ZXJhdG9yfHNlbV9hY3F1aXJlfHNlbV9nZXR8c2VtX3JlbGVhc2V8c2VtX3JlbW92ZXxzZXJpYWxpemFibGV8c2VyaWFsaXplfHNlc3Npb25fY2FjaGVfZXhwaXJlfHNlc3Npb25fY2FjaGVfbGltaXRlcnxzZXNzaW9uX2NvbW1pdHxzZXNzaW9uX2RlY29kZXxzZXNzaW9uX2Rlc3Ryb3l8c2Vzc2lvbl9lbmNvZGV8c2Vzc2lvbl9nZXRfY29va2llX3BhcmFtc3xzZXNzaW9uX2lkfHNlc3Npb25faXNfcmVnaXN0ZXJlZHxzZXNzaW9uX21vZHVsZV9uYW1lfHNlc3Npb25fbmFtZXxzZXNzaW9uX3Bnc3FsX2FkZF9lcnJvcnxzZXNzaW9uX3Bnc3FsX2dldF9lcnJvcnxzZXNzaW9uX3Bnc3FsX2dldF9maWVsZHxzZXNzaW9uX3Bnc3FsX3Jlc2V0fHNlc3Npb25fcGdzcWxfc2V0X2ZpZWxkfHNlc3Npb25fcGdzcWxfc3RhdHVzfHNlc3Npb25fcmVnZW5lcmF0ZV9pZHxzZXNzaW9uX3JlZ2lzdGVyfHNlc3Npb25fc2F2ZV9wYXRofHNlc3Npb25fc2V0X2Nvb2tpZV9wYXJhbXN8c2Vzc2lvbl9zZXRfc2F2ZV9oYW5kbGVyfHNlc3Npb25fc3RhcnR8c2Vzc2lvbl91bnJlZ2lzdGVyfHNlc3Npb25fdW5zZXR8c2Vzc2lvbl93cml0ZV9jbG9zZXxzZXRDb3VudGVyQ2xhc3N8c2V0X2Vycm9yX2hhbmRsZXJ8c2V0X2V4Y2VwdGlvbl9oYW5kbGVyfHNldF9maWxlX2J1ZmZlcnxzZXRfaW5jbHVkZV9wYXRofHNldF9tYWdpY19xdW90ZXNfcnVudGltZXxzZXRfc29ja2V0X2Jsb2NraW5nfHNldF90aW1lX2xpbWl0fHNldGNvb2tpZXxzZXRsb2NhbGV8c2V0cHJvY3RpdGxlfHNldHJhd2Nvb2tpZXxzZXRzdGF0aWNwcm9wZXJ0eXZhbHVlfHNldHRocmVhZHRpdGxlfHNldHR5cGV8c2hhMXxzaGExX2ZpbGV8c2hlbGxfZXhlY3xzaG1fYXR0YWNofHNobV9kZXRhY2h8c2htX2dldF92YXJ8c2htX2hhc192YXJ8c2htX3B1dF92YXJ8c2htX3JlbW92ZXxzaG1fcmVtb3ZlX3ZhcnxzaG1vcF9jbG9zZXxzaG1vcF9kZWxldGV8c2htb3Bfb3BlbnxzaG1vcF9yZWFkfHNobW9wX3NpemV8c2htb3Bfd3JpdGV8c2hvd19zb3VyY2V8c2h1ZmZsZXxzaWduZXVybHBhaWVtZW50fHNpbWlsYXJfdGV4dHxzaW1wbGV4bWxfaW1wb3J0X2RvbXxzaW1wbGV4bWxfbG9hZF9maWxlfHNpbXBsZXhtbF9sb2FkX3N0cmluZ3xzaW1wbGV4bWxlbGVtZW50fHNpbXBsZXhtbGl0ZXJhdG9yfHNpbnxzaW5ofHNpemVvZnxzbGVlcHxzbm1wfHNubXAyX2dldHxzbm1wMl9nZXRuZXh0fHNubXAyX3JlYWxfd2Fsa3xzbm1wMl9zZXR8c25tcDJfd2Fsa3xzbm1wM19nZXR8c25tcDNfZ2V0bmV4dHxzbm1wM19yZWFsX3dhbGt8c25tcDNfc2V0fHNubXAzX3dhbGt8c25tcF9nZXRfcXVpY2tfcHJpbnR8c25tcF9nZXRfdmFsdWVyZXRyaWV2YWx8c25tcF9yZWFkX21pYnxzbm1wX3NldF9lbnVtX3ByaW50fHNubXBfc2V0X29pZF9udW1lcmljX3ByaW50fHNubXBfc2V0X29pZF9vdXRwdXRfZm9ybWF0fHNubXBfc2V0X3F1aWNrX3ByaW50fHNubXBfc2V0X3ZhbHVlcmV0cmlldmFsfHNubXBnZXR8c25tcGdldG5leHR8c25tcHJlYWx3YWxrfHNubXBzZXR8c25tcHdhbGt8c25tcHdhbGtvaWR8c29hcGNsaWVudHxzb2FwZmF1bHR8c29hcGhlYWRlcnxzb2FwcGFyYW18c29hcHNlcnZlcnxzb2FwdmFyfHNvY2tldF9hY2NlcHR8c29ja2V0X2JpbmR8c29ja2V0X2NsZWFyX2Vycm9yfHNvY2tldF9jbG9zZXxzb2NrZXRfY29ubmVjdHxzb2NrZXRfY3JlYXRlfHNvY2tldF9jcmVhdGVfbGlzdGVufHNvY2tldF9jcmVhdGVfcGFpcnxzb2NrZXRfZ2V0X29wdGlvbnxzb2NrZXRfZ2V0X3N0YXR1c3xzb2NrZXRfZ2V0cGVlcm5hbWV8c29ja2V0X2dldHNvY2tuYW1lfHNvY2tldF9sYXN0X2Vycm9yfHNvY2tldF9saXN0ZW58c29ja2V0X3JlYWR8c29ja2V0X3JlY3Z8c29ja2V0X3JlY3Zmcm9tfHNvY2tldF9zZWxlY3R8c29ja2V0X3NlbmR8c29ja2V0X3NlbmR0b3xzb2NrZXRfc2V0X2Jsb2NrfHNvY2tldF9zZXRfYmxvY2tpbmd8c29ja2V0X3NldF9ub25ibG9ja3xzb2NrZXRfc2V0X29wdGlvbnxzb2NrZXRfc2V0X3RpbWVvdXR8c29ja2V0X3NodXRkb3dufHNvY2tldF9zdHJlcnJvcnxzb2NrZXRfd3JpdGV8c29scl9nZXRfdmVyc2lvbnxzb2xyY2xpZW50fHNvbHJjbGllbnRleGNlcHRpb258c29scmRvY3VtZW50fHNvbHJkb2N1bWVudGZpZWxkfHNvbHJleGNlcHRpb258c29scmdlbmVyaWNyZXNwb25zZXxzb2xyaWxsZWdhbGFyZ3VtZW50ZXhjZXB0aW9ufHNvbHJpbGxlZ2Fsb3BlcmF0aW9uZXhjZXB0aW9ufHNvbHJpbnB1dGRvY3VtZW50fHNvbHJtb2RpZmlhYmxlcGFyYW1zfHNvbHJvYmplY3R8c29scnBhcmFtc3xzb2xycGluZ3Jlc3BvbnNlfHNvbHJxdWVyeXxzb2xycXVlcnlyZXNwb25zZXxzb2xycmVzcG9uc2V8c29scnVwZGF0ZXJlc3BvbnNlfHNvbHJ1dGlsc3xzb3J0fHNvdW5kZXh8c3BoaW54Y2xpZW50fHNwbF9hdXRvbG9hZHxzcGxfYXV0b2xvYWRfY2FsbHxzcGxfYXV0b2xvYWRfZXh0ZW5zaW9uc3xzcGxfYXV0b2xvYWRfZnVuY3Rpb25zfHNwbF9hdXRvbG9hZF9yZWdpc3RlcnxzcGxfYXV0b2xvYWRfdW5yZWdpc3RlcnxzcGxfY2xhc3Nlc3xzcGxfb2JqZWN0X2hhc2h8c3BsYm9vbHxzcGxkb3VibHlsaW5rZWRsaXN0fHNwbGVudW18c3BsZmlsZWluZm98c3BsZmlsZW9iamVjdHxzcGxmaXhlZGFycmF5fHNwbGZsb2F0fHNwbGhlYXB8c3BsaW50fHNwbGl0fHNwbGl0aXxzcGxtYXhoZWFwfHNwbG1pbmhlYXB8c3Bsb2JqZWN0c3RvcmFnZXxzcGxvYnNlcnZlcnxzcGxwcmlvcml0eXF1ZXVlfHNwbHF1ZXVlfHNwbHN0YWNrfHNwbHN0cmluZ3xzcGxzdWJqZWN0fHNwbHRlbXBmaWxlb2JqZWN0fHNwb29mY2hlY2tlcnxzcHJpbnRmfHNxbF9yZWdjYXNlfHNxbGl0ZTN8c3FsaXRlM3Jlc3VsdHxzcWxpdGUzc3RtdHxzcWxpdGVfYXJyYXlfcXVlcnl8c3FsaXRlX2J1c3lfdGltZW91dHxzcWxpdGVfY2hhbmdlc3xzcWxpdGVfY2xvc2V8c3FsaXRlX2NvbHVtbnxzcWxpdGVfY3JlYXRlX2FnZ3JlZ2F0ZXxzcWxpdGVfY3JlYXRlX2Z1bmN0aW9ufHNxbGl0ZV9jdXJyZW50fHNxbGl0ZV9lcnJvcl9zdHJpbmd8c3FsaXRlX2VzY2FwZV9zdHJpbmd8c3FsaXRlX2V4ZWN8c3FsaXRlX2ZhY3Rvcnl8c3FsaXRlX2ZldGNoX2FsbHxzcWxpdGVfZmV0Y2hfYXJyYXl8c3FsaXRlX2ZldGNoX2NvbHVtbl90eXBlc3xzcWxpdGVfZmV0Y2hfb2JqZWN0fHNxbGl0ZV9mZXRjaF9zaW5nbGV8c3FsaXRlX2ZldGNoX3N0cmluZ3xzcWxpdGVfZmllbGRfbmFtZXxzcWxpdGVfaGFzX21vcmV8c3FsaXRlX2hhc19wcmV2fHNxbGl0ZV9rZXl8c3FsaXRlX2xhc3RfZXJyb3J8c3FsaXRlX2xhc3RfaW5zZXJ0X3Jvd2lkfHNxbGl0ZV9saWJlbmNvZGluZ3xzcWxpdGVfbGlidmVyc2lvbnxzcWxpdGVfbmV4dHxzcWxpdGVfbnVtX2ZpZWxkc3xzcWxpdGVfbnVtX3Jvd3N8c3FsaXRlX29wZW58c3FsaXRlX3BvcGVufHNxbGl0ZV9wcmV2fHNxbGl0ZV9xdWVyeXxzcWxpdGVfcmV3aW5kfHNxbGl0ZV9zZWVrfHNxbGl0ZV9zaW5nbGVfcXVlcnl8c3FsaXRlX3VkZl9kZWNvZGVfYmluYXJ5fHNxbGl0ZV91ZGZfZW5jb2RlX2JpbmFyeXxzcWxpdGVfdW5idWZmZXJlZF9xdWVyeXxzcWxpdGVfdmFsaWR8c3FydHxzcmFuZHxzc2NhbmZ8c3NkZWVwX2Z1enp5X2NvbXBhcmV8c3NkZWVwX2Z1enp5X2hhc2h8c3NkZWVwX2Z1enp5X2hhc2hfZmlsZW5hbWV8c3NoMl9hdXRoX2hvc3RiYXNlZF9maWxlfHNzaDJfYXV0aF9ub25lfHNzaDJfYXV0aF9wYXNzd29yZHxzc2gyX2F1dGhfcHVia2V5X2ZpbGV8c3NoMl9jb25uZWN0fHNzaDJfZXhlY3xzc2gyX2ZldGNoX3N0cmVhbXxzc2gyX2ZpbmdlcnByaW50fHNzaDJfbWV0aG9kc19uZWdvdGlhdGVkfHNzaDJfcHVibGlja2V5X2FkZHxzc2gyX3B1YmxpY2tleV9pbml0fHNzaDJfcHVibGlja2V5X2xpc3R8c3NoMl9wdWJsaWNrZXlfcmVtb3ZlfHNzaDJfc2NwX3JlY3Z8c3NoMl9zY3Bfc2VuZHxzc2gyX3NmdHB8c3NoMl9zZnRwX2xzdGF0fHNzaDJfc2Z0cF9ta2Rpcnxzc2gyX3NmdHBfcmVhZGxpbmt8c3NoMl9zZnRwX3JlYWxwYXRofHNzaDJfc2Z0cF9yZW5hbWV8c3NoMl9zZnRwX3JtZGlyfHNzaDJfc2Z0cF9zdGF0fHNzaDJfc2Z0cF9zeW1saW5rfHNzaDJfc2Z0cF91bmxpbmt8c3NoMl9zaGVsbHxzc2gyX3R1bm5lbHxzdGF0fHN0YXRzX2Fic29sdXRlX2RldmlhdGlvbnxzdGF0c19jZGZfYmV0YXxzdGF0c19jZGZfYmlub21pYWx8c3RhdHNfY2RmX2NhdWNoeXxzdGF0c19jZGZfY2hpc3F1YXJlfHN0YXRzX2NkZl9leHBvbmVudGlhbHxzdGF0c19jZGZfZnxzdGF0c19jZGZfZ2FtbWF8c3RhdHNfY2RmX2xhcGxhY2V8c3RhdHNfY2RmX2xvZ2lzdGljfHN0YXRzX2NkZl9uZWdhdGl2ZV9iaW5vbWlhbHxzdGF0c19jZGZfbm9uY2VudHJhbF9jaGlzcXVhcmV8c3RhdHNfY2RmX25vbmNlbnRyYWxfZnxzdGF0c19jZGZfcG9pc3NvbnxzdGF0c19jZGZfdHxzdGF0c19jZGZfdW5pZm9ybXxzdGF0c19jZGZfd2VpYnVsbHxzdGF0c19jb3ZhcmlhbmNlfHN0YXRzX2Rlbl91bmlmb3JtfHN0YXRzX2RlbnNfYmV0YXxzdGF0c19kZW5zX2NhdWNoeXxzdGF0c19kZW5zX2NoaXNxdWFyZXxzdGF0c19kZW5zX2V4cG9uZW50aWFsfHN0YXRzX2RlbnNfZnxzdGF0c19kZW5zX2dhbW1hfHN0YXRzX2RlbnNfbGFwbGFjZXxzdGF0c19kZW5zX2xvZ2lzdGljfHN0YXRzX2RlbnNfbmVnYXRpdmVfYmlub21pYWx8c3RhdHNfZGVuc19ub3JtYWx8c3RhdHNfZGVuc19wbWZfYmlub21pYWx8c3RhdHNfZGVuc19wbWZfaHlwZXJnZW9tZXRyaWN8c3RhdHNfZGVuc19wbWZfcG9pc3NvbnxzdGF0c19kZW5zX3R8c3RhdHNfZGVuc193ZWlidWxsfHN0YXRzX2hhcm1vbmljX21lYW58c3RhdHNfa3VydG9zaXN8c3RhdHNfcmFuZF9nZW5fYmV0YXxzdGF0c19yYW5kX2dlbl9jaGlzcXVhcmV8c3RhdHNfcmFuZF9nZW5fZXhwb25lbnRpYWx8c3RhdHNfcmFuZF9nZW5fZnxzdGF0c19yYW5kX2dlbl9mdW5pZm9ybXxzdGF0c19yYW5kX2dlbl9nYW1tYXxzdGF0c19yYW5kX2dlbl9pYmlub21pYWx8c3RhdHNfcmFuZF9nZW5faWJpbm9taWFsX25lZ2F0aXZlfHN0YXRzX3JhbmRfZ2VuX2ludHxzdGF0c19yYW5kX2dlbl9pcG9pc3NvbnxzdGF0c19yYW5kX2dlbl9pdW5pZm9ybXxzdGF0c19yYW5kX2dlbl9ub25jZW5yYWxfY2hpc3F1YXJlfHN0YXRzX3JhbmRfZ2VuX25vbmNlbnRyYWxfZnxzdGF0c19yYW5kX2dlbl9ub25jZW50cmFsX3R8c3RhdHNfcmFuZF9nZW5fbm9ybWFsfHN0YXRzX3JhbmRfZ2VuX3R8c3RhdHNfcmFuZF9nZXRfc2VlZHN8c3RhdHNfcmFuZF9waHJhc2VfdG9fc2VlZHN8c3RhdHNfcmFuZF9yYW5mfHN0YXRzX3JhbmRfc2V0YWxsfHN0YXRzX3NrZXd8c3RhdHNfc3RhbmRhcmRfZGV2aWF0aW9ufHN0YXRzX3N0YXRfYmlub21pYWxfY29lZnxzdGF0c19zdGF0X2NvcnJlbGF0aW9ufHN0YXRzX3N0YXRfZ2VubmNofHN0YXRzX3N0YXRfaW5kZXBlbmRlbnRfdHxzdGF0c19zdGF0X2lubmVycHJvZHVjdHxzdGF0c19zdGF0X25vbmNlbnRyYWxfdHxzdGF0c19zdGF0X3BhaXJlZF90fHN0YXRzX3N0YXRfcGVyY2VudGlsZXxzdGF0c19zdGF0X3Bvd2Vyc3VtfHN0YXRzX3ZhcmlhbmNlfHN0b21wfHN0b21wX2Nvbm5lY3RfZXJyb3J8c3RvbXBfdmVyc2lvbnxzdG9tcGV4Y2VwdGlvbnxzdG9tcGZyYW1lfHN0cl9nZXRjc3Z8c3RyX2lyZXBsYWNlfHN0cl9wYWR8c3RyX3JlcGVhdHxzdHJfcmVwbGFjZXxzdHJfcm90MTN8c3RyX3NodWZmbGV8c3RyX3NwbGl0fHN0cl93b3JkX2NvdW50fHN0cmNhc2VjbXB8c3RyY2hyfHN0cmNtcHxzdHJjb2xsfHN0cmNzcG58c3RyZWFtX2J1Y2tldF9hcHBlbmR8c3RyZWFtX2J1Y2tldF9tYWtlX3dyaXRlYWJsZXxzdHJlYW1fYnVja2V0X25ld3xzdHJlYW1fYnVja2V0X3ByZXBlbmR8c3RyZWFtX2NvbnRleHRfY3JlYXRlfHN0cmVhbV9jb250ZXh0X2dldF9kZWZhdWx0fHN0cmVhbV9jb250ZXh0X2dldF9vcHRpb25zfHN0cmVhbV9jb250ZXh0X2dldF9wYXJhbXN8c3RyZWFtX2NvbnRleHRfc2V0X2RlZmF1bHR8c3RyZWFtX2NvbnRleHRfc2V0X29wdGlvbnxzdHJlYW1fY29udGV4dF9zZXRfcGFyYW1zfHN0cmVhbV9jb3B5X3RvX3N0cmVhbXxzdHJlYW1fZW5jb2Rpbmd8c3RyZWFtX2ZpbHRlcl9hcHBlbmR8c3RyZWFtX2ZpbHRlcl9wcmVwZW5kfHN0cmVhbV9maWx0ZXJfcmVnaXN0ZXJ8c3RyZWFtX2ZpbHRlcl9yZW1vdmV8c3RyZWFtX2dldF9jb250ZW50c3xzdHJlYW1fZ2V0X2ZpbHRlcnN8c3RyZWFtX2dldF9saW5lfHN0cmVhbV9nZXRfbWV0YV9kYXRhfHN0cmVhbV9nZXRfdHJhbnNwb3J0c3xzdHJlYW1fZ2V0X3dyYXBwZXJzfHN0cmVhbV9pc19sb2NhbHxzdHJlYW1fbm90aWZpY2F0aW9uX2NhbGxiYWNrfHN0cmVhbV9yZWdpc3Rlcl93cmFwcGVyfHN0cmVhbV9yZXNvbHZlX2luY2x1ZGVfcGF0aHxzdHJlYW1fc2VsZWN0fHN0cmVhbV9zZXRfYmxvY2tpbmd8c3RyZWFtX3NldF9yZWFkX2J1ZmZlcnxzdHJlYW1fc2V0X3RpbWVvdXR8c3RyZWFtX3NldF93cml0ZV9idWZmZXJ8c3RyZWFtX3NvY2tldF9hY2NlcHR8c3RyZWFtX3NvY2tldF9jbGllbnR8c3RyZWFtX3NvY2tldF9lbmFibGVfY3J5cHRvfHN0cmVhbV9zb2NrZXRfZ2V0X25hbWV8c3RyZWFtX3NvY2tldF9wYWlyfHN0cmVhbV9zb2NrZXRfcmVjdmZyb218c3RyZWFtX3NvY2tldF9zZW5kdG98c3RyZWFtX3NvY2tldF9zZXJ2ZXJ8c3RyZWFtX3NvY2tldF9zaHV0ZG93bnxzdHJlYW1fc3VwcG9ydHNfbG9ja3xzdHJlYW1fd3JhcHBlcl9yZWdpc3RlcnxzdHJlYW1fd3JhcHBlcl9yZXN0b3JlfHN0cmVhbV93cmFwcGVyX3VucmVnaXN0ZXJ8c3RyZWFtd3JhcHBlcnxzdHJmdGltZXxzdHJpcF90YWdzfHN0cmlwY3NsYXNoZXN8c3RyaXBvc3xzdHJpcHNsYXNoZXN8c3RyaXN0cnxzdHJsZW58c3RybmF0Y2FzZWNtcHxzdHJuYXRjbXB8c3RybmNhc2VjbXB8c3RybmNtcHxzdHJwYnJrfHN0cnBvc3xzdHJwdGltZXxzdHJyY2hyfHN0cnJldnxzdHJyaXBvc3xzdHJycG9zfHN0cnNwbnxzdHJzdHJ8c3RydG9rfHN0cnRvbG93ZXJ8c3RydG90aW1lfHN0cnRvdXBwZXJ8c3RydHJ8c3RydmFsfHN1YnN0cnxzdWJzdHJfY29tcGFyZXxzdWJzdHJfY291bnR8c3Vic3RyX3JlcGxhY2V8c3ZtfHN2bW1vZGVsfHN2bl9hZGR8c3ZuX2F1dGhfZ2V0X3BhcmFtZXRlcnxzdm5fYXV0aF9zZXRfcGFyYW1ldGVyfHN2bl9ibGFtZXxzdm5fY2F0fHN2bl9jaGVja291dHxzdm5fY2xlYW51cHxzdm5fY2xpZW50X3ZlcnNpb258c3ZuX2NvbW1pdHxzdm5fZGVsZXRlfHN2bl9kaWZmfHN2bl9leHBvcnR8c3ZuX2ZzX2Fib3J0X3R4bnxzdm5fZnNfYXBwbHlfdGV4dHxzdm5fZnNfYmVnaW5fdHhuMnxzdm5fZnNfY2hhbmdlX25vZGVfcHJvcHxzdm5fZnNfY2hlY2tfcGF0aHxzdm5fZnNfY29udGVudHNfY2hhbmdlZHxzdm5fZnNfY29weXxzdm5fZnNfZGVsZXRlfHN2bl9mc19kaXJfZW50cmllc3xzdm5fZnNfZmlsZV9jb250ZW50c3xzdm5fZnNfZmlsZV9sZW5ndGh8c3ZuX2ZzX2lzX2Rpcnxzdm5fZnNfaXNfZmlsZXxzdm5fZnNfbWFrZV9kaXJ8c3ZuX2ZzX21ha2VfZmlsZXxzdm5fZnNfbm9kZV9jcmVhdGVkX3Jldnxzdm5fZnNfbm9kZV9wcm9wfHN2bl9mc19wcm9wc19jaGFuZ2VkfHN2bl9mc19yZXZpc2lvbl9wcm9wfHN2bl9mc19yZXZpc2lvbl9yb290fHN2bl9mc190eG5fcm9vdHxzdm5fZnNfeW91bmdlc3RfcmV2fHN2bl9pbXBvcnR8c3ZuX2xvZ3xzdm5fbHN8c3ZuX21rZGlyfHN2bl9yZXBvc19jcmVhdGV8c3ZuX3JlcG9zX2ZzfHN2bl9yZXBvc19mc19iZWdpbl90eG5fZm9yX2NvbW1pdHxzdm5fcmVwb3NfZnNfY29tbWl0X3R4bnxzdm5fcmVwb3NfaG90Y29weXxzdm5fcmVwb3Nfb3Blbnxzdm5fcmVwb3NfcmVjb3Zlcnxzdm5fcmV2ZXJ0fHN2bl9zdGF0dXN8c3ZuX3VwZGF0ZXxzd2ZfYWN0aW9uZ2V0dXJsfHN3Zl9hY3Rpb25nb3RvZnJhbWV8c3dmX2FjdGlvbmdvdG9sYWJlbHxzd2ZfYWN0aW9ubmV4dGZyYW1lfHN3Zl9hY3Rpb25wbGF5fHN3Zl9hY3Rpb25wcmV2ZnJhbWV8c3dmX2FjdGlvbnNldHRhcmdldHxzd2ZfYWN0aW9uc3RvcHxzd2ZfYWN0aW9udG9nZ2xlcXVhbGl0eXxzd2ZfYWN0aW9ud2FpdGZvcmZyYW1lfHN3Zl9hZGRidXR0b25yZWNvcmR8c3dmX2FkZGNvbG9yfHN3Zl9jbG9zZWZpbGV8c3dmX2RlZmluZWJpdG1hcHxzd2ZfZGVmaW5lZm9udHxzd2ZfZGVmaW5lbGluZXxzd2ZfZGVmaW5lcG9seXxzd2ZfZGVmaW5lcmVjdHxzd2ZfZGVmaW5ldGV4dHxzd2ZfZW5kYnV0dG9ufHN3Zl9lbmRkb2FjdGlvbnxzd2ZfZW5kc2hhcGV8c3dmX2VuZHN5bWJvbHxzd2ZfZm9udHNpemV8c3dmX2ZvbnRzbGFudHxzd2ZfZm9udHRyYWNraW5nfHN3Zl9nZXRiaXRtYXBpbmZvfHN3Zl9nZXRmb250aW5mb3xzd2ZfZ2V0ZnJhbWV8c3dmX2xhYmVsZnJhbWV8c3dmX2xvb2thdHxzd2ZfbW9kaWZ5b2JqZWN0fHN3Zl9tdWxjb2xvcnxzd2ZfbmV4dGlkfHN3Zl9vbmNvbmRpdGlvbnxzd2Zfb3BlbmZpbGV8c3dmX29ydGhvfHN3Zl9vcnRobzJ8c3dmX3BlcnNwZWN0aXZlfHN3Zl9wbGFjZW9iamVjdHxzd2ZfcG9sYXJ2aWV3fHN3Zl9wb3BtYXRyaXh8c3dmX3Bvc3JvdW5kfHN3Zl9wdXNobWF0cml4fHN3Zl9yZW1vdmVvYmplY3R8c3dmX3JvdGF0ZXxzd2Zfc2NhbGV8c3dmX3NldGZvbnR8c3dmX3NldGZyYW1lfHN3Zl9zaGFwZWFyY3xzd2Zfc2hhcGVjdXJ2ZXRvfHN3Zl9zaGFwZWN1cnZldG8zfHN3Zl9zaGFwZWZpbGxiaXRtYXBjbGlwfHN3Zl9zaGFwZWZpbGxiaXRtYXB0aWxlfHN3Zl9zaGFwZWZpbGxvZmZ8c3dmX3NoYXBlZmlsbHNvbGlkfHN3Zl9zaGFwZWxpbmVzb2xpZHxzd2Zfc2hhcGVsaW5ldG98c3dmX3NoYXBlbW92ZXRvfHN3Zl9zaG93ZnJhbWV8c3dmX3N0YXJ0YnV0dG9ufHN3Zl9zdGFydGRvYWN0aW9ufHN3Zl9zdGFydHNoYXBlfHN3Zl9zdGFydHN5bWJvbHxzd2ZfdGV4dHdpZHRofHN3Zl90cmFuc2xhdGV8c3dmX3ZpZXdwb3J0fHN3ZmFjdGlvbnxzd2ZiaXRtYXB8c3dmYnV0dG9ufHN3ZmRpc3BsYXlpdGVtfHN3ZmZpbGx8c3dmZm9udHxzd2Zmb250Y2hhcnxzd2ZncmFkaWVudHxzd2Ztb3JwaHxzd2Ztb3ZpZXxzd2ZwcmVidWlsdGNsaXB8c3dmc2hhcGV8c3dmc291bmR8c3dmc291bmRpbnN0YW5jZXxzd2ZzcHJpdGV8c3dmdGV4dHxzd2Z0ZXh0ZmllbGR8c3dmdmlkZW9zdHJlYW18c3dpc2hfY29uc3RydWN0fHN3aXNoX2dldG1ldGFsaXN0fHN3aXNoX2dldHByb3BlcnR5bGlzdHxzd2lzaF9wcmVwYXJlfHN3aXNoX3F1ZXJ5fHN3aXNocmVzdWx0X2dldG1ldGFsaXN0fHN3aXNocmVzdWx0X3N0ZW18c3dpc2hyZXN1bHRzX2dldHBhcnNlZHdvcmRzfHN3aXNocmVzdWx0c19nZXRyZW1vdmVkc3RvcHdvcmRzfHN3aXNocmVzdWx0c19uZXh0cmVzdWx0fHN3aXNocmVzdWx0c19zZWVrcmVzdWx0fHN3aXNoc2VhcmNoX2V4ZWN1dGV8c3dpc2hzZWFyY2hfcmVzZXRsaW1pdHxzd2lzaHNlYXJjaF9zZXRsaW1pdHxzd2lzaHNlYXJjaF9zZXRwaHJhc2VkZWxpbWl0ZXJ8c3dpc2hzZWFyY2hfc2V0c29ydHxzd2lzaHNlYXJjaF9zZXRzdHJ1Y3R1cmV8c3liYXNlX2FmZmVjdGVkX3Jvd3N8c3liYXNlX2Nsb3NlfHN5YmFzZV9jb25uZWN0fHN5YmFzZV9kYXRhX3NlZWt8c3liYXNlX2RlYWRsb2NrX3JldHJ5X2NvdW50fHN5YmFzZV9mZXRjaF9hcnJheXxzeWJhc2VfZmV0Y2hfYXNzb2N8c3liYXNlX2ZldGNoX2ZpZWxkfHN5YmFzZV9mZXRjaF9vYmplY3R8c3liYXNlX2ZldGNoX3Jvd3xzeWJhc2VfZmllbGRfc2Vla3xzeWJhc2VfZnJlZV9yZXN1bHR8c3liYXNlX2dldF9sYXN0X21lc3NhZ2V8c3liYXNlX21pbl9jbGllbnRfc2V2ZXJpdHl8c3liYXNlX21pbl9lcnJvcl9zZXZlcml0eXxzeWJhc2VfbWluX21lc3NhZ2Vfc2V2ZXJpdHl8c3liYXNlX21pbl9zZXJ2ZXJfc2V2ZXJpdHl8c3liYXNlX251bV9maWVsZHN8c3liYXNlX251bV9yb3dzfHN5YmFzZV9wY29ubmVjdHxzeWJhc2VfcXVlcnl8c3liYXNlX3Jlc3VsdHxzeWJhc2Vfc2VsZWN0X2RifHN5YmFzZV9zZXRfbWVzc2FnZV9oYW5kbGVyfHN5YmFzZV91bmJ1ZmZlcmVkX3F1ZXJ5fHN5bWxpbmt8c3lzX2dldF90ZW1wX2RpcnxzeXNfZ2V0bG9hZGF2Z3xzeXNsb2d8c3lzdGVtfHRhZ3x0YW58dGFuaHx0Y3B3cmFwX2NoZWNrfHRlbXBuYW18dGV4dGRvbWFpbnx0aWR5fHRpZHlfYWNjZXNzX2NvdW50fHRpZHlfY29uZmlnX2NvdW50fHRpZHlfZGlhZ25vc2V8dGlkeV9lcnJvcl9jb3VudHx0aWR5X2dldF9lcnJvcl9idWZmZXJ8dGlkeV9nZXRfb3V0cHV0fHRpZHlfbG9hZF9jb25maWd8dGlkeV9yZXNldF9jb25maWd8dGlkeV9zYXZlX2NvbmZpZ3x0aWR5X3NldF9lbmNvZGluZ3x0aWR5X3NldG9wdHx0aWR5X3dhcm5pbmdfY291bnR8dGlkeW5vZGV8dGltZXx0aW1lX25hbm9zbGVlcHx0aW1lX3NsZWVwX3VudGlsfHRpbWV6b25lX2FiYnJldmlhdGlvbnNfbGlzdHx0aW1lem9uZV9pZGVudGlmaWVyc19saXN0fHRpbWV6b25lX2xvY2F0aW9uX2dldHx0aW1lem9uZV9uYW1lX2Zyb21fYWJicnx0aW1lem9uZV9uYW1lX2dldHx0aW1lem9uZV9vZmZzZXRfZ2V0fHRpbWV6b25lX29wZW58dGltZXpvbmVfdHJhbnNpdGlvbnNfZ2V0fHRpbWV6b25lX3ZlcnNpb25fZ2V0fHRtcGZpbGV8dG9rZW5fZ2V0X2FsbHx0b2tlbl9uYW1lfHRva3lvdHlyYW50fHRva3lvdHlyYW50cXVlcnl8dG9reW90eXJhbnR0YWJsZXx0b3N0cmluZ3x0b3N0cmluZ3x0b3VjaHx0cmFuc2xpdGVyYXRvcnx0cmF2ZXJzYWJsZXx0cmlnZ2VyX2Vycm9yfHRyaW18dWFzb3J0fHVjZmlyc3R8dWN3b3Jkc3x1ZG1fYWRkX3NlYXJjaF9saW1pdHx1ZG1fYWxsb2NfYWdlbnR8dWRtX2FsbG9jX2FnZW50X2FycmF5fHVkbV9hcGlfdmVyc2lvbnx1ZG1fY2F0X2xpc3R8dWRtX2NhdF9wYXRofHVkbV9jaGVja19jaGFyc2V0fHVkbV9jaGVja19zdG9yZWR8dWRtX2NsZWFyX3NlYXJjaF9saW1pdHN8dWRtX2Nsb3NlX3N0b3JlZHx1ZG1fY3JjMzJ8dWRtX2Vycm5vfHVkbV9lcnJvcnx1ZG1fZmluZHx1ZG1fZnJlZV9hZ2VudHx1ZG1fZnJlZV9pc3BlbGxfZGF0YXx1ZG1fZnJlZV9yZXN8dWRtX2dldF9kb2NfY291bnR8dWRtX2dldF9yZXNfZmllbGR8dWRtX2dldF9yZXNfcGFyYW18dWRtX2hhc2gzMnx1ZG1fbG9hZF9pc3BlbGxfZGF0YXx1ZG1fb3Blbl9zdG9yZWR8dWRtX3NldF9hZ2VudF9wYXJhbXx1a3NvcnR8dW1hc2t8dW5kZXJmbG93ZXhjZXB0aW9ufHVuZXhwZWN0ZWR2YWx1ZWV4Y2VwdGlvbnx1bmlxaWR8dW5peHRvamR8dW5saW5rfHVucGFja3x1bnJlZ2lzdGVyX3RpY2tfZnVuY3Rpb258dW5zZXJpYWxpemV8dW5zZXR8dXJsZGVjb2RlfHVybGVuY29kZXx1c2Vfc29hcF9lcnJvcl9oYW5kbGVyfHVzZXJfZXJyb3J8dXNsZWVwfHVzb3J0fHV0ZjhfZGVjb2RlfHV0ZjhfZW5jb2RlfHY4anN8djhqc2V4Y2VwdGlvbnx2YXJfZHVtcHx2YXJfZXhwb3J0fHZhcmlhbnR8dmFyaWFudF9hYnN8dmFyaWFudF9hZGR8dmFyaWFudF9hbmR8dmFyaWFudF9jYXN0fHZhcmlhbnRfY2F0fHZhcmlhbnRfY21wfHZhcmlhbnRfZGF0ZV9mcm9tX3RpbWVzdGFtcHx2YXJpYW50X2RhdGVfdG9fdGltZXN0YW1wfHZhcmlhbnRfZGl2fHZhcmlhbnRfZXF2fHZhcmlhbnRfZml4fHZhcmlhbnRfZ2V0X3R5cGV8dmFyaWFudF9pZGl2fHZhcmlhbnRfaW1wfHZhcmlhbnRfaW50fHZhcmlhbnRfbW9kfHZhcmlhbnRfbXVsfHZhcmlhbnRfbmVnfHZhcmlhbnRfbm90fHZhcmlhbnRfb3J8dmFyaWFudF9wb3d8dmFyaWFudF9yb3VuZHx2YXJpYW50X3NldHx2YXJpYW50X3NldF90eXBlfHZhcmlhbnRfc3VifHZhcmlhbnRfeG9yfHZlcnNpb25fY29tcGFyZXx2ZnByaW50Znx2aXJ0dWFsfHZwb3BtYWlsX2FkZF9hbGlhc19kb21haW58dnBvcG1haWxfYWRkX2FsaWFzX2RvbWFpbl9leHx2cG9wbWFpbF9hZGRfZG9tYWlufHZwb3BtYWlsX2FkZF9kb21haW5fZXh8dnBvcG1haWxfYWRkX3VzZXJ8dnBvcG1haWxfYWxpYXNfYWRkfHZwb3BtYWlsX2FsaWFzX2RlbHx2cG9wbWFpbF9hbGlhc19kZWxfZG9tYWlufHZwb3BtYWlsX2FsaWFzX2dldHx2cG9wbWFpbF9hbGlhc19nZXRfYWxsfHZwb3BtYWlsX2F1dGhfdXNlcnx2cG9wbWFpbF9kZWxfZG9tYWlufHZwb3BtYWlsX2RlbF9kb21haW5fZXh8dnBvcG1haWxfZGVsX3VzZXJ8dnBvcG1haWxfZXJyb3J8dnBvcG1haWxfcGFzc3dkfHZwb3BtYWlsX3NldF91c2VyX3F1b3RhfHZwcmludGZ8dnNwcmludGZ8dzMyYXBpX2RlZnR5cGV8dzMyYXBpX2luaXRfZHR5cGV8dzMyYXBpX2ludm9rZV9mdW5jdGlvbnx3MzJhcGlfcmVnaXN0ZXJfZnVuY3Rpb258dzMyYXBpX3NldF9jYWxsX21ldGhvZHx3ZGR4X2FkZF92YXJzfHdkZHhfZGVzZXJpYWxpemV8d2RkeF9wYWNrZXRfZW5kfHdkZHhfcGFja2V0X3N0YXJ0fHdkZHhfc2VyaWFsaXplX3ZhbHVlfHdkZHhfc2VyaWFsaXplX3ZhcnN8d2luMzJfY29udGludWVfc2VydmljZXx3aW4zMl9jcmVhdGVfc2VydmljZXx3aW4zMl9kZWxldGVfc2VydmljZXx3aW4zMl9nZXRfbGFzdF9jb250cm9sX21lc3NhZ2V8d2luMzJfcGF1c2Vfc2VydmljZXx3aW4zMl9wc19saXN0X3Byb2NzfHdpbjMyX3BzX3N0YXRfbWVtfHdpbjMyX3BzX3N0YXRfcHJvY3x3aW4zMl9xdWVyeV9zZXJ2aWNlX3N0YXR1c3x3aW4zMl9zZXRfc2VydmljZV9zdGF0dXN8d2luMzJfc3RhcnRfc2VydmljZXx3aW4zMl9zdGFydF9zZXJ2aWNlX2N0cmxfZGlzcGF0Y2hlcnx3aW4zMl9zdG9wX3NlcnZpY2V8d2luY2FjaGVfZmNhY2hlX2ZpbGVpbmZvfHdpbmNhY2hlX2ZjYWNoZV9tZW1pbmZvfHdpbmNhY2hlX2xvY2t8d2luY2FjaGVfb2NhY2hlX2ZpbGVpbmZvfHdpbmNhY2hlX29jYWNoZV9tZW1pbmZvfHdpbmNhY2hlX3JlZnJlc2hfaWZfY2hhbmdlZHx3aW5jYWNoZV9ycGxpc3RfZmlsZWluZm98d2luY2FjaGVfcnBsaXN0X21lbWluZm98d2luY2FjaGVfc2NhY2hlX2luZm98d2luY2FjaGVfc2NhY2hlX21lbWluZm98d2luY2FjaGVfdWNhY2hlX2FkZHx3aW5jYWNoZV91Y2FjaGVfY2FzfHdpbmNhY2hlX3VjYWNoZV9jbGVhcnx3aW5jYWNoZV91Y2FjaGVfZGVjfHdpbmNhY2hlX3VjYWNoZV9kZWxldGV8d2luY2FjaGVfdWNhY2hlX2V4aXN0c3x3aW5jYWNoZV91Y2FjaGVfZ2V0fHdpbmNhY2hlX3VjYWNoZV9pbmN8d2luY2FjaGVfdWNhY2hlX2luZm98d2luY2FjaGVfdWNhY2hlX21lbWluZm98d2luY2FjaGVfdWNhY2hlX3NldHx3aW5jYWNoZV91bmxvY2t8d29yZHdyYXB8eGF0dHJfZ2V0fHhhdHRyX2xpc3R8eGF0dHJfcmVtb3ZlfHhhdHRyX3NldHx4YXR0cl9zdXBwb3J0ZWR8eGRpZmZfZmlsZV9iZGlmZnx4ZGlmZl9maWxlX2JkaWZmX3NpemV8eGRpZmZfZmlsZV9icGF0Y2h8eGRpZmZfZmlsZV9kaWZmfHhkaWZmX2ZpbGVfZGlmZl9iaW5hcnl8eGRpZmZfZmlsZV9tZXJnZTN8eGRpZmZfZmlsZV9wYXRjaHx4ZGlmZl9maWxlX3BhdGNoX2JpbmFyeXx4ZGlmZl9maWxlX3JhYmRpZmZ8eGRpZmZfc3RyaW5nX2JkaWZmfHhkaWZmX3N0cmluZ19iZGlmZl9zaXplfHhkaWZmX3N0cmluZ19icGF0Y2h8eGRpZmZfc3RyaW5nX2RpZmZ8eGRpZmZfc3RyaW5nX2RpZmZfYmluYXJ5fHhkaWZmX3N0cmluZ19tZXJnZTN8eGRpZmZfc3RyaW5nX3BhdGNofHhkaWZmX3N0cmluZ19wYXRjaF9iaW5hcnl8eGRpZmZfc3RyaW5nX3JhYmRpZmZ8eGhwcm9mX2Rpc2FibGV8eGhwcm9mX2VuYWJsZXx4aHByb2Zfc2FtcGxlX2Rpc2FibGV8eGhwcm9mX3NhbXBsZV9lbmFibGV8eG1sX2Vycm9yX3N0cmluZ3x4bWxfZ2V0X2N1cnJlbnRfYnl0ZV9pbmRleHx4bWxfZ2V0X2N1cnJlbnRfY29sdW1uX251bWJlcnx4bWxfZ2V0X2N1cnJlbnRfbGluZV9udW1iZXJ8eG1sX2dldF9lcnJvcl9jb2RlfHhtbF9wYXJzZXx4bWxfcGFyc2VfaW50b19zdHJ1Y3R8eG1sX3BhcnNlcl9jcmVhdGV8eG1sX3BhcnNlcl9jcmVhdGVfbnN8eG1sX3BhcnNlcl9mcmVlfHhtbF9wYXJzZXJfZ2V0X29wdGlvbnx4bWxfcGFyc2VyX3NldF9vcHRpb258eG1sX3NldF9jaGFyYWN0ZXJfZGF0YV9oYW5kbGVyfHhtbF9zZXRfZGVmYXVsdF9oYW5kbGVyfHhtbF9zZXRfZWxlbWVudF9oYW5kbGVyfHhtbF9zZXRfZW5kX25hbWVzcGFjZV9kZWNsX2hhbmRsZXJ8eG1sX3NldF9leHRlcm5hbF9lbnRpdHlfcmVmX2hhbmRsZXJ8eG1sX3NldF9ub3RhdGlvbl9kZWNsX2hhbmRsZXJ8eG1sX3NldF9vYmplY3R8eG1sX3NldF9wcm9jZXNzaW5nX2luc3RydWN0aW9uX2hhbmRsZXJ8eG1sX3NldF9zdGFydF9uYW1lc3BhY2VfZGVjbF9oYW5kbGVyfHhtbF9zZXRfdW5wYXJzZWRfZW50aXR5X2RlY2xfaGFuZGxlcnx4bWxyZWFkZXJ8eG1scnBjX2RlY29kZXx4bWxycGNfZGVjb2RlX3JlcXVlc3R8eG1scnBjX2VuY29kZXx4bWxycGNfZW5jb2RlX3JlcXVlc3R8eG1scnBjX2dldF90eXBlfHhtbHJwY19pc19mYXVsdHx4bWxycGNfcGFyc2VfbWV0aG9kX2Rlc2NyaXB0aW9uc3x4bWxycGNfc2VydmVyX2FkZF9pbnRyb3NwZWN0aW9uX2RhdGF8eG1scnBjX3NlcnZlcl9jYWxsX21ldGhvZHx4bWxycGNfc2VydmVyX2NyZWF0ZXx4bWxycGNfc2VydmVyX2Rlc3Ryb3l8eG1scnBjX3NlcnZlcl9yZWdpc3Rlcl9pbnRyb3NwZWN0aW9uX2NhbGxiYWNrfHhtbHJwY19zZXJ2ZXJfcmVnaXN0ZXJfbWV0aG9kfHhtbHJwY19zZXRfdHlwZXx4bWx3cml0ZXJfZW5kX2F0dHJpYnV0ZXx4bWx3cml0ZXJfZW5kX2NkYXRhfHhtbHdyaXRlcl9lbmRfY29tbWVudHx4bWx3cml0ZXJfZW5kX2RvY3VtZW50fHhtbHdyaXRlcl9lbmRfZHRkfHhtbHdyaXRlcl9lbmRfZHRkX2F0dGxpc3R8eG1sd3JpdGVyX2VuZF9kdGRfZWxlbWVudHx4bWx3cml0ZXJfZW5kX2R0ZF9lbnRpdHl8eG1sd3JpdGVyX2VuZF9lbGVtZW50fHhtbHdyaXRlcl9lbmRfcGl8eG1sd3JpdGVyX2ZsdXNofHhtbHdyaXRlcl9mdWxsX2VuZF9lbGVtZW50fHhtbHdyaXRlcl9vcGVuX21lbW9yeXx4bWx3cml0ZXJfb3Blbl91cml8eG1sd3JpdGVyX291dHB1dF9tZW1vcnl8eG1sd3JpdGVyX3NldF9pbmRlbnR8eG1sd3JpdGVyX3NldF9pbmRlbnRfc3RyaW5nfHhtbHdyaXRlcl9zdGFydF9hdHRyaWJ1dGV8eG1sd3JpdGVyX3N0YXJ0X2F0dHJpYnV0ZV9uc3x4bWx3cml0ZXJfc3RhcnRfY2RhdGF8eG1sd3JpdGVyX3N0YXJ0X2NvbW1lbnR8eG1sd3JpdGVyX3N0YXJ0X2RvY3VtZW50fHhtbHdyaXRlcl9zdGFydF9kdGR8eG1sd3JpdGVyX3N0YXJ0X2R0ZF9hdHRsaXN0fHhtbHdyaXRlcl9zdGFydF9kdGRfZWxlbWVudHx4bWx3cml0ZXJfc3RhcnRfZHRkX2VudGl0eXx4bWx3cml0ZXJfc3RhcnRfZWxlbWVudHx4bWx3cml0ZXJfc3RhcnRfZWxlbWVudF9uc3x4bWx3cml0ZXJfc3RhcnRfcGl8eG1sd3JpdGVyX3RleHR8eG1sd3JpdGVyX3dyaXRlX2F0dHJpYnV0ZXx4bWx3cml0ZXJfd3JpdGVfYXR0cmlidXRlX25zfHhtbHdyaXRlcl93cml0ZV9jZGF0YXx4bWx3cml0ZXJfd3JpdGVfY29tbWVudHx4bWx3cml0ZXJfd3JpdGVfZHRkfHhtbHdyaXRlcl93cml0ZV9kdGRfYXR0bGlzdHx4bWx3cml0ZXJfd3JpdGVfZHRkX2VsZW1lbnR8eG1sd3JpdGVyX3dyaXRlX2R0ZF9lbnRpdHl8eG1sd3JpdGVyX3dyaXRlX2VsZW1lbnR8eG1sd3JpdGVyX3dyaXRlX2VsZW1lbnRfbnN8eG1sd3JpdGVyX3dyaXRlX3BpfHhtbHdyaXRlcl93cml0ZV9yYXd8eHBhdGhfZXZhbHx4cGF0aF9ldmFsX2V4cHJlc3Npb258eHBhdGhfbmV3X2NvbnRleHR8eHBhdGhfcmVnaXN0ZXJfbnN8eHBhdGhfcmVnaXN0ZXJfbnNfYXV0b3x4cHRyX2V2YWx8eHB0cl9uZXdfY29udGV4dHx4c2x0X2JhY2tlbmRfaW5mb3x4c2x0X2JhY2tlbmRfbmFtZXx4c2x0X2JhY2tlbmRfdmVyc2lvbnx4c2x0X2NyZWF0ZXx4c2x0X2Vycm5vfHhzbHRfZXJyb3J8eHNsdF9mcmVlfHhzbHRfZ2V0b3B0fHhzbHRfcHJvY2Vzc3x4c2x0X3NldF9iYXNlfHhzbHRfc2V0X2VuY29kaW5nfHhzbHRfc2V0X2Vycm9yX2hhbmRsZXJ8eHNsdF9zZXRfbG9nfHhzbHRfc2V0X29iamVjdHx4c2x0X3NldF9zYXhfaGFuZGxlcnx4c2x0X3NldF9zYXhfaGFuZGxlcnN8eHNsdF9zZXRfc2NoZW1lX2hhbmRsZXJ8eHNsdF9zZXRfc2NoZW1lX2hhbmRsZXJzfHhzbHRfc2V0b3B0fHhzbHRwcm9jZXNzb3J8eWFtbF9lbWl0fHlhbWxfZW1pdF9maWxlfHlhbWxfcGFyc2V8eWFtbF9wYXJzZV9maWxlfHlhbWxfcGFyc2VfdXJsfHlhel9hZGRpbmZvfHlhel9jY2xfY29uZnx5YXpfY2NsX3BhcnNlfHlhel9jbG9zZXx5YXpfY29ubmVjdHx5YXpfZGF0YWJhc2V8eWF6X2VsZW1lbnR8eWF6X2Vycm5vfHlhel9lcnJvcnx5YXpfZXN8eWF6X2VzX3Jlc3VsdHx5YXpfZ2V0X29wdGlvbnx5YXpfaGl0c3x5YXpfaXRlbW9yZGVyfHlhel9wcmVzZW50fHlhel9yYW5nZXx5YXpfcmVjb3JkfHlhel9zY2FufHlhel9zY2FuX3Jlc3VsdHx5YXpfc2NoZW1hfHlhel9zZWFyY2h8eWF6X3NldF9vcHRpb258eWF6X3NvcnR8eWF6X3N5bnRheHx5YXpfd2FpdHx5cF9hbGx8eXBfY2F0fHlwX2Vycl9zdHJpbmd8eXBfZXJybm98eXBfZmlyc3R8eXBfZ2V0X2RlZmF1bHRfZG9tYWlufHlwX21hc3Rlcnx5cF9tYXRjaHx5cF9uZXh0fHlwX29yZGVyfHplbmRfbG9nb19ndWlkfHplbmRfdGhyZWFkX2lkfHplbmRfdmVyc2lvbnx6aXBfY2xvc2V8emlwX2VudHJ5X2Nsb3NlfHppcF9lbnRyeV9jb21wcmVzc2Vkc2l6ZXx6aXBfZW50cnlfY29tcHJlc3Npb25tZXRob2R8emlwX2VudHJ5X2ZpbGVzaXplfHppcF9lbnRyeV9uYW1lfHppcF9lbnRyeV9vcGVufHppcF9lbnRyeV9yZWFkfHppcF9vcGVufHppcF9yZWFkfHppcGFyY2hpdmV8emlwYXJjaGl2ZV9hZGRlbXB0eWRpcnx6aXBhcmNoaXZlX2FkZGZpbGV8emlwYXJjaGl2ZV9hZGRmcm9tc3RyaW5nfHppcGFyY2hpdmVfY2xvc2V8emlwYXJjaGl2ZV9kZWxldGVpbmRleHx6aXBhcmNoaXZlX2RlbGV0ZW5hbWV8emlwYXJjaGl2ZV9leHRyYWN0dG98emlwYXJjaGl2ZV9nZXRhcmNoaXZlY29tbWVudHx6aXBhcmNoaXZlX2dldGNvbW1lbnRpbmRleHx6aXBhcmNoaXZlX2dldGNvbW1lbnRuYW1lfHppcGFyY2hpdmVfZ2V0ZnJvbWluZGV4fHppcGFyY2hpdmVfZ2V0ZnJvbW5hbWV8emlwYXJjaGl2ZV9nZXRuYW1laW5kZXh8emlwYXJjaGl2ZV9nZXRzdGF0dXNzdHJpbmd8emlwYXJjaGl2ZV9nZXRzdHJlYW18emlwYXJjaGl2ZV9sb2NhdGVuYW1lfHppcGFyY2hpdmVfb3Blbnx6aXBhcmNoaXZlX3JlbmFtZWluZGV4fHppcGFyY2hpdmVfcmVuYW1lbmFtZXx6aXBhcmNoaXZlX3NldENvbW1lbnROYW1lfHppcGFyY2hpdmVfc2V0YXJjaGl2ZWNvbW1lbnR8emlwYXJjaGl2ZV9zZXRjb21tZW50aW5kZXh8emlwYXJjaGl2ZV9zdGF0aW5kZXh8emlwYXJjaGl2ZV9zdGF0bmFtZXx6aXBhcmNoaXZlX3VuY2hhbmdlYWxsfHppcGFyY2hpdmVfdW5jaGFuZ2VhcmNoaXZlfHppcGFyY2hpdmVfdW5jaGFuZ2VpbmRleHx6aXBhcmNoaXZlX3VuY2hhbmdlbmFtZXx6bGliX2dldF9jb2RpbmdfdHlwZSIuc3BsaXQoInwiKSksYz1lLmFycmF5VG9NYXAoImFic3RyYWN0fGFuZHxhcnJheXxhc3xicmVha3xjYXNlfGNhdGNofGNsYXNzfGNsb25lfGNvbnN0fGNvbnRpbnVlfGRlY2xhcmV8ZGVmYXVsdHxkb3xlbHNlfGVsc2VpZnxlbmRkZWNsYXJlfGVuZGZvcnxlbmRmb3JlYWNofGVuZGlmfGVuZHN3aXRjaHxlbmR3aGlsZXxleHRlbmRzfGZpbmFsfGZvcnxmb3JlYWNofGZ1bmN0aW9ufGdsb2JhbHxnb3RvfGlmfGltcGxlbWVudHN8aW50ZXJmYWNlfGluc3RhbmNlb2Z8bmFtZXNwYWNlfG5ld3xvcnxwcml2YXRlfHByb3RlY3RlZHxwdWJsaWN8c3RhdGljfHN3aXRjaHx0aHJvd3x0cnl8dXNlfHZhcnx3aGlsZXx4b3IiLnNwbGl0KCJ8IikpLGQ9ZS5hcnJheVRvTWFwKCJkaWV8ZWNob3xlbXB0eXxleGl0fGV2YWx8aW5jbHVkZXxpbmNsdWRlX29uY2V8aXNzZXR8bGlzdHxyZXF1aXJlfHJlcXVpcmVfb25jZXxyZXR1cm58cHJpbnR8dW5zZXQiLnNwbGl0KCJ8IikpLGc9ZS5hcnJheVRvTWFwKCJ0cnVlfGZhbHNlfG51bGx8X19DTEFTU19ffF9fRElSX198X19GSUxFX198X19MSU5FX198X19NRVRIT0RfX3xfX0ZVTkNUSU9OX198X19OQU1FU1BBQ0VfXyIuc3BsaXQoInwiKSksaD1lLmFycmF5VG9NYXAoIiRHTE9CQUxTfCRfU0VSVkVSfCRfR0VUfCRfUE9TVHwkX0ZJTEVTfCRfUkVRVUVTVHwkX1NFU1NJT058JF9FTlZ8JF9DT09LSUV8JHBocF9lcnJvcm1zZ3wkSFRUUF9SQVdfUE9TVF9EQVRBfCRodHRwX3Jlc3BvbnNlX2hlYWRlcnwkYXJnY3wkYXJndiIuc3BsaXQoInwiKSksaT1lLmFycmF5VG9NYXAoImtleV9leGlzdHN8Y2Fpcm9fbWF0cml4X2NyZWF0ZV9zY2FsZXxjYWlyb19tYXRyaXhfY3JlYXRlX3RyYW5zbGF0ZXxjYWxsX3VzZXJfbWV0aG9kfGNhbGxfdXNlcl9tZXRob2RfYXJyYXl8Y29tX2FkZHJlZnxjb21fZ2V0fGNvbV9pbnZva2V8Y29tX2lzZW51bXxjb21fbG9hZHxjb21fcmVsZWFzZXxjb21fc2V0fGNvbm5lY3Rpb25fdGltZW91dHxjdWJyaWRfbG9hZF9mcm9tX2dsb3xjdWJyaWRfbmV3X2dsb3xjdWJyaWRfc2F2ZV90b19nbG98Y3VicmlkX3NlbmRfZ2xvfGRlZmluZV9zeXNsb2dfdmFyaWFibGVzfGRsfGVyZWd8ZXJlZ19yZXBsYWNlfGVyZWdpfGVyZWdpX3JlcGxhY2V8aHdfZG9jdW1lbnRhdHRyaWJ1dGVzfGh3X2RvY3VtZW50Ym9keXRhZ3xod19kb2N1bWVudHNpemV8aHdfb3V0cHV0ZG9jdW1lbnR8aW1hZ2VkYXNoZWRsaW5lfG1heGRiX2JpbmRfcGFyYW18bWF4ZGJfYmluZF9yZXN1bHR8bWF4ZGJfY2xpZW50X2VuY29kaW5nfG1heGRiX2Nsb3NlX2xvbmdfZGF0YXxtYXhkYl9leGVjdXRlfG1heGRiX2ZldGNofG1heGRiX2dldF9tZXRhZGF0YXxtYXhkYl9wYXJhbV9jb3VudHxtYXhkYl9zZW5kX2xvbmdfZGF0YXxtY3J5cHRfZWNifG1jcnlwdF9nZW5lcmljX2VuZHxtaW1lX2NvbnRlbnRfdHlwZXxteXNxbF9jcmVhdGVkYnxteXNxbF9kYm5hbWV8bXlzcWxfZGJfcXVlcnl8bXlzcWxfZHJvcF9kYnxteXNxbF9kcm9wZGJ8bXlzcWxfZXNjYXBlX3N0cmluZ3xteXNxbF9maWVsZGZsYWdzfG15c3FsX2ZpZWxkZmxhZ3N8bXlzcWxfZmllbGRuYW1lfG15c3FsX2ZpZWxkdGFibGV8bXlzcWxfZmllbGR0eXBlfG15c3FsX2ZyZWVyZXN1bHR8bXlzcWxfbGlzdGRic3xteXNxbF9saXN0X2ZpZWxkc3xteXNxbF9saXN0ZmllbGRzfG15c3FsX2xpc3RfdGFibGVzfG15c3FsX2xpc3R0YWJsZXN8bXlzcWxfbnVtZmllbGRzfG15c3FsX251bXJvd3N8bXlzcWxfc2VsZWN0ZGJ8bXlzcWxfdGFibGVuYW1lfG15c3FsaV9iaW5kX3BhcmFtfG15c3FsaV9iaW5kX3Jlc3VsdHxteXNxbGlfZGlzYWJsZV9yZWFkc19mcm9tX21hc3RlcnxteXNxbGlfZGlzYWJsZV9ycGxfcGFyc2V8bXlzcWxpX2VuYWJsZV9yZWFkc19mcm9tX21hc3RlcnxteXNxbGlfZW5hYmxlX3JwbF9wYXJzZXxteXNxbGlfZXhlY3V0ZXxteXNxbGlfZmV0Y2h8bXlzcWxpX2dldF9tZXRhZGF0YXxteXNxbGlfbWFzdGVyX3F1ZXJ5fG15c3FsaV9wYXJhbV9jb3VudHxteXNxbGlfcnBsX3BhcnNlX2VuYWJsZWR8bXlzcWxpX3JwbF9wcm9iZXxteXNxbGlfcnBsX3F1ZXJ5X3R5cGV8bXlzcWxpX3NlbmRfbG9uZ19kYXRhfG15c3FsaV9zZW5kX3F1ZXJ5fG15c3FsaV9zbGF2ZV9xdWVyeXxvY2liaW5kYnluYW1lfG9jaWNhbmNlbHxvY2ljbG9zZWxvYnxvY2ljb2xsYXBwZW5kfG9jaWNvbGxhc3NpZ258b2NpY29sbGFzc2lnbmVsZW18b2NpY29sbGdldGVsZW18b2NpY29sbG1heHxvY2ljb2xsc2l6ZXxvY2ljb2xsdHJpbXxvY2ljb2x1bW5pc251bGx8b2NpY29sdW1ubmFtZXxvY2ljb2x1bW5wcmVjaXNpb258b2NpY29sdW1uc2NhbGV8b2NpY29sdW1uc2l6ZXxvY2ljb2x1bW50eXBlfG9jaWNvbHVtbnR5cGVyYXd8b2NpY29tbWl0fG9jaWRlZmluZWJ5bmFtZXxvY2llcnJvcnxvY2lleGVjdXRlfG9jaWZldGNofG9jaWZldGNoaW50b3xvY2lmZXRjaHN0YXRlbWVudHxvY2lmcmVlY29sbGVjdGlvbnxvY2lmcmVlY3Vyc29yfG9jaWZyZWVkZXNjfG9jaWZyZWVzdGF0ZW1lbnR8b2NpaW50ZXJuYWxkZWJ1Z3xvY2lsb2FkbG9ifG9jaWxvZ29mZnxvY2lsb2dvbnxvY2luZXdjb2xsZWN0aW9ufG9jaW5ld2N1cnNvcnxvY2luZXdkZXNjcmlwdG9yfG9jaW5sb2dvbnxvY2ludW1jb2xzfG9jaXBhcnNlfG9jaXBsb2dvbnxvY2lyZXN1bHR8b2Npcm9sbGJhY2t8b2Npcm93Y291bnR8b2Npc2F2ZWxvYnxvY2lzYXZlbG9iZmlsZXxvY2lzZXJ2ZXJ2ZXJzaW9ufG9jaXNldHByZWZldGNofG9jaXN0YXRlbWVudHR5cGV8b2Npd3JpdGVsb2J0b2ZpbGV8b2Npd3JpdGV0ZW1wb3Jhcnlsb2J8UERGX2FkZF9hbm5vdGF0aW9ufFBERl9hZGRfYm9va21hcmt8UERGX2FkZF9sYXVuY2hsaW5rfFBERl9hZGRfbG9jYWxsaW5rfFBERl9hZGRfbm90ZXxQREZfYWRkX291dGxpbmV8UERGX2FkZF9wZGZsaW5rfFBERl9hZGRfd2VibGlua3xQREZfYXR0YWNoX2ZpbGV8UERGX2JlZ2luX3BhZ2V8UERGX2JlZ2luX3RlbXBsYXRlfFBERl9jbG9zZV9wZGl8UERGX2Nsb3NlfFBERl9maW5kZm9udHxQREZfZ2V0X2ZvbnR8UERGX2dldF9mb250bmFtZXxQREZfZ2V0X2ZvbnRzaXplfFBERl9nZXRfaW1hZ2VfaGVpZ2h0fFBERl9nZXRfaW1hZ2Vfd2lkdGh8UERGX2dldF9tYWpvcnZlcnNpb258UERGX2dldF9taW5vcnZlcnNpb258UERGX2dldF9wZGlfcGFyYW1ldGVyfFBERl9nZXRfcGRpX3ZhbHVlfFBERl9vcGVuX2NjaXR0fFBERl9vcGVuX2ZpbGV8UERGX29wZW5fZ2lmfFBERl9vcGVuX2ltYWdlX2ZpbGV8UERGX29wZW5faW1hZ2V8UERGX29wZW5fanBlZ3xQREZfb3Blbl9wZGl8UERGX29wZW5fdGlmZnxQREZfcGxhY2VfaW1hZ2V8UERGX3BsYWNlX3BkaV9wYWdlfFBERl9zZXRfYm9yZGVyX2NvbG9yfFBERl9zZXRfYm9yZGVyX2Rhc2h8UERGX3NldF9ib3JkZXJfc3R5bGV8UERGX3NldF9jaGFyX3NwYWNpbmd8UERGX3NldF9kdXJhdGlvbnxQREZfc2V0X2hvcml6X3NjYWxpbmd8UERGX3NldF9pbmZvX2F1dGhvcnxQREZfc2V0X2luZm9fY3JlYXRvcnxQREZfc2V0X2luZm9fa2V5d29yZHN8UERGX3NldF9pbmZvX3N1YmplY3R8UERGX3NldF9pbmZvX3RpdGxlfFBERl9zZXRfbGVhZGluZ3xQREZfc2V0X3RleHRfbWF0cml4fFBERl9zZXRfdGV4dF9yZW5kZXJpbmd8UERGX3NldF90ZXh0X3Jpc2V8UERGX3NldF93b3JkX3NwYWNpbmd8UERGX3NldGdyYXlfZmlsbHxQREZfc2V0Z3JheV9zdHJva2V8UERGX3NldGdyYXl8UERGX3NldHBvbHlkYXNofFBERl9zZXRyZ2Jjb2xvcl9maWxsfFBERl9zZXRyZ2Jjb2xvcl9zdHJva2V8UERGX3NldHJnYmNvbG9yfFBERl9zaG93X2JveGVkfHBocF9jaGVja19zeW50YXh8cHhfc2V0X3RhYmxlbmFtZXxweF9zZXRfdGFyZ2V0ZW5jb2Rpbmd8cnVua2l0X3NhbmRib3hfb3V0cHV0X2hhbmRsZXJ8c2Vzc2lvbl9pc19yZWdpc3RlcmVkfHNlc3Npb25fcmVnaXN0ZXJ8c2Vzc2lvbl91bnJlZ2lzdGVyc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lfG1hZ2ljX3F1b3Rlc19ydW50aW1lfHNldF9zb2NrZXRfYmxvY2tpbmd8c29ja2V0X3NldF9ibG9ja2luZ3xzZXRfc29ja2V0X3RpbWVvdXR8c29ja2V0X3NldF90aW1lb3V0fHNwbGl0fHNwbGl0aXxzcWxfcmVnY2FzZSIuc3BsaXQoInwiKSksaj1lLmFycmF5VG9NYXAoImNmdW5jdGlvbnxvbGRfZnVuY3Rpb24iLnNwbGl0KCJ8IikpLGs9ZS5hcnJheVRvTWFwKFtdKTt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoic3VwcG9ydC5waHBfdGFnIixyZWdleDoiPFxcPyg/OnBocHxcXD0pIn0se3Rva2VuOiJzdXBwb3J0LnBocF90YWciLHJlZ2V4OiJcXD8+In0se3Rva2VuOiJjb21tZW50IixyZWdleDoiPFxcIS0tIixuZXh0OiJodG1sY29tbWVudCJ9LHt0b2tlbjoibWV0YS50YWciLHJlZ2V4OiI8c3R5bGUiLG5leHQ6ImNzcyJ9LHt0b2tlbjoibWV0YS50YWciLHJlZ2V4OiI8XFwvP1stX2EtekEtWjAtOTpdKyIsbmV4dDoiaHRtbHRhZyJ9LHt0b2tlbjoibWV0YS50YWciLHJlZ2V4OiI8IURPQ1RZUEUuKj8+In0se3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwvXFwvLiokIn0se3Rva2VuOiJjb21tZW50IixyZWdleDoiIy4qJCJ9LGEuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJcXC9cXCoiLG5leHQ6ImNvbW1lbnQifSx7dG9rZW46InN0cmluZy5yZWdleHAiLHJlZ2V4OiJbL10oPzooPzpcXFsoPzpcXFxcXXxbXlxcXV0pK1xcXSl8KD86XFxcXC98W15cXF0vXSkpKlsvXVtnaW15XSpcXHMqKD89WykuLDtdfCQpIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OidbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJ30se3Rva2VuOiJzdHJpbmciLHJlZ2V4OidbIl0uKlxcXFwkJyxuZXh0OiJxcXN0cmluZyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiWyddLipcXFxcJCIsbmV4dDoicXN0cmluZyJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IjBbeFhdWzAtOWEtZkEtRl0rXFxiIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIifSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlIixyZWdleDoiXFxiKD86REVGQVVMVF9JTkNMVURFX1BBVEh8RV8oPzpBTEx8Q08oPzpNUElMRV8oPzpFUlJPUnxXQVJOSU5HKXxSRV8oPzpFUlJPUnxXQVJOSU5HKSl8RVJST1J8Tk9USUNFfFBBUlNFfFNUUklDVHxVU0VSXyg/OkVSUk9SfE5PVElDRXxXQVJOSU5HKXxXQVJOSU5HKXxQKD86RUFSXyg/OkVYVEVOU0lPTl9ESVJ8SU5TVEFMTF9ESVIpfEhQXyg/OkJJTkRJUnxDT05GSUdfRklMRV8oPzpQQVRIfFNDQU5fRElSKXxEQVRBRElSfEUoPzpPTHxYVEVOU0lPTl9ESVIpfElOVF8oPzpNQVh8U0laRSl8TCg/OklCRElSfE9DQUxTVEFURURJUil8Tyg/OlN8VVRQVVRfSEFORExFUl8oPzpDT05UfEVORHxTVEFSVCkpfFBSRUZJWHxTKD86QVBJfEhMSUJfU1VGRklYfFlTQ09ORkRJUil8VkVSU0lPTikpfF9fQ09NUElMRVJfSEFMVF9PRkZTRVRfXylcXGIifSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlIixyZWdleDoiXFxiKD86QSg/OkIoPzpEQVlfKD86MXwyfDN8NHw1fDZ8Nyl8TU9OXyg/OjEoPzowfDF8MnwpfDJ8M3w0fDV8Nnw3fDh8OSkpfExUX0RJR0lUU3xNX1NUUnxTU0VSVF8oPzpBQ1RJVkV8QkFJTHxDQUxMQkFDS3xRVUlFVF9FVkFMfFdBUk5JTkcpKXxDKD86QVNFXyg/OkxPV0VSfFVQUEVSKXxIQVJfTUFYfE8oPzpERVNFVHxOTkVDVElPTl8oPzpBQk9SVEVEfE5PUk1BTHxUSU1FT1VUKXxVTlRfKD86Tk9STUFMfFJFQ1VSU0lWRSkpfFIoPzpFRElUU18oPzpBTEx8RE9DU3xGVUxMUEFHRXxHKD86RU5FUkFMfFJPVVApfE1PRFVMRVN8UUF8U0FQSSl8TkNZU1RSfFlQVF8oPzpCTE9XRklTSHxFWFRfREVTfE1ENXxTKD86QUxUX0xFTkdUSHxURF9ERVMpKSl8VVJSRU5DWV9TWU1CT0wpfEQoPzpBWV8oPzoxfDJ8M3w0fDV8Nnw3KXxFQ0lNQUxfUE9JTlR8SVJFQ1RPUllfU0VQQVJBVE9SfF8oPzpGTVR8VF9GTVQpKXxFKD86TlRfKD86Q09NUEFUfE5PUVVPVEVTfFFVT1RFUyl8UkEoPzpfKD86RF8oPzpGTVR8VF9GTVQpfFRfRk1UfFlFQVIpfCl8WFRSXyg/OklGX0VYSVNUU3xPVkVSV1JJVEV8UFJFRklYXyg/OkFMTHxJKD86Rl9FWElTVFN8TlZBTElEKXxTQU1FKXxTS0lQKSl8RlJBQ19ESUdJVFN8R1JPVVBJTkd8SFRNTF8oPzpFTlRJVElFU3xTUEVDSUFMQ0hBUlMpfElOKD86Rk9fKD86QUxMfEMoPzpPTkZJR1VSQVRJT058UkVESVRTKXxFTlZJUk9OTUVOVHxHRU5FUkFMfExJQ0VOU0V8TU9EVUxFU3xWQVJJQUJMRVMpfElfKD86QUxMfFBFUkRJUnxTWVNURU18VVNFUil8VF8oPzpDVVJSX1NZTUJPTHxGUkFDX0RJR0lUUykpfEwoPzpDXyg/OkFMTHxDKD86T0xMQVRFfFRZUEUpfE0oPzpFU1NBR0VTfE9ORVRBUlkpfE5VTUVSSUN8VElNRSl8Tyg/OkNLXyg/OkVYfE5CfFNIfFVOKXxHXyg/OkEoPzpMRVJUfFVUSCg/OlBSSVZ8KSl8Qyg/Ok9OU3xSKD86SVR8T04pKXxEKD86QUVNT058RUJVRyl8RSg/Ok1FUkd8UlIpfElORk98S0VSTnxMKD86T0NBTCg/OjB8MXwyfDN8NHw1fDZ8Nyl8UFIpfE1BSUx8Tig/OkRFTEFZfEVXU3xPKD86VElDRXxXQUlUKSl8T0RFTEFZfFAoPzpFUlJPUnxJRCl8U1lTTE9HfFUoPzpTRVJ8VUNQKXxXQVJOSU5HKSkpfE0oPzpPTl8oPzoxKD86MHwxfDJ8KXwyfDN8NHw1fDZ8N3w4fDl8REVDSU1BTF9QT0lOVHxHUk9VUElOR3xUSE9VU0FORFNfU0VQKXxfKD86MV9QSXwyXyg/OlBJfFNRUlRQSSl8RXxMKD86Tig/OjEwfDIpfE9HKD86MTBFfDJFKSl8UEkoPzpfKD86Mnw0KXwpfFNRUlQoPzoxXzJ8MikpKXxOKD86RUdBVElWRV9TSUdOfE8oPzpFWFBSfFNUUil8Xyg/OkNTX1BSRUNFREVTfFMoPzpFUF9CWV9TUEFDRXxJR05fUE9TTikpKXxQKD86QVRIKD86SU5GT18oPzpCQVNFTkFNRXxESVJOQU1FfEVYVEVOU0lPTil8X1NFUEFSQVRPUil8TV9TVFJ8T1NJVElWRV9TSUdOfF8oPzpDU19QUkVDRURFU3xTKD86RVBfQllfU1BBQ0V8SUdOX1BPU04pKSl8UkFESVhDSEFSfFMoPzpFRUtfKD86Q1VSfEVORHxTRVQpfE9SVF8oPzpBU0N8REVTQ3xOVU1FUklDfFJFR1VMQVJ8U1RSSU5HKXxUUl9QQURfKD86Qk9USHxMRUZUfFJJR0hUKSl8VCg/OkhPVVMoPzpBTkRTX1NFUHxFUCl8X0ZNVCg/Ol9BTVBNfCkpfFlFUyg/OkVYUFJ8U1RSKXxTVEQoPzpJTnxPVVR8RVJSKSlcXGIifSx7dG9rZW46ZnVuY3Rpb24oYSl7cmV0dXJuIGMuaGFzT3duUHJvcGVydHkoYSk/ImtleXdvcmQiOmcuaGFzT3duUHJvcGVydHkoYSk/ImNvbnN0YW50Lmxhbmd1YWdlIjpoLmhhc093blByb3BlcnR5KGEpPyJ2YXJpYWJsZS5sYW5ndWFnZSI6ay5oYXNPd25Qcm9wZXJ0eShhKT8iaW52YWxpZC5pbGxlZ2FsIjpiLmhhc093blByb3BlcnR5KGEpPyJzdXBwb3J0LmZ1bmN0aW9uIjphPT0iZGVidWdnZXIiPyJpbnZhbGlkLmRlcHJlY2F0ZWQiOmEubWF0Y2goL14oXCRbYS16QS1aXVthLXpBLVowLTlfXSp8c2VsZnxwYXJlbnQpJC8pPyJ2YXJpYWJsZSI6ImlkZW50aWZpZXIifSxyZWdleDoiW2EtekEtWl8kXVthLXpBLVowLTlfJF0qXFxiIn0se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIn0se3Rva2VuOiJscGFyZW4iLHJlZ2V4OiJbWyh7XSJ9LHt0b2tlbjoicnBhcmVuIixyZWdleDoiW1xcXSl9XSJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifV0sY29tbWVudDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4rIn1dLHFxc3RyaW5nOlt7dG9rZW46InN0cmluZyIscmVnZXg6Jyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJyxuZXh0OiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiLisifV0scXN0cmluZzpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OiIoPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/JyIsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIscmVnZXg6Ii4rIn1dLGh0bWxjb21tZW50Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj8tLT4iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJjb21tZW50IixyZWdleDoiLisifV0saHRtbHRhZzpbe3Rva2VuOiJtZXRhLnRhZyIscmVnZXg6Ij4iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJ0ZXh0IixyZWdleDoiWy1fYS16QS1aMC05Ol0rIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDonIi4qPyInfSx7dG9rZW46InN0cmluZyIscmVnZXg6IicuKj8nIn1dLGNzczpbe3Rva2VuOiJtZXRhLnRhZyIscmVnZXg6Ijwvc3R5bGU+IixuZXh0OiJodG1sdGFnIn0se3Rva2VuOiJtZXRhLnRhZyIscmVnZXg6Ij4ifSx7dG9rZW46InRleHQiLHJlZ2V4OiIoPzptZWRpYXx0eXBlfGhyZWYpIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4Oic9Ii4qPyInfSx7dG9rZW46InBhcmVuLmxwYXJlbiIscmVnZXg6InsiLG5leHQ6ImNzc2RlY2xhcmF0aW9uIn0se3Rva2VuOiJrZXl3b3JkIixyZWdleDoiI1tBLVphLXowLTktXy5dKyJ9LHt0b2tlbjoidmFyaWFibGUiLHJlZ2V4OiJcXC5bQS1aYS16MC05LV8uXSsifSx7dG9rZW46ImNvbnN0YW50IixyZWdleDoiW0EtWmEtejAtOV0rIn1dLGNzc2RlY2xhcmF0aW9uOlt7dG9rZW46InN1cHBvcnQudHlwZSIscmVnZXg6IlstYS16QS1aXSsiLG5leHQ6ImNzc3ZhbHVlIn0se3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4OiJ9IixuZXh0OiJjc3MifV0sY3NzdmFsdWU6W3t0b2tlbjoidGV4dCIscmVnZXg6IjoifSx7dG9rZW46ImNvbnN0YW50IixyZWdleDoiI1swLTlhLXpBLVpdKyJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlstXzAtOWEtekEtWlwiJyAsJV0rIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiOyIsbmV4dDoiY3NzZGVjbGFyYXRpb24ifV19LHRoaXMuZW1iZWRSdWxlcyhmLCJkb2MtIixbKG5ldyBmKS5nZXRFbmRSdWxlKCJzdGFydCIpXSl9O2QuaW5oZXJpdHMoaCxnKSxiLlBocEhpZ2hsaWdodFJ1bGVzPWh9KSxkZWZpbmUoImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsZj1mdW5jdGlvbigpe3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50LmRvYy50YWciLHJlZ2V4OiJAW1xcd1xcZF9dKyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlRPRE8ifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiW15AXFwqXSsifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiLiJ9XX19O2QuaW5oZXJpdHMoZixlKSxmdW5jdGlvbigpe3RoaXMuZ2V0U3RhcnRSdWxlPWZ1bmN0aW9uKGEpe3JldHVybnt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCooPz1cXCopIixuZXh0OmF9fSx0aGlzLmdldEVuZFJ1bGU9ZnVuY3Rpb24oYSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxcKlxcLyIsbmV4dDphfX19LmNhbGwoZi5wcm90b3R5cGUpLGIuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzPWZ9KSxkZWZpbmUoImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3JhbmdlIikuUmFuZ2UsZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuL15ccyskLy50ZXN0KGEpPy9eXHMqXH0vLnRlc3QoYik6ITF9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldExpbmUoYiksZT1jLm1hdGNoKC9eKFxzKlx9KS8pO2lmKCFlKXJldHVybiAwO3ZhciBmPWVbMV0ubGVuZ3RoLGc9YS5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6Yixjb2x1bW46Zn0pO2lmKCFnfHxnLnJvdz09YilyZXR1cm4gMDt2YXIgaD10aGlzLiRnZXRJbmRlbnQoYS5nZXRMaW5lKGcucm93KSk7YS5yZXBsYWNlKG5ldyBkKGIsMCxiLGYtMSksaCl9LHRoaXMuJGdldEluZGVudD1mdW5jdGlvbihhKXt2YXIgYj1hLm1hdGNoKC9eKFxzKykvKTtyZXR1cm4gYj9iWzFdOiIifX0pKS5jYWxsKGUucHJvdG90eXBlKSxiLk1hdGNoaW5nQnJhY2VPdXRkZW50PWV9KSxkZWZpbmUoImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL2JlaGF2aW91ciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vYmVoYXZpb3VyIikuQmVoYXZpb3VyLGY9ZnVuY3Rpb24oKXt0aGlzLmFkZCgiYnJhY2VzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSJ7Iil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/e3RleHQ6InsiK2crIn0iLHNlbGVjdGlvbjohMX06e3RleHQ6Int9IixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSJ9Iil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0ifSIpe3ZhciBrPWQuJGZpbmRPcGVuaW5nQnJhY2tldCgifSIse2NvbHVtbjpoLmNvbHVtbisxLHJvdzpoLnJvd30pO2lmKGshPT1udWxsKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fWVsc2UgaWYoZT09IlxuIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0ifSIpe3ZhciBsPWQuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93Omgucm93LGNvbHVtbjpoLmNvbHVtbisxfSk7aWYoIWwpcmV0dXJuIG51bGw7dmFyIG09dGhpcy5nZXROZXh0TGluZUluZGVudChhLGkuc3Vic3RyaW5nKDAsaS5sZW5ndGgtMSksZC5nZXRUYWJTdHJpbmcoKSksbj10aGlzLiRnZXRJbmRlbnQoZC5kb2MuZ2V0TGluZShsLnJvdykpO3JldHVybnt0ZXh0OiJcbiIrbSsiXG4iK24sc2VsZWN0aW9uOlsxLG0ubGVuZ3RoLDEsbS5sZW5ndGhdfX19fSksdGhpcy5hZGQoImJyYWNlcyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0ieyIpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5lbmQuY29sdW1uLGUuZW5kLmNvbHVtbisxKTtpZihoPT0ifSIpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSksdGhpcy5hZGQoInBhcmVucyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0iKCIpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtyZXR1cm4gZyE9PSIiP3t0ZXh0OiIoIitnKyIpIixzZWxlY3Rpb246ITF9Ont0ZXh0OiIoKSIsc2VsZWN0aW9uOlsxLDFdfX1pZihlPT0iKSIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09IikiKXt2YXIgaz1kLiRmaW5kT3BlbmluZ0JyYWNrZXQoIikiLHtjb2x1bW46aC5jb2x1bW4rMSxyb3c6aC5yb3d9KTtpZihrIT09bnVsbClyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX19KSx0aGlzLmFkZCgicGFyZW5zIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSIoIil7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbisxLGUuc3RhcnQuY29sdW1uKzIpO2lmKGg9PSIpIilyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KSx0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09JyInKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7aWYoZyE9PSIiKXJldHVybnt0ZXh0OiciJytnKyciJyxzZWxlY3Rpb246ITF9O3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4tMSxoLmNvbHVtbik7aWYoaj09IlxcIilyZXR1cm4gbnVsbDt2YXIgaz1kLmdldFRva2VucyhmLnN0YXJ0LnJvdyxmLnN0YXJ0LnJvdylbMF0udG9rZW5zLGw9MCxtLG49LTE7Zm9yKHZhciBvPTA7bzxrLmxlbmd0aDtvKyspe209a1tvXSxtLnR5cGU9PSJzdHJpbmciP249LTE6bjwwJiYobj1tLnZhbHVlLmluZGV4T2YoJyInKSk7aWYobS52YWx1ZS5sZW5ndGgrbD5mLnN0YXJ0LmNvbHVtbilicmVhaztsKz1rW29dLnZhbHVlLmxlbmd0aH1pZighbXx8bjwwJiZtLnR5cGUhPT0iY29tbWVudCImJihtLnR5cGUhPT0ic3RyaW5nInx8Zi5zdGFydC5jb2x1bW4hPT1tLnZhbHVlLmxlbmd0aCtsLTEmJm0udmFsdWUubGFzdEluZGV4T2YoJyInKT09PW0udmFsdWUubGVuZ3RoLTEpKXJldHVybnt0ZXh0OiciIicsc2VsZWN0aW9uOlsxLDFdfTtpZihtJiZtLnR5cGU9PT0ic3RyaW5nIil7dmFyIHA9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYocD09JyInKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0nIicpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5zdGFydC5jb2x1bW4rMSxlLnN0YXJ0LmNvbHVtbisyKTtpZihoPT0nIicpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSl9O2QuaW5oZXJpdHMoZixlKSxiLkNzdHlsZUJlaGF2aW91cj1mfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL3JhbmdlIiwiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4uLy4uL3JhbmdlIikuUmFuZ2UsZj1hKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlLGc9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307ZC5pbmhlcml0cyhnLGYpLGZ1bmN0aW9uKCl7dGhpcy5mb2xkaW5nU3RhcnRNYXJrZXI9Lyhce3xcWylbXlx9XF1dKiR8XlxzKihcL1wqKS8sdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj0vXlteXFtce10qKFx9fFxdKXxeW1xzXCpdKihcKlwvKS8sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKSxmPWQubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpO2lmKGYpe3ZhciBnPWYuaW5kZXg7aWYoZlsxXSlyZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKGEsZlsxXSxjLGcpO3ZhciBoPWEuZ2V0Q29tbWVudEZvbGRSYW5nZShjLGcrZlswXS5sZW5ndGgpO3JldHVybiBoLmVuZC5jb2x1bW4tPTIsaH1pZihiIT09Im1hcmtiZWdpbmVuZCIpcmV0dXJuO3ZhciBmPWQubWF0Y2godGhpcy5mb2xkaW5nU3RvcE1hcmtlcik7aWYoZil7dmFyIGc9Zi5pbmRleCtmWzBdLmxlbmd0aDtpZihmWzJdKXt2YXIgaD1hLmdldENvbW1lbnRGb2xkUmFuZ2UoYyxnKTtyZXR1cm4gaC5lbmQuY29sdW1uLT0yLGh9dmFyIGk9e3JvdzpjLGNvbHVtbjpnfSxqPWEuJGZpbmRPcGVuaW5nQnJhY2tldChmWzFdLGkpO2lmKCFqKXJldHVybjtyZXR1cm4gai5jb2x1bW4rKyxpLmNvbHVtbi0tLGUuZnJvbVBvaW50cyhqLGkpfX19LmNhbGwoZy5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxlPWIuRm9sZE1vZGU9ZnVuY3Rpb24oKXt9OygoZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj1udWxsLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9bnVsbCx0aGlzLmdldEZvbGRXaWRnZXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKTtyZXR1cm4gdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChkKT8ic3RhcnQiOmI9PSJtYXJrYmVnaW5lbmQiJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QoZCk/ImVuZCI6IiJ9LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbnVsbH0sdGhpcy5pbmRlbnRhdGlvbkJsb2NrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZT0vXlxzKi8sZj1iLGc9YixoPWEuZ2V0TGluZShiKSxpPWN8fGgubGVuZ3RoLGo9aC5tYXRjaChlKVswXS5sZW5ndGgsaz1hLmdldExlbmd0aCgpO3doaWxlKCsrYjxrKXtoPWEuZ2V0TGluZShiKTt2YXIgbD1oLm1hdGNoKGUpWzBdLmxlbmd0aDtpZihsPT1oLmxlbmd0aCljb250aW51ZTtpZihsPD1qKWJyZWFrO2c9Yn1pZihnPmYpe3ZhciBtPWEuZ2V0TGluZShnKS5sZW5ndGg7cmV0dXJuIG5ldyBkKGYsaSxnLG0pfX0sdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrPWZ1bmN0aW9uKGEsYixjLGUpe3ZhciBmPXtyb3c6Yyxjb2x1bW46ZSsxfSxnPWEuJGZpbmRDbG9zaW5nQnJhY2tldChiLGYpO2lmKCFnKXJldHVybjt2YXIgaD1hLmZvbGRXaWRnZXRzW2cucm93XTtyZXR1cm4gaD09bnVsbCYmKGg9dGhpcy5nZXRGb2xkV2lkZ2V0KGEsZy5yb3cpKSxoPT0ic3RhcnQiJiYoZy5yb3ctLSxnLmNvbHVtbj1hLmdldExpbmUoZy5yb3cpLmxlbmd0aCksZC5mcm9tUG9pbnRzKGYsZyl9fSkpLmNhbGwoZS5wcm90b3R5cGUpfSksZnVuY3Rpb24oKXt3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSxmdW5jdGlvbihhKXt3aW5kb3cuYWNlfHwod2luZG93LmFjZT17fSk7Zm9yKHZhciBiIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShiKSYmKGFjZVtiXT1hW2JdKX0pfSgp]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-powershell-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCdhY2UvbW9kZS9wb3dlcnNoZWxsJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvcG93ZXJzaGVsbF9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOwp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOwp2YXIgUG93ZXJzaGVsbEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9wb3dlcnNoZWxsX2hpZ2hsaWdodF9ydWxlcyIpLlBvd2Vyc2hlbGxIaWdobGlnaHRSdWxlczsKdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gcmVxdWlyZSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQ7CnZhciBDc3R5bGVCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2JlaGF2aW91ci9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXI7CnZhciBDU3R5bGVGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZTsKCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKG5ldyBQb3dlcnNoZWxsSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsKICAgIHRoaXMuJG91dGRlbnQgPSBuZXcgTWF0Y2hpbmdCcmFjZU91dGRlbnQoKTsKICAgIHRoaXMuJGJlaGF2aW91ciA9IG5ldyBDc3R5bGVCZWhhdmlvdXIoKTsKICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IENTdHlsZUZvbGRNb2RlKCk7Cn07Cm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsKICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGxpbmUpOwoKICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsKICAgICAgICB2YXIgdG9rZW5zID0gdG9rZW5pemVkTGluZS50b2tlbnM7CgogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7CiAgICAgICAgICAgIHJldHVybiBpbmRlbnQ7CiAgICAgICAgfQogICAgICAKICAgICAgICBpZiAoc3RhdGUgPT0gInN0YXJ0IikgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eLipbXHtcKFxbXVxzKiQvKTsKICAgICAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gdGFiOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaW5kZW50OwogICAgfTsKCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCBpbnB1dCkgewogICAgICAgIHJldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChsaW5lLCBpbnB1dCk7CiAgICB9OwoKICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCByb3cpIHsKICAgICAgICB0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGRvYywgcm93KTsKICAgIH07CgoKICAgIHRoaXMuY3JlYXRlV29ya2VyID0gZnVuY3Rpb24oc2Vzc2lvbikgewogICAgICAgIHJldHVybiBudWxsOwogICAgfTsKCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOwoKZXhwb3J0cy5Nb2RlID0gTW9kZTsKfSk7CmRlZmluZSgnYWNlL21vZGUvcG93ZXJzaGVsbF9oaWdobGlnaHRfcnVsZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOwp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsKCnZhciBQb3dlcnNoZWxsSGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsKICAgIAogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAoImZ1bmN0aW9ufGlmfGVsc2V8ZWxzZWlmfHN3aXRjaHx3aGlsZXxkZWZhdWx0fGZvcnxkb3x1bnRpbHxicmVha3xjb250aW51ZXwiICsgCiAgICAgICAiZm9yZWFjaHxyZXR1cm58ZmlsdGVyfGlufHRyYXB8dGhyb3d8cGFyYW18YmVnaW58cHJvY2Vzc3xlbmQiKS5zcGxpdCgifCIpCiAgICApOwoKICAgIHZhciBidWlsdGluRnVuY3Rpb25zID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAoIkdldC1BbGlhc3xJbXBvcnQtQWxpYXN8TmV3LUFsaWFzfFNldC1BbGlhc3xHZXQtQXV0aGVudGljb2RlU2lnbmF0dXJlfFNldC1BdXRoZW50aWNvZGVTaWduYXR1cmV8IiArCiAgICAgICAiU2V0LUxvY2F0aW9ufEdldC1DaGlsZEl0ZW18Q2xlYXItSXRlbXxHZXQtQ29tbWFuZHxNZWFzdXJlLUNvbW1hbmR8VHJhY2UtQ29tbWFuZHwiICsKICAgICAgICJBZGQtQ29tcHV0ZXJ8Q2hlY2twb2ludC1Db21wdXRlcnxSZW1vdmUtQ29tcHV0ZXJ8UmVzdGFydC1Db21wdXRlcnxSZXN0b3JlLUNvbXB1dGVyfFN0b3AtQ29tcHV0ZXJ8IiArCiAgICAgICAiUmVzZXQtQ29tcHV0ZXJNYWNoaW5lUGFzc3dvcmR8VGVzdC1Db21wdXRlclNlY3VyZUNoYW5uZWx8QWRkLUNvbnRlbnR8R2V0LUNvbnRlbnR8U2V0LUNvbnRlbnR8Q2xlYXItQ29udGVudHwiICsKICAgICAgICJHZXQtQ29tbWFuZHxJbnZva2UtQ29tbWFuZHxFbmFibGUtQ29tcHV0ZXJSZXN0b3JlfERpc2FibGUtQ29tcHV0ZXJSZXN0b3JlfEdldC1Db21wdXRlclJlc3RvcmVQb2ludHxUZXN0LUNvbm5lY3Rpb258IiArCiAgICAgICAiQ29udmVydEZyb20tQ1NWfENvbnZlcnRUby1DU1Z8Q29udmVydFRvLUh0bWx8Q29udmVydFRvLVhtbHxDb252ZXJ0RnJvbS1TZWN1cmVTdHJpbmd8Q29udmVydFRvLVNlY3VyZVN0cmluZ3wiICsKICAgICAgICJDb3B5LUl0ZW18RXhwb3J0LUNvdW50ZXJ8R2V0LUNvdW50ZXJ8SW1wb3J0LUNvdW50ZXJ8R2V0LUNyZWRlbnRpYWx8R2V0LUN1bHR1cmV8IiArCiAgICAgICAiR2V0LUNoaWxkSXRlbXxHZXQtRGF0ZXxTZXQtRGF0ZXxSZW1vdmUtSXRlbXxDb21wYXJlLU9iamVjdHxHZXQtRXZlbnR8IiArCiAgICAgICAiR2V0LVdpbkV2ZW50fE5ldy1FdmVudHxSZW1vdmUtRXZlbnR8VW5yZWdpc3Rlci1FdmVudHxXYWl0LUV2ZW50fENsZWFyLUV2ZW50TG9nfCIgKwogICAgICAgIkdldC1FdmVudGxvZ3xMaW1pdC1FdmVudExvZ3xOZXctRXZlbnRsb2d8UmVtb3ZlLUV2ZW50TG9nfFNob3ctRXZlbnRMb2d8V3JpdGUtRXZlbnRMb2d8IiArCiAgICAgICAiR2V0LUV2ZW50U3Vic2NyaWJlcnxSZWdpc3Rlci1FbmdpbmVFdmVudHxSZWdpc3Rlci1PYmplY3RFdmVudHxSZWdpc3Rlci1XbWlFdmVudHxHZXQtRXhlY3V0aW9uUG9saWN5fFNldC1FeGVjdXRpb25Qb2xpY3l8IiArCiAgICAgICAiRXhwb3J0LUFsaWFzfEV4cG9ydC1DbGl4bWx8RXhwb3J0LUNvbnNvbGV8RXhwb3J0LUNzdnxGb3JFYWNoLU9iamVjdHxGb3JtYXQtQ3VzdG9tfCIgKwogICAgICAgIkZvcm1hdC1MaXN0fEZvcm1hdC1UYWJsZXxGb3JtYXQtV2lkZXxFeHBvcnQtRm9ybWF0RGF0YXxHZXQtRm9ybWF0RGF0YXxHZXQtSXRlbXwiICsKICAgICAgICJHZXQtQ2hpbGRJdGVtfEdldC1IZWxwfEFkZC1IaXN0b3J5fENsZWFyLUhpc3Rvcnl8R2V0LUhpc3Rvcnl8SW52b2tlLUhpc3Rvcnl8IiArCiAgICAgICAiR2V0LUhvc3R8UmVhZC1Ib3N0fFdyaXRlLUhvc3R8R2V0LUhvdEZpeHxJbXBvcnQtQ2xpeG1sfEltcG9ydC1Dc3Z8IiArCiAgICAgICAiSW52b2tlLUNvbW1hbmR8SW52b2tlLUV4cHJlc3Npb258R2V0LUl0ZW18SW52b2tlLUl0ZW18TmV3LUl0ZW18UmVtb3ZlLUl0ZW18IiArCiAgICAgICAiU2V0LUl0ZW18Q2xlYXItSXRlbVByb3BlcnR5fENvcHktSXRlbVByb3BlcnR5fEdldC1JdGVtUHJvcGVydHl8TW92ZS1JdGVtUHJvcGVydHl8TmV3LUl0ZW1Qcm9wZXJ0eXwiICsKICAgICAgICJSZW1vdmUtSXRlbVByb3BlcnR5fFJlbmFtZS1JdGVtUHJvcGVydHl8U2V0LUl0ZW1Qcm9wZXJ0eXxHZXQtSm9ifFJlY2VpdmUtSm9ifFJlbW92ZS1Kb2J8IiArCiAgICAgICAiU3RhcnQtSm9ifFN0b3AtSm9ifFdhaXQtSm9ifFN0b3AtUHJvY2Vzc3xVcGRhdGUtTGlzdHxHZXQtTG9jYXRpb258IiArCiAgICAgICAiUG9wLUxvY2F0aW9ufFB1c2gtTG9jYXRpb258U2V0LUxvY2F0aW9ufFNlbmQtTWFpbE1lc3NhZ2V8QWRkLU1lbWJlcnxHZXQtTWVtYmVyfCIgKwogICAgICAgIk1vdmUtSXRlbXxDb21wYXJlLU9iamVjdHxHcm91cC1PYmplY3R8TWVhc3VyZS1PYmplY3R8TmV3LU9iamVjdHxTZWxlY3QtT2JqZWN0fCIgKwogICAgICAgIlNvcnQtT2JqZWN0fFdoZXJlLU9iamVjdHxPdXQtRGVmYXVsdHxPdXQtRmlsZXxPdXQtR3JpZFZpZXd8T3V0LUhvc3R8IiArCiAgICAgICAiT3V0LU51bGx8T3V0LVByaW50ZXJ8T3V0LVN0cmluZ3xDb252ZXJ0LVBhdGh8Sm9pbi1QYXRofFJlc29sdmUtUGF0aHwiICsKICAgICAgICJTcGxpdC1QYXRofFRlc3QtUGF0aHxHZXQtUGZ4Y2VydGlmaWNhdGV8UG9wLUxvY2F0aW9ufFB1c2gtTG9jYXRpb258R2V0LVByb2Nlc3N8IiArCiAgICAgICAiU3RhcnQtUHJvY2Vzc3xTdG9wLVByb2Nlc3N8V2FpdC1Qcm9jZXNzfEVuYWJsZS1QU0JyZWFrcG9pbnR8RGlzYWJsZS1QU0JyZWFrcG9pbnR8R2V0LVBTQnJlYWtwb2ludHwiICsKICAgICAgICJTZXQtUFNCcmVha3BvaW50fFJlbW92ZS1QU0JyZWFrcG9pbnR8R2V0LVBTRHJpdmV8TmV3LVBTRHJpdmV8UmVtb3ZlLVBTRHJpdmV8R2V0LVBTUHJvdmlkZXJ8IiArCiAgICAgICAiU2V0LVBTZGVidWd8RW50ZXItUFNTZXNzaW9ufEV4aXQtUFNTZXNzaW9ufEV4cG9ydC1QU1Nlc3Npb258R2V0LVBTU2Vzc2lvbnxJbXBvcnQtUFNTZXNzaW9ufCIgKwogICAgICAgIk5ldy1QU1Nlc3Npb258UmVtb3ZlLVBTU2Vzc2lvbnxEaXNhYmxlLVBTU2Vzc2lvbkNvbmZpZ3VyYXRpb258RW5hYmxlLVBTU2Vzc2lvbkNvbmZpZ3VyYXRpb258R2V0LVBTU2Vzc2lvbkNvbmZpZ3VyYXRpb258UmVnaXN0ZXItUFNTZXNzaW9uQ29uZmlndXJhdGlvbnwiICsKICAgICAgICJTZXQtUFNTZXNzaW9uQ29uZmlndXJhdGlvbnxVbnJlZ2lzdGVyLVBTU2Vzc2lvbkNvbmZpZ3VyYXRpb258TmV3LVBTU2Vzc2lvbk9wdGlvbnxBZGQtUHNTbmFwSW58R2V0LVBzU25hcGlufFJlbW92ZS1QU1NuYXBpbnwiICsKICAgICAgICJHZXQtUmFuZG9tfFJlYWQtSG9zdHxSZW1vdmUtSXRlbXxSZW5hbWUtSXRlbXxSZW5hbWUtSXRlbVByb3BlcnR5fFNlbGVjdC1PYmplY3R8IiArCiAgICAgICAiU2VsZWN0LVhNTHxTZW5kLU1haWxNZXNzYWdlfEdldC1TZXJ2aWNlfE5ldy1TZXJ2aWNlfFJlc3RhcnQtU2VydmljZXxSZXN1bWUtU2VydmljZXwiICsKICAgICAgICJTZXQtU2VydmljZXxTdGFydC1TZXJ2aWNlfFN0b3AtU2VydmljZXxTdXNwZW5kLVNlcnZpY2V8U29ydC1PYmplY3R8U3RhcnQtU2xlZXB8IiArCiAgICAgICAiQ29udmVydEZyb20tU3RyaW5nRGF0YXxTZWxlY3QtU3RyaW5nfFRlZS1PYmplY3R8TmV3LVRpbWVzcGFufFRyYWNlLUNvbW1hbmR8R2V0LVRyYWNlc291cmNlfCIgKwogICAgICAgIlNldC1UcmFjZXNvdXJjZXxTdGFydC1UcmFuc2FjdGlvbnxDb21wbGV0ZS1UcmFuc2FjdGlvbnxHZXQtVHJhbnNhY3Rpb258VXNlLVRyYW5zYWN0aW9ufFVuZG8tVHJhbnNhY3Rpb258IiArCiAgICAgICAiU3RhcnQtVHJhbnNjcmlwdHxTdG9wLVRyYW5zY3JpcHR8QWRkLVR5cGV8VXBkYXRlLVR5cGVEYXRhfEdldC1VaWN1bHR1cmV8R2V0LVVuaXF1ZXwiICsKICAgICAgICJVcGRhdGUtRm9ybWF0ZGF0YXxVcGRhdGUtVHlwZWRhdGF8Q2xlYXItVmFyaWFibGV8R2V0LVZhcmlhYmxlfE5ldy1WYXJpYWJsZXxSZW1vdmUtVmFyaWFibGV8IiArCiAgICAgICAiU2V0LVZhcmlhYmxlfE5ldy1XZWJTZXJ2aWNlUHJveHl8V2hlcmUtT2JqZWN0fFdyaXRlLURlYnVnfFdyaXRlLUVycm9yfFdyaXRlLUhvc3R8IiArCiAgICAgICAiV3JpdGUtT3V0cHV0fFdyaXRlLVByb2dyZXNzfFdyaXRlLVZlcmJvc2V8V3JpdGUtV2FybmluZ3xTZXQtV21pSW5zdGFuY2V8SW52b2tlLVdtaU1ldGhvZHwiICsKICAgICAgICJHZXQtV21pT2JqZWN0fFJlbW92ZS1XbWlPYmplY3R8Q29ubmVjdC1XU01hbnxEaXNjb25uZWN0LVdTTWFufFRlc3QtV1NNYW58SW52b2tlLVdTTWFuQWN0aW9ufCIgKwogICAgICAgIkRpc2FibGUtV1NNYW5DcmVkU1NQfEVuYWJsZS1XU01hbkNyZWRTU1B8R2V0LVdTTWFuQ3JlZFNTUHxOZXctV1NNYW5JbnN0YW5jZXxHZXQtV1NNYW5JbnN0YW5jZXxTZXQtV1NNYW5JbnN0YW5jZXwiICsKICAgICAgICJSZW1vdmUtV1NNYW5JbnN0YW5jZXxTZXQtV1NNYW5RdWlja0NvbmZpZ3xOZXctV1NNYW5TZXNzaW9uT3B0aW9uIikuc3BsaXQoInwiKSk7CgogICAgdmFyIGJpbmFyeU9wZXJhdG9yc1JlID0gImVxfG5lfGdlfGd0fGx0fGxlfGxpa2V8bm90bGlrZXxtYXRjaHxub3RtYXRjaHxyZXBsYWNlfGNvbnRhaW5zfG5vdGNvbnRhaW5zfCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgImllcXxpbmV8aWdlfGlndHxpbGV8aWx0fGlsaWtlfGlub3RsaWtlfGltYXRjaHxpbm90bWF0Y2h8aXJlcGxhY2V8aWNvbnRhaW5zfGlub3Rjb250YWluc3wiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpc3xpc25vdHxhc3wiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmR8b3J8YmFuZHxib3J8bm90IjsgCgogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBVc2UgKD86KSBpbnN0ZWFkLgogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZAoKICAgIHRoaXMuJHJ1bGVzID0gewogICAgICAgICJzdGFydCIgOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiIy4qJCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUKICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaGV4CiAgICAgICAgICAgICAgICByZWdleCA6ICIwW3hYXVswLTlhLWZBLUZdK1xcYiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGZsb2F0CiAgICAgICAgICAgICAgICByZWdleCA6ICJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJF0oPzpbVHRdcnVlfFtGZl1hbHNlKVxcYiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubGFuZ3VhZ2UiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiWyRdW05uXXVsbFxcYiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAidmFyaWFibGUuaW5zdGFuY2UiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiWyRdW2EtekEtWl1bYS16QS1aMC05X10qXFxiIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGtleXdvcmRzLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsdGluRnVuY3Rpb25zLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmZ1bmN0aW9uIjsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgLy8gVE9ETzogVW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBVbmljb2RlIGlkZW50aWZpZXJzCiAgICAgICAgICAgICAgICByZWdleCA6ICJbYS16QS1aXyRdW2EtekEtWjAtOV8kXFwtXSpcXGIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwtKD86IiArIGJpbmFyeU9wZXJhdG9yc1JlICsgIikiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiJnxcXCp8XFwrfFxcLXxcXD18XFwrPXxcXC09IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJscGFyZW4iLAogICAgICAgICAgICAgICAgcmVnZXggOiAiW1soe10iCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInJwYXJlbiIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJjb21tZW50IiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudAogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwKICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfTsKfTsKCm9vcC5pbmhlcml0cyhQb3dlcnNoZWxsSGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7CgpleHBvcnRzLlBvd2Vyc2hlbGxIaWdobGlnaHRSdWxlcyA9IFBvd2Vyc2hlbGxIaWdobGlnaHRSdWxlczsKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOwoKdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gZnVuY3Rpb24oKSB7fTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKGxpbmUsIGlucHV0KSB7CiAgICAgICAgaWYgKCEgL15ccyskLy50ZXN0KGxpbmUpKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgIHJldHVybiAvXlxzKlx9Ly50ZXN0KGlucHV0KTsKICAgIH07CgogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKGRvYywgcm93KSB7CiAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShyb3cpOwogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMqXH0pLyk7CgogICAgICAgIGlmICghbWF0Y2gpIHJldHVybiAwOwoKICAgICAgICB2YXIgY29sdW1uID0gbWF0Y2hbMV0ubGVuZ3RoOwogICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBkb2MuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiByb3csIGNvbHVtbjogY29sdW1ufSk7CgogICAgICAgIGlmICghb3BlbkJyYWNlUG9zIHx8IG9wZW5CcmFjZVBvcy5yb3cgPT0gcm93KSByZXR1cm4gMDsKCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChkb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7CiAgICAgICAgZG9jLnJlcGxhY2UobmV3IFJhbmdlKHJvdywgMCwgcm93LCBjb2x1bW4tMSksIGluZGVudCk7CiAgICB9OwoKICAgIHRoaXMuJGdldEluZGVudCA9IGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKykvKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICIiOwogICAgfTsKCn0pLmNhbGwoTWF0Y2hpbmdCcmFjZU91dGRlbnQucHJvdG90eXBlKTsKCmV4cG9ydHMuTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBNYXRjaGluZ0JyYWNlT3V0ZGVudDsKfSk7Ci8qIHZpbTp0cz00OnN0cz00OnN3PTQ6CiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgQ2hyaXMgU3BlbmNlciA8Y2hyaXMuYWcuc3BlbmNlciBBVCBnb29nbGVtYWlsIERPVCBjb20+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL2JlaGF2aW91ciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsKdmFyIEJlaGF2aW91ciA9IHJlcXVpcmUoJy4uL2JlaGF2aW91cicpLkJlaGF2aW91cjsKCnZhciBDc3R5bGVCZWhhdmlvdXIgPSBmdW5jdGlvbiAoKSB7CgogICAgdGhpcy5hZGQoImJyYWNlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7CiAgICAgICAgaWYgKHRleHQgPT0gJ3snKSB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7CiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3snICsgc2VsZWN0ZWQgKyAnfScsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAne30nLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJ30nKSB7CiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9JykgewogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCd9Jywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOwogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICJcbiIpIHsKICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOwogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7CiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7CiAgICAgICAgICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gc2Vzc2lvbi5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IGN1cnNvci5yb3csIGNvbHVtbjogY3Vyc29yLmNvbHVtbiArIDF9KTsKICAgICAgICAgICAgICAgIGlmICghb3BlbkJyYWNlUG9zKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKCiAgICAgICAgICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy5nZXROZXh0TGluZUluZGVudChzdGF0ZSwgbGluZS5zdWJzdHJpbmcoMCwgbGluZS5sZW5ndGggLSAxKSwgc2Vzc2lvbi5nZXRUYWJTdHJpbmcoKSk7CiAgICAgICAgICAgICAgICB2YXIgbmV4dF9pbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoc2Vzc2lvbi5kb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnXG4nICsgaW5kZW50ICsgJ1xuJyArIG5leHRfaW5kZW50LAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIGluZGVudC5sZW5ndGgsIDEsIGluZGVudC5sZW5ndGhdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCiAgICB0aGlzLmFkZCgiYnJhY2VzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsKICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOwogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAneycpIHsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7CiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5lbmQuY29sdW1uLCByYW5nZS5lbmQuY29sdW1uICsgMSk7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsKICAgICAgICBpZiAodGV4dCA9PSAnKCcpIHsKICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOwogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsKICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCcgKyBzZWxlY3RlZCArICcpJywKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcoKScsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnKScpIHsKICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOwogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7CiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7CiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hpbmcgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQoJyknLCB7Y29sdW1uOiBjdXJzb3IuY29sdW1uICsgMSwgcm93OiBjdXJzb3Iucm93fSk7CiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmcgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsKICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOwogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnKCcpIHsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7CiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4gKyAxLCByYW5nZS5zdGFydC5jb2x1bW4gKyAyKTsKICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnKScpIHsKICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsKICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7CiAgICAgICAgaWYgKHRleHQgPT0gJyInKSB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7CiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJyInICsgc2VsZWN0ZWQgKyAnIicsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOwogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICAgICAgdmFyIGxlZnRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbi0xLCBjdXJzb3IuY29sdW1uKTsKCiAgICAgICAgICAgICAgICAvLyBXZSdyZSBlc2NhcGVkLgogICAgICAgICAgICAgICAgaWYgKGxlZnRDaGFyID09ICdcXCcpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBGaW5kIHdoYXQgdG9rZW4gd2UncmUgaW5zaWRlLgogICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHNlc3Npb24uZ2V0VG9rZW5zKHNlbGVjdGlvbi5zdGFydC5yb3csIHNlbGVjdGlvbi5zdGFydC5yb3cpWzBdLnRva2VuczsKICAgICAgICAgICAgICAgIHZhciBjb2wgPSAwLCB0b2tlbjsKICAgICAgICAgICAgICAgIHZhciBxdW90ZXBvcyA9IC0xOyAvLyBUcmFjayB3aGV0aGVyIHdlJ3JlIGluc2lkZSBhbiBvcGVuIHF1b3RlLgoKICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgdG9rZW5zLmxlbmd0aDsgeCsrKSB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbeF07CiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gLTE7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxdW90ZXBvcyA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gdG9rZW4udmFsdWUuaW5kZXhPZignIicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoKHRva2VuLnZhbHVlLmxlbmd0aCArIGNvbCkgPiBzZWxlY3Rpb24uc3RhcnQuY29sdW1uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb2wgKz0gdG9rZW5zW3hdLnZhbHVlLmxlbmd0aDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBUcnkgYW5kIGJlIHNtYXJ0IGFib3V0IHdoZW4gd2UgYXV0byBpbnNlcnQuCiAgICAgICAgICAgICAgICBpZiAoIXRva2VuIHx8IChxdW90ZXBvcyA8IDAgJiYgdG9rZW4udHlwZSAhPT0gImNvbW1lbnQiICYmICh0b2tlbi50eXBlICE9PSAic3RyaW5nIiB8fCAoKHNlbGVjdGlvbi5zdGFydC5jb2x1bW4gIT09IHRva2VuLnZhbHVlLmxlbmd0aCtjb2wtMSkgJiYgdG9rZW4udmFsdWUubGFzdEluZGV4T2YoJyInKSA9PT0gdG9rZW4udmFsdWUubGVuZ3RoLTEpKSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIiInLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLDFdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiAmJiB0b2tlbi50eXBlID09PSAic3RyaW5nIikgewogICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpbnB1dCBhbmQgbW92ZSByaWdodCBvbmUgaWYgd2UncmUgdHlwaW5nIG92ZXIgdGhlIGNsb3NpbmcgcXVvdGUuCiAgICAgICAgICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICciJykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsKICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOwogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnIicpIHsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7CiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4gKyAxLCByYW5nZS5zdGFydC5jb2x1bW4gKyAyKTsKICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsKICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsKICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfQpvb3AuaW5oZXJpdHMoQ3N0eWxlQmVoYXZpb3VyLCBCZWhhdmlvdXIpOwoKZXhwb3J0cy5Dc3R5bGVCZWhhdmlvdXIgPSBDc3R5bGVCZWhhdmlvdXI7Cn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9yYW5nZScsICdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsKdmFyIEJhc2VGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGU7Cgp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsKb29wLmluaGVyaXRzKEZvbGRNb2RlLCBCYXNlRm9sZE1vZGUpOwoKKGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyID0gLyhce3xcWylbXlx9XF1dKiR8XlxzKihcL1wqKS87CiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gL15bXlxbXHtdKihcfXxcXSl8Xltcc1wqXSooXCpcLykvOwogICAgCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7CiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleDsKCiAgICAgICAgICAgIGlmIChtYXRjaFsxXSkKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soc2Vzc2lvbiwgbWF0Y2hbMV0sIHJvdywgaSk7CgogICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpICsgbWF0Y2hbMF0ubGVuZ3RoKTsKICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOwogICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoZm9sZFN0eWxlICE9PSAibWFya2JlZ2luZW5kIikKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIpOwogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoOwoKICAgICAgICAgICAgaWYgKG1hdGNoWzJdKSB7CiAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpKTsKICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsKICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGVuZCA9IHtyb3c6IHJvdywgY29sdW1uOiBpfTsKICAgICAgICAgICAgdmFyIHN0YXJ0ID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KG1hdGNoWzFdLCBlbmQpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKCFzdGFydCkKICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgICAgIHN0YXJ0LmNvbHVtbisrOwogICAgICAgICAgICBlbmQuY29sdW1uLS07CgogICAgICAgICAgICByZXR1cm4gIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7CiAgICAgICAgfQogICAgfTsKICAgIAp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7Cgp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7Cgp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG51bGw7CiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gbnVsbDsKCiAgICAvLyBtdXN0IHJldHVybiAiIiBpZiB0aGVyZSdzIG5vIGZvbGQsIHRvIGVuYWJsZSBjYWNoaW5nCiAgICB0aGlzLmdldEZvbGRXaWRnZXQgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgaWYgKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QobGluZSkpCiAgICAgICAgICAgIHJldHVybiAic3RhcnQiOwogICAgICAgIGlmIChmb2xkU3R5bGUgPT0gIm1hcmtiZWdpbmVuZCIKICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIKICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChsaW5lKSkKICAgICAgICAgICAgcmV0dXJuICJlbmQiOwogICAgICAgIHJldHVybiAiIjsKICAgIH07CiAgICAKICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH07CgogICAgdGhpcy5pbmRlbnRhdGlvbkJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgcm93LCBjb2x1bW4pIHsKICAgICAgICB2YXIgcmUgPSAvXlxzKi87CiAgICAgICAgdmFyIHN0YXJ0Um93ID0gcm93OwogICAgICAgIHZhciBlbmRSb3cgPSByb3c7CiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSBjb2x1bW4gfHwgbGluZS5sZW5ndGg7CiAgICAgICAgdmFyIHN0YXJ0TGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7CiAgICAgICAgdmFyIG1heFJvdyA9IHNlc3Npb24uZ2V0TGVuZ3RoKCkKICAgICAgICAKICAgICAgICB3aGlsZSAoKytyb3cgPCBtYXhSb3cpIHsKICAgICAgICAgICAgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOwogICAgICAgICAgICB2YXIgbGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7CgogICAgICAgICAgICBpZiAobGV2ZWwgPT0gbGluZS5sZW5ndGgpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgIGlmIChsZXZlbCA8PSBzdGFydExldmVsKQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBlbmRSb3cgPSByb3c7CiAgICAgICAgfQoKICAgICAgICBpZiAoZW5kUm93ID4gc3RhcnRSb3cpIHsKICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmRSb3cpLmxlbmd0aDsKICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShzdGFydFJvdywgc3RhcnRDb2x1bW4sIGVuZFJvdywgZW5kQ29sdW1uKTsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIGJyYWNrZXQsIHJvdywgY29sdW1uKSB7CiAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbiArIDF9OwogICAgICAgIHZhciBlbmQgPSBzZXNzaW9uLiRmaW5kQ2xvc2luZ0JyYWNrZXQoYnJhY2tldCwgc3RhcnQpOwogICAgICAgIGlmICghZW5kKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIHZhciBmdyA9IHNlc3Npb24uZm9sZFdpZGdldHNbZW5kLnJvd107CiAgICAgICAgaWYgKGZ3ID09IG51bGwpCiAgICAgICAgICAgIGZ3ID0gdGhpcy5nZXRGb2xkV2lkZ2V0KHNlc3Npb24sIGVuZC5yb3cpOwoKICAgICAgICBpZiAoZncgPT0gInN0YXJ0IikgewogICAgICAgICAgICBlbmQucm93IC0tOwogICAgICAgICAgICBlbmQuY29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZC5yb3cpLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7CiAgICB9OwoKfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOwoKfSk7CjsKICAgICAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkKICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkoKTsKICAgICAgICA=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-powershell.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9wb3dlcnNoZWxsIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL3Bvd2Vyc2hlbGxfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vcG93ZXJzaGVsbF9oaWdobGlnaHRfcnVsZXMiKS5Qb3dlcnNoZWxsSGlnaGxpZ2h0UnVsZXMsaD1hKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudCxpPWEoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cixqPWEoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZSxrPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSksdGhpcy4kb3V0ZGVudD1uZXcgaCx0aGlzLiRiZWhhdmlvdXI9bmV3IGksdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGp9O2QuaW5oZXJpdHMoayxlKSxmdW5jdGlvbigpe3RoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuJGdldEluZGVudChiKSxlPXRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGIsYSksZj1lLnRva2VucztpZihmLmxlbmd0aCYmZltmLmxlbmd0aC0xXS50eXBlPT0iY29tbWVudCIpcmV0dXJuIGQ7aWYoYT09InN0YXJ0Iil7dmFyIGc9Yi5tYXRjaCgvXi4qW1x7XChcW11ccyokLyk7ZyYmKGQrPWMpfXJldHVybiBkfSx0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGIsYyl9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoYixjKX0sdGhpcy5jcmVhdGVXb3JrZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGx9fS5jYWxsKGsucHJvdG90eXBlKSxiLk1vZGU9a30pLGRlZmluZSgiYWNlL21vZGUvcG93ZXJzaGVsbF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxnPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKCJmdW5jdGlvbnxpZnxlbHNlfGVsc2VpZnxzd2l0Y2h8d2hpbGV8ZGVmYXVsdHxmb3J8ZG98dW50aWx8YnJlYWt8Y29udGludWV8Zm9yZWFjaHxyZXR1cm58ZmlsdGVyfGlufHRyYXB8dGhyb3d8cGFyYW18YmVnaW58cHJvY2Vzc3xlbmQiLnNwbGl0KCJ8IikpLGI9ZS5hcnJheVRvTWFwKCJHZXQtQWxpYXN8SW1wb3J0LUFsaWFzfE5ldy1BbGlhc3xTZXQtQWxpYXN8R2V0LUF1dGhlbnRpY29kZVNpZ25hdHVyZXxTZXQtQXV0aGVudGljb2RlU2lnbmF0dXJlfFNldC1Mb2NhdGlvbnxHZXQtQ2hpbGRJdGVtfENsZWFyLUl0ZW18R2V0LUNvbW1hbmR8TWVhc3VyZS1Db21tYW5kfFRyYWNlLUNvbW1hbmR8QWRkLUNvbXB1dGVyfENoZWNrcG9pbnQtQ29tcHV0ZXJ8UmVtb3ZlLUNvbXB1dGVyfFJlc3RhcnQtQ29tcHV0ZXJ8UmVzdG9yZS1Db21wdXRlcnxTdG9wLUNvbXB1dGVyfFJlc2V0LUNvbXB1dGVyTWFjaGluZVBhc3N3b3JkfFRlc3QtQ29tcHV0ZXJTZWN1cmVDaGFubmVsfEFkZC1Db250ZW50fEdldC1Db250ZW50fFNldC1Db250ZW50fENsZWFyLUNvbnRlbnR8R2V0LUNvbW1hbmR8SW52b2tlLUNvbW1hbmR8RW5hYmxlLUNvbXB1dGVyUmVzdG9yZXxEaXNhYmxlLUNvbXB1dGVyUmVzdG9yZXxHZXQtQ29tcHV0ZXJSZXN0b3JlUG9pbnR8VGVzdC1Db25uZWN0aW9ufENvbnZlcnRGcm9tLUNTVnxDb252ZXJ0VG8tQ1NWfENvbnZlcnRUby1IdG1sfENvbnZlcnRUby1YbWx8Q29udmVydEZyb20tU2VjdXJlU3RyaW5nfENvbnZlcnRUby1TZWN1cmVTdHJpbmd8Q29weS1JdGVtfEV4cG9ydC1Db3VudGVyfEdldC1Db3VudGVyfEltcG9ydC1Db3VudGVyfEdldC1DcmVkZW50aWFsfEdldC1DdWx0dXJlfEdldC1DaGlsZEl0ZW18R2V0LURhdGV8U2V0LURhdGV8UmVtb3ZlLUl0ZW18Q29tcGFyZS1PYmplY3R8R2V0LUV2ZW50fEdldC1XaW5FdmVudHxOZXctRXZlbnR8UmVtb3ZlLUV2ZW50fFVucmVnaXN0ZXItRXZlbnR8V2FpdC1FdmVudHxDbGVhci1FdmVudExvZ3xHZXQtRXZlbnRsb2d8TGltaXQtRXZlbnRMb2d8TmV3LUV2ZW50bG9nfFJlbW92ZS1FdmVudExvZ3xTaG93LUV2ZW50TG9nfFdyaXRlLUV2ZW50TG9nfEdldC1FdmVudFN1YnNjcmliZXJ8UmVnaXN0ZXItRW5naW5lRXZlbnR8UmVnaXN0ZXItT2JqZWN0RXZlbnR8UmVnaXN0ZXItV21pRXZlbnR8R2V0LUV4ZWN1dGlvblBvbGljeXxTZXQtRXhlY3V0aW9uUG9saWN5fEV4cG9ydC1BbGlhc3xFeHBvcnQtQ2xpeG1sfEV4cG9ydC1Db25zb2xlfEV4cG9ydC1Dc3Z8Rm9yRWFjaC1PYmplY3R8Rm9ybWF0LUN1c3RvbXxGb3JtYXQtTGlzdHxGb3JtYXQtVGFibGV8Rm9ybWF0LVdpZGV8RXhwb3J0LUZvcm1hdERhdGF8R2V0LUZvcm1hdERhdGF8R2V0LUl0ZW18R2V0LUNoaWxkSXRlbXxHZXQtSGVscHxBZGQtSGlzdG9yeXxDbGVhci1IaXN0b3J5fEdldC1IaXN0b3J5fEludm9rZS1IaXN0b3J5fEdldC1Ib3N0fFJlYWQtSG9zdHxXcml0ZS1Ib3N0fEdldC1Ib3RGaXh8SW1wb3J0LUNsaXhtbHxJbXBvcnQtQ3N2fEludm9rZS1Db21tYW5kfEludm9rZS1FeHByZXNzaW9ufEdldC1JdGVtfEludm9rZS1JdGVtfE5ldy1JdGVtfFJlbW92ZS1JdGVtfFNldC1JdGVtfENsZWFyLUl0ZW1Qcm9wZXJ0eXxDb3B5LUl0ZW1Qcm9wZXJ0eXxHZXQtSXRlbVByb3BlcnR5fE1vdmUtSXRlbVByb3BlcnR5fE5ldy1JdGVtUHJvcGVydHl8UmVtb3ZlLUl0ZW1Qcm9wZXJ0eXxSZW5hbWUtSXRlbVByb3BlcnR5fFNldC1JdGVtUHJvcGVydHl8R2V0LUpvYnxSZWNlaXZlLUpvYnxSZW1vdmUtSm9ifFN0YXJ0LUpvYnxTdG9wLUpvYnxXYWl0LUpvYnxTdG9wLVByb2Nlc3N8VXBkYXRlLUxpc3R8R2V0LUxvY2F0aW9ufFBvcC1Mb2NhdGlvbnxQdXNoLUxvY2F0aW9ufFNldC1Mb2NhdGlvbnxTZW5kLU1haWxNZXNzYWdlfEFkZC1NZW1iZXJ8R2V0LU1lbWJlcnxNb3ZlLUl0ZW18Q29tcGFyZS1PYmplY3R8R3JvdXAtT2JqZWN0fE1lYXN1cmUtT2JqZWN0fE5ldy1PYmplY3R8U2VsZWN0LU9iamVjdHxTb3J0LU9iamVjdHxXaGVyZS1PYmplY3R8T3V0LURlZmF1bHR8T3V0LUZpbGV8T3V0LUdyaWRWaWV3fE91dC1Ib3N0fE91dC1OdWxsfE91dC1QcmludGVyfE91dC1TdHJpbmd8Q29udmVydC1QYXRofEpvaW4tUGF0aHxSZXNvbHZlLVBhdGh8U3BsaXQtUGF0aHxUZXN0LVBhdGh8R2V0LVBmeGNlcnRpZmljYXRlfFBvcC1Mb2NhdGlvbnxQdXNoLUxvY2F0aW9ufEdldC1Qcm9jZXNzfFN0YXJ0LVByb2Nlc3N8U3RvcC1Qcm9jZXNzfFdhaXQtUHJvY2Vzc3xFbmFibGUtUFNCcmVha3BvaW50fERpc2FibGUtUFNCcmVha3BvaW50fEdldC1QU0JyZWFrcG9pbnR8U2V0LVBTQnJlYWtwb2ludHxSZW1vdmUtUFNCcmVha3BvaW50fEdldC1QU0RyaXZlfE5ldy1QU0RyaXZlfFJlbW92ZS1QU0RyaXZlfEdldC1QU1Byb3ZpZGVyfFNldC1QU2RlYnVnfEVudGVyLVBTU2Vzc2lvbnxFeGl0LVBTU2Vzc2lvbnxFeHBvcnQtUFNTZXNzaW9ufEdldC1QU1Nlc3Npb258SW1wb3J0LVBTU2Vzc2lvbnxOZXctUFNTZXNzaW9ufFJlbW92ZS1QU1Nlc3Npb258RGlzYWJsZS1QU1Nlc3Npb25Db25maWd1cmF0aW9ufEVuYWJsZS1QU1Nlc3Npb25Db25maWd1cmF0aW9ufEdldC1QU1Nlc3Npb25Db25maWd1cmF0aW9ufFJlZ2lzdGVyLVBTU2Vzc2lvbkNvbmZpZ3VyYXRpb258U2V0LVBTU2Vzc2lvbkNvbmZpZ3VyYXRpb258VW5yZWdpc3Rlci1QU1Nlc3Npb25Db25maWd1cmF0aW9ufE5ldy1QU1Nlc3Npb25PcHRpb258QWRkLVBzU25hcElufEdldC1Qc1NuYXBpbnxSZW1vdmUtUFNTbmFwaW58R2V0LVJhbmRvbXxSZWFkLUhvc3R8UmVtb3ZlLUl0ZW18UmVuYW1lLUl0ZW18UmVuYW1lLUl0ZW1Qcm9wZXJ0eXxTZWxlY3QtT2JqZWN0fFNlbGVjdC1YTUx8U2VuZC1NYWlsTWVzc2FnZXxHZXQtU2VydmljZXxOZXctU2VydmljZXxSZXN0YXJ0LVNlcnZpY2V8UmVzdW1lLVNlcnZpY2V8U2V0LVNlcnZpY2V8U3RhcnQtU2VydmljZXxTdG9wLVNlcnZpY2V8U3VzcGVuZC1TZXJ2aWNlfFNvcnQtT2JqZWN0fFN0YXJ0LVNsZWVwfENvbnZlcnRGcm9tLVN0cmluZ0RhdGF8U2VsZWN0LVN0cmluZ3xUZWUtT2JqZWN0fE5ldy1UaW1lc3BhbnxUcmFjZS1Db21tYW5kfEdldC1UcmFjZXNvdXJjZXxTZXQtVHJhY2Vzb3VyY2V8U3RhcnQtVHJhbnNhY3Rpb258Q29tcGxldGUtVHJhbnNhY3Rpb258R2V0LVRyYW5zYWN0aW9ufFVzZS1UcmFuc2FjdGlvbnxVbmRvLVRyYW5zYWN0aW9ufFN0YXJ0LVRyYW5zY3JpcHR8U3RvcC1UcmFuc2NyaXB0fEFkZC1UeXBlfFVwZGF0ZS1UeXBlRGF0YXxHZXQtVWljdWx0dXJlfEdldC1VbmlxdWV8VXBkYXRlLUZvcm1hdGRhdGF8VXBkYXRlLVR5cGVkYXRhfENsZWFyLVZhcmlhYmxlfEdldC1WYXJpYWJsZXxOZXctVmFyaWFibGV8UmVtb3ZlLVZhcmlhYmxlfFNldC1WYXJpYWJsZXxOZXctV2ViU2VydmljZVByb3h5fFdoZXJlLU9iamVjdHxXcml0ZS1EZWJ1Z3xXcml0ZS1FcnJvcnxXcml0ZS1Ib3N0fFdyaXRlLU91dHB1dHxXcml0ZS1Qcm9ncmVzc3xXcml0ZS1WZXJib3NlfFdyaXRlLVdhcm5pbmd8U2V0LVdtaUluc3RhbmNlfEludm9rZS1XbWlNZXRob2R8R2V0LVdtaU9iamVjdHxSZW1vdmUtV21pT2JqZWN0fENvbm5lY3QtV1NNYW58RGlzY29ubmVjdC1XU01hbnxUZXN0LVdTTWFufEludm9rZS1XU01hbkFjdGlvbnxEaXNhYmxlLVdTTWFuQ3JlZFNTUHxFbmFibGUtV1NNYW5DcmVkU1NQfEdldC1XU01hbkNyZWRTU1B8TmV3LVdTTWFuSW5zdGFuY2V8R2V0LVdTTWFuSW5zdGFuY2V8U2V0LVdTTWFuSW5zdGFuY2V8UmVtb3ZlLVdTTWFuSW5zdGFuY2V8U2V0LVdTTWFuUXVpY2tDb25maWd8TmV3LVdTTWFuU2Vzc2lvbk9wdGlvbiIuc3BsaXQoInwiKSksYz0iZXF8bmV8Z2V8Z3R8bHR8bGV8bGlrZXxub3RsaWtlfG1hdGNofG5vdG1hdGNofHJlcGxhY2V8Y29udGFpbnN8bm90Y29udGFpbnN8aWVxfGluZXxpZ2V8aWd0fGlsZXxpbHR8aWxpa2V8aW5vdGxpa2V8aW1hdGNofGlub3RtYXRjaHxpcmVwbGFjZXxpY29udGFpbnN8aW5vdGNvbnRhaW5zfGlzfGlzbm90fGFzfGFuZHxvcnxiYW5kfGJvcnxub3QiO3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiIy4qJCJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDonWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXSd9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IjBbeFhdWzAtOWEtZkEtRl0rXFxiIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIifSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLHJlZ2V4OiJbJF0oPzpbVHRdcnVlfFtGZl1hbHNlKVxcYiJ9LHt0b2tlbjoiY29uc3RhbnQubGFuZ3VhZ2UiLHJlZ2V4OiJbJF1bTm5ddWxsXFxiIn0se3Rva2VuOiJ2YXJpYWJsZS5pbnN0YW5jZSIscmVnZXg6IlskXVthLXpBLVpdW2EtekEtWjAtOV9dKlxcYiJ9LHt0b2tlbjpmdW5jdGlvbihjKXtyZXR1cm4gYS5oYXNPd25Qcm9wZXJ0eShjKT8ia2V5d29yZCI6Yi5oYXNPd25Qcm9wZXJ0eShjKT8ic3VwcG9ydC5mdW5jdGlvbiI6ImlkZW50aWZpZXIifSxyZWdleDoiW2EtekEtWl8kXVthLXpBLVowLTlfJFxcLV0qXFxiIn0se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiXFwtKD86IitjKyIpIn0se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiJnxcXCp8XFwrfFxcLXxcXD18XFwrPXxcXC09In0se3Rva2VuOiJscGFyZW4iLHJlZ2V4OiJbWyh7XSJ9LHt0b2tlbjoicnBhcmVuIixyZWdleDoiW1xcXSl9XSJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifV0sY29tbWVudDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfX07ZC5pbmhlcml0cyhnLGYpLGIuUG93ZXJzaGVsbEhpZ2hsaWdodFJ1bGVzPWd9KSxkZWZpbmUoImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3JhbmdlIikuUmFuZ2UsZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuL15ccyskLy50ZXN0KGEpPy9eXHMqXH0vLnRlc3QoYik6ITF9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldExpbmUoYiksZT1jLm1hdGNoKC9eKFxzKlx9KS8pO2lmKCFlKXJldHVybiAwO3ZhciBmPWVbMV0ubGVuZ3RoLGc9YS5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6Yixjb2x1bW46Zn0pO2lmKCFnfHxnLnJvdz09YilyZXR1cm4gMDt2YXIgaD10aGlzLiRnZXRJbmRlbnQoYS5nZXRMaW5lKGcucm93KSk7YS5yZXBsYWNlKG5ldyBkKGIsMCxiLGYtMSksaCl9LHRoaXMuJGdldEluZGVudD1mdW5jdGlvbihhKXt2YXIgYj1hLm1hdGNoKC9eKFxzKykvKTtyZXR1cm4gYj9iWzFdOiIifX0pKS5jYWxsKGUucHJvdG90eXBlKSxiLk1hdGNoaW5nQnJhY2VPdXRkZW50PWV9KSxkZWZpbmUoImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL2JlaGF2aW91ciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vYmVoYXZpb3VyIikuQmVoYXZpb3VyLGY9ZnVuY3Rpb24oKXt0aGlzLmFkZCgiYnJhY2VzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSJ7Iil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/e3RleHQ6InsiK2crIn0iLHNlbGVjdGlvbjohMX06e3RleHQ6Int9IixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSJ9Iil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0ifSIpe3ZhciBrPWQuJGZpbmRPcGVuaW5nQnJhY2tldCgifSIse2NvbHVtbjpoLmNvbHVtbisxLHJvdzpoLnJvd30pO2lmKGshPT1udWxsKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fWVsc2UgaWYoZT09IlxuIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0ifSIpe3ZhciBsPWQuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93Omgucm93LGNvbHVtbjpoLmNvbHVtbisxfSk7aWYoIWwpcmV0dXJuIG51bGw7dmFyIG09dGhpcy5nZXROZXh0TGluZUluZGVudChhLGkuc3Vic3RyaW5nKDAsaS5sZW5ndGgtMSksZC5nZXRUYWJTdHJpbmcoKSksbj10aGlzLiRnZXRJbmRlbnQoZC5kb2MuZ2V0TGluZShsLnJvdykpO3JldHVybnt0ZXh0OiJcbiIrbSsiXG4iK24sc2VsZWN0aW9uOlsxLG0ubGVuZ3RoLDEsbS5sZW5ndGhdfX19fSksdGhpcy5hZGQoImJyYWNlcyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0ieyIpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5lbmQuY29sdW1uLGUuZW5kLmNvbHVtbisxKTtpZihoPT0ifSIpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSksdGhpcy5hZGQoInBhcmVucyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0iKCIpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtyZXR1cm4gZyE9PSIiP3t0ZXh0OiIoIitnKyIpIixzZWxlY3Rpb246ITF9Ont0ZXh0OiIoKSIsc2VsZWN0aW9uOlsxLDFdfX1pZihlPT0iKSIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09IikiKXt2YXIgaz1kLiRmaW5kT3BlbmluZ0JyYWNrZXQoIikiLHtjb2x1bW46aC5jb2x1bW4rMSxyb3c6aC5yb3d9KTtpZihrIT09bnVsbClyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX19KSx0aGlzLmFkZCgicGFyZW5zIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSIoIil7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbisxLGUuc3RhcnQuY29sdW1uKzIpO2lmKGg9PSIpIilyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KSx0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09JyInKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7aWYoZyE9PSIiKXJldHVybnt0ZXh0OiciJytnKyciJyxzZWxlY3Rpb246ITF9O3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4tMSxoLmNvbHVtbik7aWYoaj09IlxcIilyZXR1cm4gbnVsbDt2YXIgaz1kLmdldFRva2VucyhmLnN0YXJ0LnJvdyxmLnN0YXJ0LnJvdylbMF0udG9rZW5zLGw9MCxtLG49LTE7Zm9yKHZhciBvPTA7bzxrLmxlbmd0aDtvKyspe209a1tvXSxtLnR5cGU9PSJzdHJpbmciP249LTE6bjwwJiYobj1tLnZhbHVlLmluZGV4T2YoJyInKSk7aWYobS52YWx1ZS5sZW5ndGgrbD5mLnN0YXJ0LmNvbHVtbilicmVhaztsKz1rW29dLnZhbHVlLmxlbmd0aH1pZighbXx8bjwwJiZtLnR5cGUhPT0iY29tbWVudCImJihtLnR5cGUhPT0ic3RyaW5nInx8Zi5zdGFydC5jb2x1bW4hPT1tLnZhbHVlLmxlbmd0aCtsLTEmJm0udmFsdWUubGFzdEluZGV4T2YoJyInKT09PW0udmFsdWUubGVuZ3RoLTEpKXJldHVybnt0ZXh0OiciIicsc2VsZWN0aW9uOlsxLDFdfTtpZihtJiZtLnR5cGU9PT0ic3RyaW5nIil7dmFyIHA9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYocD09JyInKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0nIicpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5zdGFydC5jb2x1bW4rMSxlLnN0YXJ0LmNvbHVtbisyKTtpZihoPT0nIicpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSl9O2QuaW5oZXJpdHMoZixlKSxiLkNzdHlsZUJlaGF2aW91cj1mfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL3JhbmdlIiwiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4uLy4uL3JhbmdlIikuUmFuZ2UsZj1hKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlLGc9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307ZC5pbmhlcml0cyhnLGYpLGZ1bmN0aW9uKCl7dGhpcy5mb2xkaW5nU3RhcnRNYXJrZXI9Lyhce3xcWylbXlx9XF1dKiR8XlxzKihcL1wqKS8sdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj0vXlteXFtce10qKFx9fFxdKXxeW1xzXCpdKihcKlwvKS8sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKSxmPWQubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpO2lmKGYpe3ZhciBnPWYuaW5kZXg7aWYoZlsxXSlyZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKGEsZlsxXSxjLGcpO3ZhciBoPWEuZ2V0Q29tbWVudEZvbGRSYW5nZShjLGcrZlswXS5sZW5ndGgpO3JldHVybiBoLmVuZC5jb2x1bW4tPTIsaH1pZihiIT09Im1hcmtiZWdpbmVuZCIpcmV0dXJuO3ZhciBmPWQubWF0Y2godGhpcy5mb2xkaW5nU3RvcE1hcmtlcik7aWYoZil7dmFyIGc9Zi5pbmRleCtmWzBdLmxlbmd0aDtpZihmWzJdKXt2YXIgaD1hLmdldENvbW1lbnRGb2xkUmFuZ2UoYyxnKTtyZXR1cm4gaC5lbmQuY29sdW1uLT0yLGh9dmFyIGk9e3JvdzpjLGNvbHVtbjpnfSxqPWEuJGZpbmRPcGVuaW5nQnJhY2tldChmWzFdLGkpO2lmKCFqKXJldHVybjtyZXR1cm4gai5jb2x1bW4rKyxpLmNvbHVtbi0tLGUuZnJvbVBvaW50cyhqLGkpfX19LmNhbGwoZy5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxlPWIuRm9sZE1vZGU9ZnVuY3Rpb24oKXt9OygoZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj1udWxsLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9bnVsbCx0aGlzLmdldEZvbGRXaWRnZXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKTtyZXR1cm4gdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChkKT8ic3RhcnQiOmI9PSJtYXJrYmVnaW5lbmQiJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QoZCk/ImVuZCI6IiJ9LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbnVsbH0sdGhpcy5pbmRlbnRhdGlvbkJsb2NrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZT0vXlxzKi8sZj1iLGc9YixoPWEuZ2V0TGluZShiKSxpPWN8fGgubGVuZ3RoLGo9aC5tYXRjaChlKVswXS5sZW5ndGgsaz1hLmdldExlbmd0aCgpO3doaWxlKCsrYjxrKXtoPWEuZ2V0TGluZShiKTt2YXIgbD1oLm1hdGNoKGUpWzBdLmxlbmd0aDtpZihsPT1oLmxlbmd0aCljb250aW51ZTtpZihsPD1qKWJyZWFrO2c9Yn1pZihnPmYpe3ZhciBtPWEuZ2V0TGluZShnKS5sZW5ndGg7cmV0dXJuIG5ldyBkKGYsaSxnLG0pfX0sdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrPWZ1bmN0aW9uKGEsYixjLGUpe3ZhciBmPXtyb3c6Yyxjb2x1bW46ZSsxfSxnPWEuJGZpbmRDbG9zaW5nQnJhY2tldChiLGYpO2lmKCFnKXJldHVybjt2YXIgaD1hLmZvbGRXaWRnZXRzW2cucm93XTtyZXR1cm4gaD09bnVsbCYmKGg9dGhpcy5nZXRGb2xkV2lkZ2V0KGEsZy5yb3cpKSxoPT0ic3RhcnQiJiYoZy5yb3ctLSxnLmNvbHVtbj1hLmdldExpbmUoZy5yb3cpLmxlbmd0aCksZC5mcm9tUG9pbnRzKGYsZyl9fSkpLmNhbGwoZS5wcm90b3R5cGUpfSksZnVuY3Rpb24oKXt3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSxmdW5jdGlvbihhKXt3aW5kb3cuYWNlfHwod2luZG93LmFjZT17fSk7Zm9yKHZhciBiIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShiKSYmKGFjZVtiXT1hW2JdKX0pfSgp]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-python-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgoqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQoqCiogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwoqCiogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQoqIExpY2Vuc2UuCioKKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KKgoqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwoqIEFqYXgub3JnIEIuVi4KKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqCiogQ29udHJpYnV0b3Iocyk6CiogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgoqICAgICAgQ29saW4gR291cmxheSA8Y29saW4gRE9UIGogRE9UIGdvdXJsYXkgQVQgZ21haWwgRE9UIGNvbT4KKgoqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQoqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgoqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KKgoqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL3B5dGhvbicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL3B5dGhvbl9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvZm9sZGluZy9weXRob25pYycsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7CnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7CnZhciBQeXRob25IaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vcHl0aG9uX2hpZ2hsaWdodF9ydWxlcyIpLlB5dGhvbkhpZ2hsaWdodFJ1bGVzOwp2YXIgUHl0aG9uRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvcHl0aG9uaWMiKS5Gb2xkTW9kZTsKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsKCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKG5ldyBQeXRob25IaWdobGlnaHRSdWxlcygpLmdldFJ1bGVzKCkpOwogICAgdGhpcy5mb2xkaW5nUnVsZXMgPSBuZXcgUHl0aG9uRm9sZE1vZGUoIlxcOiIpOwp9Owpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOwoKKGZ1bmN0aW9uKCkgewoKICAgIHRoaXMudG9nZ2xlQ29tbWVudExpbmVzID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgc3RhcnRSb3csIGVuZFJvdykgewogICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsKICAgICAgICB2YXIgcmUgPSAvXihccyopIy87CgogICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykgewogICAgICAgICAgICBpZiAoIXJlLnRlc3QoZG9jLmdldExpbmUoaSkpKSB7CiAgICAgICAgICAgICAgICBvdXRkZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKG91dGRlbnQpIHsKICAgICAgICAgICAgdmFyIGRlbGV0ZVJhbmdlID0gbmV3IFJhbmdlKDAsIDAsIDAsIDApOwogICAgICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUoaSk7CiAgICAgICAgICAgICAgICB2YXIgbSA9IGxpbmUubWF0Y2gocmUpOwogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2Uuc3RhcnQucm93ID0gaTsKICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLmVuZC5yb3cgPSBpOwogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLmNvbHVtbiA9IG1bMF0ubGVuZ3RoOwogICAgICAgICAgICAgICAgZG9jLnJlcGxhY2UoZGVsZXRlUmFuZ2UsIG1bMV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBkb2MuaW5kZW50Um93cyhzdGFydFJvdywgZW5kUm93LCAiIyIpOwogICAgICAgIH0KICAgIH07CgogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsKICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGxpbmUpOwoKICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsKICAgICAgICB2YXIgdG9rZW5zID0gdG9rZW5pemVkTGluZS50b2tlbnM7CgogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7CiAgICAgICAgICAgIHJldHVybiBpbmRlbnQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoc3RhdGUgPT0gInN0YXJ0IikgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eLipbXHtcKFxbXDpdXHMqJC8pOwogICAgICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgICAgIGluZGVudCArPSB0YWI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBpbmRlbnQ7CiAgICB9OwoKICAgIHZhciBvdXRkZW50cyA9IHsKICAgICAgICAicGFzcyI6IDEsCiAgICAgICAgInJldHVybiI6IDEsCiAgICAgICAgInJhaXNlIjogMSwKICAgICAgICAiYnJlYWsiOiAxLAogICAgICAgICJjb250aW51ZSI6IDEKICAgIH07CiAgICAKICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7CiAgICAgICAgaWYgKGlucHV0ICE9PSAiXHJcbiIgJiYgaW5wdXQgIT09ICJcciIgJiYgaW5wdXQgIT09ICJcbiIpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgICAgdmFyIHRva2VucyA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUudHJpbSgpLCBzdGF0ZSkudG9rZW5zOwogICAgICAgIAogICAgICAgIGlmICghdG9rZW5zKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgCiAgICAgICAgLy8gaWdub3JlIHRyYWlsaW5nIGNvbW1lbnRzCiAgICAgICAgZG8gewogICAgICAgICAgICB2YXIgbGFzdCA9IHRva2Vucy5wb3AoKTsKICAgICAgICB9IHdoaWxlIChsYXN0ICYmIChsYXN0LnR5cGUgPT0gImNvbW1lbnQiIHx8IChsYXN0LnR5cGUgPT0gInRleHQiICYmIGxhc3QudmFsdWUubWF0Y2goL15ccyskLykpKSk7CiAgICAgICAgCiAgICAgICAgaWYgKCFsYXN0KQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIChsYXN0LnR5cGUgPT0gImtleXdvcmQiICYmIG91dGRlbnRzW2xhc3QudmFsdWVdKTsKICAgIH07CgogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgewogICAgICAgIC8vIG91dGRlbnRpbmcgaW4gcHl0aG9uIGlzIHNsaWdodGx5IGRpZmZlcmVudCBiZWNhdXNlIGl0IGFsd2F5cyBhcHBsaWVzCiAgICAgICAgLy8gdG8gdGhlIG5leHQgbGluZSBhbmQgb25seSBvZiBhIG5ldyBsaW5lIGlzIGluc2VydGVkCiAgICAgICAgCiAgICAgICAgcm93ICs9IDE7CiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChkb2MuZ2V0TGluZShyb3cpKTsKICAgICAgICB2YXIgdGFiID0gZG9jLmdldFRhYlN0cmluZygpOwogICAgICAgIGlmIChpbmRlbnQuc2xpY2UoLXRhYi5sZW5ndGgpID09IHRhYikKICAgICAgICAgICAgZG9jLnJlbW92ZShuZXcgUmFuZ2Uocm93LCBpbmRlbnQubGVuZ3RoLXRhYi5sZW5ndGgsIHJvdywgaW5kZW50Lmxlbmd0aCkpOwogICAgfTsKCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOwoKZXhwb3J0cy5Nb2RlID0gTW9kZTsKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICogICAgICBDb2xpbiBHb3VybGF5IDxjb2xpbiBET1QgaiBET1QgZ291cmxheSBBVCBnbWFpbCBET1QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKgogKgogKiBUT0RPOiBweXRob24gZGVsaW1pdGVycwogKi8KCmRlZmluZSgnYWNlL21vZGUvcHl0aG9uX2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9sYW5nJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7CnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOwoKdmFyIFB5dGhvbkhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7CgogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgiYW5kfGFzfGFzc2VydHxicmVha3xjbGFzc3xjb250aW51ZXxkZWZ8ZGVsfGVsaWZ8ZWxzZXxleGNlcHR8ZXhlY3wiICsKICAgICAgICAiZmluYWxseXxmb3J8ZnJvbXxnbG9iYWx8aWZ8aW1wb3J0fGlufGlzfGxhbWJkYXxub3R8b3J8cGFzc3xwcmludHwiICsKICAgICAgICAicmFpc2V8cmV0dXJufHRyeXx3aGlsZXx3aXRofHlpZWxkIikuc3BsaXQoInwiKQogICAgKTsKCiAgICB2YXIgYnVpbHRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoIlRydWV8RmFsc2V8Tm9uZXxOb3RJbXBsZW1lbnRlZHxFbGxpcHNpc3xfX2RlYnVnX18iKS5zcGxpdCgifCIpCiAgICApOwoKICAgIHZhciBidWlsdGluRnVuY3Rpb25zID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgiYWJzfGRpdm1vZHxpbnB1dHxvcGVufHN0YXRpY21ldGhvZHxhbGx8ZW51bWVyYXRlfGludHxvcmR8c3RyfGFueXwiICsKICAgICAgICAiZXZhbHxpc2luc3RhbmNlfHBvd3xzdW18YmFzZXN0cmluZ3xleGVjZmlsZXxpc3N1YmNsYXNzfHByaW50fHN1cGVyfCIgKwogICAgICAgICJiaW5maWxlfGl0ZXJ8cHJvcGVydHl8dHVwbGV8Ym9vbHxmaWx0ZXJ8bGVufHJhbmdlfHR5cGV8Ynl0ZWFycmF5fCIgKwogICAgICAgICJmbG9hdHxsaXN0fHJhd19pbnB1dHx1bmljaHJ8Y2FsbGFibGV8Zm9ybWF0fGxvY2Fsc3xyZWR1Y2V8dW5pY29kZXwiICsKICAgICAgICAiY2hyfGZyb3plbnNldHxsb25nfHJlbG9hZHx2YXJzfGNsYXNzbWV0aG9kfGdldGF0dHJ8bWFwfHJlcHJ8eHJhbmdlfCIgKwogICAgICAgICJjbXB8Z2xvYmFsc3xtYXh8cmV2ZXJzZWR8emlwfGNvbXBpbGV8aGFzYXR0cnxtZW1vcnl2aWV3fHJvdW5kfCIgKwogICAgICAgICJfX2ltcG9ydF9ffGNvbXBsZXh8aGFzaHxtaW58c2V0fGFwcGx5fGRlbGF0dHJ8aGVscHxuZXh0fHNldGF0dHJ8IiArCiAgICAgICAgImJ1ZmZlcnxkaWN0fGhleHxvYmplY3R8c2xpY2V8Y29lcmNlfGRpcnxpZHxvY3R8c29ydGVkfGludGVybiIpLnNwbGl0KCJ8IikKICAgICk7CgogICAgdmFyIGZ1dHVyZVJlc2VydmVkID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgiIikuc3BsaXQoInwiKQogICAgKTsKCiAgICB2YXIgc3RyUHJlID0gIig/OnJ8dXx1cnxSfFV8VVJ8VXJ8dVIpPyI7CgogICAgdmFyIGRlY2ltYWxJbnRlZ2VyID0gIig/Oig/OlsxLTldXFxkKil8KD86MCkpIjsKICAgIHZhciBvY3RJbnRlZ2VyID0gIig/OjBbb09dP1swLTddKykiOwogICAgdmFyIGhleEludGVnZXIgPSAiKD86MFt4WF1bXFxkQS1GYS1mXSspIjsKICAgIHZhciBiaW5JbnRlZ2VyID0gIig/OjBbYkJdWzAxXSspIjsKICAgIHZhciBpbnRlZ2VyID0gIig/OiIgKyBkZWNpbWFsSW50ZWdlciArICJ8IiArIG9jdEludGVnZXIgKyAifCIgKyBoZXhJbnRlZ2VyICsgInwiICsgYmluSW50ZWdlciArICIpIjsKCiAgICB2YXIgZXhwb25lbnQgPSAiKD86W2VFXVsrLV0/XFxkKykiOwogICAgdmFyIGZyYWN0aW9uID0gIig/OlxcLlxcZCspIjsKICAgIHZhciBpbnRQYXJ0ID0gIig/OlxcZCspIjsKICAgIHZhciBwb2ludEZsb2F0ID0gIig/Oig/OiIgKyBpbnRQYXJ0ICsgIj8iICsgZnJhY3Rpb24gKyAiKXwoPzoiICsgaW50UGFydCArICJcXC4pKSI7CiAgICB2YXIgZXhwb25lbnRGbG9hdCA9ICIoPzooPzoiICsgcG9pbnRGbG9hdCArICJ8IiArICBpbnRQYXJ0ICsgIikiICsgZXhwb25lbnQgKyAiKSI7CiAgICB2YXIgZmxvYXROdW1iZXIgPSAiKD86IiArIGV4cG9uZW50RmxvYXQgKyAifCIgKyBwb2ludEZsb2F0ICsgIikiOwoKICAgIHRoaXMuJHJ1bGVzID0gewogICAgICAgICJzdGFydCIgOiBbIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgIHJlZ2V4IDogIiMuKiQiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gIiIiIHN0cmluZwogICAgICAgICAgICByZWdleCA6IHN0clByZSArICciezN9KD86W15cXFxcXXxcXFxcLikqPyJ7M30nCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gbXVsdGkgbGluZSAiIiIgc3RyaW5nIHN0YXJ0CiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAnInszfS4qJCcsCiAgICAgICAgICAgIG5leHQgOiAicXFzdHJpbmciCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gIiBzdHJpbmcKICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAnIig/OlteXFxcXF18XFxcXC4pKj8iJwogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgICAgICAgICAgIC8vICcnJyBzdHJpbmcKICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAiJ3szfSg/OlteXFxcXF18XFxcXC4pKj8nezN9IgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgICAgICAgICAgIC8vIG11bHRpIGxpbmUgJycnIHN0cmluZyBzdGFydAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogc3RyUHJlICsgIid7M30uKiQiLAogICAgICAgICAgICBuZXh0IDogInFzdHJpbmciCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gJyBzdHJpbmcKICAgICAgICAgICAgcmVnZXggOiBzdHJQcmUgKyAiJyg/OlteXFxcXF18XFxcXC4pKj8nIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGltYWdpbmFyeQogICAgICAgICAgICByZWdleCA6ICIoPzoiICsgZmxvYXROdW1iZXIgKyAifFxcZCspW2pKXVxcYiIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdAogICAgICAgICAgICByZWdleCA6IGZsb2F0TnVtYmVyCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gbG9uZyBpbnRlZ2VyCiAgICAgICAgICAgIHJlZ2V4IDogaW50ZWdlciArICJbbExdXFxiIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGludGVnZXIKICAgICAgICAgICAgcmVnZXggOiBpbnRlZ2VyICsgIlxcYiIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWx0aW5Db25zdGFudHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOwogICAgICAgICAgICAgICAgZWxzZSBpZiAoZnV0dXJlUmVzZXJ2ZWQuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5pbGxlZ2FsIjsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWx0aW5GdW5jdGlvbnMuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5mdW5jdGlvbiI7CiAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA9PSAiZGVidWdnZXIiKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICByZXR1cm4gImlkZW50aWZpZXIiOwogICAgICAgICAgICB9LAogICAgICAgICAgICByZWdleCA6ICJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwKICAgICAgICAgICAgcmVnZXggOiAiXFwrfFxcLXxcXCp8XFwqXFwqfFxcL3xcXC9cXC98JXw8PHw+PnwmfFxcfHxcXF58fnw8fD58PD18PT58PT18IT18PD58PSIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImxwYXJlbi5wYXJlbiIsCiAgICAgICAgICAgIHJlZ2V4IDogIltcXFtcXChcXHtdIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwKICAgICAgICAgICAgcmVnZXggOiAiW1xcXVxcKVxcfV0iCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgcmVnZXggOiAiXFxzKyIKICAgICAgICB9IF0sCiAgICAgICAgInFxc3RyaW5nIiA6IFsgewogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lICIiIiBzdHJpbmcgZW5kCiAgICAgICAgICAgIHJlZ2V4IDogJyg/OlteXFxcXF18XFxcXC4pKj8iezN9JywKICAgICAgICAgICAgbmV4dCA6ICJzdGFydCIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAnLisnCiAgICAgICAgfSBdLAogICAgICAgICJxc3RyaW5nIiA6IFsgewogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgLy8gbXVsdGkgbGluZSAnJycgc3RyaW5nIGVuZAogICAgICAgICAgICByZWdleCA6ICIoPzpbXlxcXFxdfFxcXFwuKSo/J3szfSIsCiAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogJy4rJwogICAgICAgIH0gXQogICAgfTsKfTsKCm9vcC5pbmhlcml0cyhQeXRob25IaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsKCmV4cG9ydHMuUHl0aG9uSGlnaGxpZ2h0UnVsZXMgPSBQeXRob25IaWdobGlnaHRSdWxlczsKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9weXRob25pYycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7CnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOwoKdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKG1hcmtlcnMpIHsKICAgIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyID0gbmV3IFJlZ0V4cCgiKD86KFtcXFt7XSl8KCIgKyBtYXJrZXJzICsgIikpKD86XFxzKikoPzojLiopPyQiKTsKfTsKb29wLmluaGVyaXRzKEZvbGRNb2RlLCBCYXNlRm9sZE1vZGUpOwoKKGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsKICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOwogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpOwogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICBpZiAobWF0Y2hbMV0pCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKHNlc3Npb24sIG1hdGNoWzFdLCByb3csIG1hdGNoLmluZGV4KTsKICAgICAgICAgICAgaWYgKG1hdGNoWzJdKQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5kZW50YXRpb25CbG9jayhzZXNzaW9uLCByb3csIG1hdGNoLmluZGV4ICsgbWF0Y2hbMl0ubGVuZ3RoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5kZW50YXRpb25CbG9jayhzZXNzaW9uLCByb3cpOwogICAgICAgIH0KICAgIH0KCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsKCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsKCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbigpIHt9OwoKKGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyID0gbnVsbDsKICAgIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIgPSBudWxsOwoKICAgIC8vIG11c3QgcmV0dXJuICIiIGlmIHRoZXJlJ3Mgbm8gZm9sZCwgdG8gZW5hYmxlIGNhY2hpbmcKICAgIHRoaXMuZ2V0Rm9sZFdpZGdldCA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7CiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICBpZiAodGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChsaW5lKSkKICAgICAgICAgICAgcmV0dXJuICJzdGFydCI7CiAgICAgICAgaWYgKGZvbGRTdHlsZSA9PSAibWFya2JlZ2luZW5kIgogICAgICAgICAgICAgICAgJiYgdGhpcy5mb2xkaW5nU3RvcE1hcmtlcgogICAgICAgICAgICAgICAgJiYgdGhpcy5mb2xkaW5nU3RvcE1hcmtlci50ZXN0KGxpbmUpKQogICAgICAgICAgICByZXR1cm4gImVuZCI7CiAgICAgICAgcmV0dXJuICIiOwogICAgfTsKICAgIAogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgewogICAgICAgIHJldHVybiBudWxsOwogICAgfTsKCiAgICB0aGlzLmluZGVudGF0aW9uQmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCByb3csIGNvbHVtbikgewogICAgICAgIHZhciByZSA9IC9eXHMqLzsKICAgICAgICB2YXIgc3RhcnRSb3cgPSByb3c7CiAgICAgICAgdmFyIGVuZFJvdyA9IHJvdzsKICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOwogICAgICAgIHZhciBzdGFydENvbHVtbiA9IGNvbHVtbiB8fCBsaW5lLmxlbmd0aDsKICAgICAgICB2YXIgc3RhcnRMZXZlbCA9IGxpbmUubWF0Y2gocmUpWzBdLmxlbmd0aDsKICAgICAgICB2YXIgbWF4Um93ID0gc2Vzc2lvbi5nZXRMZW5ndGgoKQogICAgICAgIAogICAgICAgIHdoaWxlICgrK3JvdyA8IG1heFJvdykgewogICAgICAgICAgICBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgICAgIHZhciBsZXZlbCA9IGxpbmUubWF0Y2gocmUpWzBdLmxlbmd0aDsKCiAgICAgICAgICAgIGlmIChsZXZlbCA9PSBsaW5lLmxlbmd0aCkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgaWYgKGxldmVsIDw9IHN0YXJ0TGV2ZWwpCiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGVuZFJvdyA9IHJvdzsKICAgICAgICB9CgogICAgICAgIGlmIChlbmRSb3cgPiBzdGFydFJvdykgewogICAgICAgICAgICB2YXIgZW5kQ29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZFJvdykubGVuZ3RoOwogICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHN0YXJ0Um93LCBzdGFydENvbHVtbiwgZW5kUm93LCBlbmRDb2x1bW4pOwogICAgICAgIH0KICAgIH07CgogICAgdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgYnJhY2tldCwgcm93LCBjb2x1bW4pIHsKICAgICAgICB2YXIgc3RhcnQgPSB7cm93OiByb3csIGNvbHVtbjogY29sdW1uICsgMX07CiAgICAgICAgdmFyIGVuZCA9IHNlc3Npb24uJGZpbmRDbG9zaW5nQnJhY2tldChicmFja2V0LCBzdGFydCk7CiAgICAgICAgaWYgKCFlbmQpCiAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgdmFyIGZ3ID0gc2Vzc2lvbi5mb2xkV2lkZ2V0c1tlbmQucm93XTsKICAgICAgICBpZiAoZncgPT0gbnVsbCkKICAgICAgICAgICAgZncgPSB0aGlzLmdldEZvbGRXaWRnZXQoc2Vzc2lvbiwgZW5kLnJvdyk7CgogICAgICAgIGlmIChmdyA9PSAic3RhcnQiKSB7CiAgICAgICAgICAgIGVuZC5yb3cgLS07CiAgICAgICAgICAgIGVuZC5jb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kLnJvdykubGVuZ3RoOwogICAgICAgIH0KICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyhzdGFydCwgZW5kKTsKICAgIH07Cgp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7Cgp9KTsKOwogICAgICAgICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgewogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KSgpOwogICAgICAgIA==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-python.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9weXRob24iLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvcHl0aG9uX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL2ZvbGRpbmcvcHl0aG9uaWMiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dCIpLk1vZGUsZj1hKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXIsZz1hKCIuL3B5dGhvbl9oaWdobGlnaHRfcnVsZXMiKS5QeXRob25IaWdobGlnaHRSdWxlcyxoPWEoIi4vZm9sZGluZy9weXRob25pYyIpLkZvbGRNb2RlLGk9YSgiLi4vcmFuZ2UiKS5SYW5nZSxqPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSksdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGgoIlxcOiIpfTtkLmluaGVyaXRzKGosZSksZnVuY3Rpb24oKXt0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMCxmPS9eKFxzKikjLztmb3IodmFyIGc9YztnPD1kO2crKylpZighZi50ZXN0KGIuZ2V0TGluZShnKSkpe2U9ITE7YnJlYWt9aWYoZSl7dmFyIGg9bmV3IGkoMCwwLDAsMCk7Zm9yKHZhciBnPWM7Zzw9ZDtnKyspe3ZhciBqPWIuZ2V0TGluZShnKSxrPWoubWF0Y2goZik7aC5zdGFydC5yb3c9ZyxoLmVuZC5yb3c9ZyxoLmVuZC5jb2x1bW49a1swXS5sZW5ndGgsYi5yZXBsYWNlKGgsa1sxXSl9fWVsc2UgYi5pbmRlbnRSb3dzKGMsZCwiIyIpfSx0aGlzLmdldE5leHRMaW5lSW5kZW50PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLiRnZXRJbmRlbnQoYiksZT10aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhiLGEpLGY9ZS50b2tlbnM7aWYoZi5sZW5ndGgmJmZbZi5sZW5ndGgtMV0udHlwZT09ImNvbW1lbnQiKXJldHVybiBkO2lmKGE9PSJzdGFydCIpe3ZhciBnPWIubWF0Y2goL14uKltce1woXFtcOl1ccyokLyk7ZyYmKGQrPWMpfXJldHVybiBkfTt2YXIgYT17cGFzczoxLCJyZXR1cm4iOjEscmFpc2U6MSwiYnJlYWsiOjEsImNvbnRpbnVlIjoxfTt0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihiLGMsZCl7aWYoZCE9PSJcclxuIiYmZCE9PSJcciImJmQhPT0iXG4iKXJldHVybiExO3ZhciBlPXRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGMudHJpbSgpLGIpLnRva2VucztpZighZSlyZXR1cm4hMTtkbyB2YXIgZj1lLnBvcCgpO3doaWxlKGYmJihmLnR5cGU9PSJjb21tZW50Inx8Zi50eXBlPT0idGV4dCImJmYudmFsdWUubWF0Y2goL15ccyskLykpKTtyZXR1cm4gZj9mLnR5cGU9PSJrZXl3b3JkIiYmYVtmLnZhbHVlXTohMX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7Yys9MTt2YXIgZD10aGlzLiRnZXRJbmRlbnQoYi5nZXRMaW5lKGMpKSxlPWIuZ2V0VGFiU3RyaW5nKCk7ZC5zbGljZSgtZS5sZW5ndGgpPT1lJiZiLnJlbW92ZShuZXcgaShjLGQubGVuZ3RoLWUubGVuZ3RoLGMsZC5sZW5ndGgpKX19LmNhbGwoai5wcm90b3R5cGUpLGIuTW9kZT1qfSksZGVmaW5lKCJhY2UvbW9kZS9weXRob25faGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi4vbGliL2xhbmciKSxmPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsZz1mdW5jdGlvbigpe3ZhciBhPWUuYXJyYXlUb01hcCgiYW5kfGFzfGFzc2VydHxicmVha3xjbGFzc3xjb250aW51ZXxkZWZ8ZGVsfGVsaWZ8ZWxzZXxleGNlcHR8ZXhlY3xmaW5hbGx5fGZvcnxmcm9tfGdsb2JhbHxpZnxpbXBvcnR8aW58aXN8bGFtYmRhfG5vdHxvcnxwYXNzfHByaW50fHJhaXNlfHJldHVybnx0cnl8d2hpbGV8d2l0aHx5aWVsZCIuc3BsaXQoInwiKSksYj1lLmFycmF5VG9NYXAoIlRydWV8RmFsc2V8Tm9uZXxOb3RJbXBsZW1lbnRlZHxFbGxpcHNpc3xfX2RlYnVnX18iLnNwbGl0KCJ8IikpLGM9ZS5hcnJheVRvTWFwKCJhYnN8ZGl2bW9kfGlucHV0fG9wZW58c3RhdGljbWV0aG9kfGFsbHxlbnVtZXJhdGV8aW50fG9yZHxzdHJ8YW55fGV2YWx8aXNpbnN0YW5jZXxwb3d8c3VtfGJhc2VzdHJpbmd8ZXhlY2ZpbGV8aXNzdWJjbGFzc3xwcmludHxzdXBlcnxiaW5maWxlfGl0ZXJ8cHJvcGVydHl8dHVwbGV8Ym9vbHxmaWx0ZXJ8bGVufHJhbmdlfHR5cGV8Ynl0ZWFycmF5fGZsb2F0fGxpc3R8cmF3X2lucHV0fHVuaWNocnxjYWxsYWJsZXxmb3JtYXR8bG9jYWxzfHJlZHVjZXx1bmljb2RlfGNocnxmcm96ZW5zZXR8bG9uZ3xyZWxvYWR8dmFyc3xjbGFzc21ldGhvZHxnZXRhdHRyfG1hcHxyZXByfHhyYW5nZXxjbXB8Z2xvYmFsc3xtYXh8cmV2ZXJzZWR8emlwfGNvbXBpbGV8aGFzYXR0cnxtZW1vcnl2aWV3fHJvdW5kfF9faW1wb3J0X198Y29tcGxleHxoYXNofG1pbnxzZXR8YXBwbHl8ZGVsYXR0cnxoZWxwfG5leHR8c2V0YXR0cnxidWZmZXJ8ZGljdHxoZXh8b2JqZWN0fHNsaWNlfGNvZXJjZXxkaXJ8aWR8b2N0fHNvcnRlZHxpbnRlcm4iLnNwbGl0KCJ8IikpLGQ9ZS5hcnJheVRvTWFwKCIiLnNwbGl0KCJ8IikpLGY9Iig/OnJ8dXx1cnxSfFV8VVJ8VXJ8dVIpPyIsZz0iKD86KD86WzEtOV1cXGQqKXwoPzowKSkiLGg9Iig/OjBbb09dP1swLTddKykiLGk9Iig/OjBbeFhdW1xcZEEtRmEtZl0rKSIsaj0iKD86MFtiQl1bMDFdKykiLGs9Iig/OiIrZysifCIraCsifCIraSsifCIraisiKSIsbD0iKD86W2VFXVsrLV0/XFxkKykiLG09Iig/OlxcLlxcZCspIixuPSIoPzpcXGQrKSIsbz0iKD86KD86IituKyI/IittKyIpfCg/OiIrbisiXFwuKSkiLHA9Iig/Oig/OiIrbysifCIrbisiKSIrbCsiKSIscT0iKD86IitwKyJ8IitvKyIpIjt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6IiMuKiQifSx7dG9rZW46InN0cmluZyIscmVnZXg6ZisnInszfSg/OlteXFxcXF18XFxcXC4pKj8iezN9J30se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OmYrJyJ7M30uKiQnLG5leHQ6InFxc3RyaW5nIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OmYrJyIoPzpbXlxcXFxdfFxcXFwuKSo/Iid9LHt0b2tlbjoic3RyaW5nIixyZWdleDpmKyInezN9KD86W15cXFxcXXxcXFxcLikqPyd7M30ifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6ZisiJ3szfS4qJCIsbmV4dDoicXN0cmluZyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDpmKyInKD86W15cXFxcXXxcXFxcLikqPycifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIoPzoiK3ErInxcXGQrKVtqSl1cXGIifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OnF9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6aysiW2xMXVxcYiJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6aysiXFxiIn0se3Rva2VuOmZ1bmN0aW9uKGUpe3JldHVybiBhLmhhc093blByb3BlcnR5KGUpPyJrZXl3b3JkIjpiLmhhc093blByb3BlcnR5KGUpPyJjb25zdGFudC5sYW5ndWFnZSI6ZC5oYXNPd25Qcm9wZXJ0eShlKT8iaW52YWxpZC5pbGxlZ2FsIjpjLmhhc093blByb3BlcnR5KGUpPyJzdXBwb3J0LmZ1bmN0aW9uIjplPT0iZGVidWdnZXIiPyJpbnZhbGlkLmRlcHJlY2F0ZWQiOiJpZGVudGlmaWVyIn0scmVnZXg6IlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiJ9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcK3xcXC18XFwqfFxcKlxcKnxcXC98XFwvXFwvfCV8PDx8Pj58JnxcXHx8XFxefH58PHw+fDw9fD0+fD09fCE9fDw+fD0ifSx7dG9rZW46ImxwYXJlbi5wYXJlbiIscmVnZXg6IltcXFtcXChcXHtdIn0se3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4OiJbXFxdXFwpXFx9XSJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifV0scXFzdHJpbmc6W3t0b2tlbjoic3RyaW5nIixyZWdleDonKD86W15cXFxcXXxcXFxcLikqPyJ7M30nLG5leHQ6InN0YXJ0In0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxxc3RyaW5nOlt7dG9rZW46InN0cmluZyIscmVnZXg6Iig/OlteXFxcXF18XFxcXC4pKj8nezN9IixuZXh0OiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV19fTtkLmluaGVyaXRzKGcsZiksYi5QeXRob25IaWdobGlnaHRSdWxlcz1nfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL3B5dGhvbmljIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZSxmPWIuRm9sZE1vZGU9ZnVuY3Rpb24oYSl7dGhpcy5mb2xkaW5nU3RhcnRNYXJrZXI9bmV3IFJlZ0V4cCgiKD86KFtcXFt7XSl8KCIrYSsiKSkoPzpcXHMqKSg/OiMuKik/JCIpfTtkLmluaGVyaXRzKGYsZSksZnVuY3Rpb24oKXt0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpLGU9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7aWYoZSlyZXR1cm4gZVsxXT90aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soYSxlWzFdLGMsZS5pbmRleCk6ZVsyXT90aGlzLmluZGVudGF0aW9uQmxvY2soYSxjLGUuaW5kZXgrZVsyXS5sZW5ndGgpOnRoaXMuaW5kZW50YXRpb25CbG9jayhhLGMpfX0uY2FsbChmLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGU9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPW51bGwsdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj1udWxsLHRoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpO3JldHVybiB0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGQpPyJzdGFydCI6Yj09Im1hcmtiZWdpbmVuZCImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChkKT8iZW5kIjoiIn0sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBudWxsfSx0aGlzLmluZGVudGF0aW9uQmxvY2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPS9eXHMqLyxmPWIsZz1iLGg9YS5nZXRMaW5lKGIpLGk9Y3x8aC5sZW5ndGgsaj1oLm1hdGNoKGUpWzBdLmxlbmd0aCxrPWEuZ2V0TGVuZ3RoKCk7d2hpbGUoKytiPGspe2g9YS5nZXRMaW5lKGIpO3ZhciBsPWgubWF0Y2goZSlbMF0ubGVuZ3RoO2lmKGw9PWgubGVuZ3RoKWNvbnRpbnVlO2lmKGw8PWopYnJlYWs7Zz1ifWlmKGc+Zil7dmFyIG09YS5nZXRMaW5lKGcpLmxlbmd0aDtyZXR1cm4gbmV3IGQoZixpLGcsbSl9fSx0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2s9ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGY9e3JvdzpjLGNvbHVtbjplKzF9LGc9YS4kZmluZENsb3NpbmdCcmFja2V0KGIsZik7aWYoIWcpcmV0dXJuO3ZhciBoPWEuZm9sZFdpZGdldHNbZy5yb3ddO3JldHVybiBoPT1udWxsJiYoaD10aGlzLmdldEZvbGRXaWRnZXQoYSxnLnJvdykpLGg9PSJzdGFydCImJihnLnJvdy0tLGcuY29sdW1uPWEuZ2V0TGluZShnLnJvdykubGVuZ3RoKSxkLmZyb21Qb2ludHMoZixnKX19KSkuY2FsbChlLnByb3RvdHlwZSl9KSxmdW5jdGlvbigpe3dpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLGZ1bmN0aW9uKGEpe3dpbmRvdy5hY2V8fCh3aW5kb3cuYWNlPXt9KTtmb3IodmFyIGIgaW4gYSlhLmhhc093blByb3BlcnR5KGIpJiYoYWNlW2JdPWFbYl0pfSl9KCk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-ruby-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKiAgICAgIFNobG9tbyBaYWxtYW4gSGVpZ2ggPHNobG9tb3phbG1hbmhlaWdoIEFUIGdtYWlsIERPVCBjb20+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL3J1YnknLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHQnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS9ydWJ5X2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsKdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsKdmFyIFJ1YnlIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vcnVieV9oaWdobGlnaHRfcnVsZXMiKS5SdWJ5SGlnaGxpZ2h0UnVsZXM7CnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Owp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOwoKdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IFJ1YnlIaWdobGlnaHRSdWxlcygpLmdldFJ1bGVzKCkpOwogICAgdGhpcy4kb3V0ZGVudCA9IG5ldyBNYXRjaGluZ0JyYWNlT3V0ZGVudCgpOwp9Owpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOwoKKGZ1bmN0aW9uKCkgewoKICAgIHRoaXMudG9nZ2xlQ29tbWVudExpbmVzID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgc3RhcnRSb3csIGVuZFJvdykgewogICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsKICAgICAgICB2YXIgcmUgPSAvXihccyopIy87CgogICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykgewogICAgICAgICAgICBpZiAoIXJlLnRlc3QoZG9jLmdldExpbmUoaSkpKSB7CiAgICAgICAgICAgICAgICBvdXRkZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKG91dGRlbnQpIHsKICAgICAgICAgICAgdmFyIGRlbGV0ZVJhbmdlID0gbmV3IFJhbmdlKDAsIDAsIDAsIDApOwogICAgICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUoaSk7CiAgICAgICAgICAgICAgICB2YXIgbSA9IGxpbmUubWF0Y2gocmUpOwogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2Uuc3RhcnQucm93ID0gaTsKICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLmVuZC5yb3cgPSBpOwogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLmNvbHVtbiA9IG1bMF0ubGVuZ3RoOwogICAgICAgICAgICAgICAgZG9jLnJlcGxhY2UoZGVsZXRlUmFuZ2UsIG1bMV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBkb2MuaW5kZW50Um93cyhzdGFydFJvdywgZW5kUm93LCAiIyIpOwogICAgICAgIH0KICAgIH07CgogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsKICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGxpbmUpOwoKICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsKICAgICAgICB2YXIgdG9rZW5zID0gdG9rZW5pemVkTGluZS50b2tlbnM7CgogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7CiAgICAgICAgICAgIHJldHVybiBpbmRlbnQ7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmIChzdGF0ZSA9PSAic3RhcnQiKSB7CiAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14uKltce1woXFtdXHMqJC8pOwogICAgICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgICAgIGluZGVudCArPSB0YWI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBpbmRlbnQ7CiAgICB9OwoKICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsKICAgIH07CgogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgewogICAgICAgIHRoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoZG9jLCByb3cpOwogICAgfTsKCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOwoKZXhwb3J0cy5Nb2RlID0gTW9kZTsKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICogICAgICBTaGxvbW8gWmFsbWFuIEhlaWdoIDxzaGxvbW96YWxtYW5oZWlnaCBBVCBnbWFpbCBET1QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9ydWJ5X2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9sYW5nJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7CnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOwoKdmFyIFJ1YnlIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgewoKICAgIHZhciBidWlsdGluRnVuY3Rpb25zID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgiYWJvcnR8QXJyYXl8YXNzZXJ0fGFzc2VydF9lcXVhbHxhc3NlcnRfbm90X2VxdWFsfGFzc2VydF9zYW1lfGFzc2VydF9ub3Rfc2FtZXwiICsKICAgICAgICAiYXNzZXJ0X25pbHxhc3NlcnRfbm90X25pbHxhc3NlcnRfbWF0Y2h8YXNzZXJ0X25vX21hdGNofGFzc2VydF9pbl9kZWx0YXxhc3NlcnRfdGhyb3dzfCIgKyAKICAgICAgICAiYXNzZXJ0X3JhaXNlfGFzc2VydF9ub3RoaW5nX3JhaXNlZHxhc3NlcnRfaW5zdGFuY2Vfb2Z8YXNzZXJ0X2tpbmRfb2Z8YXNzZXJ0X3Jlc3BvbmRfdG98IiArCiAgICAgICAgImFzc2VydF9vcGVyYXRvcnxhc3NlcnRfc2VuZHxhc3NlcnRfZGlmZmVyZW5jZXxhc3NlcnRfbm9fZGlmZmVyZW5jZXxhc3NlcnRfcmVjb2duaXplc3wiICsKICAgICAgICAiYXNzZXJ0X2dlbmVyYXRlc3xhc3NlcnRfcmVzcG9uc2V8YXNzZXJ0X3JlZGlyZWN0ZWRfdG98YXNzZXJ0X3RlbXBsYXRlfGFzc2VydF9zZWxlY3R8IiArCiAgICAgICAgImFzc2VydF9zZWxlY3RfZW1haWx8YXNzZXJ0X3NlbGVjdF9yanN8YXNzZXJ0X3NlbGVjdF9lbmNvZGVkfGNzc19zZWxlY3R8YXRfZXhpdHwiICsKICAgICAgICAiYXR0cnxhdHRyX3dyaXRlcnxhdHRyX3JlYWRlcnxhdHRyX2FjY2Vzc29yfGF0dHJfYWNjZXNzaWJsZXxhdXRvbG9hZHxiaW5kaW5nfGJsb2NrX2dpdmVuP3xjYWxsY2N8IiArCiAgICAgICAgImNhbGxlcnxjYXRjaHxjaG9tcHxjaG9tcCF8Y2hvcHxjaG9wIXxkZWZpbmVkP3xkZWxldGVfdmlhX3JlZGlyZWN0fGV2YWx8ZXhlY3xleGl0fCIgKwogICAgICAgICJleGl0IXxmYWlsfEZsb2F0fGZsdW5rfGZvbGxvd19yZWRpcmVjdCF8Zm9ya3xmb3JtX2Zvcnxmb3JtX3RhZ3xmb3JtYXR8Z2V0c3xnbG9iYWxfdmFyaWFibGVzfGdzdWJ8IiArCiAgICAgICAgImdzdWIhfGdldF92aWFfcmVkaXJlY3R8aHxob3N0IXxodHRwcz98aHR0cHMhfGluY2x1ZGV8SW50ZWdlcnxsYW1iZGF8bGlua190b3wiICsKICAgICAgICAibGlua190b191bmxlc3NfY3VycmVudHxsaW5rX3RvX2Z1bmN0aW9ufGxpbmtfdG9fcmVtb3RlfGxvYWR8bG9jYWxfdmFyaWFibGVzfGxvb3B8b3BlbnxvcGVuX3Nlc3Npb258IiArCiAgICAgICAgInB8cHJpbnR8cHJpbnRmfHByb2N8cHV0Y3xwdXRzfHBvc3RfdmlhX3JlZGlyZWN0fHB1dF92aWFfcmVkaXJlY3R8cmFpc2V8cmFuZHwiICsKICAgICAgICAicmF3fHJlYWRsaW5lfHJlYWRsaW5lc3xyZWRpcmVjdD98cmVxdWVzdF92aWFfcmVkaXJlY3R8cmVxdWlyZXxzY2FufHNlbGVjdHwiICsKICAgICAgICAic2V0X3RyYWNlX2Z1bmN8c2xlZXB8c3BsaXR8c3ByaW50ZnxzcmFuZHxTdHJpbmd8c3R5bGVzaGVldF9saW5rX3RhZ3xzeXNjYWxsfHN5c3RlbXxzdWJ8c3ViIXx0ZXN0fCIgKwogICAgICAgICJ0aHJvd3x0cmFjZV92YXJ8dHJhcHx1bnRyYWNlX3ZhcnxhdGFuMnxjb3N8ZXhwfGZyZXhwfGxkZXhwfGxvZ3xsb2cxMHxzaW58c3FydHx0YW58IiArCiAgICAgICAgInJlbmRlcnxqYXZhc2NyaXB0X2luY2x1ZGVfdGFnfGNzcmZfbWV0YV90YWd8bGFiZWxfdGFnfHRleHRfZmllbGRfdGFnfHN1Ym1pdF90YWd8Y2hlY2tfYm94X3RhZ3wiICsKICAgICAgICAiY29udGVudF90YWd8cmFkaW9fYnV0dG9uX3RhZ3x0ZXh0X2FyZWFfdGFnfHBhc3N3b3JkX2ZpZWxkX3RhZ3xoaWRkZW5fZmllbGRfdGFnfCIgKwogICAgICAgICJmaWVsZHNfZm9yfHNlbGVjdF90YWd8b3B0aW9uc19mb3Jfc2VsZWN0fG9wdGlvbnNfZnJvbV9jb2xsZWN0aW9uX2Zvcl9zZWxlY3R8Y29sbGVjdGlvbl9zZWxlY3R8IiArCiAgICAgICAgInRpbWVfem9uZV9zZWxlY3R8c2VsZWN0X2RhdGV8c2VsZWN0X3RpbWV8c2VsZWN0X2RhdGV0aW1lfGRhdGVfc2VsZWN0fHRpbWVfc2VsZWN0fGRhdGV0aW1lX3NlbGVjdHwiICsKICAgICAgICAic2VsZWN0X3llYXJ8c2VsZWN0X21vbnRofHNlbGVjdF9kYXl8c2VsZWN0X2hvdXJ8c2VsZWN0X21pbnV0ZXxzZWxlY3Rfc2Vjb25kfGZpbGVfZmllbGRfdGFnfCIgKwogICAgICAgICJmaWxlX2ZpZWxkfHJlc3BvbmRfdG98c2tpcF9iZWZvcmVfZmlsdGVyfGFyb3VuZF9maWx0ZXJ8YWZ0ZXJfZmlsdGVyfHZlcmlmeXwiICsKICAgICAgICAicHJvdGVjdF9mcm9tX2Zvcmdlcnl8cmVzY3VlX2Zyb218aGVscGVyX21ldGhvZHxyZWRpcmVjdF90b3xiZWZvcmVfZmlsdGVyfCIgKwogICAgICAgICJzZW5kX2RhdGF8c2VuZF9maWxlfHZhbGlkYXRlc19wcmVzZW5jZV9vZnx2YWxpZGF0ZXNfdW5pcXVlbmVzc19vZnx2YWxpZGF0ZXNfbGVuZ3RoX29mfCIgKwogICAgICAgICJ2YWxpZGF0ZXNfZm9ybWF0X29mfHZhbGlkYXRlc19hY2NlcHRhbmNlX29mfHZhbGlkYXRlc19hc3NvY2lhdGVkfHZhbGlkYXRlc19leGNsdXNpb25fb2Z8IiArCiAgICAgICAgInZhbGlkYXRlc19pbmNsdXNpb25fb2Z8dmFsaWRhdGVzX251bWVyaWNhbGl0eV9vZnx2YWxpZGF0ZXNfd2l0aHx2YWxpZGF0ZXNfZWFjaHwiICsKICAgICAgICAiYXV0aGVudGljYXRlX29yX3JlcXVlc3Rfd2l0aF9odHRwX2Jhc2ljfGF1dGhlbnRpY2F0ZV9vcl9yZXF1ZXN0X3dpdGhfaHR0cF9kaWdlc3R8IiArCiAgICAgICAgImZpbHRlcl9wYXJhbWV0ZXJfbG9nZ2luZ3xtYXRjaHxnZXR8cG9zdHxyZXNvdXJjZXN8cmVkaXJlY3R8c2NvcGV8YXNzZXJ0X3JvdXRpbmd8IiArCiAgICAgICAgInRyYW5zbGF0ZXxsb2NhbGl6ZXxleHRyYWN0X2xvY2FsZV9mcm9tX3RsZHx0fGx8Y2FjaGVzX3BhZ2V8ZXhwaXJlX3BhZ2V8Y2FjaGVzX2FjdGlvbnxleHBpcmVfYWN0aW9ufCIgKwogICAgICAgICJjYWNoZXxleHBpcmVfZnJhZ21lbnR8ZXhwaXJlX2NhY2hlX2ZvcnxvYnNlcnZlfGNhY2hlX3N3ZWVwZXJ8IiArCiAgICAgICAgImhhc19tYW55fGhhc19vbmV8YmVsb25nc190b3xoYXNfYW5kX2JlbG9uZ3NfdG9fbWFueSIpLnNwbGl0KCJ8IikKICAgICk7CgogICAgdmFyIGtleXdvcmRzID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgiYWxpYXN8YW5kfEJFR0lOfGJlZ2lufGJyZWFrfGNhc2V8Y2xhc3N8ZGVmfGRlZmluZWR8ZG98ZWxzZXxlbHNpZnxFTkR8ZW5kfGVuc3VyZXwiICsKICAgICAgICAiX19GSUxFX198ZmluYWxseXxmb3J8Z2VtfGlmfGlufF9fTElORV9ffG1vZHVsZXxuZXh0fG5vdHxvcnxwcml2YXRlfHByb3RlY3RlZHxwdWJsaWN8IiArIAogICAgICAgICJyZWRvfHJlc2N1ZXxyZXRyeXxyZXR1cm58c3VwZXJ8dGhlbnx1bmRlZnx1bmxlc3N8dW50aWx8d2hlbnx3aGlsZXx5aWVsZCIpLnNwbGl0KCJ8IikKICAgICk7CgogICAgdmFyIGJ1aWxkaW5Db25zdGFudHMgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCJ0cnVlfFRSVUV8ZmFsc2V8RkFMU0V8bmlsfE5JTHxBUkdGfEFSR1Z8REFUQXxFTlZ8UlVCWV9QTEFURk9STXxSVUJZX1JFTEVBU0VfREFURXwiICsKICAgICAgICAiUlVCWV9WRVJTSU9OfFNUREVSUnxTVERJTnxTVERPVVR8VE9QTEVWRUxfQklORElORyIpLnNwbGl0KCJ8IikKICAgICk7CgogICAgdmFyIGJ1aWx0aW5WYXJpYWJsZXMgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCJcJERFQlVHfFwkZGVmb3V0fFwkRklMRU5BTUV8XCRMT0FEX1BBVEh8XCRTQUZFfFwkc3RkaW58XCRzdGRvdXR8XCRzdGRlcnJ8XCRWRVJCT1NFfCIgKwogICAgICAgICIkIXxyb290X3VybHxmbGFzaHxzZXNzaW9ufGNvb2tpZXN8cGFyYW1zfHJlcXVlc3R8cmVzcG9uc2V8bG9nZ2VyIikuc3BsaXQoInwiKQogICAgKTsKCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMuIFVzZSAoPzopIGluc3RlYWQuCiAgICAvLyByZWdleHBzIGFyZSBvcmRlcmVkIC0+IHRoZSBmaXJzdCBtYXRjaCBpcyB1c2VkCgogICAgdGhpcy4kcnVsZXMgPSB7CiAgICAgICAgInN0YXJ0IiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICIjLiokIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50CiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICJeXD1iZWdpbiQiLAogICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmcucmVnZXhwIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsvXSg/Oig/OlxcWyg/OlxcXFxdfFteXFxdXSkrXFxdKXwoPzpcXFxcL3xbXlxcXS9dKSkqWy9dXFx3KlxccyooPz1bKS4sO118JCkiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJwogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gYmFja3RpY2sgc3RyaW5nCiAgICAgICAgICAgICAgICByZWdleCA6ICJbYF0oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/W2BdIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwgLy8gbmFtZXNwYWNlcyBhcmVuJ3Qgc3ltYm9scwogICAgICAgICAgICAgICAgcmVnZXggOiAiOjoiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInZhcmlhYmxlLmluc3RhbmNjZSIsIC8vIGluc3RhbmNlIHZhcmlhYmxlCiAgICAgICAgICAgICAgICByZWdleCA6ICJAezEsMn0oPzpbYS16QS1aX118XGQpKyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAidmFyaWFibGUuY2xhc3MiLCAvLyBjbGFzcyBuYW1lCiAgICAgICAgICAgICAgICByZWdleCA6ICJbQS1aXSg/OlthLXpBLVpfXXxcZCkrIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzeW1ib2wKICAgICAgICAgICAgICAgIHJlZ2V4IDogIls6XSg/OltBLVphLXpfXXxbQCRdKD89W2EtekEtWjAtOV9dKSlbYS16QS1aMC05X10qWyE9P10/IgogICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBoZXgKICAgICAgICAgICAgICAgIHJlZ2V4IDogIjBbeFhdWzAtOWEtZkEtRl0oPzpbMC05YS1mQS1GXXxfKD89WzAtOWEtZkEtRl0pKSpcXGIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdAogICAgICAgICAgICAgICAgcmVnZXggOiAiWystXT9cXGQoPzpcXGR8Xyg/PVxcZCkpKig/Oig/OlxcLlxcZCg/OlxcZHxfKD89XFxkKSkqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiIsCiAgICAgICAgICAgICAgICByZWdleCA6ICIoPzp0cnVlfGZhbHNlKVxcYiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAic2VsZiIpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUubGFuZ3VhZ2UiOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleXdvcmRzLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsZGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYnVpbHRpblZhcmlhYmxlcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUubGFuZ3VhZ2UiOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWx0aW5GdW5jdGlvbnMuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuZnVuY3Rpb24iOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09ICJkZWJ1Z2dlciIpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgLy8gVE9ETzogVW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBVbmljb2RlIGlkZW50aWZpZXJzCiAgICAgICAgICAgICAgICByZWdleCA6ICJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5scGFyZW4iLAogICAgICAgICAgICAgICAgcmVnZXggOiAiW1soe10iCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJjb21tZW50IiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudAogICAgICAgICAgICAgICAgcmVnZXggOiAiXlw9ZW5kJCIsCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyIKICAgICAgICAgICAgfQogICAgICAgIF0KICAgIH07Cn07Cgpvb3AuaW5oZXJpdHMoUnVieUhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOwoKZXhwb3J0cy5SdWJ5SGlnaGxpZ2h0UnVsZXMgPSBSdWJ5SGlnaGxpZ2h0UnVsZXM7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsKCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IGZ1bmN0aW9uKCkge307CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihsaW5lLCBpbnB1dCkgewogICAgICAgIGlmICghIC9eXHMrJC8udGVzdChsaW5lKSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgICByZXR1cm4gL15ccypcfS8udGVzdChpbnB1dCk7CiAgICB9OwoKICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihkb2MsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocm93KTsKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKlx9KS8pOwoKICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDsKCiAgICAgICAgdmFyIGNvbHVtbiA9IG1hdGNoWzFdLmxlbmd0aDsKICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gZG9jLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn0pOwoKICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcyB8fCBvcGVuQnJhY2VQb3Mucm93ID09IHJvdykgcmV0dXJuIDA7CgogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOwogICAgICAgIGRvYy5yZXBsYWNlKG5ldyBSYW5nZShyb3csIDAsIHJvdywgY29sdW1uLTEpLCBpbmRlbnQpOwogICAgfTsKCiAgICB0aGlzLiRnZXRJbmRlbnQgPSBmdW5jdGlvbihsaW5lKSB7CiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAiIjsKICAgIH07Cgp9KS5jYWxsKE1hdGNoaW5nQnJhY2VPdXRkZW50LnByb3RvdHlwZSk7CgpleHBvcnRzLk1hdGNoaW5nQnJhY2VPdXRkZW50ID0gTWF0Y2hpbmdCcmFjZU91dGRlbnQ7Cn0pOwo7CiAgICAgICAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAg]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-ruby.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9ydWJ5IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL3J1YnlfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vcnVieV9oaWdobGlnaHRfcnVsZXMiKS5SdWJ5SGlnaGxpZ2h0UnVsZXMsaD1hKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudCxpPWEoIi4uL3JhbmdlIikuUmFuZ2Usaj1mdW5jdGlvbigpe3RoaXMuJHRva2VuaXplcj1uZXcgZigobmV3IGcpLmdldFJ1bGVzKCkpLHRoaXMuJG91dGRlbnQ9bmV3IGh9O2QuaW5oZXJpdHMoaixlKSxmdW5jdGlvbigpe3RoaXMudG9nZ2xlQ29tbWVudExpbmVzPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSEwLGY9L14oXHMqKSMvO2Zvcih2YXIgZz1jO2c8PWQ7ZysrKWlmKCFmLnRlc3QoYi5nZXRMaW5lKGcpKSl7ZT0hMTticmVha31pZihlKXt2YXIgaD1uZXcgaSgwLDAsMCwwKTtmb3IodmFyIGc9YztnPD1kO2crKyl7dmFyIGo9Yi5nZXRMaW5lKGcpLGs9ai5tYXRjaChmKTtoLnN0YXJ0LnJvdz1nLGguZW5kLnJvdz1nLGguZW5kLmNvbHVtbj1rWzBdLmxlbmd0aCxiLnJlcGxhY2UoaCxrWzFdKX19ZWxzZSBiLmluZGVudFJvd3MoYyxkLCIjIil9LHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuJGdldEluZGVudChiKSxlPXRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGIsYSksZj1lLnRva2VucztpZihmLmxlbmd0aCYmZltmLmxlbmd0aC0xXS50eXBlPT0iY29tbWVudCIpcmV0dXJuIGQ7aWYoYT09InN0YXJ0Iil7dmFyIGc9Yi5tYXRjaCgvXi4qW1x7XChcW11ccyokLyk7ZyYmKGQrPWMpfXJldHVybiBkfSx0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGIsYyl9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoYixjKX19LmNhbGwoai5wcm90b3R5cGUpLGIuTW9kZT1qfSksZGVmaW5lKCJhY2UvbW9kZS9ydWJ5X2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9sYW5nIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4uL2xpYi9sYW5nIiksZj1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGc9ZnVuY3Rpb24oKXt2YXIgYT1lLmFycmF5VG9NYXAoImFib3J0fEFycmF5fGFzc2VydHxhc3NlcnRfZXF1YWx8YXNzZXJ0X25vdF9lcXVhbHxhc3NlcnRfc2FtZXxhc3NlcnRfbm90X3NhbWV8YXNzZXJ0X25pbHxhc3NlcnRfbm90X25pbHxhc3NlcnRfbWF0Y2h8YXNzZXJ0X25vX21hdGNofGFzc2VydF9pbl9kZWx0YXxhc3NlcnRfdGhyb3dzfGFzc2VydF9yYWlzZXxhc3NlcnRfbm90aGluZ19yYWlzZWR8YXNzZXJ0X2luc3RhbmNlX29mfGFzc2VydF9raW5kX29mfGFzc2VydF9yZXNwb25kX3RvfGFzc2VydF9vcGVyYXRvcnxhc3NlcnRfc2VuZHxhc3NlcnRfZGlmZmVyZW5jZXxhc3NlcnRfbm9fZGlmZmVyZW5jZXxhc3NlcnRfcmVjb2duaXplc3xhc3NlcnRfZ2VuZXJhdGVzfGFzc2VydF9yZXNwb25zZXxhc3NlcnRfcmVkaXJlY3RlZF90b3xhc3NlcnRfdGVtcGxhdGV8YXNzZXJ0X3NlbGVjdHxhc3NlcnRfc2VsZWN0X2VtYWlsfGFzc2VydF9zZWxlY3RfcmpzfGFzc2VydF9zZWxlY3RfZW5jb2RlZHxjc3Nfc2VsZWN0fGF0X2V4aXR8YXR0cnxhdHRyX3dyaXRlcnxhdHRyX3JlYWRlcnxhdHRyX2FjY2Vzc29yfGF0dHJfYWNjZXNzaWJsZXxhdXRvbG9hZHxiaW5kaW5nfGJsb2NrX2dpdmVuP3xjYWxsY2N8Y2FsbGVyfGNhdGNofGNob21wfGNob21wIXxjaG9wfGNob3AhfGRlZmluZWQ/fGRlbGV0ZV92aWFfcmVkaXJlY3R8ZXZhbHxleGVjfGV4aXR8ZXhpdCF8ZmFpbHxGbG9hdHxmbHVua3xmb2xsb3dfcmVkaXJlY3QhfGZvcmt8Zm9ybV9mb3J8Zm9ybV90YWd8Zm9ybWF0fGdldHN8Z2xvYmFsX3ZhcmlhYmxlc3xnc3VifGdzdWIhfGdldF92aWFfcmVkaXJlY3R8aHxob3N0IXxodHRwcz98aHR0cHMhfGluY2x1ZGV8SW50ZWdlcnxsYW1iZGF8bGlua190b3xsaW5rX3RvX3VubGVzc19jdXJyZW50fGxpbmtfdG9fZnVuY3Rpb258bGlua190b19yZW1vdGV8bG9hZHxsb2NhbF92YXJpYWJsZXN8bG9vcHxvcGVufG9wZW5fc2Vzc2lvbnxwfHByaW50fHByaW50Znxwcm9jfHB1dGN8cHV0c3xwb3N0X3ZpYV9yZWRpcmVjdHxwdXRfdmlhX3JlZGlyZWN0fHJhaXNlfHJhbmR8cmF3fHJlYWRsaW5lfHJlYWRsaW5lc3xyZWRpcmVjdD98cmVxdWVzdF92aWFfcmVkaXJlY3R8cmVxdWlyZXxzY2FufHNlbGVjdHxzZXRfdHJhY2VfZnVuY3xzbGVlcHxzcGxpdHxzcHJpbnRmfHNyYW5kfFN0cmluZ3xzdHlsZXNoZWV0X2xpbmtfdGFnfHN5c2NhbGx8c3lzdGVtfHN1YnxzdWIhfHRlc3R8dGhyb3d8dHJhY2VfdmFyfHRyYXB8dW50cmFjZV92YXJ8YXRhbjJ8Y29zfGV4cHxmcmV4cHxsZGV4cHxsb2d8bG9nMTB8c2lufHNxcnR8dGFufHJlbmRlcnxqYXZhc2NyaXB0X2luY2x1ZGVfdGFnfGNzcmZfbWV0YV90YWd8bGFiZWxfdGFnfHRleHRfZmllbGRfdGFnfHN1Ym1pdF90YWd8Y2hlY2tfYm94X3RhZ3xjb250ZW50X3RhZ3xyYWRpb19idXR0b25fdGFnfHRleHRfYXJlYV90YWd8cGFzc3dvcmRfZmllbGRfdGFnfGhpZGRlbl9maWVsZF90YWd8ZmllbGRzX2ZvcnxzZWxlY3RfdGFnfG9wdGlvbnNfZm9yX3NlbGVjdHxvcHRpb25zX2Zyb21fY29sbGVjdGlvbl9mb3Jfc2VsZWN0fGNvbGxlY3Rpb25fc2VsZWN0fHRpbWVfem9uZV9zZWxlY3R8c2VsZWN0X2RhdGV8c2VsZWN0X3RpbWV8c2VsZWN0X2RhdGV0aW1lfGRhdGVfc2VsZWN0fHRpbWVfc2VsZWN0fGRhdGV0aW1lX3NlbGVjdHxzZWxlY3RfeWVhcnxzZWxlY3RfbW9udGh8c2VsZWN0X2RheXxzZWxlY3RfaG91cnxzZWxlY3RfbWludXRlfHNlbGVjdF9zZWNvbmR8ZmlsZV9maWVsZF90YWd8ZmlsZV9maWVsZHxyZXNwb25kX3RvfHNraXBfYmVmb3JlX2ZpbHRlcnxhcm91bmRfZmlsdGVyfGFmdGVyX2ZpbHRlcnx2ZXJpZnl8cHJvdGVjdF9mcm9tX2Zvcmdlcnl8cmVzY3VlX2Zyb218aGVscGVyX21ldGhvZHxyZWRpcmVjdF90b3xiZWZvcmVfZmlsdGVyfHNlbmRfZGF0YXxzZW5kX2ZpbGV8dmFsaWRhdGVzX3ByZXNlbmNlX29mfHZhbGlkYXRlc191bmlxdWVuZXNzX29mfHZhbGlkYXRlc19sZW5ndGhfb2Z8dmFsaWRhdGVzX2Zvcm1hdF9vZnx2YWxpZGF0ZXNfYWNjZXB0YW5jZV9vZnx2YWxpZGF0ZXNfYXNzb2NpYXRlZHx2YWxpZGF0ZXNfZXhjbHVzaW9uX29mfHZhbGlkYXRlc19pbmNsdXNpb25fb2Z8dmFsaWRhdGVzX251bWVyaWNhbGl0eV9vZnx2YWxpZGF0ZXNfd2l0aHx2YWxpZGF0ZXNfZWFjaHxhdXRoZW50aWNhdGVfb3JfcmVxdWVzdF93aXRoX2h0dHBfYmFzaWN8YXV0aGVudGljYXRlX29yX3JlcXVlc3Rfd2l0aF9odHRwX2RpZ2VzdHxmaWx0ZXJfcGFyYW1ldGVyX2xvZ2dpbmd8bWF0Y2h8Z2V0fHBvc3R8cmVzb3VyY2VzfHJlZGlyZWN0fHNjb3BlfGFzc2VydF9yb3V0aW5nfHRyYW5zbGF0ZXxsb2NhbGl6ZXxleHRyYWN0X2xvY2FsZV9mcm9tX3RsZHx0fGx8Y2FjaGVzX3BhZ2V8ZXhwaXJlX3BhZ2V8Y2FjaGVzX2FjdGlvbnxleHBpcmVfYWN0aW9ufGNhY2hlfGV4cGlyZV9mcmFnbWVudHxleHBpcmVfY2FjaGVfZm9yfG9ic2VydmV8Y2FjaGVfc3dlZXBlcnxoYXNfbWFueXxoYXNfb25lfGJlbG9uZ3NfdG98aGFzX2FuZF9iZWxvbmdzX3RvX21hbnkiLnNwbGl0KCJ8IikpLGI9ZS5hcnJheVRvTWFwKCJhbGlhc3xhbmR8QkVHSU58YmVnaW58YnJlYWt8Y2FzZXxjbGFzc3xkZWZ8ZGVmaW5lZHxkb3xlbHNlfGVsc2lmfEVORHxlbmR8ZW5zdXJlfF9fRklMRV9ffGZpbmFsbHl8Zm9yfGdlbXxpZnxpbnxfX0xJTkVfX3xtb2R1bGV8bmV4dHxub3R8b3J8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJlZG98cmVzY3VlfHJldHJ5fHJldHVybnxzdXBlcnx0aGVufHVuZGVmfHVubGVzc3x1bnRpbHx3aGVufHdoaWxlfHlpZWxkIi5zcGxpdCgifCIpKSxjPWUuYXJyYXlUb01hcCgidHJ1ZXxUUlVFfGZhbHNlfEZBTFNFfG5pbHxOSUx8QVJHRnxBUkdWfERBVEF8RU5WfFJVQllfUExBVEZPUk18UlVCWV9SRUxFQVNFX0RBVEV8UlVCWV9WRVJTSU9OfFNUREVSUnxTVERJTnxTVERPVVR8VE9QTEVWRUxfQklORElORyIuc3BsaXQoInwiKSksZD1lLmFycmF5VG9NYXAoIiRERUJVR3wkZGVmb3V0fCRGSUxFTkFNRXwkTE9BRF9QQVRIfCRTQUZFfCRzdGRpbnwkc3Rkb3V0fCRzdGRlcnJ8JFZFUkJPU0V8JCF8cm9vdF91cmx8Zmxhc2h8c2Vzc2lvbnxjb29raWVzfHBhcmFtc3xyZXF1ZXN0fHJlc3BvbnNlfGxvZ2dlciIuc3BsaXQoInwiKSk7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIjLiokIn0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXj1iZWdpbiQiLG5leHQ6ImNvbW1lbnQifSx7dG9rZW46InN0cmluZy5yZWdleHAiLHJlZ2V4OiJbL10oPzooPzpcXFsoPzpcXFxcXXxbXlxcXV0pK1xcXSl8KD86XFxcXC98W15cXF0vXSkpKlsvXVxcdypcXHMqKD89WykuLDtdfCQpIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OidbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJ30se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJbYF0oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/W2BdIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiOjoifSx7dG9rZW46InZhcmlhYmxlLmluc3RhbmNjZSIscmVnZXg6IkB7MSwyfSg/OlthLXpBLVpfXXxkKSsifSx7dG9rZW46InZhcmlhYmxlLmNsYXNzIixyZWdleDoiW0EtWl0oPzpbYS16QS1aX118ZCkrIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJbOl0oPzpbQS1aYS16X118W0AkXSg/PVthLXpBLVowLTlfXSkpW2EtekEtWjAtOV9dKlshPT9dPyJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IjBbeFhdWzAtOWEtZkEtRl0oPzpbMC05YS1mQS1GXXxfKD89WzAtOWEtZkEtRl0pKSpcXGIifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiJbKy1dP1xcZCg/OlxcZHxfKD89XFxkKSkqKD86KD86XFwuXFxkKD86XFxkfF8oPz1cXGQpKSopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIn0se3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5ib29sZWFuIixyZWdleDoiKD86dHJ1ZXxmYWxzZSlcXGIifSx7dG9rZW46ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PSJzZWxmIj8idmFyaWFibGUubGFuZ3VhZ2UiOmIuaGFzT3duUHJvcGVydHkoZSk/ImtleXdvcmQiOmMuaGFzT3duUHJvcGVydHkoZSk/ImNvbnN0YW50Lmxhbmd1YWdlIjpkLmhhc093blByb3BlcnR5KGUpPyJ2YXJpYWJsZS5sYW5ndWFnZSI6YS5oYXNPd25Qcm9wZXJ0eShlKT8ic3VwcG9ydC5mdW5jdGlvbiI6ZT09ImRlYnVnZ2VyIj8iaW52YWxpZC5kZXByZWNhdGVkIjoiaWRlbnRpZmllciJ9LHJlZ2V4OiJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIifSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiIhfFxcJHwlfCZ8XFwqfFxcLVxcLXxcXC18XFwrXFwrfFxcK3x+fD09PXw9PXw9fCE9fCE9PXw8PXw+PXw8PD18Pj49fD4+Pj18PD58PHw+fCF8JiZ8XFx8XFx8fFxcP1xcOnxcXCo9fCU9fFxcKz18XFwtPXwmPXxcXF49fFxcYig/OmlufGluc3RhbmNlb2Z8bmV3fGRlbGV0ZXx0eXBlb2Z8dm9pZCkifSx7dG9rZW46InBhcmVuLmxwYXJlbiIscmVnZXg6IltbKHtdIn0se3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4OiJbXFxdKX1dIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9XSxjb21tZW50Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJePWVuZCQiLG5leHQ6InN0YXJ0In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV19fTtkLmluaGVyaXRzKGcsZiksYi5SdWJ5SGlnaGxpZ2h0UnVsZXM9Z30pLGRlZmluZSgiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vcmFuZ2UiKS5SYW5nZSxlPWZ1bmN0aW9uKCl7fTsoKGZ1bmN0aW9uKCl7dGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4vXlxzKyQvLnRlc3QoYSk/L15ccypcfS8udGVzdChiKTohMX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuZ2V0TGluZShiKSxlPWMubWF0Y2goL14oXHMqXH0pLyk7aWYoIWUpcmV0dXJuIDA7dmFyIGY9ZVsxXS5sZW5ndGgsZz1hLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzpiLGNvbHVtbjpmfSk7aWYoIWd8fGcucm93PT1iKXJldHVybiAwO3ZhciBoPXRoaXMuJGdldEluZGVudChhLmdldExpbmUoZy5yb3cpKTthLnJlcGxhY2UobmV3IGQoYiwwLGIsZi0xKSxoKX0sdGhpcy4kZ2V0SW5kZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEubWF0Y2goL14oXHMrKS8pO3JldHVybiBiP2JbMV06IiJ9fSkpLmNhbGwoZS5wcm90b3R5cGUpLGIuTWF0Y2hpbmdCcmFjZU91dGRlbnQ9ZX0pLGZ1bmN0aW9uKCl7d2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sZnVuY3Rpb24oYSl7d2luZG93LmFjZXx8KHdpbmRvdy5hY2U9e30pO2Zvcih2YXIgYiBpbiBhKWEuaGFzT3duUHJvcGVydHkoYikmJihhY2VbYl09YVtiXSl9KX0oKQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-scad-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKiAgICAgIEdhc3TDs24gS2xlaW1hbiA8Z2FzdG9uLmtsZWltYW4gQVQgZ21haWwgRE9UIGNvbT4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvc2NhZCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL3NjYWRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCAnYWNlL3JhbmdlJywgJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnLCAnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7CnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7CnZhciBzY2FkSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3NjYWRfaGlnaGxpZ2h0X3J1bGVzIikuc2NhZEhpZ2hsaWdodFJ1bGVzOwp2YXIgTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSByZXF1aXJlKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudDsKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsKdmFyIENzdHlsZUJlaGF2aW91ciA9IHJlcXVpcmUoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cjsKdmFyIENTdHlsZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlOwoKdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IHNjYWRIaWdobGlnaHRSdWxlcygpLmdldFJ1bGVzKCkpOwogICAgdGhpcy4kb3V0ZGVudCA9IG5ldyBNYXRjaGluZ0JyYWNlT3V0ZGVudCgpOwogICAgdGhpcy4kYmVoYXZpb3VyID0gbmV3IENzdHlsZUJlaGF2aW91cigpOwogICAgdGhpcy5mb2xkaW5nUnVsZXMgPSBuZXcgQ1N0eWxlRm9sZE1vZGUoKTsKfTsKb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcyA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHN0YXJ0Um93LCBlbmRSb3cpIHsKICAgICAgICB2YXIgb3V0ZGVudCA9IHRydWU7CiAgICAgICAgdmFyIHJlID0gL14oXHMqKVwvXC8vOwoKICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspIHsKICAgICAgICAgICAgaWYgKCFyZS50ZXN0KGRvYy5nZXRMaW5lKGkpKSkgewogICAgICAgICAgICAgICAgb3V0ZGVudCA9IGZhbHNlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChvdXRkZW50KSB7CiAgICAgICAgICAgIHZhciBkZWxldGVSYW5nZSA9IG5ldyBSYW5nZSgwLCAwLCAwLCAwKTsKICAgICAgICAgICAgZm9yICh2YXIgaT1zdGFydFJvdzsgaTw9IGVuZFJvdzsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKGkpOwogICAgICAgICAgICAgICAgdmFyIG0gPSBsaW5lLm1hdGNoKHJlKTsKICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLnN0YXJ0LnJvdyA9IGk7CiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQucm93ID0gaTsKICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLmVuZC5jb2x1bW4gPSBtWzBdLmxlbmd0aDsKICAgICAgICAgICAgICAgIGRvYy5yZXBsYWNlKGRlbGV0ZVJhbmdlLCBtWzFdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZG9jLmluZGVudFJvd3Moc3RhcnRSb3csIGVuZFJvdywgIi8vIik7CiAgICAgICAgfQogICAgfTsKCiAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgewogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQobGluZSk7CgogICAgICAgIHZhciB0b2tlbml6ZWRMaW5lID0gdGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMobGluZSwgc3RhdGUpOwogICAgICAgIHZhciB0b2tlbnMgPSB0b2tlbml6ZWRMaW5lLnRva2VuczsKICAgICAgICB2YXIgZW5kU3RhdGUgPSB0b2tlbml6ZWRMaW5lLnN0YXRlOwoKICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXS50eXBlID09ICJjb21tZW50IikgewogICAgICAgICAgICByZXR1cm4gaW5kZW50OwogICAgICAgIH0KCiAgICAgICAgaWYgKHN0YXRlID09ICJzdGFydCIpIHsKICAgICAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXi4qW1x7XChcW11ccyokLyk7CiAgICAgICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gImRvYy1zdGFydCIpIHsKICAgICAgICAgICAgaWYgKGVuZFN0YXRlID09ICJzdGFydCIpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eXHMqKFwvPylcKi8pOwogICAgICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgICAgIGlmIChtYXRjaFsxXSkgewogICAgICAgICAgICAgICAgICAgIGluZGVudCArPSAiICI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gIiogIjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGluZGVudDsKICAgIH07CgogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgaW5wdXQpIHsKICAgICAgICByZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQobGluZSwgaW5wdXQpOwogICAgfTsKCiAgICB0aGlzLmF1dG9PdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgcm93KSB7CiAgICAgICAgdGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChkb2MsIHJvdyk7CiAgICB9OwoKfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7CgpleHBvcnRzLk1vZGUgPSBNb2RlOwp9KTsKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKiAgICAgIEdhc3TDs24gS2xlaW1hbiA8Z2FzdG9uLmtsZWltYW4gQVQgZ21haWwgRE9UIGNvbT4KICoKICogQmFzZWQgb24gQmVzcGluJ3MgQy9DKysgU3ludGF4IFBsdWdpbiBieSBNYXJjIE1jSW50eXJlLgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9zY2FkX2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9sYW5nJywgJ2FjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOwp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM7CnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOwoKdmFyIHNjYWRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgewoKICAgIHZhciBrZXl3b3JkcyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoIm1vZHVsZXxpZnxlbHNlfGZvciIpLnNwbGl0KCJ8IikKICAgICk7CgogICAgdmFyIGJ1aWxkaW5Db25zdGFudHMgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCJOVUxMIikuc3BsaXQoInwiKQogICAgKTsKCiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMuIFVzZSAoPzopIGluc3RlYWQuCiAgICAvLyByZWdleHBzIGFyZSBvcmRlcmVkIC0+IHRoZSBmaXJzdCBtYXRjaCBpcyB1c2VkCgogICAgdGhpcy4kcnVsZXMgPSB7CiAgICAgICAgInN0YXJ0IiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXC8uKiQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRTdGFydFJ1bGUoInN0YXJ0IiksCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJwogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydAogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdLipcXFxcJCcsCiAgICAgICAgICAgICAgICBuZXh0IDogInFxc3RyaW5nIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXS4qXFxcXCQiLAogICAgICAgICAgICAgICAgbmV4dCA6ICJxc3RyaW5nIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaGV4CiAgICAgICAgICAgICAgICByZWdleCA6ICIwW3hYXVswLTlhLWZBLUZdK1xcYiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGZsb2F0CiAgICAgICAgICAgICAgICByZWdleCA6ICJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50IiwgLy8gPENPTlNUQU5UPgogICAgICAgICAgICAgIHJlZ2V4IDogIjxbYS16QS1aMC05Ll0rPiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQiLCAvLyBwcmUtY29tcGlsZXIgZGlyZWN0aXZzCiAgICAgICAgICAgICAgcmVnZXggOiAiKD86dXNlfGluY2x1ZGUpIgogICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAidGhpcyIpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUubGFuZ3VhZ2UiOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleXdvcmRzLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsZGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImlkZW50aWZpZXIiOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsCiAgICAgICAgICAgICAgICByZWdleCA6ICIhfFxcJHwlfCZ8XFwqfFxcLVxcLXxcXC18XFwrXFwrfFxcK3x+fD09fD18IT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxuZXd8ZGVsZXRlfHR5cGVvZnx2b2lkKSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ubHBhcmVuIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIltbKHtdIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5ycGFyZW4iLAogICAgICAgICAgICAgICAgcmVnZXggOiAiW1xcXSl9XSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIgogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiY29tbWVudCIgOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQKICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyIKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInFxc3RyaW5nIiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogJyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJywKICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKycKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInFzdHJpbmciIDogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqPyciLAogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJwogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfTsKICAgIAogICAgdGhpcy5lbWJlZFJ1bGVzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgImRvYy0iLAogICAgICAgIFsgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldEVuZFJ1bGUoInN0YXJ0IikgXSk7Cn07Cgpvb3AuaW5oZXJpdHMoc2NhZEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOwoKZXhwb3J0cy5zY2FkSGlnaGxpZ2h0UnVsZXMgPSBzY2FkSGlnaGxpZ2h0UnVsZXM7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOwoKdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuJHJ1bGVzID0gewogICAgICAgICJzdGFydCIgOiBbIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MudGFnIiwKICAgICAgICAgICAgcmVnZXggOiAiQFtcXHdcXGRfXSsiIC8vIFRPRE86IGZpeCBlbWFpbCBhZGRyZXNzZXMKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICJcXHMrIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlRPRE8iCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiW15AXFwqXSsiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiLiIKICAgICAgICB9XQogICAgfTsKfTsKCm9vcC5pbmhlcml0cyhEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5nZXRTdGFydFJ1bGUgPSBmdW5jdGlvbihzdGFydCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gZG9jIGNvbW1lbnQKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICJcXC9cXCooPz1cXCopIiwKICAgICAgICAgICAgbmV4dCAgOiBzdGFydAogICAgICAgIH07CiAgICB9OwogICAgCiAgICB0aGlzLmdldEVuZFJ1bGUgPSBmdW5jdGlvbiAoc3RhcnQpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsIC8vIGNsb3NpbmcgY29tbWVudAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlxcKlxcLyIsCiAgICAgICAgICAgIG5leHQgIDogc3RhcnQKICAgICAgICB9OwogICAgfTsKCn0pLmNhbGwoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLnByb3RvdHlwZSk7CgpleHBvcnRzLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsKCn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsKCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IGZ1bmN0aW9uKCkge307CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihsaW5lLCBpbnB1dCkgewogICAgICAgIGlmICghIC9eXHMrJC8udGVzdChsaW5lKSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgICByZXR1cm4gL15ccypcfS8udGVzdChpbnB1dCk7CiAgICB9OwoKICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihkb2MsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocm93KTsKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKlx9KS8pOwoKICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDsKCiAgICAgICAgdmFyIGNvbHVtbiA9IG1hdGNoWzFdLmxlbmd0aDsKICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gZG9jLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn0pOwoKICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcyB8fCBvcGVuQnJhY2VQb3Mucm93ID09IHJvdykgcmV0dXJuIDA7CgogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOwogICAgICAgIGRvYy5yZXBsYWNlKG5ldyBSYW5nZShyb3csIDAsIHJvdywgY29sdW1uLTEpLCBpbmRlbnQpOwogICAgfTsKCiAgICB0aGlzLiRnZXRJbmRlbnQgPSBmdW5jdGlvbihsaW5lKSB7CiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAiIjsKICAgIH07Cgp9KS5jYWxsKE1hdGNoaW5nQnJhY2VPdXRkZW50LnByb3RvdHlwZSk7CgpleHBvcnRzLk1hdGNoaW5nQnJhY2VPdXRkZW50ID0gTWF0Y2hpbmdCcmFjZU91dGRlbnQ7Cn0pOwovKiB2aW06dHM9NDpzdHM9NDpzdz00OgogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIENocmlzIFNwZW5jZXIgPGNocmlzLmFnLnNwZW5jZXIgQVQgZ29vZ2xlbWFpbCBET1QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9iZWhhdmlvdXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7CnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCcuLi9iZWhhdmlvdXInKS5CZWhhdmlvdXI7Cgp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gZnVuY3Rpb24gKCkgewoKICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgewogICAgICAgIGlmICh0ZXh0ID09ICd7JykgewogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7CiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7JyArIHNlbGVjdGVkICsgJ30nLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3t9JywKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICd9JykgewogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsKICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsKICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsKICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnfScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsKICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAiXG4iKSB7CiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9JykgewogICAgICAgICAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IHNlc3Npb24uZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiBjdXJzb3Iucm93LCBjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxfSk7CiAgICAgICAgICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcykKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CgogICAgICAgICAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQoc3RhdGUsIGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUubGVuZ3RoIC0gMSksIHNlc3Npb24uZ2V0VGFiU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgdmFyIG5leHRfaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOwoKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xuJyArIGluZGVudCArICdcbicgKyBuZXh0X2luZGVudCwKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCBpbmRlbnQubGVuZ3RoLCAxLCBpbmRlbnQubGVuZ3RoXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoImJyYWNlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7CiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsKICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJ3snKSB7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2UuZW5kLmNvbHVtbiwgcmFuZ2UuZW5kLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9JykgewogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOwogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoInBhcmVucyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7CiAgICAgICAgaWYgKHRleHQgPT0gJygnKSB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7CiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygnICsgc2VsZWN0ZWQgKyAnKScsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCknLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJyknKSB7CiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgewogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCcpJywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOwogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoInBhcmVucyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7CiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsKICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJygnKSB7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgewogICAgICAgIGlmICh0ZXh0ID09ICciJykgewogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7CiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICciJyArIHNlbGVjdGVkICsgJyInLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsKICAgICAgICAgICAgICAgIHZhciBsZWZ0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4tMSwgY3Vyc29yLmNvbHVtbik7CgogICAgICAgICAgICAgICAgLy8gV2UncmUgZXNjYXBlZC4KICAgICAgICAgICAgICAgIGlmIChsZWZ0Q2hhciA9PSAnXFwnKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gRmluZCB3aGF0IHRva2VuIHdlJ3JlIGluc2lkZS4KICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzZXNzaW9uLmdldFRva2VucyhzZWxlY3Rpb24uc3RhcnQucm93LCBzZWxlY3Rpb24uc3RhcnQucm93KVswXS50b2tlbnM7CiAgICAgICAgICAgICAgICB2YXIgY29sID0gMCwgdG9rZW47CiAgICAgICAgICAgICAgICB2YXIgcXVvdGVwb3MgPSAtMTsgLy8gVHJhY2sgd2hldGhlciB3ZSdyZSBpbnNpZGUgYW4gb3BlbiBxdW90ZS4KCiAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRva2Vucy5sZW5ndGg7IHgrKykgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW3hdOwogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IC0xOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocXVvdGVwb3MgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IHRva2VuLnZhbHVlLmluZGV4T2YoJyInKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0b2tlbi52YWx1ZS5sZW5ndGggKyBjb2wpID4gc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbikgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29sICs9IHRva2Vuc1t4XS52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gVHJ5IGFuZCBiZSBzbWFydCBhYm91dCB3aGVuIHdlIGF1dG8gaW5zZXJ0LgogICAgICAgICAgICAgICAgaWYgKCF0b2tlbiB8fCAocXVvdGVwb3MgPCAwICYmIHRva2VuLnR5cGUgIT09ICJjb21tZW50IiAmJiAodG9rZW4udHlwZSAhPT0gInN0cmluZyIgfHwgKChzZWxlY3Rpb24uc3RhcnQuY29sdW1uICE9PSB0b2tlbi52YWx1ZS5sZW5ndGgrY29sLTEpICYmIHRva2VuLnZhbHVlLmxhc3RJbmRleE9mKCciJykgPT09IHRva2VuLnZhbHVlLmxlbmd0aC0xKSkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJyIiJywKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwxXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gJiYgdG9rZW4udHlwZSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaW5wdXQgYW5kIG1vdmUgcmlnaHQgb25lIGlmIHdlJ3JlIHR5cGluZyBvdmVyIHRoZSBjbG9zaW5nIHF1b3RlLgogICAgICAgICAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7CiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsKICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJyInKSB7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCn0Kb29wLmluaGVyaXRzKENzdHlsZUJlaGF2aW91ciwgQmVoYXZpb3VyKTsKCmV4cG9ydHMuQ3N0eWxlQmVoYXZpb3VyID0gQ3N0eWxlQmVoYXZpb3VyOwp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7CnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7CnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOwoKdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307Cm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IC8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvOwogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IC9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLzsKICAgIAogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXg7CgogICAgICAgICAgICBpZiAobWF0Y2hbMV0pCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKHNlc3Npb24sIG1hdGNoWzFdLCByb3csIGkpOwoKICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSArIG1hdGNoWzBdLmxlbmd0aCk7CiAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsKICAgICAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGZvbGRTdHlsZSAhPT0gIm1hcmtiZWdpbmVuZCIpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDsKCiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkgewogICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSk7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiByb3csIGNvbHVtbjogaX07CiAgICAgICAgICAgIHZhciBzdGFydCA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldChtYXRjaFsxXSwgZW5kKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICghc3RhcnQpCiAgICAgICAgICAgICAgICByZXR1cm47CgogICAgICAgICAgICBzdGFydC5jb2x1bW4rKzsKICAgICAgICAgICAgZW5kLmNvbHVtbi0tOwoKICAgICAgICAgICAgcmV0dXJuICBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOwogICAgICAgIH0KICAgIH07CiAgICAKfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOwoKfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOwoKdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSBudWxsOwogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7CgogICAgLy8gbXVzdCByZXR1cm4gIiIgaWYgdGhlcmUncyBubyBmb2xkLCB0byBlbmFibGUgY2FjaGluZwogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsKICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOwogICAgICAgIGlmICh0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGxpbmUpKQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsKICAgICAgICBpZiAoZm9sZFN0eWxlID09ICJtYXJrYmVnaW5lbmQiCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpCiAgICAgICAgICAgIHJldHVybiAiZW5kIjsKICAgICAgICByZXR1cm4gIiI7CiAgICB9OwogICAgCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7CiAgICAgICAgdmFyIHJlID0gL15ccyovOwogICAgICAgIHZhciBzdGFydFJvdyA9IHJvdzsKICAgICAgICB2YXIgZW5kUm93ID0gcm93OwogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgdmFyIHN0YXJ0Q29sdW1uID0gY29sdW1uIHx8IGxpbmUubGVuZ3RoOwogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOwogICAgICAgIHZhciBtYXhSb3cgPSBzZXNzaW9uLmdldExlbmd0aCgpCiAgICAgICAgCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7CiAgICAgICAgICAgIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICAgICAgdmFyIGxldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOwoKICAgICAgICAgICAgaWYgKGxldmVsID09IGxpbmUubGVuZ3RoKQogICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICBpZiAobGV2ZWwgPD0gc3RhcnRMZXZlbCkKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgZW5kUm93ID0gcm93OwogICAgICAgIH0KCiAgICAgICAgaWYgKGVuZFJvdyA+IHN0YXJ0Um93KSB7CiAgICAgICAgICAgIHZhciBlbmRDb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kUm93KS5sZW5ndGg7CiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7CiAgICAgICAgfQogICAgfTsKCiAgICB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCBicmFja2V0LCByb3csIGNvbHVtbikgewogICAgICAgIHZhciBzdGFydCA9IHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW4gKyAxfTsKICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsKICAgICAgICBpZiAoIWVuZCkKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICB2YXIgZncgPSBzZXNzaW9uLmZvbGRXaWRnZXRzW2VuZC5yb3ddOwogICAgICAgIGlmIChmdyA9PSBudWxsKQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsKCiAgICAgICAgaWYgKGZ3ID09ICJzdGFydCIpIHsKICAgICAgICAgICAgZW5kLnJvdyAtLTsKICAgICAgICAgICAgZW5kLmNvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmQucm93KS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOwogICAgfTsKCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsKCn0pOwo7CiAgICAgICAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAg]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-scad.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9zY2FkIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL3NjYWRfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsImFjZS9yYW5nZSIsImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vc2NhZF9oaWdobGlnaHRfcnVsZXMiKS5zY2FkSGlnaGxpZ2h0UnVsZXMsaD1hKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudCxpPWEoIi4uL3JhbmdlIikuUmFuZ2Usaj1hKCIuL2JlaGF2aW91ci9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXIsaz1hKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGUsbD1mdW5jdGlvbigpe3RoaXMuJHRva2VuaXplcj1uZXcgZigobmV3IGcpLmdldFJ1bGVzKCkpLHRoaXMuJG91dGRlbnQ9bmV3IGgsdGhpcy4kYmVoYXZpb3VyPW5ldyBqLHRoaXMuZm9sZGluZ1J1bGVzPW5ldyBrfTtkLmluaGVyaXRzKGwsZSksZnVuY3Rpb24oKXt0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMCxmPS9eKFxzKilcL1wvLztmb3IodmFyIGc9YztnPD1kO2crKylpZighZi50ZXN0KGIuZ2V0TGluZShnKSkpe2U9ITE7YnJlYWt9aWYoZSl7dmFyIGg9bmV3IGkoMCwwLDAsMCk7Zm9yKHZhciBnPWM7Zzw9ZDtnKyspe3ZhciBqPWIuZ2V0TGluZShnKSxrPWoubWF0Y2goZik7aC5zdGFydC5yb3c9ZyxoLmVuZC5yb3c9ZyxoLmVuZC5jb2x1bW49a1swXS5sZW5ndGgsYi5yZXBsYWNlKGgsa1sxXSl9fWVsc2UgYi5pbmRlbnRSb3dzKGMsZCwiLy8iKX0sdGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy4kZ2V0SW5kZW50KGIpLGU9dGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMoYixhKSxmPWUudG9rZW5zLGc9ZS5zdGF0ZTtpZihmLmxlbmd0aCYmZltmLmxlbmd0aC0xXS50eXBlPT0iY29tbWVudCIpcmV0dXJuIGQ7aWYoYT09InN0YXJ0Iil7dmFyIGg9Yi5tYXRjaCgvXi4qW1x7XChcW11ccyokLyk7aCYmKGQrPWMpfWVsc2UgaWYoYT09ImRvYy1zdGFydCIpe2lmKGc9PSJzdGFydCIpcmV0dXJuIiI7dmFyIGg9Yi5tYXRjaCgvXlxzKihcLz8pXCovKTtoJiYoaFsxXSYmKGQrPSIgIiksZCs9IiogIil9cmV0dXJuIGR9LHRoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQoYixjKX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7dGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChiLGMpfX0uY2FsbChsLnByb3RvdHlwZSksYi5Nb2RlPWx9KSxkZWZpbmUoImFjZS9tb2RlL3NjYWRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi4vbGliL2xhbmciKSxmPWEoIi4vZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIikuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLGc9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxoPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKCJtb2R1bGV8aWZ8ZWxzZXxmb3IiLnNwbGl0KCJ8IikpLGI9ZS5hcnJheVRvTWFwKCJOVUxMIi5zcGxpdCgifCIpKTt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6IlxcL1xcLy4qJCJ9LChuZXcgZikuZ2V0U3RhcnRSdWxlKCJzdGFydCIpLHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKiIsbmV4dDoiY29tbWVudCJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDonWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXSd9LHt0b2tlbjoic3RyaW5nIixyZWdleDonWyJdLipcXFxcJCcsbmV4dDoicXFzdHJpbmcifSx7dG9rZW46InN0cmluZyIscmVnZXg6IlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10ifSx7dG9rZW46InN0cmluZyIscmVnZXg6IlsnXS4qXFxcXCQiLG5leHQ6InFzdHJpbmcifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIwW3hYXVswLTlhLWZBLUZdK1xcYiJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIn0se3Rva2VuOiJjb25zdGFudCIscmVnZXg6IjxbYS16QS1aMC05Ll0rPiJ9LHt0b2tlbjoia2V5d29yZCIscmVnZXg6Iig/OnVzZXxpbmNsdWRlKSJ9LHt0b2tlbjpmdW5jdGlvbihjKXtyZXR1cm4gYz09InRoaXMiPyJ2YXJpYWJsZS5sYW5ndWFnZSI6YS5oYXNPd25Qcm9wZXJ0eShjKT8ia2V5d29yZCI6Yi5oYXNPd25Qcm9wZXJ0eShjKT8iY29uc3RhbnQubGFuZ3VhZ2UiOiJpZGVudGlmaWVyIn0scmVnZXg6IlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiJ9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6IiF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT18PXwhPXw8PXw+PXw8PD18Pj49fD4+Pj18PD58PHw+fCF8JiZ8XFx8XFx8fFxcP1xcOnxcXCo9fCU9fFxcKz18XFwtPXwmPXxcXF49fFxcYig/OmlufG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIn0se3Rva2VuOiJwYXJlbi5scGFyZW4iLHJlZ2V4OiJbWyh7XSJ9LHt0b2tlbjoicGFyZW4ucnBhcmVuIixyZWdleDoiW1xcXSl9XSJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifV0sY29tbWVudDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLHFxc3RyaW5nOlt7dG9rZW46InN0cmluZyIscmVnZXg6Jyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJyxuZXh0OiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV0scXN0cmluZzpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OiIoPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/JyIsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfSx0aGlzLmVtYmVkUnVsZXMoZiwiZG9jLSIsWyhuZXcgZikuZ2V0RW5kUnVsZSgic3RhcnQiKV0pfTtkLmluaGVyaXRzKGgsZyksYi5zY2FkSGlnaGxpZ2h0UnVsZXM9aH0pLGRlZmluZSgiYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxmPWZ1bmN0aW9uKCl7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQuZG9jLnRhZyIscmVnZXg6IkBbXFx3XFxkX10rIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxccysifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiVE9ETyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJbXkBcXCpdKyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiIuIn1dfX07ZC5pbmhlcml0cyhmLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXRTdGFydFJ1bGU9ZnVuY3Rpb24oYSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKig/PVxcKikiLG5leHQ6YX19LHRoaXMuZ2V0RW5kUnVsZT1mdW5jdGlvbihhKXtyZXR1cm57dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiXFwqXFwvIixuZXh0OmF9fX0uY2FsbChmLnByb3RvdHlwZSksYi5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM9Zn0pLGRlZmluZSgiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vcmFuZ2UiKS5SYW5nZSxlPWZ1bmN0aW9uKCl7fTsoKGZ1bmN0aW9uKCl7dGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4vXlxzKyQvLnRlc3QoYSk/L15ccypcfS8udGVzdChiKTohMX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuZ2V0TGluZShiKSxlPWMubWF0Y2goL14oXHMqXH0pLyk7aWYoIWUpcmV0dXJuIDA7dmFyIGY9ZVsxXS5sZW5ndGgsZz1hLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzpiLGNvbHVtbjpmfSk7aWYoIWd8fGcucm93PT1iKXJldHVybiAwO3ZhciBoPXRoaXMuJGdldEluZGVudChhLmdldExpbmUoZy5yb3cpKTthLnJlcGxhY2UobmV3IGQoYiwwLGIsZi0xKSxoKX0sdGhpcy4kZ2V0SW5kZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEubWF0Y2goL14oXHMrKS8pO3JldHVybiBiP2JbMV06IiJ9fSkpLmNhbGwoZS5wcm90b3R5cGUpLGIuTWF0Y2hpbmdCcmFjZU91dGRlbnQ9ZX0pLGRlZmluZSgiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvYmVoYXZpb3VyIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXIsZj1mdW5jdGlvbigpe3RoaXMuYWRkKCJicmFjZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09InsiKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7cmV0dXJuIGchPT0iIj97dGV4dDoieyIrZysifSIsc2VsZWN0aW9uOiExfTp7dGV4dDoie30iLHNlbGVjdGlvbjpbMSwxXX19aWYoZT09In0iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSJ9Iil7dmFyIGs9ZC4kZmluZE9wZW5pbmdCcmFja2V0KCJ9Iix7Y29sdW1uOmguY29sdW1uKzEscm93Omgucm93fSk7aWYoayE9PW51bGwpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19ZWxzZSBpZihlPT0iXG4iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSJ9Iil7dmFyIGw9ZC5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6aC5yb3csY29sdW1uOmguY29sdW1uKzF9KTtpZighbClyZXR1cm4gbnVsbDt2YXIgbT10aGlzLmdldE5leHRMaW5lSW5kZW50KGEsaS5zdWJzdHJpbmcoMCxpLmxlbmd0aC0xKSxkLmdldFRhYlN0cmluZygpKSxuPXRoaXMuJGdldEluZGVudChkLmRvYy5nZXRMaW5lKGwucm93KSk7cmV0dXJue3RleHQ6IlxuIittKyJcbiIrbixzZWxlY3Rpb246WzEsbS5sZW5ndGgsMSxtLmxlbmd0aF19fX19KSx0aGlzLmFkZCgiYnJhY2VzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSJ7Iil7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLmVuZC5jb2x1bW4sZS5lbmQuY29sdW1uKzEpO2lmKGg9PSJ9IilyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KSx0aGlzLmFkZCgicGFyZW5zIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSIoIil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/e3RleHQ6IigiK2crIikiLHNlbGVjdGlvbjohMX06e3RleHQ6IigpIixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSIpIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0iKSIpe3ZhciBrPWQuJGZpbmRPcGVuaW5nQnJhY2tldCgiKSIse2NvbHVtbjpoLmNvbHVtbisxLHJvdzpoLnJvd30pO2lmKGshPT1udWxsKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJwYXJlbnMiLCJkZWxldGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1kLmRvYy5nZXRUZXh0UmFuZ2UoZSk7aWYoIWUuaXNNdWx0aUxpbmUoKSYmZj09IigiKXt2YXIgZz1kLmRvYy5nZXRMaW5lKGUuc3RhcnQucm93KSxoPWcuc3Vic3RyaW5nKGUuc3RhcnQuY29sdW1uKzEsZS5zdGFydC5jb2x1bW4rMik7aWYoaD09IikiKXJldHVybiBlLmVuZC5jb2x1bW4rKyxlfX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0nIicpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtpZihnIT09IiIpcmV0dXJue3RleHQ6JyInK2crJyInLHNlbGVjdGlvbjohMX07dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbi0xLGguY29sdW1uKTtpZihqPT0iXFwiKXJldHVybiBudWxsO3ZhciBrPWQuZ2V0VG9rZW5zKGYuc3RhcnQucm93LGYuc3RhcnQucm93KVswXS50b2tlbnMsbD0wLG0sbj0tMTtmb3IodmFyIG89MDtvPGsubGVuZ3RoO28rKyl7bT1rW29dLG0udHlwZT09InN0cmluZyI/bj0tMTpuPDAmJihuPW0udmFsdWUuaW5kZXhPZignIicpKTtpZihtLnZhbHVlLmxlbmd0aCtsPmYuc3RhcnQuY29sdW1uKWJyZWFrO2wrPWtbb10udmFsdWUubGVuZ3RofWlmKCFtfHxuPDAmJm0udHlwZSE9PSJjb21tZW50IiYmKG0udHlwZSE9PSJzdHJpbmcifHxmLnN0YXJ0LmNvbHVtbiE9PW0udmFsdWUubGVuZ3RoK2wtMSYmbS52YWx1ZS5sYXN0SW5kZXhPZignIicpPT09bS52YWx1ZS5sZW5ndGgtMSkpcmV0dXJue3RleHQ6JyIiJyxzZWxlY3Rpb246WzEsMV19O2lmKG0mJm0udHlwZT09PSJzdHJpbmciKXt2YXIgcD1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihwPT0nIicpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19fSksdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSciJyl7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbisxLGUuc3RhcnQuY29sdW1uKzIpO2lmKGg9PSciJylyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KX07ZC5pbmhlcml0cyhmLGUpLGIuQ3N0eWxlQmVoYXZpb3VyPWZ9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvcmFuZ2UiLCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxmPWEoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGUsZz1iLkZvbGRNb2RlPWZ1bmN0aW9uKCl7fTtkLmluaGVyaXRzKGcsZiksZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj0vKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLyx0aGlzLmZvbGRpbmdTdG9wTWFya2VyPS9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLyx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpLGY9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7aWYoZil7dmFyIGc9Zi5pbmRleDtpZihmWzFdKXJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soYSxmWzFdLGMsZyk7dmFyIGg9YS5nZXRDb21tZW50Rm9sZFJhbmdlKGMsZytmWzBdLmxlbmd0aCk7cmV0dXJuIGguZW5kLmNvbHVtbi09MixofWlmKGIhPT0ibWFya2JlZ2luZW5kIilyZXR1cm47dmFyIGY9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTtpZihmKXt2YXIgZz1mLmluZGV4K2ZbMF0ubGVuZ3RoO2lmKGZbMl0pe3ZhciBoPWEuZ2V0Q29tbWVudEZvbGRSYW5nZShjLGcpO3JldHVybiBoLmVuZC5jb2x1bW4tPTIsaH12YXIgaT17cm93OmMsY29sdW1uOmd9LGo9YS4kZmluZE9wZW5pbmdCcmFja2V0KGZbMV0saSk7aWYoIWopcmV0dXJuO3JldHVybiBqLmNvbHVtbisrLGkuY29sdW1uLS0sZS5mcm9tUG9pbnRzKGosaSl9fX0uY2FsbChnLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGU9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPW51bGwsdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj1udWxsLHRoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpO3JldHVybiB0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGQpPyJzdGFydCI6Yj09Im1hcmtiZWdpbmVuZCImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChkKT8iZW5kIjoiIn0sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBudWxsfSx0aGlzLmluZGVudGF0aW9uQmxvY2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPS9eXHMqLyxmPWIsZz1iLGg9YS5nZXRMaW5lKGIpLGk9Y3x8aC5sZW5ndGgsaj1oLm1hdGNoKGUpWzBdLmxlbmd0aCxrPWEuZ2V0TGVuZ3RoKCk7d2hpbGUoKytiPGspe2g9YS5nZXRMaW5lKGIpO3ZhciBsPWgubWF0Y2goZSlbMF0ubGVuZ3RoO2lmKGw9PWgubGVuZ3RoKWNvbnRpbnVlO2lmKGw8PWopYnJlYWs7Zz1ifWlmKGc+Zil7dmFyIG09YS5nZXRMaW5lKGcpLmxlbmd0aDtyZXR1cm4gbmV3IGQoZixpLGcsbSl9fSx0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2s9ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGY9e3JvdzpjLGNvbHVtbjplKzF9LGc9YS4kZmluZENsb3NpbmdCcmFja2V0KGIsZik7aWYoIWcpcmV0dXJuO3ZhciBoPWEuZm9sZFdpZGdldHNbZy5yb3ddO3JldHVybiBoPT1udWxsJiYoaD10aGlzLmdldEZvbGRXaWRnZXQoYSxnLnJvdykpLGg9PSJzdGFydCImJihnLnJvdy0tLGcuY29sdW1uPWEuZ2V0TGluZShnLnJvdykubGVuZ3RoKSxkLmZyb21Qb2ludHMoZixnKX19KSkuY2FsbChlLnByb3RvdHlwZSl9KSxmdW5jdGlvbigpe3dpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLGZ1bmN0aW9uKGEpe3dpbmRvdy5hY2V8fCh3aW5kb3cuYWNlPXt9KTtmb3IodmFyIGIgaW4gYSlhLmhhc093blByb3BlcnR5KGIpJiYoYWNlW2JdPWFbYl0pfSl9KCk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-scala-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCdhY2UvbW9kZS9zY2FsYScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvamF2YXNjcmlwdCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL3NjYWxhX2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIEphdmFTY3JpcHRNb2RlID0gcmVxdWlyZSgiLi9qYXZhc2NyaXB0IikuTW9kZTsKdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsKdmFyIFNjYWxhSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3NjYWxhX2hpZ2hsaWdodF9ydWxlcyIpLlNjYWxhSGlnaGxpZ2h0UnVsZXM7Cgp2YXIgTW9kZSA9IGZ1bmN0aW9uKCkgewogICAgSmF2YVNjcmlwdE1vZGUuY2FsbCh0aGlzKTsKICAgIAogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgU2NhbGFIaWdobGlnaHRSdWxlcygpLmdldFJ1bGVzKCkpOwp9Owpvb3AuaW5oZXJpdHMoTW9kZSwgSmF2YVNjcmlwdE1vZGUpOwoKKGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuY3JlYXRlV29ya2VyID0gZnVuY3Rpb24oc2Vzc2lvbikgewogICAgICAgIHJldHVybiBudWxsOwogICAgfTsKCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOwoKZXhwb3J0cy5Nb2RlID0gTW9kZTsKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvamF2YXNjcmlwdCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dCcsICdhY2UvdG9rZW5pemVyJywgJ2FjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCAnYWNlL3JhbmdlJywgJ2FjZS93b3JrZXIvd29ya2VyX2NsaWVudCcsICdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOwp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOwp2YXIgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIpLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlczsKdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gcmVxdWlyZSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQ7CnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uL3JhbmdlIikuUmFuZ2U7CnZhciBXb3JrZXJDbGllbnQgPSByZXF1aXJlKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudDsKdmFyIENzdHlsZUJlaGF2aW91ciA9IHJlcXVpcmUoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cjsKdmFyIENTdHlsZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlOwoKdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcygpLmdldFJ1bGVzKCkpOwogICAgdGhpcy4kb3V0ZGVudCA9IG5ldyBNYXRjaGluZ0JyYWNlT3V0ZGVudCgpOwogICAgdGhpcy4kYmVoYXZpb3VyID0gbmV3IENzdHlsZUJlaGF2aW91cigpOwogICAgdGhpcy5mb2xkaW5nUnVsZXMgPSBuZXcgQ1N0eWxlRm9sZE1vZGUoKTsKfTsKb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsKCihmdW5jdGlvbigpIHsKCgogICAgdGhpcy50b2dnbGVDb21tZW50TGluZXMgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCBzdGFydFJvdywgZW5kUm93KSB7CiAgICAgICAgdmFyIG91dGRlbnQgPSB0cnVlOwogICAgICAgIHZhciByZSA9IC9eKFxzKilcL1wvLzsKCiAgICAgICAgZm9yICh2YXIgaT1zdGFydFJvdzsgaTw9IGVuZFJvdzsgaSsrKSB7CiAgICAgICAgICAgIGlmICghcmUudGVzdChkb2MuZ2V0TGluZShpKSkpIHsKICAgICAgICAgICAgICAgIG91dGRlbnQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAob3V0ZGVudCkgewogICAgICAgICAgICB2YXIgZGVsZXRlUmFuZ2UgPSBuZXcgUmFuZ2UoMCwgMCwgMCwgMCk7CiAgICAgICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShpKTsKICAgICAgICAgICAgICAgIHZhciBtID0gbGluZS5tYXRjaChyZSk7CiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5zdGFydC5yb3cgPSBpOwogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLnJvdyA9IGk7CiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQuY29sdW1uID0gbVswXS5sZW5ndGg7CiAgICAgICAgICAgICAgICBkb2MucmVwbGFjZShkZWxldGVSYW5nZSwgbVsxXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGRvYy5pbmRlbnRSb3dzKHN0YXJ0Um93LCBlbmRSb3csICIvLyIpOwogICAgICAgIH0KICAgIH07CgogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsKICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KGxpbmUpOwoKICAgICAgICB2YXIgdG9rZW5pemVkTGluZSA9IHRoaXMuJHRva2VuaXplci5nZXRMaW5lVG9rZW5zKGxpbmUsIHN0YXRlKTsKICAgICAgICB2YXIgdG9rZW5zID0gdG9rZW5pemVkTGluZS50b2tlbnM7CiAgICAgICAgdmFyIGVuZFN0YXRlID0gdG9rZW5pemVkTGluZS5zdGF0ZTsKCiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggJiYgdG9rZW5zW3Rva2Vucy5sZW5ndGgtMV0udHlwZSA9PSAiY29tbWVudCIpIHsKICAgICAgICAgICAgcmV0dXJuIGluZGVudDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKHN0YXRlID09ICJzdGFydCIgfHwgc3RhdGUgPT0gInJlZ2V4X2FsbG93ZWQiKSB7CiAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14uKig/OlxiY2FzZVxiLipcOnxbXHtcKFxbXSlccyokLyk7CiAgICAgICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gImRvYy1zdGFydCIpIHsKICAgICAgICAgICAgaWYgKGVuZFN0YXRlID09ICJzdGFydCIgfHwgc3RhdGUgPT0gInJlZ2V4X2FsbG93ZWQiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXlxzKihcLz8pXCovKTsKICAgICAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgICAgICBpZiAobWF0Y2hbMV0pIHsKICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gIiAiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaW5kZW50ICs9ICIqICI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBpbmRlbnQ7CiAgICB9OwoKICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsKICAgIH07CgogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgewogICAgICAgIHRoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoZG9jLCByb3cpOwogICAgfTsKICAgIAogICAgdGhpcy5jcmVhdGVXb3JrZXIgPSBmdW5jdGlvbihzZXNzaW9uKSB7CiAgICAgICAgdmFyIHdvcmtlciA9IG5ldyBXb3JrZXJDbGllbnQoWyJhY2UiXSwgIndvcmtlci1qYXZhc2NyaXB0LmpzIiwgImFjZS9tb2RlL2phdmFzY3JpcHRfd29ya2VyIiwgIkphdmFTY3JpcHRXb3JrZXIiKTsKICAgICAgICB3b3JrZXIuYXR0YWNoVG9Eb2N1bWVudChzZXNzaW9uLmdldERvY3VtZW50KCkpOwogICAgICAgICAgICAKICAgICAgICB3b3JrZXIub24oImpzbGludCIsIGZ1bmN0aW9uKHJlc3VsdHMpIHsKICAgICAgICAgICAgdmFyIGVycm9ycyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8cmVzdWx0cy5kYXRhLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSByZXN1bHRzLmRhdGFbaV07CiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpCiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGVycm9yLmxpbmUtMSwKICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBlcnJvci5jaGFyYWN0ZXItMSwKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogZXJyb3IucmVhc29uLAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAid2FybmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbnQ6IGVycm9yCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2Vzc2lvbi5zZXRBbm5vdGF0aW9ucyhlcnJvcnMpOwogICAgICAgIH0pOwogICAgICAgIAogICAgICAgIHdvcmtlci5vbigibmFyY2lzc3VzIiwgZnVuY3Rpb24oZSkgewogICAgICAgICAgICBzZXNzaW9uLnNldEFubm90YXRpb25zKFtlLmRhdGFdKTsKICAgICAgICB9KTsKICAgICAgICAKICAgICAgICB3b3JrZXIub24oInRlcm1pbmF0ZSIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBzZXNzaW9uLmNsZWFyQW5ub3RhdGlvbnMoKTsKICAgICAgICB9KTsKICAgICAgICAKICAgICAgICByZXR1cm4gd29ya2VyOwogICAgfTsKCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOwoKZXhwb3J0cy5Nb2RlID0gTW9kZTsKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICogICAgICBNaWhhaSBTdWNhbiA8bWloYWkgRE9UIHN1Y2FuIEFUIGdtYWlsIERPVCBjb20+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL3VuaWNvZGUnLCAnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7CnZhciB1bmljb2RlID0gcmVxdWlyZSgiLi4vdW5pY29kZSIpOwp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM7CnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOwoKdmFyIEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgewoKICAgIC8vIHNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMKICAgIHZhciBnbG9iYWxzID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAvLyBDb25zdHJ1Y3RvcnMKICAgICAgICAoIkFycmF5fEJvb2xlYW58RGF0ZXxGdW5jdGlvbnxJdGVyYXRvcnxOdW1iZXJ8T2JqZWN0fFJlZ0V4cHxTdHJpbmd8UHJveHl8IiArCiAgICAgIC8vIEU0WAogICAgICAgICAiTmFtZXNwYWNlfFFOYW1lfFhNTHxYTUxMaXN0fCIgKwogICAgICAgICAiQXJyYXlCdWZmZXJ8RmxvYXQzMkFycmF5fEZsb2F0NjRBcnJheXxJbnQxNkFycmF5fEludDMyQXJyYXl8SW50OEFycmF5fCIgKwogICAgICAgICAiVWludDE2QXJyYXl8VWludDMyQXJyYXl8VWludDhBcnJheXxVaW50OENsYW1wZWRBcnJheXwiICsKICAgICAgLy8gRXJyb3JzCiAgICAgICAgIkVycm9yfEV2YWxFcnJvcnxJbnRlcm5hbEVycm9yfFJhbmdlRXJyb3J8UmVmZXJlbmNlRXJyb3J8U3RvcEl0ZXJhdGlvbnwiICsKICAgICAgICAiU3ludGF4RXJyb3J8VHlwZUVycm9yfFVSSUVycm9yfCIgKwogICAgICAvLyAgTm9uLWNvbnN0cnVjdG9yIGZ1bmN0aW9ucwogICAgICAgICJkZWNvZGVVUkl8ZGVjb2RlVVJJQ29tcG9uZW50fGVuY29kZVVSSXxlbmNvZGVVUklDb21wb25lbnR8ZXZhbHxpc0Zpbml0ZXwiICsKICAgICAgICAiaXNOYU58cGFyc2VGbG9hdHxwYXJzZUludHwiICsKICAgICAgLy8gT3RoZXIKICAgICAgICAiSlNPTnxNYXRofCIgKwogICAgICAvLyBQc2V1ZG8KICAgICAgICAidGhpc3xhcmd1bWVudHN8cHJvdG90eXBlfHdpbmRvd3xkb2N1bWVudCIKICAgICAgKS5zcGxpdCgifCIpCiAgICApOwoKICAgIHZhciBrZXl3b3JkcyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoImJyZWFrfGNhc2V8Y2F0Y2h8Y29udGludWV8ZGVmYXVsdHxkZWxldGV8ZG98ZWxzZXxmaW5hbGx5fGZvcnxmdW5jdGlvbnwiICsKICAgICAgICAiaWZ8aW58aW5zdGFuY2VvZnxuZXd8cmV0dXJufHN3aXRjaHx0aHJvd3x0cnl8dHlwZW9mfGxldHx2YXJ8d2hpbGV8d2l0aHwiICsKICAgICAgICAiY29uc3R8eWllbGR8aW1wb3J0fGdldHxzZXQiKS5zcGxpdCgifCIpCiAgICApOwoKICAgIC8vIGtleXdvcmRzIHdoaWNoIGNhbiBiZSBmb2xsb3dlZCBieSByZWd1bGFyIGV4cHJlc3Npb25zCiAgICB2YXIga3dCZWZvcmVSZSA9ICJjYXNlfGRvfGVsc2V8ZmluYWxseXxpbnxpbnN0YW5jZW9mfHJldHVybnx0aHJvd3x0cnl8dHlwZW9mfHlpZWxkIjsKCiAgICB2YXIgZGVwcmVjYXRlZCA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoIl9fcGFyZW50X198X19jb3VudF9ffGVzY2FwZXx1bmVzY2FwZXx3aXRofF9fcHJvdG9fXyIpLnNwbGl0KCJ8IikKICAgICk7CgogICAgdmFyIGRlZmluaXRpb25zID0gbGFuZy5hcnJheVRvTWFwKCgiY29uc3R8bGV0fHZhcnxmdW5jdGlvbiIpLnNwbGl0KCJ8IikpOwoKICAgIHZhciBidWlsZGluQ29uc3RhbnRzID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgibnVsbHxJbmZpbml0eXxOYU58dW5kZWZpbmVkIikuc3BsaXQoInwiKQogICAgKTsKCiAgICB2YXIgZnV0dXJlUmVzZXJ2ZWQgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCJjbGFzc3xlbnVtfGV4dGVuZHN8c3VwZXJ8ZXhwb3J0fGltcGxlbWVudHN8cHJpdmF0ZXwiICsKICAgICAgICAicHVibGljfGludGVyZmFjZXxwYWNrYWdlfHByb3RlY3RlZHxzdGF0aWMiKS5zcGxpdCgifCIpCiAgICApOwoKICAgIC8vIFRPRE86IFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcwogICAgdmFyIGlkZW50aWZpZXJSZSA9ICJbIiArIHVuaWNvZGUucGFja2FnZXMuTCArICJcXCRfXVsiIAogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5MCiAgICAgICAgKyB1bmljb2RlLnBhY2thZ2VzLk1uICsgdW5pY29kZS5wYWNrYWdlcy5NYwogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5OZAogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5QYyArICJcXCRfXSpcXGIiOwogICAgICAgIAogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBVc2UgKD86KSBpbnN0ZWFkLgogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZAoKICAgIHRoaXMuJHJ1bGVzID0gewogICAgICAgICJzdGFydCIgOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwvLiokIgogICAgICAgICAgICB9LAogICAgICAgICAgICBuZXcgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzKCkuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudAogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwKICAgICAgICAgICAgICAgIG5leHQgOiAiY29tbWVudCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUKICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0CiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0uKlxcXFwkJywKICAgICAgICAgICAgICAgIG5leHQgOiAicXFzdHJpbmciCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydAogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddLipcXFxcJCIsCiAgICAgICAgICAgICAgICBuZXh0IDogInFzdHJpbmciCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBoZXgKICAgICAgICAgICAgICAgIHJlZ2V4IDogIjBbeFhdWzAtOWEtZkEtRl0rXFxiIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6IFsia2V5d29yZC5kZWZpbml0aW9uIiwgInRleHQiLCAiZW50aXR5Lm5hbWUuZnVuY3Rpb24iXSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIihmdW5jdGlvbikoXFxzKykoIiArIGlkZW50aWZpZXJSZSArICIpIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5sYW5ndWFnZS5ib29sZWFuIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/OnRydWV8ZmFsc2UpXFxiIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIig/OiIgKyBrd0JlZm9yZVJlICsgIilcXGIiLAogICAgICAgICAgICAgICAgbmV4dCA6ICJyZWdleF9hbGxvd2VkIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGdsb2JhbHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInZhcmlhYmxlLmxhbmd1YWdlIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZXByZWNhdGVkLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkLmRlcHJlY2F0ZWQiOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlZmluaXRpb25zLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkLmRlZmluaXRpb24iOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleXdvcmRzLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidWlsZGluQ29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZnV0dXJlUmVzZXJ2ZWQuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWQuaWxsZWdhbCI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPT0gImRlYnVnZ2VyIikKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkLmRlcHJlY2F0ZWQiOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpZGVudGlmaWVyIjsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICByZWdleCA6IGlkZW50aWZpZXJSZQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIiF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT09fD09fD18IT18IT09fDw9fD49fDw8PXw+Pj18Pj4+PXw8Pnw8fD58IXwmJnxcXHxcXHx8XFw/XFw6fFxcKj18JT18XFwrPXxcXC09fCY9fFxcXj18XFxiKD86aW58aW5zdGFuY2VvZnxuZXd8ZGVsZXRlfHR5cGVvZnx2b2lkKSIsCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwdW5jdHVhdGlvbi5vcGVyYXRvciIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXD98XFw6fFxcLHxcXDt8XFwuIiwKICAgICAgICAgICAgICAgIG5leHQgIDogInJlZ2V4X2FsbG93ZWQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLmxwYXJlbiIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJbWyh7XSIsCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5ycGFyZW4iLAogICAgICAgICAgICAgICAgcmVnZXggOiAiW1xcXSl9XSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC89PyIsCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbjogImNvbW1lbnQiLAogICAgICAgICAgICAgICAgcmVnZXg6ICJeIyEuKiQiIAogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgIC8vIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIG9ubHkgYWxsb3dlZCBhZnRlciBjZXJ0YWluIHRva2Vucy4gVGhpcwogICAgICAgIC8vIG1ha2VzIHN1cmUgd2UgZG9uJ3QgbWl4IHVwIHJlZ2V4cHMgd2l0aCB0aGUgZGl2aXNvbiBvcGVyYXRvcgogICAgICAgICJyZWdleF9hbGxvd2VkIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50CiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLAogICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50X3JlZ2V4X2FsbG93ZWQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwvLiokIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAiLAogICAgICAgICAgICAgICAgcmVnZXg6ICJcXC8iLAogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4IiwKICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFxzKyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHkgcmV0dXJuIHRvIHRoZSBzdGFydCBtb2RlIHdpdGhvdXQgbWF0Y2hpbmcKICAgICAgICAgICAgICAgIC8vIGFueXRoaW5nCiAgICAgICAgICAgICAgICB0b2tlbjogImVtcHR5IiwgCiAgICAgICAgICAgICAgICByZWdleDogIiIsCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJyZWdleCI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW46ICJyZWdleHAua2V5d29yZC5vcGVyYXRvciIsCiAgICAgICAgICAgICAgICByZWdleDogIlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIiwKICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleCIKICAgICAgICAgICAgfSwgewoJCQkJLy8gZmxhZwogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwIiwgCiAgICAgICAgICAgICAgICByZWdleDogIi9cXHcqIiwKICAgICAgICAgICAgICAgIG5leHQ6ICJzdGFydCIsCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZSAKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwIiwKICAgICAgICAgICAgICAgIHJlZ2V4OiAiW15cXFxcL1xcW10rIiwKICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleCIsCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwKICAgICAgICAgICAgICAgIHJlZ2V4OiAiXFxbIiwKICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiLAogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW46ICJlbXB0eSIsIAogICAgICAgICAgICAgICAgcmVnZXg6ICIiLAogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0IiAKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW46ICJyZWdleHAua2V5d29yZC5vcGVyYXRvciIsCiAgICAgICAgICAgICAgICByZWdleDogIlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIiwKICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLAogICAgICAgICAgICAgICAgcmVnZXg6ICJdIiwKICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleCIsCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwKICAgICAgICAgICAgICAgIHJlZ2V4OiAiW15cXFxcXFxdXSsiLAogICAgICAgICAgICAgICAgbmV4dDogInJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyIsCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbjogImVtcHR5IiwgCiAgICAgICAgICAgICAgICByZWdleDogIiIsCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiIAogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiY29tbWVudF9yZWdleF9hbGxvd2VkIiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudAogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIG5leHQgOiAicmVnZXhfYWxsb3dlZCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNvbW1lbnQgc3Bhbm5pbmcgd2hvbGUgbGluZQogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAiLisiCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJjb21tZW50IiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudAogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIgogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAicXFzdHJpbmciIDogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgcmVnZXggOiAnKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqPyInLAogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJwogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAicXN0cmluZyIgOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgICAgICByZWdleCA6ICIoPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/JyIsCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAnLisnCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9OwogICAgCiAgICB0aGlzLmVtYmVkUnVsZXMoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLCAiZG9jLSIsCiAgICAgICAgWyBuZXcgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzKCkuZ2V0RW5kUnVsZSgic3RhcnQiKSBdKTsKfTsKCm9vcC5pbmhlcml0cyhKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7CgpleHBvcnRzLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyA9IEphdmFTY3JpcHRIaWdobGlnaHRSdWxlczsKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7Cgp2YXIgRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7CgogICAgdGhpcy4kcnVsZXMgPSB7CiAgICAgICAgInN0YXJ0IiA6IFsgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYy50YWciLAogICAgICAgICAgICByZWdleCA6ICJAW1xcd1xcZF9dKyIgLy8gVE9ETzogZml4IGVtYWlsIGFkZHJlc3NlcwogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlxccysiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiVE9ETyIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICJbXkBcXCpdKyIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICIuIgogICAgICAgIH1dCiAgICB9Owp9OwoKb29wLmluaGVyaXRzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmdldFN0YXJ0UnVsZSA9IGZ1bmN0aW9uKHN0YXJ0KSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLCAvLyBkb2MgY29tbWVudAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKig/PVxcKikiLAogICAgICAgICAgICBuZXh0ICA6IHN0YXJ0CiAgICAgICAgfTsKICAgIH07CiAgICAKICAgIHRoaXMuZ2V0RW5kUnVsZSA9IGZ1bmN0aW9uIChzdGFydCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gY2xvc2luZyBjb21tZW50CiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiXFwqXFwvIiwKICAgICAgICAgICAgbmV4dCAgOiBzdGFydAogICAgICAgIH07CiAgICB9OwoKfSkuY2FsbChEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMucHJvdG90eXBlKTsKCmV4cG9ydHMuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzID0gRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzOwoKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOwoKdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gZnVuY3Rpb24oKSB7fTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKGxpbmUsIGlucHV0KSB7CiAgICAgICAgaWYgKCEgL15ccyskLy50ZXN0KGxpbmUpKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgIHJldHVybiAvXlxzKlx9Ly50ZXN0KGlucHV0KTsKICAgIH07CgogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKGRvYywgcm93KSB7CiAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShyb3cpOwogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMqXH0pLyk7CgogICAgICAgIGlmICghbWF0Y2gpIHJldHVybiAwOwoKICAgICAgICB2YXIgY29sdW1uID0gbWF0Y2hbMV0ubGVuZ3RoOwogICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBkb2MuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiByb3csIGNvbHVtbjogY29sdW1ufSk7CgogICAgICAgIGlmICghb3BlbkJyYWNlUG9zIHx8IG9wZW5CcmFjZVBvcy5yb3cgPT0gcm93KSByZXR1cm4gMDsKCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChkb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7CiAgICAgICAgZG9jLnJlcGxhY2UobmV3IFJhbmdlKHJvdywgMCwgcm93LCBjb2x1bW4tMSksIGluZGVudCk7CiAgICB9OwoKICAgIHRoaXMuJGdldEluZGVudCA9IGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKykvKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICIiOwogICAgfTsKCn0pLmNhbGwoTWF0Y2hpbmdCcmFjZU91dGRlbnQucHJvdG90eXBlKTsKCmV4cG9ydHMuTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBNYXRjaGluZ0JyYWNlT3V0ZGVudDsKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL3dvcmtlci93b3JrZXJfY2xpZW50JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2V2ZW50X2VtaXR0ZXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCIuLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsKCnZhciBXb3JrZXJDbGllbnQgPSBmdW5jdGlvbih0b3BMZXZlbE5hbWVzcGFjZXMsIHBhY2thZ2VkSnMsIG1vZCwgY2xhc3NuYW1lKSB7CgogICAgdGhpcy5jaGFuZ2VMaXN0ZW5lciA9IHRoaXMuY2hhbmdlTGlzdGVuZXIuYmluZCh0aGlzKTsKCiAgICBpZiAobW9kdWxlLnBhY2thZ2VkKSB7CiAgICAgICAgdmFyIGJhc2UgPSB0aGlzLiRndWVzc0Jhc2VQYXRoKCk7CiAgICAgICAgdGhpcy4kd29ya2VyID0gbmV3IFdvcmtlcihiYXNlICsgcGFja2FnZWRKcyk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICB2YXIgd29ya2VyVXJsID0gdGhpcy4kbm9ybWFsaXplUGF0aChyZXF1aXJlLm5hbWVUb1VybCgiYWNlL3dvcmtlci93b3JrZXIiLCBudWxsLCAiXyIpKTsKICAgICAgICB0aGlzLiR3b3JrZXIgPSBuZXcgV29ya2VyKHdvcmtlclVybCk7CgogICAgICAgIHZhciB0bG5zID0ge307CiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRvcExldmVsTmFtZXNwYWNlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgbnMgPSB0b3BMZXZlbE5hbWVzcGFjZXNbaV07CiAgICAgICAgICAgIHZhciBwYXRoID0gdGhpcy4kbm9ybWFsaXplUGF0aChyZXF1aXJlLm5hbWVUb1VybChucywgbnVsbCwgIl8iKS5yZXBsYWNlKC8uanMkLywgIiIpKTsKCiAgICAgICAgICAgIHRsbnNbbnNdID0gcGF0aDsKICAgICAgICB9CiAgICB9CgogICAgdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHsKICAgICAgICBpbml0IDogdHJ1ZSwKICAgICAgICB0bG5zOiB0bG5zLAogICAgICAgIG1vZHVsZTogbW9kLAogICAgICAgIGNsYXNzbmFtZTogY2xhc3NuYW1lCiAgICB9KTsKCiAgICB0aGlzLmNhbGxiYWNrSWQgPSAxOwogICAgdGhpcy5jYWxsYmFja3MgPSB7fTsKCiAgICB2YXIgX3NlbGYgPSB0aGlzOwogICAgdGhpcy4kd29ya2VyLm9uZXJyb3IgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgd2luZG93LmNvbnNvbGUgJiYgY29uc29sZS5sb2cgJiYgY29uc29sZS5sb2coZSk7CiAgICAgICAgdGhyb3cgZTsKICAgIH07CiAgICB0aGlzLiR3b3JrZXIub25tZXNzYWdlID0gZnVuY3Rpb24oZSkgewogICAgICAgIHZhciBtc2cgPSBlLmRhdGE7CiAgICAgICAgc3dpdGNoKG1zZy50eXBlKSB7CiAgICAgICAgICAgIGNhc2UgImxvZyI6CiAgICAgICAgICAgICAgICB3aW5kb3cuY29uc29sZSAmJiBjb25zb2xlLmxvZyAmJiBjb25zb2xlLmxvZyhtc2cuZGF0YSk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgImV2ZW50IjoKICAgICAgICAgICAgICAgIF9zZWxmLl9lbWl0KG1zZy5uYW1lLCB7ZGF0YTogbXNnLmRhdGF9KTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAiY2FsbCI6CiAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBfc2VsZi5jYWxsYmFja3NbbXNnLmlkXTsKICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1zZy5kYXRhKTsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgX3NlbGYuY2FsbGJhY2tzW21zZy5pZF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9Owp9OwoKKGZ1bmN0aW9uKCl7CgogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOwoKICAgIHRoaXMuJG5vcm1hbGl6ZVBhdGggPSBmdW5jdGlvbihwYXRoKSB7CiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXlthLXpdKzpcL1wvW15cL10rXC8vLCAiIik7IC8vIFJlbW92ZSBkb21haW4gbmFtZSBhbmQgcmVidWlsZCBpdAogICAgICAgIHBhdGggPSBsb2NhdGlvbi5wcm90b2NvbCArICIvLyIgKyBsb2NhdGlvbi5ob3N0CiAgICAgICAgICAgIC8vIHBhdGhzIHN0YXJ0aW5nIHdpdGggYSBzbGFzaCBhcmUgcmVsYXRpdmUgdG8gdGhlIHJvb3QgKGhvc3QpCiAgICAgICAgICAgICsgKHBhdGguY2hhckF0KDApID09ICIvIiA/ICIiIDogbG9jYXRpb24ucGF0aG5hbWUucmVwbGFjZSgvXC9bXlwvXSokLywgIiIpKQogICAgICAgICAgICArICIvIiArIHBhdGgucmVwbGFjZSgvXltcL10rLywgIiIpOwogICAgICAgIHJldHVybiBwYXRoOwogICAgfTsKCiAgICB0aGlzLiRndWVzc0Jhc2VQYXRoID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHJlcXVpcmUuYWNlQmFzZVVybCkKICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmUuYWNlQmFzZVVybDsKCiAgICAgICAgdmFyIHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7CiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHNjcmlwdHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIHNjcmlwdCA9IHNjcmlwdHNbaV07CgogICAgICAgICAgICB2YXIgYmFzZSA9IHNjcmlwdC5nZXRBdHRyaWJ1dGUoImRhdGEtYWNlLWJhc2UiKTsKICAgICAgICAgICAgaWYgKGJhc2UpCiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5yZXBsYWNlKC9cLyokLywgIi8iKTsKCiAgICAgICAgICAgIHZhciBzcmMgPSBzY3JpcHQuc3JjIHx8IHNjcmlwdC5nZXRBdHRyaWJ1dGUoInNyYyIpOwogICAgICAgICAgICBpZiAoIXNyYykgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIG0gPSBzcmMubWF0Y2goL14oPzooLipcLylhY2VcLmpzfCguKlwvKWFjZSgtdW5jb21wcmVzc2VkKT8oLW5vY29uZmxpY3QpP1wuanMpKD86XD98JCkvKTsKICAgICAgICAgICAgaWYgKG0pCiAgICAgICAgICAgICAgICByZXR1cm4gbVsxXSB8fCBtWzJdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gIiI7CiAgICB9OwoKICAgIHRoaXMudGVybWluYXRlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fZW1pdCgidGVybWluYXRlIiwge30pOwogICAgICAgIHRoaXMuJHdvcmtlci50ZXJtaW5hdGUoKTsKICAgICAgICB0aGlzLiR3b3JrZXIgPSBudWxsOwogICAgICAgIHRoaXMuJGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKICAgICAgICB0aGlzLiRkb2MgPSBudWxsOwogICAgfTsKCiAgICB0aGlzLnNlbmQgPSBmdW5jdGlvbihjbWQsIGFyZ3MpIHsKICAgICAgICB0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2NvbW1hbmQ6IGNtZCwgYXJnczogYXJnc30pOwogICAgfTsKCiAgICB0aGlzLmNhbGwgPSBmdW5jdGlvbihjbWQsIGFyZ3MsIGNhbGxiYWNrKSB7CiAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciBpZCA9IHRoaXMuY2FsbGJhY2tJZCsrOwogICAgICAgICAgICB0aGlzLmNhbGxiYWNrc1tpZF0gPSBjYWxsYmFjazsKICAgICAgICAgICAgYXJncy5wdXNoKGlkKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5zZW5kKGNtZCwgYXJncyk7CiAgICB9OwoKICAgIHRoaXMuZW1pdCA9IGZ1bmN0aW9uKGV2ZW50LCBkYXRhKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgLy8gZmlyZWZveCByZWZ1c2VzIHRvIGNsb25lIG9iamVjdHMgd2hpY2ggaGF2ZSBmdW5jdGlvbiBwcm9wZXJ0aWVzCiAgICAgICAgICAgIC8vIFRPRE86IGNsZWFudXAgZXZlbnQKICAgICAgICAgICAgdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtldmVudDogZXZlbnQsIGRhdGE6IHtkYXRhOiBkYXRhLmRhdGF9fSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoKGV4KSB7fQogICAgfTsKCiAgICB0aGlzLmF0dGFjaFRvRG9jdW1lbnQgPSBmdW5jdGlvbihkb2MpIHsKICAgICAgICBpZih0aGlzLiRkb2MpCiAgICAgICAgICAgIHRoaXMudGVybWluYXRlKCk7CgogICAgICAgIHRoaXMuJGRvYyA9IGRvYzsKICAgICAgICB0aGlzLmNhbGwoInNldFZhbHVlIiwgW2RvYy5nZXRWYWx1ZSgpXSk7CiAgICAgICAgZG9jLm9uKCJjaGFuZ2UiLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKICAgIH07CgogICAgdGhpcy5jaGFuZ2VMaXN0ZW5lciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICBlLnJhbmdlID0gewogICAgICAgICAgICBzdGFydDogZS5kYXRhLnJhbmdlLnN0YXJ0LAogICAgICAgICAgICBlbmQ6IGUuZGF0YS5yYW5nZS5lbmQKICAgICAgICB9OwogICAgICAgIHRoaXMuZW1pdCgiY2hhbmdlIiwgZSk7CiAgICB9OwoKfSkuY2FsbChXb3JrZXJDbGllbnQucHJvdG90eXBlKTsKCmV4cG9ydHMuV29ya2VyQ2xpZW50ID0gV29ya2VyQ2xpZW50OwoKfSk7Ci8qIHZpbTp0cz00OnN0cz00OnN3PTQ6CiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgQ2hyaXMgU3BlbmNlciA8Y2hyaXMuYWcuc3BlbmNlciBBVCBnb29nbGVtYWlsIERPVCBjb20+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL2JlaGF2aW91ciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsKdmFyIEJlaGF2aW91ciA9IHJlcXVpcmUoJy4uL2JlaGF2aW91cicpLkJlaGF2aW91cjsKCnZhciBDc3R5bGVCZWhhdmlvdXIgPSBmdW5jdGlvbiAoKSB7CgogICAgdGhpcy5hZGQoImJyYWNlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7CiAgICAgICAgaWYgKHRleHQgPT0gJ3snKSB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7CiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3snICsgc2VsZWN0ZWQgKyAnfScsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAne30nLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJ30nKSB7CiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9JykgewogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCd9Jywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOwogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICJcbiIpIHsKICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOwogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7CiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7CiAgICAgICAgICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gc2Vzc2lvbi5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IGN1cnNvci5yb3csIGNvbHVtbjogY3Vyc29yLmNvbHVtbiArIDF9KTsKICAgICAgICAgICAgICAgIGlmICghb3BlbkJyYWNlUG9zKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKCiAgICAgICAgICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy5nZXROZXh0TGluZUluZGVudChzdGF0ZSwgbGluZS5zdWJzdHJpbmcoMCwgbGluZS5sZW5ndGggLSAxKSwgc2Vzc2lvbi5nZXRUYWJTdHJpbmcoKSk7CiAgICAgICAgICAgICAgICB2YXIgbmV4dF9pbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoc2Vzc2lvbi5kb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnXG4nICsgaW5kZW50ICsgJ1xuJyArIG5leHRfaW5kZW50LAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIGluZGVudC5sZW5ndGgsIDEsIGluZGVudC5sZW5ndGhdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCiAgICB0aGlzLmFkZCgiYnJhY2VzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsKICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOwogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAneycpIHsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7CiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5lbmQuY29sdW1uLCByYW5nZS5lbmQuY29sdW1uICsgMSk7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsKICAgICAgICBpZiAodGV4dCA9PSAnKCcpIHsKICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOwogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsKICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCcgKyBzZWxlY3RlZCArICcpJywKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcoKScsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnKScpIHsKICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOwogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7CiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7CiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hpbmcgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQoJyknLCB7Y29sdW1uOiBjdXJzb3IuY29sdW1uICsgMSwgcm93OiBjdXJzb3Iucm93fSk7CiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmcgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsKICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOwogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnKCcpIHsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7CiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4gKyAxLCByYW5nZS5zdGFydC5jb2x1bW4gKyAyKTsKICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnKScpIHsKICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsKICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7CiAgICAgICAgaWYgKHRleHQgPT0gJyInKSB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7CiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJyInICsgc2VsZWN0ZWQgKyAnIicsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOwogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICAgICAgdmFyIGxlZnRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbi0xLCBjdXJzb3IuY29sdW1uKTsKCiAgICAgICAgICAgICAgICAvLyBXZSdyZSBlc2NhcGVkLgogICAgICAgICAgICAgICAgaWYgKGxlZnRDaGFyID09ICdcXCcpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBGaW5kIHdoYXQgdG9rZW4gd2UncmUgaW5zaWRlLgogICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHNlc3Npb24uZ2V0VG9rZW5zKHNlbGVjdGlvbi5zdGFydC5yb3csIHNlbGVjdGlvbi5zdGFydC5yb3cpWzBdLnRva2VuczsKICAgICAgICAgICAgICAgIHZhciBjb2wgPSAwLCB0b2tlbjsKICAgICAgICAgICAgICAgIHZhciBxdW90ZXBvcyA9IC0xOyAvLyBUcmFjayB3aGV0aGVyIHdlJ3JlIGluc2lkZSBhbiBvcGVuIHF1b3RlLgoKICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgdG9rZW5zLmxlbmd0aDsgeCsrKSB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbeF07CiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gLTE7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxdW90ZXBvcyA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gdG9rZW4udmFsdWUuaW5kZXhPZignIicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoKHRva2VuLnZhbHVlLmxlbmd0aCArIGNvbCkgPiBzZWxlY3Rpb24uc3RhcnQuY29sdW1uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb2wgKz0gdG9rZW5zW3hdLnZhbHVlLmxlbmd0aDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBUcnkgYW5kIGJlIHNtYXJ0IGFib3V0IHdoZW4gd2UgYXV0byBpbnNlcnQuCiAgICAgICAgICAgICAgICBpZiAoIXRva2VuIHx8IChxdW90ZXBvcyA8IDAgJiYgdG9rZW4udHlwZSAhPT0gImNvbW1lbnQiICYmICh0b2tlbi50eXBlICE9PSAic3RyaW5nIiB8fCAoKHNlbGVjdGlvbi5zdGFydC5jb2x1bW4gIT09IHRva2VuLnZhbHVlLmxlbmd0aCtjb2wtMSkgJiYgdG9rZW4udmFsdWUubGFzdEluZGV4T2YoJyInKSA9PT0gdG9rZW4udmFsdWUubGVuZ3RoLTEpKSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIiInLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLDFdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiAmJiB0b2tlbi50eXBlID09PSAic3RyaW5nIikgewogICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpbnB1dCBhbmQgbW92ZSByaWdodCBvbmUgaWYgd2UncmUgdHlwaW5nIG92ZXIgdGhlIGNsb3NpbmcgcXVvdGUuCiAgICAgICAgICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICciJykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsKICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOwogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnIicpIHsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7CiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4gKyAxLCByYW5nZS5zdGFydC5jb2x1bW4gKyAyKTsKICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsKICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsKICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfQpvb3AuaW5oZXJpdHMoQ3N0eWxlQmVoYXZpb3VyLCBCZWhhdmlvdXIpOwoKZXhwb3J0cy5Dc3R5bGVCZWhhdmlvdXIgPSBDc3R5bGVCZWhhdmlvdXI7Cn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9yYW5nZScsICdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZTsKdmFyIEJhc2VGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGU7Cgp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsKb29wLmluaGVyaXRzKEZvbGRNb2RlLCBCYXNlRm9sZE1vZGUpOwoKKGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyID0gLyhce3xcWylbXlx9XF1dKiR8XlxzKihcL1wqKS87CiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gL15bXlxbXHtdKihcfXxcXSl8Xltcc1wqXSooXCpcLykvOwogICAgCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7CiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleDsKCiAgICAgICAgICAgIGlmIChtYXRjaFsxXSkKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soc2Vzc2lvbiwgbWF0Y2hbMV0sIHJvdywgaSk7CgogICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpICsgbWF0Y2hbMF0ubGVuZ3RoKTsKICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbiAtPSAyOwogICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoZm9sZFN0eWxlICE9PSAibWFya2JlZ2luZW5kIikKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIpOwogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICB2YXIgaSA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoOwoKICAgICAgICAgICAgaWYgKG1hdGNoWzJdKSB7CiAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZXNzaW9uLmdldENvbW1lbnRGb2xkUmFuZ2Uocm93LCBpKTsKICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsKICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGVuZCA9IHtyb3c6IHJvdywgY29sdW1uOiBpfTsKICAgICAgICAgICAgdmFyIHN0YXJ0ID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KG1hdGNoWzFdLCBlbmQpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKCFzdGFydCkKICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgICAgIHN0YXJ0LmNvbHVtbisrOwogICAgICAgICAgICBlbmQuY29sdW1uLS07CgogICAgICAgICAgICByZXR1cm4gIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7CiAgICAgICAgfQogICAgfTsKICAgIAp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7Cgp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7Cgp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG51bGw7CiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gbnVsbDsKCiAgICAvLyBtdXN0IHJldHVybiAiIiBpZiB0aGVyZSdzIG5vIGZvbGQsIHRvIGVuYWJsZSBjYWNoaW5nCiAgICB0aGlzLmdldEZvbGRXaWRnZXQgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgaWYgKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QobGluZSkpCiAgICAgICAgICAgIHJldHVybiAic3RhcnQiOwogICAgICAgIGlmIChmb2xkU3R5bGUgPT0gIm1hcmtiZWdpbmVuZCIKICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIKICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChsaW5lKSkKICAgICAgICAgICAgcmV0dXJuICJlbmQiOwogICAgICAgIHJldHVybiAiIjsKICAgIH07CiAgICAKICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH07CgogICAgdGhpcy5pbmRlbnRhdGlvbkJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgcm93LCBjb2x1bW4pIHsKICAgICAgICB2YXIgcmUgPSAvXlxzKi87CiAgICAgICAgdmFyIHN0YXJ0Um93ID0gcm93OwogICAgICAgIHZhciBlbmRSb3cgPSByb3c7CiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSBjb2x1bW4gfHwgbGluZS5sZW5ndGg7CiAgICAgICAgdmFyIHN0YXJ0TGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7CiAgICAgICAgdmFyIG1heFJvdyA9IHNlc3Npb24uZ2V0TGVuZ3RoKCkKICAgICAgICAKICAgICAgICB3aGlsZSAoKytyb3cgPCBtYXhSb3cpIHsKICAgICAgICAgICAgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOwogICAgICAgICAgICB2YXIgbGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7CgogICAgICAgICAgICBpZiAobGV2ZWwgPT0gbGluZS5sZW5ndGgpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgIGlmIChsZXZlbCA8PSBzdGFydExldmVsKQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBlbmRSb3cgPSByb3c7CiAgICAgICAgfQoKICAgICAgICBpZiAoZW5kUm93ID4gc3RhcnRSb3cpIHsKICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmRSb3cpLmxlbmd0aDsKICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShzdGFydFJvdywgc3RhcnRDb2x1bW4sIGVuZFJvdywgZW5kQ29sdW1uKTsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIGJyYWNrZXQsIHJvdywgY29sdW1uKSB7CiAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbiArIDF9OwogICAgICAgIHZhciBlbmQgPSBzZXNzaW9uLiRmaW5kQ2xvc2luZ0JyYWNrZXQoYnJhY2tldCwgc3RhcnQpOwogICAgICAgIGlmICghZW5kKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIHZhciBmdyA9IHNlc3Npb24uZm9sZFdpZGdldHNbZW5kLnJvd107CiAgICAgICAgaWYgKGZ3ID09IG51bGwpCiAgICAgICAgICAgIGZ3ID0gdGhpcy5nZXRGb2xkV2lkZ2V0KHNlc3Npb24sIGVuZC5yb3cpOwoKICAgICAgICBpZiAoZncgPT0gInN0YXJ0IikgewogICAgICAgICAgICBlbmQucm93IC0tOwogICAgICAgICAgICBlbmQuY29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZC5yb3cpLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7CiAgICB9OwoKfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOwoKfSk7CmRlZmluZSgnYWNlL21vZGUvc2NhbGFfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7CnZhciBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIpLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsKdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7Cgp2YXIgU2NhbGFIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgewoKICAgIC8vIHRha2VuIGZyb20gaHR0cDovL2Rvd25sb2FkLm9yYWNsZS5jb20vamF2YXNlL3R1dG9yaWFsL2phdmEvbnV0c2FuZGJvbHRzL19rZXl3b3Jkcy5odG1sCiAgICB2YXIga2V5d29yZHMgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKAogICAgICAgICAgICAiY2FzZXxkZWZhdWx0fGRvfGVsc2V8Zm9yfGlmfG1hdGNofHdoaWxlfHRocm93fHJldHVybnx0cnl8Y2F0Y2h8ZmluYWxseXx5aWVsZHwiICsKICAgICAgICAgICAgImFic3RyYWN0fGNsYXNzfGRlZnxleHRlbmRzfGZpbmFsfGZvclNvbWV8aW1wbGljaXR8aW1wbGljaXRzfGltcG9ydHxsYXp5fG5ld3xvYmplY3R8IiArCiAgICAgICAgICAgICJvdmVycmlkZXxwYWNrYWdlfHByaXZhdGV8cHJvdGVjdGVkfHNlYWxlZHxzdXBlcnx0aGlzfHRyYWl0fHR5cGV8dmFsfHZhcnx3aXRoIgogICAgICAgICkuc3BsaXQoInwiKQogICAgKTsKCiAgICB2YXIgYnVpbGRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoInRydWV8ZmFsc2UiKS5zcGxpdCgifCIpCiAgICApOwogICAgCiAgICB2YXIgbGFuZ0NsYXNzZXMgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCJBYnN0cmFjdE1ldGhvZEVycm9yfEFzc2VydGlvbkVycm9yfENsYXNzQ2lyY3VsYXJpdHlFcnJvcnwiKwogICAgICAgICJDbGFzc0Zvcm1hdEVycm9yfERlcHJlY2F0ZWR8RW51bUNvbnN0YW50Tm90UHJlc2VudEV4Y2VwdGlvbnwiKwogICAgICAgICJFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3J8SWxsZWdhbEFjY2Vzc0Vycm9yfCIrCiAgICAgICAgIklsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvbnxJbnN0YW50aWF0aW9uRXJyb3J8SW50ZXJuYWxFcnJvcnwiKwoKICAgICAgICAiTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb258Tm9TdWNoRmllbGRFcnJvcnxPdmVycmlkZXxQcm9jZXNzfCIrCiAgICAgICAgIlByb2Nlc3NCdWlsZGVyfFNlY3VyaXR5TWFuYWdlcnxTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9ufCIrCiAgICAgICAgIlN1cHByZXNzV2FybmluZ3N8VHlwZU5vdFByZXNlbnRFeGNlcHRpb258VW5rbm93bkVycm9yfCIrCiAgICAgICAgIlVuc2F0aXNmaWVkTGlua0Vycm9yfFVuc3VwcG9ydGVkQ2xhc3NWZXJzaW9uRXJyb3J8VmVyaWZ5RXJyb3J8IisKICAgICAgICAiSW5zdGFudGlhdGlvbkV4Y2VwdGlvbnxJbmRleE91dE9mQm91bmRzRXhjZXB0aW9ufCIrCiAgICAgICAgIkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbnxDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbnwiKwogICAgICAgICJOb1N1Y2hGaWVsZEV4Y2VwdGlvbnxJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb258TnVtYmVyRm9ybWF0RXhjZXB0aW9ufCIrCiAgICAgICAgIlNlY3VyaXR5RXhjZXB0aW9ufFZvaWR8SW5oZXJpdGFibGVUaHJlYWRMb2NhbHxJbGxlZ2FsU3RhdGVFeGNlcHRpb258IisKICAgICAgICAiSW50ZXJydXB0ZWRFeGNlcHRpb258Tm9TdWNoTWV0aG9kRXhjZXB0aW9ufElsbGVnYWxBY2Nlc3NFeGNlcHRpb258IisKICAgICAgICAiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb258RW51bXxTdHJpY3RNYXRofFBhY2thZ2V8Q29tcGlsZXJ8IisKICAgICAgICAiUmVhZGFibGV8UnVudGltZXxTdHJpbmdCdWlsZGVyfE1hdGh8SW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvcnwiKwogICAgICAgICJOb1N1Y2hNZXRob2RFcnJvcnxUaHJlYWRMb2NhbHxSdW50aW1lUGVybWlzc2lvbnxBcml0aG1ldGljRXhjZXB0aW9ufCIrCiAgICAgICAgIk51bGxQb2ludGVyRXhjZXB0aW9ufExvbmd8SW50ZWdlcnxTaG9ydHxCeXRlfERvdWJsZXxOdW1iZXJ8RmxvYXR8IisKICAgICAgICAiQ2hhcmFjdGVyfEJvb2xlYW58U3RhY2tUcmFjZUVsZW1lbnR8QXBwZW5kYWJsZXxTdHJpbmdCdWZmZXJ8IisKICAgICAgICAiSXRlcmFibGV8VGhyZWFkR3JvdXB8UnVubmFibGV8VGhyZWFkfElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb258IisKICAgICAgICAiU3RhY2tPdmVyZmxvd0Vycm9yfE91dE9mTWVtb3J5RXJyb3J8VmlydHVhbE1hY2hpbmVFcnJvcnwiKwogICAgICAgICJBcnJheVN0b3JlRXhjZXB0aW9ufENsYXNzQ2FzdEV4Y2VwdGlvbnxMaW5rYWdlRXJyb3J8IisKICAgICAgICAiTm9DbGFzc0RlZkZvdW5kRXJyb3J8Q2xhc3NOb3RGb3VuZEV4Y2VwdGlvbnxSdW50aW1lRXhjZXB0aW9ufCIrCiAgICAgICAgIkV4Y2VwdGlvbnxUaHJlYWREZWF0aHxFcnJvcnxUaHJvd2FibGV8U3lzdGVtfENsYXNzTG9hZGVyfCIrCiAgICAgICAgIkNsb25lYWJsZXxDbGFzc3xDaGFyU2VxdWVuY2V8Q29tcGFyYWJsZXxTdHJpbmd8T2JqZWN0fCIgKwogICAgICAgICJVbml0fEFueXxBbnlWYWx8QW55UmVmfE51bGx8U2NhbGFPYmplY3R8U2luZ2xldG9ufFNlcXxJdGVyYWJsZXxMaXN0fCIgKwogICAgICAgICJPcHRpb258QXJyYXl8Q2hhcnxCeXRlfFNob3J0fEludHxMb25nfE5vdGhpbmciCiAgICAgICAgCiAgICAgICAgKS5zcGxpdCgifCIpCiAgICApOwogICAgCiAgICB2YXIgaW1wb3J0Q2xhc3NlcyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoIiIpLnNwbGl0KCJ8IikKICAgICk7CiAgICAvLyByZWdleHAgbXVzdCBub3QgaGF2ZSBjYXB0dXJpbmcgcGFyZW50aGVzZXMuIFVzZSAoPzopIGluc3RlYWQuCiAgICAvLyByZWdleHBzIGFyZSBvcmRlcmVkIC0+IHRoZSBmaXJzdCBtYXRjaCBpcyB1c2VkCgogICAgdGhpcy4kcnVsZXMgPSB7CiAgICAgICAgInN0YXJ0IiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXC8uKiQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG5ldyBEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMoKS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50CiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLAogICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmcucmVnZXhwIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsvXSg/Oig/OlxcWyg/OlxcXFxdfFteXFxdXSkrXFxdKXwoPzpcXFxcL3xbXlxcXS9dKSkqWy9dXFx3KlxccyooPz1bKS4sO118JCkiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJwogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleAogICAgICAgICAgICAgICAgcmVnZXggOiAiMFt4WF1bMC05YS1mQS1GXStcXGIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdAogICAgICAgICAgICAgICAgcmVnZXggOiAiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLAogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86dHJ1ZXxmYWxzZSlcXGIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gInRoaXMiKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInZhcmlhYmxlLmxhbmd1YWdlIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobGFuZ0NsYXNzZXMuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuZnVuY3Rpb24iOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGltcG9ydENsYXNzZXMuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN1cHBvcnQuZnVuY3Rpb24iOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWxkaW5Db25zdGFudHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImNvbnN0YW50Lmxhbmd1YWdlIjsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgLy8gVE9ETzogVW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBVbmljb2RlIGlkZW50aWZpZXJzCiAgICAgICAgICAgICAgICByZWdleCA6ICJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5scGFyZW4iLAogICAgICAgICAgICAgICAgcmVnZXggOiAiW1soe10iCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJbXFxdKX1dIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJjb21tZW50IiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIGNsb3NpbmcgY29tbWVudAogICAgICAgICAgICAgICAgcmVnZXggOiAiLio/XFwqXFwvIiwKICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIgogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfTsKICAgIAogICAgdGhpcy5lbWJlZFJ1bGVzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgImRvYy0iLAogICAgICAgIFsgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldEVuZFJ1bGUoInN0YXJ0IikgXSk7Cn07Cgpvb3AuaW5oZXJpdHMoU2NhbGFIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsKCmV4cG9ydHMuU2NhbGFIaWdobGlnaHRSdWxlcyA9IFNjYWxhSGlnaGxpZ2h0UnVsZXM7Cn0pOwo7CiAgICAgICAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAg]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-scala.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9zY2FsYSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvamF2YXNjcmlwdCIsImFjZS90b2tlbml6ZXIiLCJhY2UvbW9kZS9zY2FsYV9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vamF2YXNjcmlwdCIpLk1vZGUsZj1hKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXIsZz1hKCIuL3NjYWxhX2hpZ2hsaWdodF9ydWxlcyIpLlNjYWxhSGlnaGxpZ2h0UnVsZXMsaD1mdW5jdGlvbigpe2UuY2FsbCh0aGlzKSx0aGlzLiR0b2tlbml6ZXI9bmV3IGYoKG5ldyBnKS5nZXRSdWxlcygpKX07ZC5pbmhlcml0cyhoLGUpLGZ1bmN0aW9uKCl7dGhpcy5jcmVhdGVXb3JrZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGx9fS5jYWxsKGgucHJvdG90eXBlKSxiLk1vZGU9aH0pLGRlZmluZSgiYWNlL21vZGUvamF2YXNjcmlwdCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dCIsImFjZS90b2tlbml6ZXIiLCJhY2UvbW9kZS9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLCJhY2UvcmFuZ2UiLCJhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQiLCJhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlIiwiYWNlL21vZGUvZm9sZGluZy9jc3R5bGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dCIpLk1vZGUsZj1hKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXIsZz1hKCIuL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIikuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzLGg9YSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQsaT1hKCIuLi9yYW5nZSIpLlJhbmdlLGo9YSgiLi4vd29ya2VyL3dvcmtlcl9jbGllbnQiKS5Xb3JrZXJDbGllbnQsaz1hKCIuL2JlaGF2aW91ci9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXIsbD1hKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGUsbT1mdW5jdGlvbigpe3RoaXMuJHRva2VuaXplcj1uZXcgZigobmV3IGcpLmdldFJ1bGVzKCkpLHRoaXMuJG91dGRlbnQ9bmV3IGgsdGhpcy4kYmVoYXZpb3VyPW5ldyBrLHRoaXMuZm9sZGluZ1J1bGVzPW5ldyBsfTtkLmluaGVyaXRzKG0sZSksZnVuY3Rpb24oKXt0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0hMCxmPS9eKFxzKilcL1wvLztmb3IodmFyIGc9YztnPD1kO2crKylpZighZi50ZXN0KGIuZ2V0TGluZShnKSkpe2U9ITE7YnJlYWt9aWYoZSl7dmFyIGg9bmV3IGkoMCwwLDAsMCk7Zm9yKHZhciBnPWM7Zzw9ZDtnKyspe3ZhciBqPWIuZ2V0TGluZShnKSxrPWoubWF0Y2goZik7aC5zdGFydC5yb3c9ZyxoLmVuZC5yb3c9ZyxoLmVuZC5jb2x1bW49a1swXS5sZW5ndGgsYi5yZXBsYWNlKGgsa1sxXSl9fWVsc2UgYi5pbmRlbnRSb3dzKGMsZCwiLy8iKX0sdGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy4kZ2V0SW5kZW50KGIpLGU9dGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMoYixhKSxmPWUudG9rZW5zLGc9ZS5zdGF0ZTtpZihmLmxlbmd0aCYmZltmLmxlbmd0aC0xXS50eXBlPT0iY29tbWVudCIpcmV0dXJuIGQ7aWYoYT09InN0YXJ0Inx8YT09InJlZ2V4X2FsbG93ZWQiKXt2YXIgaD1iLm1hdGNoKC9eLiooPzpcYmNhc2VcYi4qXDp8W1x7XChcW10pXHMqJC8pO2gmJihkKz1jKX1lbHNlIGlmKGE9PSJkb2Mtc3RhcnQiKXtpZihnPT0ic3RhcnQifHxhPT0icmVnZXhfYWxsb3dlZCIpcmV0dXJuIiI7dmFyIGg9Yi5tYXRjaCgvXlxzKihcLz8pXCovKTtoJiYoaFsxXSYmKGQrPSIgIiksZCs9IiogIil9cmV0dXJuIGR9LHRoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQoYixjKX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihhLGIsYyl7dGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudChiLGMpfSx0aGlzLmNyZWF0ZVdvcmtlcj1mdW5jdGlvbihhKXt2YXIgYj1uZXcgaihbImFjZSJdLCJ3b3JrZXItamF2YXNjcmlwdC5qcyIsImFjZS9tb2RlL2phdmFzY3JpcHRfd29ya2VyIiwiSmF2YVNjcmlwdFdvcmtlciIpO3JldHVybiBiLmF0dGFjaFRvRG9jdW1lbnQoYS5nZXREb2N1bWVudCgpKSxiLm9uKCJqc2xpbnQiLGZ1bmN0aW9uKGIpe3ZhciBjPVtdO2Zvcih2YXIgZD0wO2Q8Yi5kYXRhLmxlbmd0aDtkKyspe3ZhciBlPWIuZGF0YVtkXTtlJiZjLnB1c2goe3JvdzplLmxpbmUtMSxjb2x1bW46ZS5jaGFyYWN0ZXItMSx0ZXh0OmUucmVhc29uLHR5cGU6Indhcm5pbmciLGxpbnQ6ZX0pfWEuc2V0QW5ub3RhdGlvbnMoYyl9KSxiLm9uKCJuYXJjaXNzdXMiLGZ1bmN0aW9uKGIpe2Euc2V0QW5ub3RhdGlvbnMoW2IuZGF0YV0pfSksYi5vbigidGVybWluYXRlIixmdW5jdGlvbigpe2EuY2xlYXJBbm5vdGF0aW9ucygpfSksYn19LmNhbGwobS5wcm90b3R5cGUpLGIuTW9kZT1tfSksZGVmaW5lKCJhY2UvbW9kZS9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9sYW5nIiwiYWNlL3VuaWNvZGUiLCJhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi4vbGliL2xhbmciKSxmPWEoIi4uL3VuaWNvZGUiKSxnPWEoIi4vZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIikuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLGg9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxpPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKCJBcnJheXxCb29sZWFufERhdGV8RnVuY3Rpb258SXRlcmF0b3J8TnVtYmVyfE9iamVjdHxSZWdFeHB8U3RyaW5nfFByb3h5fE5hbWVzcGFjZXxRTmFtZXxYTUx8WE1MTGlzdHxBcnJheUJ1ZmZlcnxGbG9hdDMyQXJyYXl8RmxvYXQ2NEFycmF5fEludDE2QXJyYXl8SW50MzJBcnJheXxJbnQ4QXJyYXl8VWludDE2QXJyYXl8VWludDMyQXJyYXl8VWludDhBcnJheXxVaW50OENsYW1wZWRBcnJheXxFcnJvcnxFdmFsRXJyb3J8SW50ZXJuYWxFcnJvcnxSYW5nZUVycm9yfFJlZmVyZW5jZUVycm9yfFN0b3BJdGVyYXRpb258U3ludGF4RXJyb3J8VHlwZUVycm9yfFVSSUVycm9yfGRlY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZW5jb2RlVVJJfGVuY29kZVVSSUNvbXBvbmVudHxldmFsfGlzRmluaXRlfGlzTmFOfHBhcnNlRmxvYXR8cGFyc2VJbnR8SlNPTnxNYXRofHRoaXN8YXJndW1lbnRzfHByb3RvdHlwZXx3aW5kb3d8ZG9jdW1lbnQiLnNwbGl0KCJ8IikpLGI9ZS5hcnJheVRvTWFwKCJicmVha3xjYXNlfGNhdGNofGNvbnRpbnVlfGRlZmF1bHR8ZGVsZXRlfGRvfGVsc2V8ZmluYWxseXxmb3J8ZnVuY3Rpb258aWZ8aW58aW5zdGFuY2VvZnxuZXd8cmV0dXJufHN3aXRjaHx0aHJvd3x0cnl8dHlwZW9mfGxldHx2YXJ8d2hpbGV8d2l0aHxjb25zdHx5aWVsZHxpbXBvcnR8Z2V0fHNldCIuc3BsaXQoInwiKSksYz0iY2FzZXxkb3xlbHNlfGZpbmFsbHl8aW58aW5zdGFuY2VvZnxyZXR1cm58dGhyb3d8dHJ5fHR5cGVvZnx5aWVsZCIsZD1lLmFycmF5VG9NYXAoIl9fcGFyZW50X198X19jb3VudF9ffGVzY2FwZXx1bmVzY2FwZXx3aXRofF9fcHJvdG9fXyIuc3BsaXQoInwiKSksaD1lLmFycmF5VG9NYXAoImNvbnN0fGxldHx2YXJ8ZnVuY3Rpb24iLnNwbGl0KCJ8IikpLGk9ZS5hcnJheVRvTWFwKCJudWxsfEluZmluaXR5fE5hTnx1bmRlZmluZWQiLnNwbGl0KCJ8IikpLGo9ZS5hcnJheVRvTWFwKCJjbGFzc3xlbnVtfGV4dGVuZHN8c3VwZXJ8ZXhwb3J0fGltcGxlbWVudHN8cHJpdmF0ZXxwdWJsaWN8aW50ZXJmYWNlfHBhY2thZ2V8cHJvdGVjdGVkfHN0YXRpYyIuc3BsaXQoInwiKSksaz0iWyIrZi5wYWNrYWdlcy5MKyJcXCRfXVsiK2YucGFja2FnZXMuTCtmLnBhY2thZ2VzLk1uK2YucGFja2FnZXMuTWMrZi5wYWNrYWdlcy5OZCtmLnBhY2thZ2VzLlBjKyJcXCRfXSpcXGIiO3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwvXFwvLiokIn0sKG5ldyBnKS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKiIsbmV4dDoiY29tbWVudCJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDonWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXSd9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDonWyJdLipcXFxcJCcsbmV4dDoicXFzdHJpbmcifSx7dG9rZW46InN0cmluZyIscmVnZXg6IlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10ifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6IlsnXS4qXFxcXCQiLG5leHQ6InFzdHJpbmcifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIwW3hYXVswLTlhLWZBLUZdK1xcYiJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIn0se3Rva2VuOlsia2V5d29yZC5kZWZpbml0aW9uIiwidGV4dCIsImVudGl0eS5uYW1lLmZ1bmN0aW9uIl0scmVnZXg6IihmdW5jdGlvbikoXFxzKykoIitrKyIpIn0se3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5ib29sZWFuIixyZWdleDoiKD86dHJ1ZXxmYWxzZSlcXGIifSx7dG9rZW46ImtleXdvcmQiLHJlZ2V4OiIoPzoiK2MrIilcXGIiLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46ZnVuY3Rpb24oYyl7cmV0dXJuIGEuaGFzT3duUHJvcGVydHkoYyk/InZhcmlhYmxlLmxhbmd1YWdlIjpkLmhhc093blByb3BlcnR5KGMpPyJpbnZhbGlkLmRlcHJlY2F0ZWQiOmguaGFzT3duUHJvcGVydHkoYyk/ImtleXdvcmQuZGVmaW5pdGlvbiI6Yi5oYXNPd25Qcm9wZXJ0eShjKT8ia2V5d29yZCI6aS5oYXNPd25Qcm9wZXJ0eShjKT8iY29uc3RhbnQubGFuZ3VhZ2UiOmouaGFzT3duUHJvcGVydHkoYyk/ImludmFsaWQuaWxsZWdhbCI6Yz09ImRlYnVnZ2VyIj8iaW52YWxpZC5kZXByZWNhdGVkIjoiaWRlbnRpZmllciJ9LHJlZ2V4Omt9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6IiF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT09fD09fD18IT18IT09fDw9fD49fDw8PXw+Pj18Pj4+PXw8Pnw8fD58IXwmJnxcXHxcXHx8XFw/XFw6fFxcKj18JT18XFwrPXxcXC09fCY9fFxcXj18XFxiKD86aW58aW5zdGFuY2VvZnxuZXd8ZGVsZXRlfHR5cGVvZnx2b2lkKSIsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoicHVuY3R1YXRpb24ub3BlcmF0b3IiLHJlZ2V4OiJcXD98XFw6fFxcLHxcXDt8XFwuIixuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOiJwYXJlbi5scGFyZW4iLHJlZ2V4OiJbWyh7XSIsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoicGFyZW4ucnBhcmVuIixyZWdleDoiW1xcXSl9XSJ9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcLz0/IixuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOiJjb21tZW50IixyZWdleDoiXiMhLiokIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9XSxyZWdleF9hbGxvd2VkOlt7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCoiLG5leHQ6ImNvbW1lbnRfcmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoiY29tbWVudCIscmVnZXg6IlxcL1xcLy4qJCJ9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6IlxcLyIsbmV4dDoicmVnZXgiLG1lcmdlOiEwfSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJlbXB0eSIscmVnZXg6IiIsbmV4dDoic3RhcnQifV0scmVnZXg6W3t0b2tlbjoicmVnZXhwLmtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsbmV4dDoicmVnZXgifSx7dG9rZW46InN0cmluZy5yZWdleHAiLHJlZ2V4OiIvXFx3KiIsbmV4dDoic3RhcnQiLG1lcmdlOiEwfSx7dG9rZW46InN0cmluZy5yZWdleHAiLHJlZ2V4OiJbXlxcXFwvXFxbXSsiLG5leHQ6InJlZ2V4IixtZXJnZTohMH0se3Rva2VuOiJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyIscmVnZXg6IlxcWyIsbmV4dDoicmVnZXhfY2hhcmFjdGVyX2NsYXNzIixtZXJnZTohMH0se3Rva2VuOiJlbXB0eSIscmVnZXg6IiIsbmV4dDoic3RhcnQifV0scmVnZXhfY2hhcmFjdGVyX2NsYXNzOlt7dG9rZW46InJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiXFxcXCg/OnVbXFxkYS1mQS1GXXs0fXx4W1xcZGEtZkEtRl17Mn18LikiLG5leHQ6InJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyJ9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLHJlZ2V4OiJdIixuZXh0OiJyZWdleCIsbWVyZ2U6ITB9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MiLHJlZ2V4OiJbXlxcXFxcXF1dKyIsbmV4dDoicmVnZXhfY2hhcmFjdGVyX2NsYXNzIixtZXJnZTohMH0se3Rva2VuOiJlbXB0eSIscmVnZXg6IiIsbmV4dDoic3RhcnQifV0sY29tbWVudF9yZWdleF9hbGxvd2VkOlt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj9cXCpcXC8iLG1lcmdlOiEwLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxjb21tZW50Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj9cXCpcXC8iLG1lcmdlOiEwLG5leHQ6InN0YXJ0In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV0scXFzdHJpbmc6W3t0b2tlbjoic3RyaW5nIixyZWdleDonKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqPyInLG5leHQ6InN0YXJ0In0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxxc3RyaW5nOlt7dG9rZW46InN0cmluZyIscmVnZXg6Iig/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj8nIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV19LHRoaXMuZW1iZWRSdWxlcyhnLCJkb2MtIixbKG5ldyBnKS5nZXRFbmRSdWxlKCJzdGFydCIpXSl9O2QuaW5oZXJpdHMoaSxoKSxiLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlcz1pfSksZGVmaW5lKCJhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGY9ZnVuY3Rpb24oKXt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoiY29tbWVudC5kb2MudGFnIixyZWdleDoiQFtcXHdcXGRfXSsifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiXFxzKyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJUT0RPIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlteQFxcKl0rIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6Ii4ifV19fTtkLmluaGVyaXRzKGYsZSksZnVuY3Rpb24oKXt0aGlzLmdldFN0YXJ0UnVsZT1mdW5jdGlvbihhKXtyZXR1cm57dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiXFwvXFwqKD89XFwqKSIsbmV4dDphfX0sdGhpcy5nZXRFbmRSdWxlPWZ1bmN0aW9uKGEpe3JldHVybnt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJcXCpcXC8iLG5leHQ6YX19fS5jYWxsKGYucHJvdG90eXBlKSxiLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcz1mfSksZGVmaW5lKCJhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9yYW5nZSIpLlJhbmdlLGU9ZnVuY3Rpb24oKXt9OygoZnVuY3Rpb24oKXt0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihhLGIpe3JldHVybi9eXHMrJC8udGVzdChhKT8vXlxzKlx9Ly50ZXN0KGIpOiExfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5nZXRMaW5lKGIpLGU9Yy5tYXRjaCgvXihccypcfSkvKTtpZighZSlyZXR1cm4gMDt2YXIgZj1lWzFdLmxlbmd0aCxnPWEuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OmIsY29sdW1uOmZ9KTtpZighZ3x8Zy5yb3c9PWIpcmV0dXJuIDA7dmFyIGg9dGhpcy4kZ2V0SW5kZW50KGEuZ2V0TGluZShnLnJvdykpO2EucmVwbGFjZShuZXcgZChiLDAsYixmLTEpLGgpfSx0aGlzLiRnZXRJbmRlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5tYXRjaCgvXihccyspLyk7cmV0dXJuIGI/YlsxXToiIn19KSkuY2FsbChlLnByb3RvdHlwZSksYi5NYXRjaGluZ0JyYWNlT3V0ZGVudD1lfSksZGVmaW5lKCJhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvZXZlbnRfZW1pdHRlciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsZj1mdW5jdGlvbihiLGQsZSxmKXt0aGlzLmNoYW5nZUxpc3RlbmVyPXRoaXMuY2hhbmdlTGlzdGVuZXIuYmluZCh0aGlzKTtpZihjLnBhY2thZ2VkKXt2YXIgZz10aGlzLiRndWVzc0Jhc2VQYXRoKCk7dGhpcy4kd29ya2VyPW5ldyBXb3JrZXIoZytkKX1lbHNle3ZhciBoPXRoaXMuJG5vcm1hbGl6ZVBhdGgoYS5uYW1lVG9VcmwoImFjZS93b3JrZXIvd29ya2VyIixudWxsLCJfIikpO3RoaXMuJHdvcmtlcj1uZXcgV29ya2VyKGgpO3ZhciBpPXt9O2Zvcih2YXIgaj0wO2o8Yi5sZW5ndGg7aisrKXt2YXIgaz1iW2pdLGw9dGhpcy4kbm9ybWFsaXplUGF0aChhLm5hbWVUb1VybChrLG51bGwsIl8iKS5yZXBsYWNlKC8uanMkLywiIikpO2lba109bH19dGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtpbml0OiEwLHRsbnM6aSxtb2R1bGU6ZSxjbGFzc25hbWU6Zn0pLHRoaXMuY2FsbGJhY2tJZD0xLHRoaXMuY2FsbGJhY2tzPXt9O3ZhciBtPXRoaXM7dGhpcy4kd29ya2VyLm9uZXJyb3I9ZnVuY3Rpb24oYSl7dGhyb3cgd2luZG93LmNvbnNvbGUmJmNvbnNvbGUubG9nJiZjb25zb2xlLmxvZyhhKSxhfSx0aGlzLiR3b3JrZXIub25tZXNzYWdlPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZGF0YTtzd2l0Y2goYi50eXBlKXtjYXNlImxvZyI6d2luZG93LmNvbnNvbGUmJmNvbnNvbGUubG9nJiZjb25zb2xlLmxvZyhiLmRhdGEpO2JyZWFrO2Nhc2UiZXZlbnQiOm0uX2VtaXQoYi5uYW1lLHtkYXRhOmIuZGF0YX0pO2JyZWFrO2Nhc2UiY2FsbCI6dmFyIGM9bS5jYWxsYmFja3NbYi5pZF07YyYmKGMoYi5kYXRhKSxkZWxldGUgbS5jYWxsYmFja3NbYi5pZF0pfX19OygoZnVuY3Rpb24oKXtkLmltcGxlbWVudCh0aGlzLGUpLHRoaXMuJG5vcm1hbGl6ZVBhdGg9ZnVuY3Rpb24oYSl7cmV0dXJuIGE9YS5yZXBsYWNlKC9eW2Etel0rOlwvXC9bXlwvXStcLy8sIiIpLGE9bG9jYXRpb24ucHJvdG9jb2wrIi8vIitsb2NhdGlvbi5ob3N0KyhhLmNoYXJBdCgwKT09Ii8iPyIiOmxvY2F0aW9uLnBhdGhuYW1lLnJlcGxhY2UoL1wvW15cL10qJC8sIiIpKSsiLyIrYS5yZXBsYWNlKC9eW1wvXSsvLCIiKSxhfSx0aGlzLiRndWVzc0Jhc2VQYXRoPWZ1bmN0aW9uKCl7aWYoYS5hY2VCYXNlVXJsKXJldHVybiBhLmFjZUJhc2VVcmw7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD1iW2NdLGU9ZC5nZXRBdHRyaWJ1dGUoImRhdGEtYWNlLWJhc2UiKTtpZihlKXJldHVybiBlLnJlcGxhY2UoL1wvKiQvLCIvIik7dmFyIGY9ZC5zcmN8fGQuZ2V0QXR0cmlidXRlKCJzcmMiKTtpZighZiljb250aW51ZTt2YXIgZz1mLm1hdGNoKC9eKD86KC4qXC8pYWNlXC5qc3woLipcLylhY2UoLXVuY29tcHJlc3NlZCk/KC1ub2NvbmZsaWN0KT9cLmpzKSg/Olw/fCQpLyk7aWYoZylyZXR1cm4gZ1sxXXx8Z1syXX1yZXR1cm4iIn0sdGhpcy50ZXJtaW5hdGU9ZnVuY3Rpb24oKXt0aGlzLl9lbWl0KCJ0ZXJtaW5hdGUiLHt9KSx0aGlzLiR3b3JrZXIudGVybWluYXRlKCksdGhpcy4kd29ya2VyPW51bGwsdGhpcy4kZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIsdGhpcy5jaGFuZ2VMaXN0ZW5lciksdGhpcy4kZG9jPW51bGx9LHRoaXMuc2VuZD1mdW5jdGlvbihhLGIpe3RoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7Y29tbWFuZDphLGFyZ3M6Yn0pfSx0aGlzLmNhbGw9ZnVuY3Rpb24oYSxiLGMpe2lmKGMpe3ZhciBkPXRoaXMuY2FsbGJhY2tJZCsrO3RoaXMuY2FsbGJhY2tzW2RdPWMsYi5wdXNoKGQpfXRoaXMuc2VuZChhLGIpfSx0aGlzLmVtaXQ9ZnVuY3Rpb24oYSxiKXt0cnl7dGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtldmVudDphLGRhdGE6e2RhdGE6Yi5kYXRhfX0pfWNhdGNoKGMpe319LHRoaXMuYXR0YWNoVG9Eb2N1bWVudD1mdW5jdGlvbihhKXt0aGlzLiRkb2MmJnRoaXMudGVybWluYXRlKCksdGhpcy4kZG9jPWEsdGhpcy5jYWxsKCJzZXRWYWx1ZSIsW2EuZ2V0VmFsdWUoKV0pLGEub24oImNoYW5nZSIsdGhpcy5jaGFuZ2VMaXN0ZW5lcil9LHRoaXMuY2hhbmdlTGlzdGVuZXI9ZnVuY3Rpb24oYSl7YS5yYW5nZT17c3RhcnQ6YS5kYXRhLnJhbmdlLnN0YXJ0LGVuZDphLmRhdGEucmFuZ2UuZW5kfSx0aGlzLmVtaXQoImNoYW5nZSIsYSl9fSkpLmNhbGwoZi5wcm90b3R5cGUpLGIuV29ya2VyQ2xpZW50PWZ9KSxkZWZpbmUoImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL2JlaGF2aW91ciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vYmVoYXZpb3VyIikuQmVoYXZpb3VyLGY9ZnVuY3Rpb24oKXt0aGlzLmFkZCgiYnJhY2VzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSJ7Iil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/e3RleHQ6InsiK2crIn0iLHNlbGVjdGlvbjohMX06e3RleHQ6Int9IixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSJ9Iil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0ifSIpe3ZhciBrPWQuJGZpbmRPcGVuaW5nQnJhY2tldCgifSIse2NvbHVtbjpoLmNvbHVtbisxLHJvdzpoLnJvd30pO2lmKGshPT1udWxsKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fWVsc2UgaWYoZT09IlxuIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0ifSIpe3ZhciBsPWQuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93Omgucm93LGNvbHVtbjpoLmNvbHVtbisxfSk7aWYoIWwpcmV0dXJuIG51bGw7dmFyIG09dGhpcy5nZXROZXh0TGluZUluZGVudChhLGkuc3Vic3RyaW5nKDAsaS5sZW5ndGgtMSksZC5nZXRUYWJTdHJpbmcoKSksbj10aGlzLiRnZXRJbmRlbnQoZC5kb2MuZ2V0TGluZShsLnJvdykpO3JldHVybnt0ZXh0OiJcbiIrbSsiXG4iK24sc2VsZWN0aW9uOlsxLG0ubGVuZ3RoLDEsbS5sZW5ndGhdfX19fSksdGhpcy5hZGQoImJyYWNlcyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0ieyIpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5lbmQuY29sdW1uLGUuZW5kLmNvbHVtbisxKTtpZihoPT0ifSIpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSksdGhpcy5hZGQoInBhcmVucyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0iKCIpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtyZXR1cm4gZyE9PSIiP3t0ZXh0OiIoIitnKyIpIixzZWxlY3Rpb246ITF9Ont0ZXh0OiIoKSIsc2VsZWN0aW9uOlsxLDFdfX1pZihlPT0iKSIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09IikiKXt2YXIgaz1kLiRmaW5kT3BlbmluZ0JyYWNrZXQoIikiLHtjb2x1bW46aC5jb2x1bW4rMSxyb3c6aC5yb3d9KTtpZihrIT09bnVsbClyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX19KSx0aGlzLmFkZCgicGFyZW5zIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSIoIil7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbisxLGUuc3RhcnQuY29sdW1uKzIpO2lmKGg9PSIpIilyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KSx0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09JyInKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7aWYoZyE9PSIiKXJldHVybnt0ZXh0OiciJytnKyciJyxzZWxlY3Rpb246ITF9O3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4tMSxoLmNvbHVtbik7aWYoaj09IlxcIilyZXR1cm4gbnVsbDt2YXIgaz1kLmdldFRva2VucyhmLnN0YXJ0LnJvdyxmLnN0YXJ0LnJvdylbMF0udG9rZW5zLGw9MCxtLG49LTE7Zm9yKHZhciBvPTA7bzxrLmxlbmd0aDtvKyspe209a1tvXSxtLnR5cGU9PSJzdHJpbmciP249LTE6bjwwJiYobj1tLnZhbHVlLmluZGV4T2YoJyInKSk7aWYobS52YWx1ZS5sZW5ndGgrbD5mLnN0YXJ0LmNvbHVtbilicmVhaztsKz1rW29dLnZhbHVlLmxlbmd0aH1pZighbXx8bjwwJiZtLnR5cGUhPT0iY29tbWVudCImJihtLnR5cGUhPT0ic3RyaW5nInx8Zi5zdGFydC5jb2x1bW4hPT1tLnZhbHVlLmxlbmd0aCtsLTEmJm0udmFsdWUubGFzdEluZGV4T2YoJyInKT09PW0udmFsdWUubGVuZ3RoLTEpKXJldHVybnt0ZXh0OiciIicsc2VsZWN0aW9uOlsxLDFdfTtpZihtJiZtLnR5cGU9PT0ic3RyaW5nIil7dmFyIHA9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYocD09JyInKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0nIicpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5zdGFydC5jb2x1bW4rMSxlLnN0YXJ0LmNvbHVtbisyKTtpZihoPT0nIicpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSl9O2QuaW5oZXJpdHMoZixlKSxiLkNzdHlsZUJlaGF2aW91cj1mfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL3JhbmdlIiwiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4uLy4uL3JhbmdlIikuUmFuZ2UsZj1hKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlLGc9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307ZC5pbmhlcml0cyhnLGYpLGZ1bmN0aW9uKCl7dGhpcy5mb2xkaW5nU3RhcnRNYXJrZXI9Lyhce3xcWylbXlx9XF1dKiR8XlxzKihcL1wqKS8sdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj0vXlteXFtce10qKFx9fFxdKXxeW1xzXCpdKihcKlwvKS8sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKSxmPWQubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpO2lmKGYpe3ZhciBnPWYuaW5kZXg7aWYoZlsxXSlyZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKGEsZlsxXSxjLGcpO3ZhciBoPWEuZ2V0Q29tbWVudEZvbGRSYW5nZShjLGcrZlswXS5sZW5ndGgpO3JldHVybiBoLmVuZC5jb2x1bW4tPTIsaH1pZihiIT09Im1hcmtiZWdpbmVuZCIpcmV0dXJuO3ZhciBmPWQubWF0Y2godGhpcy5mb2xkaW5nU3RvcE1hcmtlcik7aWYoZil7dmFyIGc9Zi5pbmRleCtmWzBdLmxlbmd0aDtpZihmWzJdKXt2YXIgaD1hLmdldENvbW1lbnRGb2xkUmFuZ2UoYyxnKTtyZXR1cm4gaC5lbmQuY29sdW1uLT0yLGh9dmFyIGk9e3JvdzpjLGNvbHVtbjpnfSxqPWEuJGZpbmRPcGVuaW5nQnJhY2tldChmWzFdLGkpO2lmKCFqKXJldHVybjtyZXR1cm4gai5jb2x1bW4rKyxpLmNvbHVtbi0tLGUuZnJvbVBvaW50cyhqLGkpfX19LmNhbGwoZy5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxlPWIuRm9sZE1vZGU9ZnVuY3Rpb24oKXt9OygoZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj1udWxsLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9bnVsbCx0aGlzLmdldEZvbGRXaWRnZXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKTtyZXR1cm4gdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChkKT8ic3RhcnQiOmI9PSJtYXJrYmVnaW5lbmQiJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QoZCk/ImVuZCI6IiJ9LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbnVsbH0sdGhpcy5pbmRlbnRhdGlvbkJsb2NrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZT0vXlxzKi8sZj1iLGc9YixoPWEuZ2V0TGluZShiKSxpPWN8fGgubGVuZ3RoLGo9aC5tYXRjaChlKVswXS5sZW5ndGgsaz1hLmdldExlbmd0aCgpO3doaWxlKCsrYjxrKXtoPWEuZ2V0TGluZShiKTt2YXIgbD1oLm1hdGNoKGUpWzBdLmxlbmd0aDtpZihsPT1oLmxlbmd0aCljb250aW51ZTtpZihsPD1qKWJyZWFrO2c9Yn1pZihnPmYpe3ZhciBtPWEuZ2V0TGluZShnKS5sZW5ndGg7cmV0dXJuIG5ldyBkKGYsaSxnLG0pfX0sdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrPWZ1bmN0aW9uKGEsYixjLGUpe3ZhciBmPXtyb3c6Yyxjb2x1bW46ZSsxfSxnPWEuJGZpbmRDbG9zaW5nQnJhY2tldChiLGYpO2lmKCFnKXJldHVybjt2YXIgaD1hLmZvbGRXaWRnZXRzW2cucm93XTtyZXR1cm4gaD09bnVsbCYmKGg9dGhpcy5nZXRGb2xkV2lkZ2V0KGEsZy5yb3cpKSxoPT0ic3RhcnQiJiYoZy5yb3ctLSxnLmNvbHVtbj1hLmdldExpbmUoZy5yb3cpLmxlbmd0aCksZC5mcm9tUG9pbnRzKGYsZyl9fSkpLmNhbGwoZS5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW9kZS9zY2FsYV9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsZz1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGg9ZnVuY3Rpb24oKXt2YXIgYT1lLmFycmF5VG9NYXAoImNhc2V8ZGVmYXVsdHxkb3xlbHNlfGZvcnxpZnxtYXRjaHx3aGlsZXx0aHJvd3xyZXR1cm58dHJ5fGNhdGNofGZpbmFsbHl8eWllbGR8YWJzdHJhY3R8Y2xhc3N8ZGVmfGV4dGVuZHN8ZmluYWx8Zm9yU29tZXxpbXBsaWNpdHxpbXBsaWNpdHN8aW1wb3J0fGxhenl8bmV3fG9iamVjdHxvdmVycmlkZXxwYWNrYWdlfHByaXZhdGV8cHJvdGVjdGVkfHNlYWxlZHxzdXBlcnx0aGlzfHRyYWl0fHR5cGV8dmFsfHZhcnx3aXRoIi5zcGxpdCgifCIpKSxiPWUuYXJyYXlUb01hcCgidHJ1ZXxmYWxzZSIuc3BsaXQoInwiKSksYz1lLmFycmF5VG9NYXAoIkFic3RyYWN0TWV0aG9kRXJyb3J8QXNzZXJ0aW9uRXJyb3J8Q2xhc3NDaXJjdWxhcml0eUVycm9yfENsYXNzRm9ybWF0RXJyb3J8RGVwcmVjYXRlZHxFbnVtQ29uc3RhbnROb3RQcmVzZW50RXhjZXB0aW9ufEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcnxJbGxlZ2FsQWNjZXNzRXJyb3J8SWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9ufEluc3RhbnRpYXRpb25FcnJvcnxJbnRlcm5hbEVycm9yfE5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9ufE5vU3VjaEZpZWxkRXJyb3J8T3ZlcnJpZGV8UHJvY2Vzc3xQcm9jZXNzQnVpbGRlcnxTZWN1cml0eU1hbmFnZXJ8U3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbnxTdXBwcmVzc1dhcm5pbmdzfFR5cGVOb3RQcmVzZW50RXhjZXB0aW9ufFVua25vd25FcnJvcnxVbnNhdGlzZmllZExpbmtFcnJvcnxVbnN1cHBvcnRlZENsYXNzVmVyc2lvbkVycm9yfFZlcmlmeUVycm9yfEluc3RhbnRpYXRpb25FeGNlcHRpb258SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbnxBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb258Q2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb258Tm9TdWNoRmllbGRFeGNlcHRpb258SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufE51bWJlckZvcm1hdEV4Y2VwdGlvbnxTZWN1cml0eUV4Y2VwdGlvbnxWb2lkfEluaGVyaXRhYmxlVGhyZWFkTG9jYWx8SWxsZWdhbFN0YXRlRXhjZXB0aW9ufEludGVycnVwdGVkRXhjZXB0aW9ufE5vU3VjaE1ldGhvZEV4Y2VwdGlvbnxJbGxlZ2FsQWNjZXNzRXhjZXB0aW9ufFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufEVudW18U3RyaWN0TWF0aHxQYWNrYWdlfENvbXBpbGVyfFJlYWRhYmxlfFJ1bnRpbWV8U3RyaW5nQnVpbGRlcnxNYXRofEluY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3J8Tm9TdWNoTWV0aG9kRXJyb3J8VGhyZWFkTG9jYWx8UnVudGltZVBlcm1pc3Npb258QXJpdGhtZXRpY0V4Y2VwdGlvbnxOdWxsUG9pbnRlckV4Y2VwdGlvbnxMb25nfEludGVnZXJ8U2hvcnR8Qnl0ZXxEb3VibGV8TnVtYmVyfEZsb2F0fENoYXJhY3RlcnxCb29sZWFufFN0YWNrVHJhY2VFbGVtZW50fEFwcGVuZGFibGV8U3RyaW5nQnVmZmVyfEl0ZXJhYmxlfFRocmVhZEdyb3VwfFJ1bm5hYmxlfFRocmVhZHxJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9ufFN0YWNrT3ZlcmZsb3dFcnJvcnxPdXRPZk1lbW9yeUVycm9yfFZpcnR1YWxNYWNoaW5lRXJyb3J8QXJyYXlTdG9yZUV4Y2VwdGlvbnxDbGFzc0Nhc3RFeGNlcHRpb258TGlua2FnZUVycm9yfE5vQ2xhc3NEZWZGb3VuZEVycm9yfENsYXNzTm90Rm91bmRFeGNlcHRpb258UnVudGltZUV4Y2VwdGlvbnxFeGNlcHRpb258VGhyZWFkRGVhdGh8RXJyb3J8VGhyb3dhYmxlfFN5c3RlbXxDbGFzc0xvYWRlcnxDbG9uZWFibGV8Q2xhc3N8Q2hhclNlcXVlbmNlfENvbXBhcmFibGV8U3RyaW5nfE9iamVjdHxVbml0fEFueXxBbnlWYWx8QW55UmVmfE51bGx8U2NhbGFPYmplY3R8U2luZ2xldG9ufFNlcXxJdGVyYWJsZXxMaXN0fE9wdGlvbnxBcnJheXxDaGFyfEJ5dGV8U2hvcnR8SW50fExvbmd8Tm90aGluZyIuc3BsaXQoInwiKSksZD1lLmFycmF5VG9NYXAoIiIuc3BsaXQoInwiKSk7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJcXC9cXC8uKiQifSwobmV3IGYpLmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0Iikse3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwvXFwqIixuZXh0OiJjb21tZW50In0se3Rva2VuOiJzdHJpbmcucmVnZXhwIixyZWdleDoiWy9dKD86KD86XFxbKD86XFxcXF18W15cXF1dKStcXF0pfCg/OlxcXFwvfFteXFxdL10pKSpbL11cXHcqXFxzKig/PVspLiw7XXwkKSJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDonWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXSd9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IjBbeFhdWzAtOWEtZkEtRl0rXFxiIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIifSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLHJlZ2V4OiIoPzp0cnVlfGZhbHNlKVxcYiJ9LHt0b2tlbjpmdW5jdGlvbihlKXtyZXR1cm4gZT09InRoaXMiPyJ2YXJpYWJsZS5sYW5ndWFnZSI6YS5oYXNPd25Qcm9wZXJ0eShlKT8ia2V5d29yZCI6Yy5oYXNPd25Qcm9wZXJ0eShlKT8ic3VwcG9ydC5mdW5jdGlvbiI6ZC5oYXNPd25Qcm9wZXJ0eShlKT8ic3VwcG9ydC5mdW5jdGlvbiI6Yi5oYXNPd25Qcm9wZXJ0eShlKT8iY29uc3RhbnQubGFuZ3VhZ2UiOiJpZGVudGlmaWVyIn0scmVnZXg6IlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiJ9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6IiF8XFwkfCV8JnxcXCp8XFwtXFwtfFxcLXxcXCtcXCt8XFwrfH58PT09fD09fD18IT18IT09fDw9fD49fDw8PXw+Pj18Pj4+PXw8Pnw8fD58IXwmJnxcXHxcXHx8XFw/XFw6fFxcKj18JT18XFwrPXxcXC09fCY9fFxcXj18XFxiKD86aW58aW5zdGFuY2VvZnxuZXd8ZGVsZXRlfHR5cGVvZnx2b2lkKSJ9LHt0b2tlbjoicGFyZW4ubHBhcmVuIixyZWdleDoiW1soe10ifSx7dG9rZW46InBhcmVuLnJwYXJlbiIscmVnZXg6IltcXF0pfV0ifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn1dLGNvbW1lbnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qP1xcKlxcLyIsbmV4dDoic3RhcnQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX0sdGhpcy5lbWJlZFJ1bGVzKGYsImRvYy0iLFsobmV3IGYpLmdldEVuZFJ1bGUoInN0YXJ0IildKX07ZC5pbmhlcml0cyhoLGcpLGIuU2NhbGFIaWdobGlnaHRSdWxlcz1ofSksZnVuY3Rpb24oKXt3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSxmdW5jdGlvbihhKXt3aW5kb3cuYWNlfHwod2luZG93LmFjZT17fSk7Zm9yKHZhciBiIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShiKSYmKGFjZVtiXT1hW2JdKX0pfSgp]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-scss-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9zY3NzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvc2Nzc19oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsICdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsKdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsKdmFyIFNjc3NIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vc2Nzc19oaWdobGlnaHRfcnVsZXMiKS5TY3NzSGlnaGxpZ2h0UnVsZXM7CnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Owp2YXIgQ1N0eWxlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGU7Cgp2YXIgTW9kZSA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgU2Nzc0hpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSwgImkiKTsKICAgIHRoaXMuJG91dGRlbnQgPSBuZXcgTWF0Y2hpbmdCcmFjZU91dGRlbnQoKTsKICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IENTdHlsZUZvbGRNb2RlKCk7Cn07Cm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7CgooZnVuY3Rpb24oKSB7CiAgICAKICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7CiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsKCiAgICAgICAgLy8gaWdub3JlIGJyYWNlcyBpbiBjb21tZW50cwogICAgICAgIHZhciB0b2tlbnMgPSB0aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhsaW5lLCBzdGF0ZSkudG9rZW5zOwogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7CiAgICAgICAgICAgIHJldHVybiBpbmRlbnQ7CiAgICAgICAgfQoKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eLipce1xzKiQvKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgaW5kZW50ICs9IHRhYjsKICAgICAgICB9CgogICAgICAgIHJldHVybiBpbmRlbnQ7CiAgICB9OwoKICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsKICAgIH07CgogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgewogICAgICAgIHRoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoZG9jLCByb3cpOwogICAgfTsKCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOwoKZXhwb3J0cy5Nb2RlID0gTW9kZTsKCn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL3Njc3NfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsKdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7Cgp2YXIgU2Nzc0hpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7CiAgICAKICAgIHZhciBwcm9wZXJ0aWVzID0gbGFuZy5hcnJheVRvTWFwKCAoZnVuY3Rpb24gKCkgewoKICAgICAgICB2YXIgYnJvd3NlclByZWZpeCA9ICgiLXdlYmtpdC18LW1vei18LW8tfC1tcy18LXN2Zy18LXBpZS18LWtodG1sLSIpLnNwbGl0KCJ8Iik7CiAgICAgICAgCiAgICAgICAgdmFyIHByZWZpeFByb3BlcnRpZXMgPSAoImFwcGVhcmFuY2V8YmFja2dyb3VuZC1jbGlwfGJhY2tncm91bmQtaW5saW5lLXBvbGljeXxiYWNrZ3JvdW5kLW9yaWdpbnwiICsgCiAgICAgICAgICAgICAiYmFja2dyb3VuZC1zaXplfGJpbmRpbmd8Ym9yZGVyLWJvdHRvbS1jb2xvcnN8Ym9yZGVyLWxlZnQtY29sb3JzfCIgKyAKICAgICAgICAgICAgICJib3JkZXItcmlnaHQtY29sb3JzfGJvcmRlci10b3AtY29sb3JzfGJvcmRlci1lbmR8Ym9yZGVyLWVuZC1jb2xvcnwiICsgCiAgICAgICAgICAgICAiYm9yZGVyLWVuZC1zdHlsZXxib3JkZXItZW5kLXdpZHRofGJvcmRlci1pbWFnZXxib3JkZXItc3RhcnR8IiArIAogICAgICAgICAgICAgImJvcmRlci1zdGFydC1jb2xvcnxib3JkZXItc3RhcnQtc3R5bGV8Ym9yZGVyLXN0YXJ0LXdpZHRofGJveC1hbGlnbnwiICsgCiAgICAgICAgICAgICAiYm94LWRpcmVjdGlvbnxib3gtZmxleHxib3gtZmxleGdyb3VwfGJveC1vcmRpbmFsLWdyb3VwfGJveC1vcmllbnR8IiArIAogICAgICAgICAgICAgImJveC1wYWNrfGJveC1zaXppbmd8Y29sdW1uLWNvdW50fGNvbHVtbi1nYXB8Y29sdW1uLXdpZHRofGNvbHVtbi1ydWxlfCIgKyAKICAgICAgICAgICAgICJjb2x1bW4tcnVsZS13aWR0aHxjb2x1bW4tcnVsZS1zdHlsZXxjb2x1bW4tcnVsZS1jb2xvcnxmbG9hdC1lZGdlfCIgKyAKICAgICAgICAgICAgICJmb250LWZlYXR1cmUtc2V0dGluZ3N8Zm9udC1sYW5ndWFnZS1vdmVycmlkZXxmb3JjZS1icm9rZW4taW1hZ2UtaWNvbnwiICsgCiAgICAgICAgICAgICAiaW1hZ2UtcmVnaW9ufG1hcmdpbi1lbmR8bWFyZ2luLXN0YXJ0fG9wYWNpdHl8b3V0bGluZXxvdXRsaW5lLWNvbG9yfCIgKyAKICAgICAgICAgICAgICJvdXRsaW5lLW9mZnNldHxvdXRsaW5lLXJhZGl1c3xvdXRsaW5lLXJhZGl1cy1ib3R0b21sZWZ0fCIgKyAKICAgICAgICAgICAgICJvdXRsaW5lLXJhZGl1cy1ib3R0b21yaWdodHxvdXRsaW5lLXJhZGl1cy10b3BsZWZ0fG91dGxpbmUtcmFkaXVzLXRvcHJpZ2h0fCIgKyAKICAgICAgICAgICAgICJvdXRsaW5lLXN0eWxlfG91dGxpbmUtd2lkdGh8cGFkZGluZy1lbmR8cGFkZGluZy1zdGFydHxzdGFjay1zaXppbmd8IiArIAogICAgICAgICAgICAgInRhYi1zaXplfHRleHQtYmxpbmt8dGV4dC1kZWNvcmF0aW9uLWNvbG9yfHRleHQtZGVjb3JhdGlvbi1saW5lfCIgKyAKICAgICAgICAgICAgICJ0ZXh0LWRlY29yYXRpb24tc3R5bGV8dHJhbnNmb3JtfHRyYW5zZm9ybS1vcmlnaW58dHJhbnNpdGlvbnwiICsgCiAgICAgICAgICAgICAidHJhbnNpdGlvbi1kZWxheXx0cmFuc2l0aW9uLWR1cmF0aW9ufHRyYW5zaXRpb24tcHJvcGVydHl8IiArIAogICAgICAgICAgICAgInRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9ufHVzZXItZm9jdXN8dXNlci1pbnB1dHx1c2VyLW1vZGlmeXx1c2VyLXNlbGVjdHwiICsKICAgICAgICAgICAgICJ3aW5kb3ctc2hhZG93fGJvcmRlci1yYWRpdXMiKS5zcGxpdCgifCIpOwogICAgICAgIAogICAgICAgIHZhciBwcm9wZXJ0aWVzID0gKCJhemltdXRofGJhY2tncm91bmQtYXR0YWNobWVudHxiYWNrZ3JvdW5kLWNvbG9yfGJhY2tncm91bmQtaW1hZ2V8IiArCiAgICAgICAgICAgICJiYWNrZ3JvdW5kLXBvc2l0aW9ufGJhY2tncm91bmQtcmVwZWF0fGJhY2tncm91bmR8Ym9yZGVyLWJvdHRvbS1jb2xvcnwiICsKICAgICAgICAgICAgImJvcmRlci1ib3R0b20tc3R5bGV8Ym9yZGVyLWJvdHRvbS13aWR0aHxib3JkZXItYm90dG9tfGJvcmRlci1jb2xsYXBzZXwiICsKICAgICAgICAgICAgImJvcmRlci1jb2xvcnxib3JkZXItbGVmdC1jb2xvcnxib3JkZXItbGVmdC1zdHlsZXxib3JkZXItbGVmdC13aWR0aHwiICsKICAgICAgICAgICAgImJvcmRlci1sZWZ0fGJvcmRlci1yaWdodC1jb2xvcnxib3JkZXItcmlnaHQtc3R5bGV8Ym9yZGVyLXJpZ2h0LXdpZHRofCIgKwogICAgICAgICAgICAiYm9yZGVyLXJpZ2h0fGJvcmRlci1zcGFjaW5nfGJvcmRlci1zdHlsZXxib3JkZXItdG9wLWNvbG9yfCIgKwogICAgICAgICAgICAiYm9yZGVyLXRvcC1zdHlsZXxib3JkZXItdG9wLXdpZHRofGJvcmRlci10b3B8Ym9yZGVyLXdpZHRofGJvcmRlcnwiICsKICAgICAgICAgICAgImJvdHRvbXxib3gtc2l6aW5nfGNhcHRpb24tc2lkZXxjbGVhcnxjbGlwfGNvbG9yfGNvbnRlbnR8Y291bnRlci1pbmNyZW1lbnR8IiArCiAgICAgICAgICAgICJjb3VudGVyLXJlc2V0fGN1ZS1hZnRlcnxjdWUtYmVmb3JlfGN1ZXxjdXJzb3J8ZGlyZWN0aW9ufGRpc3BsYXl8IiArCiAgICAgICAgICAgICJlbGV2YXRpb258ZW1wdHktY2VsbHN8ZmxvYXR8Zm9udC1mYW1pbHl8Zm9udC1zaXplLWFkanVzdHxmb250LXNpemV8IiArCiAgICAgICAgICAgICJmb250LXN0cmV0Y2h8Zm9udC1zdHlsZXxmb250LXZhcmlhbnR8Zm9udC13ZWlnaHR8Zm9udHxoZWlnaHR8bGVmdHwiICsKICAgICAgICAgICAgImxldHRlci1zcGFjaW5nfGxpbmUtaGVpZ2h0fGxpc3Qtc3R5bGUtaW1hZ2V8bGlzdC1zdHlsZS1wb3NpdGlvbnwiICsKICAgICAgICAgICAgImxpc3Qtc3R5bGUtdHlwZXxsaXN0LXN0eWxlfG1hcmdpbi1ib3R0b218bWFyZ2luLWxlZnR8bWFyZ2luLXJpZ2h0fCIgKwogICAgICAgICAgICAibWFyZ2luLXRvcHxtYXJrZXItb2Zmc2V0fG1hcmdpbnxtYXJrc3xtYXgtaGVpZ2h0fG1heC13aWR0aHxtaW4taGVpZ2h0fCIgKwogICAgICAgICAgICAibWluLXdpZHRofG9wYWNpdHl8b3JwaGFuc3xvdXRsaW5lLWNvbG9yfCIgKwogICAgICAgICAgICAib3V0bGluZS1zdHlsZXxvdXRsaW5lLXdpZHRofG91dGxpbmV8b3ZlcmZsb3d8b3ZlcmZsb3cteHxvdmVyZmxvdy15fHBhZGRpbmctYm90dG9tfCIgKwogICAgICAgICAgICAicGFkZGluZy1sZWZ0fHBhZGRpbmctcmlnaHR8cGFkZGluZy10b3B8cGFkZGluZ3xwYWdlLWJyZWFrLWFmdGVyfCIgKwogICAgICAgICAgICAicGFnZS1icmVhay1iZWZvcmV8cGFnZS1icmVhay1pbnNpZGV8cGFnZXxwYXVzZS1hZnRlcnxwYXVzZS1iZWZvcmV8IiArCiAgICAgICAgICAgICJwYXVzZXxwaXRjaC1yYW5nZXxwaXRjaHxwbGF5LWR1cmluZ3xwb3NpdGlvbnxxdW90ZXN8cmljaG5lc3N8cmlnaHR8IiArCiAgICAgICAgICAgICJzaXplfHNwZWFrLWhlYWRlcnxzcGVhay1udW1lcmFsfHNwZWFrLXB1bmN0dWF0aW9ufHNwZWVjaC1yYXRlfHNwZWFrfCIgKwogICAgICAgICAgICAic3RyZXNzfHRhYmxlLWxheW91dHx0ZXh0LWFsaWdufHRleHQtZGVjb3JhdGlvbnx0ZXh0LWluZGVudHwiICsKICAgICAgICAgICAgInRleHQtc2hhZG93fHRleHQtdHJhbnNmb3JtfHRvcHx1bmljb2RlLWJpZGl8dmVydGljYWwtYWxpZ258IiArCiAgICAgICAgICAgICJ2aXNpYmlsaXR5fHZvaWNlLWZhbWlseXx2b2x1bWV8d2hpdGUtc3BhY2V8d2lkb3dzfHdpZHRofHdvcmQtc3BhY2luZ3wiICsKICAgICAgICAgICAgInotaW5kZXgiKS5zcGxpdCgifCIpOwogICAgICAgICAgCiAgICAgICAgLy9UaGUgcmV0dXJuIGFycmF5ICAgICAKICAgICAgICB2YXIgcmV0ID0gW107CiAgICAgICAgCiAgICAgICAgLy9BbGwgcHJlZml4UHJvcGVydGllcyB3aWxsIGdldCB0aGUgYnJvd3NlclByZWZpeCBpbgogICAgICAgIC8vdGhlIGJlZ25pbmcgYnkgam9pbiB0aGUgcHJlZml4UHJvcGVydGllcyBhcnJheSB3aXRoIHRoZSB2YWx1ZSBvZiBicm93c2VyUHJlZml4CiAgICAgICAgZm9yICh2YXIgaT0wLCBsbj1icm93c2VyUHJlZml4Lmxlbmd0aDsgaTxsbjsgaSsrKSB7CiAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KAogICAgICAgICAgICAgICAgcmV0LAogICAgICAgICAgICAgICAgKCggYnJvd3NlclByZWZpeFtpXSArIHByZWZpeFByb3BlcnRpZXMuam9pbigifCIgKyBicm93c2VyUHJlZml4W2ldKSApLnNwbGl0KCJ8IikpCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vQWRkIGFsc28gcHJlZml4UHJvcGVydGllcyBhbmQgcHJvcGVydGllcyB3aXRob3V0IGFueSBicm93c2VyIHByZWZpeAogICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHJldCwgcHJlZml4UHJvcGVydGllcyk7CiAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkocmV0LCBwcm9wZXJ0aWVzKTsKICAgICAgICAKICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIAogICAgfSkoKSApOwogICAgCgoKICAgIHZhciBmdW5jdGlvbnMgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCJoc2x8aHNsYXxyZ2J8cmdiYXx1cmx8YXR0cnxjb3VudGVyfGNvdW50ZXJzfGFic3xhZGp1c3RfY29sb3J8YWRqdXN0X2h1ZXwiICsKICAgICAgICAgImFscGhhfGpvaW58Ymx1ZXxjZWlsfGNoYW5nZV9jb2xvcnxjb21wYXJhYmxlfGNvbXBsZW1lbnR8ZGFya2VufGRlc2F0dXJhdGV8IiArIAogICAgICAgICAiZmxvb3J8Z3JheXNjYWxlfGdyZWVufGh1ZXxpZnxpbnZlcnR8am9pbnxsZW5ndGh8bGlnaHRlbnxsaWdodG5lc3N8bWl4fCIgKyAKICAgICAgICAgIm50aHxvcGFjaWZ5fG9wYWNpdHl8cGVyY2VudGFnZXxxdW90ZXxyZWR8cm91bmR8c2F0dXJhdGV8c2F0dXJhdGlvbnwiICsKICAgICAgICAgInNjYWxlX2NvbG9yfHRyYW5zcGFyZW50aXplfHR5cGVfb2Z8dW5pdHx1bml0bGVzc3x1bnFvdXRlIikuc3BsaXQoInwiKQogICAgKTsKCiAgICB2YXIgY29uc3RhbnRzID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgiYWJzb2x1dGV8YWxsLXNjcm9sbHxhbHdheXN8YXJtZW5pYW58YXV0b3xiYXNlbGluZXxiZWxvd3xiaWRpLW92ZXJyaWRlfCIgKwogICAgICAgICJibG9ja3xib2xkfGJvbGRlcnxib3JkZXItYm94fGJvdGh8Ym90dG9tfGJyZWFrLWFsbHxicmVhay13b3JkfGNhcGl0YWxpemV8Y2VudGVyfCIgKwogICAgICAgICJjaGFyfGNpcmNsZXxjamstaWRlb2dyYXBoaWN8Y29sLXJlc2l6ZXxjb2xsYXBzZXxjb250ZW50LWJveHxjcm9zc2hhaXJ8ZGFzaGVkfCIgKwogICAgICAgICJkZWNpbWFsLWxlYWRpbmctemVyb3xkZWNpbWFsfGRlZmF1bHR8ZGlzYWJsZWR8ZGlzY3wiICsKICAgICAgICAiZGlzdHJpYnV0ZS1hbGwtbGluZXN8ZGlzdHJpYnV0ZS1sZXR0ZXJ8ZGlzdHJpYnV0ZS1zcGFjZXwiICsKICAgICAgICAiZGlzdHJpYnV0ZXxkb3R0ZWR8ZG91YmxlfGUtcmVzaXplfGVsbGlwc2lzfGZpeGVkfGdlb3JnaWFufGdyb292ZXwiICsKICAgICAgICAiaGFuZHxoZWJyZXd8aGVscHxoaWRkZW58aGlyYWdhbmEtaXJvaGF8aGlyYWdhbmF8aG9yaXpvbnRhbHwiICsKICAgICAgICAiaWRlb2dyYXBoLWFscGhhfGlkZW9ncmFwaC1udW1lcmljfGlkZW9ncmFwaC1wYXJlbnRoZXNpc3wiICsKICAgICAgICAiaWRlb2dyYXBoLXNwYWNlfGluYWN0aXZlfGluaGVyaXR8aW5saW5lLWJsb2NrfGlubGluZXxpbnNldHxpbnNpZGV8IiArCiAgICAgICAgImludGVyLWlkZW9ncmFwaHxpbnRlci13b3JkfGl0YWxpY3xqdXN0aWZ5fGthdGFrYW5hLWlyb2hhfGthdGFrYW5hfCIgKwogICAgICAgICJrZWVwLWFsbHxsZWZ0fGxpZ2h0ZXJ8bGluZS1lZGdlfGxpbmUtdGhyb3VnaHxsaW5lfGxpc3QtaXRlbXxsb29zZXwiICsKICAgICAgICAibG93ZXItYWxwaGF8bG93ZXItZ3JlZWt8bG93ZXItbGF0aW58bG93ZXItcm9tYW58bG93ZXJjYXNlfGxyLXRifGx0cnwiICsKICAgICAgICAibWVkaXVtfG1pZGRsZXxtb3ZlfG4tcmVzaXplfG5lLXJlc2l6ZXxuZXdzcGFwZXJ8bm8tZHJvcHxuby1yZXBlYXR8IiArCiAgICAgICAgIm53LXJlc2l6ZXxub25lfG5vcm1hbHxub3QtYWxsb3dlZHxub3dyYXB8b2JsaXF1ZXxvdXRzZXR8b3V0c2lkZXwiICsKICAgICAgICAib3ZlcmxpbmV8cG9pbnRlcnxwcm9ncmVzc3xyZWxhdGl2ZXxyZXBlYXQteHxyZXBlYXQteXxyZXBlYXR8cmlnaHR8IiArCiAgICAgICAgInJpZGdlfHJvdy1yZXNpemV8cnRsfHMtcmVzaXplfHNjcm9sbHxzZS1yZXNpemV8c2VwYXJhdGV8c21hbGwtY2Fwc3wiICsKICAgICAgICAic29saWR8c3F1YXJlfHN0YXRpY3xzdHJpY3R8c3VwZXJ8c3ctcmVzaXplfHRhYmxlLWZvb3Rlci1ncm91cHwiICsKICAgICAgICAidGFibGUtaGVhZGVyLWdyb3VwfHRiLXJsfHRleHQtYm90dG9tfHRleHQtdG9wfHRleHR8dGhpY2t8dGhpbnx0b3B8IiArCiAgICAgICAgInRyYW5zcGFyZW50fHVuZGVybGluZXx1cHBlci1hbHBoYXx1cHBlci1sYXRpbnx1cHBlci1yb21hbnx1cHBlcmNhc2V8IiArCiAgICAgICAgInZlcnRpY2FsLWlkZW9ncmFwaGljfHZlcnRpY2FsLXRleHR8dmlzaWJsZXx3LXJlc2l6ZXx3YWl0fHdoaXRlc3BhY2V8IiArCiAgICAgICAgInplcm8iKS5zcGxpdCgifCIpCiAgICApOwoKICAgIHZhciBjb2xvcnMgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCJhcXVhfGJsYWNrfGJsdWV8ZnVjaHNpYXxncmF5fGdyZWVufGxpbWV8bWFyb29ufG5hdnl8b2xpdmV8b3JhbmdlfCIgKwogICAgICAgICJwdXJwbGV8cmVkfHNpbHZlcnx0ZWFsfHdoaXRlfHllbGxvdyIpLnNwbGl0KCJ8IikKICAgICk7CiAgICAKICAgIHZhciBrZXl3b3JkcyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoIkBtaXhpbnxAZXh0ZW5kfEBpbmNsdWRlfEBpbXBvcnR8QG1lZGlhfEBkZWJ1Z3xAd2FybnxAaWZ8QGZvcnxAZWFjaHxAd2hpbGV8QGVsc2V8QGZvbnQtZmFjZXxALXdlYmtpdC1rZXlmcmFtZXN8aWZ8YW5kfCFkZWZhdWx0fG1vZHVsZXxkZWZ8ZW5kfGRlY2xhcmUiKS5zcGxpdCgifCIpCiAgICApCiAgICAKICAgIHZhciB0YWdzID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgiYXxhYmJyfGFjcm9ueW18YWRkcmVzc3xhcHBsZXR8YXJlYXxhcnRpY2xlfGFzaWRlfGF1ZGlvfGJ8YmFzZXxiYXNlZm9udHxiZG98IiArIAogICAgICAgICAiYmlnfGJsb2NrcXVvdGV8Ym9keXxicnxidXR0b258Y2FudmFzfGNhcHRpb258Y2VudGVyfGNpdGV8Y29kZXxjb2x8Y29sZ3JvdXB8IiArIAogICAgICAgICAiY29tbWFuZHxkYXRhbGlzdHxkZHxkZWx8ZGV0YWlsc3xkZm58ZGlyfGRpdnxkbHxkdHxlbXxlbWJlZHxmaWVsZHNldHwiICsgCiAgICAgICAgICJmaWdjYXB0aW9ufGZpZ3VyZXxmb250fGZvb3Rlcnxmb3JtfGZyYW1lfGZyYW1lc2V0fGgxfGgyfGgzfGg0fGg1fGg2fGhlYWR8IiArIAogICAgICAgICAiaGVhZGVyfGhncm91cHxocnxodG1sfGl8aWZyYW1lfGltZ3xpbnB1dHxpbnN8a2V5Z2VufGtiZHxsYWJlbHxsZWdlbmR8bGl8IiArIAogICAgICAgICAibGlua3xtYXB8bWFya3xtZW51fG1ldGF8bWV0ZXJ8bmF2fG5vZnJhbWVzfG5vc2NyaXB0fG9iamVjdHxvbHxvcHRncm91cHwiICsgCiAgICAgICAgICJvcHRpb258b3V0cHV0fHB8cGFyYW18cHJlfHByb2dyZXNzfHF8cnB8cnR8cnVieXxzfHNhbXB8c2NyaXB0fHNlY3Rpb258c2VsZWN0fCIgKyAKICAgICAgICAgInNtYWxsfHNvdXJjZXxzcGFufHN0cmlrZXxzdHJvbmd8c3R5bGV8c3VifHN1bW1hcnl8c3VwfHRhYmxlfHRib2R5fHRkfCIgKyAKICAgICAgICAgInRleHRhcmVhfHRmb290fHRofHRoZWFkfHRpbWV8dGl0bGV8dHJ8dHR8dXx1bHx2YXJ8dmlkZW98d2JyfHhtcCIpLnNwbGl0KCJ8IikKICAgICk7CgogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBVc2UgKD86KSBpbnN0ZWFkLgogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZAoKICAgIHZhciBudW1SZSA9ICJcXC0/KD86KD86WzAtOV0rKXwoPzpbMC05XSpcXC5bMC05XSspKSI7CgogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBVc2UgKD86KSBpbnN0ZWFkLgogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZAoKICAgIHRoaXMuJHJ1bGVzID0gewogICAgICAgICJzdGFydCIgOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwvLiokIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gbXVsdGkgbGluZSBjb21tZW50CiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXC9cXCoiLAogICAgICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdKD86KD86XFxcXC4pfCg/OlteIlxcXFxdKSkqP1siXScKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogJ1siXS4qXFxcXCQnLAogICAgICAgICAgICAgICAgbmV4dCA6ICJxcXN0cmluZyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gc2luZ2xlIGxpbmUKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXSg/Oig/OlxcXFwuKXwoPzpbXidcXFxcXSkpKj9bJ10iCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0CiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICJbJ10uKlxcXFwkIiwKICAgICAgICAgICAgICAgIG5leHQgOiAicXN0cmluZyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsCiAgICAgICAgICAgICAgICByZWdleCA6IG51bVJlICsgIig/OmVtfGV4fHB4fGNtfG1tfGlufHB0fHBjfGRlZ3xyYWR8Z3JhZHxtc3xzfGh6fGtoenwlKSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleDYgY29sb3IKICAgICAgICAgICAgICAgIHJlZ2V4IDogIiNbYS1mMC05XXs2fSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGhleDMgY29sb3IKICAgICAgICAgICAgICAgIHJlZ2V4IDogIiNbYS1mMC05XXszfSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsCiAgICAgICAgICAgICAgICByZWdleCA6IG51bVJlCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZS50b0xvd2VyQ2FzZSgpKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LnR5cGUiOwogICAgICAgICAgICAgICAgICAgIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29uc3RhbnRzLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb25zdGFudC5sYW5ndWFnZSI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZnVuY3Rpb25zLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmZ1bmN0aW9uIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2xvcnMuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAic3VwcG9ydC5jb25zdGFudC5jb2xvciI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGFncy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZS50b0xvd2VyQ2FzZSgpKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS5sYW5ndWFnZSI7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInRleHQiOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcLT9bQGEtel9dW0BhLXowLTlfXFwtXSoiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInZhcmlhYmxlIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlthLXpfXFwtJF1bYS16MC05X1xcLSRdKlxcYiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW46ICJ2YXJpYWJsZS5sYW5ndWFnZSIsCiAgICAgICAgICAgICAgICByZWdleDogIiNbYS16MC05LV9dKyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW46ICJ2YXJpYWJsZS5sYW5ndWFnZSIsCiAgICAgICAgICAgICAgICByZWdleDogIlxcLlthLXowLTktX10rIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbjogInZhcmlhYmxlLmxhbmd1YWdlIiwKICAgICAgICAgICAgICAgIHJlZ2V4OiAiOlthLXowLTktX10rIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbjogImNvbnN0YW50IiwKICAgICAgICAgICAgICAgIHJlZ2V4OiAiW2EtejAtOS1fXSsiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiPHw+fDw9fD49fD09fCE9fC18JXwjfFxcK3xcXCR8XFwrfFxcKiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ubHBhcmVuIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIltbKHtdIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5ycGFyZW4iLAogICAgICAgICAgICAgICAgcmVnZXggOiAiW1xcXSl9XSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIgogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiY29tbWVudCIgOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQKICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyIKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInFxc3RyaW5nIiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogJyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJywKICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKycKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInFzdHJpbmciIDogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqPyciLAogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJwogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfTsKfTsKCm9vcC5pbmhlcml0cyhTY3NzSGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7CgpleHBvcnRzLlNjc3NIaWdobGlnaHRSdWxlcyA9IFNjc3NIaWdobGlnaHRSdWxlczsKCn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsKCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IGZ1bmN0aW9uKCkge307CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihsaW5lLCBpbnB1dCkgewogICAgICAgIGlmICghIC9eXHMrJC8udGVzdChsaW5lKSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgICByZXR1cm4gL15ccypcfS8udGVzdChpbnB1dCk7CiAgICB9OwoKICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihkb2MsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocm93KTsKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKlx9KS8pOwoKICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDsKCiAgICAgICAgdmFyIGNvbHVtbiA9IG1hdGNoWzFdLmxlbmd0aDsKICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gZG9jLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn0pOwoKICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcyB8fCBvcGVuQnJhY2VQb3Mucm93ID09IHJvdykgcmV0dXJuIDA7CgogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOwogICAgICAgIGRvYy5yZXBsYWNlKG5ldyBSYW5nZShyb3csIDAsIHJvdywgY29sdW1uLTEpLCBpbmRlbnQpOwogICAgfTsKCiAgICB0aGlzLiRnZXRJbmRlbnQgPSBmdW5jdGlvbihsaW5lKSB7CiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAiIjsKICAgIH07Cgp9KS5jYWxsKE1hdGNoaW5nQnJhY2VPdXRkZW50LnByb3RvdHlwZSk7CgpleHBvcnRzLk1hdGNoaW5nQnJhY2VPdXRkZW50ID0gTWF0Y2hpbmdCcmFjZU91dGRlbnQ7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7CnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7CnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOwoKdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307Cm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IC8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvOwogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IC9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLzsKICAgIAogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXg7CgogICAgICAgICAgICBpZiAobWF0Y2hbMV0pCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKHNlc3Npb24sIG1hdGNoWzFdLCByb3csIGkpOwoKICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSArIG1hdGNoWzBdLmxlbmd0aCk7CiAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsKICAgICAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGZvbGRTdHlsZSAhPT0gIm1hcmtiZWdpbmVuZCIpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDsKCiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkgewogICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSk7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiByb3csIGNvbHVtbjogaX07CiAgICAgICAgICAgIHZhciBzdGFydCA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldChtYXRjaFsxXSwgZW5kKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICghc3RhcnQpCiAgICAgICAgICAgICAgICByZXR1cm47CgogICAgICAgICAgICBzdGFydC5jb2x1bW4rKzsKICAgICAgICAgICAgZW5kLmNvbHVtbi0tOwoKICAgICAgICAgICAgcmV0dXJuICBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOwogICAgICAgIH0KICAgIH07CiAgICAKfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOwoKfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOwoKdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSBudWxsOwogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7CgogICAgLy8gbXVzdCByZXR1cm4gIiIgaWYgdGhlcmUncyBubyBmb2xkLCB0byBlbmFibGUgY2FjaGluZwogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsKICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOwogICAgICAgIGlmICh0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGxpbmUpKQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsKICAgICAgICBpZiAoZm9sZFN0eWxlID09ICJtYXJrYmVnaW5lbmQiCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpCiAgICAgICAgICAgIHJldHVybiAiZW5kIjsKICAgICAgICByZXR1cm4gIiI7CiAgICB9OwogICAgCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7CiAgICAgICAgdmFyIHJlID0gL15ccyovOwogICAgICAgIHZhciBzdGFydFJvdyA9IHJvdzsKICAgICAgICB2YXIgZW5kUm93ID0gcm93OwogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgdmFyIHN0YXJ0Q29sdW1uID0gY29sdW1uIHx8IGxpbmUubGVuZ3RoOwogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOwogICAgICAgIHZhciBtYXhSb3cgPSBzZXNzaW9uLmdldExlbmd0aCgpCiAgICAgICAgCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7CiAgICAgICAgICAgIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICAgICAgdmFyIGxldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOwoKICAgICAgICAgICAgaWYgKGxldmVsID09IGxpbmUubGVuZ3RoKQogICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICBpZiAobGV2ZWwgPD0gc3RhcnRMZXZlbCkKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgZW5kUm93ID0gcm93OwogICAgICAgIH0KCiAgICAgICAgaWYgKGVuZFJvdyA+IHN0YXJ0Um93KSB7CiAgICAgICAgICAgIHZhciBlbmRDb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kUm93KS5sZW5ndGg7CiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7CiAgICAgICAgfQogICAgfTsKCiAgICB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCBicmFja2V0LCByb3csIGNvbHVtbikgewogICAgICAgIHZhciBzdGFydCA9IHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW4gKyAxfTsKICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsKICAgICAgICBpZiAoIWVuZCkKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICB2YXIgZncgPSBzZXNzaW9uLmZvbGRXaWRnZXRzW2VuZC5yb3ddOwogICAgICAgIGlmIChmdyA9PSBudWxsKQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsKCiAgICAgICAgaWYgKGZ3ID09ICJzdGFydCIpIHsKICAgICAgICAgICAgZW5kLnJvdyAtLTsKICAgICAgICAgICAgZW5kLmNvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmQucm93KS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOwogICAgfTsKCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsKCn0pOwo7CiAgICAgICAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAg]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-scss.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9zY3NzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL3Njc3NfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3RleHQiKS5Nb2RlLGY9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGc9YSgiLi9zY3NzX2hpZ2hsaWdodF9ydWxlcyIpLlNjc3NIaWdobGlnaHRSdWxlcyxoPWEoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50LGk9YSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlLGo9ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbml6ZXI9bmV3IGYoKG5ldyBnKS5nZXRSdWxlcygpLCJpIiksdGhpcy4kb3V0ZGVudD1uZXcgaCx0aGlzLmZvbGRpbmdSdWxlcz1uZXcgaX07ZC5pbmhlcml0cyhqLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy4kZ2V0SW5kZW50KGIpLGU9dGhpcy4kdG9rZW5pemVyLmdldExpbmVUb2tlbnMoYixhKS50b2tlbnM7aWYoZS5sZW5ndGgmJmVbZS5sZW5ndGgtMV0udHlwZT09ImNvbW1lbnQiKXJldHVybiBkO3ZhciBmPWIubWF0Y2goL14uKlx7XHMqJC8pO3JldHVybiBmJiYoZCs9YyksZH0sdGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChiLGMpfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGEsYixjKXt0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGIsYyl9fS5jYWxsKGoucHJvdG90eXBlKSxiLk1vZGU9an0pLGRlZmluZSgiYWNlL21vZGUvc2Nzc19oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxnPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKGZ1bmN0aW9uKCl7dmFyIGE9Ii13ZWJraXQtfC1tb3otfC1vLXwtbXMtfC1zdmctfC1waWUtfC1raHRtbC0iLnNwbGl0KCJ8IiksYj0iYXBwZWFyYW5jZXxiYWNrZ3JvdW5kLWNsaXB8YmFja2dyb3VuZC1pbmxpbmUtcG9saWN5fGJhY2tncm91bmQtb3JpZ2lufGJhY2tncm91bmQtc2l6ZXxiaW5kaW5nfGJvcmRlci1ib3R0b20tY29sb3JzfGJvcmRlci1sZWZ0LWNvbG9yc3xib3JkZXItcmlnaHQtY29sb3JzfGJvcmRlci10b3AtY29sb3JzfGJvcmRlci1lbmR8Ym9yZGVyLWVuZC1jb2xvcnxib3JkZXItZW5kLXN0eWxlfGJvcmRlci1lbmQtd2lkdGh8Ym9yZGVyLWltYWdlfGJvcmRlci1zdGFydHxib3JkZXItc3RhcnQtY29sb3J8Ym9yZGVyLXN0YXJ0LXN0eWxlfGJvcmRlci1zdGFydC13aWR0aHxib3gtYWxpZ258Ym94LWRpcmVjdGlvbnxib3gtZmxleHxib3gtZmxleGdyb3VwfGJveC1vcmRpbmFsLWdyb3VwfGJveC1vcmllbnR8Ym94LXBhY2t8Ym94LXNpemluZ3xjb2x1bW4tY291bnR8Y29sdW1uLWdhcHxjb2x1bW4td2lkdGh8Y29sdW1uLXJ1bGV8Y29sdW1uLXJ1bGUtd2lkdGh8Y29sdW1uLXJ1bGUtc3R5bGV8Y29sdW1uLXJ1bGUtY29sb3J8ZmxvYXQtZWRnZXxmb250LWZlYXR1cmUtc2V0dGluZ3N8Zm9udC1sYW5ndWFnZS1vdmVycmlkZXxmb3JjZS1icm9rZW4taW1hZ2UtaWNvbnxpbWFnZS1yZWdpb258bWFyZ2luLWVuZHxtYXJnaW4tc3RhcnR8b3BhY2l0eXxvdXRsaW5lfG91dGxpbmUtY29sb3J8b3V0bGluZS1vZmZzZXR8b3V0bGluZS1yYWRpdXN8b3V0bGluZS1yYWRpdXMtYm90dG9tbGVmdHxvdXRsaW5lLXJhZGl1cy1ib3R0b21yaWdodHxvdXRsaW5lLXJhZGl1cy10b3BsZWZ0fG91dGxpbmUtcmFkaXVzLXRvcHJpZ2h0fG91dGxpbmUtc3R5bGV8b3V0bGluZS13aWR0aHxwYWRkaW5nLWVuZHxwYWRkaW5nLXN0YXJ0fHN0YWNrLXNpemluZ3x0YWItc2l6ZXx0ZXh0LWJsaW5rfHRleHQtZGVjb3JhdGlvbi1jb2xvcnx0ZXh0LWRlY29yYXRpb24tbGluZXx0ZXh0LWRlY29yYXRpb24tc3R5bGV8dHJhbnNmb3JtfHRyYW5zZm9ybS1vcmlnaW58dHJhbnNpdGlvbnx0cmFuc2l0aW9uLWRlbGF5fHRyYW5zaXRpb24tZHVyYXRpb258dHJhbnNpdGlvbi1wcm9wZXJ0eXx0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbnx1c2VyLWZvY3VzfHVzZXItaW5wdXR8dXNlci1tb2RpZnl8dXNlci1zZWxlY3R8d2luZG93LXNoYWRvd3xib3JkZXItcmFkaXVzIi5zcGxpdCgifCIpLGM9ImF6aW11dGh8YmFja2dyb3VuZC1hdHRhY2htZW50fGJhY2tncm91bmQtY29sb3J8YmFja2dyb3VuZC1pbWFnZXxiYWNrZ3JvdW5kLXBvc2l0aW9ufGJhY2tncm91bmQtcmVwZWF0fGJhY2tncm91bmR8Ym9yZGVyLWJvdHRvbS1jb2xvcnxib3JkZXItYm90dG9tLXN0eWxlfGJvcmRlci1ib3R0b20td2lkdGh8Ym9yZGVyLWJvdHRvbXxib3JkZXItY29sbGFwc2V8Ym9yZGVyLWNvbG9yfGJvcmRlci1sZWZ0LWNvbG9yfGJvcmRlci1sZWZ0LXN0eWxlfGJvcmRlci1sZWZ0LXdpZHRofGJvcmRlci1sZWZ0fGJvcmRlci1yaWdodC1jb2xvcnxib3JkZXItcmlnaHQtc3R5bGV8Ym9yZGVyLXJpZ2h0LXdpZHRofGJvcmRlci1yaWdodHxib3JkZXItc3BhY2luZ3xib3JkZXItc3R5bGV8Ym9yZGVyLXRvcC1jb2xvcnxib3JkZXItdG9wLXN0eWxlfGJvcmRlci10b3Atd2lkdGh8Ym9yZGVyLXRvcHxib3JkZXItd2lkdGh8Ym9yZGVyfGJvdHRvbXxib3gtc2l6aW5nfGNhcHRpb24tc2lkZXxjbGVhcnxjbGlwfGNvbG9yfGNvbnRlbnR8Y291bnRlci1pbmNyZW1lbnR8Y291bnRlci1yZXNldHxjdWUtYWZ0ZXJ8Y3VlLWJlZm9yZXxjdWV8Y3Vyc29yfGRpcmVjdGlvbnxkaXNwbGF5fGVsZXZhdGlvbnxlbXB0eS1jZWxsc3xmbG9hdHxmb250LWZhbWlseXxmb250LXNpemUtYWRqdXN0fGZvbnQtc2l6ZXxmb250LXN0cmV0Y2h8Zm9udC1zdHlsZXxmb250LXZhcmlhbnR8Zm9udC13ZWlnaHR8Zm9udHxoZWlnaHR8bGVmdHxsZXR0ZXItc3BhY2luZ3xsaW5lLWhlaWdodHxsaXN0LXN0eWxlLWltYWdlfGxpc3Qtc3R5bGUtcG9zaXRpb258bGlzdC1zdHlsZS10eXBlfGxpc3Qtc3R5bGV8bWFyZ2luLWJvdHRvbXxtYXJnaW4tbGVmdHxtYXJnaW4tcmlnaHR8bWFyZ2luLXRvcHxtYXJrZXItb2Zmc2V0fG1hcmdpbnxtYXJrc3xtYXgtaGVpZ2h0fG1heC13aWR0aHxtaW4taGVpZ2h0fG1pbi13aWR0aHxvcGFjaXR5fG9ycGhhbnN8b3V0bGluZS1jb2xvcnxvdXRsaW5lLXN0eWxlfG91dGxpbmUtd2lkdGh8b3V0bGluZXxvdmVyZmxvd3xvdmVyZmxvdy14fG92ZXJmbG93LXl8cGFkZGluZy1ib3R0b218cGFkZGluZy1sZWZ0fHBhZGRpbmctcmlnaHR8cGFkZGluZy10b3B8cGFkZGluZ3xwYWdlLWJyZWFrLWFmdGVyfHBhZ2UtYnJlYWstYmVmb3JlfHBhZ2UtYnJlYWstaW5zaWRlfHBhZ2V8cGF1c2UtYWZ0ZXJ8cGF1c2UtYmVmb3JlfHBhdXNlfHBpdGNoLXJhbmdlfHBpdGNofHBsYXktZHVyaW5nfHBvc2l0aW9ufHF1b3Rlc3xyaWNobmVzc3xyaWdodHxzaXplfHNwZWFrLWhlYWRlcnxzcGVhay1udW1lcmFsfHNwZWFrLXB1bmN0dWF0aW9ufHNwZWVjaC1yYXRlfHNwZWFrfHN0cmVzc3x0YWJsZS1sYXlvdXR8dGV4dC1hbGlnbnx0ZXh0LWRlY29yYXRpb258dGV4dC1pbmRlbnR8dGV4dC1zaGFkb3d8dGV4dC10cmFuc2Zvcm18dG9wfHVuaWNvZGUtYmlkaXx2ZXJ0aWNhbC1hbGlnbnx2aXNpYmlsaXR5fHZvaWNlLWZhbWlseXx2b2x1bWV8d2hpdGUtc3BhY2V8d2lkb3dzfHdpZHRofHdvcmQtc3BhY2luZ3x6LWluZGV4Ii5zcGxpdCgifCIpLGQ9W107Zm9yKHZhciBlPTAsZj1hLmxlbmd0aDtlPGY7ZSsrKUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGQsKGFbZV0rYi5qb2luKCJ8IithW2VdKSkuc3BsaXQoInwiKSk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGQsYiksQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoZCxjKSxkfSgpKSxiPWUuYXJyYXlUb01hcCgiaHNsfGhzbGF8cmdifHJnYmF8dXJsfGF0dHJ8Y291bnRlcnxjb3VudGVyc3xhYnN8YWRqdXN0X2NvbG9yfGFkanVzdF9odWV8YWxwaGF8am9pbnxibHVlfGNlaWx8Y2hhbmdlX2NvbG9yfGNvbXBhcmFibGV8Y29tcGxlbWVudHxkYXJrZW58ZGVzYXR1cmF0ZXxmbG9vcnxncmF5c2NhbGV8Z3JlZW58aHVlfGlmfGludmVydHxqb2lufGxlbmd0aHxsaWdodGVufGxpZ2h0bmVzc3xtaXh8bnRofG9wYWNpZnl8b3BhY2l0eXxwZXJjZW50YWdlfHF1b3RlfHJlZHxyb3VuZHxzYXR1cmF0ZXxzYXR1cmF0aW9ufHNjYWxlX2NvbG9yfHRyYW5zcGFyZW50aXplfHR5cGVfb2Z8dW5pdHx1bml0bGVzc3x1bnFvdXRlIi5zcGxpdCgifCIpKSxjPWUuYXJyYXlUb01hcCgiYWJzb2x1dGV8YWxsLXNjcm9sbHxhbHdheXN8YXJtZW5pYW58YXV0b3xiYXNlbGluZXxiZWxvd3xiaWRpLW92ZXJyaWRlfGJsb2NrfGJvbGR8Ym9sZGVyfGJvcmRlci1ib3h8Ym90aHxib3R0b218YnJlYWstYWxsfGJyZWFrLXdvcmR8Y2FwaXRhbGl6ZXxjZW50ZXJ8Y2hhcnxjaXJjbGV8Y2prLWlkZW9ncmFwaGljfGNvbC1yZXNpemV8Y29sbGFwc2V8Y29udGVudC1ib3h8Y3Jvc3NoYWlyfGRhc2hlZHxkZWNpbWFsLWxlYWRpbmctemVyb3xkZWNpbWFsfGRlZmF1bHR8ZGlzYWJsZWR8ZGlzY3xkaXN0cmlidXRlLWFsbC1saW5lc3xkaXN0cmlidXRlLWxldHRlcnxkaXN0cmlidXRlLXNwYWNlfGRpc3RyaWJ1dGV8ZG90dGVkfGRvdWJsZXxlLXJlc2l6ZXxlbGxpcHNpc3xmaXhlZHxnZW9yZ2lhbnxncm9vdmV8aGFuZHxoZWJyZXd8aGVscHxoaWRkZW58aGlyYWdhbmEtaXJvaGF8aGlyYWdhbmF8aG9yaXpvbnRhbHxpZGVvZ3JhcGgtYWxwaGF8aWRlb2dyYXBoLW51bWVyaWN8aWRlb2dyYXBoLXBhcmVudGhlc2lzfGlkZW9ncmFwaC1zcGFjZXxpbmFjdGl2ZXxpbmhlcml0fGlubGluZS1ibG9ja3xpbmxpbmV8aW5zZXR8aW5zaWRlfGludGVyLWlkZW9ncmFwaHxpbnRlci13b3JkfGl0YWxpY3xqdXN0aWZ5fGthdGFrYW5hLWlyb2hhfGthdGFrYW5hfGtlZXAtYWxsfGxlZnR8bGlnaHRlcnxsaW5lLWVkZ2V8bGluZS10aHJvdWdofGxpbmV8bGlzdC1pdGVtfGxvb3NlfGxvd2VyLWFscGhhfGxvd2VyLWdyZWVrfGxvd2VyLWxhdGlufGxvd2VyLXJvbWFufGxvd2VyY2FzZXxsci10YnxsdHJ8bWVkaXVtfG1pZGRsZXxtb3ZlfG4tcmVzaXplfG5lLXJlc2l6ZXxuZXdzcGFwZXJ8bm8tZHJvcHxuby1yZXBlYXR8bnctcmVzaXplfG5vbmV8bm9ybWFsfG5vdC1hbGxvd2VkfG5vd3JhcHxvYmxpcXVlfG91dHNldHxvdXRzaWRlfG92ZXJsaW5lfHBvaW50ZXJ8cHJvZ3Jlc3N8cmVsYXRpdmV8cmVwZWF0LXh8cmVwZWF0LXl8cmVwZWF0fHJpZ2h0fHJpZGdlfHJvdy1yZXNpemV8cnRsfHMtcmVzaXplfHNjcm9sbHxzZS1yZXNpemV8c2VwYXJhdGV8c21hbGwtY2Fwc3xzb2xpZHxzcXVhcmV8c3RhdGljfHN0cmljdHxzdXBlcnxzdy1yZXNpemV8dGFibGUtZm9vdGVyLWdyb3VwfHRhYmxlLWhlYWRlci1ncm91cHx0Yi1ybHx0ZXh0LWJvdHRvbXx0ZXh0LXRvcHx0ZXh0fHRoaWNrfHRoaW58dG9wfHRyYW5zcGFyZW50fHVuZGVybGluZXx1cHBlci1hbHBoYXx1cHBlci1sYXRpbnx1cHBlci1yb21hbnx1cHBlcmNhc2V8dmVydGljYWwtaWRlb2dyYXBoaWN8dmVydGljYWwtdGV4dHx2aXNpYmxlfHctcmVzaXplfHdhaXR8d2hpdGVzcGFjZXx6ZXJvIi5zcGxpdCgifCIpKSxkPWUuYXJyYXlUb01hcCgiYXF1YXxibGFja3xibHVlfGZ1Y2hzaWF8Z3JheXxncmVlbnxsaW1lfG1hcm9vbnxuYXZ5fG9saXZlfG9yYW5nZXxwdXJwbGV8cmVkfHNpbHZlcnx0ZWFsfHdoaXRlfHllbGxvdyIuc3BsaXQoInwiKSksZj1lLmFycmF5VG9NYXAoIkBtaXhpbnxAZXh0ZW5kfEBpbmNsdWRlfEBpbXBvcnR8QG1lZGlhfEBkZWJ1Z3xAd2FybnxAaWZ8QGZvcnxAZWFjaHxAd2hpbGV8QGVsc2V8QGZvbnQtZmFjZXxALXdlYmtpdC1rZXlmcmFtZXN8aWZ8YW5kfCFkZWZhdWx0fG1vZHVsZXxkZWZ8ZW5kfGRlY2xhcmUiLnNwbGl0KCJ8IikpLGc9ZS5hcnJheVRvTWFwKCJhfGFiYnJ8YWNyb255bXxhZGRyZXNzfGFwcGxldHxhcmVhfGFydGljbGV8YXNpZGV8YXVkaW98YnxiYXNlfGJhc2Vmb250fGJkb3xiaWd8YmxvY2txdW90ZXxib2R5fGJyfGJ1dHRvbnxjYW52YXN8Y2FwdGlvbnxjZW50ZXJ8Y2l0ZXxjb2RlfGNvbHxjb2xncm91cHxjb21tYW5kfGRhdGFsaXN0fGRkfGRlbHxkZXRhaWxzfGRmbnxkaXJ8ZGl2fGRsfGR0fGVtfGVtYmVkfGZpZWxkc2V0fGZpZ2NhcHRpb258ZmlndXJlfGZvbnR8Zm9vdGVyfGZvcm18ZnJhbWV8ZnJhbWVzZXR8aDF8aDJ8aDN8aDR8aDV8aDZ8aGVhZHxoZWFkZXJ8aGdyb3VwfGhyfGh0bWx8aXxpZnJhbWV8aW1nfGlucHV0fGluc3xrZXlnZW58a2JkfGxhYmVsfGxlZ2VuZHxsaXxsaW5rfG1hcHxtYXJrfG1lbnV8bWV0YXxtZXRlcnxuYXZ8bm9mcmFtZXN8bm9zY3JpcHR8b2JqZWN0fG9sfG9wdGdyb3VwfG9wdGlvbnxvdXRwdXR8cHxwYXJhbXxwcmV8cHJvZ3Jlc3N8cXxycHxydHxydWJ5fHN8c2FtcHxzY3JpcHR8c2VjdGlvbnxzZWxlY3R8c21hbGx8c291cmNlfHNwYW58c3RyaWtlfHN0cm9uZ3xzdHlsZXxzdWJ8c3VtbWFyeXxzdXB8dGFibGV8dGJvZHl8dGR8dGV4dGFyZWF8dGZvb3R8dGh8dGhlYWR8dGltZXx0aXRsZXx0cnx0dHx1fHVsfHZhcnx2aWRlb3x3YnJ8eG1wIi5zcGxpdCgifCIpKSxoPSJcXC0/KD86KD86WzAtOV0rKXwoPzpbMC05XSpcXC5bMC05XSspKSI7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJcXC9cXC8uKiQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCoiLG5leHQ6ImNvbW1lbnQifSx7dG9rZW46InN0cmluZyIscmVnZXg6J1siXSg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj9bIl0nfSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6J1siXS4qXFxcXCQnLG5leHQ6InFxc3RyaW5nIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJbJ10oPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/WyddIn0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiJbJ10uKlxcXFwkIixuZXh0OiJxc3RyaW5nIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDpoKyIoPzplbXxleHxweHxjbXxtbXxpbnxwdHxwY3xkZWd8cmFkfGdyYWR8bXN8c3xoenxraHp8JSkifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIjW2EtZjAtOV17Nn0ifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiIjW2EtZjAtOV17M30ifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4Omh9LHt0b2tlbjpmdW5jdGlvbihlKXtyZXR1cm4gYS5oYXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpPyJzdXBwb3J0LnR5cGUiOmYuaGFzT3duUHJvcGVydHkoZSk/ImtleXdvcmQiOmMuaGFzT3duUHJvcGVydHkoZSk/ImNvbnN0YW50Lmxhbmd1YWdlIjpiLmhhc093blByb3BlcnR5KGUpPyJzdXBwb3J0LmZ1bmN0aW9uIjpkLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/InN1cHBvcnQuY29uc3RhbnQuY29sb3IiOmcuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT8idmFyaWFibGUubGFuZ3VhZ2UiOiJ0ZXh0In0scmVnZXg6IlxcLT9bQGEtel9dW0BhLXowLTlfXFwtXSoifSx7dG9rZW46InZhcmlhYmxlIixyZWdleDoiW2Etel9cXC0kXVthLXowLTlfXFwtJF0qXFxiIn0se3Rva2VuOiJ2YXJpYWJsZS5sYW5ndWFnZSIscmVnZXg6IiNbYS16MC05LV9dKyJ9LHt0b2tlbjoidmFyaWFibGUubGFuZ3VhZ2UiLHJlZ2V4OiJcXC5bYS16MC05LV9dKyJ9LHt0b2tlbjoidmFyaWFibGUubGFuZ3VhZ2UiLHJlZ2V4OiI6W2EtejAtOS1fXSsifSx7dG9rZW46ImNvbnN0YW50IixyZWdleDoiW2EtejAtOS1fXSsifSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiI8fD58PD18Pj18PT18IT18LXwlfCN8XFwrfFxcJHxcXCt8XFwqIn0se3Rva2VuOiJwYXJlbi5scGFyZW4iLHJlZ2V4OiJbWyh7XSJ9LHt0b2tlbjoicGFyZW4ucnBhcmVuIixyZWdleDoiW1xcXSl9XSJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifV0sY29tbWVudDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLio/XFwqXFwvIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLHFxc3RyaW5nOlt7dG9rZW46InN0cmluZyIscmVnZXg6Jyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJyxuZXh0OiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLisifV0scXN0cmluZzpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OiIoPzooPzpcXFxcLil8KD86W14nXFxcXF0pKSo/JyIsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfX07ZC5pbmhlcml0cyhnLGYpLGIuU2Nzc0hpZ2hsaWdodFJ1bGVzPWd9KSxkZWZpbmUoImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3JhbmdlIikuUmFuZ2UsZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuL15ccyskLy50ZXN0KGEpPy9eXHMqXH0vLnRlc3QoYik6ITF9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldExpbmUoYiksZT1jLm1hdGNoKC9eKFxzKlx9KS8pO2lmKCFlKXJldHVybiAwO3ZhciBmPWVbMV0ubGVuZ3RoLGc9YS5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6Yixjb2x1bW46Zn0pO2lmKCFnfHxnLnJvdz09YilyZXR1cm4gMDt2YXIgaD10aGlzLiRnZXRJbmRlbnQoYS5nZXRMaW5lKGcucm93KSk7YS5yZXBsYWNlKG5ldyBkKGIsMCxiLGYtMSksaCl9LHRoaXMuJGdldEluZGVudD1mdW5jdGlvbihhKXt2YXIgYj1hLm1hdGNoKC9eKFxzKykvKTtyZXR1cm4gYj9iWzFdOiIifX0pKS5jYWxsKGUucHJvdG90eXBlKSxiLk1hdGNoaW5nQnJhY2VPdXRkZW50PWV9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvcmFuZ2UiLCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxmPWEoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGUsZz1iLkZvbGRNb2RlPWZ1bmN0aW9uKCl7fTtkLmluaGVyaXRzKGcsZiksZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj0vKFx7fFxbKVteXH1cXV0qJHxeXHMqKFwvXCopLyx0aGlzLmZvbGRpbmdTdG9wTWFya2VyPS9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLyx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpLGY9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7aWYoZil7dmFyIGc9Zi5pbmRleDtpZihmWzFdKXJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soYSxmWzFdLGMsZyk7dmFyIGg9YS5nZXRDb21tZW50Rm9sZFJhbmdlKGMsZytmWzBdLmxlbmd0aCk7cmV0dXJuIGguZW5kLmNvbHVtbi09MixofWlmKGIhPT0ibWFya2JlZ2luZW5kIilyZXR1cm47dmFyIGY9ZC5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTtpZihmKXt2YXIgZz1mLmluZGV4K2ZbMF0ubGVuZ3RoO2lmKGZbMl0pe3ZhciBoPWEuZ2V0Q29tbWVudEZvbGRSYW5nZShjLGcpO3JldHVybiBoLmVuZC5jb2x1bW4tPTIsaH12YXIgaT17cm93OmMsY29sdW1uOmd9LGo9YS4kZmluZE9wZW5pbmdCcmFja2V0KGZbMV0saSk7aWYoIWopcmV0dXJuO3JldHVybiBqLmNvbHVtbisrLGkuY29sdW1uLS0sZS5mcm9tUG9pbnRzKGosaSl9fX0uY2FsbChnLnByb3RvdHlwZSl9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGU9Yi5Gb2xkTW9kZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPW51bGwsdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj1udWxsLHRoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRMaW5lKGMpO3JldHVybiB0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGQpPyJzdGFydCI6Yj09Im1hcmtiZWdpbmVuZCImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChkKT8iZW5kIjoiIn0sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBudWxsfSx0aGlzLmluZGVudGF0aW9uQmxvY2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPS9eXHMqLyxmPWIsZz1iLGg9YS5nZXRMaW5lKGIpLGk9Y3x8aC5sZW5ndGgsaj1oLm1hdGNoKGUpWzBdLmxlbmd0aCxrPWEuZ2V0TGVuZ3RoKCk7d2hpbGUoKytiPGspe2g9YS5nZXRMaW5lKGIpO3ZhciBsPWgubWF0Y2goZSlbMF0ubGVuZ3RoO2lmKGw9PWgubGVuZ3RoKWNvbnRpbnVlO2lmKGw8PWopYnJlYWs7Zz1ifWlmKGc+Zil7dmFyIG09YS5nZXRMaW5lKGcpLmxlbmd0aDtyZXR1cm4gbmV3IGQoZixpLGcsbSl9fSx0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2s9ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGY9e3JvdzpjLGNvbHVtbjplKzF9LGc9YS4kZmluZENsb3NpbmdCcmFja2V0KGIsZik7aWYoIWcpcmV0dXJuO3ZhciBoPWEuZm9sZFdpZGdldHNbZy5yb3ddO3JldHVybiBoPT1udWxsJiYoaD10aGlzLmdldEZvbGRXaWRnZXQoYSxnLnJvdykpLGg9PSJzdGFydCImJihnLnJvdy0tLGcuY29sdW1uPWEuZ2V0TGluZShnLnJvdykubGVuZ3RoKSxkLmZyb21Qb2ludHMoZixnKX19KSkuY2FsbChlLnByb3RvdHlwZSl9KSxmdW5jdGlvbigpe3dpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLGZ1bmN0aW9uKGEpe3dpbmRvdy5hY2V8fCh3aW5kb3cuYWNlPXt9KTtmb3IodmFyIGIgaW4gYSlhLmhhc093blByb3BlcnR5KGIpJiYoYWNlW2JdPWFbYl0pfSl9KCk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-sql-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgoqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgoqCiogQ29udHJpYnV0b3Iocyk6CiogICAgICBKb25hdGhhbiBDYW1pbGUgPGpvbmF0aGFuLmNhbWlsZSBBVCBnbWFpbCBET1QgY29tPgoqCiogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAoqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwoqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQoqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgoqCiogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvc3FsJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvc3FsX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7CnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7CnZhciBTcWxIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vc3FsX2hpZ2hsaWdodF9ydWxlcyIpLlNxbEhpZ2hsaWdodFJ1bGVzOwp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOwoKdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IFNxbEhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7Cn07Cm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy50b2dnbGVDb21tZW50TGluZXMgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCBzdGFydFJvdywgZW5kUm93KSB7CiAgICAgICAgdmFyIG91dGRlbnQgPSB0cnVlOwogICAgICAgIHZhciBvdXRlbnRlZFJvd3MgPSBbXTsKICAgICAgICB2YXIgcmUgPSAvXihccyopLS0vOwoKICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspIHsKICAgICAgICAgICAgaWYgKCFyZS50ZXN0KGRvYy5nZXRMaW5lKGkpKSkgewogICAgICAgICAgICAgICAgb3V0ZGVudCA9IGZhbHNlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChvdXRkZW50KSB7CiAgICAgICAgICAgIHZhciBkZWxldGVSYW5nZSA9IG5ldyBSYW5nZSgwLCAwLCAwLCAwKTsKICAgICAgICAgICAgZm9yICh2YXIgaT1zdGFydFJvdzsgaTw9IGVuZFJvdzsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKGkpOwogICAgICAgICAgICAgICAgdmFyIG0gPSBsaW5lLm1hdGNoKHJlKTsKICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLnN0YXJ0LnJvdyA9IGk7CiAgICAgICAgICAgICAgICBkZWxldGVSYW5nZS5lbmQucm93ID0gaTsKICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLmVuZC5jb2x1bW4gPSBtWzBdLmxlbmd0aDsKICAgICAgICAgICAgICAgIGRvYy5yZXBsYWNlKGRlbGV0ZVJhbmdlLCBtWzFdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZG9jLmluZGVudFJvd3Moc3RhcnRSb3csIGVuZFJvdywgIi0tIik7CiAgICAgICAgfQogICAgfTsKCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOwoKZXhwb3J0cy5Nb2RlID0gTW9kZTsKCn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBKb25hdGhhbiBDYW1pbGUgPGpvbmF0aGFuLmNhbWlsZSBBVCBnbWFpbCBET1QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9zcWxfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsKdmFyIFRleHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXM7Cgp2YXIgU3FsSGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsKCiAgICB2YXIga2V5d29yZHMgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCJzZWxlY3R8ZnJvbXx3aGVyZXxhbmR8b3J8Z3JvdXB8Ynl8b3JkZXJ8bGltaXR8b2Zmc2V0fGhhdmluZ3xhc3xjYXNlfCIgKwogICAgICAgICJ3aGVufGVsc2V8ZW5kfHR5cGV8bGVmdHxyaWdodHxqb2lufG9ufG91dGVyfGRlc2N8YXNjIikuc3BsaXQoInwiKQogICAgKTsKCiAgICB2YXIgYnVpbHRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoInRydWV8ZmFsc2V8bnVsbCIpLnNwbGl0KCJ8IikKICAgICk7CgogICAgdmFyIGJ1aWx0aW5GdW5jdGlvbnMgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCJjb3VudHxtaW58bWF4fGF2Z3xzdW18cmFua3xub3d8Y29hbGVzY2UiKS5zcGxpdCgifCIpCiAgICApOwoKICAgIHRoaXMuJHJ1bGVzID0gewogICAgICAgICJzdGFydCIgOiBbIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgIHJlZ2V4IDogIi0tLiokIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgICAgICAgICAgIC8vICIgc3RyaW5nCiAgICAgICAgICAgIHJlZ2V4IDogJyIuKiInCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAgICAgICAgICAgLy8gJyBzdHJpbmcKICAgICAgICAgICAgcmVnZXggOiAiJy4qJyIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdAogICAgICAgICAgICByZWdleCA6ICJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1aWx0aW5Db25zdGFudHMuaGFzT3duUHJvcGVydHkodmFsdWUpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOwogICAgICAgICAgICAgICAgZWxzZSBpZiAoYnVpbHRpbkZ1bmN0aW9ucy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdXBwb3J0LmZ1bmN0aW9uIjsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICByZXR1cm4gImlkZW50aWZpZXIiOwogICAgICAgICAgICB9LAogICAgICAgICAgICByZWdleCA6ICJbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXGIiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwKICAgICAgICAgICAgcmVnZXggOiAiXFwrfFxcLXxcXC98XFwvXFwvfCV8PEA+fEA+fDxAfCZ8XFxefH58PHw+fDw9fD0+fD09fCE9fDw+fD0iCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJscGFyZW4ucGFyZW4iLAogICAgICAgICAgICByZWdleCA6ICJbXFwoXSIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogInBhcmVuLnJwYXJlbiIsCiAgICAgICAgICAgIHJlZ2V4IDogIltcXCldIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsCiAgICAgICAgICAgIHJlZ2V4IDogIlxccysiCiAgICAgICAgfSBdCiAgICB9Owp9OwoKb29wLmluaGVyaXRzKFNxbEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOwoKZXhwb3J0cy5TcWxIaWdobGlnaHRSdWxlcyA9IFNxbEhpZ2hsaWdodFJ1bGVzOwp9KTsKCjsKICAgICAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkKICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkoKTsKICAgICAgICA=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-sql.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9zcWwiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvc3FsX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vc3FsX2hpZ2hsaWdodF9ydWxlcyIpLlNxbEhpZ2hsaWdodFJ1bGVzLGg9YSgiLi4vcmFuZ2UiKS5SYW5nZSxpPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSl9O2QuaW5oZXJpdHMoaSxlKSxmdW5jdGlvbigpe3RoaXMudG9nZ2xlQ29tbWVudExpbmVzPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSEwLGY9W10sZz0vXihccyopLS0vO2Zvcih2YXIgaT1jO2k8PWQ7aSsrKWlmKCFnLnRlc3QoYi5nZXRMaW5lKGkpKSl7ZT0hMTticmVha31pZihlKXt2YXIgaj1uZXcgaCgwLDAsMCwwKTtmb3IodmFyIGk9YztpPD1kO2krKyl7dmFyIGs9Yi5nZXRMaW5lKGkpLGw9ay5tYXRjaChnKTtqLnN0YXJ0LnJvdz1pLGouZW5kLnJvdz1pLGouZW5kLmNvbHVtbj1sWzBdLmxlbmd0aCxiLnJlcGxhY2UoaixsWzFdKX19ZWxzZSBiLmluZGVudFJvd3MoYyxkLCItLSIpfX0uY2FsbChpLnByb3RvdHlwZSksYi5Nb2RlPWl9KSxkZWZpbmUoImFjZS9tb2RlL3NxbF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxnPWZ1bmN0aW9uKCl7dmFyIGE9ZS5hcnJheVRvTWFwKCJzZWxlY3R8ZnJvbXx3aGVyZXxhbmR8b3J8Z3JvdXB8Ynl8b3JkZXJ8bGltaXR8b2Zmc2V0fGhhdmluZ3xhc3xjYXNlfHdoZW58ZWxzZXxlbmR8dHlwZXxsZWZ0fHJpZ2h0fGpvaW58b258b3V0ZXJ8ZGVzY3xhc2MiLnNwbGl0KCJ8IikpLGI9ZS5hcnJheVRvTWFwKCJ0cnVlfGZhbHNlfG51bGwiLnNwbGl0KCJ8IikpLGM9ZS5hcnJheVRvTWFwKCJjb3VudHxtaW58bWF4fGF2Z3xzdW18cmFua3xub3d8Y29hbGVzY2UiLnNwbGl0KCJ8IikpO3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50IixyZWdleDoiLS0uKiQifSx7dG9rZW46InN0cmluZyIscmVnZXg6JyIuKiInfSx7dG9rZW46InN0cmluZyIscmVnZXg6IicuKicifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiJ9LHt0b2tlbjpmdW5jdGlvbihkKXtyZXR1cm4gZD1kLnRvTG93ZXJDYXNlKCksYS5oYXNPd25Qcm9wZXJ0eShkKT8ia2V5d29yZCI6Yi5oYXNPd25Qcm9wZXJ0eShkKT8iY29uc3RhbnQubGFuZ3VhZ2UiOmMuaGFzT3duUHJvcGVydHkoZCk/InN1cHBvcnQuZnVuY3Rpb24iOiJpZGVudGlmaWVyIn0scmVnZXg6IlthLXpBLVpfJF1bYS16QS1aMC05XyRdKlxcYiJ9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcK3xcXC18XFwvfFxcL1xcL3wlfDxAPnxAPnw8QHwmfFxcXnx+fDx8Pnw8PXw9Pnw9PXwhPXw8Pnw9In0se3Rva2VuOiJscGFyZW4ucGFyZW4iLHJlZ2V4OiJbXFwoXSJ9LHt0b2tlbjoicGFyZW4ucnBhcmVuIixyZWdleDoiW1xcKV0ifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn1dfX07ZC5pbmhlcml0cyhnLGYpLGIuU3FsSGlnaGxpZ2h0UnVsZXM9Z30pLGZ1bmN0aW9uKCl7d2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sZnVuY3Rpb24oYSl7d2luZG93LmFjZXx8KHdpbmRvdy5hY2U9e30pO2Zvcih2YXIgYiBpbiBhKWEuaGFzT3duUHJvcGVydHkoYikmJihhY2VbYl09YVtiXSl9KX0oKQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-svg-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9zdmcnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3htbCcsICdhY2UvbW9kZS9qYXZhc2NyaXB0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvc3ZnX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9mb2xkaW5nL21peGVkJywgJ2FjZS9tb2RlL2ZvbGRpbmcveG1sJywgJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgWG1sTW9kZSA9IHJlcXVpcmUoIi4veG1sIikuTW9kZTsKdmFyIEphdmFTY3JpcHRNb2RlID0gcmVxdWlyZSgiLi9qYXZhc2NyaXB0IikuTW9kZTsKdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsKdmFyIFN2Z0hpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9zdmdfaGlnaGxpZ2h0X3J1bGVzIikuU3ZnSGlnaGxpZ2h0UnVsZXM7CnZhciBNaXhlZEZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkaW5nL21peGVkIikuRm9sZE1vZGU7CnZhciBYbWxGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZGluZy94bWwiKS5Gb2xkTW9kZTsKdmFyIENTdHlsZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlOwoKdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsKICAgIFhtbE1vZGUuY2FsbCh0aGlzKTsKICAgIAogICAgdGhpcy5oaWdobGlnaHRlciA9IG5ldyBTdmdIaWdobGlnaHRSdWxlcygpOwogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcih0aGlzLmhpZ2hsaWdodGVyLmdldFJ1bGVzKCkpOwogICAgCiAgICB0aGlzLiRlbWJlZHMgPSB0aGlzLmhpZ2hsaWdodGVyLmdldEVtYmVkcygpOwogICAgdGhpcy5jcmVhdGVNb2RlRGVsZWdhdGVzKHsKICAgICAgICAianMtIjogSmF2YVNjcmlwdE1vZGUKICAgIH0pOwogICAgCiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBNaXhlZEZvbGRNb2RlKG5ldyBYbWxGb2xkTW9kZSh7fSksIHsKICAgICAgICAianMtIjogbmV3IENTdHlsZUZvbGRNb2RlKCkKICAgIH0pOwp9OwoKb29wLmluaGVyaXRzKE1vZGUsIFhtbE1vZGUpOwoKKGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJGdldEluZGVudChsaW5lKTsKICAgIH07CiAgICAKCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOwoKZXhwb3J0cy5Nb2RlID0gTW9kZTsKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUveG1sJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUveG1sX2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9iZWhhdmlvdXIveG1sJywgJ2FjZS9tb2RlL2ZvbGRpbmcveG1sJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgVGV4dE1vZGUgPSByZXF1aXJlKCIuL3RleHQiKS5Nb2RlOwp2YXIgVG9rZW5pemVyID0gcmVxdWlyZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyOwp2YXIgWG1sSGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3htbF9oaWdobGlnaHRfcnVsZXMiKS5YbWxIaWdobGlnaHRSdWxlczsKdmFyIFhtbEJlaGF2aW91ciA9IHJlcXVpcmUoIi4vYmVoYXZpb3VyL3htbCIpLlhtbEJlaGF2aW91cjsKdmFyIFhtbEZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkaW5nL3htbCIpLkZvbGRNb2RlOwoKdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IFhtbEhpZ2hsaWdodFJ1bGVzKCkuZ2V0UnVsZXMoKSk7CiAgICB0aGlzLiRiZWhhdmlvdXIgPSBuZXcgWG1sQmVoYXZpb3VyKCk7CiAgICB0aGlzLmZvbGRpbmdSdWxlcyA9IG5ldyBYbWxGb2xkTW9kZSgpOwp9OwoKb29wLmluaGVyaXRzKE1vZGUsIFRleHRNb2RlKTsKCihmdW5jdGlvbigpIHsKICAgIAogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsKICAgICAgICByZXR1cm4gdGhpcy4kZ2V0SW5kZW50KGxpbmUpOwogICAgfTsKCn0pLmNhbGwoTW9kZS5wcm90b3R5cGUpOwoKZXhwb3J0cy5Nb2RlID0gTW9kZTsKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUveG1sX2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUveG1sX3V0aWwnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciB4bWxVdGlsID0gcmVxdWlyZSgiLi94bWxfdXRpbCIpOwp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsKCnZhciBYbWxIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgewoKICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcwogICAgLy8gcmVnZXhwcyBhcmUgb3JkZXJlZCAtPiB0aGUgZmlyc3QgbWF0Y2ggaXMgdXNlZAogICAgdGhpcy4kcnVsZXMgPSB7CiAgICAgICAgc3RhcnQgOiBbewogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgcmVnZXggOiAiPFxcIVxcW0NEQVRBXFxbIiwKICAgICAgICAgICAgbmV4dCA6ICJjZGF0YSIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogInhtbF9wZSIsCiAgICAgICAgICAgIHJlZ2V4IDogIjxcXD8uKj9cXD8+IgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiPFxcIS0tIiwKICAgICAgICAgICAgbmV4dCA6ICJjb21tZW50IgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAibWV0YS50YWciLCAvLyBvcGVuaW5nIHRhZwogICAgICAgICAgICByZWdleCA6ICI8XFwvPyIsCiAgICAgICAgICAgIG5leHQgOiAidGFnIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsCiAgICAgICAgICAgIHJlZ2V4IDogIlxccysiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgcmVnZXggOiAiW148XSsiCiAgICAgICAgfV0sCiAgICAgICAgCiAgICAgICAgY2RhdGEgOiBbewogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgcmVnZXggOiAiXFxdXFxdPiIsCiAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgcmVnZXggOiAiXFxzKyIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgICAgICByZWdleCA6ICIoPzpbXlxcXV18XFxdKD8hXFxdPikpKyIKICAgICAgICB9XSwKCiAgICAgICAgY29tbWVudCA6IFt7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLAogICAgICAgICAgICByZWdleCA6ICIuKj8tLT4iLAogICAgICAgICAgICBuZXh0IDogInN0YXJ0IgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiLisiCiAgICAgICAgfV0KICAgIH07CiAgICAKICAgIHhtbFV0aWwudGFnKHRoaXMuJHJ1bGVzLCAidGFnIiwgInN0YXJ0Iik7Cn07Cgpvb3AuaW5oZXJpdHMoWG1sSGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7CgpleHBvcnRzLlhtbEhpZ2hsaWdodFJ1bGVzID0gWG1sSGlnaGxpZ2h0UnVsZXM7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL3htbF91dGlsJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL2xhbmcnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBsYW5nID0gcmVxdWlyZSgiLi4vbGliL2xhbmciKTsKCnZhciBmb3JtVGFncyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICgiYnV0dG9ufGZvcm18aW5wdXR8bGFiZWx8c2VsZWN0fHRleHRhcmVhIikuc3BsaXQoInwiKQopOwoKdmFyIHRhYmxlVGFncyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICgidGFibGV8dGJvZHl8dGR8dGZvb3R8dGh8dHIiKS5zcGxpdCgifCIpCik7CgpmdW5jdGlvbiBzdHJpbmcoc3RhdGUpIHsKICAgIHJldHVybiBbewogICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgcmVnZXggOiAnIi4qPyInCiAgICB9LCB7CiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQKICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgcmVnZXggOiAnWyJdLionLAogICAgICAgIG5leHQgOiBzdGF0ZSArICItcXFzdHJpbmciCiAgICB9LCB7CiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICByZWdleCA6ICInLio/JyIKICAgIH0sIHsKICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydAogICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICByZWdleCA6ICJbJ10uKiIsCiAgICAgICAgbmV4dCA6IHN0YXRlICsgIi1xc3RyaW5nIgogICAgfV07Cn0KCmZ1bmN0aW9uIG11bHRpTGluZVN0cmluZyhxdW90ZSwgc3RhdGUpIHsKICAgIHJldHVybiBbewogICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgIHJlZ2V4IDogIi4qPyIgKyBxdW90ZSwKICAgICAgICBuZXh0IDogc3RhdGUKICAgIH0sIHsKICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICByZWdleCA6ICcuKycKICAgIH1dOwp9CgpleHBvcnRzLnRhZyA9IGZ1bmN0aW9uKHN0YXRlcywgbmFtZSwgbmV4dFN0YXRlKSB7CiAgICBzdGF0ZXNbbmFtZV0gPSBbewogICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgIHJlZ2V4IDogIlxccysiCiAgICB9LCB7CiAgICAgICAgLy90b2tlbiA6ICJtZXRhLnRhZyIsCiAgICAgICAgCiAgICB0b2tlbiA6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIGlmICggdmFsdWU9PT0nYScgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnLmFuY2hvciI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoIHZhbHVlPT09J2ltZycgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnLmltYWdlIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICggdmFsdWU9PT0nc2NyaXB0JyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAibWV0YS50YWcuc2NyaXB0IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICggdmFsdWU9PT0nc3R5bGUnICkgewogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy5zdHlsZSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZm9ybVRhZ3MuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAibWV0YS50YWcuZm9ybSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGFibGVUYWdzLmhhc093blByb3BlcnR5KHZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnLnRhYmxlIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAibWV0YS50YWciOwogICAgICAgICAgICB9CiAgICAgICAgfSwgICAgICAgIAogICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICByZWdleCA6ICJbLV9hLXpBLVowLTk6IV0rIiwKICAgICAgICBuZXh0IDogbmFtZSArICJlbWJlZC1hdHRyaWJ1dGUtbGlzdCIgCiAgICB9LCB7CiAgICAgICAgdG9rZW46ICJlbXB0eSIsCiAgICAgICAgcmVnZXg6ICIiLAogICAgICAgIG5leHQgOiBuYW1lICsgImVtYmVkLWF0dHJpYnV0ZS1saXN0IgogICAgfV07CgogICAgc3RhdGVzW25hbWUgKyAiLXFzdHJpbmciXSA9IG11bHRpTGluZVN0cmluZygiJyIsIG5hbWUgKyAiZW1iZWQtYXR0cmlidXRlLWxpc3QiKTsKICAgIHN0YXRlc1tuYW1lICsgIi1xcXN0cmluZyJdID0gbXVsdGlMaW5lU3RyaW5nKCJcIiIsIG5hbWUgKyAiZW1iZWQtYXR0cmlidXRlLWxpc3QiKTsKICAgIAogICAgc3RhdGVzW25hbWUgKyAiZW1iZWQtYXR0cmlidXRlLWxpc3QiXSA9IFt7CiAgICAgICAgdG9rZW4gOiAibWV0YS50YWciLAogICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICByZWdleCA6ICJcLz8+IiwKICAgICAgICBuZXh0IDogbmV4dFN0YXRlCiAgICB9LCB7CiAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsCiAgICAgICAgcmVnZXggOiAiPSIKICAgIH0sIHsKICAgICAgICB0b2tlbiA6ICJlbnRpdHkub3RoZXIuYXR0cmlidXRlLW5hbWUiLAogICAgICAgIHJlZ2V4IDogIlstX2EtekEtWjAtOTpdKyIKICAgIH0sIHsKICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gZmxvYXQKICAgICAgICByZWdleCA6ICJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiIKICAgIH0sIHsKICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICByZWdleCA6ICJcXHMrIgogICAgfV0uY29uY2F0KHN0cmluZyhuYW1lKSk7Cn07Cgp9KTsKLyogdmltOnRzPTQ6c3RzPTQ6c3c9NDoKICogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBDaHJpcyBTcGVuY2VyIDxjaHJpcy5hZy5zcGVuY2VyIEFUIGdvb2dsZW1haWwgRE9UIGNvbT4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvYmVoYXZpb3VyL3htbCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvYmVoYXZpb3VyJywgJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7CnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXI7CnZhciBDc3R5bGVCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cjsKCnZhciBYbWxCZWhhdmlvdXIgPSBmdW5jdGlvbiAoKSB7CiAgICAKICAgIHRoaXMuaW5oZXJpdChDc3R5bGVCZWhhdmlvdXIsIFsic3RyaW5nX2RxdW90ZXMiXSk7IC8vIEdldCBzdHJpbmcgYmVoYXZpb3VyCiAgICAKICAgIHRoaXMuYWRkKCJicmFja2V0cyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7CiAgICAgICAgaWYgKHRleHQgPT0gJzwnKSB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7CiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJzw+JywKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICc+JykgewogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsKICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsKICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnPicpIHsgLy8gbmVlZCBzb21lIGtpbmQgb2YgbWF0Y2hpbmcgY2hlY2sgaGVyZQogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICJcbiIpIHsKICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOwogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7CiAgICAgICAgICAgIHZhciByaWdodENoYXJzID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDIpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFycyA9PSAnPC8nKSB7CiAgICAgICAgICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdykpICsgc2Vzc2lvbi5nZXRUYWJTdHJpbmcoKTsKICAgICAgICAgICAgICAgIHZhciBuZXh0X2luZGVudCA9IHRoaXMuJGdldEluZGVudChzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICdcbicgKyBpbmRlbnQgKyAnXG4nICsgbmV4dF9pbmRlbnQsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgaW5kZW50Lmxlbmd0aCwgMSwgaW5kZW50Lmxlbmd0aF0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwogICAgCn0Kb29wLmluaGVyaXRzKFhtbEJlaGF2aW91ciwgQmVoYXZpb3VyKTsKCmV4cG9ydHMuWG1sQmVoYXZpb3VyID0gWG1sQmVoYXZpb3VyOwp9KTsvKiB2aW06dHM9NDpzdHM9NDpzdz00OgogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIENocmlzIFNwZW5jZXIgPGNocmlzLmFnLnNwZW5jZXIgQVQgZ29vZ2xlbWFpbCBET1QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9iZWhhdmlvdXInXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7CnZhciBCZWhhdmlvdXIgPSByZXF1aXJlKCcuLi9iZWhhdmlvdXInKS5CZWhhdmlvdXI7Cgp2YXIgQ3N0eWxlQmVoYXZpb3VyID0gZnVuY3Rpb24gKCkgewoKICAgIHRoaXMuYWRkKCJicmFjZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgewogICAgICAgIGlmICh0ZXh0ID09ICd7JykgewogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7CiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICd7JyArIHNlbGVjdGVkICsgJ30nLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3t9JywKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICd9JykgewogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsKICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsKICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnfScpIHsKICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldCgnfScsIHtjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxLCByb3c6IGN1cnNvci5yb3d9KTsKICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAiXG4iKSB7CiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9JykgewogICAgICAgICAgICAgICAgdmFyIG9wZW5CcmFjZVBvcyA9IHNlc3Npb24uZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiBjdXJzb3Iucm93LCBjb2x1bW46IGN1cnNvci5jb2x1bW4gKyAxfSk7CiAgICAgICAgICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcykKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CgogICAgICAgICAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQoc3RhdGUsIGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUubGVuZ3RoIC0gMSksIHNlc3Npb24uZ2V0VGFiU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgdmFyIG5leHRfaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOwoKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xuJyArIGluZGVudCArICdcbicgKyBuZXh0X2luZGVudCwKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCBpbmRlbnQubGVuZ3RoLCAxLCBpbmRlbnQubGVuZ3RoXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoImJyYWNlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7CiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsKICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJ3snKSB7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2UuZW5kLmNvbHVtbiwgcmFuZ2UuZW5kLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9JykgewogICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbisrOwogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoInBhcmVucyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7CiAgICAgICAgaWYgKHRleHQgPT0gJygnKSB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7CiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJygnICsgc2VsZWN0ZWQgKyAnKScsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCknLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJyknKSB7CiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICcpJykgewogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCcpJywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOwogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoInBhcmVucyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7CiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsKICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJygnKSB7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCiAgICB0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCAiaW5zZXJ0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgdGV4dCkgewogICAgICAgIGlmICh0ZXh0ID09ICciJykgewogICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblJhbmdlKCk7CiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlc3Npb24uZG9jLmdldFRleHRSYW5nZShzZWxlY3Rpb24pOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT09ICIiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICciJyArIHNlbGVjdGVkICsgJyInLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsKICAgICAgICAgICAgICAgIHZhciBsZWZ0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4tMSwgY3Vyc29yLmNvbHVtbik7CgogICAgICAgICAgICAgICAgLy8gV2UncmUgZXNjYXBlZC4KICAgICAgICAgICAgICAgIGlmIChsZWZ0Q2hhciA9PSAnXFwnKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gRmluZCB3aGF0IHRva2VuIHdlJ3JlIGluc2lkZS4KICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzZXNzaW9uLmdldFRva2VucyhzZWxlY3Rpb24uc3RhcnQucm93LCBzZWxlY3Rpb24uc3RhcnQucm93KVswXS50b2tlbnM7CiAgICAgICAgICAgICAgICB2YXIgY29sID0gMCwgdG9rZW47CiAgICAgICAgICAgICAgICB2YXIgcXVvdGVwb3MgPSAtMTsgLy8gVHJhY2sgd2hldGhlciB3ZSdyZSBpbnNpZGUgYW4gb3BlbiBxdW90ZS4KCiAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRva2Vucy5sZW5ndGg7IHgrKykgewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW3hdOwogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IC0xOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocXVvdGVwb3MgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICBxdW90ZXBvcyA9IHRva2VuLnZhbHVlLmluZGV4T2YoJyInKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0b2tlbi52YWx1ZS5sZW5ndGggKyBjb2wpID4gc2VsZWN0aW9uLnN0YXJ0LmNvbHVtbikgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29sICs9IHRva2Vuc1t4XS52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gVHJ5IGFuZCBiZSBzbWFydCBhYm91dCB3aGVuIHdlIGF1dG8gaW5zZXJ0LgogICAgICAgICAgICAgICAgaWYgKCF0b2tlbiB8fCAocXVvdGVwb3MgPCAwICYmIHRva2VuLnR5cGUgIT09ICJjb21tZW50IiAmJiAodG9rZW4udHlwZSAhPT0gInN0cmluZyIgfHwgKChzZWxlY3Rpb24uc3RhcnQuY29sdW1uICE9PSB0b2tlbi52YWx1ZS5sZW5ndGgrY29sLTEpICYmIHRva2VuLnZhbHVlLmxhc3RJbmRleE9mKCciJykgPT09IHRva2VuLnZhbHVlLmxlbmd0aC0xKSkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJyIiJywKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwxXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gJiYgdG9rZW4udHlwZSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaW5wdXQgYW5kIG1vdmUgcmlnaHQgb25lIGlmIHdlJ3JlIHR5cGluZyBvdmVyIHRoZSBjbG9zaW5nIHF1b3RlLgogICAgICAgICAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJkZWxldGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHJhbmdlKSB7CiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHJhbmdlKTsKICAgICAgICBpZiAoIXJhbmdlLmlzTXVsdGlMaW5lKCkgJiYgc2VsZWN0ZWQgPT0gJyInKSB7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShyYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uICsgMSwgcmFuZ2Uuc3RhcnQuY29sdW1uICsgMik7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyInKSB7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCn0Kb29wLmluaGVyaXRzKENzdHlsZUJlaGF2aW91ciwgQmVoYXZpb3VyKTsKCmV4cG9ydHMuQ3N0eWxlQmVoYXZpb3VyID0gQ3N0eWxlQmVoYXZpb3VyOwp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcveG1sJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbGliL2xhbmcnLCAnYWNlL3JhbmdlJywgJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgJ2FjZS90b2tlbl9pdGVyYXRvciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsKdmFyIGxhbmcgPSByZXF1aXJlKCIuLi8uLi9saWIvbGFuZyIpOwp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOwp2YXIgQmFzZUZvbGRNb2RlID0gcmVxdWlyZSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZTsKdmFyIFRva2VuSXRlcmF0b3IgPSByZXF1aXJlKCIuLi8uLi90b2tlbl9pdGVyYXRvciIpLlRva2VuSXRlcmF0b3I7Cgp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24odm9pZEVsZW1lbnRzKSB7CiAgICBCYXNlRm9sZE1vZGUuY2FsbCh0aGlzKTsKICAgIHRoaXMudm9pZEVsZW1lbnRzID0gdm9pZEVsZW1lbnRzIHx8IHt9Owp9Owpvb3AuaW5oZXJpdHMoRm9sZE1vZGUsIEJhc2VGb2xkTW9kZSk7CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsKICAgICAgICB2YXIgdGFnID0gdGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmUoc2Vzc2lvbiwgcm93KTsKCiAgICAgICAgaWYgKHRhZy5jbG9zaW5nKQogICAgICAgICAgICByZXR1cm4gZm9sZFN0eWxlID09ICJtYXJrYmVnaW5lbmQiID8gImVuZCIgOiAiIjsKCiAgICAgICAgaWYgKCF0YWcudGFnTmFtZSB8fCB0aGlzLnZvaWRFbGVtZW50c1t0YWcudGFnTmFtZS50b0xvd2VyQ2FzZSgpXSkKICAgICAgICAgICAgcmV0dXJuICIiOwoKICAgICAgICBpZiAodGFnLnNlbGZDbG9zaW5nKQogICAgICAgICAgICByZXR1cm4gIiI7CgogICAgICAgIGlmICh0YWcudmFsdWUuaW5kZXhPZigiLyIgKyB0YWcudGFnTmFtZSkgIT09IC0xKQogICAgICAgICAgICByZXR1cm4gIiI7CgogICAgICAgIHJldHVybiAic3RhcnQiOwogICAgfTsKICAgIAogICAgdGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmUgPSBmdW5jdGlvbihzZXNzaW9uLCByb3cpIHsKICAgICAgICB2YXIgdG9rZW5zID0gc2Vzc2lvbi5nZXRUb2tlbnMocm93LCByb3cpWzBdLnRva2VuczsKICAgICAgICB2YXIgdmFsdWUgPSAiIjsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV07CiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlLmluZGV4T2YoIm1ldGEudGFnIikgPT09IDApCiAgICAgICAgICAgICAgICB2YWx1ZSArPSB0b2tlbi52YWx1ZTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgdmFsdWUgKz0gbGFuZy5zdHJpbmdSZXBlYXQoIiAiLCB0b2tlbi52YWx1ZS5sZW5ndGgpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gdGhpcy5fcGFyc2VUYWcodmFsdWUpOwogICAgfTsKCiAgICB0aGlzLnRhZ1JlID0gL14oXHMqKSg8PyhcLz8pKFstX2EtekEtWjAtOTohXSopXHMqKFwvPyk+PykvOwogICAgdGhpcy5fcGFyc2VUYWcgPSBmdW5jdGlvbih0YWcpIHsKICAgICAgICAKICAgICAgICB2YXIgbWF0Y2ggPSB0aGlzLnRhZ1JlLmV4ZWModGFnKTsKICAgICAgICB2YXIgY29sdW1uID0gdGhpcy50YWdSZS5sYXN0SW5kZXggfHwgMDsKICAgICAgICB0aGlzLnRhZ1JlLmxhc3RJbmRleCA9IDA7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHZhbHVlOiB0YWcsCiAgICAgICAgICAgIG1hdGNoOiBtYXRjaCA/IG1hdGNoWzJdIDogIiIsCiAgICAgICAgICAgIGNsb3Npbmc6IG1hdGNoID8gISFtYXRjaFszXSA6IGZhbHNlLAogICAgICAgICAgICBzZWxmQ2xvc2luZzogbWF0Y2ggPyAhIW1hdGNoWzVdIHx8IG1hdGNoWzJdID09ICIvPiIgOiBmYWxzZSwKICAgICAgICAgICAgdGFnTmFtZTogbWF0Y2ggPyBtYXRjaFs0XSA6ICIiLAogICAgICAgICAgICBjb2x1bW46IG1hdGNoWzFdID8gY29sdW1uICsgbWF0Y2hbMV0ubGVuZ3RoIDogY29sdW1uCiAgICAgICAgfTsKICAgIH07CiAgICAKICAgIC8qKgogICAgICogcmVhZHMgYSBmdWxsIHRhZyBhbmQgcGxhY2VzIHRoZSBpdGVyYXRvciBhZnRlciB0aGUgdGFnCiAgICAgKi8KICAgIHRoaXMuX3JlYWRUYWdGb3J3YXJkID0gZnVuY3Rpb24oaXRlcmF0b3IpIHsKICAgICAgICB2YXIgdG9rZW4gPSBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW4oKTsKICAgICAgICBpZiAoIXRva2VuKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgCiAgICAgICAgdmFyIHZhbHVlID0gIiI7CiAgICAgICAgdmFyIHN0YXJ0OwogICAgICAgIAogICAgICAgIGRvIHsKICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUuaW5kZXhPZigibWV0YS50YWciKSA9PT0gMCkgewogICAgICAgICAgICAgICAgaWYgKCFzdGFydCkgewogICAgICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgcm93OiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Sb3coKSwKICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YWx1ZSArPSB0b2tlbi52YWx1ZTsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCI+IikgIT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRhZyA9IHRoaXMuX3BhcnNlVGFnKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQgPSBzdGFydDsKICAgICAgICAgICAgICAgICAgICB0YWcuZW5kID0gewogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpLAogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpICsgdG9rZW4udmFsdWUubGVuZ3RoCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5zdGVwRm9yd2FyZCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlKHRva2VuID0gaXRlcmF0b3Iuc3RlcEZvcndhcmQoKSk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwogICAgCiAgICB0aGlzLl9yZWFkVGFnQmFja3dhcmQgPSBmdW5jdGlvbihpdGVyYXRvcikgewogICAgICAgIHZhciB0b2tlbiA9IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbigpOwogICAgICAgIGlmICghdG9rZW4pCiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAKICAgICAgICB2YXIgdmFsdWUgPSAiIjsKICAgICAgICB2YXIgZW5kOwoKICAgICAgICBkbyB7CiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlLmluZGV4T2YoIm1ldGEudGFnIikgPT09IDApIHsKICAgICAgICAgICAgICAgIGlmICghZW5kKSB7CiAgICAgICAgICAgICAgICAgICAgZW5kID0gewogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpLAogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpICsgdG9rZW4udmFsdWUubGVuZ3RoCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhbHVlID0gdG9rZW4udmFsdWUgKyB2YWx1ZTsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCI8IikgIT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRhZyA9IHRoaXMuX3BhcnNlVGFnKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB0YWcuZW5kID0gZW5kOwogICAgICAgICAgICAgICAgICAgIHRhZy5zdGFydCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgcm93OiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Sb3coKSwKICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBpdGVyYXRvci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3Iuc3RlcEJhY2t3YXJkKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhZzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gd2hpbGUodG9rZW4gPSBpdGVyYXRvci5zdGVwQmFja3dhcmQoKSk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwogICAgCiAgICB0aGlzLl9wb3AgPSBmdW5jdGlvbihzdGFjaywgdGFnKSB7CiAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkgewogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHRvcCA9IHN0YWNrW3N0YWNrLmxlbmd0aC0xXTsKICAgICAgICAgICAgaWYgKCF0YWcgfHwgdG9wLnRhZ05hbWUgPT0gdGFnLnRhZ05hbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBzdGFjay5wb3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnZvaWRFbGVtZW50c1t0YWcudGFnTmFtZV0pIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnZvaWRFbGVtZW50c1t0b3AudGFnTmFtZV0pIHsKICAgICAgICAgICAgICAgIHN0YWNrLnBvcCgpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICAKICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsKICAgICAgICB2YXIgZmlyc3RUYWcgPSB0aGlzLl9nZXRGaXJzdFRhZ0luTGluZShzZXNzaW9uLCByb3cpOwogICAgICAgIAogICAgICAgIGlmICghZmlyc3RUYWcubWF0Y2gpCiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIAogICAgICAgIHZhciBpc0JhY2t3YXJkID0gZmlyc3RUYWcuY2xvc2luZyB8fCBmaXJzdFRhZy5zZWxmQ2xvc2luZzsKICAgICAgICB2YXIgc3RhY2sgPSBbXTsKICAgICAgICB2YXIgdGFnOwogICAgICAgIAogICAgICAgIGlmICghaXNCYWNrd2FyZCkgewogICAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBuZXcgVG9rZW5JdGVyYXRvcihzZXNzaW9uLCByb3csIGZpcnN0VGFnLmNvbHVtbik7CiAgICAgICAgICAgIHZhciBzdGFydCA9IHsKICAgICAgICAgICAgICAgIHJvdzogcm93LAogICAgICAgICAgICAgICAgY29sdW1uOiBmaXJzdFRhZy5jb2x1bW4gKyBmaXJzdFRhZy50YWdOYW1lLmxlbmd0aCArIDIKICAgICAgICAgICAgfTsKICAgICAgICAgICAgd2hpbGUgKHRhZyA9IHRoaXMuX3JlYWRUYWdGb3J3YXJkKGl0ZXJhdG9yKSkgewogICAgICAgICAgICAgICAgaWYgKHRhZy5zZWxmQ2xvc2luZykgewogICAgICAgICAgICAgICAgICAgIGlmICghc3RhY2subGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5zdGFydC5jb2x1bW4gKz0gdGFnLnRhZ05hbWUubGVuZ3RoICsgMjsKICAgICAgICAgICAgICAgICAgICAgICAgdGFnLmVuZC5jb2x1bW4gLT0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHModGFnLnN0YXJ0LCB0YWcuZW5kKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICh0YWcuY2xvc2luZykgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3BvcChzdGFjaywgdGFnKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCB0YWcuc3RhcnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCh0YWcpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHZhciBpdGVyYXRvciA9IG5ldyBUb2tlbkl0ZXJhdG9yKHNlc3Npb24sIHJvdywgZmlyc3RUYWcuY29sdW1uICsgZmlyc3RUYWcubWF0Y2gubGVuZ3RoKTsKICAgICAgICAgICAgdmFyIGVuZCA9IHsKICAgICAgICAgICAgICAgIHJvdzogcm93LAogICAgICAgICAgICAgICAgY29sdW1uOiBmaXJzdFRhZy5jb2x1bW4KICAgICAgICAgICAgfTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHdoaWxlICh0YWcgPSB0aGlzLl9yZWFkVGFnQmFja3dhcmQoaXRlcmF0b3IpKSB7CiAgICAgICAgICAgICAgICBpZiAodGFnLnNlbGZDbG9zaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFjay5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGFnLnN0YXJ0LmNvbHVtbiArPSB0YWcudGFnTmFtZS5sZW5ndGggKyAyOwogICAgICAgICAgICAgICAgICAgICAgICB0YWcuZW5kLmNvbHVtbiAtPSAyOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyh0YWcuc3RhcnQsIHRhZy5lbmQpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKCF0YWcuY2xvc2luZykgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3BvcChzdGFjaywgdGFnKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGFnLnN0YXJ0LmNvbHVtbiArPSB0YWcudGFnTmFtZS5sZW5ndGggKyAyOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyh0YWcuc3RhcnQsIGVuZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCh0YWcpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICB9OwoKfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOwoKfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi8uLi9yYW5nZSIpLlJhbmdlOwoKdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIgPSBudWxsOwogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IG51bGw7CgogICAgLy8gbXVzdCByZXR1cm4gIiIgaWYgdGhlcmUncyBubyBmb2xkLCB0byBlbmFibGUgY2FjaGluZwogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsKICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOwogICAgICAgIGlmICh0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KGxpbmUpKQogICAgICAgICAgICByZXR1cm4gInN0YXJ0IjsKICAgICAgICBpZiAoZm9sZFN0eWxlID09ICJtYXJrYmVnaW5lbmQiCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyCiAgICAgICAgICAgICAgICAmJiB0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QobGluZSkpCiAgICAgICAgICAgIHJldHVybiAiZW5kIjsKICAgICAgICByZXR1cm4gIiI7CiAgICB9OwogICAgCiAgICB0aGlzLmdldEZvbGRXaWRnZXRSYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgIHRoaXMuaW5kZW50YXRpb25CbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdywgY29sdW1uKSB7CiAgICAgICAgdmFyIHJlID0gL15ccyovOwogICAgICAgIHZhciBzdGFydFJvdyA9IHJvdzsKICAgICAgICB2YXIgZW5kUm93ID0gcm93OwogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgdmFyIHN0YXJ0Q29sdW1uID0gY29sdW1uIHx8IGxpbmUubGVuZ3RoOwogICAgICAgIHZhciBzdGFydExldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOwogICAgICAgIHZhciBtYXhSb3cgPSBzZXNzaW9uLmdldExlbmd0aCgpCiAgICAgICAgCiAgICAgICAgd2hpbGUgKCsrcm93IDwgbWF4Um93KSB7CiAgICAgICAgICAgIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICAgICAgdmFyIGxldmVsID0gbGluZS5tYXRjaChyZSlbMF0ubGVuZ3RoOwoKICAgICAgICAgICAgaWYgKGxldmVsID09IGxpbmUubGVuZ3RoKQogICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICBpZiAobGV2ZWwgPD0gc3RhcnRMZXZlbCkKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgZW5kUm93ID0gcm93OwogICAgICAgIH0KCiAgICAgICAgaWYgKGVuZFJvdyA+IHN0YXJ0Um93KSB7CiAgICAgICAgICAgIHZhciBlbmRDb2x1bW4gPSBzZXNzaW9uLmdldExpbmUoZW5kUm93KS5sZW5ndGg7CiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbik7CiAgICAgICAgfQogICAgfTsKCiAgICB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2sgPSBmdW5jdGlvbihzZXNzaW9uLCBicmFja2V0LCByb3csIGNvbHVtbikgewogICAgICAgIHZhciBzdGFydCA9IHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW4gKyAxfTsKICAgICAgICB2YXIgZW5kID0gc2Vzc2lvbi4kZmluZENsb3NpbmdCcmFja2V0KGJyYWNrZXQsIHN0YXJ0KTsKICAgICAgICBpZiAoIWVuZCkKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICB2YXIgZncgPSBzZXNzaW9uLmZvbGRXaWRnZXRzW2VuZC5yb3ddOwogICAgICAgIGlmIChmdyA9PSBudWxsKQogICAgICAgICAgICBmdyA9IHRoaXMuZ2V0Rm9sZFdpZGdldChzZXNzaW9uLCBlbmQucm93KTsKCiAgICAgICAgaWYgKGZ3ID09ICJzdGFydCIpIHsKICAgICAgICAgICAgZW5kLnJvdyAtLTsKICAgICAgICAgICAgZW5kLmNvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmQucm93KS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOwogICAgfTsKCn0pLmNhbGwoRm9sZE1vZGUucHJvdG90eXBlKTsKCn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2phdmFzY3JpcHQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHQnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50JywgJ2FjZS9yYW5nZScsICdhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQnLCAnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZScsICdhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsKdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsKdmFyIEphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiKS5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXM7CnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50Owp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOwp2YXIgV29ya2VyQ2xpZW50ID0gcmVxdWlyZSgiLi4vd29ya2VyL3dvcmtlcl9jbGllbnQiKS5Xb3JrZXJDbGllbnQ7CnZhciBDc3R5bGVCZWhhdmlvdXIgPSByZXF1aXJlKCIuL2JlaGF2aW91ci9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXI7CnZhciBDU3R5bGVGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZTsKCnZhciBNb2RlID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLiR0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKG5ldyBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsKICAgIHRoaXMuJG91dGRlbnQgPSBuZXcgTWF0Y2hpbmdCcmFjZU91dGRlbnQoKTsKICAgIHRoaXMuJGJlaGF2aW91ciA9IG5ldyBDc3R5bGVCZWhhdmlvdXIoKTsKICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IENTdHlsZUZvbGRNb2RlKCk7Cn07Cm9vcC5pbmhlcml0cyhNb2RlLCBUZXh0TW9kZSk7CgooZnVuY3Rpb24oKSB7CgoKICAgIHRoaXMudG9nZ2xlQ29tbWVudExpbmVzID0gZnVuY3Rpb24oc3RhdGUsIGRvYywgc3RhcnRSb3csIGVuZFJvdykgewogICAgICAgIHZhciBvdXRkZW50ID0gdHJ1ZTsKICAgICAgICB2YXIgcmUgPSAvXihccyopXC9cLy87CgogICAgICAgIGZvciAodmFyIGk9c3RhcnRSb3c7IGk8PSBlbmRSb3c7IGkrKykgewogICAgICAgICAgICBpZiAoIXJlLnRlc3QoZG9jLmdldExpbmUoaSkpKSB7CiAgICAgICAgICAgICAgICBvdXRkZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKG91dGRlbnQpIHsKICAgICAgICAgICAgdmFyIGRlbGV0ZVJhbmdlID0gbmV3IFJhbmdlKDAsIDAsIDAsIDApOwogICAgICAgICAgICBmb3IgKHZhciBpPXN0YXJ0Um93OyBpPD0gZW5kUm93OyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUoaSk7CiAgICAgICAgICAgICAgICB2YXIgbSA9IGxpbmUubWF0Y2gocmUpOwogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2Uuc3RhcnQucm93ID0gaTsKICAgICAgICAgICAgICAgIGRlbGV0ZVJhbmdlLmVuZC5yb3cgPSBpOwogICAgICAgICAgICAgICAgZGVsZXRlUmFuZ2UuZW5kLmNvbHVtbiA9IG1bMF0ubGVuZ3RoOwogICAgICAgICAgICAgICAgZG9jLnJlcGxhY2UoZGVsZXRlUmFuZ2UsIG1bMV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBkb2MuaW5kZW50Um93cyhzdGFydFJvdywgZW5kUm93LCAiLy8iKTsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbGluZSwgdGFiKSB7CiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChsaW5lKTsKCiAgICAgICAgdmFyIHRva2VuaXplZExpbmUgPSB0aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhsaW5lLCBzdGF0ZSk7CiAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplZExpbmUudG9rZW5zOwogICAgICAgIHZhciBlbmRTdGF0ZSA9IHRva2VuaXplZExpbmUuc3RhdGU7CgogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGUgPT0gImNvbW1lbnQiKSB7CiAgICAgICAgICAgIHJldHVybiBpbmRlbnQ7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmIChzdGF0ZSA9PSAic3RhcnQiIHx8IHN0YXRlID09ICJyZWdleF9hbGxvd2VkIikgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eLiooPzpcYmNhc2VcYi4qXDp8W1x7XChcW10pXHMqJC8pOwogICAgICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgICAgIGluZGVudCArPSB0YWI7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09ICJkb2Mtc3RhcnQiKSB7CiAgICAgICAgICAgIGlmIChlbmRTdGF0ZSA9PSAic3RhcnQiIHx8IHN0YXRlID09ICJyZWdleF9hbGxvd2VkIikgewogICAgICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL15ccyooXC8/KVwqLyk7CiAgICAgICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICAgICAgaWYgKG1hdGNoWzFdKSB7CiAgICAgICAgICAgICAgICAgICAgaW5kZW50ICs9ICIgIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGluZGVudCArPSAiKiAiOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaW5kZW50OwogICAgfTsKCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCBpbnB1dCkgewogICAgICAgIHJldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChsaW5lLCBpbnB1dCk7CiAgICB9OwoKICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihzdGF0ZSwgZG9jLCByb3cpIHsKICAgICAgICB0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGRvYywgcm93KTsKICAgIH07CiAgICAKICAgIHRoaXMuY3JlYXRlV29ya2VyID0gZnVuY3Rpb24oc2Vzc2lvbikgewogICAgICAgIHZhciB3b3JrZXIgPSBuZXcgV29ya2VyQ2xpZW50KFsiYWNlIl0sICJ3b3JrZXItamF2YXNjcmlwdC5qcyIsICJhY2UvbW9kZS9qYXZhc2NyaXB0X3dvcmtlciIsICJKYXZhU2NyaXB0V29ya2VyIik7CiAgICAgICAgd29ya2VyLmF0dGFjaFRvRG9jdW1lbnQoc2Vzc2lvbi5nZXREb2N1bWVudCgpKTsKICAgICAgICAgICAgCiAgICAgICAgd29ya2VyLm9uKCJqc2xpbnQiLCBmdW5jdGlvbihyZXN1bHRzKSB7CiAgICAgICAgICAgIHZhciBlcnJvcnMgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHJlc3VsdHMuZGF0YS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIGVycm9yID0gcmVzdWx0cy5kYXRhW2ldOwogICAgICAgICAgICAgICAgaWYgKGVycm9yKQogICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgcm93OiBlcnJvci5saW5lLTEsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogZXJyb3IuY2hhcmFjdGVyLTEsCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGVycm9yLnJlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogIndhcm5pbmciLAogICAgICAgICAgICAgICAgICAgICAgICBsaW50OiBlcnJvcgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlc3Npb24uc2V0QW5ub3RhdGlvbnMoZXJyb3JzKTsKICAgICAgICB9KTsKICAgICAgICAKICAgICAgICB3b3JrZXIub24oIm5hcmNpc3N1cyIsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgc2Vzc2lvbi5zZXRBbm5vdGF0aW9ucyhbZS5kYXRhXSk7CiAgICAgICAgfSk7CiAgICAgICAgCiAgICAgICAgd29ya2VyLm9uKCJ0ZXJtaW5hdGUiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgc2Vzc2lvbi5jbGVhckFubm90YXRpb25zKCk7CiAgICAgICAgfSk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHdvcmtlcjsKICAgIH07Cgp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsKCmV4cG9ydHMuTW9kZSA9IE1vZGU7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqICAgICAgTWloYWkgU3VjYW4gPG1paGFpIERPVCBzdWNhbiBBVCBnbWFpbCBET1QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9sYW5nJywgJ2FjZS91bmljb2RlJywgJ2FjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOwp2YXIgdW5pY29kZSA9IHJlcXVpcmUoIi4uL3VuaWNvZGUiKTsKdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIikuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzOwp2YXIgVGV4dEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlczsKCnZhciBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSBmdW5jdGlvbigpIHsKCiAgICAvLyBzZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzCiAgICB2YXIgZ2xvYmFscyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgLy8gQ29uc3RydWN0b3JzCiAgICAgICAgKCJBcnJheXxCb29sZWFufERhdGV8RnVuY3Rpb258SXRlcmF0b3J8TnVtYmVyfE9iamVjdHxSZWdFeHB8U3RyaW5nfFByb3h5fCIgKwogICAgICAvLyBFNFgKICAgICAgICAgIk5hbWVzcGFjZXxRTmFtZXxYTUx8WE1MTGlzdHwiICsKICAgICAgICAgIkFycmF5QnVmZmVyfEZsb2F0MzJBcnJheXxGbG9hdDY0QXJyYXl8SW50MTZBcnJheXxJbnQzMkFycmF5fEludDhBcnJheXwiICsKICAgICAgICAgIlVpbnQxNkFycmF5fFVpbnQzMkFycmF5fFVpbnQ4QXJyYXl8VWludDhDbGFtcGVkQXJyYXl8IiArCiAgICAgIC8vIEVycm9ycwogICAgICAgICJFcnJvcnxFdmFsRXJyb3J8SW50ZXJuYWxFcnJvcnxSYW5nZUVycm9yfFJlZmVyZW5jZUVycm9yfFN0b3BJdGVyYXRpb258IiArCiAgICAgICAgIlN5bnRheEVycm9yfFR5cGVFcnJvcnxVUklFcnJvcnwiICsKICAgICAgLy8gIE5vbi1jb25zdHJ1Y3RvciBmdW5jdGlvbnMKICAgICAgICAiZGVjb2RlVVJJfGRlY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZW5jb2RlVVJJQ29tcG9uZW50fGV2YWx8aXNGaW5pdGV8IiArCiAgICAgICAgImlzTmFOfHBhcnNlRmxvYXR8cGFyc2VJbnR8IiArCiAgICAgIC8vIE90aGVyCiAgICAgICAgIkpTT058TWF0aHwiICsKICAgICAgLy8gUHNldWRvCiAgICAgICAgInRoaXN8YXJndW1lbnRzfHByb3RvdHlwZXx3aW5kb3d8ZG9jdW1lbnQiCiAgICAgICkuc3BsaXQoInwiKQogICAgKTsKCiAgICB2YXIga2V5d29yZHMgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCJicmVha3xjYXNlfGNhdGNofGNvbnRpbnVlfGRlZmF1bHR8ZGVsZXRlfGRvfGVsc2V8ZmluYWxseXxmb3J8ZnVuY3Rpb258IiArCiAgICAgICAgImlmfGlufGluc3RhbmNlb2Z8bmV3fHJldHVybnxzd2l0Y2h8dGhyb3d8dHJ5fHR5cGVvZnxsZXR8dmFyfHdoaWxlfHdpdGh8IiArCiAgICAgICAgImNvbnN0fHlpZWxkfGltcG9ydHxnZXR8c2V0Iikuc3BsaXQoInwiKQogICAgKTsKCiAgICAvLyBrZXl3b3JkcyB3aGljaCBjYW4gYmUgZm9sbG93ZWQgYnkgcmVndWxhciBleHByZXNzaW9ucwogICAgdmFyIGt3QmVmb3JlUmUgPSAiY2FzZXxkb3xlbHNlfGZpbmFsbHl8aW58aW5zdGFuY2VvZnxyZXR1cm58dGhyb3d8dHJ5fHR5cGVvZnx5aWVsZCI7CgogICAgdmFyIGRlcHJlY2F0ZWQgPSBsYW5nLmFycmF5VG9NYXAoCiAgICAgICAgKCJfX3BhcmVudF9ffF9fY291bnRfX3xlc2NhcGV8dW5lc2NhcGV8d2l0aHxfX3Byb3RvX18iKS5zcGxpdCgifCIpCiAgICApOwoKICAgIHZhciBkZWZpbml0aW9ucyA9IGxhbmcuYXJyYXlUb01hcCgoImNvbnN0fGxldHx2YXJ8ZnVuY3Rpb24iKS5zcGxpdCgifCIpKTsKCiAgICB2YXIgYnVpbGRpbkNvbnN0YW50cyA9IGxhbmcuYXJyYXlUb01hcCgKICAgICAgICAoIm51bGx8SW5maW5pdHl8TmFOfHVuZGVmaW5lZCIpLnNwbGl0KCJ8IikKICAgICk7CgogICAgdmFyIGZ1dHVyZVJlc2VydmVkID0gbGFuZy5hcnJheVRvTWFwKAogICAgICAgICgiY2xhc3N8ZW51bXxleHRlbmRzfHN1cGVyfGV4cG9ydHxpbXBsZW1lbnRzfHByaXZhdGV8IiArCiAgICAgICAgInB1YmxpY3xpbnRlcmZhY2V8cGFja2FnZXxwcm90ZWN0ZWR8c3RhdGljIikuc3BsaXQoInwiKQogICAgKTsKCiAgICAvLyBUT0RPOiBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMKICAgIHZhciBpZGVudGlmaWVyUmUgPSAiWyIgKyB1bmljb2RlLnBhY2thZ2VzLkwgKyAiXFwkX11bIiAKICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTAogICAgICAgICsgdW5pY29kZS5wYWNrYWdlcy5NbiArIHVuaWNvZGUucGFja2FnZXMuTWMKICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuTmQKICAgICAgICArIHVuaWNvZGUucGFja2FnZXMuUGMgKyAiXFwkX10qXFxiIjsKICAgICAgICAKICAgIC8vIHJlZ2V4cCBtdXN0IG5vdCBoYXZlIGNhcHR1cmluZyBwYXJlbnRoZXNlcy4gVXNlICg/OikgaW5zdGVhZC4KICAgIC8vIHJlZ2V4cHMgYXJlIG9yZGVyZWQgLT4gdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQKCiAgICB0aGlzLiRydWxlcyA9IHsKICAgICAgICAic3RhcnQiIDogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcLy4qJCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0IiksCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBtdWx0aSBsaW5lIGNvbW1lbnQKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcKiIsCiAgICAgICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIHNpbmdsZSBsaW5lCiAgICAgICAgICAgICAgICByZWdleCA6ICdbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJwogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydAogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAnWyJdLipcXFxcJCcsCiAgICAgICAgICAgICAgICBuZXh0IDogInFxc3RyaW5nIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBzaW5nbGUgbGluZQogICAgICAgICAgICAgICAgcmVnZXggOiAiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwgLy8gbXVsdGkgbGluZSBzdHJpbmcgc3RhcnQKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlsnXS4qXFxcXCQiLAogICAgICAgICAgICAgICAgbmV4dCA6ICJxc3RyaW5nIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb25zdGFudC5udW1lcmljIiwgLy8gaGV4CiAgICAgICAgICAgICAgICByZWdleCA6ICIwW3hYXVswLTlhLWZBLUZdK1xcYiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubnVtZXJpYyIsIC8vIGZsb2F0CiAgICAgICAgICAgICAgICByZWdleCA6ICJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiBbImtleXdvcmQuZGVmaW5pdGlvbiIsICJ0ZXh0IiwgImVudGl0eS5uYW1lLmZ1bmN0aW9uIl0sCiAgICAgICAgICAgICAgICByZWdleCA6ICIoZnVuY3Rpb24pKFxccyspKCIgKyBpZGVudGlmaWVyUmUgKyAiKSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiIsCiAgICAgICAgICAgICAgICByZWdleCA6ICIoPzp0cnVlfGZhbHNlKVxcYiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICIoPzoiICsga3dCZWZvcmVSZSArICIpXFxiIiwKICAgICAgICAgICAgICAgIG5leHQgOiAicmVnZXhfYWxsb3dlZCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWxzLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS5sYW5ndWFnZSI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVwcmVjYXRlZC5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZWZpbml0aW9ucy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAia2V5d29yZC5kZWZpbml0aW9uIjsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYnVpbGRpbkNvbnN0YW50cy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uc3RhbnQubGFuZ3VhZ2UiOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZ1dHVyZVJlc2VydmVkLmhhc093blByb3BlcnR5KHZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkLmlsbGVnYWwiOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09ICJkZWJ1Z2dlciIpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW52YWxpZC5kZXByZWNhdGVkIjsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaWRlbnRpZmllciI7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcmVnZXggOiBpZGVudGlmaWVyUmUKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZC5vcGVyYXRvciIsCiAgICAgICAgICAgICAgICByZWdleCA6ICIhfFxcJHwlfCZ8XFwqfFxcLVxcLXxcXC18XFwrXFwrfFxcK3x+fD09PXw9PXw9fCE9fCE9PXw8PXw+PXw8PD18Pj49fD4+Pj18PD58PHw+fCF8JiZ8XFx8XFx8fFxcP1xcOnxcXCo9fCU9fFxcKz18XFwtPXwmPXxcXF49fFxcYig/OmlufGluc3RhbmNlb2Z8bmV3fGRlbGV0ZXx0eXBlb2Z8dm9pZCkiLAogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAicHVuY3R1YXRpb24ub3BlcmF0b3IiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFw/fFxcOnxcXCx8XFw7fFxcLiIsCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJyZWdleF9hbGxvd2VkIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJwYXJlbi5scGFyZW4iLAogICAgICAgICAgICAgICAgcmVnZXggOiAiW1soe10iLAogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAicGFyZW4ucnBhcmVuIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIltcXF0pfV0iCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQub3BlcmF0b3IiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvPT8iLAogICAgICAgICAgICAgICAgbmV4dCAgOiAicmVnZXhfYWxsb3dlZCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW46ICJjb21tZW50IiwKICAgICAgICAgICAgICAgIHJlZ2V4OiAiXiMhLiokIiAKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXHMrIgogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAvLyByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBvbmx5IGFsbG93ZWQgYWZ0ZXIgY2VydGFpbiB0b2tlbnMuIFRoaXMKICAgICAgICAvLyBtYWtlcyBzdXJlIHdlIGRvbid0IG1peCB1cCByZWdleHBzIHdpdGggdGhlIGRpdmlzb24gb3BlcmF0b3IKICAgICAgICAicmVnZXhfYWxsb3dlZCI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsIC8vIG11bHRpIGxpbmUgY29tbWVudAogICAgICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwvXFwqIiwKICAgICAgICAgICAgICAgIG5leHQgOiAiY29tbWVudF9yZWdleF9hbGxvd2VkIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxcL1xcLy4qJCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwIiwKICAgICAgICAgICAgICAgIHJlZ2V4OiAiXFwvIiwKICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleCIsCiAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZQogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIlxccysiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5IHJldHVybiB0byB0aGUgc3RhcnQgbW9kZSB3aXRob3V0IG1hdGNoaW5nCiAgICAgICAgICAgICAgICAvLyBhbnl0aGluZwogICAgICAgICAgICAgICAgdG9rZW46ICJlbXB0eSIsIAogICAgICAgICAgICAgICAgcmVnZXg6ICIiLAogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0IgogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAicmVnZXgiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuOiAicmVnZXhwLmtleXdvcmQub3BlcmF0b3IiLAogICAgICAgICAgICAgICAgcmVnZXg6ICJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXgiCiAgICAgICAgICAgIH0sIHsKCQkJCS8vIGZsYWcKICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cCIsIAogICAgICAgICAgICAgICAgcmVnZXg6ICIvXFx3KiIsCiAgICAgICAgICAgICAgICBuZXh0OiAic3RhcnQiLAogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUgCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuOiAic3RyaW5nLnJlZ2V4cCIsCiAgICAgICAgICAgICAgICByZWdleDogIlteXFxcXC9cXFtdKyIsCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXgiLAogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyIsCiAgICAgICAgICAgICAgICByZWdleDogIlxcWyIsCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIiwKICAgICAgICAgICAgICAgIG1lcmdlOiB0cnVlCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuOiAiZW1wdHkiLCAKICAgICAgICAgICAgICAgIHJlZ2V4OiAiIiwKICAgICAgICAgICAgICAgIG5leHQ6ICJzdGFydCIgCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuOiAicmVnZXhwLmtleXdvcmQub3BlcmF0b3IiLAogICAgICAgICAgICAgICAgcmVnZXg6ICJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXhfY2hhcmFjdGVyX2NsYXNzIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbjogInN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIiwKICAgICAgICAgICAgICAgIHJlZ2V4OiAiXSIsCiAgICAgICAgICAgICAgICBuZXh0OiAicmVnZXgiLAogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW46ICJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyIsCiAgICAgICAgICAgICAgICByZWdleDogIlteXFxcXFxcXV0rIiwKICAgICAgICAgICAgICAgIG5leHQ6ICJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiLAogICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW46ICJlbXB0eSIsIAogICAgICAgICAgICAgICAgcmVnZXg6ICIiLAogICAgICAgICAgICAgICAgbmV4dDogInN0YXJ0IiAKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgImNvbW1lbnRfcmVnZXhfYWxsb3dlZCIgOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQKICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICBuZXh0IDogInJlZ2V4X2FsbG93ZWQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjb21tZW50IHNwYW5uaW5nIHdob2xlIGxpbmUKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4rIgogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiY29tbWVudCIgOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQiLCAvLyBjbG9zaW5nIGNvbW1lbnQKICAgICAgICAgICAgICAgIHJlZ2V4IDogIi4qP1xcKlxcLyIsCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICBuZXh0IDogInN0YXJ0IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwgLy8gY29tbWVudCBzcGFubmluZyB3aG9sZSBsaW5lCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICIuKyIKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInFxc3RyaW5nIiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogJyg/Oig/OlxcXFwuKXwoPzpbXiJcXFxcXSkpKj8iJywKICAgICAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgICAgICByZWdleCA6ICcuKycKICAgICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInFzdHJpbmciIDogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgcmVnZXggOiAiKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqPyciLAogICAgICAgICAgICAgICAgbmV4dCA6ICJzdGFydCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlZ2V4IDogJy4rJwogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfTsKICAgIAogICAgdGhpcy5lbWJlZFJ1bGVzKERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcywgImRvYy0iLAogICAgICAgIFsgbmV3IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcygpLmdldEVuZFJ1bGUoInN0YXJ0IikgXSk7Cn07Cgpvb3AuaW5oZXJpdHMoSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzLCBUZXh0SGlnaGxpZ2h0UnVsZXMpOwoKZXhwb3J0cy5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMgPSBKYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXM7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOwoKdmFyIERvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgewoKICAgIHRoaXMuJHJ1bGVzID0gewogICAgICAgICJzdGFydCIgOiBbIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MudGFnIiwKICAgICAgICAgICAgcmVnZXggOiAiQFtcXHdcXGRfXSsiIC8vIFRPRE86IGZpeCBlbWFpbCBhZGRyZXNzZXMKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICJcXHMrIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudC5kb2MiLAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlRPRE8iCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiW15AXFwqXSsiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsCiAgICAgICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICAgICAgcmVnZXggOiAiLiIKICAgICAgICB9XQogICAgfTsKfTsKCm9vcC5pbmhlcml0cyhEb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsIFRleHRIaWdobGlnaHRSdWxlcyk7CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5nZXRTdGFydFJ1bGUgPSBmdW5jdGlvbihzdGFydCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHRva2VuIDogImNvbW1lbnQuZG9jIiwgLy8gZG9jIGNvbW1lbnQKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICJcXC9cXCooPz1cXCopIiwKICAgICAgICAgICAgbmV4dCAgOiBzdGFydAogICAgICAgIH07CiAgICB9OwogICAgCiAgICB0aGlzLmdldEVuZFJ1bGUgPSBmdW5jdGlvbiAoc3RhcnQpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50LmRvYyIsIC8vIGNsb3NpbmcgY29tbWVudAogICAgICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgICAgIHJlZ2V4IDogIlxcKlxcLyIsCiAgICAgICAgICAgIG5leHQgIDogc3RhcnQKICAgICAgICB9OwogICAgfTsKCn0pLmNhbGwoRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLnByb3RvdHlwZSk7CgpleHBvcnRzLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyA9IERvY0NvbW1lbnRIaWdobGlnaHRSdWxlczsKCn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9yYW5nZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi4vcmFuZ2UiKS5SYW5nZTsKCnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IGZ1bmN0aW9uKCkge307CgooZnVuY3Rpb24oKSB7CgogICAgdGhpcy5jaGVja091dGRlbnQgPSBmdW5jdGlvbihsaW5lLCBpbnB1dCkgewogICAgICAgIGlmICghIC9eXHMrJC8udGVzdChsaW5lKSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgICByZXR1cm4gL15ccypcfS8udGVzdChpbnB1dCk7CiAgICB9OwoKICAgIHRoaXMuYXV0b091dGRlbnQgPSBmdW5jdGlvbihkb2MsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocm93KTsKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKlx9KS8pOwoKICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDsKCiAgICAgICAgdmFyIGNvbHVtbiA9IG1hdGNoWzFdLmxlbmd0aDsKICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gZG9jLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbn0pOwoKICAgICAgICBpZiAoIW9wZW5CcmFjZVBvcyB8fCBvcGVuQnJhY2VQb3Mucm93ID09IHJvdykgcmV0dXJuIDA7CgogICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoZG9jLmdldExpbmUob3BlbkJyYWNlUG9zLnJvdykpOwogICAgICAgIGRvYy5yZXBsYWNlKG5ldyBSYW5nZShyb3csIDAsIHJvdywgY29sdW1uLTEpLCBpbmRlbnQpOwogICAgfTsKCiAgICB0aGlzLiRnZXRJbmRlbnQgPSBmdW5jdGlvbihsaW5lKSB7CiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCgvXihccyspLyk7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAiIjsKICAgIH07Cgp9KS5jYWxsKE1hdGNoaW5nQnJhY2VPdXRkZW50LnByb3RvdHlwZSk7CgpleHBvcnRzLk1hdGNoaW5nQnJhY2VPdXRkZW50ID0gTWF0Y2hpbmdCcmFjZU91dGRlbnQ7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS93b3JrZXIvd29ya2VyX2NsaWVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9ldmVudF9lbWl0dGVyJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXI7Cgp2YXIgV29ya2VyQ2xpZW50ID0gZnVuY3Rpb24odG9wTGV2ZWxOYW1lc3BhY2VzLCBwYWNrYWdlZEpzLCBtb2QsIGNsYXNzbmFtZSkgewoKICAgIHRoaXMuY2hhbmdlTGlzdGVuZXIgPSB0aGlzLmNoYW5nZUxpc3RlbmVyLmJpbmQodGhpcyk7CgogICAgaWYgKG1vZHVsZS5wYWNrYWdlZCkgewogICAgICAgIHZhciBiYXNlID0gdGhpcy4kZ3Vlc3NCYXNlUGF0aCgpOwogICAgICAgIHRoaXMuJHdvcmtlciA9IG5ldyBXb3JrZXIoYmFzZSArIHBhY2thZ2VkSnMpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgdmFyIHdvcmtlclVybCA9IHRoaXMuJG5vcm1hbGl6ZVBhdGgocmVxdWlyZS5uYW1lVG9VcmwoImFjZS93b3JrZXIvd29ya2VyIiwgbnVsbCwgIl8iKSk7CiAgICAgICAgdGhpcy4kd29ya2VyID0gbmV3IFdvcmtlcih3b3JrZXJVcmwpOwoKICAgICAgICB2YXIgdGxucyA9IHt9OwogICAgICAgIGZvciAodmFyIGk9MDsgaTx0b3BMZXZlbE5hbWVzcGFjZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIG5zID0gdG9wTGV2ZWxOYW1lc3BhY2VzW2ldOwogICAgICAgICAgICB2YXIgcGF0aCA9IHRoaXMuJG5vcm1hbGl6ZVBhdGgocmVxdWlyZS5uYW1lVG9VcmwobnMsIG51bGwsICJfIikucmVwbGFjZSgvLmpzJC8sICIiKSk7CgogICAgICAgICAgICB0bG5zW25zXSA9IHBhdGg7CiAgICAgICAgfQogICAgfQoKICAgIHRoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7CiAgICAgICAgaW5pdCA6IHRydWUsCiAgICAgICAgdGxuczogdGxucywKICAgICAgICBtb2R1bGU6IG1vZCwKICAgICAgICBjbGFzc25hbWU6IGNsYXNzbmFtZQogICAgfSk7CgogICAgdGhpcy5jYWxsYmFja0lkID0gMTsKICAgIHRoaXMuY2FsbGJhY2tzID0ge307CgogICAgdmFyIF9zZWxmID0gdGhpczsKICAgIHRoaXMuJHdvcmtlci5vbmVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgIHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUubG9nICYmIGNvbnNvbGUubG9nKGUpOwogICAgICAgIHRocm93IGU7CiAgICB9OwogICAgdGhpcy4kd29ya2VyLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICB2YXIgbXNnID0gZS5kYXRhOwogICAgICAgIHN3aXRjaChtc2cudHlwZSkgewogICAgICAgICAgICBjYXNlICJsb2ciOgogICAgICAgICAgICAgICAgd2luZG93LmNvbnNvbGUgJiYgY29uc29sZS5sb2cgJiYgY29uc29sZS5sb2cobXNnLmRhdGEpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICJldmVudCI6CiAgICAgICAgICAgICAgICBfc2VsZi5fZW1pdChtc2cubmFtZSwge2RhdGE6IG1zZy5kYXRhfSk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgImNhbGwiOgogICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gX3NlbGYuY2FsbGJhY2tzW21zZy5pZF07CiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhtc2cuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIF9zZWxmLmNhbGxiYWNrc1ttc2cuaWRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfTsKfTsKCihmdW5jdGlvbigpewoKICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsKCiAgICB0aGlzLiRub3JtYWxpemVQYXRoID0gZnVuY3Rpb24ocGF0aCkgewogICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL15bYS16XSs6XC9cL1teXC9dK1wvLywgIiIpOyAvLyBSZW1vdmUgZG9tYWluIG5hbWUgYW5kIHJlYnVpbGQgaXQKICAgICAgICBwYXRoID0gbG9jYXRpb24ucHJvdG9jb2wgKyAiLy8iICsgbG9jYXRpb24uaG9zdAogICAgICAgICAgICAvLyBwYXRocyBzdGFydGluZyB3aXRoIGEgc2xhc2ggYXJlIHJlbGF0aXZlIHRvIHRoZSByb290IChob3N0KQogICAgICAgICAgICArIChwYXRoLmNoYXJBdCgwKSA9PSAiLyIgPyAiIiA6IGxvY2F0aW9uLnBhdGhuYW1lLnJlcGxhY2UoL1wvW15cL10qJC8sICIiKSkKICAgICAgICAgICAgKyAiLyIgKyBwYXRoLnJlcGxhY2UoL15bXC9dKy8sICIiKTsKICAgICAgICByZXR1cm4gcGF0aDsKICAgIH07CgogICAgdGhpcy4kZ3Vlc3NCYXNlUGF0aCA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmIChyZXF1aXJlLmFjZUJhc2VVcmwpCiAgICAgICAgICAgIHJldHVybiByZXF1aXJlLmFjZUJhc2VVcmw7CgogICAgICAgIHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpOwogICAgICAgIGZvciAodmFyIGk9MDsgaTxzY3JpcHRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBzY3JpcHQgPSBzY3JpcHRzW2ldOwoKICAgICAgICAgICAgdmFyIGJhc2UgPSBzY3JpcHQuZ2V0QXR0cmlidXRlKCJkYXRhLWFjZS1iYXNlIik7CiAgICAgICAgICAgIGlmIChiYXNlKQogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UucmVwbGFjZSgvXC8qJC8sICIvIik7CgogICAgICAgICAgICB2YXIgc3JjID0gc2NyaXB0LnNyYyB8fCBzY3JpcHQuZ2V0QXR0cmlidXRlKCJzcmMiKTsKICAgICAgICAgICAgaWYgKCFzcmMpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBtID0gc3JjLm1hdGNoKC9eKD86KC4qXC8pYWNlXC5qc3woLipcLylhY2UoLXVuY29tcHJlc3NlZCk/KC1ub2NvbmZsaWN0KT9cLmpzKSg/Olw/fCQpLyk7CiAgICAgICAgICAgIGlmIChtKQogICAgICAgICAgICAgICAgcmV0dXJuIG1bMV0gfHwgbVsyXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICIiOwogICAgfTsKCiAgICB0aGlzLnRlcm1pbmF0ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2VtaXQoInRlcm1pbmF0ZSIsIHt9KTsKICAgICAgICB0aGlzLiR3b3JrZXIudGVybWluYXRlKCk7CiAgICAgICAgdGhpcy4kd29ya2VyID0gbnVsbDsKICAgICAgICB0aGlzLiRkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7CiAgICAgICAgdGhpcy4kZG9jID0gbnVsbDsKICAgIH07CgogICAgdGhpcy5zZW5kID0gZnVuY3Rpb24oY21kLCBhcmdzKSB7CiAgICAgICAgdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtjb21tYW5kOiBjbWQsIGFyZ3M6IGFyZ3N9KTsKICAgIH07CgogICAgdGhpcy5jYWxsID0gZnVuY3Rpb24oY21kLCBhcmdzLCBjYWxsYmFjaykgewogICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgaWQgPSB0aGlzLmNhbGxiYWNrSWQrKzsKICAgICAgICAgICAgdGhpcy5jYWxsYmFja3NbaWRdID0gY2FsbGJhY2s7CiAgICAgICAgICAgIGFyZ3MucHVzaChpZCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuc2VuZChjbWQsIGFyZ3MpOwogICAgfTsKCiAgICB0aGlzLmVtaXQgPSBmdW5jdGlvbihldmVudCwgZGF0YSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIC8vIGZpcmVmb3ggcmVmdXNlcyB0byBjbG9uZSBvYmplY3RzIHdoaWNoIGhhdmUgZnVuY3Rpb24gcHJvcGVydGllcwogICAgICAgICAgICAvLyBUT0RPOiBjbGVhbnVwIGV2ZW50CiAgICAgICAgICAgIHRoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7ZXZlbnQ6IGV2ZW50LCBkYXRhOiB7ZGF0YTogZGF0YS5kYXRhfX0pOwogICAgICAgIH0KICAgICAgICBjYXRjaChleCkge30KICAgIH07CgogICAgdGhpcy5hdHRhY2hUb0RvY3VtZW50ID0gZnVuY3Rpb24oZG9jKSB7CiAgICAgICAgaWYodGhpcy4kZG9jKQogICAgICAgICAgICB0aGlzLnRlcm1pbmF0ZSgpOwoKICAgICAgICB0aGlzLiRkb2MgPSBkb2M7CiAgICAgICAgdGhpcy5jYWxsKCJzZXRWYWx1ZSIsIFtkb2MuZ2V0VmFsdWUoKV0pOwogICAgICAgIGRvYy5vbigiY2hhbmdlIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7CiAgICB9OwoKICAgIHRoaXMuY2hhbmdlTGlzdGVuZXIgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgZS5yYW5nZSA9IHsKICAgICAgICAgICAgc3RhcnQ6IGUuZGF0YS5yYW5nZS5zdGFydCwKICAgICAgICAgICAgZW5kOiBlLmRhdGEucmFuZ2UuZW5kCiAgICAgICAgfTsKICAgICAgICB0aGlzLmVtaXQoImNoYW5nZSIsIGUpOwogICAgfTsKCn0pLmNhbGwoV29ya2VyQ2xpZW50LnByb3RvdHlwZSk7CgpleHBvcnRzLldvcmtlckNsaWVudCA9IFdvcmtlckNsaWVudDsKCn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi8uLi9saWIvb29wIik7CnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7CnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOwoKdmFyIEZvbGRNb2RlID0gZXhwb3J0cy5Gb2xkTW9kZSA9IGZ1bmN0aW9uKCkge307Cm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IC8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvOwogICAgdGhpcy5mb2xkaW5nU3RvcE1hcmtlciA9IC9eW15cW1x7XSooXH18XF0pfF5bXHNcKl0qKFwqXC8pLzsKICAgIAogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXg7CgogICAgICAgICAgICBpZiAobWF0Y2hbMV0pCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKHNlc3Npb24sIG1hdGNoWzFdLCByb3csIGkpOwoKICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSArIG1hdGNoWzBdLmxlbmd0aCk7CiAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4gLT0gMjsKICAgICAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGZvbGRTdHlsZSAhPT0gIm1hcmtiZWdpbmVuZCIpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgCiAgICAgICAgdmFyIG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgdmFyIGkgPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDsKCiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkgewogICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gc2Vzc2lvbi5nZXRDb21tZW50Rm9sZFJhbmdlKHJvdywgaSk7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uIC09IDI7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiByb3csIGNvbHVtbjogaX07CiAgICAgICAgICAgIHZhciBzdGFydCA9IHNlc3Npb24uJGZpbmRPcGVuaW5nQnJhY2tldChtYXRjaFsxXSwgZW5kKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICghc3RhcnQpCiAgICAgICAgICAgICAgICByZXR1cm47CgogICAgICAgICAgICBzdGFydC5jb2x1bW4rKzsKICAgICAgICAgICAgZW5kLmNvbHVtbi0tOwoKICAgICAgICAgICAgcmV0dXJuICBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0LCBlbmQpOwogICAgICAgIH0KICAgIH07CiAgICAKfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOwoKfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9zdmdfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcycsICdhY2UvbW9kZS94bWxfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL3htbF91dGlsJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vbGliL29vcCIpOwp2YXIgSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIpLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlczsKdmFyIFhtbEhpZ2hsaWdodFJ1bGVzID0gcmVxdWlyZSgiLi94bWxfaGlnaGxpZ2h0X3J1bGVzIikuWG1sSGlnaGxpZ2h0UnVsZXM7CnZhciB4bWxVdGlsID0gcmVxdWlyZSgiLi94bWxfdXRpbCIpOwoKdmFyIFN2Z0hpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7CiAgICBYbWxIaWdobGlnaHRSdWxlcy5jYWxsKHRoaXMpOwoKICAgIHRoaXMuJHJ1bGVzLnN0YXJ0LnNwbGljZSgzLCAwLCB7CiAgICAgICAgdG9rZW4gOiAibWV0YS50YWciLAogICAgICAgIHJlZ2V4IDogIjwoPz1ccypzY3JpcHQpIiwKICAgICAgICBuZXh0IDogInNjcmlwdCIKICAgIH0pOwogICAgCiAgICB4bWxVdGlsLnRhZyh0aGlzLiRydWxlcywgInNjcmlwdCIsICJqcy1zdGFydCIpOwogICAgCiAgICB0aGlzLmVtYmVkUnVsZXMoSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzLCAianMtIiwgW3sKICAgICAgICB0b2tlbjogImNvbW1lbnQiLAogICAgICAgIHJlZ2V4OiAiXFwvXFwvLiooPz08XFwvc2NyaXB0PikiLAogICAgICAgIG5leHQ6ICJ0YWciCiAgICB9LCB7CiAgICAgICAgdG9rZW46ICJtZXRhLnRhZyIsCiAgICAgICAgcmVnZXg6ICI8XFwvKD89c2NyaXB0KSIsCiAgICAgICAgbmV4dDogInRhZyIKICAgIH1dKTsKfTsKCm9vcC5pbmhlcml0cyhTdmdIaWdobGlnaHRSdWxlcywgWG1sSGlnaGxpZ2h0UnVsZXMpOwoKZXhwb3J0cy5TdmdIaWdobGlnaHRSdWxlcyA9IFN2Z0hpZ2hsaWdodFJ1bGVzOwp9KTsKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9mb2xkaW5nL21peGVkJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsKdmFyIEJhc2VGb2xkTW9kZSA9IHJlcXVpcmUoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGU7Cgp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oZGVmYXVsdE1vZGUsIHN1Yk1vZGVzKSB7CiAgICB0aGlzLmRlZmF1bHRNb2RlID0gZGVmYXVsdE1vZGU7CiAgICB0aGlzLnN1Yk1vZGVzID0gc3ViTW9kZXM7Cn07Cm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsKCihmdW5jdGlvbigpIHsKCgogICAgdGhpcy4kZ2V0TW9kZSA9IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMuc3ViTW9kZXMpIHsKICAgICAgICAgICAgaWYgKHN0YXRlLmluZGV4T2Yoa2V5KSA9PT0gMCkKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN1Yk1vZGVzW2tleV07CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfTsKICAgIAogICAgdGhpcy4kdHJ5TW9kZSA9IGZ1bmN0aW9uKHN0YXRlLCBzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgewogICAgICAgIHZhciBtb2RlID0gdGhpcy4kZ2V0TW9kZShzdGF0ZSk7CiAgICAgICAgcmV0dXJuIChtb2RlID8gbW9kZS5nZXRGb2xkV2lkZ2V0KHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSA6ICIiKTsKICAgIH07CgogICAgdGhpcy5nZXRGb2xkV2lkZ2V0ID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICB0aGlzLiR0cnlNb2RlKHNlc3Npb24uZ2V0U3RhdGUocm93LTEpLCBzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgfHwKICAgICAgICAgICAgdGhpcy4kdHJ5TW9kZShzZXNzaW9uLmdldFN0YXRlKHJvdyksIHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSB8fAogICAgICAgICAgICB0aGlzLmRlZmF1bHRNb2RlLmdldEZvbGRXaWRnZXQoc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpCiAgICAgICAgKTsKICAgIH07CgogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgewogICAgICAgIHZhciBtb2RlID0gdGhpcy4kZ2V0TW9kZShzZXNzaW9uLmdldFN0YXRlKHJvdy0xKSk7CiAgICAgICAgCiAgICAgICAgaWYgKCFtb2RlIHx8ICFtb2RlLmdldEZvbGRXaWRnZXQoc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpKQogICAgICAgICAgICBtb2RlID0gdGhpcy4kZ2V0TW9kZShzZXNzaW9uLmdldFN0YXRlKHJvdykpOwogICAgICAgIAogICAgICAgIGlmICghbW9kZSB8fCAhbW9kZS5nZXRGb2xkV2lkZ2V0KHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KSkKICAgICAgICAgICAgbW9kZSA9IHRoaXMuZGVmYXVsdE1vZGU7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIG1vZGUuZ2V0Rm9sZFdpZGdldFJhbmdlKHNlc3Npb24sIGZvbGRTdHlsZSwgcm93KTsKICAgIH07Cgp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7Cgp9KTs7CiAgICAgICAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAg]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-svg.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS9zdmciLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3htbCIsImFjZS9tb2RlL2phdmFzY3JpcHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvc3ZnX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL2ZvbGRpbmcvbWl4ZWQiLCJhY2UvbW9kZS9mb2xkaW5nL3htbCIsImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3htbCIpLk1vZGUsZj1hKCIuL2phdmFzY3JpcHQiKS5Nb2RlLGc9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGg9YSgiLi9zdmdfaGlnaGxpZ2h0X3J1bGVzIikuU3ZnSGlnaGxpZ2h0UnVsZXMsaT1hKCIuL2ZvbGRpbmcvbWl4ZWQiKS5Gb2xkTW9kZSxqPWEoIi4vZm9sZGluZy94bWwiKS5Gb2xkTW9kZSxrPWEoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZSxsPWZ1bmN0aW9uKCl7ZS5jYWxsKHRoaXMpLHRoaXMuaGlnaGxpZ2h0ZXI9bmV3IGgsdGhpcy4kdG9rZW5pemVyPW5ldyBnKHRoaXMuaGlnaGxpZ2h0ZXIuZ2V0UnVsZXMoKSksdGhpcy4kZW1iZWRzPXRoaXMuaGlnaGxpZ2h0ZXIuZ2V0RW1iZWRzKCksdGhpcy5jcmVhdGVNb2RlRGVsZWdhdGVzKHsianMtIjpmfSksdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGkobmV3IGooe30pLHsianMtIjpuZXcga30pfTtkLmluaGVyaXRzKGwsZSksZnVuY3Rpb24oKXt0aGlzLmdldE5leHRMaW5lSW5kZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy4kZ2V0SW5kZW50KGIpfX0uY2FsbChsLnByb3RvdHlwZSksYi5Nb2RlPWx9KSxkZWZpbmUoImFjZS9tb2RlL3htbCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dCIsImFjZS90b2tlbml6ZXIiLCJhY2UvbW9kZS94bWxfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvYmVoYXZpb3VyL3htbCIsImFjZS9tb2RlL2ZvbGRpbmcveG1sIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3RleHQiKS5Nb2RlLGY9YSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLGc9YSgiLi94bWxfaGlnaGxpZ2h0X3J1bGVzIikuWG1sSGlnaGxpZ2h0UnVsZXMsaD1hKCIuL2JlaGF2aW91ci94bWwiKS5YbWxCZWhhdmlvdXIsaT1hKCIuL2ZvbGRpbmcveG1sIikuRm9sZE1vZGUsaj1mdW5jdGlvbigpe3RoaXMuJHRva2VuaXplcj1uZXcgZigobmV3IGcpLmdldFJ1bGVzKCkpLHRoaXMuJGJlaGF2aW91cj1uZXcgaCx0aGlzLmZvbGRpbmdSdWxlcz1uZXcgaX07ZC5pbmhlcml0cyhqLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuJGdldEluZGVudChiKX19LmNhbGwoai5wcm90b3R5cGUpLGIuTW9kZT1qfSksZGVmaW5lKCJhY2UvbW9kZS94bWxfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS94bWxfdXRpbCIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3htbF91dGlsIiksZj1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGc9ZnVuY3Rpb24oKXt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoidGV4dCIscmVnZXg6IjxcXCFcXFtDREFUQVxcWyIsbmV4dDoiY2RhdGEifSx7dG9rZW46InhtbF9wZSIscmVnZXg6IjxcXD8uKj9cXD8+In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiPFxcIS0tIixuZXh0OiJjb21tZW50In0se3Rva2VuOiJtZXRhLnRhZyIscmVnZXg6IjxcXC8/IixuZXh0OiJ0YWcifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiW148XSsifV0sY2RhdGE6W3t0b2tlbjoidGV4dCIscmVnZXg6IlxcXVxcXT4iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9LHt0b2tlbjoidGV4dCIscmVnZXg6Iig/OlteXFxdXXxcXF0oPyFcXF0+KSkrIn1dLGNvbW1lbnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qPy0tPiIsbmV4dDoic3RhcnQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX0sZS50YWcodGhpcy4kcnVsZXMsInRhZyIsInN0YXJ0Iil9O2QuaW5oZXJpdHMoZyxmKSxiLlhtbEhpZ2hsaWdodFJ1bGVzPWd9KSxkZWZpbmUoImFjZS9tb2RlL3htbF91dGlsIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9sYW5nIl0sZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGcoYSl7cmV0dXJuW3t0b2tlbjoic3RyaW5nIixyZWdleDonIi4qPyInfSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6J1siXS4qJyxuZXh0OmErIi1xcXN0cmluZyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiJy4qPycifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6IlsnXS4qIixuZXh0OmErIi1xc3RyaW5nIn1dfWZ1bmN0aW9uIGgoYSxiKXtyZXR1cm5be3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKj8iK2EsbmV4dDpifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dfSJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvbGFuZyIpLGU9ZC5hcnJheVRvTWFwKCJidXR0b258Zm9ybXxpbnB1dHxsYWJlbHxzZWxlY3R8dGV4dGFyZWEiLnNwbGl0KCJ8IikpLGY9ZC5hcnJheVRvTWFwKCJ0YWJsZXx0Ym9keXx0ZHx0Zm9vdHx0aHx0ciIuc3BsaXQoInwiKSk7Yi50YWc9ZnVuY3Rpb24oYSxiLGMpe2FbYl09W3t0b2tlbjoidGV4dCIscmVnZXg6IlxccysifSx7dG9rZW46ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT0iYSI/Im1ldGEudGFnLmFuY2hvciI6YT09PSJpbWciPyJtZXRhLnRhZy5pbWFnZSI6YT09PSJzY3JpcHQiPyJtZXRhLnRhZy5zY3JpcHQiOmE9PT0ic3R5bGUiPyJtZXRhLnRhZy5zdHlsZSI6ZS5oYXNPd25Qcm9wZXJ0eShhLnRvTG93ZXJDYXNlKCkpPyJtZXRhLnRhZy5mb3JtIjpmLmhhc093blByb3BlcnR5KGEudG9Mb3dlckNhc2UoKSk/Im1ldGEudGFnLnRhYmxlIjoibWV0YS50YWcifSxtZXJnZTohMCxyZWdleDoiWy1fYS16QS1aMC05OiFdKyIsbmV4dDpiKyJlbWJlZC1hdHRyaWJ1dGUtbGlzdCJ9LHt0b2tlbjoiZW1wdHkiLHJlZ2V4OiIiLG5leHQ6YisiZW1iZWQtYXR0cmlidXRlLWxpc3QifV0sYVtiKyItcXN0cmluZyJdPWgoIiciLGIrImVtYmVkLWF0dHJpYnV0ZS1saXN0IiksYVtiKyItcXFzdHJpbmciXT1oKCciJyxiKyJlbWJlZC1hdHRyaWJ1dGUtbGlzdCIpLGFbYisiZW1iZWQtYXR0cmlidXRlLWxpc3QiXT1be3Rva2VuOiJtZXRhLnRhZyIsbWVyZ2U6ITAscmVnZXg6Ii8/PiIsbmV4dDpjfSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiI9In0se3Rva2VuOiJlbnRpdHkub3RoZXIuYXR0cmlidXRlLW5hbWUiLHJlZ2V4OiJbLV9hLXpBLVowLTk6XSsifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4OiJbKy1dP1xcZCsoPzooPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pP1xcYiJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifV0uY29uY2F0KGcoYikpfX0pLGRlZmluZSgiYWNlL21vZGUvYmVoYXZpb3VyL3htbCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvYmVoYXZpb3VyIiwiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vYmVoYXZpb3VyIikuQmVoYXZpb3VyLGY9YSgiLi9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXIsZz1mdW5jdGlvbigpe3RoaXMuaW5oZXJpdChmLFsic3RyaW5nX2RxdW90ZXMiXSksdGhpcy5hZGQoImJyYWNrZXRzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSI8Iil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/ITE6e3RleHQ6Ijw+IixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSI+Iil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0iPiIpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX1lbHNlIGlmKGU9PSJcbiIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGs9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMik7aWYoaz09IjwvIil7dmFyIGw9dGhpcy4kZ2V0SW5kZW50KGQuZG9jLmdldExpbmUoaC5yb3cpKStkLmdldFRhYlN0cmluZygpLG09dGhpcy4kZ2V0SW5kZW50KGQuZG9jLmdldExpbmUoaC5yb3cpKTtyZXR1cm57dGV4dDoiXG4iK2wrIlxuIittLHNlbGVjdGlvbjpbMSxsLmxlbmd0aCwxLGwubGVuZ3RoXX19fX0pfTtkLmluaGVyaXRzKGcsZSksYi5YbWxCZWhhdmlvdXI9Z30pLGRlZmluZSgiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvYmVoYXZpb3VyIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXIsZj1mdW5jdGlvbigpe3RoaXMuYWRkKCJicmFjZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09InsiKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7cmV0dXJuIGchPT0iIj97dGV4dDoieyIrZysifSIsc2VsZWN0aW9uOiExfTp7dGV4dDoie30iLHNlbGVjdGlvbjpbMSwxXX19aWYoZT09In0iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSJ9Iil7dmFyIGs9ZC4kZmluZE9wZW5pbmdCcmFja2V0KCJ9Iix7Y29sdW1uOmguY29sdW1uKzEscm93Omgucm93fSk7aWYoayE9PW51bGwpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19ZWxzZSBpZihlPT0iXG4iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxqPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzEpO2lmKGo9PSJ9Iil7dmFyIGw9ZC5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6aC5yb3csY29sdW1uOmguY29sdW1uKzF9KTtpZighbClyZXR1cm4gbnVsbDt2YXIgbT10aGlzLmdldE5leHRMaW5lSW5kZW50KGEsaS5zdWJzdHJpbmcoMCxpLmxlbmd0aC0xKSxkLmdldFRhYlN0cmluZygpKSxuPXRoaXMuJGdldEluZGVudChkLmRvYy5nZXRMaW5lKGwucm93KSk7cmV0dXJue3RleHQ6IlxuIittKyJcbiIrbixzZWxlY3Rpb246WzEsbS5sZW5ndGgsMSxtLmxlbmd0aF19fX19KSx0aGlzLmFkZCgiYnJhY2VzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSJ7Iil7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLmVuZC5jb2x1bW4sZS5lbmQuY29sdW1uKzEpO2lmKGg9PSJ9IilyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KSx0aGlzLmFkZCgicGFyZW5zIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSIoIil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/e3RleHQ6IigiK2crIikiLHNlbGVjdGlvbjohMX06e3RleHQ6IigpIixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSIpIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0iKSIpe3ZhciBrPWQuJGZpbmRPcGVuaW5nQnJhY2tldCgiKSIse2NvbHVtbjpoLmNvbHVtbisxLHJvdzpoLnJvd30pO2lmKGshPT1udWxsKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJwYXJlbnMiLCJkZWxldGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1kLmRvYy5nZXRUZXh0UmFuZ2UoZSk7aWYoIWUuaXNNdWx0aUxpbmUoKSYmZj09IigiKXt2YXIgZz1kLmRvYy5nZXRMaW5lKGUuc3RhcnQucm93KSxoPWcuc3Vic3RyaW5nKGUuc3RhcnQuY29sdW1uKzEsZS5zdGFydC5jb2x1bW4rMik7aWYoaD09IikiKXJldHVybiBlLmVuZC5jb2x1bW4rKyxlfX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0nIicpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtpZihnIT09IiIpcmV0dXJue3RleHQ6JyInK2crJyInLHNlbGVjdGlvbjohMX07dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbi0xLGguY29sdW1uKTtpZihqPT0iXFwiKXJldHVybiBudWxsO3ZhciBrPWQuZ2V0VG9rZW5zKGYuc3RhcnQucm93LGYuc3RhcnQucm93KVswXS50b2tlbnMsbD0wLG0sbj0tMTtmb3IodmFyIG89MDtvPGsubGVuZ3RoO28rKyl7bT1rW29dLG0udHlwZT09InN0cmluZyI/bj0tMTpuPDAmJihuPW0udmFsdWUuaW5kZXhPZignIicpKTtpZihtLnZhbHVlLmxlbmd0aCtsPmYuc3RhcnQuY29sdW1uKWJyZWFrO2wrPWtbb10udmFsdWUubGVuZ3RofWlmKCFtfHxuPDAmJm0udHlwZSE9PSJjb21tZW50IiYmKG0udHlwZSE9PSJzdHJpbmcifHxmLnN0YXJ0LmNvbHVtbiE9PW0udmFsdWUubGVuZ3RoK2wtMSYmbS52YWx1ZS5sYXN0SW5kZXhPZignIicpPT09bS52YWx1ZS5sZW5ndGgtMSkpcmV0dXJue3RleHQ6JyIiJyxzZWxlY3Rpb246WzEsMV19O2lmKG0mJm0udHlwZT09PSJzdHJpbmciKXt2YXIgcD1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihwPT0nIicpcmV0dXJue3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19fSksdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSciJyl7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbisxLGUuc3RhcnQuY29sdW1uKzIpO2lmKGg9PSciJylyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KX07ZC5pbmhlcml0cyhmLGUpLGIuQ3N0eWxlQmVoYXZpb3VyPWZ9KSxkZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcveG1sIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvcmFuZ2UiLCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIsImFjZS90b2tlbl9pdGVyYXRvciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vLi4vbGliL2xhbmciKSxmPWEoIi4uLy4uL3JhbmdlIikuUmFuZ2UsZz1hKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlLGg9YSgiLi4vLi4vdG9rZW5faXRlcmF0b3IiKS5Ub2tlbkl0ZXJhdG9yLGk9Yi5Gb2xkTW9kZT1mdW5jdGlvbihhKXtnLmNhbGwodGhpcyksdGhpcy52b2lkRWxlbWVudHM9YXx8e319O2QuaW5oZXJpdHMoaSxnKSxmdW5jdGlvbigpe3RoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmUoYSxjKTtyZXR1cm4gZC5jbG9zaW5nP2I9PSJtYXJrYmVnaW5lbmQiPyJlbmQiOiIiOiFkLnRhZ05hbWV8fHRoaXMudm9pZEVsZW1lbnRzW2QudGFnTmFtZS50b0xvd2VyQ2FzZSgpXT8iIjpkLnNlbGZDbG9zaW5nPyIiOmQudmFsdWUuaW5kZXhPZigiLyIrZC50YWdOYW1lKSE9PS0xPyIiOiJzdGFydCJ9LHRoaXMuX2dldEZpcnN0VGFnSW5MaW5lPWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5nZXRUb2tlbnMoYixiKVswXS50b2tlbnMsZD0iIjtmb3IodmFyIGY9MDtmPGMubGVuZ3RoO2YrKyl7dmFyIGc9Y1tmXTtnLnR5cGUuaW5kZXhPZigibWV0YS50YWciKT09PTA/ZCs9Zy52YWx1ZTpkKz1lLnN0cmluZ1JlcGVhdCgiICIsZy52YWx1ZS5sZW5ndGgpfXJldHVybiB0aGlzLl9wYXJzZVRhZyhkKX0sdGhpcy50YWdSZT0vXihccyopKDw/KFwvPykoWy1fYS16QS1aMC05OiFdKilccyooXC8/KT4/KS8sdGhpcy5fcGFyc2VUYWc9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy50YWdSZS5leGVjKGEpLGM9dGhpcy50YWdSZS5sYXN0SW5kZXh8fDA7cmV0dXJuIHRoaXMudGFnUmUubGFzdEluZGV4PTAse3ZhbHVlOmEsbWF0Y2g6Yj9iWzJdOiIiLGNsb3Npbmc6Yj8hIWJbM106ITEsc2VsZkNsb3Npbmc6Yj8hIWJbNV18fGJbMl09PSIvPiI6ITEsdGFnTmFtZTpiP2JbNF06IiIsY29sdW1uOmJbMV0/YytiWzFdLmxlbmd0aDpjfX0sdGhpcy5fcmVhZFRhZ0ZvcndhcmQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRDdXJyZW50VG9rZW4oKTtpZighYilyZXR1cm4gbnVsbDt2YXIgYz0iIixkO2RvIGlmKGIudHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpPT09MCl7aWYoIWQpdmFyIGQ9e3JvdzphLmdldEN1cnJlbnRUb2tlblJvdygpLGNvbHVtbjphLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpfTtjKz1iLnZhbHVlO2lmKGMuaW5kZXhPZigiPiIpIT09LTEpe3ZhciBlPXRoaXMuX3BhcnNlVGFnKGMpO3JldHVybiBlLnN0YXJ0PWQsZS5lbmQ9e3JvdzphLmdldEN1cnJlbnRUb2tlblJvdygpLGNvbHVtbjphLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpK2IudmFsdWUubGVuZ3RofSxhLnN0ZXBGb3J3YXJkKCksZX19d2hpbGUoYj1hLnN0ZXBGb3J3YXJkKCkpO3JldHVybiBudWxsfSx0aGlzLl9yZWFkVGFnQmFja3dhcmQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRDdXJyZW50VG9rZW4oKTtpZighYilyZXR1cm4gbnVsbDt2YXIgYz0iIixkO2RvIGlmKGIudHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpPT09MCl7ZHx8KGQ9e3JvdzphLmdldEN1cnJlbnRUb2tlblJvdygpLGNvbHVtbjphLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpK2IudmFsdWUubGVuZ3RofSksYz1iLnZhbHVlK2M7aWYoYy5pbmRleE9mKCI8IikhPT0tMSl7dmFyIGU9dGhpcy5fcGFyc2VUYWcoYyk7cmV0dXJuIGUuZW5kPWQsZS5zdGFydD17cm93OmEuZ2V0Q3VycmVudFRva2VuUm93KCksY29sdW1uOmEuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCl9LGEuc3RlcEJhY2t3YXJkKCksZX19d2hpbGUoYj1hLnN0ZXBCYWNrd2FyZCgpKTtyZXR1cm4gbnVsbH0sdGhpcy5fcG9wPWZ1bmN0aW9uKGEsYil7d2hpbGUoYS5sZW5ndGgpe3ZhciBjPWFbYS5sZW5ndGgtMV07aWYoIWJ8fGMudGFnTmFtZT09Yi50YWdOYW1lKXJldHVybiBhLnBvcCgpO2lmKHRoaXMudm9pZEVsZW1lbnRzW2IudGFnTmFtZV0pcmV0dXJuO2lmKHRoaXMudm9pZEVsZW1lbnRzW2MudGFnTmFtZV0pe2EucG9wKCk7Y29udGludWV9cmV0dXJuIG51bGx9fSx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5fZ2V0Rmlyc3RUYWdJbkxpbmUoYSxjKTtpZighZC5tYXRjaClyZXR1cm4gbnVsbDt2YXIgZT1kLmNsb3Npbmd8fGQuc2VsZkNsb3NpbmcsZz1bXSxpO2lmKCFlKXt2YXIgaj1uZXcgaChhLGMsZC5jb2x1bW4pLGs9e3JvdzpjLGNvbHVtbjpkLmNvbHVtbitkLnRhZ05hbWUubGVuZ3RoKzJ9O3doaWxlKGk9dGhpcy5fcmVhZFRhZ0ZvcndhcmQoaikpe2lmKGkuc2VsZkNsb3Npbmcpe2lmKCFnLmxlbmd0aClyZXR1cm4gaS5zdGFydC5jb2x1bW4rPWkudGFnTmFtZS5sZW5ndGgrMixpLmVuZC5jb2x1bW4tPTIsZi5mcm9tUG9pbnRzKGkuc3RhcnQsaS5lbmQpO2NvbnRpbnVlfWlmKGkuY2xvc2luZyl7dGhpcy5fcG9wKGcsaSk7aWYoZy5sZW5ndGg9PTApcmV0dXJuIGYuZnJvbVBvaW50cyhrLGkuc3RhcnQpfWVsc2UgZy5wdXNoKGkpfX1lbHNle3ZhciBqPW5ldyBoKGEsYyxkLmNvbHVtbitkLm1hdGNoLmxlbmd0aCksbD17cm93OmMsY29sdW1uOmQuY29sdW1ufTt3aGlsZShpPXRoaXMuX3JlYWRUYWdCYWNrd2FyZChqKSl7aWYoaS5zZWxmQ2xvc2luZyl7aWYoIWcubGVuZ3RoKXJldHVybiBpLnN0YXJ0LmNvbHVtbis9aS50YWdOYW1lLmxlbmd0aCsyLGkuZW5kLmNvbHVtbi09MixmLmZyb21Qb2ludHMoaS5zdGFydCxpLmVuZCk7Y29udGludWV9aWYoIWkuY2xvc2luZyl7dGhpcy5fcG9wKGcsaSk7aWYoZy5sZW5ndGg9PTApcmV0dXJuIGkuc3RhcnQuY29sdW1uKz1pLnRhZ05hbWUubGVuZ3RoKzIsZi5mcm9tUG9pbnRzKGkuc3RhcnQsbCl9ZWxzZSBnLnB1c2goaSl9fX19LmNhbGwoaS5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxlPWIuRm9sZE1vZGU9ZnVuY3Rpb24oKXt9OygoZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj1udWxsLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9bnVsbCx0aGlzLmdldEZvbGRXaWRnZXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0TGluZShjKTtyZXR1cm4gdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChkKT8ic3RhcnQiOmI9PSJtYXJrYmVnaW5lbmQiJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3QoZCk/ImVuZCI6IiJ9LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbnVsbH0sdGhpcy5pbmRlbnRhdGlvbkJsb2NrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZT0vXlxzKi8sZj1iLGc9YixoPWEuZ2V0TGluZShiKSxpPWN8fGgubGVuZ3RoLGo9aC5tYXRjaChlKVswXS5sZW5ndGgsaz1hLmdldExlbmd0aCgpO3doaWxlKCsrYjxrKXtoPWEuZ2V0TGluZShiKTt2YXIgbD1oLm1hdGNoKGUpWzBdLmxlbmd0aDtpZihsPT1oLmxlbmd0aCljb250aW51ZTtpZihsPD1qKWJyZWFrO2c9Yn1pZihnPmYpe3ZhciBtPWEuZ2V0TGluZShnKS5sZW5ndGg7cmV0dXJuIG5ldyBkKGYsaSxnLG0pfX0sdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrPWZ1bmN0aW9uKGEsYixjLGUpe3ZhciBmPXtyb3c6Yyxjb2x1bW46ZSsxfSxnPWEuJGZpbmRDbG9zaW5nQnJhY2tldChiLGYpO2lmKCFnKXJldHVybjt2YXIgaD1hLmZvbGRXaWRnZXRzW2cucm93XTtyZXR1cm4gaD09bnVsbCYmKGg9dGhpcy5nZXRGb2xkV2lkZ2V0KGEsZy5yb3cpKSxoPT0ic3RhcnQiJiYoZy5yb3ctLSxnLmNvbHVtbj1hLmdldExpbmUoZy5yb3cpLmxlbmd0aCksZC5mcm9tUG9pbnRzKGYsZyl9fSkpLmNhbGwoZS5wcm90b3R5cGUpfSksZGVmaW5lKCJhY2UvbW9kZS9qYXZhc2NyaXB0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsImFjZS9yYW5nZSIsImFjZS93b3JrZXIvd29ya2VyX2NsaWVudCIsImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiKS5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMsaD1hKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudCxpPWEoIi4uL3JhbmdlIikuUmFuZ2Usaj1hKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudCxrPWEoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cixsPWEoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZSxtPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSksdGhpcy4kb3V0ZGVudD1uZXcgaCx0aGlzLiRiZWhhdmlvdXI9bmV3IGssdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGx9O2QuaW5oZXJpdHMobSxlKSxmdW5jdGlvbigpe3RoaXMudG9nZ2xlQ29tbWVudExpbmVzPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSEwLGY9L14oXHMqKVwvXC8vO2Zvcih2YXIgZz1jO2c8PWQ7ZysrKWlmKCFmLnRlc3QoYi5nZXRMaW5lKGcpKSl7ZT0hMTticmVha31pZihlKXt2YXIgaD1uZXcgaSgwLDAsMCwwKTtmb3IodmFyIGc9YztnPD1kO2crKyl7dmFyIGo9Yi5nZXRMaW5lKGcpLGs9ai5tYXRjaChmKTtoLnN0YXJ0LnJvdz1nLGguZW5kLnJvdz1nLGguZW5kLmNvbHVtbj1rWzBdLmxlbmd0aCxiLnJlcGxhY2UoaCxrWzFdKX19ZWxzZSBiLmluZGVudFJvd3MoYyxkLCIvLyIpfSx0aGlzLmdldE5leHRMaW5lSW5kZW50PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLiRnZXRJbmRlbnQoYiksZT10aGlzLiR0b2tlbml6ZXIuZ2V0TGluZVRva2VucyhiLGEpLGY9ZS50b2tlbnMsZz1lLnN0YXRlO2lmKGYubGVuZ3RoJiZmW2YubGVuZ3RoLTFdLnR5cGU9PSJjb21tZW50IilyZXR1cm4gZDtpZihhPT0ic3RhcnQifHxhPT0icmVnZXhfYWxsb3dlZCIpe3ZhciBoPWIubWF0Y2goL14uKig/OlxiY2FzZVxiLipcOnxbXHtcKFxbXSlccyokLyk7aCYmKGQrPWMpfWVsc2UgaWYoYT09ImRvYy1zdGFydCIpe2lmKGc9PSJzdGFydCJ8fGE9PSJyZWdleF9hbGxvd2VkIilyZXR1cm4iIjt2YXIgaD1iLm1hdGNoKC9eXHMqKFwvPylcKi8pO2gmJihoWzFdJiYoZCs9IiAiKSxkKz0iKiAiKX1yZXR1cm4gZH0sdGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChiLGMpfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGEsYixjKXt0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGIsYyl9LHRoaXMuY3JlYXRlV29ya2VyPWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBqKFsiYWNlIl0sIndvcmtlci1qYXZhc2NyaXB0LmpzIiwiYWNlL21vZGUvamF2YXNjcmlwdF93b3JrZXIiLCJKYXZhU2NyaXB0V29ya2VyIik7cmV0dXJuIGIuYXR0YWNoVG9Eb2N1bWVudChhLmdldERvY3VtZW50KCkpLGIub24oImpzbGludCIsZnVuY3Rpb24oYil7dmFyIGM9W107Zm9yKHZhciBkPTA7ZDxiLmRhdGEubGVuZ3RoO2QrKyl7dmFyIGU9Yi5kYXRhW2RdO2UmJmMucHVzaCh7cm93OmUubGluZS0xLGNvbHVtbjplLmNoYXJhY3Rlci0xLHRleHQ6ZS5yZWFzb24sdHlwZToid2FybmluZyIsbGludDplfSl9YS5zZXRBbm5vdGF0aW9ucyhjKX0pLGIub24oIm5hcmNpc3N1cyIsZnVuY3Rpb24oYil7YS5zZXRBbm5vdGF0aW9ucyhbYi5kYXRhXSl9KSxiLm9uKCJ0ZXJtaW5hdGUiLGZ1bmN0aW9uKCl7YS5jbGVhckFubm90YXRpb25zKCl9KSxifX0uY2FsbChtLnByb3RvdHlwZSksYi5Nb2RlPW19KSxkZWZpbmUoImFjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvdW5pY29kZSIsImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvbGFuZyIpLGY9YSgiLi4vdW5pY29kZSIpLGc9YSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMsaD1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGk9ZnVuY3Rpb24oKXt2YXIgYT1lLmFycmF5VG9NYXAoIkFycmF5fEJvb2xlYW58RGF0ZXxGdW5jdGlvbnxJdGVyYXRvcnxOdW1iZXJ8T2JqZWN0fFJlZ0V4cHxTdHJpbmd8UHJveHl8TmFtZXNwYWNlfFFOYW1lfFhNTHxYTUxMaXN0fEFycmF5QnVmZmVyfEZsb2F0MzJBcnJheXxGbG9hdDY0QXJyYXl8SW50MTZBcnJheXxJbnQzMkFycmF5fEludDhBcnJheXxVaW50MTZBcnJheXxVaW50MzJBcnJheXxVaW50OEFycmF5fFVpbnQ4Q2xhbXBlZEFycmF5fEVycm9yfEV2YWxFcnJvcnxJbnRlcm5hbEVycm9yfFJhbmdlRXJyb3J8UmVmZXJlbmNlRXJyb3J8U3RvcEl0ZXJhdGlvbnxTeW50YXhFcnJvcnxUeXBlRXJyb3J8VVJJRXJyb3J8ZGVjb2RlVVJJfGRlY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZW5jb2RlVVJJQ29tcG9uZW50fGV2YWx8aXNGaW5pdGV8aXNOYU58cGFyc2VGbG9hdHxwYXJzZUludHxKU09OfE1hdGh8dGhpc3xhcmd1bWVudHN8cHJvdG90eXBlfHdpbmRvd3xkb2N1bWVudCIuc3BsaXQoInwiKSksYj1lLmFycmF5VG9NYXAoImJyZWFrfGNhc2V8Y2F0Y2h8Y29udGludWV8ZGVmYXVsdHxkZWxldGV8ZG98ZWxzZXxmaW5hbGx5fGZvcnxmdW5jdGlvbnxpZnxpbnxpbnN0YW5jZW9mfG5ld3xyZXR1cm58c3dpdGNofHRocm93fHRyeXx0eXBlb2Z8bGV0fHZhcnx3aGlsZXx3aXRofGNvbnN0fHlpZWxkfGltcG9ydHxnZXR8c2V0Ii5zcGxpdCgifCIpKSxjPSJjYXNlfGRvfGVsc2V8ZmluYWxseXxpbnxpbnN0YW5jZW9mfHJldHVybnx0aHJvd3x0cnl8dHlwZW9mfHlpZWxkIixkPWUuYXJyYXlUb01hcCgiX19wYXJlbnRfX3xfX2NvdW50X198ZXNjYXBlfHVuZXNjYXBlfHdpdGh8X19wcm90b19fIi5zcGxpdCgifCIpKSxoPWUuYXJyYXlUb01hcCgiY29uc3R8bGV0fHZhcnxmdW5jdGlvbiIuc3BsaXQoInwiKSksaT1lLmFycmF5VG9NYXAoIm51bGx8SW5maW5pdHl8TmFOfHVuZGVmaW5lZCIuc3BsaXQoInwiKSksaj1lLmFycmF5VG9NYXAoImNsYXNzfGVudW18ZXh0ZW5kc3xzdXBlcnxleHBvcnR8aW1wbGVtZW50c3xwcml2YXRlfHB1YmxpY3xpbnRlcmZhY2V8cGFja2FnZXxwcm90ZWN0ZWR8c3RhdGljIi5zcGxpdCgifCIpKSxrPSJbIitmLnBhY2thZ2VzLkwrIlxcJF9dWyIrZi5wYWNrYWdlcy5MK2YucGFja2FnZXMuTW4rZi5wYWNrYWdlcy5NYytmLnBhY2thZ2VzLk5kK2YucGFja2FnZXMuUGMrIlxcJF9dKlxcYiI7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJcXC9cXC8uKiQifSwobmV3IGcpLmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0Iikse3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiXFwvXFwqIixuZXh0OiJjb21tZW50In0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OidbIl0oPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/WyJdJ30se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OidbIl0uKlxcXFwkJyxuZXh0OiJxcXN0cmluZyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiWyddKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqP1snXSJ9LHt0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiWyddLipcXFxcJCIsbmV4dDoicXN0cmluZyJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6IjBbeFhdWzAtOWEtZkEtRl0rXFxiIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIifSx7dG9rZW46WyJrZXl3b3JkLmRlZmluaXRpb24iLCJ0ZXh0IiwiZW50aXR5Lm5hbWUuZnVuY3Rpb24iXSxyZWdleDoiKGZ1bmN0aW9uKShcXHMrKSgiK2srIikifSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iLHJlZ2V4OiIoPzp0cnVlfGZhbHNlKVxcYiJ9LHt0b2tlbjoia2V5d29yZCIscmVnZXg6Iig/OiIrYysiKVxcYiIsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjpmdW5jdGlvbihjKXtyZXR1cm4gYS5oYXNPd25Qcm9wZXJ0eShjKT8idmFyaWFibGUubGFuZ3VhZ2UiOmQuaGFzT3duUHJvcGVydHkoYyk/ImludmFsaWQuZGVwcmVjYXRlZCI6aC5oYXNPd25Qcm9wZXJ0eShjKT8ia2V5d29yZC5kZWZpbml0aW9uIjpiLmhhc093blByb3BlcnR5KGMpPyJrZXl3b3JkIjppLmhhc093blByb3BlcnR5KGMpPyJjb25zdGFudC5sYW5ndWFnZSI6ai5oYXNPd25Qcm9wZXJ0eShjKT8iaW52YWxpZC5pbGxlZ2FsIjpjPT0iZGVidWdnZXIiPyJpbnZhbGlkLmRlcHJlY2F0ZWQiOiJpZGVudGlmaWVyIn0scmVnZXg6a30se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiIXxcXCR8JXwmfFxcKnxcXC1cXC18XFwtfFxcK1xcK3xcXCt8fnw9PT18PT18PXwhPXwhPT18PD18Pj18PDw9fD4+PXw+Pj49fDw+fDx8PnwhfCYmfFxcfFxcfHxcXD9cXDp8XFwqPXwlPXxcXCs9fFxcLT18Jj18XFxePXxcXGIoPzppbnxpbnN0YW5jZW9mfG5ld3xkZWxldGV8dHlwZW9mfHZvaWQpIixuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOiJwdW5jdHVhdGlvbi5vcGVyYXRvciIscmVnZXg6IlxcP3xcXDp8XFwsfFxcO3xcXC4iLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46InBhcmVuLmxwYXJlbiIscmVnZXg6IltbKHtdIixuZXh0OiJyZWdleF9hbGxvd2VkIn0se3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4OiJbXFxdKX1dIn0se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiXFwvPT8iLG5leHQ6InJlZ2V4X2FsbG93ZWQifSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJeIyEuKiQifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn1dLHJlZ2V4X2FsbG93ZWQ6W3t0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IlxcL1xcKiIsbmV4dDoiY29tbWVudF9yZWdleF9hbGxvd2VkIn0se3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwvXFwvLiokIn0se3Rva2VuOiJzdHJpbmcucmVnZXhwIixyZWdleDoiXFwvIixuZXh0OiJyZWdleCIsbWVyZ2U6ITB9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OiJzdGFydCJ9XSxyZWdleDpbe3Rva2VuOiJyZWdleHAua2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIixuZXh0OiJyZWdleCJ9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6Ii9cXHcqIixuZXh0OiJzdGFydCIsbWVyZ2U6ITB9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6IlteXFxcXC9cXFtdKyIsbmV4dDoicmVnZXgiLG1lcmdlOiEwfSx7dG9rZW46InN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIixyZWdleDoiXFxbIixuZXh0OiJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiLG1lcmdlOiEwfSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OiJzdGFydCJ9XSxyZWdleF9jaGFyYWN0ZXJfY2xhc3M6W3t0b2tlbjoicmVnZXhwLmtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSIsbmV4dDoicmVnZXhfY2hhcmFjdGVyX2NsYXNzIn0se3Rva2VuOiJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyIscmVnZXg6Il0iLG5leHQ6InJlZ2V4IixtZXJnZTohMH0se3Rva2VuOiJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyIscmVnZXg6IlteXFxcXFxcXV0rIixuZXh0OiJyZWdleF9jaGFyYWN0ZXJfY2xhc3MiLG1lcmdlOiEwfSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OiJzdGFydCJ9XSxjb21tZW50X3JlZ2V4X2FsbG93ZWQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qP1xcKlxcLyIsbWVyZ2U6ITAsbmV4dDoicmVnZXhfYWxsb3dlZCJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLGNvbW1lbnQ6W3t0b2tlbjoiY29tbWVudCIscmVnZXg6Ii4qP1xcKlxcLyIsbWVyZ2U6ITAsbmV4dDoic3RhcnQifSx7dG9rZW46ImNvbW1lbnQiLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XSxxcXN0cmluZzpbe3Rva2VuOiJzdHJpbmciLHJlZ2V4OicoPzooPzpcXFxcLil8KD86W14iXFxcXF0pKSo/IicsbmV4dDoic3RhcnQifSx7dG9rZW46InN0cmluZyIsbWVyZ2U6ITAscmVnZXg6Ii4rIn1dLHFzdHJpbmc6W3t0b2tlbjoic3RyaW5nIixyZWdleDoiKD86KD86XFxcXC4pfCg/OlteJ1xcXFxdKSkqPyciLG5leHQ6InN0YXJ0In0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX0sdGhpcy5lbWJlZFJ1bGVzKGcsImRvYy0iLFsobmV3IGcpLmdldEVuZFJ1bGUoInN0YXJ0IildKX07ZC5pbmhlcml0cyhpLGgpLGIuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzPWl9KSxkZWZpbmUoImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsZj1mdW5jdGlvbigpe3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50LmRvYy50YWciLHJlZ2V4OiJAW1xcd1xcZF9dKyJ9LHt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlRPRE8ifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiW15AXFwqXSsifSx7dG9rZW46ImNvbW1lbnQuZG9jIixtZXJnZTohMCxyZWdleDoiLiJ9XX19O2QuaW5oZXJpdHMoZixlKSxmdW5jdGlvbigpe3RoaXMuZ2V0U3RhcnRSdWxlPWZ1bmN0aW9uKGEpe3JldHVybnt0b2tlbjoiY29tbWVudC5kb2MiLG1lcmdlOiEwLHJlZ2V4OiJcXC9cXCooPz1cXCopIixuZXh0OmF9fSx0aGlzLmdldEVuZFJ1bGU9ZnVuY3Rpb24oYSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIsbWVyZ2U6ITAscmVnZXg6IlxcKlxcLyIsbmV4dDphfX19LmNhbGwoZi5wcm90b3R5cGUpLGIuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzPWZ9KSxkZWZpbmUoImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3JhbmdlIikuUmFuZ2UsZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuL15ccyskLy50ZXN0KGEpPy9eXHMqXH0vLnRlc3QoYik6ITF9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldExpbmUoYiksZT1jLm1hdGNoKC9eKFxzKlx9KS8pO2lmKCFlKXJldHVybiAwO3ZhciBmPWVbMV0ubGVuZ3RoLGc9YS5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6Yixjb2x1bW46Zn0pO2lmKCFnfHxnLnJvdz09YilyZXR1cm4gMDt2YXIgaD10aGlzLiRnZXRJbmRlbnQoYS5nZXRMaW5lKGcucm93KSk7YS5yZXBsYWNlKG5ldyBkKGIsMCxiLGYtMSksaCl9LHRoaXMuJGdldEluZGVudD1mdW5jdGlvbihhKXt2YXIgYj1hLm1hdGNoKC9eKFxzKykvKTtyZXR1cm4gYj9iWzFdOiIifX0pKS5jYWxsKGUucHJvdG90eXBlKSxiLk1hdGNoaW5nQnJhY2VPdXRkZW50PWV9KSxkZWZpbmUoImFjZS93b3JrZXIvd29ya2VyX2NsaWVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixmPWZ1bmN0aW9uKGIsZCxlLGYpe3RoaXMuY2hhbmdlTGlzdGVuZXI9dGhpcy5jaGFuZ2VMaXN0ZW5lci5iaW5kKHRoaXMpO2lmKGMucGFja2FnZWQpe3ZhciBnPXRoaXMuJGd1ZXNzQmFzZVBhdGgoKTt0aGlzLiR3b3JrZXI9bmV3IFdvcmtlcihnK2QpfWVsc2V7dmFyIGg9dGhpcy4kbm9ybWFsaXplUGF0aChhLm5hbWVUb1VybCgiYWNlL3dvcmtlci93b3JrZXIiLG51bGwsIl8iKSk7dGhpcy4kd29ya2VyPW5ldyBXb3JrZXIoaCk7dmFyIGk9e307Zm9yKHZhciBqPTA7ajxiLmxlbmd0aDtqKyspe3ZhciBrPWJbal0sbD10aGlzLiRub3JtYWxpemVQYXRoKGEubmFtZVRvVXJsKGssbnVsbCwiXyIpLnJlcGxhY2UoLy5qcyQvLCIiKSk7aVtrXT1sfX10aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2luaXQ6ITAsdGxuczppLG1vZHVsZTplLGNsYXNzbmFtZTpmfSksdGhpcy5jYWxsYmFja0lkPTEsdGhpcy5jYWxsYmFja3M9e307dmFyIG09dGhpczt0aGlzLiR3b3JrZXIub25lcnJvcj1mdW5jdGlvbihhKXt0aHJvdyB3aW5kb3cuY29uc29sZSYmY29uc29sZS5sb2cmJmNvbnNvbGUubG9nKGEpLGF9LHRoaXMuJHdvcmtlci5vbm1lc3NhZ2U9ZnVuY3Rpb24oYSl7dmFyIGI9YS5kYXRhO3N3aXRjaChiLnR5cGUpe2Nhc2UibG9nIjp3aW5kb3cuY29uc29sZSYmY29uc29sZS5sb2cmJmNvbnNvbGUubG9nKGIuZGF0YSk7YnJlYWs7Y2FzZSJldmVudCI6bS5fZW1pdChiLm5hbWUse2RhdGE6Yi5kYXRhfSk7YnJlYWs7Y2FzZSJjYWxsIjp2YXIgYz1tLmNhbGxiYWNrc1tiLmlkXTtjJiYoYyhiLmRhdGEpLGRlbGV0ZSBtLmNhbGxiYWNrc1tiLmlkXSl9fX07KChmdW5jdGlvbigpe2QuaW1wbGVtZW50KHRoaXMsZSksdGhpcy4kbm9ybWFsaXplUGF0aD1mdW5jdGlvbihhKXtyZXR1cm4gYT1hLnJlcGxhY2UoL15bYS16XSs6XC9cL1teXC9dK1wvLywiIiksYT1sb2NhdGlvbi5wcm90b2NvbCsiLy8iK2xvY2F0aW9uLmhvc3QrKGEuY2hhckF0KDApPT0iLyI/IiI6bG9jYXRpb24ucGF0aG5hbWUucmVwbGFjZSgvXC9bXlwvXSokLywiIikpKyIvIithLnJlcGxhY2UoL15bXC9dKy8sIiIpLGF9LHRoaXMuJGd1ZXNzQmFzZVBhdGg9ZnVuY3Rpb24oKXtpZihhLmFjZUJhc2VVcmwpcmV0dXJuIGEuYWNlQmFzZVVybDt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPWJbY10sZT1kLmdldEF0dHJpYnV0ZSgiZGF0YS1hY2UtYmFzZSIpO2lmKGUpcmV0dXJuIGUucmVwbGFjZSgvXC8qJC8sIi8iKTt2YXIgZj1kLnNyY3x8ZC5nZXRBdHRyaWJ1dGUoInNyYyIpO2lmKCFmKWNvbnRpbnVlO3ZhciBnPWYubWF0Y2goL14oPzooLipcLylhY2VcLmpzfCguKlwvKWFjZSgtdW5jb21wcmVzc2VkKT8oLW5vY29uZmxpY3QpP1wuanMpKD86XD98JCkvKTtpZihnKXJldHVybiBnWzFdfHxnWzJdfXJldHVybiIifSx0aGlzLnRlcm1pbmF0ZT1mdW5jdGlvbigpe3RoaXMuX2VtaXQoInRlcm1pbmF0ZSIse30pLHRoaXMuJHdvcmtlci50ZXJtaW5hdGUoKSx0aGlzLiR3b3JrZXI9bnVsbCx0aGlzLiRkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix0aGlzLmNoYW5nZUxpc3RlbmVyKSx0aGlzLiRkb2M9bnVsbH0sdGhpcy5zZW5kPWZ1bmN0aW9uKGEsYil7dGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtjb21tYW5kOmEsYXJnczpifSl9LHRoaXMuY2FsbD1mdW5jdGlvbihhLGIsYyl7aWYoYyl7dmFyIGQ9dGhpcy5jYWxsYmFja0lkKys7dGhpcy5jYWxsYmFja3NbZF09YyxiLnB1c2goZCl9dGhpcy5zZW5kKGEsYil9LHRoaXMuZW1pdD1mdW5jdGlvbihhLGIpe3RyeXt0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2V2ZW50OmEsZGF0YTp7ZGF0YTpiLmRhdGF9fSl9Y2F0Y2goYyl7fX0sdGhpcy5hdHRhY2hUb0RvY3VtZW50PWZ1bmN0aW9uKGEpe3RoaXMuJGRvYyYmdGhpcy50ZXJtaW5hdGUoKSx0aGlzLiRkb2M9YSx0aGlzLmNhbGwoInNldFZhbHVlIixbYS5nZXRWYWx1ZSgpXSksYS5vbigiY2hhbmdlIix0aGlzLmNoYW5nZUxpc3RlbmVyKX0sdGhpcy5jaGFuZ2VMaXN0ZW5lcj1mdW5jdGlvbihhKXthLnJhbmdlPXtzdGFydDphLmRhdGEucmFuZ2Uuc3RhcnQsZW5kOmEuZGF0YS5yYW5nZS5lbmR9LHRoaXMuZW1pdCgiY2hhbmdlIixhKX19KSkuY2FsbChmLnByb3RvdHlwZSksYi5Xb3JrZXJDbGllbnQ9Zn0pLGRlZmluZSgiYWNlL21vZGUvZm9sZGluZy9jc3R5bGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9yYW5nZSIsImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi8uLi9saWIvb29wIiksZT1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGY9YSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZSxnPWIuRm9sZE1vZGU9ZnVuY3Rpb24oKXt9O2QuaW5oZXJpdHMoZyxmKSxmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPS8oXHt8XFspW15cfVxdXSokfF5ccyooXC9cKikvLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9L15bXlxbXHtdKihcfXxcXSl8Xltcc1wqXSooXCpcLykvLHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmdldExpbmUoYyksZj1kLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTtpZihmKXt2YXIgZz1mLmluZGV4O2lmKGZbMV0pcmV0dXJuIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayhhLGZbMV0sYyxnKTt2YXIgaD1hLmdldENvbW1lbnRGb2xkUmFuZ2UoYyxnK2ZbMF0ubGVuZ3RoKTtyZXR1cm4gaC5lbmQuY29sdW1uLT0yLGh9aWYoYiE9PSJtYXJrYmVnaW5lbmQiKXJldHVybjt2YXIgZj1kLm1hdGNoKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIpO2lmKGYpe3ZhciBnPWYuaW5kZXgrZlswXS5sZW5ndGg7aWYoZlsyXSl7dmFyIGg9YS5nZXRDb21tZW50Rm9sZFJhbmdlKGMsZyk7cmV0dXJuIGguZW5kLmNvbHVtbi09MixofXZhciBpPXtyb3c6Yyxjb2x1bW46Z30saj1hLiRmaW5kT3BlbmluZ0JyYWNrZXQoZlsxXSxpKTtpZighailyZXR1cm47cmV0dXJuIGouY29sdW1uKyssaS5jb2x1bW4tLSxlLmZyb21Qb2ludHMoaixpKX19fS5jYWxsKGcucHJvdG90eXBlKX0pLGRlZmluZSgiYWNlL21vZGUvc3ZnX2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS94bWxfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUveG1sX3V0aWwiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL2xpYi9vb3AiKSxlPWEoIi4vamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiKS5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMsZj1hKCIuL3htbF9oaWdobGlnaHRfcnVsZXMiKS5YbWxIaWdobGlnaHRSdWxlcyxnPWEoIi4veG1sX3V0aWwiKSxoPWZ1bmN0aW9uKCl7Zi5jYWxsKHRoaXMpLHRoaXMuJHJ1bGVzLnN0YXJ0LnNwbGljZSgzLDAse3Rva2VuOiJtZXRhLnRhZyIscmVnZXg6IjwoPz1zKnNjcmlwdCkiLG5leHQ6InNjcmlwdCJ9KSxnLnRhZyh0aGlzLiRydWxlcywic2NyaXB0IiwianMtc3RhcnQiKSx0aGlzLmVtYmVkUnVsZXMoZSwianMtIixbe3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwvXFwvLiooPz08XFwvc2NyaXB0PikiLG5leHQ6InRhZyJ9LHt0b2tlbjoibWV0YS50YWciLHJlZ2V4OiI8XFwvKD89c2NyaXB0KSIsbmV4dDoidGFnIn1dKX07ZC5pbmhlcml0cyhoLGYpLGIuU3ZnSGlnaGxpZ2h0UnVsZXM9aH0pLGRlZmluZSgiYWNlL21vZGUvZm9sZGluZy9taXhlZCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGUsZj1iLkZvbGRNb2RlPWZ1bmN0aW9uKGEsYil7dGhpcy5kZWZhdWx0TW9kZT1hLHRoaXMuc3ViTW9kZXM9Yn07ZC5pbmhlcml0cyhmLGUpLGZ1bmN0aW9uKCl7dGhpcy4kZ2V0TW9kZT1mdW5jdGlvbihhKXtmb3IodmFyIGIgaW4gdGhpcy5zdWJNb2RlcylpZihhLmluZGV4T2YoYik9PT0wKXJldHVybiB0aGlzLnN1Yk1vZGVzW2JdO3JldHVybiBudWxsfSx0aGlzLiR0cnlNb2RlPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXMuJGdldE1vZGUoYSk7cmV0dXJuIGU/ZS5nZXRGb2xkV2lkZ2V0KGIsYyxkKToiIn0sdGhpcy5nZXRGb2xkV2lkZ2V0PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy4kdHJ5TW9kZShhLmdldFN0YXRlKGMtMSksYSxiLGMpfHx0aGlzLiR0cnlNb2RlKGEuZ2V0U3RhdGUoYyksYSxiLGMpfHx0aGlzLmRlZmF1bHRNb2RlLmdldEZvbGRXaWRnZXQoYSxiLGMpfSx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy4kZ2V0TW9kZShhLmdldFN0YXRlKGMtMSkpO2lmKCFkfHwhZC5nZXRGb2xkV2lkZ2V0KGEsYixjKSlkPXRoaXMuJGdldE1vZGUoYS5nZXRTdGF0ZShjKSk7aWYoIWR8fCFkLmdldEZvbGRXaWRnZXQoYSxiLGMpKWQ9dGhpcy5kZWZhdWx0TW9kZTtyZXR1cm4gZC5nZXRGb2xkV2lkZ2V0UmFuZ2UoYSxiLGMpfX0uY2FsbChmLnByb3RvdHlwZSl9KSxmdW5jdGlvbigpe3dpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLGZ1bmN0aW9uKGEpe3dpbmRvdy5hY2V8fCh3aW5kb3cuYWNlPXt9KTtmb3IodmFyIGIgaW4gYSlhLmhhc093blByb3BlcnR5KGIpJiYoYWNlW2JdPWFbYl0pfSl9KCk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-textile-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBLZWxsZXkgdmFuIEV2ZXJ0IDxrZWxsZXkudmFuZXZlcnRAZ21haWwuY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS90ZXh0aWxlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS90ZXh0JywgJ2FjZS90b2tlbml6ZXInLCAnYWNlL21vZGUvdGV4dGlsZV9oaWdobGlnaHRfcnVsZXMnLCAnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIFRleHRNb2RlID0gcmVxdWlyZSgiLi90ZXh0IikuTW9kZTsKdmFyIFRva2VuaXplciA9IHJlcXVpcmUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcjsKdmFyIFRleHRpbGVIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4vdGV4dGlsZV9oaWdobGlnaHRfcnVsZXMiKS5UZXh0aWxlSGlnaGxpZ2h0UnVsZXM7CnZhciBNYXRjaGluZ0JyYWNlT3V0ZGVudCA9IHJlcXVpcmUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50OwoKdmFyIE1vZGUgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuJHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIobmV3IFRleHRpbGVIaWdobGlnaHRSdWxlcygpLmdldFJ1bGVzKCkpOwogICAgdGhpcy4kb3V0ZGVudCA9IG5ldyBNYXRjaGluZ0JyYWNlT3V0ZGVudCgpOwp9Owpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOwoKKGZ1bmN0aW9uKCkgewogICAgdGhpcy5nZXROZXh0TGluZUluZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBsaW5lLCB0YWIpIHsKICAgICAgICBpZiAoc3RhdGUgPT0gImludGFnIikKICAgICAgICAgICAgcmV0dXJuIHRhYjsKICAgICAgICAKICAgICAgICByZXR1cm4gIiI7CiAgICB9OwoKICAgIHRoaXMuY2hlY2tPdXRkZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIGlucHV0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KGxpbmUsIGlucHV0KTsKICAgIH07CgogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKHN0YXRlLCBkb2MsIHJvdykgewogICAgICAgIHRoaXMuJG91dGRlbnQuYXV0b091dGRlbnQoZG9jLCByb3cpOwogICAgfTsKICAgIAp9KS5jYWxsKE1vZGUucHJvdG90eXBlKTsKCmV4cG9ydHMuTW9kZSA9IE1vZGU7Cgp9KTsKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBLZWxsZXkgdmFuIEV2ZXJ0IDxrZWxsZXkudmFuZXZlcnRAZ21haWwuY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS90ZXh0aWxlX2hpZ2hsaWdodF9ydWxlcycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOwoKdmFyIFRleHRpbGVIaWdobGlnaHRSdWxlcyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy4kcnVsZXMgPSB7CiAgICAgICAgInN0YXJ0IiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5tYXRjaCgvXmhcZCQvKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJtYXJrdXAuaGVhZGluZy4iICsgdmFsdWUuY2hhckF0KDEpOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJtYXJrdXAuaGVhZGluZyI7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcmVnZXggOiAiaDF8aDJ8aDN8aDR8aDV8aDZ8YnF8cHxiY3xwcmUiLAogICAgICAgICAgICAgICAgbmV4dCAgOiAiYmxvY2t0YWciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiW1xcKl0rfFsjXSsiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiLisiCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJibG9ja3RhZyIgOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogImtleXdvcmQiLAogICAgICAgICAgICAgICAgcmVnZXggOiAiXFwuICIsCiAgICAgICAgICAgICAgICBuZXh0ICA6ICJzdGFydCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXCgiLAogICAgICAgICAgICAgICAgbmV4dCAgOiAiYmxvY2t0YWdwcm9wZXJ0aWVzIgogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiYmxvY2t0YWdwcm9wZXJ0aWVzIiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW4gOiAia2V5d29yZCIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJcXCkiLAogICAgICAgICAgICAgICAgbmV4dCAgOiAiYmxvY2t0YWciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgICAgICAgICByZWdleCA6ICJbYS16QS1aMC05XFwtX10rIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbiA6ICJrZXl3b3JkIiwKICAgICAgICAgICAgICAgIHJlZ2V4IDogIiMiCiAgICAgICAgICAgIH0KICAgICAgICBdCiAgICB9Owp9OwoKb29wLmluaGVyaXRzKFRleHRpbGVIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsKCmV4cG9ydHMuVGV4dGlsZUhpZ2hsaWdodFJ1bGVzID0gVGV4dGlsZUhpZ2hsaWdodFJ1bGVzOwoKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL3JhbmdlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuLi9yYW5nZSIpLlJhbmdlOwoKdmFyIE1hdGNoaW5nQnJhY2VPdXRkZW50ID0gZnVuY3Rpb24oKSB7fTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmNoZWNrT3V0ZGVudCA9IGZ1bmN0aW9uKGxpbmUsIGlucHV0KSB7CiAgICAgICAgaWYgKCEgL15ccyskLy50ZXN0KGxpbmUpKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgIHJldHVybiAvXlxzKlx9Ly50ZXN0KGlucHV0KTsKICAgIH07CgogICAgdGhpcy5hdXRvT3V0ZGVudCA9IGZ1bmN0aW9uKGRvYywgcm93KSB7CiAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShyb3cpOwogICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goL14oXHMqXH0pLyk7CgogICAgICAgIGlmICghbWF0Y2gpIHJldHVybiAwOwoKICAgICAgICB2YXIgY29sdW1uID0gbWF0Y2hbMV0ubGVuZ3RoOwogICAgICAgIHZhciBvcGVuQnJhY2VQb3MgPSBkb2MuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OiByb3csIGNvbHVtbjogY29sdW1ufSk7CgogICAgICAgIGlmICghb3BlbkJyYWNlUG9zIHx8IG9wZW5CcmFjZVBvcy5yb3cgPT0gcm93KSByZXR1cm4gMDsKCiAgICAgICAgdmFyIGluZGVudCA9IHRoaXMuJGdldEluZGVudChkb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7CiAgICAgICAgZG9jLnJlcGxhY2UobmV3IFJhbmdlKHJvdywgMCwgcm93LCBjb2x1bW4tMSksIGluZGVudCk7CiAgICB9OwoKICAgIHRoaXMuJGdldEluZGVudCA9IGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFxzKykvKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICIiOwogICAgfTsKCn0pLmNhbGwoTWF0Y2hpbmdCcmFjZU91dGRlbnQucHJvdG90eXBlKTsKCmV4cG9ydHMuTWF0Y2hpbmdCcmFjZU91dGRlbnQgPSBNYXRjaGluZ0JyYWNlT3V0ZGVudDsKfSk7CjsKICAgICAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkKICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkoKTsKICAgICAgICA=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-textile.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS90ZXh0aWxlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL3RleHRpbGVfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4vdGV4dGlsZV9oaWdobGlnaHRfcnVsZXMiKS5UZXh0aWxlSGlnaGxpZ2h0UnVsZXMsaD1hKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudCxpPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5pemVyPW5ldyBmKChuZXcgZykuZ2V0UnVsZXMoKSksdGhpcy4kb3V0ZGVudD1uZXcgaH07ZC5pbmhlcml0cyhpLGUpLGZ1bmN0aW9uKCl7dGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGE9PSJpbnRhZyI/YzoiIn0sdGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudChiLGMpfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGEsYixjKXt0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KGIsYyl9fS5jYWxsKGkucHJvdG90eXBlKSxiLk1vZGU9aX0pLGRlZmluZSgiYWNlL21vZGUvdGV4dGlsZV9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuLi9saWIvb29wIiksZT1hKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLGY9ZnVuY3Rpb24oKXt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjpmdW5jdGlvbihhKXtyZXR1cm4gYS5tYXRjaCgvXmhcZCQvKT8ibWFya3VwLmhlYWRpbmcuIithLmNoYXJBdCgxKToibWFya3VwLmhlYWRpbmcifSxyZWdleDoiaDF8aDJ8aDN8aDR8aDV8aDZ8YnF8cHxiY3xwcmUiLG5leHQ6ImJsb2NrdGFnIn0se3Rva2VuOiJrZXl3b3JkIixyZWdleDoiW1xcKl0rfFsjXSsifSx7dG9rZW46InRleHQiLHJlZ2V4OiIuKyJ9XSxibG9ja3RhZzpbe3Rva2VuOiJrZXl3b3JkIixyZWdleDoiXFwuICIsbmV4dDoic3RhcnQifSx7dG9rZW46ImtleXdvcmQiLHJlZ2V4OiJcXCgiLG5leHQ6ImJsb2NrdGFncHJvcGVydGllcyJ9XSxibG9ja3RhZ3Byb3BlcnRpZXM6W3t0b2tlbjoia2V5d29yZCIscmVnZXg6IlxcKSIsbmV4dDoiYmxvY2t0YWcifSx7dG9rZW46InN0cmluZyIscmVnZXg6IlthLXpBLVowLTlcXC1fXSsifSx7dG9rZW46ImtleXdvcmQiLHJlZ2V4OiIjIn1dfX07ZC5pbmhlcml0cyhmLGUpLGIuVGV4dGlsZUhpZ2hsaWdodFJ1bGVzPWZ9KSxkZWZpbmUoImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3JhbmdlIikuUmFuZ2UsZT1mdW5jdGlvbigpe307KChmdW5jdGlvbigpe3RoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuL15ccyskLy50ZXN0KGEpPy9eXHMqXH0vLnRlc3QoYik6ITF9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldExpbmUoYiksZT1jLm1hdGNoKC9eKFxzKlx9KS8pO2lmKCFlKXJldHVybiAwO3ZhciBmPWVbMV0ubGVuZ3RoLGc9YS5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6Yixjb2x1bW46Zn0pO2lmKCFnfHxnLnJvdz09YilyZXR1cm4gMDt2YXIgaD10aGlzLiRnZXRJbmRlbnQoYS5nZXRMaW5lKGcucm93KSk7YS5yZXBsYWNlKG5ldyBkKGIsMCxiLGYtMSksaCl9LHRoaXMuJGdldEluZGVudD1mdW5jdGlvbihhKXt2YXIgYj1hLm1hdGNoKC9eKFxzKykvKTtyZXR1cm4gYj9iWzFdOiIifX0pKS5jYWxsKGUucHJvdG90eXBlKSxiLk1hdGNoaW5nQnJhY2VPdXRkZW50PWV9KSxmdW5jdGlvbigpe3dpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLGZ1bmN0aW9uKGEpe3dpbmRvdy5hY2V8fCh3aW5kb3cuYWNlPXt9KTtmb3IodmFyIGIgaW4gYSlhLmhhc093blByb3BlcnR5KGIpJiYoYWNlW2JdPWFbYl0pfSl9KCk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-xml-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS94bWwnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL3RleHQnLCAnYWNlL3Rva2VuaXplcicsICdhY2UvbW9kZS94bWxfaGlnaGxpZ2h0X3J1bGVzJywgJ2FjZS9tb2RlL2JlaGF2aW91ci94bWwnLCAnYWNlL21vZGUvZm9sZGluZy94bWwnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBUZXh0TW9kZSA9IHJlcXVpcmUoIi4vdGV4dCIpLk1vZGU7CnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXI7CnZhciBYbWxIaWdobGlnaHRSdWxlcyA9IHJlcXVpcmUoIi4veG1sX2hpZ2hsaWdodF9ydWxlcyIpLlhtbEhpZ2hsaWdodFJ1bGVzOwp2YXIgWG1sQmVoYXZpb3VyID0gcmVxdWlyZSgiLi9iZWhhdmlvdXIveG1sIikuWG1sQmVoYXZpb3VyOwp2YXIgWG1sRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRpbmcveG1sIikuRm9sZE1vZGU7Cgp2YXIgTW9kZSA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy4kdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihuZXcgWG1sSGlnaGxpZ2h0UnVsZXMoKS5nZXRSdWxlcygpKTsKICAgIHRoaXMuJGJlaGF2aW91ciA9IG5ldyBYbWxCZWhhdmlvdXIoKTsKICAgIHRoaXMuZm9sZGluZ1J1bGVzID0gbmV3IFhtbEZvbGRNb2RlKCk7Cn07Cgpvb3AuaW5oZXJpdHMoTW9kZSwgVGV4dE1vZGUpOwoKKGZ1bmN0aW9uKCkgewogICAgCiAgICB0aGlzLmdldE5leHRMaW5lSW5kZW50ID0gZnVuY3Rpb24oc3RhdGUsIGxpbmUsIHRhYikgewogICAgICAgIHJldHVybiB0aGlzLiRnZXRJbmRlbnQobGluZSk7CiAgICB9OwoKfSkuY2FsbChNb2RlLnByb3RvdHlwZSk7CgpleHBvcnRzLk1vZGUgPSBNb2RlOwp9KTsKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS94bWxfaGlnaGxpZ2h0X3J1bGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS94bWxfdXRpbCcsICdhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIHhtbFV0aWwgPSByZXF1aXJlKCIuL3htbF91dGlsIik7CnZhciBUZXh0SGlnaGxpZ2h0UnVsZXMgPSByZXF1aXJlKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzOwoKdmFyIFhtbEhpZ2hsaWdodFJ1bGVzID0gZnVuY3Rpb24oKSB7CgogICAgLy8gcmVnZXhwIG11c3Qgbm90IGhhdmUgY2FwdHVyaW5nIHBhcmVudGhlc2VzCiAgICAvLyByZWdleHBzIGFyZSBvcmRlcmVkIC0+IHRoZSBmaXJzdCBtYXRjaCBpcyB1c2VkCiAgICB0aGlzLiRydWxlcyA9IHsKICAgICAgICBzdGFydCA6IFt7CiAgICAgICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgICAgICByZWdleCA6ICI8XFwhXFxbQ0RBVEFcXFsiLAogICAgICAgICAgICBuZXh0IDogImNkYXRhIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAieG1sX3BlIiwKICAgICAgICAgICAgcmVnZXggOiAiPFxcPy4qP1xcPz4iCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICI8XFwhLS0iLAogICAgICAgICAgICBuZXh0IDogImNvbW1lbnQiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJtZXRhLnRhZyIsIC8vIG9wZW5pbmcgdGFnCiAgICAgICAgICAgIHJlZ2V4IDogIjxcXC8/IiwKICAgICAgICAgICAgbmV4dCA6ICJ0YWciCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJ0ZXh0IiwKICAgICAgICAgICAgcmVnZXggOiAiXFxzKyIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgICAgICByZWdleCA6ICJbXjxdKyIKICAgICAgICB9XSwKICAgICAgICAKICAgICAgICBjZGF0YSA6IFt7CiAgICAgICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgICAgICByZWdleCA6ICJcXF1cXF0+IiwKICAgICAgICAgICAgbmV4dCA6ICJzdGFydCIKICAgICAgICB9LCB7CiAgICAgICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgICAgICByZWdleCA6ICJcXHMrIgogICAgICAgIH0sIHsKICAgICAgICAgICAgdG9rZW4gOiAidGV4dCIsCiAgICAgICAgICAgIHJlZ2V4IDogIig/OlteXFxdXXxcXF0oPyFcXF0+KSkrIgogICAgICAgIH1dLAoKICAgICAgICBjb21tZW50IDogW3sKICAgICAgICAgICAgdG9rZW4gOiAiY29tbWVudCIsCiAgICAgICAgICAgIHJlZ2V4IDogIi4qPy0tPiIsCiAgICAgICAgICAgIG5leHQgOiAic3RhcnQiCiAgICAgICAgfSwgewogICAgICAgICAgICB0b2tlbiA6ICJjb21tZW50IiwKICAgICAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgICAgICByZWdleCA6ICIuKyIKICAgICAgICB9XQogICAgfTsKICAgIAogICAgeG1sVXRpbC50YWcodGhpcy4kcnVsZXMsICJ0YWciLCAic3RhcnQiKTsKfTsKCm9vcC5pbmhlcml0cyhYbWxIaWdobGlnaHRSdWxlcywgVGV4dEhpZ2hsaWdodFJ1bGVzKTsKCmV4cG9ydHMuWG1sSGlnaGxpZ2h0UnVsZXMgPSBYbWxIaWdobGlnaHRSdWxlczsKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUveG1sX3V0aWwnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvbGFuZyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOwoKdmFyIGZvcm1UYWdzID0gbGFuZy5hcnJheVRvTWFwKAogICAgKCJidXR0b258Zm9ybXxpbnB1dHxsYWJlbHxzZWxlY3R8dGV4dGFyZWEiKS5zcGxpdCgifCIpCik7Cgp2YXIgdGFibGVUYWdzID0gbGFuZy5hcnJheVRvTWFwKAogICAgKCJ0YWJsZXx0Ym9keXx0ZHx0Zm9vdHx0aHx0ciIpLnNwbGl0KCJ8IikKKTsKCmZ1bmN0aW9uIHN0cmluZyhzdGF0ZSkgewogICAgcmV0dXJuIFt7CiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICByZWdleCA6ICciLio/IicKICAgIH0sIHsKICAgICAgICB0b2tlbiA6ICJzdHJpbmciLCAvLyBtdWx0aSBsaW5lIHN0cmluZyBzdGFydAogICAgICAgIG1lcmdlIDogdHJ1ZSwKICAgICAgICByZWdleCA6ICdbIl0uKicsCiAgICAgICAgbmV4dCA6IHN0YXRlICsgIi1xcXN0cmluZyIKICAgIH0sIHsKICAgICAgICB0b2tlbiA6ICJzdHJpbmciLAogICAgICAgIHJlZ2V4IDogIicuKj8nIgogICAgfSwgewogICAgICAgIHRva2VuIDogInN0cmluZyIsIC8vIG11bHRpIGxpbmUgc3RyaW5nIHN0YXJ0CiAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgIHJlZ2V4IDogIlsnXS4qIiwKICAgICAgICBuZXh0IDogc3RhdGUgKyAiLXFzdHJpbmciCiAgICB9XTsKfQoKZnVuY3Rpb24gbXVsdGlMaW5lU3RyaW5nKHF1b3RlLCBzdGF0ZSkgewogICAgcmV0dXJuIFt7CiAgICAgICAgdG9rZW4gOiAic3RyaW5nIiwKICAgICAgICBtZXJnZSA6IHRydWUsCiAgICAgICAgcmVnZXggOiAiLio/IiArIHF1b3RlLAogICAgICAgIG5leHQgOiBzdGF0ZQogICAgfSwgewogICAgICAgIHRva2VuIDogInN0cmluZyIsCiAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgIHJlZ2V4IDogJy4rJwogICAgfV07Cn0KCmV4cG9ydHMudGFnID0gZnVuY3Rpb24oc3RhdGVzLCBuYW1lLCBuZXh0U3RhdGUpIHsKICAgIHN0YXRlc1tuYW1lXSA9IFt7CiAgICAgICAgdG9rZW4gOiAidGV4dCIsCiAgICAgICAgcmVnZXggOiAiXFxzKyIKICAgIH0sIHsKICAgICAgICAvL3Rva2VuIDogIm1ldGEudGFnIiwKICAgICAgICAKICAgIHRva2VuIDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgaWYgKCB2YWx1ZT09PSdhJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAibWV0YS50YWcuYW5jaG9yIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICggdmFsdWU9PT0naW1nJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAibWV0YS50YWcuaW1hZ2UiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCB2YWx1ZT09PSdzY3JpcHQnICkgewogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy5zY3JpcHQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCB2YWx1ZT09PSdzdHlsZScgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEudGFnLnN0eWxlIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChmb3JtVGFncy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZS50b0xvd2VyQ2FzZSgpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZy5mb3JtIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0YWJsZVRhZ3MuaGFzT3duUHJvcGVydHkodmFsdWUudG9Mb3dlckNhc2UoKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAibWV0YS50YWcudGFibGUiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhLnRhZyI7CiAgICAgICAgICAgIH0KICAgICAgICB9LCAgICAgICAgCiAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgIHJlZ2V4IDogIlstX2EtekEtWjAtOTohXSsiLAogICAgICAgIG5leHQgOiBuYW1lICsgImVtYmVkLWF0dHJpYnV0ZS1saXN0IiAKICAgIH0sIHsKICAgICAgICB0b2tlbjogImVtcHR5IiwKICAgICAgICByZWdleDogIiIsCiAgICAgICAgbmV4dCA6IG5hbWUgKyAiZW1iZWQtYXR0cmlidXRlLWxpc3QiCiAgICB9XTsKCiAgICBzdGF0ZXNbbmFtZSArICItcXN0cmluZyJdID0gbXVsdGlMaW5lU3RyaW5nKCInIiwgbmFtZSArICJlbWJlZC1hdHRyaWJ1dGUtbGlzdCIpOwogICAgc3RhdGVzW25hbWUgKyAiLXFxc3RyaW5nIl0gPSBtdWx0aUxpbmVTdHJpbmcoIlwiIiwgbmFtZSArICJlbWJlZC1hdHRyaWJ1dGUtbGlzdCIpOwogICAgCiAgICBzdGF0ZXNbbmFtZSArICJlbWJlZC1hdHRyaWJ1dGUtbGlzdCJdID0gW3sKICAgICAgICB0b2tlbiA6ICJtZXRhLnRhZyIsCiAgICAgICAgbWVyZ2UgOiB0cnVlLAogICAgICAgIHJlZ2V4IDogIlwvPz4iLAogICAgICAgIG5leHQgOiBuZXh0U3RhdGUKICAgIH0sIHsKICAgICAgICB0b2tlbiA6ICJrZXl3b3JkLm9wZXJhdG9yIiwKICAgICAgICByZWdleCA6ICI9IgogICAgfSwgewogICAgICAgIHRva2VuIDogImVudGl0eS5vdGhlci5hdHRyaWJ1dGUtbmFtZSIsCiAgICAgICAgcmVnZXggOiAiWy1fYS16QS1aMC05Ol0rIgogICAgfSwgewogICAgICAgIHRva2VuIDogImNvbnN0YW50Lm51bWVyaWMiLCAvLyBmbG9hdAogICAgICAgIHJlZ2V4IDogIlsrLV0/XFxkKyg/Oig/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPyk/XFxiIgogICAgfSwgewogICAgICAgIHRva2VuIDogInRleHQiLAogICAgICAgIHJlZ2V4IDogIlxccysiCiAgICB9XS5jb25jYXQoc3RyaW5nKG5hbWUpKTsKfTsKCn0pOwovKiB2aW06dHM9NDpzdHM9NDpzdz00OgogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIENocmlzIFNwZW5jZXIgPGNocmlzLmFnLnNwZW5jZXIgQVQgZ29vZ2xlbWFpbCBET1QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbW9kZS9iZWhhdmlvdXIveG1sJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2UvbW9kZS9iZWhhdmlvdXInLCAnYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsKdmFyIEJlaGF2aW91ciA9IHJlcXVpcmUoIi4uL2JlaGF2aW91ciIpLkJlaGF2aW91cjsKdmFyIENzdHlsZUJlaGF2aW91ciA9IHJlcXVpcmUoIi4vY3N0eWxlIikuQ3N0eWxlQmVoYXZpb3VyOwoKdmFyIFhtbEJlaGF2aW91ciA9IGZ1bmN0aW9uICgpIHsKICAgIAogICAgdGhpcy5pbmhlcml0KENzdHlsZUJlaGF2aW91ciwgWyJzdHJpbmdfZHF1b3RlcyJdKTsgLy8gR2V0IHN0cmluZyBiZWhhdmlvdXIKICAgIAogICAgdGhpcy5hZGQoImJyYWNrZXRzIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsKICAgICAgICBpZiAodGV4dCA9PSAnPCcpIHsKICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOwogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsKICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnPD4nLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJz4nKSB7CiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICc+JykgeyAvLyBuZWVkIHNvbWUga2luZCBvZiBtYXRjaGluZyBjaGVjayBoZXJlCiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcnLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gIlxuIikgewogICAgICAgICAgICB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvclBvc2l0aW9uKCk7CiAgICAgICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KTsKICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhcnMgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMik7CiAgICAgICAgICAgIGlmIChyaWdodENoYXJzID09ICc8LycpIHsKICAgICAgICAgICAgICAgIHZhciBpbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoc2Vzc2lvbi5kb2MuZ2V0TGluZShjdXJzb3Iucm93KSkgKyBzZXNzaW9uLmdldFRhYlN0cmluZygpOwogICAgICAgICAgICAgICAgdmFyIG5leHRfaW5kZW50ID0gdGhpcy4kZ2V0SW5kZW50KHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdykpOwoKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xuJyArIGluZGVudCArICdcbicgKyBuZXh0X2luZGVudCwKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCBpbmRlbnQubGVuZ3RoLCAxLCBpbmRlbnQubGVuZ3RoXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CiAgICAKfQpvb3AuaW5oZXJpdHMoWG1sQmVoYXZpb3VyLCBCZWhhdmlvdXIpOwoKZXhwb3J0cy5YbWxCZWhhdmlvdXIgPSBYbWxCZWhhdmlvdXI7Cn0pOy8qIHZpbTp0cz00OnN0cz00OnN3PTQ6CiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgQ2hyaXMgU3BlbmNlciA8Y2hyaXMuYWcuc3BlbmNlciBBVCBnb29nbGVtYWlsIERPVCBjb20+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9tb2RlL2JlaGF2aW91ciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uLy4uL2xpYi9vb3AiKTsKdmFyIEJlaGF2aW91ciA9IHJlcXVpcmUoJy4uL2JlaGF2aW91cicpLkJlaGF2aW91cjsKCnZhciBDc3R5bGVCZWhhdmlvdXIgPSBmdW5jdGlvbiAoKSB7CgogICAgdGhpcy5hZGQoImJyYWNlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7CiAgICAgICAgaWYgKHRleHQgPT0gJ3snKSB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7CiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3snICsgc2VsZWN0ZWQgKyAnfScsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAne30nLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gJ30nKSB7CiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICB2YXIgcmlnaHRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbiwgY3Vyc29yLmNvbHVtbiArIDEpOwogICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICd9JykgewogICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gc2Vzc2lvbi4kZmluZE9wZW5pbmdCcmFja2V0KCd9Jywge2NvbHVtbjogY3Vyc29yLmNvbHVtbiArIDEsIHJvdzogY3Vyc29yLnJvd30pOwogICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIDFdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICJcbiIpIHsKICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOwogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7CiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7CiAgICAgICAgICAgICAgICB2YXIgb3BlbkJyYWNlUG9zID0gc2Vzc2lvbi5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6IGN1cnNvci5yb3csIGNvbHVtbjogY3Vyc29yLmNvbHVtbiArIDF9KTsKICAgICAgICAgICAgICAgIGlmICghb3BlbkJyYWNlUG9zKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKCiAgICAgICAgICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy5nZXROZXh0TGluZUluZGVudChzdGF0ZSwgbGluZS5zdWJzdHJpbmcoMCwgbGluZS5sZW5ndGggLSAxKSwgc2Vzc2lvbi5nZXRUYWJTdHJpbmcoKSk7CiAgICAgICAgICAgICAgICB2YXIgbmV4dF9pbmRlbnQgPSB0aGlzLiRnZXRJbmRlbnQoc2Vzc2lvbi5kb2MuZ2V0TGluZShvcGVuQnJhY2VQb3Mucm93KSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnXG4nICsgaW5kZW50ICsgJ1xuJyArIG5leHRfaW5kZW50LAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWzEsIGluZGVudC5sZW5ndGgsIDEsIGluZGVudC5sZW5ndGhdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCiAgICB0aGlzLmFkZCgiYnJhY2VzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsKICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOwogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAneycpIHsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7CiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5lbmQuY29sdW1uLCByYW5nZS5lbmQuY29sdW1uICsgMSk7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJ30nKSB7CiAgICAgICAgICAgICAgICByYW5nZS5lbmQuY29sdW1uKys7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImluc2VydGlvbiIsIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uLCBlZGl0b3IsIHNlc3Npb24sIHRleHQpIHsKICAgICAgICBpZiAodGV4dCA9PSAnKCcpIHsKICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25SYW5nZSgpOwogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2Uoc2VsZWN0aW9uKTsKICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSAiIikgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnKCcgKyBzZWxlY3RlZCArICcpJywKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHRleHQ6ICcoKScsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAnKScpIHsKICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOwogICAgICAgICAgICB2YXIgbGluZSA9IHNlc3Npb24uZG9jLmdldExpbmUoY3Vyc29yLnJvdyk7CiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhjdXJzb3IuY29sdW1uLCBjdXJzb3IuY29sdW1uICsgMSk7CiAgICAgICAgICAgIGlmIChyaWdodENoYXIgPT0gJyknKSB7CiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hpbmcgPSBzZXNzaW9uLiRmaW5kT3BlbmluZ0JyYWNrZXQoJyknLCB7Y29sdW1uOiBjdXJzb3IuY29sdW1uICsgMSwgcm93OiBjdXJzb3Iucm93fSk7CiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmcgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBbMSwgMV0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKCiAgICB0aGlzLmFkZCgicGFyZW5zIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsKICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOwogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnKCcpIHsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7CiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4gKyAxLCByYW5nZS5zdGFydC5jb2x1bW4gKyAyKTsKICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnKScpIHsKICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsKICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKICAgIHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsICJpbnNlcnRpb24iLCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbiwgZWRpdG9yLCBzZXNzaW9uLCB0ZXh0KSB7CiAgICAgICAgaWYgKHRleHQgPT0gJyInKSB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKHNlbGVjdGlvbik7CiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gIiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogJyInICsgc2VsZWN0ZWQgKyAnIicsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3JQb3NpdGlvbigpOwogICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKGN1cnNvci5yb3cpOwogICAgICAgICAgICAgICAgdmFyIGxlZnRDaGFyID0gbGluZS5zdWJzdHJpbmcoY3Vyc29yLmNvbHVtbi0xLCBjdXJzb3IuY29sdW1uKTsKCiAgICAgICAgICAgICAgICAvLyBXZSdyZSBlc2NhcGVkLgogICAgICAgICAgICAgICAgaWYgKGxlZnRDaGFyID09ICdcXCcpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBGaW5kIHdoYXQgdG9rZW4gd2UncmUgaW5zaWRlLgogICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHNlc3Npb24uZ2V0VG9rZW5zKHNlbGVjdGlvbi5zdGFydC5yb3csIHNlbGVjdGlvbi5zdGFydC5yb3cpWzBdLnRva2VuczsKICAgICAgICAgICAgICAgIHZhciBjb2wgPSAwLCB0b2tlbjsKICAgICAgICAgICAgICAgIHZhciBxdW90ZXBvcyA9IC0xOyAvLyBUcmFjayB3aGV0aGVyIHdlJ3JlIGluc2lkZSBhbiBvcGVuIHF1b3RlLgoKICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgdG9rZW5zLmxlbmd0aDsgeCsrKSB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbeF07CiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gLTE7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxdW90ZXBvcyA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcG9zID0gdG9rZW4udmFsdWUuaW5kZXhPZignIicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoKHRva2VuLnZhbHVlLmxlbmd0aCArIGNvbCkgPiBzZWxlY3Rpb24uc3RhcnQuY29sdW1uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb2wgKz0gdG9rZW5zW3hdLnZhbHVlLmxlbmd0aDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBUcnkgYW5kIGJlIHNtYXJ0IGFib3V0IHdoZW4gd2UgYXV0byBpbnNlcnQuCiAgICAgICAgICAgICAgICBpZiAoIXRva2VuIHx8IChxdW90ZXBvcyA8IDAgJiYgdG9rZW4udHlwZSAhPT0gImNvbW1lbnQiICYmICh0b2tlbi50eXBlICE9PSAic3RyaW5nIiB8fCAoKHNlbGVjdGlvbi5zdGFydC5jb2x1bW4gIT09IHRva2VuLnZhbHVlLmxlbmd0aCtjb2wtMSkgJiYgdG9rZW4udmFsdWUubGFzdEluZGV4T2YoJyInKSA9PT0gdG9rZW4udmFsdWUubGVuZ3RoLTEpKSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIiInLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLDFdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiAmJiB0b2tlbi50eXBlID09PSAic3RyaW5nIikgewogICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpbnB1dCBhbmQgbW92ZSByaWdodCBvbmUgaWYgd2UncmUgdHlwaW5nIG92ZXIgdGhlIGNsb3NpbmcgcXVvdGUuCiAgICAgICAgICAgICAgICAgICAgdmFyIHJpZ2h0Q2hhciA9IGxpbmUuc3Vic3RyaW5nKGN1cnNvci5jb2x1bW4sIGN1cnNvci5jb2x1bW4gKyAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmlnaHRDaGFyID09ICciJykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IFsxLCAxXQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwgImRlbGV0aW9uIiwgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24sIGVkaXRvciwgc2Vzc2lvbiwgcmFuZ2UpIHsKICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UocmFuZ2UpOwogICAgICAgIGlmICghcmFuZ2UuaXNNdWx0aUxpbmUoKSAmJiBzZWxlY3RlZCA9PSAnIicpIHsKICAgICAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmRvYy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7CiAgICAgICAgICAgIHZhciByaWdodENoYXIgPSBsaW5lLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4gKyAxLCByYW5nZS5zdGFydC5jb2x1bW4gKyAyKTsKICAgICAgICAgICAgaWYgKHJpZ2h0Q2hhciA9PSAnIicpIHsKICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4rKzsKICAgICAgICAgICAgICAgIHJldHVybiByYW5nZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfQpvb3AuaW5oZXJpdHMoQ3N0eWxlQmVoYXZpb3VyLCBCZWhhdmlvdXIpOwoKZXhwb3J0cy5Dc3R5bGVCZWhhdmlvdXIgPSBDc3R5bGVCZWhhdmlvdXI7Cn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL21vZGUvZm9sZGluZy94bWwnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvbGFuZycsICdhY2UvcmFuZ2UnLCAnYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUnLCAnYWNlL3Rva2VuX2l0ZXJhdG9yJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi4vLi4vbGliL29vcCIpOwp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uLy4uL2xpYi9sYW5nIik7CnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7CnZhciBCYXNlRm9sZE1vZGUgPSByZXF1aXJlKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlOwp2YXIgVG9rZW5JdGVyYXRvciA9IHJlcXVpcmUoIi4uLy4uL3Rva2VuX2l0ZXJhdG9yIikuVG9rZW5JdGVyYXRvcjsKCnZhciBGb2xkTW9kZSA9IGV4cG9ydHMuRm9sZE1vZGUgPSBmdW5jdGlvbih2b2lkRWxlbWVudHMpIHsKICAgIEJhc2VGb2xkTW9kZS5jYWxsKHRoaXMpOwogICAgdGhpcy52b2lkRWxlbWVudHMgPSB2b2lkRWxlbWVudHMgfHwge307Cn07Cm9vcC5pbmhlcml0cyhGb2xkTW9kZSwgQmFzZUZvbGRNb2RlKTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmdldEZvbGRXaWRnZXQgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgewogICAgICAgIHZhciB0YWcgPSB0aGlzLl9nZXRGaXJzdFRhZ0luTGluZShzZXNzaW9uLCByb3cpOwoKICAgICAgICBpZiAodGFnLmNsb3NpbmcpCiAgICAgICAgICAgIHJldHVybiBmb2xkU3R5bGUgPT0gIm1hcmtiZWdpbmVuZCIgPyAiZW5kIiA6ICIiOwoKICAgICAgICBpZiAoIXRhZy50YWdOYW1lIHx8IHRoaXMudm9pZEVsZW1lbnRzW3RhZy50YWdOYW1lLnRvTG93ZXJDYXNlKCldKQogICAgICAgICAgICByZXR1cm4gIiI7CgogICAgICAgIGlmICh0YWcuc2VsZkNsb3NpbmcpCiAgICAgICAgICAgIHJldHVybiAiIjsKCiAgICAgICAgaWYgKHRhZy52YWx1ZS5pbmRleE9mKCIvIiArIHRhZy50YWdOYW1lKSAhPT0gLTEpCiAgICAgICAgICAgIHJldHVybiAiIjsKCiAgICAgICAgcmV0dXJuICJzdGFydCI7CiAgICB9OwogICAgCiAgICB0aGlzLl9nZXRGaXJzdFRhZ0luTGluZSA9IGZ1bmN0aW9uKHNlc3Npb24sIHJvdykgewogICAgICAgIHZhciB0b2tlbnMgPSBzZXNzaW9uLmdldFRva2Vucyhyb3csIHJvdylbMF0udG9rZW5zOwogICAgICAgIHZhciB2YWx1ZSA9ICIiOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpXTsKICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUuaW5kZXhPZigibWV0YS50YWciKSA9PT0gMCkKICAgICAgICAgICAgICAgIHZhbHVlICs9IHRva2VuLnZhbHVlOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB2YWx1ZSArPSBsYW5nLnN0cmluZ1JlcGVhdCgiICIsIHRva2VuLnZhbHVlLmxlbmd0aCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiB0aGlzLl9wYXJzZVRhZyh2YWx1ZSk7CiAgICB9OwoKICAgIHRoaXMudGFnUmUgPSAvXihccyopKDw/KFwvPykoWy1fYS16QS1aMC05OiFdKilccyooXC8/KT4/KS87CiAgICB0aGlzLl9wYXJzZVRhZyA9IGZ1bmN0aW9uKHRhZykgewogICAgICAgIAogICAgICAgIHZhciBtYXRjaCA9IHRoaXMudGFnUmUuZXhlYyh0YWcpOwogICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLnRhZ1JlLmxhc3RJbmRleCB8fCAwOwogICAgICAgIHRoaXMudGFnUmUubGFzdEluZGV4ID0gMDsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdmFsdWU6IHRhZywKICAgICAgICAgICAgbWF0Y2g6IG1hdGNoID8gbWF0Y2hbMl0gOiAiIiwKICAgICAgICAgICAgY2xvc2luZzogbWF0Y2ggPyAhIW1hdGNoWzNdIDogZmFsc2UsCiAgICAgICAgICAgIHNlbGZDbG9zaW5nOiBtYXRjaCA/ICEhbWF0Y2hbNV0gfHwgbWF0Y2hbMl0gPT0gIi8+IiA6IGZhbHNlLAogICAgICAgICAgICB0YWdOYW1lOiBtYXRjaCA/IG1hdGNoWzRdIDogIiIsCiAgICAgICAgICAgIGNvbHVtbjogbWF0Y2hbMV0gPyBjb2x1bW4gKyBtYXRjaFsxXS5sZW5ndGggOiBjb2x1bW4KICAgICAgICB9OwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiByZWFkcyBhIGZ1bGwgdGFnIGFuZCBwbGFjZXMgdGhlIGl0ZXJhdG9yIGFmdGVyIHRoZSB0YWcKICAgICAqLwogICAgdGhpcy5fcmVhZFRhZ0ZvcndhcmQgPSBmdW5jdGlvbihpdGVyYXRvcikgewogICAgICAgIHZhciB0b2tlbiA9IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbigpOwogICAgICAgIGlmICghdG9rZW4pCiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAKICAgICAgICB2YXIgdmFsdWUgPSAiIjsKICAgICAgICB2YXIgc3RhcnQ7CiAgICAgICAgCiAgICAgICAgZG8gewogICAgICAgICAgICBpZiAodG9rZW4udHlwZS5pbmRleE9mKCJtZXRhLnRhZyIpID09PSAwKSB7CiAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gewogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpLAogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhbHVlICs9IHRva2VuLnZhbHVlOwogICAgICAgICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoIj4iKSAhPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGFnID0gdGhpcy5fcGFyc2VUYWcodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIHRhZy5zdGFydCA9IHN0YXJ0OwogICAgICAgICAgICAgICAgICAgIHRhZy5lbmQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuUm93KCksCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkgKyB0b2tlbi52YWx1ZS5sZW5ndGgKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnN0ZXBGb3J3YXJkKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhZzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gd2hpbGUodG9rZW4gPSBpdGVyYXRvci5zdGVwRm9yd2FyZCgpKTsKICAgICAgICAKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH07CiAgICAKICAgIHRoaXMuX3JlYWRUYWdCYWNrd2FyZCA9IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7CiAgICAgICAgdmFyIHRva2VuID0gaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuKCk7CiAgICAgICAgaWYgKCF0b2tlbikKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIAogICAgICAgIHZhciB2YWx1ZSA9ICIiOwogICAgICAgIHZhciBlbmQ7CgogICAgICAgIGRvIHsKICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUuaW5kZXhPZigibWV0YS50YWciKSA9PT0gMCkgewogICAgICAgICAgICAgICAgaWYgKCFlbmQpIHsKICAgICAgICAgICAgICAgICAgICBlbmQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuUm93KCksCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogaXRlcmF0b3IuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkgKyB0b2tlbi52YWx1ZS5sZW5ndGgKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFsdWUgPSB0b2tlbi52YWx1ZSArIHZhbHVlOwogICAgICAgICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoIjwiKSAhPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGFnID0gdGhpcy5fcGFyc2VUYWcodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIHRhZy5lbmQgPSBlbmQ7CiAgICAgICAgICAgICAgICAgICAgdGFnLnN0YXJ0ID0gewogICAgICAgICAgICAgICAgICAgICAgICByb3c6IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlblJvdygpLAogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGl0ZXJhdG9yLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5zdGVwQmFja3dhcmQoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSB3aGlsZSh0b2tlbiA9IGl0ZXJhdG9yLnN0ZXBCYWNrd2FyZCgpKTsKICAgICAgICAKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH07CiAgICAKICAgIHRoaXMuX3BvcCA9IGZ1bmN0aW9uKHN0YWNrLCB0YWcpIHsKICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoKSB7CiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgdG9wID0gc3RhY2tbc3RhY2subGVuZ3RoLTFdOwogICAgICAgICAgICBpZiAoIXRhZyB8fCB0b3AudGFnTmFtZSA9PSB0YWcudGFnTmFtZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrLnBvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMudm9pZEVsZW1lbnRzW3RhZy50YWdOYW1lXSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMudm9pZEVsZW1lbnRzW3RvcC50YWdOYW1lXSkgewogICAgICAgICAgICAgICAgc3RhY2sucG9wKCk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKICAgIAogICAgdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgewogICAgICAgIHZhciBmaXJzdFRhZyA9IHRoaXMuX2dldEZpcnN0VGFnSW5MaW5lKHNlc3Npb24sIHJvdyk7CiAgICAgICAgCiAgICAgICAgaWYgKCFmaXJzdFRhZy5tYXRjaCkKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgCiAgICAgICAgdmFyIGlzQmFja3dhcmQgPSBmaXJzdFRhZy5jbG9zaW5nIHx8IGZpcnN0VGFnLnNlbGZDbG9zaW5nOwogICAgICAgIHZhciBzdGFjayA9IFtdOwogICAgICAgIHZhciB0YWc7CiAgICAgICAgCiAgICAgICAgaWYgKCFpc0JhY2t3YXJkKSB7CiAgICAgICAgICAgIHZhciBpdGVyYXRvciA9IG5ldyBUb2tlbkl0ZXJhdG9yKHNlc3Npb24sIHJvdywgZmlyc3RUYWcuY29sdW1uKTsKICAgICAgICAgICAgdmFyIHN0YXJ0ID0gewogICAgICAgICAgICAgICAgcm93OiByb3csCiAgICAgICAgICAgICAgICBjb2x1bW46IGZpcnN0VGFnLmNvbHVtbiArIGZpcnN0VGFnLnRhZ05hbWUubGVuZ3RoICsgMgogICAgICAgICAgICB9OwogICAgICAgICAgICB3aGlsZSAodGFnID0gdGhpcy5fcmVhZFRhZ0ZvcndhcmQoaXRlcmF0b3IpKSB7CiAgICAgICAgICAgICAgICBpZiAodGFnLnNlbGZDbG9zaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFjay5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGFnLnN0YXJ0LmNvbHVtbiArPSB0YWcudGFnTmFtZS5sZW5ndGggKyAyOwogICAgICAgICAgICAgICAgICAgICAgICB0YWcuZW5kLmNvbHVtbiAtPSAyOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyh0YWcuc3RhcnQsIHRhZy5lbmQpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKHRhZy5jbG9zaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcG9wKHN0YWNrLCB0YWcpOwogICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIHRhZy5zdGFydCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRhZykKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gbmV3IFRva2VuSXRlcmF0b3Ioc2Vzc2lvbiwgcm93LCBmaXJzdFRhZy5jb2x1bW4gKyBmaXJzdFRhZy5tYXRjaC5sZW5ndGgpOwogICAgICAgICAgICB2YXIgZW5kID0gewogICAgICAgICAgICAgICAgcm93OiByb3csCiAgICAgICAgICAgICAgICBjb2x1bW46IGZpcnN0VGFnLmNvbHVtbgogICAgICAgICAgICB9OwogICAgICAgICAgICAKICAgICAgICAgICAgd2hpbGUgKHRhZyA9IHRoaXMuX3JlYWRUYWdCYWNrd2FyZChpdGVyYXRvcikpIHsKICAgICAgICAgICAgICAgIGlmICh0YWcuc2VsZkNsb3NpbmcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YWNrLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQuY29sdW1uICs9IHRhZy50YWdOYW1lLmxlbmd0aCArIDI7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5lbmQuY29sdW1uIC09IDI7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHRhZy5zdGFydCwgdGFnLmVuZCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoIXRhZy5jbG9zaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcG9wKHN0YWNrLCB0YWcpOwogICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICB0YWcuc3RhcnQuY29sdW1uICs9IHRhZy50YWdOYW1lLmxlbmd0aCArIDI7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHRhZy5zdGFydCwgZW5kKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRhZykKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgIH07Cgp9KS5jYWxsKEZvbGRNb2RlLnByb3RvdHlwZSk7Cgp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvcmFuZ2UnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBSYW5nZSA9IHJlcXVpcmUoIi4uLy4uL3JhbmdlIikuUmFuZ2U7Cgp2YXIgRm9sZE1vZGUgPSBleHBvcnRzLkZvbGRNb2RlID0gZnVuY3Rpb24oKSB7fTsKCihmdW5jdGlvbigpIHsKCiAgICB0aGlzLmZvbGRpbmdTdGFydE1hcmtlciA9IG51bGw7CiAgICB0aGlzLmZvbGRpbmdTdG9wTWFya2VyID0gbnVsbDsKCiAgICAvLyBtdXN0IHJldHVybiAiIiBpZiB0aGVyZSdzIG5vIGZvbGQsIHRvIGVuYWJsZSBjYWNoaW5nCiAgICB0aGlzLmdldEZvbGRXaWRnZXQgPSBmdW5jdGlvbihzZXNzaW9uLCBmb2xkU3R5bGUsIHJvdykgewogICAgICAgIHZhciBsaW5lID0gc2Vzc2lvbi5nZXRMaW5lKHJvdyk7CiAgICAgICAgaWYgKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QobGluZSkpCiAgICAgICAgICAgIHJldHVybiAic3RhcnQiOwogICAgICAgIGlmIChmb2xkU3R5bGUgPT0gIm1hcmtiZWdpbmVuZCIKICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIKICAgICAgICAgICAgICAgICYmIHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChsaW5lKSkKICAgICAgICAgICAgcmV0dXJuICJlbmQiOwogICAgICAgIHJldHVybiAiIjsKICAgIH07CiAgICAKICAgIHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlID0gZnVuY3Rpb24oc2Vzc2lvbiwgZm9sZFN0eWxlLCByb3cpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH07CgogICAgdGhpcy5pbmRlbnRhdGlvbkJsb2NrID0gZnVuY3Rpb24oc2Vzc2lvbiwgcm93LCBjb2x1bW4pIHsKICAgICAgICB2YXIgcmUgPSAvXlxzKi87CiAgICAgICAgdmFyIHN0YXJ0Um93ID0gcm93OwogICAgICAgIHZhciBlbmRSb3cgPSByb3c7CiAgICAgICAgdmFyIGxpbmUgPSBzZXNzaW9uLmdldExpbmUocm93KTsKICAgICAgICB2YXIgc3RhcnRDb2x1bW4gPSBjb2x1bW4gfHwgbGluZS5sZW5ndGg7CiAgICAgICAgdmFyIHN0YXJ0TGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7CiAgICAgICAgdmFyIG1heFJvdyA9IHNlc3Npb24uZ2V0TGVuZ3RoKCkKICAgICAgICAKICAgICAgICB3aGlsZSAoKytyb3cgPCBtYXhSb3cpIHsKICAgICAgICAgICAgbGluZSA9IHNlc3Npb24uZ2V0TGluZShyb3cpOwogICAgICAgICAgICB2YXIgbGV2ZWwgPSBsaW5lLm1hdGNoKHJlKVswXS5sZW5ndGg7CgogICAgICAgICAgICBpZiAobGV2ZWwgPT0gbGluZS5sZW5ndGgpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgIGlmIChsZXZlbCA8PSBzdGFydExldmVsKQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBlbmRSb3cgPSByb3c7CiAgICAgICAgfQoKICAgICAgICBpZiAoZW5kUm93ID4gc3RhcnRSb3cpIHsKICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IHNlc3Npb24uZ2V0TGluZShlbmRSb3cpLmxlbmd0aDsKICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShzdGFydFJvdywgc3RhcnRDb2x1bW4sIGVuZFJvdywgZW5kQ29sdW1uKTsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayA9IGZ1bmN0aW9uKHNlc3Npb24sIGJyYWNrZXQsIHJvdywgY29sdW1uKSB7CiAgICAgICAgdmFyIHN0YXJ0ID0ge3Jvdzogcm93LCBjb2x1bW46IGNvbHVtbiArIDF9OwogICAgICAgIHZhciBlbmQgPSBzZXNzaW9uLiRmaW5kQ2xvc2luZ0JyYWNrZXQoYnJhY2tldCwgc3RhcnQpOwogICAgICAgIGlmICghZW5kKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIHZhciBmdyA9IHNlc3Npb24uZm9sZFdpZGdldHNbZW5kLnJvd107CiAgICAgICAgaWYgKGZ3ID09IG51bGwpCiAgICAgICAgICAgIGZ3ID0gdGhpcy5nZXRGb2xkV2lkZ2V0KHNlc3Npb24sIGVuZC5yb3cpOwoKICAgICAgICBpZiAoZncgPT0gInN0YXJ0IikgewogICAgICAgICAgICBlbmQucm93IC0tOwogICAgICAgICAgICBlbmQuY29sdW1uID0gc2Vzc2lvbi5nZXRMaW5lKGVuZC5yb3cpLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQsIGVuZCk7CiAgICB9OwoKfSkuY2FsbChGb2xkTW9kZS5wcm90b3R5cGUpOwoKfSk7CjsKICAgICAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkKICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkoKTsKICAgICAgICA=]]></data>
	</file>
	<file>
	  <filename>/ace/src/mode-xml.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvbW9kZS94bWwiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHQiLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUveG1sX2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL2JlaGF2aW91ci94bWwiLCJhY2UvbW9kZS9mb2xkaW5nL3htbCJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi90ZXh0IikuTW9kZSxmPWEoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixnPWEoIi4veG1sX2hpZ2hsaWdodF9ydWxlcyIpLlhtbEhpZ2hsaWdodFJ1bGVzLGg9YSgiLi9iZWhhdmlvdXIveG1sIikuWG1sQmVoYXZpb3VyLGk9YSgiLi9mb2xkaW5nL3htbCIpLkZvbGRNb2RlLGo9ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbml6ZXI9bmV3IGYoKG5ldyBnKS5nZXRSdWxlcygpKSx0aGlzLiRiZWhhdmlvdXI9bmV3IGgsdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGl9O2QuaW5oZXJpdHMoaixlKSxmdW5jdGlvbigpe3RoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLiRnZXRJbmRlbnQoYil9fS5jYWxsKGoucHJvdG90eXBlKSxiLk1vZGU9an0pLGRlZmluZSgiYWNlL21vZGUveG1sX2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUveG1sX3V0aWwiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL29vcCIpLGU9YSgiLi94bWxfdXRpbCIpLGY9YSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxnPWZ1bmN0aW9uKCl7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46InRleHQiLHJlZ2V4OiI8XFwhXFxbQ0RBVEFcXFsiLG5leHQ6ImNkYXRhIn0se3Rva2VuOiJ4bWxfcGUiLHJlZ2V4OiI8XFw/Lio/XFw/PiJ9LHt0b2tlbjoiY29tbWVudCIsbWVyZ2U6ITAscmVnZXg6IjxcXCEtLSIsbmV4dDoiY29tbWVudCJ9LHt0b2tlbjoibWV0YS50YWciLHJlZ2V4OiI8XFwvPyIsbmV4dDoidGFnIn0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IltePF0rIn1dLGNkYXRhOlt7dG9rZW46InRleHQiLHJlZ2V4OiJcXF1cXF0+IixuZXh0OiJzdGFydCJ9LHt0b2tlbjoidGV4dCIscmVnZXg6IlxccysifSx7dG9rZW46InRleHQiLHJlZ2V4OiIoPzpbXlxcXV18XFxdKD8hXFxdPikpKyJ9XSxjb21tZW50Olt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIuKj8tLT4iLG5leHQ6InN0YXJ0In0se3Rva2VuOiJjb21tZW50IixtZXJnZTohMCxyZWdleDoiLisifV19LGUudGFnKHRoaXMuJHJ1bGVzLCJ0YWciLCJzdGFydCIpfTtkLmluaGVyaXRzKGcsZiksYi5YbWxIaWdobGlnaHRSdWxlcz1nfSksZGVmaW5lKCJhY2UvbW9kZS94bWxfdXRpbCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvbGFuZyJdLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBnKGEpe3JldHVyblt7dG9rZW46InN0cmluZyIscmVnZXg6JyIuKj8iJ30se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OidbIl0uKicsbmV4dDphKyItcXFzdHJpbmcifSx7dG9rZW46InN0cmluZyIscmVnZXg6IicuKj8nIn0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiJbJ10uKiIsbmV4dDphKyItcXN0cmluZyJ9XX1mdW5jdGlvbiBoKGEsYil7cmV0dXJuW3t0b2tlbjoic3RyaW5nIixtZXJnZTohMCxyZWdleDoiLio/IithLG5leHQ6Yn0se3Rva2VuOiJzdHJpbmciLG1lcmdlOiEwLHJlZ2V4OiIuKyJ9XX0idXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vbGliL2xhbmciKSxlPWQuYXJyYXlUb01hcCgiYnV0dG9ufGZvcm18aW5wdXR8bGFiZWx8c2VsZWN0fHRleHRhcmVhIi5zcGxpdCgifCIpKSxmPWQuYXJyYXlUb01hcCgidGFibGV8dGJvZHl8dGR8dGZvb3R8dGh8dHIiLnNwbGl0KCJ8IikpO2IudGFnPWZ1bmN0aW9uKGEsYixjKXthW2JdPVt7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn0se3Rva2VuOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09ImEiPyJtZXRhLnRhZy5hbmNob3IiOmE9PT0iaW1nIj8ibWV0YS50YWcuaW1hZ2UiOmE9PT0ic2NyaXB0Ij8ibWV0YS50YWcuc2NyaXB0IjphPT09InN0eWxlIj8ibWV0YS50YWcuc3R5bGUiOmUuaGFzT3duUHJvcGVydHkoYS50b0xvd2VyQ2FzZSgpKT8ibWV0YS50YWcuZm9ybSI6Zi5oYXNPd25Qcm9wZXJ0eShhLnRvTG93ZXJDYXNlKCkpPyJtZXRhLnRhZy50YWJsZSI6Im1ldGEudGFnIn0sbWVyZ2U6ITAscmVnZXg6IlstX2EtekEtWjAtOTohXSsiLG5leHQ6YisiZW1iZWQtYXR0cmlidXRlLWxpc3QifSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OmIrImVtYmVkLWF0dHJpYnV0ZS1saXN0In1dLGFbYisiLXFzdHJpbmciXT1oKCInIixiKyJlbWJlZC1hdHRyaWJ1dGUtbGlzdCIpLGFbYisiLXFxc3RyaW5nIl09aCgnIicsYisiZW1iZWQtYXR0cmlidXRlLWxpc3QiKSxhW2IrImVtYmVkLWF0dHJpYnV0ZS1saXN0Il09W3t0b2tlbjoibWV0YS50YWciLG1lcmdlOiEwLHJlZ2V4OiIvPz4iLG5leHQ6Y30se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiPSJ9LHt0b2tlbjoiZW50aXR5Lm90aGVyLmF0dHJpYnV0ZS1uYW1lIixyZWdleDoiWy1fYS16QS1aMC05Ol0rIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDoiWystXT9cXGQrKD86KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KT9cXGIifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn1dLmNvbmNhdChnKGIpKX19KSxkZWZpbmUoImFjZS9tb2RlL2JlaGF2aW91ci94bWwiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL2JlaGF2aW91ciIsImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4uL2JlaGF2aW91ciIpLkJlaGF2aW91cixmPWEoIi4vY3N0eWxlIikuQ3N0eWxlQmVoYXZpb3VyLGc9ZnVuY3Rpb24oKXt0aGlzLmluaGVyaXQoZixbInN0cmluZ19kcXVvdGVzIl0pLHRoaXMuYWRkKCJicmFja2V0cyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0iPCIpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtyZXR1cm4gZyE9PSIiPyExOnt0ZXh0OiI8PiIsc2VsZWN0aW9uOlsxLDFdfX1pZihlPT0iPiIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09Ij4iKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19ZWxzZSBpZihlPT0iXG4iKXt2YXIgaD1jLmdldEN1cnNvclBvc2l0aW9uKCksaT1kLmRvYy5nZXRMaW5lKGgucm93KSxrPWkuc3Vic3RyaW5nKGguY29sdW1uLGguY29sdW1uKzIpO2lmKGs9PSI8LyIpe3ZhciBsPXRoaXMuJGdldEluZGVudChkLmRvYy5nZXRMaW5lKGgucm93KSkrZC5nZXRUYWJTdHJpbmcoKSxtPXRoaXMuJGdldEluZGVudChkLmRvYy5nZXRMaW5lKGgucm93KSk7cmV0dXJue3RleHQ6IlxuIitsKyJcbiIrbSxzZWxlY3Rpb246WzEsbC5sZW5ndGgsMSxsLmxlbmd0aF19fX19KX07ZC5pbmhlcml0cyhnLGUpLGIuWG1sQmVoYXZpb3VyPWd9KSxkZWZpbmUoImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL2JlaGF2aW91ciJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vLi4vbGliL29vcCIpLGU9YSgiLi4vYmVoYXZpb3VyIikuQmVoYXZpb3VyLGY9ZnVuY3Rpb24oKXt0aGlzLmFkZCgiYnJhY2VzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe2lmKGU9PSJ7Iil7dmFyIGY9Yy5nZXRTZWxlY3Rpb25SYW5nZSgpLGc9ZC5kb2MuZ2V0VGV4dFJhbmdlKGYpO3JldHVybiBnIT09IiI/e3RleHQ6InsiK2crIn0iLHNlbGVjdGlvbjohMX06e3RleHQ6Int9IixzZWxlY3Rpb246WzEsMV19fWlmKGU9PSJ9Iil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0ifSIpe3ZhciBrPWQuJGZpbmRPcGVuaW5nQnJhY2tldCgifSIse2NvbHVtbjpoLmNvbHVtbisxLHJvdzpoLnJvd30pO2lmKGshPT1udWxsKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fWVsc2UgaWYoZT09IlxuIil7dmFyIGg9Yy5nZXRDdXJzb3JQb3NpdGlvbigpLGk9ZC5kb2MuZ2V0TGluZShoLnJvdyksaj1pLnN1YnN0cmluZyhoLmNvbHVtbixoLmNvbHVtbisxKTtpZihqPT0ifSIpe3ZhciBsPWQuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93Omgucm93LGNvbHVtbjpoLmNvbHVtbisxfSk7aWYoIWwpcmV0dXJuIG51bGw7dmFyIG09dGhpcy5nZXROZXh0TGluZUluZGVudChhLGkuc3Vic3RyaW5nKDAsaS5sZW5ndGgtMSksZC5nZXRUYWJTdHJpbmcoKSksbj10aGlzLiRnZXRJbmRlbnQoZC5kb2MuZ2V0TGluZShsLnJvdykpO3JldHVybnt0ZXh0OiJcbiIrbSsiXG4iK24sc2VsZWN0aW9uOlsxLG0ubGVuZ3RoLDEsbS5sZW5ndGhdfX19fSksdGhpcy5hZGQoImJyYWNlcyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0ieyIpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5lbmQuY29sdW1uLGUuZW5kLmNvbHVtbisxKTtpZihoPT0ifSIpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSksdGhpcy5hZGQoInBhcmVucyIsImluc2VydGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihlPT0iKCIpe3ZhciBmPWMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxnPWQuZG9jLmdldFRleHRSYW5nZShmKTtyZXR1cm4gZyE9PSIiP3t0ZXh0OiIoIitnKyIpIixzZWxlY3Rpb246ITF9Ont0ZXh0OiIoKSIsc2VsZWN0aW9uOlsxLDFdfX1pZihlPT0iKSIpe3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYoaj09IikiKXt2YXIgaz1kLiRmaW5kT3BlbmluZ0JyYWNrZXQoIikiLHtjb2x1bW46aC5jb2x1bW4rMSxyb3c6aC5yb3d9KTtpZihrIT09bnVsbClyZXR1cm57dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX19KSx0aGlzLmFkZCgicGFyZW5zIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZC5kb2MuZ2V0VGV4dFJhbmdlKGUpO2lmKCFlLmlzTXVsdGlMaW5lKCkmJmY9PSIoIil7dmFyIGc9ZC5kb2MuZ2V0TGluZShlLnN0YXJ0LnJvdyksaD1nLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbisxLGUuc3RhcnQuY29sdW1uKzIpO2lmKGg9PSIpIilyZXR1cm4gZS5lbmQuY29sdW1uKyssZX19KSx0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoZT09JyInKXt2YXIgZj1jLmdldFNlbGVjdGlvblJhbmdlKCksZz1kLmRvYy5nZXRUZXh0UmFuZ2UoZik7aWYoZyE9PSIiKXJldHVybnt0ZXh0OiciJytnKyciJyxzZWxlY3Rpb246ITF9O3ZhciBoPWMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPWQuZG9jLmdldExpbmUoaC5yb3cpLGo9aS5zdWJzdHJpbmcoaC5jb2x1bW4tMSxoLmNvbHVtbik7aWYoaj09IlxcIilyZXR1cm4gbnVsbDt2YXIgaz1kLmdldFRva2VucyhmLnN0YXJ0LnJvdyxmLnN0YXJ0LnJvdylbMF0udG9rZW5zLGw9MCxtLG49LTE7Zm9yKHZhciBvPTA7bzxrLmxlbmd0aDtvKyspe209a1tvXSxtLnR5cGU9PSJzdHJpbmciP249LTE6bjwwJiYobj1tLnZhbHVlLmluZGV4T2YoJyInKSk7aWYobS52YWx1ZS5sZW5ndGgrbD5mLnN0YXJ0LmNvbHVtbilicmVhaztsKz1rW29dLnZhbHVlLmxlbmd0aH1pZighbXx8bjwwJiZtLnR5cGUhPT0iY29tbWVudCImJihtLnR5cGUhPT0ic3RyaW5nInx8Zi5zdGFydC5jb2x1bW4hPT1tLnZhbHVlLmxlbmd0aCtsLTEmJm0udmFsdWUubGFzdEluZGV4T2YoJyInKT09PW0udmFsdWUubGVuZ3RoLTEpKXJldHVybnt0ZXh0OiciIicsc2VsZWN0aW9uOlsxLDFdfTtpZihtJiZtLnR5cGU9PT0ic3RyaW5nIil7dmFyIHA9aS5zdWJzdHJpbmcoaC5jb2x1bW4saC5jb2x1bW4rMSk7aWYocD09JyInKXJldHVybnt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImRlbGV0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWQuZG9jLmdldFRleHRSYW5nZShlKTtpZighZS5pc011bHRpTGluZSgpJiZmPT0nIicpe3ZhciBnPWQuZG9jLmdldExpbmUoZS5zdGFydC5yb3cpLGg9Zy5zdWJzdHJpbmcoZS5zdGFydC5jb2x1bW4rMSxlLnN0YXJ0LmNvbHVtbisyKTtpZihoPT0nIicpcmV0dXJuIGUuZW5kLmNvbHVtbisrLGV9fSl9O2QuaW5oZXJpdHMoZixlKSxiLkNzdHlsZUJlaGF2aW91cj1mfSksZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL3htbCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9sYW5nIiwiYWNlL3JhbmdlIiwiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiLCJhY2UvdG9rZW5faXRlcmF0b3IiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL2xpYi9vb3AiKSxlPWEoIi4uLy4uL2xpYi9sYW5nIiksZj1hKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGc9YSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZSxoPWEoIi4uLy4uL3Rva2VuX2l0ZXJhdG9yIikuVG9rZW5JdGVyYXRvcixpPWIuRm9sZE1vZGU9ZnVuY3Rpb24oYSl7Zy5jYWxsKHRoaXMpLHRoaXMudm9pZEVsZW1lbnRzPWF8fHt9fTtkLmluaGVyaXRzKGksZyksZnVuY3Rpb24oKXt0aGlzLmdldEZvbGRXaWRnZXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuX2dldEZpcnN0VGFnSW5MaW5lKGEsYyk7cmV0dXJuIGQuY2xvc2luZz9iPT0ibWFya2JlZ2luZW5kIj8iZW5kIjoiIjohZC50YWdOYW1lfHx0aGlzLnZvaWRFbGVtZW50c1tkLnRhZ05hbWUudG9Mb3dlckNhc2UoKV0/IiI6ZC5zZWxmQ2xvc2luZz8iIjpkLnZhbHVlLmluZGV4T2YoIi8iK2QudGFnTmFtZSkhPT0tMT8iIjoic3RhcnQifSx0aGlzLl9nZXRGaXJzdFRhZ0luTGluZT1mdW5jdGlvbihhLGIpe3ZhciBjPWEuZ2V0VG9rZW5zKGIsYilbMF0udG9rZW5zLGQ9IiI7Zm9yKHZhciBmPTA7ZjxjLmxlbmd0aDtmKyspe3ZhciBnPWNbZl07Zy50eXBlLmluZGV4T2YoIm1ldGEudGFnIik9PT0wP2QrPWcudmFsdWU6ZCs9ZS5zdHJpbmdSZXBlYXQoIiAiLGcudmFsdWUubGVuZ3RoKX1yZXR1cm4gdGhpcy5fcGFyc2VUYWcoZCl9LHRoaXMudGFnUmU9L14oXHMqKSg8PyhcLz8pKFstX2EtekEtWjAtOTohXSopXHMqKFwvPyk+PykvLHRoaXMuX3BhcnNlVGFnPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudGFnUmUuZXhlYyhhKSxjPXRoaXMudGFnUmUubGFzdEluZGV4fHwwO3JldHVybiB0aGlzLnRhZ1JlLmxhc3RJbmRleD0wLHt2YWx1ZTphLG1hdGNoOmI/YlsyXToiIixjbG9zaW5nOmI/ISFiWzNdOiExLHNlbGZDbG9zaW5nOmI/ISFiWzVdfHxiWzJdPT0iLz4iOiExLHRhZ05hbWU6Yj9iWzRdOiIiLGNvbHVtbjpiWzFdP2MrYlsxXS5sZW5ndGg6Y319LHRoaXMuX3JlYWRUYWdGb3J3YXJkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0Q3VycmVudFRva2VuKCk7aWYoIWIpcmV0dXJuIG51bGw7dmFyIGM9IiIsZDtkbyBpZihiLnR5cGUuaW5kZXhPZigibWV0YS50YWciKT09PTApe2lmKCFkKXZhciBkPXtyb3c6YS5nZXRDdXJyZW50VG9rZW5Sb3coKSxjb2x1bW46YS5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKX07Yys9Yi52YWx1ZTtpZihjLmluZGV4T2YoIj4iKSE9PS0xKXt2YXIgZT10aGlzLl9wYXJzZVRhZyhjKTtyZXR1cm4gZS5zdGFydD1kLGUuZW5kPXtyb3c6YS5nZXRDdXJyZW50VG9rZW5Sb3coKSxjb2x1bW46YS5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKStiLnZhbHVlLmxlbmd0aH0sYS5zdGVwRm9yd2FyZCgpLGV9fXdoaWxlKGI9YS5zdGVwRm9yd2FyZCgpKTtyZXR1cm4gbnVsbH0sdGhpcy5fcmVhZFRhZ0JhY2t3YXJkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0Q3VycmVudFRva2VuKCk7aWYoIWIpcmV0dXJuIG51bGw7dmFyIGM9IiIsZDtkbyBpZihiLnR5cGUuaW5kZXhPZigibWV0YS50YWciKT09PTApe2R8fChkPXtyb3c6YS5nZXRDdXJyZW50VG9rZW5Sb3coKSxjb2x1bW46YS5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKStiLnZhbHVlLmxlbmd0aH0pLGM9Yi52YWx1ZStjO2lmKGMuaW5kZXhPZigiPCIpIT09LTEpe3ZhciBlPXRoaXMuX3BhcnNlVGFnKGMpO3JldHVybiBlLmVuZD1kLGUuc3RhcnQ9e3JvdzphLmdldEN1cnJlbnRUb2tlblJvdygpLGNvbHVtbjphLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpfSxhLnN0ZXBCYWNrd2FyZCgpLGV9fXdoaWxlKGI9YS5zdGVwQmFja3dhcmQoKSk7cmV0dXJuIG51bGx9LHRoaXMuX3BvcD1mdW5jdGlvbihhLGIpe3doaWxlKGEubGVuZ3RoKXt2YXIgYz1hW2EubGVuZ3RoLTFdO2lmKCFifHxjLnRhZ05hbWU9PWIudGFnTmFtZSlyZXR1cm4gYS5wb3AoKTtpZih0aGlzLnZvaWRFbGVtZW50c1tiLnRhZ05hbWVdKXJldHVybjtpZih0aGlzLnZvaWRFbGVtZW50c1tjLnRhZ05hbWVdKXthLnBvcCgpO2NvbnRpbnVlfXJldHVybiBudWxsfX0sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuX2dldEZpcnN0VGFnSW5MaW5lKGEsYyk7aWYoIWQubWF0Y2gpcmV0dXJuIG51bGw7dmFyIGU9ZC5jbG9zaW5nfHxkLnNlbGZDbG9zaW5nLGc9W10saTtpZighZSl7dmFyIGo9bmV3IGgoYSxjLGQuY29sdW1uKSxrPXtyb3c6Yyxjb2x1bW46ZC5jb2x1bW4rZC50YWdOYW1lLmxlbmd0aCsyfTt3aGlsZShpPXRoaXMuX3JlYWRUYWdGb3J3YXJkKGopKXtpZihpLnNlbGZDbG9zaW5nKXtpZighZy5sZW5ndGgpcmV0dXJuIGkuc3RhcnQuY29sdW1uKz1pLnRhZ05hbWUubGVuZ3RoKzIsaS5lbmQuY29sdW1uLT0yLGYuZnJvbVBvaW50cyhpLnN0YXJ0LGkuZW5kKTtjb250aW51ZX1pZihpLmNsb3Npbmcpe3RoaXMuX3BvcChnLGkpO2lmKGcubGVuZ3RoPT0wKXJldHVybiBmLmZyb21Qb2ludHMoayxpLnN0YXJ0KX1lbHNlIGcucHVzaChpKX19ZWxzZXt2YXIgaj1uZXcgaChhLGMsZC5jb2x1bW4rZC5tYXRjaC5sZW5ndGgpLGw9e3JvdzpjLGNvbHVtbjpkLmNvbHVtbn07d2hpbGUoaT10aGlzLl9yZWFkVGFnQmFja3dhcmQoaikpe2lmKGkuc2VsZkNsb3Npbmcpe2lmKCFnLmxlbmd0aClyZXR1cm4gaS5zdGFydC5jb2x1bW4rPWkudGFnTmFtZS5sZW5ndGgrMixpLmVuZC5jb2x1bW4tPTIsZi5mcm9tUG9pbnRzKGkuc3RhcnQsaS5lbmQpO2NvbnRpbnVlfWlmKCFpLmNsb3Npbmcpe3RoaXMuX3BvcChnLGkpO2lmKGcubGVuZ3RoPT0wKXJldHVybiBpLnN0YXJ0LmNvbHVtbis9aS50YWdOYW1lLmxlbmd0aCsyLGYuZnJvbVBvaW50cyhpLnN0YXJ0LGwpfWVsc2UgZy5wdXNoKGkpfX19fS5jYWxsKGkucHJvdG90eXBlKX0pLGRlZmluZSgiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uLy4uL3JhbmdlIikuUmFuZ2UsZT1iLkZvbGRNb2RlPWZ1bmN0aW9uKCl7fTsoKGZ1bmN0aW9uKCl7dGhpcy5mb2xkaW5nU3RhcnRNYXJrZXI9bnVsbCx0aGlzLmZvbGRpbmdTdG9wTWFya2VyPW51bGwsdGhpcy5nZXRGb2xkV2lkZ2V0PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmdldExpbmUoYyk7cmV0dXJuIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3QoZCk/InN0YXJ0IjpiPT0ibWFya2JlZ2luZW5kIiYmdGhpcy5mb2xkaW5nU3RvcE1hcmtlciYmdGhpcy5mb2xkaW5nU3RvcE1hcmtlci50ZXN0KGQpPyJlbmQiOiIifSx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIG51bGx9LHRoaXMuaW5kZW50YXRpb25CbG9jaz1mdW5jdGlvbihhLGIsYyl7dmFyIGU9L15ccyovLGY9YixnPWIsaD1hLmdldExpbmUoYiksaT1jfHxoLmxlbmd0aCxqPWgubWF0Y2goZSlbMF0ubGVuZ3RoLGs9YS5nZXRMZW5ndGgoKTt3aGlsZSgrK2I8ayl7aD1hLmdldExpbmUoYik7dmFyIGw9aC5tYXRjaChlKVswXS5sZW5ndGg7aWYobD09aC5sZW5ndGgpY29udGludWU7aWYobDw9ailicmVhaztnPWJ9aWYoZz5mKXt2YXIgbT1hLmdldExpbmUoZykubGVuZ3RoO3JldHVybiBuZXcgZChmLGksZyxtKX19LHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jaz1mdW5jdGlvbihhLGIsYyxlKXt2YXIgZj17cm93OmMsY29sdW1uOmUrMX0sZz1hLiRmaW5kQ2xvc2luZ0JyYWNrZXQoYixmKTtpZighZylyZXR1cm47dmFyIGg9YS5mb2xkV2lkZ2V0c1tnLnJvd107cmV0dXJuIGg9PW51bGwmJihoPXRoaXMuZ2V0Rm9sZFdpZGdldChhLGcucm93KSksaD09InN0YXJ0IiYmKGcucm93LS0sZy5jb2x1bW49YS5nZXRMaW5lKGcucm93KS5sZW5ndGgpLGQuZnJvbVBvaW50cyhmLGcpfX0pKS5jYWxsKGUucHJvdG90eXBlKX0pLGZ1bmN0aW9uKCl7d2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sZnVuY3Rpb24oYSl7d2luZG93LmFjZXx8KHdpbmRvdy5hY2U9e30pO2Zvcih2YXIgYiBpbiBhKWEuaGFzT3duUHJvcGVydHkoYikmJihhY2VbYl09YVtiXSl9KX0oKQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-chrome-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvdGhlbWUvY2hyb21lJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKCmV4cG9ydHMuY3NzQ2xhc3MgPSAiYWNlLWNocm9tZSI7CmV4cG9ydHMuY3NzVGV4dCA9ICIuYWNlLWNocm9tZSAuYWNlX2VkaXRvciB7XAogIGJvcmRlcjogMnB4IHNvbGlkIHJnYigxNTksIDE1OSwgMTU5KTtcCn1cClwKLmFjZS1jaHJvbWUgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHtcCiAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDtcCn1cClwKLmFjZS1jaHJvbWUgLmFjZV9ndXR0ZXIge1wKICB3aWR0aDogNTBweDtcCiAgYmFja2dyb3VuZDogI2U4ZThlODtcCiAgY29sb3I6ICMzMzM7XAogIG92ZXJmbG93IDogaGlkZGVuO1wKfVwKXAouYWNlLWNocm9tZSAuYWNlX2d1dHRlci1sYXllciB7XAogIHdpZHRoOiAxMDAlO1wKICB0ZXh0LWFsaWduOiByaWdodDtcCn1cClwKLmFjZS1jaHJvbWUgLmFjZV9ndXR0ZXItbGF5ZXIgLmFjZV9ndXR0ZXItY2VsbCB7XAogIHBhZGRpbmctcmlnaHQ6IDZweDtcCn1cClwKLmFjZS1jaHJvbWUgLmFjZV9wcmludF9tYXJnaW4ge1wKICB3aWR0aDogMXB4O1wKICBiYWNrZ3JvdW5kOiAjZThlOGU4O1wKfVwKXAouYWNlLWNocm9tZSAuYWNlX3RleHQtbGF5ZXIge1wKICBjdXJzb3I6IHRleHQ7XAp9XApcCi5hY2UtY2hyb21lIC5hY2VfY3Vyc29yIHtcCiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCBibGFjaztcCn1cClwKLmFjZS1jaHJvbWUgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7XAogIGJvcmRlci1sZWZ0OiAwcHg7XAogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjaztcCn1cCiAgICAgICAgXAouYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV9pbnZpc2libGUge1wKICBjb2xvcjogcmdiKDE5MSwgMTkxLCAxOTEpO1wKfVwKXAouYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV9rZXl3b3JkIHtcCiAgY29sb3I6IGJsdWU7XAp9XApcCi5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9idWlsZGluIHtcCiAgY29sb3I6IHJnYig4OCwgNzIsIDI0Nik7XAp9XApcCi5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7XAogIGNvbG9yOiByZ2IoODgsIDkyLCAyNDYpO1wKfVwKXAouYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfbGlicmFyeSB7XAogIGNvbG9yOiByZ2IoNiwgMTUwLCAxNCk7XAp9XApcCi5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX2ludmFsaWQge1wKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTUzLCAwLCAwKTtcCiAgY29sb3I6IHdoaXRlO1wKfVwKXAouYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV9mb2xkIHtcCn1cClwKLmFjZS1jaHJvbWUgLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge1wKICBjb2xvcjogcmdiKDYwLCA3NiwgMTE0KTtcCn1cClwKLmFjZS1jaHJvbWUgLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfY29uc3RhbnQge1wKICBjb2xvcjogcmdiKDYsIDE1MCwgMTQpO1wKfVwKXAouYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV90eXBlLFwKLmFjZS1jaHJvbWUgLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfY2xhc3Mge1wKICBjb2xvcjogcmdiKDEwOSwgMTIxLCAyMjIpO1wKfVwKXAouYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7XAogIGNvbG9yOiByZ2IoMTA0LCAxMTgsIDEzNSk7XAp9XApcCi5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX3N0cmluZyB7XAogIGNvbG9yOiAjMTkxOWE2O1wKfVwKXAouYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV9jb21tZW50IHtcCiAgY29sb3I6ICMyMzZlMjQ7XAp9XApcCi5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQuYWNlX2RvYyB7XAogIGNvbG9yOiAjMjM2ZTI0O1wKfVwKXAouYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV9jb21tZW50LmFjZV9kb2MuYWNlX3RhZyB7XAogIGNvbG9yOiAjMjM2ZTI0O1wKfVwKXAouYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfbnVtZXJpYyB7XAogIGNvbG9yOiByZ2IoMCwgMCwgMjA1KTtcCn1cClwKLmFjZS1jaHJvbWUgLmFjZV9saW5lIC5hY2VfdmFyaWFibGUge1wKICBjb2xvcjogcmdiKDQ5LCAxMzIsIDE0OSk7XAp9XApcCi5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX3htbF9wZSB7XAogIGNvbG9yOiByZ2IoMTA0LCAxMDQsIDkxKTtcCn1cClwKLmFjZS1jaHJvbWUgLmFjZV9lbnRpdHkuYWNlX25hbWUuYWNlX2Z1bmN0aW9uIHtcCiAgY29sb3I6ICMwMDAwQTI7XAp9XApcCi5hY2UtY2hyb21lIC5hY2VfbWFya3VwLmFjZV9tYXJrdXBpbmUge1wKICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XAp9XApcCi5hY2UtY2hyb21lIC5hY2VfbWFya3VwLmFjZV9oZWFkaW5nIHtcCiAgY29sb3I6IHJnYigxMiwgNywgMjU1KTtcCn1cClwKLmFjZS1jaHJvbWUgLmFjZV9tYXJrdXAuYWNlX2xpc3Qge1wKICBjb2xvcjpyZ2IoMTg1LCA2LCAxNDQpO1wKfVwKXAouYWNlLWNocm9tZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7XAogIGJhY2tncm91bmQ6IHJnYigxODEsIDIxMywgMjU1KTtcCn1cClwKLmFjZS1jaHJvbWUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwIHtcCiAgYmFja2dyb3VuZDogcmdiKDI1MiwgMjU1LCAwKTtcCn1cClwKLmFjZS1jaHJvbWUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGFjayB7XAogIGJhY2tncm91bmQ6IHJnYigxNjQsIDIyOSwgMTAxKTtcCn1cClwKLmFjZS1jaHJvbWUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHtcCiAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4O1wKICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTkyLCAxOTIsIDE5Mik7XAp9XApcCi5hY2UtY2hyb21lIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wKICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDcpO1wKfVwKXAouYWNlLWNocm9tZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wKICBiYWNrZ3JvdW5kOiByZ2IoMjUwLCAyNTAsIDI1NSk7XAogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigyMDAsIDIwMCwgMjUwKTtcCn1cClwKLmFjZS1jaHJvbWUgLmFjZV9tZXRhLmFjZV90YWcge1wKICBjb2xvcjogcmdiKDE0NywgMTUsIDEyOCk7XAp9XApcCi5hY2UtY2hyb21lIC5hY2Vfc3RyaW5nLmFjZV9yZWdleCB7XAogIGNvbG9yOiByZ2IoMjU1LCAwLCAwKVwKfVwKXAouYWNlLWNocm9tZSAuYWNlX2VudGl0eS5hY2Vfb3RoZXIuYWNlX2F0dHJpYnV0ZS1uYW1le1wKICBjb2xvcjogIzk5NDQwOTtcCn0iOwoKdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsKZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOwoKfSk7CjsKICAgICAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkKICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkoKTsKICAgICAgICA=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-chrome.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvY2hyb21lIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oYSxiLGMpe2IuY3NzQ2xhc3M9ImFjZS1jaHJvbWUiLGIuY3NzVGV4dD0iLmFjZS1jaHJvbWUgLmFjZV9lZGl0b3IgeyAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO30uYWNlLWNocm9tZSAuYWNlX2VkaXRvci5hY2VfZm9jdXMgeyAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDt9LmFjZS1jaHJvbWUgLmFjZV9ndXR0ZXIgeyAgd2lkdGg6IDUwcHg7ICBiYWNrZ3JvdW5kOiAjZThlOGU4OyAgY29sb3I6ICMzMzM7ICBvdmVyZmxvdyA6IGhpZGRlbjt9LmFjZS1jaHJvbWUgLmFjZV9ndXR0ZXItbGF5ZXIgeyAgd2lkdGg6IDEwMCU7ICB0ZXh0LWFsaWduOiByaWdodDt9LmFjZS1jaHJvbWUgLmFjZV9ndXR0ZXItbGF5ZXIgLmFjZV9ndXR0ZXItY2VsbCB7ICBwYWRkaW5nLXJpZ2h0OiA2cHg7fS5hY2UtY2hyb21lIC5hY2VfcHJpbnRfbWFyZ2luIHsgIHdpZHRoOiAxcHg7ICBiYWNrZ3JvdW5kOiAjZThlOGU4O30uYWNlLWNocm9tZSAuYWNlX3RleHQtbGF5ZXIgeyAgY3Vyc29yOiB0ZXh0O30uYWNlLWNocm9tZSAuYWNlX2N1cnNvciB7ICBib3JkZXItbGVmdDogMnB4IHNvbGlkIGJsYWNrO30uYWNlLWNocm9tZSAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHsgIGJvcmRlci1sZWZ0OiAwcHg7ICBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fSAgICAgICAgLmFjZS1jaHJvbWUgLmFjZV9saW5lIC5hY2VfaW52aXNpYmxlIHsgIGNvbG9yOiByZ2IoMTkxLCAxOTEsIDE5MSk7fS5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX2tleXdvcmQgeyAgY29sb3I6IGJsdWU7fS5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9idWlsZGluIHsgIGNvbG9yOiByZ2IoODgsIDcyLCAyNDYpO30uYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2UgeyAgY29sb3I6IHJnYig4OCwgOTIsIDI0Nik7fS5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9saWJyYXJ5IHsgIGNvbG9yOiByZ2IoNiwgMTUwLCAxNCk7fS5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX2ludmFsaWQgeyAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDE1MywgMCwgMCk7ICBjb2xvcjogd2hpdGU7fS5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX2ZvbGQge30uYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7ICBjb2xvcjogcmdiKDYwLCA3NiwgMTE0KTt9LmFjZS1jaHJvbWUgLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfY29uc3RhbnQgeyAgY29sb3I6IHJnYig2LCAxNTAsIDE0KTt9LmFjZS1jaHJvbWUgLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfdHlwZSwuYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV9jbGFzcyB7ICBjb2xvcjogcmdiKDEwOSwgMTIxLCAyMjIpO30uYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7ICBjb2xvcjogcmdiKDEwNCwgMTE4LCAxMzUpO30uYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV9zdHJpbmcgeyAgY29sb3I6ICMxOTE5YTY7fS5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQgeyAgY29sb3I6ICMyMzZlMjQ7fS5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQuYWNlX2RvYyB7ICBjb2xvcjogIzIzNmUyNDt9LmFjZS1jaHJvbWUgLmFjZV9saW5lIC5hY2VfY29tbWVudC5hY2VfZG9jLmFjZV90YWcgeyAgY29sb3I6ICMyMzZlMjQ7fS5hY2UtY2hyb21lIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHsgIGNvbG9yOiByZ2IoMCwgMCwgMjA1KTt9LmFjZS1jaHJvbWUgLmFjZV9saW5lIC5hY2VfdmFyaWFibGUgeyAgY29sb3I6IHJnYig0OSwgMTMyLCAxNDkpO30uYWNlLWNocm9tZSAuYWNlX2xpbmUgLmFjZV94bWxfcGUgeyAgY29sb3I6IHJnYigxMDQsIDEwNCwgOTEpO30uYWNlLWNocm9tZSAuYWNlX2VudGl0eS5hY2VfbmFtZS5hY2VfZnVuY3Rpb24geyAgY29sb3I6ICMwMDAwQTI7fS5hY2UtY2hyb21lIC5hY2VfbWFya3VwLmFjZV9tYXJrdXBpbmUgeyAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30uYWNlLWNocm9tZSAuYWNlX21hcmt1cC5hY2VfaGVhZGluZyB7ICBjb2xvcjogcmdiKDEyLCA3LCAyNTUpO30uYWNlLWNocm9tZSAuYWNlX21hcmt1cC5hY2VfbGlzdCB7ICBjb2xvcjpyZ2IoMTg1LCA2LCAxNDQpO30uYWNlLWNocm9tZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7ICBiYWNrZ3JvdW5kOiByZ2IoMTgxLCAyMTMsIDI1NSk7fS5hY2UtY2hyb21lIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7ICBiYWNrZ3JvdW5kOiByZ2IoMjUyLCAyNTUsIDApO30uYWNlLWNocm9tZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0YWNrIHsgIGJhY2tncm91bmQ6IHJnYigxNjQsIDIyOSwgMTAxKTt9LmFjZS1jaHJvbWUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHsgIG1hcmdpbjogLTFweCAwIDAgLTFweDsgIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxOTIsIDE5MiwgMTkyKTt9LmFjZS1jaHJvbWUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7ICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDcpO30uYWNlLWNocm9tZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQgeyAgYmFja2dyb3VuZDogcmdiKDI1MCwgMjUwLCAyNTUpOyAgYm9yZGVyOiAxcHggc29saWQgcmdiKDIwMCwgMjAwLCAyNTApO30uYWNlLWNocm9tZSAuYWNlX21ldGEuYWNlX3RhZyB7ICBjb2xvcjogcmdiKDE0NywgMTUsIDEyOCk7fS5hY2UtY2hyb21lIC5hY2Vfc3RyaW5nLmFjZV9yZWdleCB7ICBjb2xvcjogcmdiKDI1NSwgMCwgMCl9LmFjZS1jaHJvbWUgLmFjZV9lbnRpdHkuYWNlX290aGVyLmFjZV9hdHRyaWJ1dGUtbmFtZXsgIGNvbG9yOiAjOTk0NDA5O30iO3ZhciBkPWEoIi4uL2xpYi9kb20iKTtkLmltcG9ydENzc1N0cmluZyhiLmNzc1RleHQsYi5jc3NDbGFzcyl9KSxmdW5jdGlvbigpe3dpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLGZ1bmN0aW9uKGEpe3dpbmRvdy5hY2V8fCh3aW5kb3cuYWNlPXt9KTtmb3IodmFyIGIgaW4gYSlhLmhhc093blByb3BlcnR5KGIpJiYoYWNlW2JdPWFbYl0pfSl9KCk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-clouds-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvdGhlbWUvY2xvdWRzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKCmV4cG9ydHMuaXNEYXJrID0gZmFsc2U7CmV4cG9ydHMuY3NzQ2xhc3MgPSAiYWNlLWNsb3VkcyI7CmV4cG9ydHMuY3NzVGV4dCA9ICJcCi5hY2UtY2xvdWRzIC5hY2VfZWRpdG9yIHtcCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wKfVwKXAouYWNlLWNsb3VkcyAuYWNlX2VkaXRvci5hY2VfZm9jdXMge1wKICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO1wKfVwKXAouYWNlLWNsb3VkcyAuYWNlX2d1dHRlciB7XAogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XAogIGNvbG9yOiAjMzMzO1wKfVwKXAouYWNlLWNsb3VkcyAuYWNlX3ByaW50X21hcmdpbiB7XAogIHdpZHRoOiAxcHg7XAogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XAp9XApcCi5hY2UtY2xvdWRzIC5hY2Vfc2Nyb2xsZXIge1wKICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGO1wKfVwKXAouYWNlLWNsb3VkcyAuYWNlX3RleHQtbGF5ZXIge1wKICBjdXJzb3I6IHRleHQ7XAogIGNvbG9yOiAjMDAwMDAwO1wKfVwKXAouYWNlLWNsb3VkcyAuYWNlX2N1cnNvciB7XAogIGJvcmRlci1sZWZ0OiAycHggc29saWQgIzAwMDAwMDtcCn1cClwKLmFjZS1jbG91ZHMgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7XAogIGJvcmRlci1sZWZ0OiAwcHg7XAogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMDAwMDAwO1wKfVwKIFwKLmFjZS1jbG91ZHMgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wKICBiYWNrZ3JvdW5kOiAjQkRENUZDO1wKfVwKXAouYWNlLWNsb3VkcyAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wKICBiYWNrZ3JvdW5kOiByZ2IoMTk4LCAyMTksIDE3NCk7XAp9XApcCi5hY2UtY2xvdWRzIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7XAogIG1hcmdpbjogLTFweCAwIDAgLTFweDtcCiAgYm9yZGVyOiAxcHggc29saWQgI0JGQkZCRjtcCn1cClwKLmFjZS1jbG91ZHMgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7XAogIGJhY2tncm91bmQ6ICNGRkZCRDE7XAp9XApcCi5hY2UtY2xvdWRzIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7XAogIGJvcmRlcjogMXB4IHNvbGlkICNCREQ1RkM7XAp9XAogICAgICAgXAouYWNlLWNsb3VkcyAuYWNlX2ludmlzaWJsZSB7XAogIGNvbG9yOiAjQkZCRkJGO1wKfVwKXAouYWNlLWNsb3VkcyAuYWNlX2tleXdvcmQge1wKICBjb2xvcjojQUY5NTZGO1wKfVwKXAouYWNlLWNsb3VkcyAuYWNlX2tleXdvcmQuYWNlX29wZXJhdG9yIHtcCiAgY29sb3I6IzQ4NDg0ODtcCn1cClwKLmFjZS1jbG91ZHMgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2Uge1wKICBjb2xvcjojMzk5NDZBO1wKfVwKXAouYWNlLWNsb3VkcyAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHtcCiAgY29sb3I6IzQ2QTYwOTtcCn1cClwKLmFjZS1jbG91ZHMgLmFjZV9pbnZhbGlkIHtcCiAgYmFja2dyb3VuZC1jb2xvcjojRkYwMDJBO1wKfVwKXAouYWNlLWNsb3VkcyAuYWNlX2ZvbGQge1wKICAgIGJhY2tncm91bmQtY29sb3I6ICNBRjk1NkY7XAogICAgYm9yZGVyLWNvbG9yOiAjMDAwMDAwO1wKfVwKXAouYWNlLWNsb3VkcyAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHtcCiAgY29sb3I6I0M1MjcyNztcCn1cClwKLmFjZS1jbG91ZHMgLmFjZV9zdHJpbmcge1wKICBjb2xvcjojNUQ5MENEO1wKfVwKXAouYWNlLWNsb3VkcyAuYWNlX2NvbW1lbnQge1wKICBjb2xvcjojQkNDOEJBO1wKfVwKXAouYWNlLWNsb3VkcyAuYWNlX2VudGl0eS5hY2Vfb3RoZXIuYWNlX2F0dHJpYnV0ZS1uYW1lIHtcCiAgY29sb3I6IzYwNjA2MDtcCn1cClwKLmFjZS1jbG91ZHMgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7XAogICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcCn0iOwoKdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsKZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOwoKfSk7CjsKICAgICAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkKICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkoKTsKICAgICAgICA=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-clouds.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvY2xvdWRzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oYSxiLGMpe2IuaXNEYXJrPSExLGIuY3NzQ2xhc3M9ImFjZS1jbG91ZHMiLGIuY3NzVGV4dD0iLmFjZS1jbG91ZHMgLmFjZV9lZGl0b3IgeyAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO30uYWNlLWNsb3VkcyAuYWNlX2VkaXRvci5hY2VfZm9jdXMgeyAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDt9LmFjZS1jbG91ZHMgLmFjZV9ndXR0ZXIgeyAgYmFja2dyb3VuZDogI2U4ZThlODsgIGNvbG9yOiAjMzMzO30uYWNlLWNsb3VkcyAuYWNlX3ByaW50X21hcmdpbiB7ICB3aWR0aDogMXB4OyAgYmFja2dyb3VuZDogI2U4ZThlODt9LmFjZS1jbG91ZHMgLmFjZV9zY3JvbGxlciB7ICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGO30uYWNlLWNsb3VkcyAuYWNlX3RleHQtbGF5ZXIgeyAgY3Vyc29yOiB0ZXh0OyAgY29sb3I6ICMwMDAwMDA7fS5hY2UtY2xvdWRzIC5hY2VfY3Vyc29yIHsgIGJvcmRlci1sZWZ0OiAycHggc29saWQgIzAwMDAwMDt9LmFjZS1jbG91ZHMgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7ICBib3JkZXItbGVmdDogMHB4OyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMwMDAwMDA7fSAuYWNlLWNsb3VkcyAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7ICBiYWNrZ3JvdW5kOiAjQkRENUZDO30uYWNlLWNsb3VkcyAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAgeyAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO30uYWNlLWNsb3VkcyAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQgeyAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4OyAgYm9yZGVyOiAxcHggc29saWQgI0JGQkZCRjt9LmFjZS1jbG91ZHMgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7ICBiYWNrZ3JvdW5kOiAjRkZGQkQxO30uYWNlLWNsb3VkcyAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQgeyAgYm9yZGVyOiAxcHggc29saWQgI0JERDVGQzt9ICAgICAgIC5hY2UtY2xvdWRzIC5hY2VfaW52aXNpYmxlIHsgIGNvbG9yOiAjQkZCRkJGO30uYWNlLWNsb3VkcyAuYWNlX2tleXdvcmQgeyAgY29sb3I6I0FGOTU2Rjt9LmFjZS1jbG91ZHMgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7ICBjb2xvcjojNDg0ODQ4O30uYWNlLWNsb3VkcyAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7ICBjb2xvcjojMzk5NDZBO30uYWNlLWNsb3VkcyAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHsgIGNvbG9yOiM0NkE2MDk7fS5hY2UtY2xvdWRzIC5hY2VfaW52YWxpZCB7ICBiYWNrZ3JvdW5kLWNvbG9yOiNGRjAwMkE7fS5hY2UtY2xvdWRzIC5hY2VfZm9sZCB7ICAgIGJhY2tncm91bmQtY29sb3I6ICNBRjk1NkY7ICAgIGJvcmRlci1jb2xvcjogIzAwMDAwMDt9LmFjZS1jbG91ZHMgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7ICBjb2xvcjojQzUyNzI3O30uYWNlLWNsb3VkcyAuYWNlX3N0cmluZyB7ICBjb2xvcjojNUQ5MENEO30uYWNlLWNsb3VkcyAuYWNlX2NvbW1lbnQgeyAgY29sb3I6I0JDQzhCQTt9LmFjZS1jbG91ZHMgLmFjZV9lbnRpdHkuYWNlX290aGVyLmFjZV9hdHRyaWJ1dGUtbmFtZSB7ICBjb2xvcjojNjA2MDYwO30uYWNlLWNsb3VkcyAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHsgICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9Ijt2YXIgZD1hKCIuLi9saWIvZG9tIik7ZC5pbXBvcnRDc3NTdHJpbmcoYi5jc3NUZXh0LGIuY3NzQ2xhc3MpfSksZnVuY3Rpb24oKXt3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSxmdW5jdGlvbihhKXt3aW5kb3cuYWNlfHwod2luZG93LmFjZT17fSk7Zm9yKHZhciBiIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShiKSYmKGFjZVtiXT1hW2JdKX0pfSgp]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-clouds_midnight-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvdGhlbWUvY2xvdWRzX21pZG5pZ2h0JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKCmV4cG9ydHMuaXNEYXJrID0gdHJ1ZTsKZXhwb3J0cy5jc3NDbGFzcyA9ICJhY2UtY2xvdWRzLW1pZG5pZ2h0IjsKZXhwb3J0cy5jc3NUZXh0ID0gIlwKLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9lZGl0b3Ige1wKICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7XAp9XApcCi5hY2UtY2xvdWRzLW1pZG5pZ2h0IC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7XAogIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7XAp9XApcCi5hY2UtY2xvdWRzLW1pZG5pZ2h0IC5hY2VfZ3V0dGVyIHtcCiAgYmFja2dyb3VuZDogI2U4ZThlODtcCiAgY29sb3I6ICMzMzM7XAp9XApcCi5hY2UtY2xvdWRzLW1pZG5pZ2h0IC5hY2VfcHJpbnRfbWFyZ2luIHtcCiAgd2lkdGg6IDFweDtcCiAgYmFja2dyb3VuZDogI2U4ZThlODtcCn1cClwKLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9zY3JvbGxlciB7XAogIGJhY2tncm91bmQtY29sb3I6ICMxOTE5MTk7XAp9XApcCi5hY2UtY2xvdWRzLW1pZG5pZ2h0IC5hY2VfdGV4dC1sYXllciB7XAogIGN1cnNvcjogdGV4dDtcCiAgY29sb3I6ICM5MjkyOTI7XAp9XApcCi5hY2UtY2xvdWRzLW1pZG5pZ2h0IC5hY2VfY3Vyc29yIHtcCiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjN0RBNURDO1wKfVwKXAouYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHtcCiAgYm9yZGVyLWxlZnQ6IDBweDtcCiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM3REE1REM7XAp9XAogXAouYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7XAogIGJhY2tncm91bmQ6ICMwMDAwMDA7XAp9XApcCi5hY2UtY2xvdWRzLW1pZG5pZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7XAogIGJhY2tncm91bmQ6IHJnYigxOTgsIDIxOSwgMTc0KTtcCn1cClwKLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHtcCiAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4O1wKICBib3JkZXI6IDFweCBzb2xpZCAjQkZCRkJGO1wKfVwKXAouYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHtcCiAgYmFja2dyb3VuZDogcmdiYSgyMTUsIDIxNSwgMjE1LCAwLjAzMSk7XAp9XApcCi5hY2UtY2xvdWRzLW1pZG5pZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7XAogIGJvcmRlcjogMXB4IHNvbGlkICMwMDAwMDA7XAp9XAogICAgICAgXAouYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX2ludmlzaWJsZSB7XAogIGNvbG9yOiAjQkZCRkJGO1wKfVwKXAouYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX2tleXdvcmQge1wKICBjb2xvcjojOTI3QzVEO1wKfVwKXAouYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX2tleXdvcmQuYWNlX29wZXJhdG9yIHtcCiAgY29sb3I6IzRCNEI0QjtcCn1cClwKLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2Uge1wKICBjb2xvcjojMzk5NDZBO1wKfVwKXAouYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHtcCiAgY29sb3I6IzQ2QTYwOTtcCn1cClwKLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9pbnZhbGlkIHtcCiAgY29sb3I6I0ZGRkZGRjtcCmJhY2tncm91bmQtY29sb3I6I0U5MkUyRTtcCn1cClwKLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9mb2xkIHtcCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTI3QzVEO1wKICAgIGJvcmRlci1jb2xvcjogIzkyOTI5MjtcCn1cClwKLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7XAogIGNvbG9yOiNFOTJFMkU7XAp9XApcCi5hY2UtY2xvdWRzLW1pZG5pZ2h0IC5hY2Vfc3RyaW5nIHtcCiAgY29sb3I6IzVEOTBDRDtcCn1cClwKLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9jb21tZW50IHtcCiAgY29sb3I6IzNDNDAzQjtcCn1cClwKLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9lbnRpdHkuYWNlX290aGVyLmFjZV9hdHRyaWJ1dGUtbmFtZSB7XAogIGNvbG9yOiM2MDYwNjA7XAp9XApcCi5hY2UtY2xvdWRzLW1pZG5pZ2h0IC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUge1wKICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XAp9IjsKCnZhciBkb20gPSByZXF1aXJlKCIuLi9saWIvZG9tIik7CmRvbS5pbXBvcnRDc3NTdHJpbmcoZXhwb3J0cy5jc3NUZXh0LCBleHBvcnRzLmNzc0NsYXNzKTsKCn0pOwo7CiAgICAgICAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAg]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-clouds_midnight.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvY2xvdWRzX21pZG5pZ2h0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oYSxiLGMpe2IuaXNEYXJrPSEwLGIuY3NzQ2xhc3M9ImFjZS1jbG91ZHMtbWlkbmlnaHQiLGIuY3NzVGV4dD0iLmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9lZGl0b3IgeyAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO30uYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX2VkaXRvci5hY2VfZm9jdXMgeyAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDt9LmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9ndXR0ZXIgeyAgYmFja2dyb3VuZDogI2U4ZThlODsgIGNvbG9yOiAjMzMzO30uYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX3ByaW50X21hcmdpbiB7ICB3aWR0aDogMXB4OyAgYmFja2dyb3VuZDogI2U4ZThlODt9LmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9zY3JvbGxlciB7ICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTkxOTE5O30uYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX3RleHQtbGF5ZXIgeyAgY3Vyc29yOiB0ZXh0OyAgY29sb3I6ICM5MjkyOTI7fS5hY2UtY2xvdWRzLW1pZG5pZ2h0IC5hY2VfY3Vyc29yIHsgIGJvcmRlci1sZWZ0OiAycHggc29saWQgIzdEQTVEQzt9LmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7ICBib3JkZXItbGVmdDogMHB4OyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM3REE1REM7fSAuYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7ICBiYWNrZ3JvdW5kOiAjMDAwMDAwO30uYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAgeyAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO30uYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQgeyAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4OyAgYm9yZGVyOiAxcHggc29saWQgI0JGQkZCRjt9LmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7ICBiYWNrZ3JvdW5kOiByZ2JhKDIxNSwgMjE1LCAyMTUsIDAuMDMxKTt9LmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHsgIGJvcmRlcjogMXB4IHNvbGlkICMwMDAwMDA7fSAgICAgICAuYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX2ludmlzaWJsZSB7ICBjb2xvcjogI0JGQkZCRjt9LmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9rZXl3b3JkIHsgIGNvbG9yOiM5MjdDNUQ7fS5hY2UtY2xvdWRzLW1pZG5pZ2h0IC5hY2Vfa2V5d29yZC5hY2Vfb3BlcmF0b3IgeyAgY29sb3I6IzRCNEI0Qjt9LmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2UgeyAgY29sb3I6IzM5OTQ2QTt9LmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9jb25zdGFudC5hY2VfbnVtZXJpYyB7ICBjb2xvcjojNDZBNjA5O30uYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX2ludmFsaWQgeyAgY29sb3I6I0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOiNFOTJFMkU7fS5hY2UtY2xvdWRzLW1pZG5pZ2h0IC5hY2VfZm9sZCB7ICAgIGJhY2tncm91bmQtY29sb3I6ICM5MjdDNUQ7ICAgIGJvcmRlci1jb2xvcjogIzkyOTI5Mjt9LmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7ICBjb2xvcjojRTkyRTJFO30uYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX3N0cmluZyB7ICBjb2xvcjojNUQ5MENEO30uYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX2NvbW1lbnQgeyAgY29sb3I6IzNDNDAzQjt9LmFjZS1jbG91ZHMtbWlkbmlnaHQgLmFjZV9lbnRpdHkuYWNlX290aGVyLmFjZV9hdHRyaWJ1dGUtbmFtZSB7ICBjb2xvcjojNjA2MDYwO30uYWNlLWNsb3Vkcy1taWRuaWdodCAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHsgICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9Ijt2YXIgZD1hKCIuLi9saWIvZG9tIik7ZC5pbXBvcnRDc3NTdHJpbmcoYi5jc3NUZXh0LGIuY3NzQ2xhc3MpfSksZnVuY3Rpb24oKXt3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSxmdW5jdGlvbihhKXt3aW5kb3cuYWNlfHwod2luZG93LmFjZT17fSk7Zm9yKHZhciBiIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShiKSYmKGFjZVtiXT1hW2JdKX0pfSgp]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-cobalt-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvdGhlbWUvY29iYWx0JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKCmV4cG9ydHMuaXNEYXJrID0gdHJ1ZTsKZXhwb3J0cy5jc3NDbGFzcyA9ICJhY2UtY29iYWx0IjsKZXhwb3J0cy5jc3NUZXh0ID0gIlwKLmFjZS1jb2JhbHQgLmFjZV9lZGl0b3Ige1wKICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7XAp9XApcCi5hY2UtY29iYWx0IC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7XAogIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7XAp9XApcCi5hY2UtY29iYWx0IC5hY2VfZ3V0dGVyIHtcCiAgYmFja2dyb3VuZDogI2U4ZThlODtcCiAgY29sb3I6ICMzMzM7XAp9XApcCi5hY2UtY29iYWx0IC5hY2VfcHJpbnRfbWFyZ2luIHtcCiAgd2lkdGg6IDFweDtcCiAgYmFja2dyb3VuZDogI2U4ZThlODtcCn1cClwKLmFjZS1jb2JhbHQgLmFjZV9zY3JvbGxlciB7XAogIGJhY2tncm91bmQtY29sb3I6ICMwMDIyNDA7XAp9XApcCi5hY2UtY29iYWx0IC5hY2VfdGV4dC1sYXllciB7XAogIGN1cnNvcjogdGV4dDtcCiAgY29sb3I6ICNGRkZGRkY7XAp9XApcCi5hY2UtY29iYWx0IC5hY2VfY3Vyc29yIHtcCiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjRkZGRkZGO1wKfVwKXAouYWNlLWNvYmFsdCAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHtcCiAgYm9yZGVyLWxlZnQ6IDBweDtcCiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNGRkZGRkY7XAp9XAogXAouYWNlLWNvYmFsdCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7XAogIGJhY2tncm91bmQ6IHJnYmEoMTc5LCAxMDEsIDU3LCAwLjc1KTtcCn1cClwKLmFjZS1jb2JhbHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwIHtcCiAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO1wKfVwKXAouYWNlLWNvYmFsdCAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge1wKICBtYXJnaW46IC0xcHggMCAwIC0xcHg7XAogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSk7XAp9XApcCi5hY2UtY29iYWx0IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wKICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMzUpO1wKfVwKXAouYWNlLWNvYmFsdCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wKICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE3OSwgMTAxLCA1NywgMC43NSk7XAp9XAogICAgICAgXAouYWNlLWNvYmFsdCAuYWNlX2ludmlzaWJsZSB7XAogIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpO1wKfVwKXAouYWNlLWNvYmFsdCAuYWNlX2tleXdvcmQge1wKICBjb2xvcjojRkY5RDAwO1wKfVwKXAouYWNlLWNvYmFsdCAuYWNlX2NvbnN0YW50IHtcCiAgY29sb3I6I0ZGNjI4QztcCn1cClwKLmFjZS1jb2JhbHQgLmFjZV9pbnZhbGlkIHtcCiAgY29sb3I6I0Y4RjhGODtcCmJhY2tncm91bmQtY29sb3I6IzgwMEYwMDtcCn1cClwKLmFjZS1jb2JhbHQgLmFjZV9zdXBwb3J0IHtcCiAgY29sb3I6IzgwRkZCQjtcCn1cClwKLmFjZS1jb2JhbHQgLmFjZV9mb2xkIHtcCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkY5RDAwO1wKICAgIGJvcmRlci1jb2xvcjogI0ZGRkZGRjtcCn1cClwKLmFjZS1jb2JhbHQgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7XAogIGNvbG9yOiNGRkIwNTQ7XAp9XApcCi5hY2UtY29iYWx0IC5hY2Vfc3RyaW5nLmFjZV9yZWdleHAge1wKICBjb2xvcjojODBGRkMyO1wKfVwKXAouYWNlLWNvYmFsdCAuYWNlX2NvbW1lbnQge1wKICBmb250LXN0eWxlOml0YWxpYztcCmNvbG9yOiMwMDg4RkY7XAp9XApcCi5hY2UtY29iYWx0IC5hY2VfdmFyaWFibGUge1wKICBjb2xvcjojQ0NDQ0NDO1wKfVwKXAouYWNlLWNvYmFsdCAuYWNlX3ZhcmlhYmxlLmFjZV9sYW5ndWFnZSB7XAogIGNvbG9yOiNGRjgwRTE7XAp9XApcCi5hY2UtY29iYWx0IC5hY2VfbWV0YS5hY2VfdGFnIHtcCiAgY29sb3I6IzlFRkZGRjtcCn1cClwKLmFjZS1jb2JhbHQgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7XAogICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcCn1cClwKLmFjZS1jb2JhbHQgLmFjZV9tYXJrdXAuYWNlX2hlYWRpbmcge1wKICBjb2xvcjojQzhFNEZEO1wKYmFja2dyb3VuZC1jb2xvcjojMDAxMjIxO1wKfVwKXAouYWNlLWNvYmFsdCAuYWNlX21hcmt1cC5hY2VfbGlzdCB7XAogIGJhY2tncm91bmQtY29sb3I6IzEzMEQyNjtcCn0iOwoKdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsKZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOwp9KTsKOwogICAgICAgICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgewogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KSgpOwogICAgICAgIA==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-cobalt.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvY29iYWx0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oYSxiLGMpe2IuaXNEYXJrPSEwLGIuY3NzQ2xhc3M9ImFjZS1jb2JhbHQiLGIuY3NzVGV4dD0iLmFjZS1jb2JhbHQgLmFjZV9lZGl0b3IgeyAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO30uYWNlLWNvYmFsdCAuYWNlX2VkaXRvci5hY2VfZm9jdXMgeyAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDt9LmFjZS1jb2JhbHQgLmFjZV9ndXR0ZXIgeyAgYmFja2dyb3VuZDogI2U4ZThlODsgIGNvbG9yOiAjMzMzO30uYWNlLWNvYmFsdCAuYWNlX3ByaW50X21hcmdpbiB7ICB3aWR0aDogMXB4OyAgYmFja2dyb3VuZDogI2U4ZThlODt9LmFjZS1jb2JhbHQgLmFjZV9zY3JvbGxlciB7ICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAyMjQwO30uYWNlLWNvYmFsdCAuYWNlX3RleHQtbGF5ZXIgeyAgY3Vyc29yOiB0ZXh0OyAgY29sb3I6ICNGRkZGRkY7fS5hY2UtY29iYWx0IC5hY2VfY3Vyc29yIHsgIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0ZGRkZGRjt9LmFjZS1jb2JhbHQgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7ICBib3JkZXItbGVmdDogMHB4OyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNGRkZGRkY7fSAuYWNlLWNvYmFsdCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7ICBiYWNrZ3JvdW5kOiByZ2JhKDE3OSwgMTAxLCA1NywgMC43NSk7fS5hY2UtY29iYWx0IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7ICBiYWNrZ3JvdW5kOiByZ2IoMTk4LCAyMTksIDE3NCk7fS5hY2UtY29iYWx0IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7ICBtYXJnaW46IC0xcHggMCAwIC0xcHg7ICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpO30uYWNlLWNvYmFsdCAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHsgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4zNSk7fS5hY2UtY29iYWx0IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7ICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE3OSwgMTAxLCA1NywgMC43NSk7fSAgICAgICAuYWNlLWNvYmFsdCAuYWNlX2ludmlzaWJsZSB7ICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KTt9LmFjZS1jb2JhbHQgLmFjZV9rZXl3b3JkIHsgIGNvbG9yOiNGRjlEMDA7fS5hY2UtY29iYWx0IC5hY2VfY29uc3RhbnQgeyAgY29sb3I6I0ZGNjI4Qzt9LmFjZS1jb2JhbHQgLmFjZV9pbnZhbGlkIHsgIGNvbG9yOiNGOEY4Rjg7YmFja2dyb3VuZC1jb2xvcjojODAwRjAwO30uYWNlLWNvYmFsdCAuYWNlX3N1cHBvcnQgeyAgY29sb3I6IzgwRkZCQjt9LmFjZS1jb2JhbHQgLmFjZV9mb2xkIHsgICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGOUQwMDsgICAgYm9yZGVyLWNvbG9yOiAjRkZGRkZGO30uYWNlLWNvYmFsdCAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHsgIGNvbG9yOiNGRkIwNTQ7fS5hY2UtY29iYWx0IC5hY2Vfc3RyaW5nLmFjZV9yZWdleHAgeyAgY29sb3I6IzgwRkZDMjt9LmFjZS1jb2JhbHQgLmFjZV9jb21tZW50IHsgIGZvbnQtc3R5bGU6aXRhbGljO2NvbG9yOiMwMDg4RkY7fS5hY2UtY29iYWx0IC5hY2VfdmFyaWFibGUgeyAgY29sb3I6I0NDQ0NDQzt9LmFjZS1jb2JhbHQgLmFjZV92YXJpYWJsZS5hY2VfbGFuZ3VhZ2UgeyAgY29sb3I6I0ZGODBFMTt9LmFjZS1jb2JhbHQgLmFjZV9tZXRhLmFjZV90YWcgeyAgY29sb3I6IzlFRkZGRjt9LmFjZS1jb2JhbHQgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7ICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fS5hY2UtY29iYWx0IC5hY2VfbWFya3VwLmFjZV9oZWFkaW5nIHsgIGNvbG9yOiNDOEU0RkQ7YmFja2dyb3VuZC1jb2xvcjojMDAxMjIxO30uYWNlLWNvYmFsdCAuYWNlX21hcmt1cC5hY2VfbGlzdCB7ICBiYWNrZ3JvdW5kLWNvbG9yOiMxMzBEMjY7fSI7dmFyIGQ9YSgiLi4vbGliL2RvbSIpO2QuaW1wb3J0Q3NzU3RyaW5nKGIuY3NzVGV4dCxiLmNzc0NsYXNzKX0pLGZ1bmN0aW9uKCl7d2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sZnVuY3Rpb24oYSl7d2luZG93LmFjZXx8KHdpbmRvdy5hY2U9e30pO2Zvcih2YXIgYiBpbiBhKWEuaGFzT3duUHJvcGVydHkoYikmJihhY2VbYl09YVtiXSl9KX0oKQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-crimson_editor-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvdGhlbWUvY3JpbXNvbl9lZGl0b3InLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewpleHBvcnRzLmlzRGFyayA9IGZhbHNlOwpleHBvcnRzLmNzc1RleHQgPSAiLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2VkaXRvciB7XAogIGJvcmRlcjogMnB4IHNvbGlkIHJnYigxNTksIDE1OSwgMTU5KTtcCn1cClwKLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2VkaXRvci5hY2VfZm9jdXMge1wKICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO1wKfVwKXAouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfZ3V0dGVyIHtcCiAgd2lkdGg6IDUwcHg7XAogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XAogIGNvbG9yOiAjMzMzO1wKICBvdmVyZmxvdyA6IGhpZGRlbjtcCn1cClwKLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2d1dHRlci1sYXllciB7XAogIHdpZHRoOiAxMDAlO1wKICB0ZXh0LWFsaWduOiByaWdodDtcCn1cClwKLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2d1dHRlci1sYXllciAuYWNlX2d1dHRlci1jZWxsIHtcCiAgcGFkZGluZy1yaWdodDogNnB4O1wKfVwKXAouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfcHJpbnRfbWFyZ2luIHtcCiAgd2lkdGg6IDFweDtcCiAgYmFja2dyb3VuZDogI2U4ZThlODtcCn1cClwKLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX3RleHQtbGF5ZXIge1wKICBjdXJzb3I6IHRleHQ7XAogIGNvbG9yOiByZ2IoNjQsIDY0LCA2NCk7XAp9XApcCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9jdXJzb3Ige1wKICBib3JkZXItbGVmdDogMnB4IHNvbGlkIGJsYWNrO1wKfVwKXAouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUge1wKICBib3JkZXItbGVmdDogMHB4O1wKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7XAp9XApcCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2VfaW52aXNpYmxlIHtcCiAgY29sb3I6IHJnYigxOTEsIDE5MSwgMTkxKTtcCn1cClwKLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV9pZGVudGlmaWVyIHtcCiAgY29sb3I6IGJsYWNrO1wKfVwKXAouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX2tleXdvcmQge1wKICBjb2xvcjogYmx1ZTtcCn1cClwKLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfYnVpbGRpbiB7XAogIGNvbG9yOiByZ2IoODgsIDcyLCAyNDYpO1wKfVwKXAouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7XAogIGNvbG9yOiByZ2IoMjU1LCAxNTYsIDApO1wKfVwKXAouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9saWJyYXJ5IHtcCiAgY29sb3I6IHJnYig2LCAxNTAsIDE0KTtcCn1cClwKLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV9pbnZhbGlkIHtcCiAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XAogIGNvbG9yOiByZ2IoMjI0LCAwLCAwKTtcCn1cClwKLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV9mb2xkIHtcCn1cClwKLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7XAogIGNvbG9yOiByZ2IoMTkyLCAwLCAwKTtcCn1cClwKLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV9jb25zdGFudCB7XAogIGNvbG9yOiByZ2IoNiwgMTUwLCAxNCk7XAp9XApcCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfdHlwZSxcCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfY2xhc3Mge1wKICBjb2xvcjogcmdiKDEwOSwgMTIxLCAyMjIpO1wKfVwKXAouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX2tleXdvcmQuYWNlX29wZXJhdG9yIHtcCiAgY29sb3I6IHJnYig0OSwgMTMyLCAxNDkpO1wKfVwKXAouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX3N0cmluZyB7XAogIGNvbG9yOiByZ2IoMTI4LCAwLCAxMjgpO1wKfVwKXAouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQge1wKICBjb2xvcjogcmdiKDc2LCAxMzYsIDEwNyk7XAp9XApcCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2VfY29tbWVudC5hY2VfZG9jIHtcCiAgY29sb3I6IHJnYigwLCAxMDIsIDI1NSk7XAp9XApcCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2VfY29tbWVudC5hY2VfZG9jLmFjZV90YWcge1wKICBjb2xvcjogcmdiKDEyOCwgMTU5LCAxOTEpO1wKfVwKXAouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHtcCiAgY29sb3I6IHJnYigwLCAwLCA2NCk7XAp9XApcCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2VfdmFyaWFibGUge1wKICBjb2xvcjogcmdiKDAsIDY0LCAxMjgpO1wKfVwKXAouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX3htbF9wZSB7XAogIGNvbG9yOiByZ2IoMTA0LCAxMDQsIDkxKTtcCn1cClwKLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7XAogIGJhY2tncm91bmQ6IHJnYigxODEsIDIxMywgMjU1KTtcCn1cClwKLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wKICBiYWNrZ3JvdW5kOiByZ2IoMjUyLCAyNTUsIDApO1wKfVwKXAouYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RhY2sge1wKICBiYWNrZ3JvdW5kOiByZ2IoMTY0LCAyMjksIDEwMSk7XAp9XApcCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHtcCiAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4O1wKICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTkyLCAxOTIsIDE5Mik7XAp9XApcCi5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7XAogIGJhY2tncm91bmQ6IHJnYigyMzIsIDI0MiwgMjU0KTtcCn1cClwKLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX21ldGEuYWNlX3RhZyB7XAogIGNvbG9yOnJnYigyOCwgMiwgMjU1KTtcCn1cClwKLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wKICBiYWNrZ3JvdW5kOiByZ2IoMjUwLCAyNTAsIDI1NSk7XAogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigyMDAsIDIwMCwgMjUwKTtcCn1cClwKLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX3N0cmluZy5hY2VfcmVnZXgge1wKICBjb2xvcjogcmdiKDE5MiwgMCwgMTkyKTtcCn0iOwoKZXhwb3J0cy5jc3NDbGFzcyA9ICJhY2UtY3JpbXNvbi1lZGl0b3IiOwoKdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsKZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOwp9KTsKOwogICAgICAgICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgewogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KSgpOwogICAgICAgIA==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-crimson_editor.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvY3JpbXNvbl9lZGl0b3IiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7Yi5pc0Rhcms9ITEsYi5jc3NUZXh0PSIuYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfZWRpdG9yIHsgIGJvcmRlcjogMnB4IHNvbGlkIHJnYigxNTksIDE1OSwgMTU5KTt9LmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2VkaXRvci5hY2VfZm9jdXMgeyAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDt9LmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2d1dHRlciB7ICB3aWR0aDogNTBweDsgIGJhY2tncm91bmQ6ICNlOGU4ZTg7ICBjb2xvcjogIzMzMzsgIG92ZXJmbG93IDogaGlkZGVuO30uYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfZ3V0dGVyLWxheWVyIHsgIHdpZHRoOiAxMDAlOyAgdGV4dC1hbGlnbjogcmlnaHQ7fS5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9ndXR0ZXItbGF5ZXIgLmFjZV9ndXR0ZXItY2VsbCB7ICBwYWRkaW5nLXJpZ2h0OiA2cHg7fS5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9wcmludF9tYXJnaW4geyAgd2lkdGg6IDFweDsgIGJhY2tncm91bmQ6ICNlOGU4ZTg7fS5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV90ZXh0LWxheWVyIHsgIGN1cnNvcjogdGV4dDsgIGNvbG9yOiByZ2IoNjQsIDY0LCA2NCk7fS5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9jdXJzb3IgeyAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCBibGFjazt9LmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHsgIGJvcmRlci1sZWZ0OiAwcHg7ICBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fS5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2VfaW52aXNpYmxlIHsgIGNvbG9yOiByZ2IoMTkxLCAxOTEsIDE5MSk7fS5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2VfaWRlbnRpZmllciB7ICBjb2xvcjogYmxhY2s7fS5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2Vfa2V5d29yZCB7ICBjb2xvcjogYmx1ZTt9LmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfYnVpbGRpbiB7ICBjb2xvcjogcmdiKDg4LCA3MiwgMjQ2KTt9LmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2UgeyAgY29sb3I6IHJnYigyNTUsIDE1NiwgMCk7fS5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX2xpYnJhcnkgeyAgY29sb3I6IHJnYig2LCAxNTAsIDE0KTt9LmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV9pbnZhbGlkIHsgIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOyAgY29sb3I6IHJnYigyMjQsIDAsIDApO30uYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX2ZvbGQge30uYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHsgIGNvbG9yOiByZ2IoMTkyLCAwLCAwKTt9LmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV9jb25zdGFudCB7ICBjb2xvcjogcmdiKDYsIDE1MCwgMTQpO30uYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX3R5cGUsLmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV9jbGFzcyB7ICBjb2xvcjogcmdiKDEwOSwgMTIxLCAyMjIpO30uYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX2tleXdvcmQuYWNlX29wZXJhdG9yIHsgIGNvbG9yOiByZ2IoNDksIDEzMiwgMTQ5KTt9LmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV9zdHJpbmcgeyAgY29sb3I6IHJnYigxMjgsIDAsIDEyOCk7fS5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2VfY29tbWVudCB7ICBjb2xvcjogcmdiKDc2LCAxMzYsIDEwNyk7fS5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2VfY29tbWVudC5hY2VfZG9jIHsgIGNvbG9yOiByZ2IoMCwgMTAyLCAyNTUpO30uYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQuYWNlX2RvYy5hY2VfdGFnIHsgIGNvbG9yOiByZ2IoMTI4LCAxNTksIDE5MSk7fS5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMgeyAgY29sb3I6IHJnYigwLCAwLCA2NCk7fS5hY2UtY3JpbXNvbi1lZGl0b3IgLmFjZV9saW5lIC5hY2VfdmFyaWFibGUgeyAgY29sb3I6IHJnYigwLCA2NCwgMTI4KTt9LmFjZS1jcmltc29uLWVkaXRvciAuYWNlX2xpbmUgLmFjZV94bWxfcGUgeyAgY29sb3I6IHJnYigxMDQsIDEwNCwgOTEpO30uYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHsgIGJhY2tncm91bmQ6IHJnYigxODEsIDIxMywgMjU1KTt9LmFjZS1jcmltc29uLWVkaXRvciAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAgeyAgYmFja2dyb3VuZDogcmdiKDI1MiwgMjU1LCAwKTt9LmFjZS1jcmltc29uLWVkaXRvciAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0YWNrIHsgIGJhY2tncm91bmQ6IHJnYigxNjQsIDIyOSwgMTAxKTt9LmFjZS1jcmltc29uLWVkaXRvciAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQgeyAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4OyAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE5MiwgMTkyLCAxOTIpO30uYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUgeyAgYmFja2dyb3VuZDogcmdiKDIzMiwgMjQyLCAyNTQpO30uYWNlLWNyaW1zb24tZWRpdG9yIC5hY2VfbWV0YS5hY2VfdGFnIHsgIGNvbG9yOnJnYigyOCwgMiwgMjU1KTt9LmFjZS1jcmltc29uLWVkaXRvciAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQgeyAgYmFja2dyb3VuZDogcmdiKDI1MCwgMjUwLCAyNTUpOyAgYm9yZGVyOiAxcHggc29saWQgcmdiKDIwMCwgMjAwLCAyNTApO30uYWNlLWNyaW1zb24tZWRpdG9yIC5hY2Vfc3RyaW5nLmFjZV9yZWdleCB7ICBjb2xvcjogcmdiKDE5MiwgMCwgMTkyKTt9IixiLmNzc0NsYXNzPSJhY2UtY3JpbXNvbi1lZGl0b3IiO3ZhciBkPWEoIi4uL2xpYi9kb20iKTtkLmltcG9ydENzc1N0cmluZyhiLmNzc1RleHQsYi5jc3NDbGFzcyl9KSxmdW5jdGlvbigpe3dpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLGZ1bmN0aW9uKGEpe3dpbmRvdy5hY2V8fCh3aW5kb3cuYWNlPXt9KTtmb3IodmFyIGIgaW4gYSlhLmhhc093blByb3BlcnR5KGIpJiYoYWNlW2JdPWFbYl0pfSl9KCk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-dawn-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvdGhlbWUvZGF3bicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CgpleHBvcnRzLmlzRGFyayA9IGZhbHNlOwpleHBvcnRzLmNzc0NsYXNzID0gImFjZS1kYXduIjsKZXhwb3J0cy5jc3NUZXh0ID0gIlwKLmFjZS1kYXduIC5hY2VfZWRpdG9yIHtcCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wKfVwKXAouYWNlLWRhd24gLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHtcCiAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDtcCn1cClwKLmFjZS1kYXduIC5hY2VfZ3V0dGVyIHtcCiAgYmFja2dyb3VuZDogI2U4ZThlODtcCiAgY29sb3I6ICMzMzM7XAp9XApcCi5hY2UtZGF3biAuYWNlX3ByaW50X21hcmdpbiB7XAogIHdpZHRoOiAxcHg7XAogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XAp9XApcCi5hY2UtZGF3biAuYWNlX3Njcm9sbGVyIHtcCiAgYmFja2dyb3VuZC1jb2xvcjogI0Y5RjlGOTtcCn1cClwKLmFjZS1kYXduIC5hY2VfdGV4dC1sYXllciB7XAogIGN1cnNvcjogdGV4dDtcCiAgY29sb3I6ICMwODA4MDg7XAp9XApcCi5hY2UtZGF3biAuYWNlX2N1cnNvciB7XAogIGJvcmRlci1sZWZ0OiAycHggc29saWQgIzAwMDAwMDtcCn1cClwKLmFjZS1kYXduIC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUge1wKICBib3JkZXItbGVmdDogMHB4O1wKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzAwMDAwMDtcCn1cCiBcCi5hY2UtZGF3biAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7XAogIGJhY2tncm91bmQ6IHJnYmEoMzksIDk1LCAyNTUsIDAuMzApO1wKfVwKXAouYWNlLWRhd24gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwIHtcCiAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO1wKfVwKXAouYWNlLWRhd24gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHtcCiAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4O1wKICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDc1LCA3NSwgMTI2LCAwLjUwKTtcCn1cClwKLmFjZS1kYXduIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wKICBiYWNrZ3JvdW5kOiByZ2JhKDM2LCA5OSwgMTgwLCAwLjEyKTtcCn1cClwKLmFjZS1kYXduIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7XAogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMzksIDk1LCAyNTUsIDAuMzApO1wKfVwKICAgICAgIFwKLmFjZS1kYXduIC5hY2VfaW52aXNpYmxlIHtcCiAgY29sb3I6IHJnYmEoNzUsIDc1LCAxMjYsIDAuNTApO1wKfVwKXAouYWNlLWRhd24gLmFjZV9rZXl3b3JkIHtcCiAgY29sb3I6Izc5NDkzODtcCn1cClwKLmFjZS1kYXduIC5hY2VfY29uc3RhbnQge1wKICBjb2xvcjojODExRjI0O1wKfVwKXAouYWNlLWRhd24gLmFjZV9pbnZhbGlkLmFjZV9pbGxlZ2FsIHtcCiAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcCmZvbnQtc3R5bGU6aXRhbGljO1wKY29sb3I6I0Y4RjhGODtcCmJhY2tncm91bmQtY29sb3I6I0I1MkExRDtcCn1cClwKLmFjZS1kYXduIC5hY2VfaW52YWxpZC5hY2VfZGVwcmVjYXRlZCB7XAogIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XApmb250LXN0eWxlOml0YWxpYztcCmNvbG9yOiNCNTJBMUQ7XAp9XApcCi5hY2UtZGF3biAuYWNlX3N1cHBvcnQge1wKICBjb2xvcjojNjkxQzk3O1wKfVwKXAouYWNlLWRhd24gLmFjZV9mb2xkIHtcCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNzk0OTM4O1wKICAgIGJvcmRlci1jb2xvcjogIzA4MDgwODtcCn1cClwKLmFjZS1kYXduIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge1wKICBjb2xvcjojNjkzQTE3O1wKfVwKXAouYWNlLWRhd24gLmFjZV9zdHJpbmcge1wKICBjb2xvcjojMEI2MTI1O1wKfVwKXAouYWNlLWRhd24gLmFjZV9zdHJpbmcuYWNlX3JlZ2V4cCB7XAogIGNvbG9yOiNDRjU2Mjg7XAp9XApcCi5hY2UtZGF3biAuYWNlX2NvbW1lbnQge1wKICBmb250LXN0eWxlOml0YWxpYztcCmNvbG9yOiM1QTUyNUY7XAp9XApcCi5hY2UtZGF3biAuYWNlX3ZhcmlhYmxlIHtcCiAgY29sb3I6IzIzNEE5NztcCn1cClwKLmFjZS1kYXduIC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUge1wKICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XAp9XApcCi5hY2UtZGF3biAuYWNlX21hcmt1cC5hY2VfaGVhZGluZyB7XAogIGNvbG9yOiMxOTM1NkQ7XAp9XApcCi5hY2UtZGF3biAuYWNlX21hcmt1cC5hY2VfbGlzdCB7XAogIGNvbG9yOiM2OTNBMTc7XAp9IjsKCnZhciBkb20gPSByZXF1aXJlKCIuLi9saWIvZG9tIik7CmRvbS5pbXBvcnRDc3NTdHJpbmcoZXhwb3J0cy5jc3NUZXh0LCBleHBvcnRzLmNzc0NsYXNzKTsKfSk7CjsKICAgICAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkKICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkoKTsKICAgICAgICA=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-dawn.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvZGF3biIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGEsYixjKXtiLmlzRGFyaz0hMSxiLmNzc0NsYXNzPSJhY2UtZGF3biIsYi5jc3NUZXh0PSIuYWNlLWRhd24gLmFjZV9lZGl0b3IgeyAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO30uYWNlLWRhd24gLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHsgIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7fS5hY2UtZGF3biAuYWNlX2d1dHRlciB7ICBiYWNrZ3JvdW5kOiAjZThlOGU4OyAgY29sb3I6ICMzMzM7fS5hY2UtZGF3biAuYWNlX3ByaW50X21hcmdpbiB7ICB3aWR0aDogMXB4OyAgYmFja2dyb3VuZDogI2U4ZThlODt9LmFjZS1kYXduIC5hY2Vfc2Nyb2xsZXIgeyAgYmFja2dyb3VuZC1jb2xvcjogI0Y5RjlGOTt9LmFjZS1kYXduIC5hY2VfdGV4dC1sYXllciB7ICBjdXJzb3I6IHRleHQ7ICBjb2xvcjogIzA4MDgwODt9LmFjZS1kYXduIC5hY2VfY3Vyc29yIHsgIGJvcmRlci1sZWZ0OiAycHggc29saWQgIzAwMDAwMDt9LmFjZS1kYXduIC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUgeyAgYm9yZGVyLWxlZnQ6IDBweDsgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMDAwMDAwO30gLmFjZS1kYXduIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHsgIGJhY2tncm91bmQ6IHJnYmEoMzksIDk1LCAyNTUsIDAuMzApO30uYWNlLWRhd24gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwIHsgIGJhY2tncm91bmQ6IHJnYigxOTgsIDIxOSwgMTc0KTt9LmFjZS1kYXduIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7ICBtYXJnaW46IC0xcHggMCAwIC0xcHg7ICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDc1LCA3NSwgMTI2LCAwLjUwKTt9LmFjZS1kYXduIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUgeyAgYmFja2dyb3VuZDogcmdiYSgzNiwgOTksIDE4MCwgMC4xMik7fS5hY2UtZGF3biAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQgeyAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgzOSwgOTUsIDI1NSwgMC4zMCk7fSAgICAgICAuYWNlLWRhd24gLmFjZV9pbnZpc2libGUgeyAgY29sb3I6IHJnYmEoNzUsIDc1LCAxMjYsIDAuNTApO30uYWNlLWRhd24gLmFjZV9rZXl3b3JkIHsgIGNvbG9yOiM3OTQ5Mzg7fS5hY2UtZGF3biAuYWNlX2NvbnN0YW50IHsgIGNvbG9yOiM4MTFGMjQ7fS5hY2UtZGF3biAuYWNlX2ludmFsaWQuYWNlX2lsbGVnYWwgeyAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtmb250LXN0eWxlOml0YWxpYztjb2xvcjojRjhGOEY4O2JhY2tncm91bmQtY29sb3I6I0I1MkExRDt9LmFjZS1kYXduIC5hY2VfaW52YWxpZC5hY2VfZGVwcmVjYXRlZCB7ICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO2ZvbnQtc3R5bGU6aXRhbGljO2NvbG9yOiNCNTJBMUQ7fS5hY2UtZGF3biAuYWNlX3N1cHBvcnQgeyAgY29sb3I6IzY5MUM5Nzt9LmFjZS1kYXduIC5hY2VfZm9sZCB7ICAgIGJhY2tncm91bmQtY29sb3I6ICM3OTQ5Mzg7ICAgIGJvcmRlci1jb2xvcjogIzA4MDgwODt9LmFjZS1kYXduIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24geyAgY29sb3I6IzY5M0ExNzt9LmFjZS1kYXduIC5hY2Vfc3RyaW5nIHsgIGNvbG9yOiMwQjYxMjU7fS5hY2UtZGF3biAuYWNlX3N0cmluZy5hY2VfcmVnZXhwIHsgIGNvbG9yOiNDRjU2Mjg7fS5hY2UtZGF3biAuYWNlX2NvbW1lbnQgeyAgZm9udC1zdHlsZTppdGFsaWM7Y29sb3I6IzVBNTI1Rjt9LmFjZS1kYXduIC5hY2VfdmFyaWFibGUgeyAgY29sb3I6IzIzNEE5Nzt9LmFjZS1kYXduIC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUgeyAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30uYWNlLWRhd24gLmFjZV9tYXJrdXAuYWNlX2hlYWRpbmcgeyAgY29sb3I6IzE5MzU2RDt9LmFjZS1kYXduIC5hY2VfbWFya3VwLmFjZV9saXN0IHsgIGNvbG9yOiM2OTNBMTc7fSI7dmFyIGQ9YSgiLi4vbGliL2RvbSIpO2QuaW1wb3J0Q3NzU3RyaW5nKGIuY3NzVGV4dCxiLmNzc0NsYXNzKX0pLGZ1bmN0aW9uKCl7d2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sZnVuY3Rpb24oYSl7d2luZG93LmFjZXx8KHdpbmRvdy5hY2U9e30pO2Zvcih2YXIgYiBpbiBhKWEuaGFzT3duUHJvcGVydHkoYikmJihhY2VbYl09YVtiXSl9KX0oKQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-dreamweaver-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBBZGFtIEppbWVuZXogPGFkYW0gQVQgc2hpZnRjcmVhdGUgRE9UIGNvbT4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL3RoZW1lL2RyZWFtd2VhdmVyJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKZXhwb3J0cy5pc0RhcmsgPSBmYWxzZTsKZXhwb3J0cy5jc3NDbGFzcyA9ICJhY2UtdG0iOwpleHBvcnRzLmNzc1RleHQgPSAiLmFjZS10bSAuYWNlX2VkaXRvciB7XAogIGJvcmRlcjogMnB4IHNvbGlkIHJnYigxNTksIDE1OSwgMTU5KTtcCn1cClwKLmFjZS10bSAuYWNlX2VkaXRvci5hY2VfZm9jdXMge1wKICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO1wKfVwKXAouYWNlLXRtIC5hY2VfZ3V0dGVyIHtcCiAgYmFja2dyb3VuZDogI2U4ZThlODtcCiAgY29sb3I6ICMzMzM7XAp9XApcCi5hY2UtdG0gLmFjZV9wcmludF9tYXJnaW4ge1wKICB3aWR0aDogMXB4O1wKICBiYWNrZ3JvdW5kOiAjZThlOGU4O1wKfVwKXAouYWNlLXRtIC5hY2VfZm9sZCB7XAogICAgYmFja2dyb3VuZC1jb2xvcjogIzAwRjtcCn1cClwKLmFjZS10bSAuYWNlX3RleHQtbGF5ZXIge1wKICBjdXJzb3I6IHRleHQ7XAp9XApcCi5hY2UtdG0gLmFjZV9jdXJzb3Ige1wKICBib3JkZXItbGVmdDogMnB4IHNvbGlkIGJsYWNrO1wKfVwKXAouYWNlLXRtIC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUge1wKICBib3JkZXItbGVmdDogMHB4O1wKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7XAp9XAogICAgICAgIFwKLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9pbnZpc2libGUge1wKICBjb2xvcjogcmdiKDE5MSwgMTkxLCAxOTEpO1wKfVwKXAouYWNlLXRtIC5hY2VfbGluZSAuYWNlX2tleXdvcmQge1wKICBjb2xvcjogYmx1ZTtcCn1cClwKLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfYnVpbGRpbiB7XAogIGNvbG9yOiByZ2IoODgsIDcyLCAyNDYpO1wKfVwKXAouYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7XAogIGNvbG9yOiByZ2IoODgsIDkyLCAyNDYpO1wKfVwKXAouYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9saWJyYXJ5IHtcCiAgY29sb3I6IHJnYig2LCAxNTAsIDE0KTtcCn1cClwKLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9pbnZhbGlkIHtcCiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDE1MywgMCwgMCk7XAogIGNvbG9yOiB3aGl0ZTtcCn1cClwKLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7XAogIGNvbG9yOiByZ2IoNjAsIDc2LCAxMTQpO1wKfVwKXAouYWNlLXRtIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX2NvbnN0YW50IHtcCiAgY29sb3I6IHJnYig2LCAxNTAsIDE0KTtcCn1cClwKLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV90eXBlLFwKLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV9jbGFzcyB7XAogIGNvbG9yOiAjMDA5O1wKfVwKXAouYWNlLXRtIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX3BocF90YWcge1wKICBjb2xvcjogI2YwMDtcCn1cClwKLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7XAogIGNvbG9yOiByZ2IoMTA0LCAxMTgsIDEzNSk7XAp9XApcCi5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfc3RyaW5nIHtcCiAgY29sb3I6ICMwMEY7XAp9XApcCi5hY2UtdG0gLmFjZV9saW5lIC5hY2VfY29tbWVudCB7XAogIGNvbG9yOiByZ2IoNzYsIDEzNiwgMTA3KTtcCn1cClwKLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb21tZW50LmFjZV9kb2Mge1wKICBjb2xvcjogcmdiKDAsIDEwMiwgMjU1KTtcCn1cClwKLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb21tZW50LmFjZV9kb2MuYWNlX3RhZyB7XAogIGNvbG9yOiByZ2IoMTI4LCAxNTksIDE5MSk7XAp9XApcCi5hY2UtdG0gLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMge1wKICBjb2xvcjogcmdiKDAsIDAsIDIwNSk7XAp9XApcCi5hY2UtdG0gLmFjZV9saW5lIC5hY2VfdmFyaWFibGUge1wKICBjb2xvcjogIzA2RlwKfVwKXAouYWNlLXRtIC5hY2VfbGluZSAuYWNlX3htbF9wZSB7XAogIGNvbG9yOiByZ2IoMTA0LCAxMDQsIDkxKTtcCn1cClwKLmFjZS10bSAuYWNlX2VudGl0eS5hY2VfbmFtZS5hY2VfZnVuY3Rpb24ge1wKICBjb2xvcjogIzAwRjtcCn1cClwKLmFjZS10bSAuYWNlX21hcmt1cC5hY2VfbWFya3VwaW5lIHtcCiAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wKfVwKXAouYWNlLXRtIC5hY2VfbWFya3VwLmFjZV9oZWFkaW5nIHtcCiAgY29sb3I6IHJnYigxMiwgNywgMjU1KTtcCn1cClwKLmFjZS10bSAuYWNlX21hcmt1cC5hY2VfbGlzdCB7XAogIGNvbG9yOnJnYigxODUsIDYsIDE0NCk7XAp9XApcCi5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wKICBiYWNrZ3JvdW5kOiByZ2IoMTgxLCAyMTMsIDI1NSk7XAp9XApcCi5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwIHtcCiAgYmFja2dyb3VuZDogcmdiKDI1MiwgMjU1LCAwKTtcCn1cClwKLmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0YWNrIHtcCiAgYmFja2dyb3VuZDogcmdiKDE2NCwgMjI5LCAxMDEpO1wKfVwKXAouYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7XAogIG1hcmdpbjogLTFweCAwIDAgLTFweDtcCiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE5MiwgMTkyLCAxOTIpO1wKfVwKXAouYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wKICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDcpO1wKfVwKXAouYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7XAogIGJhY2tncm91bmQ6IHJnYigyNTAsIDI1MCwgMjU1KTtcCiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDIwMCwgMjAwLCAyNTApO1wKfVwKXAouYWNlLXRtIC5hY2VfbWV0YS5hY2VfdGFnIHtcCiAgY29sb3I6IzAwOTtcCn1cClwKLmFjZS10bSAuYWNlX21ldGEuYWNlX3RhZy5hY2VfYW5jaG9yIHtcCiAgY29sb3I6IzA2MDtcCn1cClwKLmFjZS10bSAuYWNlX21ldGEuYWNlX3RhZy5hY2VfZm9ybSB7XAogIGNvbG9yOiNGOTA7XAp9XApcCi5hY2UtdG0gLmFjZV9tZXRhLmFjZV90YWcuYWNlX2ltYWdlIHtcCiAgY29sb3I6IzkwOTtcCn1cClwKLmFjZS10bSAuYWNlX21ldGEuYWNlX3RhZy5hY2Vfc2NyaXB0IHtcCiAgY29sb3I6IzkwMDtcCn1cClwKLmFjZS10bSAuYWNlX21ldGEuYWNlX3RhZy5hY2Vfc3R5bGUge1wKICBjb2xvcjojOTA5O1wKfVwKXAouYWNlLXRtIC5hY2VfbWV0YS5hY2VfdGFnLmFjZV90YWJsZSB7XAogIGNvbG9yOiMwOTk7XAp9XApcCi5hY2UtdG0gLmFjZV9zdHJpbmcuYWNlX3JlZ2V4IHtcCiAgY29sb3I6IHJnYigyNTUsIDAsIDApXAp9IjsKCnZhciBkb20gPSByZXF1aXJlKCIuLi9saWIvZG9tIik7CmRvbS5pbXBvcnRDc3NTdHJpbmcoZXhwb3J0cy5jc3NUZXh0LCBleHBvcnRzLmNzc0NsYXNzKTsKfSk7CjsKICAgICAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkKICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkoKTsKICAgICAgICA=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-dreamweaver.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvZHJlYW13ZWF2ZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7Yi5pc0Rhcms9ITEsYi5jc3NDbGFzcz0iYWNlLXRtIixiLmNzc1RleHQ9Ii5hY2UtdG0gLmFjZV9lZGl0b3IgeyAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO30uYWNlLXRtIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7ICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO30uYWNlLXRtIC5hY2VfZ3V0dGVyIHsgIGJhY2tncm91bmQ6ICNlOGU4ZTg7ICBjb2xvcjogIzMzMzt9LmFjZS10bSAuYWNlX3ByaW50X21hcmdpbiB7ICB3aWR0aDogMXB4OyAgYmFja2dyb3VuZDogI2U4ZThlODt9LmFjZS10bSAuYWNlX2ZvbGQgeyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDBGO30uYWNlLXRtIC5hY2VfdGV4dC1sYXllciB7ICBjdXJzb3I6IHRleHQ7fS5hY2UtdG0gLmFjZV9jdXJzb3IgeyAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCBibGFjazt9LmFjZS10bSAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHsgIGJvcmRlci1sZWZ0OiAwcHg7ICBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fSAgICAgICAgLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9pbnZpc2libGUgeyAgY29sb3I6IHJnYigxOTEsIDE5MSwgMTkxKTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9rZXl3b3JkIHsgIGNvbG9yOiBibHVlO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9idWlsZGluIHsgIGNvbG9yOiByZ2IoODgsIDcyLCAyNDYpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7ICBjb2xvcjogcmdiKDg4LCA5MiwgMjQ2KTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfbGlicmFyeSB7ICBjb2xvcjogcmdiKDYsIDE1MCwgMTQpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX2ludmFsaWQgeyAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDE1MywgMCwgMCk7ICBjb2xvcjogd2hpdGU7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24geyAgY29sb3I6IHJnYig2MCwgNzYsIDExNCk7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfY29uc3RhbnQgeyAgY29sb3I6IHJnYig2LCAxNTAsIDE0KTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9zdXBwb3J0LmFjZV90eXBlLC5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfY2xhc3MgeyAgY29sb3I6ICMwMDk7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfcGhwX3RhZyB7ICBjb2xvcjogI2YwMDt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7ICBjb2xvcjogcmdiKDEwNCwgMTE4LCAxMzUpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX3N0cmluZyB7ICBjb2xvcjogIzAwRjt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb21tZW50IHsgIGNvbG9yOiByZ2IoNzYsIDEzNiwgMTA3KTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb21tZW50LmFjZV9kb2MgeyAgY29sb3I6IHJnYigwLCAxMDIsIDI1NSk7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2VfY29tbWVudC5hY2VfZG9jLmFjZV90YWcgeyAgY29sb3I6IHJnYigxMjgsIDE1OSwgMTkxKTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfbnVtZXJpYyB7ICBjb2xvcjogcmdiKDAsIDAsIDIwNSk7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2VfdmFyaWFibGUgeyAgY29sb3I6ICMwNkZ9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV94bWxfcGUgeyAgY29sb3I6IHJnYigxMDQsIDEwNCwgOTEpO30uYWNlLXRtIC5hY2VfZW50aXR5LmFjZV9uYW1lLmFjZV9mdW5jdGlvbiB7ICBjb2xvcjogIzAwRjt9LmFjZS10bSAuYWNlX21hcmt1cC5hY2VfbWFya3VwaW5lIHsgICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9LmFjZS10bSAuYWNlX21hcmt1cC5hY2VfaGVhZGluZyB7ICBjb2xvcjogcmdiKDEyLCA3LCAyNTUpO30uYWNlLXRtIC5hY2VfbWFya3VwLmFjZV9saXN0IHsgIGNvbG9yOnJnYigxODUsIDYsIDE0NCk7fS5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24geyAgYmFja2dyb3VuZDogcmdiKDE4MSwgMjEzLCAyNTUpO30uYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7ICBiYWNrZ3JvdW5kOiByZ2IoMjUyLCAyNTUsIDApO30uYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RhY2sgeyAgYmFja2dyb3VuZDogcmdiKDE2NCwgMjI5LCAxMDEpO30uYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7ICBtYXJnaW46IC0xcHggMCAwIC0xcHg7ICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTkyLCAxOTIsIDE5Mik7fS5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7ICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDcpO30uYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7ICBiYWNrZ3JvdW5kOiByZ2IoMjUwLCAyNTAsIDI1NSk7ICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMjAwLCAyMDAsIDI1MCk7fS5hY2UtdG0gLmFjZV9tZXRhLmFjZV90YWcgeyAgY29sb3I6IzAwOTt9LmFjZS10bSAuYWNlX21ldGEuYWNlX3RhZy5hY2VfYW5jaG9yIHsgIGNvbG9yOiMwNjA7fS5hY2UtdG0gLmFjZV9tZXRhLmFjZV90YWcuYWNlX2Zvcm0geyAgY29sb3I6I0Y5MDt9LmFjZS10bSAuYWNlX21ldGEuYWNlX3RhZy5hY2VfaW1hZ2UgeyAgY29sb3I6IzkwOTt9LmFjZS10bSAuYWNlX21ldGEuYWNlX3RhZy5hY2Vfc2NyaXB0IHsgIGNvbG9yOiM5MDA7fS5hY2UtdG0gLmFjZV9tZXRhLmFjZV90YWcuYWNlX3N0eWxlIHsgIGNvbG9yOiM5MDk7fS5hY2UtdG0gLmFjZV9tZXRhLmFjZV90YWcuYWNlX3RhYmxlIHsgIGNvbG9yOiMwOTk7fS5hY2UtdG0gLmFjZV9zdHJpbmcuYWNlX3JlZ2V4IHsgIGNvbG9yOiByZ2IoMjU1LCAwLCAwKX0iO3ZhciBkPWEoIi4uL2xpYi9kb20iKTtkLmltcG9ydENzc1N0cmluZyhiLmNzc1RleHQsYi5jc3NDbGFzcyl9KSxmdW5jdGlvbigpe3dpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLGZ1bmN0aW9uKGEpe3dpbmRvdy5hY2V8fCh3aW5kb3cuYWNlPXt9KTtmb3IodmFyIGIgaW4gYSlhLmhhc093blByb3BlcnR5KGIpJiYoYWNlW2JdPWFbYl0pfSl9KCk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-eclipse-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvdGhlbWUvZWNsaXBzZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCmV4cG9ydHMuaXNEYXJrID0gZmFsc2U7CmV4cG9ydHMuY3NzVGV4dCA9ICIuYWNlLWVjbGlwc2UgLmFjZV9lZGl0b3Ige1wKICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7XAp9XApcCi5hY2UtZWNsaXBzZSAuYWNlX2VkaXRvci5hY2VfZm9jdXMge1wKICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO1wKfVwKXAouYWNlLWVjbGlwc2UgLmFjZV9ndXR0ZXIge1wKICBiYWNrZ3JvdW5kOiByZ2IoMjI3LCAyMjcsIDIyNyk7XAogIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHJnYigxNTksIDE1OSwgMTU5KTtcCiAgY29sb3I6IHJnYigxMzYsIDEzNiwgMTM2KTtcCn1cClwKLmFjZS1lY2xpcHNlIC5hY2VfcHJpbnRfbWFyZ2luIHtcCiAgd2lkdGg6IDFweDtcCiAgYmFja2dyb3VuZDogI2IxYjRiYTtcCn1cClwKLmFjZS1lY2xpcHNlIC5hY2VfZm9sZCB7XAogICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDYwLCA3NiwgMTE0KTtcCn1cClwKLmFjZS1lY2xpcHNlIC5hY2VfdGV4dC1sYXllciB7XAogIGN1cnNvcjogdGV4dDtcCn1cClwKLmFjZS1lY2xpcHNlIC5hY2VfY3Vyc29yIHtcCiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCBibGFjaztcCn1cClwKLmFjZS1lY2xpcHNlIC5hY2VfbGluZSAuYWNlX2tleXdvcmQsIC5hY2UtZWNsaXBzZSAuYWNlX2xpbmUgLmFjZV92YXJpYWJsZSB7XAogIGNvbG9yOiByZ2IoMTI3LCAwLCA4NSk7XAp9XApcCi5hY2UtZWNsaXBzZSAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfYnVpbGRpbiB7XAogIGNvbG9yOiByZ2IoODgsIDcyLCAyNDYpO1wKfVwKXAouYWNlLWVjbGlwc2UgLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX2xpYnJhcnkge1wKICBjb2xvcjogcmdiKDYsIDE1MCwgMTQpO1wKfVwKXAouYWNlLWVjbGlwc2UgLmFjZV9saW5lIC5hY2VfZnVuY3Rpb24ge1wKICBjb2xvcjogcmdiKDYwLCA3NiwgMTE0KTtcCn1cClwKLmFjZS1lY2xpcHNlIC5hY2VfbGluZSAuYWNlX3N0cmluZyB7XAogIGNvbG9yOiByZ2IoNDIsIDAsIDI1NSk7XAp9XApcCi5hY2UtZWNsaXBzZSAuYWNlX2xpbmUgLmFjZV9jb21tZW50IHtcCiAgY29sb3I6IHJnYig2MywgMTI3LCA5NSk7XAp9XApcCi5hY2UtZWNsaXBzZSAuYWNlX2xpbmUgLmFjZV9jb21tZW50LmFjZV9kb2Mge1wKICBjb2xvcjogcmdiKDYzLCA5NSwgMTkxKTtcCn1cClwKLmFjZS1lY2xpcHNlIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQuYWNlX2RvYy5hY2VfdGFnIHtcCiAgY29sb3I6IHJnYigxMjcsIDE1OSwgMTkxKTtcCn1cClwKLmFjZS1lY2xpcHNlIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHtcCn1cClwKLmFjZS1lY2xpcHNlIC5hY2VfbGluZSAuYWNlX3RhZyB7XAogIGNvbG9yOiByZ2IoNjMsIDEyNywgMTI3KTtcCn1cClwKLmFjZS1lY2xpcHNlIC5hY2VfbGluZSAuYWNlX3R5cGUge1wKICBjb2xvcjogcmdiKDEyNywgMCwgMTI3KTtcCn1cClwKLmFjZS1lY2xpcHNlIC5hY2VfbGluZSAuYWNlX3htbF9wZSB7XAogIGNvbG9yOiByZ2IoMTA0LCAxMDQsIDkxKTtcCn1cClwKLmFjZS1lY2xpcHNlIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHtcCiAgYmFja2dyb3VuZDogcmdiKDE4MSwgMjEzLCAyNTUpO1wKfVwKXAouYWNlLWVjbGlwc2UgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHtcCiAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4O1wKICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTkyLCAxOTIsIDE5Mik7XAp9XApcCi5hY2UtZWNsaXBzZSAuYWNlX2xpbmUgLmFjZV9tZXRhLmFjZV90YWcge1wKICBjb2xvcjpyZ2IoNjMsIDEyNywgMTI3KTtcCn1cClwKLmFjZS1lY2xpcHNlIC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUge1wKICBjb2xvcjpyZ2IoMTI3LCAwLCAxMjcpO1wKfVwKXAouYWNlLWVjbGlwc2UgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7XAogIGJhY2tncm91bmQ6IHJnYigyMzIsIDI0MiwgMjU0KTtcCn0iOwoKZXhwb3J0cy5jc3NDbGFzcyA9ICJhY2UtZWNsaXBzZSI7Cgp2YXIgZG9tID0gcmVxdWlyZSgiLi4vbGliL2RvbSIpOwpkb20uaW1wb3J0Q3NzU3RyaW5nKGV4cG9ydHMuY3NzVGV4dCwgZXhwb3J0cy5jc3NDbGFzcyk7Cn0pOwo7CiAgICAgICAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAg]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-eclipse.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvZWNsaXBzZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCIsYi5pc0Rhcms9ITEsYi5jc3NUZXh0PSIuYWNlLWVjbGlwc2UgLmFjZV9lZGl0b3IgeyAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO30uYWNlLWVjbGlwc2UgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHsgIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7fS5hY2UtZWNsaXBzZSAuYWNlX2d1dHRlciB7ICBiYWNrZ3JvdW5kOiByZ2IoMjI3LCAyMjcsIDIyNyk7ICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7ICBjb2xvcjogcmdiKDEzNiwgMTM2LCAxMzYpO30uYWNlLWVjbGlwc2UgLmFjZV9wcmludF9tYXJnaW4geyAgd2lkdGg6IDFweDsgIGJhY2tncm91bmQ6ICNiMWI0YmE7fS5hY2UtZWNsaXBzZSAuYWNlX2ZvbGQgeyAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoNjAsIDc2LCAxMTQpO30uYWNlLWVjbGlwc2UgLmFjZV90ZXh0LWxheWVyIHsgIGN1cnNvcjogdGV4dDt9LmFjZS1lY2xpcHNlIC5hY2VfY3Vyc29yIHsgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgYmxhY2s7fS5hY2UtZWNsaXBzZSAuYWNlX2xpbmUgLmFjZV9rZXl3b3JkLCAuYWNlLWVjbGlwc2UgLmFjZV9saW5lIC5hY2VfdmFyaWFibGUgeyAgY29sb3I6IHJnYigxMjcsIDAsIDg1KTt9LmFjZS1lY2xpcHNlIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9idWlsZGluIHsgIGNvbG9yOiByZ2IoODgsIDcyLCAyNDYpO30uYWNlLWVjbGlwc2UgLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX2xpYnJhcnkgeyAgY29sb3I6IHJnYig2LCAxNTAsIDE0KTt9LmFjZS1lY2xpcHNlIC5hY2VfbGluZSAuYWNlX2Z1bmN0aW9uIHsgIGNvbG9yOiByZ2IoNjAsIDc2LCAxMTQpO30uYWNlLWVjbGlwc2UgLmFjZV9saW5lIC5hY2Vfc3RyaW5nIHsgIGNvbG9yOiByZ2IoNDIsIDAsIDI1NSk7fS5hY2UtZWNsaXBzZSAuYWNlX2xpbmUgLmFjZV9jb21tZW50IHsgIGNvbG9yOiByZ2IoNjMsIDEyNywgOTUpO30uYWNlLWVjbGlwc2UgLmFjZV9saW5lIC5hY2VfY29tbWVudC5hY2VfZG9jIHsgIGNvbG9yOiByZ2IoNjMsIDk1LCAxOTEpO30uYWNlLWVjbGlwc2UgLmFjZV9saW5lIC5hY2VfY29tbWVudC5hY2VfZG9jLmFjZV90YWcgeyAgY29sb3I6IHJnYigxMjcsIDE1OSwgMTkxKTt9LmFjZS1lY2xpcHNlIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHt9LmFjZS1lY2xpcHNlIC5hY2VfbGluZSAuYWNlX3RhZyB7ICBjb2xvcjogcmdiKDYzLCAxMjcsIDEyNyk7fS5hY2UtZWNsaXBzZSAuYWNlX2xpbmUgLmFjZV90eXBlIHsgIGNvbG9yOiByZ2IoMTI3LCAwLCAxMjcpO30uYWNlLWVjbGlwc2UgLmFjZV9saW5lIC5hY2VfeG1sX3BlIHsgIGNvbG9yOiByZ2IoMTA0LCAxMDQsIDkxKTt9LmFjZS1lY2xpcHNlIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHsgIGJhY2tncm91bmQ6IHJnYigxODEsIDIxMywgMjU1KTt9LmFjZS1lY2xpcHNlIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7ICBtYXJnaW46IC0xcHggMCAwIC0xcHg7ICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTkyLCAxOTIsIDE5Mik7fS5hY2UtZWNsaXBzZSAuYWNlX2xpbmUgLmFjZV9tZXRhLmFjZV90YWcgeyAgY29sb3I6cmdiKDYzLCAxMjcsIDEyNyk7fS5hY2UtZWNsaXBzZSAuYWNlX2VudGl0eS5hY2Vfb3RoZXIuYWNlX2F0dHJpYnV0ZS1uYW1lIHsgIGNvbG9yOnJnYigxMjcsIDAsIDEyNyk7fS5hY2UtZWNsaXBzZSAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHsgIGJhY2tncm91bmQ6IHJnYigyMzIsIDI0MiwgMjU0KTt9IixiLmNzc0NsYXNzPSJhY2UtZWNsaXBzZSI7dmFyIGQ9YSgiLi4vbGliL2RvbSIpO2QuaW1wb3J0Q3NzU3RyaW5nKGIuY3NzVGV4dCxiLmNzc0NsYXNzKX0pLGZ1bmN0aW9uKCl7d2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sZnVuY3Rpb24oYSl7d2luZG93LmFjZXx8KHdpbmRvdy5hY2U9e30pO2Zvcih2YXIgYiBpbiBhKWEuaGFzT3duUHJvcGVydHkoYikmJihhY2VbYl09YVtiXSl9KX0oKQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-idle_fingers-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvdGhlbWUvaWRsZV9maW5nZXJzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKCmV4cG9ydHMuaXNEYXJrID0gdHJ1ZTsKZXhwb3J0cy5jc3NDbGFzcyA9ICJhY2UtaWRsZS1maW5nZXJzIjsKZXhwb3J0cy5jc3NUZXh0ID0gIlwKLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9lZGl0b3Ige1wKICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7XAp9XApcCi5hY2UtaWRsZS1maW5nZXJzIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7XAogIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7XAp9XApcCi5hY2UtaWRsZS1maW5nZXJzIC5hY2VfZ3V0dGVyIHtcCiAgYmFja2dyb3VuZDogI2U4ZThlODtcCiAgY29sb3I6ICMzMzM7XAp9XApcCi5hY2UtaWRsZS1maW5nZXJzIC5hY2VfcHJpbnRfbWFyZ2luIHtcCiAgd2lkdGg6IDFweDtcCiAgYmFja2dyb3VuZDogI2U4ZThlODtcCn1cClwKLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9zY3JvbGxlciB7XAogIGJhY2tncm91bmQtY29sb3I6ICMzMjMyMzI7XAp9XApcCi5hY2UtaWRsZS1maW5nZXJzIC5hY2VfdGV4dC1sYXllciB7XAogIGN1cnNvcjogdGV4dDtcCiAgY29sb3I6ICNGRkZGRkY7XAp9XApcCi5hY2UtaWRsZS1maW5nZXJzIC5hY2VfY3Vyc29yIHtcCiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjOTFGRjAwO1wKfVwKXAouYWNlLWlkbGUtZmluZ2VycyAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHtcCiAgYm9yZGVyLWxlZnQ6IDBweDtcCiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM5MUZGMDA7XAp9XAogXAouYWNlLWlkbGUtZmluZ2VycyAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7XAogIGJhY2tncm91bmQ6IHJnYmEoOTAsIDEwMCwgMTI2LCAwLjg4KTtcCn1cClwKLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwIHtcCiAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO1wKfVwKXAouYWNlLWlkbGUtZmluZ2VycyAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge1wKICBtYXJnaW46IC0xcHggMCAwIC0xcHg7XAogIGJvcmRlcjogMXB4IHNvbGlkICM0MDQwNDA7XAp9XApcCi5hY2UtaWRsZS1maW5nZXJzIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wKICBiYWNrZ3JvdW5kOiAjMzUzNjM3O1wKfVwKXAouYWNlLWlkbGUtZmluZ2VycyAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQge1wKICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDkwLCAxMDAsIDEyNiwgMC44OCk7XAp9XAogICAgICAgXAouYWNlLWlkbGUtZmluZ2VycyAuYWNlX2ludmlzaWJsZSB7XAogIGNvbG9yOiAjNDA0MDQwO1wKfVwKXAouYWNlLWlkbGUtZmluZ2VycyAuYWNlX2tleXdvcmQge1wKICBjb2xvcjojQ0M3ODMzO1wKfVwKXAouYWNlLWlkbGUtZmluZ2VycyAuYWNlX2NvbnN0YW50IHtcCiAgY29sb3I6IzZDOTlCQjtcCn1cClwKLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9pbnZhbGlkIHtcCiAgY29sb3I6I0ZGRkZGRjtcCmJhY2tncm91bmQtY29sb3I6I0ZGMDAwMDtcCn1cClwKLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9mb2xkIHtcCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0M3ODMzO1wKICAgIGJvcmRlci1jb2xvcjogI0ZGRkZGRjtcCn1cClwKLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7XAogIGNvbG9yOiNCODM0MjY7XAp9XApcCi5hY2UtaWRsZS1maW5nZXJzIC5hY2Vfc3RyaW5nIHtcCiAgY29sb3I6I0E1QzI2MTtcCn1cClwKLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9zdHJpbmcuYWNlX3JlZ2V4cCB7XAogIGNvbG9yOiNDQ0NDMzM7XAp9XApcCi5hY2UtaWRsZS1maW5nZXJzIC5hY2VfY29tbWVudCB7XAogIGZvbnQtc3R5bGU6aXRhbGljO1wKY29sb3I6I0JDOTQ1ODtcCn1cClwKLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9tZXRhLmFjZV90YWcge1wKICBjb2xvcjojRkZFNUJCO1wKfVwKXAouYWNlLWlkbGUtZmluZ2VycyAuYWNlX2VudGl0eS5hY2VfbmFtZSB7XAogIGNvbG9yOiNGRkM2NkQ7XAp9XApcCi5hY2UtaWRsZS1maW5nZXJzIC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUge1wKICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XAp9XApcCi5hY2UtaWRsZS1maW5nZXJzIC5hY2VfY29sbGFiLmFjZV91c2VyMSB7XAogIGNvbG9yOiMzMjMyMzI7XApiYWNrZ3JvdW5kLWNvbG9yOiNGRkY5ODA7ICAgXAp9IjsKCnZhciBkb20gPSByZXF1aXJlKCIuLi9saWIvZG9tIik7CmRvbS5pbXBvcnRDc3NTdHJpbmcoZXhwb3J0cy5jc3NUZXh0LCBleHBvcnRzLmNzc0NsYXNzKTsKfSk7CjsKICAgICAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkKICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkoKTsKICAgICAgICA=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-idle_fingers.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvaWRsZV9maW5nZXJzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oYSxiLGMpe2IuaXNEYXJrPSEwLGIuY3NzQ2xhc3M9ImFjZS1pZGxlLWZpbmdlcnMiLGIuY3NzVGV4dD0iLmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9lZGl0b3IgeyAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO30uYWNlLWlkbGUtZmluZ2VycyAuYWNlX2VkaXRvci5hY2VfZm9jdXMgeyAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDt9LmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9ndXR0ZXIgeyAgYmFja2dyb3VuZDogI2U4ZThlODsgIGNvbG9yOiAjMzMzO30uYWNlLWlkbGUtZmluZ2VycyAuYWNlX3ByaW50X21hcmdpbiB7ICB3aWR0aDogMXB4OyAgYmFja2dyb3VuZDogI2U4ZThlODt9LmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9zY3JvbGxlciB7ICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzIzMjMyO30uYWNlLWlkbGUtZmluZ2VycyAuYWNlX3RleHQtbGF5ZXIgeyAgY3Vyc29yOiB0ZXh0OyAgY29sb3I6ICNGRkZGRkY7fS5hY2UtaWRsZS1maW5nZXJzIC5hY2VfY3Vyc29yIHsgIGJvcmRlci1sZWZ0OiAycHggc29saWQgIzkxRkYwMDt9LmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7ICBib3JkZXItbGVmdDogMHB4OyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM5MUZGMDA7fSAuYWNlLWlkbGUtZmluZ2VycyAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7ICBiYWNrZ3JvdW5kOiByZ2JhKDkwLCAxMDAsIDEyNiwgMC44OCk7fS5hY2UtaWRsZS1maW5nZXJzIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7ICBiYWNrZ3JvdW5kOiByZ2IoMTk4LCAyMTksIDE3NCk7fS5hY2UtaWRsZS1maW5nZXJzIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7ICBtYXJnaW46IC0xcHggMCAwIC0xcHg7ICBib3JkZXI6IDFweCBzb2xpZCAjNDA0MDQwO30uYWNlLWlkbGUtZmluZ2VycyAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHsgIGJhY2tncm91bmQ6ICMzNTM2Mzc7fS5hY2UtaWRsZS1maW5nZXJzIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7ICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDkwLCAxMDAsIDEyNiwgMC44OCk7fSAgICAgICAuYWNlLWlkbGUtZmluZ2VycyAuYWNlX2ludmlzaWJsZSB7ICBjb2xvcjogIzQwNDA0MDt9LmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9rZXl3b3JkIHsgIGNvbG9yOiNDQzc4MzM7fS5hY2UtaWRsZS1maW5nZXJzIC5hY2VfY29uc3RhbnQgeyAgY29sb3I6IzZDOTlCQjt9LmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9pbnZhbGlkIHsgIGNvbG9yOiNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjojRkYwMDAwO30uYWNlLWlkbGUtZmluZ2VycyAuYWNlX2ZvbGQgeyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0M3ODMzOyAgICBib3JkZXItY29sb3I6ICNGRkZGRkY7fS5hY2UtaWRsZS1maW5nZXJzIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24geyAgY29sb3I6I0I4MzQyNjt9LmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9zdHJpbmcgeyAgY29sb3I6I0E1QzI2MTt9LmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9zdHJpbmcuYWNlX3JlZ2V4cCB7ICBjb2xvcjojQ0NDQzMzO30uYWNlLWlkbGUtZmluZ2VycyAuYWNlX2NvbW1lbnQgeyAgZm9udC1zdHlsZTppdGFsaWM7Y29sb3I6I0JDOTQ1ODt9LmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9tZXRhLmFjZV90YWcgeyAgY29sb3I6I0ZGRTVCQjt9LmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9lbnRpdHkuYWNlX25hbWUgeyAgY29sb3I6I0ZGQzY2RDt9LmFjZS1pZGxlLWZpbmdlcnMgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7ICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fS5hY2UtaWRsZS1maW5nZXJzIC5hY2VfY29sbGFiLmFjZV91c2VyMSB7ICBjb2xvcjojMzIzMjMyO2JhY2tncm91bmQtY29sb3I6I0ZGRjk4MDsgICB9Ijt2YXIgZD1hKCIuLi9saWIvZG9tIik7ZC5pbXBvcnRDc3NTdHJpbmcoYi5jc3NUZXh0LGIuY3NzQ2xhc3MpfSksZnVuY3Rpb24oKXt3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSxmdW5jdGlvbihhKXt3aW5kb3cuYWNlfHwod2luZG93LmFjZT17fSk7Zm9yKHZhciBiIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShiKSYmKGFjZVtiXT1hW2JdKX0pfSgp]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-kr_theme-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvdGhlbWUva3JfdGhlbWUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoKZXhwb3J0cy5pc0RhcmsgPSB0cnVlOwpleHBvcnRzLmNzc0NsYXNzID0gImFjZS1rci10aGVtZSI7CmV4cG9ydHMuY3NzVGV4dCA9ICJcCi5hY2Uta3ItdGhlbWUgLmFjZV9lZGl0b3Ige1wKICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7XAp9XApcCi5hY2Uta3ItdGhlbWUgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHtcCiAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDtcCn1cClwKLmFjZS1rci10aGVtZSAuYWNlX2d1dHRlciB7XAogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XAogIGNvbG9yOiAjMzMzO1wKfVwKXAouYWNlLWtyLXRoZW1lIC5hY2VfcHJpbnRfbWFyZ2luIHtcCiAgd2lkdGg6IDFweDtcCiAgYmFja2dyb3VuZDogI2U4ZThlODtcCn1cClwKLmFjZS1rci10aGVtZSAuYWNlX3Njcm9sbGVyIHtcCiAgYmFja2dyb3VuZC1jb2xvcjogIzBCMEEwOTtcCn1cClwKLmFjZS1rci10aGVtZSAuYWNlX3RleHQtbGF5ZXIge1wKICBjdXJzb3I6IHRleHQ7XAogIGNvbG9yOiAjRkNGRkUwO1wKfVwKXAouYWNlLWtyLXRoZW1lIC5hY2VfY3Vyc29yIHtcCiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjRkY5OTAwO1wKfVwKXAouYWNlLWtyLXRoZW1lIC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUge1wKICBib3JkZXItbGVmdDogMHB4O1wKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0ZGOTkwMDtcCn1cCiBcCi5hY2Uta3ItdGhlbWUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wKICBiYWNrZ3JvdW5kOiByZ2JhKDE3MCwgMCwgMjU1LCAwLjQ1KTtcCn1cClwKLmFjZS1rci10aGVtZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wKICBiYWNrZ3JvdW5kOiByZ2IoMTk4LCAyMTksIDE3NCk7XAp9XApcCi5hY2Uta3ItdGhlbWUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHtcCiAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4O1wKICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMTc3LCAxMTEsIDAuMzIpO1wKfVwKXAouYWNlLWtyLXRoZW1lIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wKICBiYWNrZ3JvdW5kOiAjMzg0MDNEO1wKfVwKXAouYWNlLWtyLXRoZW1lIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7XAogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTcwLCAwLCAyNTUsIDAuNDUpO1wKfVwKICAgICAgIFwKLmFjZS1rci10aGVtZSAuYWNlX2ludmlzaWJsZSB7XAogIGNvbG9yOiByZ2JhKDI1NSwgMTc3LCAxMTEsIDAuMzIpO1wKfVwKXAouYWNlLWtyLXRoZW1lIC5hY2Vfa2V5d29yZCB7XAogIGNvbG9yOiM5NDlDOEI7XAp9XApcCi5hY2Uta3ItdGhlbWUgLmFjZV9jb25zdGFudCB7XAogIGNvbG9yOnJnYmEoMjEwLCAxMTcsIDI0LCAwLjc2KTtcCn1cClwKLmFjZS1rci10aGVtZSAuYWNlX2ludmFsaWQge1wKICBjb2xvcjojRjhGOEY4O1wKYmFja2dyb3VuZC1jb2xvcjojQTQxMzAwO1wKfVwKXAouYWNlLWtyLXRoZW1lIC5hY2Vfc3VwcG9ydCB7XAogIGNvbG9yOiM5RkMyOEE7XAp9XApcCi5hY2Uta3ItdGhlbWUgLmFjZV9mb2xkIHtcCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTQ5QzhCO1wKICAgIGJvcmRlci1jb2xvcjogI0ZDRkZFMDtcCn1cClwKLmFjZS1rci10aGVtZSAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHtcCiAgY29sb3I6Izg1ODczQTtcCn1cClwKLmFjZS1rci10aGVtZSAuYWNlX3N0cmluZy5hY2VfcmVnZXhwIHtcCiAgY29sb3I6cmdiYSgxMjUsIDI1NSwgMTkyLCAwLjY1KTtcCn1cClwKLmFjZS1rci10aGVtZSAuYWNlX2NvbW1lbnQge1wKICBmb250LXN0eWxlOml0YWxpYztcCmNvbG9yOiM3MDZENUI7XAp9XApcCi5hY2Uta3ItdGhlbWUgLmFjZV92YXJpYWJsZSB7XAogIGNvbG9yOiNEMUE3OTY7XAp9XApcCi5hY2Uta3ItdGhlbWUgLmFjZV92YXJpYWJsZS5hY2VfbGFuZ3VhZ2Uge1wKICBjb2xvcjojRkY4MEUxO1wKfVwKXAouYWNlLWtyLXRoZW1lIC5hY2VfbWV0YS5hY2VfdGFnIHtcCiAgY29sb3I6I0JBQkQ5QztcCn1cClwKLmFjZS1rci10aGVtZSAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHtcCiAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wKfVwKXAouYWNlLWtyLXRoZW1lIC5hY2VfbWFya3VwLmFjZV9saXN0IHtcCiAgYmFja2dyb3VuZC1jb2xvcjojMEYwMDQwO1wKfSI7Cgp2YXIgZG9tID0gcmVxdWlyZSgiLi4vbGliL2RvbSIpOwpkb20uaW1wb3J0Q3NzU3RyaW5nKGV4cG9ydHMuY3NzVGV4dCwgZXhwb3J0cy5jc3NDbGFzcyk7Cn0pOwo7CiAgICAgICAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAg]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-kr_theme.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUva3JfdGhlbWUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7Yi5pc0Rhcms9ITAsYi5jc3NDbGFzcz0iYWNlLWtyLXRoZW1lIixiLmNzc1RleHQ9Ii5hY2Uta3ItdGhlbWUgLmFjZV9lZGl0b3IgeyAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO30uYWNlLWtyLXRoZW1lIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7ICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO30uYWNlLWtyLXRoZW1lIC5hY2VfZ3V0dGVyIHsgIGJhY2tncm91bmQ6ICNlOGU4ZTg7ICBjb2xvcjogIzMzMzt9LmFjZS1rci10aGVtZSAuYWNlX3ByaW50X21hcmdpbiB7ICB3aWR0aDogMXB4OyAgYmFja2dyb3VuZDogI2U4ZThlODt9LmFjZS1rci10aGVtZSAuYWNlX3Njcm9sbGVyIHsgIGJhY2tncm91bmQtY29sb3I6ICMwQjBBMDk7fS5hY2Uta3ItdGhlbWUgLmFjZV90ZXh0LWxheWVyIHsgIGN1cnNvcjogdGV4dDsgIGNvbG9yOiAjRkNGRkUwO30uYWNlLWtyLXRoZW1lIC5hY2VfY3Vyc29yIHsgIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0ZGOTkwMDt9LmFjZS1rci10aGVtZSAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHsgIGJvcmRlci1sZWZ0OiAwcHg7ICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0ZGOTkwMDt9IC5hY2Uta3ItdGhlbWUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24geyAgYmFja2dyb3VuZDogcmdiYSgxNzAsIDAsIDI1NSwgMC40NSk7fS5hY2Uta3ItdGhlbWUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwIHsgIGJhY2tncm91bmQ6IHJnYigxOTgsIDIxOSwgMTc0KTt9LmFjZS1rci10aGVtZSAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQgeyAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4OyAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDE3NywgMTExLCAwLjMyKTt9LmFjZS1rci10aGVtZSAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHsgIGJhY2tncm91bmQ6ICMzODQwM0Q7fS5hY2Uta3ItdGhlbWUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHsgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTcwLCAwLCAyNTUsIDAuNDUpO30gICAgICAgLmFjZS1rci10aGVtZSAuYWNlX2ludmlzaWJsZSB7ICBjb2xvcjogcmdiYSgyNTUsIDE3NywgMTExLCAwLjMyKTt9LmFjZS1rci10aGVtZSAuYWNlX2tleXdvcmQgeyAgY29sb3I6Izk0OUM4Qjt9LmFjZS1rci10aGVtZSAuYWNlX2NvbnN0YW50IHsgIGNvbG9yOnJnYmEoMjEwLCAxMTcsIDI0LCAwLjc2KTt9LmFjZS1rci10aGVtZSAuYWNlX2ludmFsaWQgeyAgY29sb3I6I0Y4RjhGODtiYWNrZ3JvdW5kLWNvbG9yOiNBNDEzMDA7fS5hY2Uta3ItdGhlbWUgLmFjZV9zdXBwb3J0IHsgIGNvbG9yOiM5RkMyOEE7fS5hY2Uta3ItdGhlbWUgLmFjZV9mb2xkIHsgICAgYmFja2dyb3VuZC1jb2xvcjogIzk0OUM4QjsgICAgYm9yZGVyLWNvbG9yOiAjRkNGRkUwO30uYWNlLWtyLXRoZW1lIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24geyAgY29sb3I6Izg1ODczQTt9LmFjZS1rci10aGVtZSAuYWNlX3N0cmluZy5hY2VfcmVnZXhwIHsgIGNvbG9yOnJnYmEoMTI1LCAyNTUsIDE5MiwgMC42NSk7fS5hY2Uta3ItdGhlbWUgLmFjZV9jb21tZW50IHsgIGZvbnQtc3R5bGU6aXRhbGljO2NvbG9yOiM3MDZENUI7fS5hY2Uta3ItdGhlbWUgLmFjZV92YXJpYWJsZSB7ICBjb2xvcjojRDFBNzk2O30uYWNlLWtyLXRoZW1lIC5hY2VfdmFyaWFibGUuYWNlX2xhbmd1YWdlIHsgIGNvbG9yOiNGRjgwRTE7fS5hY2Uta3ItdGhlbWUgLmFjZV9tZXRhLmFjZV90YWcgeyAgY29sb3I6I0JBQkQ5Qzt9LmFjZS1rci10aGVtZSAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHsgICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9LmFjZS1rci10aGVtZSAuYWNlX21hcmt1cC5hY2VfbGlzdCB7ICBiYWNrZ3JvdW5kLWNvbG9yOiMwRjAwNDA7fSI7dmFyIGQ9YSgiLi4vbGliL2RvbSIpO2QuaW1wb3J0Q3NzU3RyaW5nKGIuY3NzVGV4dCxiLmNzc0NsYXNzKX0pLGZ1bmN0aW9uKCl7d2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sZnVuY3Rpb24oYSl7d2luZG93LmFjZXx8KHdpbmRvdy5hY2U9e30pO2Zvcih2YXIgYiBpbiBhKWEuaGFzT3duUHJvcGVydHkoYikmJihhY2VbYl09YVtiXSl9KX0oKQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-merbivore-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBNaWNoYWVsIFNjaHdhcnR6IDxtci5wYW50cyBBVCBnbWFpbCBET1QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvdGhlbWUvbWVyYml2b3JlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKCmV4cG9ydHMuaXNEYXJrID0gdHJ1ZTsKZXhwb3J0cy5jc3NDbGFzcyA9ICJhY2UtbWVyYml2b3JlIjsKZXhwb3J0cy5jc3NUZXh0ID0gIlwKLmFjZS1tZXJiaXZvcmUgLmFjZV9lZGl0b3Ige1wKICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7XAp9XApcCi5hY2UtbWVyYml2b3JlIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7XAogIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7XAp9XApcCi5hY2UtbWVyYml2b3JlIC5hY2VfZ3V0dGVyIHtcCiAgYmFja2dyb3VuZDogI2U4ZThlODtcCiAgY29sb3I6ICMzMzM7XAp9XApcCi5hY2UtbWVyYml2b3JlIC5hY2VfcHJpbnRfbWFyZ2luIHtcCiAgd2lkdGg6IDFweDtcCiAgYmFja2dyb3VuZDogI2U4ZThlODtcCn1cClwKLmFjZS1tZXJiaXZvcmUgLmFjZV9zY3JvbGxlciB7XAogIGJhY2tncm91bmQtY29sb3I6ICMxNjE2MTY7XAp9XApcCi5hY2UtbWVyYml2b3JlIC5hY2VfdGV4dC1sYXllciB7XAogIGN1cnNvcjogdGV4dDtcCiAgY29sb3I6ICNFNkUxREM7XAp9XApcCi5hY2UtbWVyYml2b3JlIC5hY2VfY3Vyc29yIHtcCiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjRkZGRkZGO1wKfVwKXAouYWNlLW1lcmJpdm9yZSAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHtcCiAgYm9yZGVyLWxlZnQ6IDBweDtcCiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNGRkZGRkY7XAp9XAogXAouYWNlLW1lcmJpdm9yZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7XAogIGJhY2tncm91bmQ6ICM0NTQ1NDU7XAp9XApcCi5hY2UtbWVyYml2b3JlIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7XAogIGJhY2tncm91bmQ6IHJnYigxOTgsIDIxOSwgMTc0KTtcCn1cClwKLmFjZS1tZXJiaXZvcmUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHtcCiAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4O1wKICBib3JkZXI6IDFweCBzb2xpZCAjNDA0MDQwO1wKfVwKXAouYWNlLW1lcmJpdm9yZSAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHtcCiAgYmFja2dyb3VuZDogIzMzMzQzNTtcCn1cClwKLmFjZS1tZXJiaXZvcmUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcCiAgYm9yZGVyOiAxcHggc29saWQgIzQ1NDU0NTtcCn1cCiAgICAgICBcCi5hY2UtbWVyYml2b3JlIC5hY2VfaW52aXNpYmxlIHtcCiAgY29sb3I6ICM0MDQwNDA7XAp9XApcCi5hY2UtbWVyYml2b3JlIC5hY2Vfa2V5d29yZCB7XAogIGNvbG9yOiNGQzZGMDk7XAp9XApcCi5hY2UtbWVyYml2b3JlIC5hY2VfY29uc3RhbnQge1wKICBjb2xvcjojMUVEQUZCO1wKfVwKXAouYWNlLW1lcmJpdm9yZSAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7XAogIGNvbG9yOiNGREMyNTE7XAp9XApcCi5hY2UtbWVyYml2b3JlIC5hY2VfY29uc3RhbnQuYWNlX2xpYnJhcnkge1wKICBjb2xvcjojOERGRjBBO1wKfVwKXAouYWNlLW1lcmJpdm9yZSAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHtcCiAgY29sb3I6IzU4QzU1NDtcCn1cClwKLmFjZS1tZXJiaXZvcmUgLmFjZV9pbnZhbGlkIHtcCiAgY29sb3I6I0ZGRkZGRjtcCmJhY2tncm91bmQtY29sb3I6Izk5MDAwMDtcCn1cClwKLmFjZS1tZXJiaXZvcmUgLmFjZV9mb2xkIHtcCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkM2RjA5O1wKICAgIGJvcmRlci1jb2xvcjogI0U2RTFEQztcCn1cClwKLmFjZS1tZXJiaXZvcmUgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7XAogIGNvbG9yOiNGQzZGMDk7XAp9XApcCi5hY2UtbWVyYml2b3JlIC5hY2Vfc3RyaW5nIHtcCiAgY29sb3I6IzhERkYwQTtcCn1cClwKLmFjZS1tZXJiaXZvcmUgLmFjZV9jb21tZW50IHtcCiAgZm9udC1zdHlsZTppdGFsaWM7XApjb2xvcjojQUQyRUE0O1wKfVwKXAouYWNlLW1lcmJpdm9yZSAuYWNlX21ldGEuYWNlX3RhZyB7XAogIGNvbG9yOiNGQzZGMDk7XAp9XApcCi5hY2UtbWVyYml2b3JlIC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUge1wKICBjb2xvcjojRkZGRjg5O1wKfVwKXAouYWNlLW1lcmJpdm9yZSAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHtcCiAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wKfSI7Cgp2YXIgZG9tID0gcmVxdWlyZSgiLi4vbGliL2RvbSIpOwpkb20uaW1wb3J0Q3NzU3RyaW5nKGV4cG9ydHMuY3NzVGV4dCwgZXhwb3J0cy5jc3NDbGFzcyk7Cn0pOwo7CiAgICAgICAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAg]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-merbivore.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvbWVyYml2b3JlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oYSxiLGMpe2IuaXNEYXJrPSEwLGIuY3NzQ2xhc3M9ImFjZS1tZXJiaXZvcmUiLGIuY3NzVGV4dD0iLmFjZS1tZXJiaXZvcmUgLmFjZV9lZGl0b3IgeyAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO30uYWNlLW1lcmJpdm9yZSAuYWNlX2VkaXRvci5hY2VfZm9jdXMgeyAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDt9LmFjZS1tZXJiaXZvcmUgLmFjZV9ndXR0ZXIgeyAgYmFja2dyb3VuZDogI2U4ZThlODsgIGNvbG9yOiAjMzMzO30uYWNlLW1lcmJpdm9yZSAuYWNlX3ByaW50X21hcmdpbiB7ICB3aWR0aDogMXB4OyAgYmFja2dyb3VuZDogI2U4ZThlODt9LmFjZS1tZXJiaXZvcmUgLmFjZV9zY3JvbGxlciB7ICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTYxNjE2O30uYWNlLW1lcmJpdm9yZSAuYWNlX3RleHQtbGF5ZXIgeyAgY3Vyc29yOiB0ZXh0OyAgY29sb3I6ICNFNkUxREM7fS5hY2UtbWVyYml2b3JlIC5hY2VfY3Vyc29yIHsgIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0ZGRkZGRjt9LmFjZS1tZXJiaXZvcmUgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7ICBib3JkZXItbGVmdDogMHB4OyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNGRkZGRkY7fSAuYWNlLW1lcmJpdm9yZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7ICBiYWNrZ3JvdW5kOiAjNDU0NTQ1O30uYWNlLW1lcmJpdm9yZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAgeyAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO30uYWNlLW1lcmJpdm9yZSAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQgeyAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4OyAgYm9yZGVyOiAxcHggc29saWQgIzQwNDA0MDt9LmFjZS1tZXJiaXZvcmUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7ICBiYWNrZ3JvdW5kOiAjMzMzNDM1O30uYWNlLW1lcmJpdm9yZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQgeyAgYm9yZGVyOiAxcHggc29saWQgIzQ1NDU0NTt9ICAgICAgIC5hY2UtbWVyYml2b3JlIC5hY2VfaW52aXNpYmxlIHsgIGNvbG9yOiAjNDA0MDQwO30uYWNlLW1lcmJpdm9yZSAuYWNlX2tleXdvcmQgeyAgY29sb3I6I0ZDNkYwOTt9LmFjZS1tZXJiaXZvcmUgLmFjZV9jb25zdGFudCB7ICBjb2xvcjojMUVEQUZCO30uYWNlLW1lcmJpdm9yZSAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7ICBjb2xvcjojRkRDMjUxO30uYWNlLW1lcmJpdm9yZSAuYWNlX2NvbnN0YW50LmFjZV9saWJyYXJ5IHsgIGNvbG9yOiM4REZGMEE7fS5hY2UtbWVyYml2b3JlIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMgeyAgY29sb3I6IzU4QzU1NDt9LmFjZS1tZXJiaXZvcmUgLmFjZV9pbnZhbGlkIHsgIGNvbG9yOiNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjojOTkwMDAwO30uYWNlLW1lcmJpdm9yZSAuYWNlX2ZvbGQgeyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkM2RjA5OyAgICBib3JkZXItY29sb3I6ICNFNkUxREM7fS5hY2UtbWVyYml2b3JlIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24geyAgY29sb3I6I0ZDNkYwOTt9LmFjZS1tZXJiaXZvcmUgLmFjZV9zdHJpbmcgeyAgY29sb3I6IzhERkYwQTt9LmFjZS1tZXJiaXZvcmUgLmFjZV9jb21tZW50IHsgIGZvbnQtc3R5bGU6aXRhbGljO2NvbG9yOiNBRDJFQTQ7fS5hY2UtbWVyYml2b3JlIC5hY2VfbWV0YS5hY2VfdGFnIHsgIGNvbG9yOiNGQzZGMDk7fS5hY2UtbWVyYml2b3JlIC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUgeyAgY29sb3I6I0ZGRkY4OTt9LmFjZS1tZXJiaXZvcmUgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7ICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fSI7dmFyIGQ9YSgiLi4vbGliL2RvbSIpO2QuaW1wb3J0Q3NzU3RyaW5nKGIuY3NzVGV4dCxiLmNzc0NsYXNzKX0pLGZ1bmN0aW9uKCl7d2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sZnVuY3Rpb24oYSl7d2luZG93LmFjZXx8KHdpbmRvdy5hY2U9e30pO2Zvcih2YXIgYiBpbiBhKWEuaGFzT3duUHJvcGVydHkoYikmJihhY2VbYl09YVtiXSl9KX0oKQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-merbivore_soft-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBNaWNoYWVsIFNjaHdhcnR6IDxtci5wYW50cyBBVCBnbWFpbCBET1QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvdGhlbWUvbWVyYml2b3JlX3NvZnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoKZXhwb3J0cy5pc0RhcmsgPSB0cnVlOwpleHBvcnRzLmNzc0NsYXNzID0gImFjZS1tZXJiaXZvcmUtc29mdCI7CmV4cG9ydHMuY3NzVGV4dCA9ICJcCi5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9lZGl0b3Ige1wKICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7XAp9XApcCi5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHtcCiAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDtcCn1cClwKLmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX2d1dHRlciB7XAogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XAogIGNvbG9yOiAjMzMzO1wKfVwKXAouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfcHJpbnRfbWFyZ2luIHtcCiAgd2lkdGg6IDFweDtcCiAgYmFja2dyb3VuZDogI2U4ZThlODtcCn1cClwKLmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX3Njcm9sbGVyIHtcCiAgYmFja2dyb3VuZC1jb2xvcjogIzFDMUMxQztcCn1cClwKLmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX3RleHQtbGF5ZXIge1wKICBjdXJzb3I6IHRleHQ7XAogIGNvbG9yOiAjRTZFMURDO1wKfVwKXAouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfY3Vyc29yIHtcCiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjRkZGRkZGO1wKfVwKXAouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUge1wKICBib3JkZXItbGVmdDogMHB4O1wKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0ZGRkZGRjtcCn1cCiBcCi5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wKICBiYWNrZ3JvdW5kOiAjNDk0OTQ5O1wKfVwKXAouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7XAogIGJhY2tncm91bmQ6IHJnYigxOTgsIDIxOSwgMTc0KTtcCn1cClwKLmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge1wKICBtYXJnaW46IC0xcHggMCAwIC0xcHg7XAogIGJvcmRlcjogMXB4IHNvbGlkICM0MDQwNDA7XAp9XApcCi5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7XAogIGJhY2tncm91bmQ6ICMzMzM0MzU7XAp9XApcCi5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcCiAgYm9yZGVyOiAxcHggc29saWQgIzQ5NDk0OTtcCn1cCiAgICAgICBcCi5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9pbnZpc2libGUge1wKICBjb2xvcjogIzQwNDA0MDtcCn1cClwKLmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX2tleXdvcmQge1wKICBjb2xvcjojRkM4MDNBO1wKfVwKXAouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfY29uc3RhbnQge1wKICBjb2xvcjojNjhDMUQ4O1wKfVwKXAouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfY29uc3RhbnQuYWNlX2xhbmd1YWdlIHtcCiAgY29sb3I6I0UxQzU4MjtcCn1cClwKLmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX2NvbnN0YW50LmFjZV9saWJyYXJ5IHtcCiAgY29sb3I6IzhFQzY1RjtcCn1cClwKLmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHtcCiAgY29sb3I6IzdGQzU3ODtcCn1cClwKLmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX2ludmFsaWQge1wKICBjb2xvcjojRkZGRkZGO1wKYmFja2dyb3VuZC1jb2xvcjojRkUzODM4O1wKfVwKXAouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfaW52YWxpZC5hY2VfZGVwcmVjYXRlZCB7XAogIGNvbG9yOiNGRkZGRkY7XApiYWNrZ3JvdW5kLWNvbG9yOiNGRTM4Mzg7XAp9XApcCi5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9mb2xkIHtcCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkM4MDNBO1wKICAgIGJvcmRlci1jb2xvcjogI0U2RTFEQztcCn1cClwKLmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX3N0cmluZyB7XAogIGNvbG9yOiM4RUM2NUY7XAp9XApcCi5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9jb21tZW50IHtcCiAgZm9udC1zdHlsZTppdGFsaWM7XApjb2xvcjojQUM0QkI4O1wKfVwKXAouYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfbWV0YSB7XAogIGZvbnQtc3R5bGU6aXRhbGljO1wKY29sb3I6I0FDNEJCODtcCn1cClwKLmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX21ldGEuYWNlX3RhZyB7XAogIGNvbG9yOiNGQzgwM0E7XAp9XApcCi5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9lbnRpdHkuYWNlX290aGVyLmFjZV9hdHRyaWJ1dGUtbmFtZSB7XAogIGNvbG9yOiNFQUYxQTM7XAp9XApcCi5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7XAogICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcCn0iOwoKdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsKZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOwp9KTsKOwogICAgICAgICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgewogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KSgpOwogICAgICAgIA==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-merbivore_soft.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvbWVyYml2b3JlX3NvZnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7Yi5pc0Rhcms9ITAsYi5jc3NDbGFzcz0iYWNlLW1lcmJpdm9yZS1zb2Z0IixiLmNzc1RleHQ9Ii5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9lZGl0b3IgeyAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO30uYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7ICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO30uYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfZ3V0dGVyIHsgIGJhY2tncm91bmQ6ICNlOGU4ZTg7ICBjb2xvcjogIzMzMzt9LmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX3ByaW50X21hcmdpbiB7ICB3aWR0aDogMXB4OyAgYmFja2dyb3VuZDogI2U4ZThlODt9LmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX3Njcm9sbGVyIHsgIGJhY2tncm91bmQtY29sb3I6ICMxQzFDMUM7fS5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV90ZXh0LWxheWVyIHsgIGN1cnNvcjogdGV4dDsgIGNvbG9yOiAjRTZFMURDO30uYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfY3Vyc29yIHsgIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0ZGRkZGRjt9LmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHsgIGJvcmRlci1sZWZ0OiAwcHg7ICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0ZGRkZGRjt9IC5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24geyAgYmFja2dyb3VuZDogIzQ5NDk0OTt9LmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAgeyAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO30uYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7ICBtYXJnaW46IC0xcHggMCAwIC0xcHg7ICBib3JkZXI6IDFweCBzb2xpZCAjNDA0MDQwO30uYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUgeyAgYmFja2dyb3VuZDogIzMzMzQzNTt9LmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQgeyAgYm9yZGVyOiAxcHggc29saWQgIzQ5NDk0OTt9ICAgICAgIC5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9pbnZpc2libGUgeyAgY29sb3I6ICM0MDQwNDA7fS5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9rZXl3b3JkIHsgIGNvbG9yOiNGQzgwM0E7fS5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9jb25zdGFudCB7ICBjb2xvcjojNjhDMUQ4O30uYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfY29uc3RhbnQuYWNlX2xhbmd1YWdlIHsgIGNvbG9yOiNFMUM1ODI7fS5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9jb25zdGFudC5hY2VfbGlicmFyeSB7ICBjb2xvcjojOEVDNjVGO30uYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMgeyAgY29sb3I6IzdGQzU3ODt9LmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX2ludmFsaWQgeyAgY29sb3I6I0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOiNGRTM4Mzg7fS5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9pbnZhbGlkLmFjZV9kZXByZWNhdGVkIHsgIGNvbG9yOiNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjojRkUzODM4O30uYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfZm9sZCB7ICAgIGJhY2tncm91bmQtY29sb3I6ICNGQzgwM0E7ICAgIGJvcmRlci1jb2xvcjogI0U2RTFEQzt9LmFjZS1tZXJiaXZvcmUtc29mdCAuYWNlX3N0cmluZyB7ICBjb2xvcjojOEVDNjVGO30uYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfY29tbWVudCB7ICBmb250LXN0eWxlOml0YWxpYztjb2xvcjojQUM0QkI4O30uYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfbWV0YSB7ICBmb250LXN0eWxlOml0YWxpYztjb2xvcjojQUM0QkI4O30uYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfbWV0YS5hY2VfdGFnIHsgIGNvbG9yOiNGQzgwM0E7fS5hY2UtbWVyYml2b3JlLXNvZnQgLmFjZV9lbnRpdHkuYWNlX290aGVyLmFjZV9hdHRyaWJ1dGUtbmFtZSB7ICBjb2xvcjojRUFGMUEzO30uYWNlLW1lcmJpdm9yZS1zb2Z0IC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUgeyAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30iO3ZhciBkPWEoIi4uL2xpYi9kb20iKTtkLmltcG9ydENzc1N0cmluZyhiLmNzc1RleHQsYi5jc3NDbGFzcyl9KSxmdW5jdGlvbigpe3dpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLGZ1bmN0aW9uKGEpe3dpbmRvdy5hY2V8fCh3aW5kb3cuYWNlPXt9KTtmb3IodmFyIGIgaW4gYSlhLmhhc093blByb3BlcnR5KGIpJiYoYWNlW2JdPWFbYl0pfSl9KCk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-monokai-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvdGhlbWUvbW9ub2thaScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CgpleHBvcnRzLmlzRGFyayA9IHRydWU7CmV4cG9ydHMuY3NzQ2xhc3MgPSAiYWNlLW1vbm9rYWkiOwpleHBvcnRzLmNzc1RleHQgPSAiXAouYWNlLW1vbm9rYWkgLmFjZV9lZGl0b3Ige1wKICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7XAp9XApcCi5hY2UtbW9ub2thaSAuYWNlX2VkaXRvci5hY2VfZm9jdXMge1wKICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO1wKfVwKXAouYWNlLW1vbm9rYWkgLmFjZV9ndXR0ZXIge1wKICBiYWNrZ3JvdW5kOiAjZThlOGU4O1wKICBjb2xvcjogIzMzMztcCn1cClwKLmFjZS1tb25va2FpIC5hY2VfcHJpbnRfbWFyZ2luIHtcCiAgd2lkdGg6IDFweDtcCiAgYmFja2dyb3VuZDogI2U4ZThlODtcCn1cClwKLmFjZS1tb25va2FpIC5hY2Vfc2Nyb2xsZXIge1wKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjcyODIyO1wKfVwKXAouYWNlLW1vbm9rYWkgLmFjZV90ZXh0LWxheWVyIHtcCiAgY3Vyc29yOiB0ZXh0O1wKICBjb2xvcjogI0Y4RjhGMjtcCn1cClwKLmFjZS1tb25va2FpIC5hY2VfY3Vyc29yIHtcCiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjRjhGOEYwO1wKfVwKXAouYWNlLW1vbm9rYWkgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7XAogIGJvcmRlci1sZWZ0OiAwcHg7XAogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRjhGOEYwO1wKfVwKIFwKLmFjZS1tb25va2FpIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHtcCiAgYmFja2dyb3VuZDogIzQ5NDgzRTtcCn1cClwKLmFjZS1tb25va2FpIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7XAogIGJhY2tncm91bmQ6IHJnYigxOTgsIDIxOSwgMTc0KTtcCn1cClwKLmFjZS1tb25va2FpIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7XAogIG1hcmdpbjogLTFweCAwIDAgLTFweDtcCiAgYm9yZGVyOiAxcHggc29saWQgIzQ5NDgzRTtcCn1cClwKLmFjZS1tb25va2FpIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wKICBiYWNrZ3JvdW5kOiAjNDk0ODNFO1wKfVwKXAouYWNlLW1vbm9rYWkgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcCiAgYm9yZGVyOiAxcHggc29saWQgIzQ5NDgzRTtcCn1cCiAgICAgICBcCi5hY2UtbW9ub2thaSAuYWNlX2ludmlzaWJsZSB7XAogIGNvbG9yOiAjNDk0ODNFO1wKfVwKXAouYWNlLW1vbm9rYWkgLmFjZV9rZXl3b3JkIHtcCiAgY29sb3I6I0Y5MjY3MjtcCn1cClwKLmFjZS1tb25va2FpIC5hY2VfY29uc3RhbnQuYWNlX2xhbmd1YWdlIHtcCiAgY29sb3I6I0FFODFGRjtcCn1cClwKLmFjZS1tb25va2FpIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMge1wKICBjb2xvcjojQUU4MUZGO1wKfVwKXAouYWNlLW1vbm9rYWkgLmFjZV9pbnZhbGlkIHtcCiAgY29sb3I6I0Y4RjhGMDtcCmJhY2tncm91bmQtY29sb3I6I0Y5MjY3MjtcCn1cClwKLmFjZS1tb25va2FpIC5hY2VfaW52YWxpZC5hY2VfZGVwcmVjYXRlZCB7XAogIGNvbG9yOiNGOEY4RjA7XApiYWNrZ3JvdW5kLWNvbG9yOiNBRTgxRkY7XAp9XApcCi5hY2UtbW9ub2thaSAuYWNlX2ZvbGQge1wKICAgIGJhY2tncm91bmQtY29sb3I6ICNBNkUyMkU7XAogICAgYm9yZGVyLWNvbG9yOiAjRjhGOEYyO1wKfVwKXAouYWNlLW1vbm9rYWkgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7XAogIGNvbG9yOiM2NkQ5RUY7XAp9XApcCi5hY2UtbW9ub2thaSAuYWNlX3N0cmluZyB7XAogIGNvbG9yOiNFNkRCNzQ7XAp9XApcCi5hY2UtbW9ub2thaSAuYWNlX2NvbW1lbnQge1wKICBjb2xvcjojNzU3MTVFO1wKfVwKXAouYWNlLW1vbm9rYWkgLmFjZV9lbnRpdHkuYWNlX290aGVyLmFjZV9hdHRyaWJ1dGUtbmFtZSB7XAogIGNvbG9yOiNBNkUyMkU7XAp9XApcCi5hY2UtbW9ub2thaSAuYWNlX2VudGl0eS5hY2VfbmFtZS5hY2VfZnVuY3Rpb24ge1wKICBjb2xvcjojQTZFMjJFO1wKfVwKXAouYWNlLW1vbm9rYWkgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7XAogICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcCn0iOwoKdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsKZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOwp9KTsKOwogICAgICAgICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgewogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KSgpOwogICAgICAgIA==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-monokai.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvbW9ub2thaSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGEsYixjKXtiLmlzRGFyaz0hMCxiLmNzc0NsYXNzPSJhY2UtbW9ub2thaSIsYi5jc3NUZXh0PSIuYWNlLW1vbm9rYWkgLmFjZV9lZGl0b3IgeyAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO30uYWNlLW1vbm9rYWkgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHsgIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7fS5hY2UtbW9ub2thaSAuYWNlX2d1dHRlciB7ICBiYWNrZ3JvdW5kOiAjZThlOGU4OyAgY29sb3I6ICMzMzM7fS5hY2UtbW9ub2thaSAuYWNlX3ByaW50X21hcmdpbiB7ICB3aWR0aDogMXB4OyAgYmFja2dyb3VuZDogI2U4ZThlODt9LmFjZS1tb25va2FpIC5hY2Vfc2Nyb2xsZXIgeyAgYmFja2dyb3VuZC1jb2xvcjogIzI3MjgyMjt9LmFjZS1tb25va2FpIC5hY2VfdGV4dC1sYXllciB7ICBjdXJzb3I6IHRleHQ7ICBjb2xvcjogI0Y4RjhGMjt9LmFjZS1tb25va2FpIC5hY2VfY3Vyc29yIHsgIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0Y4RjhGMDt9LmFjZS1tb25va2FpIC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUgeyAgYm9yZGVyLWxlZnQ6IDBweDsgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRjhGOEYwO30gLmFjZS1tb25va2FpIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHsgIGJhY2tncm91bmQ6ICM0OTQ4M0U7fS5hY2UtbW9ub2thaSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAgeyAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO30uYWNlLW1vbm9rYWkgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHsgIG1hcmdpbjogLTFweCAwIDAgLTFweDsgIGJvcmRlcjogMXB4IHNvbGlkICM0OTQ4M0U7fS5hY2UtbW9ub2thaSAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHsgIGJhY2tncm91bmQ6ICM0OTQ4M0U7fS5hY2UtbW9ub2thaSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQgeyAgYm9yZGVyOiAxcHggc29saWQgIzQ5NDgzRTt9ICAgICAgIC5hY2UtbW9ub2thaSAuYWNlX2ludmlzaWJsZSB7ICBjb2xvcjogIzQ5NDgzRTt9LmFjZS1tb25va2FpIC5hY2Vfa2V5d29yZCB7ICBjb2xvcjojRjkyNjcyO30uYWNlLW1vbm9rYWkgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2UgeyAgY29sb3I6I0FFODFGRjt9LmFjZS1tb25va2FpIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMgeyAgY29sb3I6I0FFODFGRjt9LmFjZS1tb25va2FpIC5hY2VfaW52YWxpZCB7ICBjb2xvcjojRjhGOEYwO2JhY2tncm91bmQtY29sb3I6I0Y5MjY3Mjt9LmFjZS1tb25va2FpIC5hY2VfaW52YWxpZC5hY2VfZGVwcmVjYXRlZCB7ICBjb2xvcjojRjhGOEYwO2JhY2tncm91bmQtY29sb3I6I0FFODFGRjt9LmFjZS1tb25va2FpIC5hY2VfZm9sZCB7ICAgIGJhY2tncm91bmQtY29sb3I6ICNBNkUyMkU7ICAgIGJvcmRlci1jb2xvcjogI0Y4RjhGMjt9LmFjZS1tb25va2FpIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24geyAgY29sb3I6IzY2RDlFRjt9LmFjZS1tb25va2FpIC5hY2Vfc3RyaW5nIHsgIGNvbG9yOiNFNkRCNzQ7fS5hY2UtbW9ub2thaSAuYWNlX2NvbW1lbnQgeyAgY29sb3I6Izc1NzE1RTt9LmFjZS1tb25va2FpIC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUgeyAgY29sb3I6I0E2RTIyRTt9LmFjZS1tb25va2FpIC5hY2VfZW50aXR5LmFjZV9uYW1lLmFjZV9mdW5jdGlvbiB7ICBjb2xvcjojQTZFMjJFO30uYWNlLW1vbm9rYWkgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7ICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fSI7dmFyIGQ9YSgiLi4vbGliL2RvbSIpO2QuaW1wb3J0Q3NzU3RyaW5nKGIuY3NzVGV4dCxiLmNzc0NsYXNzKX0pLGZ1bmN0aW9uKCl7d2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sZnVuY3Rpb24oYSl7d2luZG93LmFjZXx8KHdpbmRvdy5hY2U9e30pO2Zvcih2YXIgYiBpbiBhKWEuaGFzT3duUHJvcGVydHkoYikmJihhY2VbYl09YVtiXSl9KX0oKQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-mono_industrial-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvdGhlbWUvbW9ub19pbmR1c3RyaWFsJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKCmV4cG9ydHMuaXNEYXJrID0gdHJ1ZTsKZXhwb3J0cy5jc3NDbGFzcyA9ICJhY2UtbW9uby1pbmR1c3RyaWFsIjsKZXhwb3J0cy5jc3NUZXh0ID0gIlwKLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9lZGl0b3Ige1wKICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7XAp9XApcCi5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7XAogIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7XAp9XApcCi5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfZ3V0dGVyIHtcCiAgYmFja2dyb3VuZDogI2U4ZThlODtcCiAgY29sb3I6ICMzMzM7XAp9XApcCi5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfcHJpbnRfbWFyZ2luIHtcCiAgd2lkdGg6IDFweDtcCiAgYmFja2dyb3VuZDogI2U4ZThlODtcCn1cClwKLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9zY3JvbGxlciB7XAogIGJhY2tncm91bmQtY29sb3I6ICMyMjJDMjg7XAp9XApcCi5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfdGV4dC1sYXllciB7XAogIGN1cnNvcjogdGV4dDtcCiAgY29sb3I6ICNGRkZGRkY7XAp9XApcCi5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfY3Vyc29yIHtcCiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjRkZGRkZGO1wKfVwKXAouYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHtcCiAgYm9yZGVyLWxlZnQ6IDBweDtcCiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNGRkZGRkY7XAp9XAogXAouYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7XAogIGJhY2tncm91bmQ6IHJnYmEoMTQ1LCAxNTMsIDE0OCwgMC40MCk7XAp9XApcCi5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7XAogIGJhY2tncm91bmQ6IHJnYigxOTgsIDIxOSwgMTc0KTtcCn1cClwKLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHtcCiAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4O1wKICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDEwMiwgMTA4LCAxMDQsIDAuNTApO1wKfVwKXAouYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHtcCiAgYmFja2dyb3VuZDogcmdiYSgxMiwgMTMsIDEyLCAwLjI1KTtcCn1cClwKLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcCiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxNDUsIDE1MywgMTQ4LCAwLjQwKTtcCn1cCiAgICAgICBcCi5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfaW52aXNpYmxlIHtcCiAgY29sb3I6IHJnYmEoMTAyLCAxMDgsIDEwNCwgMC41MCk7XAp9XApcCi5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2Vfa2V5d29yZCB7XAogIGNvbG9yOiNBMzlFNjQ7XAp9XApcCi5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2Vfa2V5d29yZC5hY2Vfb3BlcmF0b3Ige1wKICBjb2xvcjojQThCM0FCO1wKfVwKXAouYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX2NvbnN0YW50IHtcCiAgY29sb3I6I0U5ODgwMDtcCn1cClwKLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9jb25zdGFudC5hY2VfbnVtZXJpYyB7XAogIGNvbG9yOiNFOTg4MDA7XAp9XApcCi5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfaW52YWxpZCB7XAogIGNvbG9yOiNGRkZGRkY7XApiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMTUzLCAwLCAwLCAwLjY4KTtcCn1cClwKLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9mb2xkIHtcCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQThCM0FCO1wKICAgIGJvcmRlci1jb2xvcjogI0ZGRkZGRjtcCn1cClwKLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7XAogIGNvbG9yOiM1ODhFNjA7XAp9XApcCi5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfY29tbWVudCB7XAogIGNvbG9yOiM2NjZDNjg7XApiYWNrZ3JvdW5kLWNvbG9yOiMxNTFDMTk7XAp9XApcCi5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfdmFyaWFibGUuYWNlX2xhbmd1YWdlIHtcCiAgY29sb3I6IzY0OEJEMjtcCn1cClwKLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9lbnRpdHkuYWNlX290aGVyLmFjZV9hdHRyaWJ1dGUtbmFtZSB7XAogIGNvbG9yOiM5MDk5OTM7XAp9XApcCi5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfZW50aXR5LmFjZV9uYW1lIHtcCiAgY29sb3I6IzU3NzhCNjtcCn1cClwKLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9lbnRpdHkuYWNlX25hbWUuYWNlX2Z1bmN0aW9uIHtcCiAgY29sb3I6I0E4QjNBQjtcCn1cClwKLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7XAogICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcCn0iOwoKdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsKZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOwp9KTsKOwogICAgICAgICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgewogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KSgpOwogICAgICAgIA==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-mono_industrial.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvbW9ub19pbmR1c3RyaWFsIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oYSxiLGMpe2IuaXNEYXJrPSEwLGIuY3NzQ2xhc3M9ImFjZS1tb25vLWluZHVzdHJpYWwiLGIuY3NzVGV4dD0iLmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9lZGl0b3IgeyAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO30uYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX2VkaXRvci5hY2VfZm9jdXMgeyAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDt9LmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9ndXR0ZXIgeyAgYmFja2dyb3VuZDogI2U4ZThlODsgIGNvbG9yOiAjMzMzO30uYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX3ByaW50X21hcmdpbiB7ICB3aWR0aDogMXB4OyAgYmFja2dyb3VuZDogI2U4ZThlODt9LmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9zY3JvbGxlciB7ICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjIyQzI4O30uYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX3RleHQtbGF5ZXIgeyAgY3Vyc29yOiB0ZXh0OyAgY29sb3I6ICNGRkZGRkY7fS5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfY3Vyc29yIHsgIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0ZGRkZGRjt9LmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7ICBib3JkZXItbGVmdDogMHB4OyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNGRkZGRkY7fSAuYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7ICBiYWNrZ3JvdW5kOiByZ2JhKDE0NSwgMTUzLCAxNDgsIDAuNDApO30uYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAgeyAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO30uYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQgeyAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4OyAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxMDIsIDEwOCwgMTA0LCAwLjUwKTt9LmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7ICBiYWNrZ3JvdW5kOiByZ2JhKDEyLCAxMywgMTIsIDAuMjUpO30uYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQgeyAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxNDUsIDE1MywgMTQ4LCAwLjQwKTt9ICAgICAgIC5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfaW52aXNpYmxlIHsgIGNvbG9yOiByZ2JhKDEwMiwgMTA4LCAxMDQsIDAuNTApO30uYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX2tleXdvcmQgeyAgY29sb3I6I0EzOUU2NDt9LmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7ICBjb2xvcjojQThCM0FCO30uYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX2NvbnN0YW50IHsgIGNvbG9yOiNFOTg4MDA7fS5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMgeyAgY29sb3I6I0U5ODgwMDt9LmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9pbnZhbGlkIHsgIGNvbG9yOiNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDE1MywgMCwgMCwgMC42OCk7fS5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfZm9sZCB7ICAgIGJhY2tncm91bmQtY29sb3I6ICNBOEIzQUI7ICAgIGJvcmRlci1jb2xvcjogI0ZGRkZGRjt9LmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7ICBjb2xvcjojNTg4RTYwO30uYWNlLW1vbm8taW5kdXN0cmlhbCAuYWNlX2NvbW1lbnQgeyAgY29sb3I6IzY2NkM2ODtiYWNrZ3JvdW5kLWNvbG9yOiMxNTFDMTk7fS5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfdmFyaWFibGUuYWNlX2xhbmd1YWdlIHsgIGNvbG9yOiM2NDhCRDI7fS5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUgeyAgY29sb3I6IzkwOTk5Mzt9LmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9lbnRpdHkuYWNlX25hbWUgeyAgY29sb3I6IzU3NzhCNjt9LmFjZS1tb25vLWluZHVzdHJpYWwgLmFjZV9lbnRpdHkuYWNlX25hbWUuYWNlX2Z1bmN0aW9uIHsgIGNvbG9yOiNBOEIzQUI7fS5hY2UtbW9uby1pbmR1c3RyaWFsIC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUgeyAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30iO3ZhciBkPWEoIi4uL2xpYi9kb20iKTtkLmltcG9ydENzc1N0cmluZyhiLmNzc1RleHQsYi5jc3NDbGFzcyl9KSxmdW5jdGlvbigpe3dpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLGZ1bmN0aW9uKGEpe3dpbmRvdy5hY2V8fCh3aW5kb3cuYWNlPXt9KTtmb3IodmFyIGIgaW4gYSlhLmhhc093blByb3BlcnR5KGIpJiYoYWNlW2JdPWFbYl0pfSl9KCk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-pastel_on_dark-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBBbmRyw6kgRmllZGxlciA8ZmllZGxlciBkb3QgYW5kcmUgYSB0IGdtYWlsIGRvdCBjb20+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS90aGVtZS9wYXN0ZWxfb25fZGFyaycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CgpleHBvcnRzLmlzRGFyayA9IHRydWU7CmV4cG9ydHMuY3NzQ2xhc3MgPSAiYWNlLXBhc3RlbC1vbi1kYXJrIjsKZXhwb3J0cy5jc3NUZXh0ID0gIlwKLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX2VkaXRvciB7XAogIGJvcmRlcjogMnB4IHNvbGlkIHJnYigxNTksIDE1OSwgMTU5KTtcCn1cClwKLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX2VkaXRvci5hY2VfZm9jdXMge1wKICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO1wKfVwKXAouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfZ3V0dGVyIHtcCiAgYmFja2dyb3VuZDogI2U4ZThlODtcCiAgY29sb3I6ICMzMzM7XAp9XApcCi5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9wcmludF9tYXJnaW4ge1wKICB3aWR0aDogMXB4O1wKICBiYWNrZ3JvdW5kOiAjZThlOGU4O1wKfVwKXAouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2Vfc2Nyb2xsZXIge1wKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMkMyODI4O1wKfVwKXAouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfdGV4dC1sYXllciB7XAogIGN1cnNvcjogdGV4dDtcCiAgY29sb3I6ICM4RjkzOEY7XAp9XApcCi5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9jdXJzb3Ige1wKICBib3JkZXItbGVmdDogMnB4IHNvbGlkICNBN0E3QTc7XAp9XApcCi5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7XAogIGJvcmRlci1sZWZ0OiAwcHg7XAogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjQTdBN0E3O1wKfVwKIFwKLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7XAogIGJhY2tncm91bmQ6IHJnYmEoMjIxLCAyNDAsIDI1NSwgMC4yMCk7XAp9XApcCi5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwIHtcCiAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO1wKfVwKXAouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7XAogIG1hcmdpbjogLTFweCAwIDAgLTFweDtcCiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI1KTtcCn1cClwKLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHtcCiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzMSk7XAp9XApcCi5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcCiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyMjEsIDI0MCwgMjU1LCAwLjIwKTtcCn1cCiAgICAgICBcCi5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9pbnZpc2libGUge1wKICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI1KTtcCn1cClwKLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX2tleXdvcmQge1wKICBjb2xvcjojNzU3YUQ4O1wKfVwKXAouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2Vfa2V5d29yZC5hY2Vfb3BlcmF0b3Ige1wKICBjb2xvcjojNzk3ODc4O1wKfVwKXAouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfY29uc3RhbnQge1wKICBjb2xvcjojNEZCN0M1O1wKfVwKXAouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfY29uc3RhbnQuYWNlX2xhbmd1YWdlIHtcCiAgY29sb3I6I0RFOEUzMDtcCn1cClwKLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHtcCiAgY29sb3I6I0NDQ0NDQztcCn1cClwKLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX2ludmFsaWQge1wKICBjb2xvcjojRjhGOEY4O1wKYmFja2dyb3VuZC1jb2xvcjpyZ2JhKDg2LCA0NSwgODYsIDAuNzUpO1wKfVwKXAouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfaW52YWxpZC5hY2VfaWxsZWdhbCB7XAogIGNvbG9yOiNGOEY4Rjg7XApiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoODYsIDQ1LCA4NiwgMC43NSk7XAp9XApcCi5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9pbnZhbGlkLmFjZV9kZXByZWNhdGVkIHtcCiAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcCmZvbnQtc3R5bGU6aXRhbGljO1wKY29sb3I6I0QyQThBMTtcCn1cClwKLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX2ZvbGQge1wKICAgIGJhY2tncm91bmQtY29sb3I6ICM3NTdhRDg7XAogICAgYm9yZGVyLWNvbG9yOiAjOEY5MzhGO1wKfVwKXAouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge1wKICBjb2xvcjojQUVCMkY4O1wKfVwKXAouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2Vfc3RyaW5nIHtcCiAgY29sb3I6IzY2QTk2ODtcCn1cClwKLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX3N0cmluZy5hY2VfcmVnZXhwIHtcCiAgY29sb3I6I0U5QzA2MjtcCn1cClwKLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX2NvbW1lbnQge1wKICBjb2xvcjojQTZDNkZGO1wKfVwKXAouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfdmFyaWFibGUge1wKICBjb2xvcjojQkVCRjU1O1wKfVwKXAouYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfdmFyaWFibGUuYWNlX2xhbmd1YWdlIHtcCiAgY29sb3I6I0MxQzE0NDtcCn1cClwKLmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX3htbF9wZSB7XAogIGNvbG9yOiM0OTQ5NDk7XAp9XApcCi5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7XAogICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcCn0iOwoKdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsKZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOwp9KTsKOwogICAgICAgICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgewogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KSgpOwogICAgICAgIA==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-pastel_on_dark.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvcGFzdGVsX29uX2RhcmsiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7Yi5pc0Rhcms9ITAsYi5jc3NDbGFzcz0iYWNlLXBhc3RlbC1vbi1kYXJrIixiLmNzc1RleHQ9Ii5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9lZGl0b3IgeyAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO30uYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7ICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO30uYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfZ3V0dGVyIHsgIGJhY2tncm91bmQ6ICNlOGU4ZTg7ICBjb2xvcjogIzMzMzt9LmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX3ByaW50X21hcmdpbiB7ICB3aWR0aDogMXB4OyAgYmFja2dyb3VuZDogI2U4ZThlODt9LmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX3Njcm9sbGVyIHsgIGJhY2tncm91bmQtY29sb3I6ICMyQzI4Mjg7fS5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV90ZXh0LWxheWVyIHsgIGN1cnNvcjogdGV4dDsgIGNvbG9yOiAjOEY5MzhGO30uYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfY3Vyc29yIHsgIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0E3QTdBNzt9LmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHsgIGJvcmRlci1sZWZ0OiAwcHg7ICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0E3QTdBNzt9IC5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24geyAgYmFja2dyb3VuZDogcmdiYSgyMjEsIDI0MCwgMjU1LCAwLjIwKTt9LmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAgeyAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO30uYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7ICBtYXJnaW46IC0xcHggMCAwIC0xcHg7ICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjUpO30uYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUgeyAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzMSk7fS5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHsgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjIxLCAyNDAsIDI1NSwgMC4yMCk7fSAgICAgICAuYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfaW52aXNpYmxlIHsgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjUpO30uYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2Vfa2V5d29yZCB7ICBjb2xvcjojNzU3YUQ4O30uYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2Vfa2V5d29yZC5hY2Vfb3BlcmF0b3IgeyAgY29sb3I6Izc5Nzg3ODt9LmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX2NvbnN0YW50IHsgIGNvbG9yOiM0RkI3QzU7fS5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2UgeyAgY29sb3I6I0RFOEUzMDt9LmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHsgIGNvbG9yOiNDQ0NDQ0M7fS5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9pbnZhbGlkIHsgIGNvbG9yOiNGOEY4Rjg7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDg2LCA0NSwgODYsIDAuNzUpO30uYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfaW52YWxpZC5hY2VfaWxsZWdhbCB7ICBjb2xvcjojRjhGOEY4O2JhY2tncm91bmQtY29sb3I6cmdiYSg4NiwgNDUsIDg2LCAwLjc1KTt9LmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX2ludmFsaWQuYWNlX2RlcHJlY2F0ZWQgeyAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtmb250LXN0eWxlOml0YWxpYztjb2xvcjojRDJBOEExO30uYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfZm9sZCB7ICAgIGJhY2tncm91bmQtY29sb3I6ICM3NTdhRDg7ICAgIGJvcmRlci1jb2xvcjogIzhGOTM4Rjt9LmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHsgIGNvbG9yOiNBRUIyRjg7fS5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9zdHJpbmcgeyAgY29sb3I6IzY2QTk2ODt9LmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX3N0cmluZy5hY2VfcmVnZXhwIHsgIGNvbG9yOiNFOUMwNjI7fS5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV9jb21tZW50IHsgIGNvbG9yOiNBNkM2RkY7fS5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV92YXJpYWJsZSB7ICBjb2xvcjojQkVCRjU1O30uYWNlLXBhc3RlbC1vbi1kYXJrIC5hY2VfdmFyaWFibGUuYWNlX2xhbmd1YWdlIHsgIGNvbG9yOiNDMUMxNDQ7fS5hY2UtcGFzdGVsLW9uLWRhcmsgLmFjZV94bWxfcGUgeyAgY29sb3I6IzQ5NDk0OTt9LmFjZS1wYXN0ZWwtb24tZGFyayAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHsgICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9Ijt2YXIgZD1hKCIuLi9saWIvZG9tIik7ZC5pbXBvcnRDc3NTdHJpbmcoYi5jc3NUZXh0LGIuY3NzQ2xhc3MpfSksZnVuY3Rpb24oKXt3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSxmdW5jdGlvbihhKXt3aW5kb3cuYWNlfHwod2luZG93LmFjZT17fSk7Zm9yKHZhciBiIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShiKSYmKGFjZVtiXT1hW2JdKX0pfSgp]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-solarized_dark-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvdGhlbWUvc29sYXJpemVkX2RhcmsnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoKZXhwb3J0cy5pc0RhcmsgPSB0cnVlOwpleHBvcnRzLmNzc0NsYXNzID0gImFjZS1zb2xhcml6ZWQtZGFyayI7CmV4cG9ydHMuY3NzVGV4dCA9ICJcCi5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9lZGl0b3Ige1wKICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7XAp9XApcCi5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHtcCiAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDtcCn1cClwKLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX2d1dHRlciB7XAogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XAogIGNvbG9yOiAjMzMzO1wKfVwKXAouYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfcHJpbnRfbWFyZ2luIHtcCiAgd2lkdGg6IDFweDtcCiAgYmFja2dyb3VuZDogI2U4ZThlODtcCn1cClwKLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX3Njcm9sbGVyIHtcCiAgYmFja2dyb3VuZC1jb2xvcjogIzAwMkIzNjtcCn1cClwKLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX3RleHQtbGF5ZXIge1wKICBjdXJzb3I6IHRleHQ7XAogIGNvbG9yOiAjOTNBMUExO1wKfVwKXAouYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfY3Vyc29yIHtcCiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjRDMwMTAyO1wKfVwKXAouYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUge1wKICBib3JkZXItbGVmdDogMHB4O1wKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0QzMDEwMjtcCn1cCiBcCi5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wKICBiYWNrZ3JvdW5kOiAjMDczNjQyO1wKfVwKXAouYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7XAogIGJhY2tncm91bmQ6IHJnYigxOTgsIDIxOSwgMTc0KTtcCn1cClwKLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge1wKICBtYXJnaW46IC0xcHggMCAwIC0xcHg7XAogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTQ3LCAxNjEsIDE2MSwgMC41MCk7XAp9XApcCi5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7XAogIGJhY2tncm91bmQ6ICMwNzM2NDI7XAp9XApcCi5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcCiAgYm9yZGVyOiAxcHggc29saWQgIzA3MzY0MjtcCn1cCiAgICAgICBcCi5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9pbnZpc2libGUge1wKICBjb2xvcjogcmdiYSgxNDcsIDE2MSwgMTYxLCAwLjUwKTtcCn1cClwKLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX2tleXdvcmQge1wKICBjb2xvcjojODU5OTAwO1wKfVwKXAouYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfY29uc3RhbnQuYWNlX2xhbmd1YWdlIHtcCiAgY29sb3I6I0I1ODkwMDtcCn1cClwKLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHtcCiAgY29sb3I6I0QzMzY4MjtcCn1cClwKLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX2ZvbGQge1wKICAgIGJhY2tncm91bmQtY29sb3I6ICMyNjhCRDI7XAogICAgYm9yZGVyLWNvbG9yOiAjOTNBMUExO1wKfVwKXAouYWNlLXNvbGFyaXplZC1kYXJrIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge1wKICBjb2xvcjojMjY4QkQyO1wKfVwKXAouYWNlLXNvbGFyaXplZC1kYXJrIC5hY2Vfc3RyaW5nIHtcCiAgY29sb3I6IzJBQTE5ODtcCn1cClwKLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX3N0cmluZy5hY2VfcmVnZXhwIHtcCiAgY29sb3I6I0QzMDEwMjtcCn1cClwKLmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX2NvbW1lbnQge1wKICBmb250LXN0eWxlOml0YWxpYztcCmNvbG9yOiM2NTdCODM7XAp9XApcCi5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV92YXJpYWJsZS5hY2VfbGFuZ3VhZ2Uge1wKICBjb2xvcjojMjY4QkQyO1wKfVwKXAouYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUge1wKICBjb2xvcjojOTNBMUExO1wKfVwKXAouYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfZW50aXR5LmFjZV9uYW1lLmFjZV9mdW5jdGlvbiB7XAogIGNvbG9yOiMyNjhCRDI7XAp9XApcCi5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7XAogICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcCn0iOwoKdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsKZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOwp9KTsKOwogICAgICAgICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgewogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KSgpOwogICAgICAgIA==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-solarized_dark.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvc29sYXJpemVkX2RhcmsiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7Yi5pc0Rhcms9ITAsYi5jc3NDbGFzcz0iYWNlLXNvbGFyaXplZC1kYXJrIixiLmNzc1RleHQ9Ii5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9lZGl0b3IgeyAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO30uYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7ICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO30uYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfZ3V0dGVyIHsgIGJhY2tncm91bmQ6ICNlOGU4ZTg7ICBjb2xvcjogIzMzMzt9LmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX3ByaW50X21hcmdpbiB7ICB3aWR0aDogMXB4OyAgYmFja2dyb3VuZDogI2U4ZThlODt9LmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX3Njcm9sbGVyIHsgIGJhY2tncm91bmQtY29sb3I6ICMwMDJCMzY7fS5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV90ZXh0LWxheWVyIHsgIGN1cnNvcjogdGV4dDsgIGNvbG9yOiAjOTNBMUExO30uYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfY3Vyc29yIHsgIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0QzMDEwMjt9LmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHsgIGJvcmRlci1sZWZ0OiAwcHg7ICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0QzMDEwMjt9IC5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24geyAgYmFja2dyb3VuZDogIzA3MzY0Mjt9LmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAgeyAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO30uYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7ICBtYXJnaW46IC0xcHggMCAwIC0xcHg7ICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE0NywgMTYxLCAxNjEsIDAuNTApO30uYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUgeyAgYmFja2dyb3VuZDogIzA3MzY0Mjt9LmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQgeyAgYm9yZGVyOiAxcHggc29saWQgIzA3MzY0Mjt9ICAgICAgIC5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9pbnZpc2libGUgeyAgY29sb3I6IHJnYmEoMTQ3LCAxNjEsIDE2MSwgMC41MCk7fS5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9rZXl3b3JkIHsgIGNvbG9yOiM4NTk5MDA7fS5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2UgeyAgY29sb3I6I0I1ODkwMDt9LmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHsgIGNvbG9yOiNEMzM2ODI7fS5hY2Utc29sYXJpemVkLWRhcmsgLmFjZV9mb2xkIHsgICAgYmFja2dyb3VuZC1jb2xvcjogIzI2OEJEMjsgICAgYm9yZGVyLWNvbG9yOiAjOTNBMUExO30uYWNlLXNvbGFyaXplZC1kYXJrIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24geyAgY29sb3I6IzI2OEJEMjt9LmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX3N0cmluZyB7ICBjb2xvcjojMkFBMTk4O30uYWNlLXNvbGFyaXplZC1kYXJrIC5hY2Vfc3RyaW5nLmFjZV9yZWdleHAgeyAgY29sb3I6I0QzMDEwMjt9LmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX2NvbW1lbnQgeyAgZm9udC1zdHlsZTppdGFsaWM7Y29sb3I6IzY1N0I4Mzt9LmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX3ZhcmlhYmxlLmFjZV9sYW5ndWFnZSB7ICBjb2xvcjojMjY4QkQyO30uYWNlLXNvbGFyaXplZC1kYXJrIC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUgeyAgY29sb3I6IzkzQTFBMTt9LmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX2VudGl0eS5hY2VfbmFtZS5hY2VfZnVuY3Rpb24geyAgY29sb3I6IzI2OEJEMjt9LmFjZS1zb2xhcml6ZWQtZGFyayAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHsgICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9Ijt2YXIgZD1hKCIuLi9saWIvZG9tIik7ZC5pbXBvcnRDc3NTdHJpbmcoYi5jc3NUZXh0LGIuY3NzQ2xhc3MpfSksZnVuY3Rpb24oKXt3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSxmdW5jdGlvbihhKXt3aW5kb3cuYWNlfHwod2luZG93LmFjZT17fSk7Zm9yKHZhciBiIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShiKSYmKGFjZVtiXT1hW2JdKX0pfSgp]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-solarized_light-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvdGhlbWUvc29sYXJpemVkX2xpZ2h0JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKCmV4cG9ydHMuaXNEYXJrID0gZmFsc2U7CmV4cG9ydHMuY3NzQ2xhc3MgPSAiYWNlLXNvbGFyaXplZC1saWdodCI7CmV4cG9ydHMuY3NzVGV4dCA9ICJcCi5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfZWRpdG9yIHtcCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wKfVwKXAouYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX2VkaXRvci5hY2VfZm9jdXMge1wKICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO1wKfVwKXAouYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX2d1dHRlciB7XAogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XAogIGNvbG9yOiAjMzMzO1wKfVwKXAouYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX3ByaW50X21hcmdpbiB7XAogIHdpZHRoOiAxcHg7XAogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XAp9XApcCi5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2Vfc2Nyb2xsZXIge1wKICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkRGNkUzO1wKfVwKXAouYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX3RleHQtbGF5ZXIge1wKICBjdXJzb3I6IHRleHQ7XAogIGNvbG9yOiAjNTg2RTc1O1wKfVwKXAouYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX2N1cnNvciB7XAogIGJvcmRlci1sZWZ0OiAycHggc29saWQgIzAwMDAwMDtcCn1cClwKLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7XAogIGJvcmRlci1sZWZ0OiAwcHg7XAogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMDAwMDAwO1wKfVwKIFwKLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wKICBiYWNrZ3JvdW5kOiAjMDczNjQyO1wKfVwKXAouYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wKICBiYWNrZ3JvdW5kOiByZ2IoMTk4LCAyMTksIDE3NCk7XAp9XApcCi5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7XAogIG1hcmdpbjogLTFweCAwIDAgLTFweDtcCiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxNDcsIDE2MSwgMTYxLCAwLjUwKTtcCn1cClwKLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7XAogIGJhY2tncm91bmQ6ICNFRUU4RDU7XAp9XApcCi5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7XAogIGJvcmRlcjogMXB4IHNvbGlkICMwNzM2NDI7XAp9XAogICAgICAgXAouYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX2ludmlzaWJsZSB7XAogIGNvbG9yOiByZ2JhKDE0NywgMTYxLCAxNjEsIDAuNTApO1wKfVwKXAouYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX2tleXdvcmQge1wKICBjb2xvcjojODU5OTAwO1wKfVwKXAouYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7XAogIGNvbG9yOiNCNTg5MDA7XAp9XApcCi5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMge1wKICBjb2xvcjojRDMzNjgyO1wKfVwKXAouYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX2ZvbGQge1wKICAgIGJhY2tncm91bmQtY29sb3I6ICMyNjhCRDI7XAogICAgYm9yZGVyLWNvbG9yOiAjNTg2RTc1O1wKfVwKXAouYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHtcCiAgY29sb3I6IzI2OEJEMjtcCn1cClwKLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9zdHJpbmcge1wKICBjb2xvcjojMkFBMTk4O1wKfVwKXAouYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX3N0cmluZy5hY2VfcmVnZXhwIHtcCiAgY29sb3I6I0QzMDEwMjtcCn1cClwKLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9jb21tZW50IHtcCiAgY29sb3I6IzkzQTFBMTtcCn1cClwKLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV92YXJpYWJsZS5hY2VfbGFuZ3VhZ2Uge1wKICBjb2xvcjojMjY4QkQyO1wKfVwKXAouYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX2VudGl0eS5hY2Vfb3RoZXIuYWNlX2F0dHJpYnV0ZS1uYW1lIHtcCiAgY29sb3I6IzkzQTFBMTtcCn1cClwKLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9lbnRpdHkuYWNlX25hbWUuYWNlX2Z1bmN0aW9uIHtcCiAgY29sb3I6IzI2OEJEMjtcCn1cClwKLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7XAogICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcCn0iOwoKdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsKZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOwp9KTsKOwogICAgICAgICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgewogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KSgpOwogICAgICAgIA==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-solarized_light.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvc29sYXJpemVkX2xpZ2h0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oYSxiLGMpe2IuaXNEYXJrPSExLGIuY3NzQ2xhc3M9ImFjZS1zb2xhcml6ZWQtbGlnaHQiLGIuY3NzVGV4dD0iLmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9lZGl0b3IgeyAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO30uYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX2VkaXRvci5hY2VfZm9jdXMgeyAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDt9LmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9ndXR0ZXIgeyAgYmFja2dyb3VuZDogI2U4ZThlODsgIGNvbG9yOiAjMzMzO30uYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX3ByaW50X21hcmdpbiB7ICB3aWR0aDogMXB4OyAgYmFja2dyb3VuZDogI2U4ZThlODt9LmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9zY3JvbGxlciB7ICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkRGNkUzO30uYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX3RleHQtbGF5ZXIgeyAgY3Vyc29yOiB0ZXh0OyAgY29sb3I6ICM1ODZFNzU7fS5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfY3Vyc29yIHsgIGJvcmRlci1sZWZ0OiAycHggc29saWQgIzAwMDAwMDt9LmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7ICBib3JkZXItbGVmdDogMHB4OyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMwMDAwMDA7fSAuYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7ICBiYWNrZ3JvdW5kOiAjMDczNjQyO30uYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAgeyAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO30uYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQgeyAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4OyAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxNDcsIDE2MSwgMTYxLCAwLjUwKTt9LmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7ICBiYWNrZ3JvdW5kOiAjRUVFOEQ1O30uYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQgeyAgYm9yZGVyOiAxcHggc29saWQgIzA3MzY0Mjt9ICAgICAgIC5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2VfaW52aXNpYmxlIHsgIGNvbG9yOiByZ2JhKDE0NywgMTYxLCAxNjEsIDAuNTApO30uYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX2tleXdvcmQgeyAgY29sb3I6Izg1OTkwMDt9LmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2UgeyAgY29sb3I6I0I1ODkwMDt9LmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9jb25zdGFudC5hY2VfbnVtZXJpYyB7ICBjb2xvcjojRDMzNjgyO30uYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX2ZvbGQgeyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjY4QkQyOyAgICBib3JkZXItY29sb3I6ICM1ODZFNzU7fS5hY2Utc29sYXJpemVkLWxpZ2h0IC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24geyAgY29sb3I6IzI2OEJEMjt9LmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9zdHJpbmcgeyAgY29sb3I6IzJBQTE5ODt9LmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9zdHJpbmcuYWNlX3JlZ2V4cCB7ICBjb2xvcjojRDMwMTAyO30uYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX2NvbW1lbnQgeyAgY29sb3I6IzkzQTFBMTt9LmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV92YXJpYWJsZS5hY2VfbGFuZ3VhZ2UgeyAgY29sb3I6IzI2OEJEMjt9LmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9lbnRpdHkuYWNlX290aGVyLmFjZV9hdHRyaWJ1dGUtbmFtZSB7ICBjb2xvcjojOTNBMUExO30uYWNlLXNvbGFyaXplZC1saWdodCAuYWNlX2VudGl0eS5hY2VfbmFtZS5hY2VfZnVuY3Rpb24geyAgY29sb3I6IzI2OEJEMjt9LmFjZS1zb2xhcml6ZWQtbGlnaHQgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7ICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fSI7dmFyIGQ9YSgiLi4vbGliL2RvbSIpO2QuaW1wb3J0Q3NzU3RyaW5nKGIuY3NzVGV4dCxiLmNzc0NsYXNzKX0pLGZ1bmN0aW9uKCl7d2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sZnVuY3Rpb24oYSl7d2luZG93LmFjZXx8KHdpbmRvdy5hY2U9e30pO2Zvcih2YXIgYiBpbiBhKWEuaGFzT3duUHJvcGVydHkoYikmJihhY2VbYl09YVtiXSl9KX0oKQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-textmate-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvdGhlbWUvdGV4dG1hdGUnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7CgpleHBvcnRzLmlzRGFyayA9IGZhbHNlOwpleHBvcnRzLmNzc0NsYXNzID0gImFjZS10bSI7CmV4cG9ydHMuY3NzVGV4dCA9ICIuYWNlLXRtIC5hY2VfZWRpdG9yIHtcCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wKfVwKXAouYWNlLXRtIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7XAogIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7XAp9XApcCi5hY2UtdG0gLmFjZV9ndXR0ZXIge1wKICBiYWNrZ3JvdW5kOiAjZThlOGU4O1wKICBjb2xvcjogIzMzMztcCn1cClwKLmFjZS10bSAuYWNlX3ByaW50X21hcmdpbiB7XAogIHdpZHRoOiAxcHg7XAogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XAp9XApcCi5hY2UtdG0gLmFjZV9mb2xkIHtcCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMEEyO1wKfVwKXAouYWNlLXRtIC5hY2VfdGV4dC1sYXllciB7XAogIGN1cnNvcjogdGV4dDtcCn1cClwKLmFjZS10bSAuYWNlX2N1cnNvciB7XAogIGJvcmRlci1sZWZ0OiAycHggc29saWQgYmxhY2s7XAp9XApcCi5hY2UtdG0gLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7XAogIGJvcmRlci1sZWZ0OiAwcHg7XAogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjaztcCn1cCiAgICAgICAgXAouYWNlLXRtIC5hY2VfbGluZSAuYWNlX2ludmlzaWJsZSB7XAogIGNvbG9yOiByZ2IoMTkxLCAxOTEsIDE5MSk7XAp9XApcCi5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfa2V5d29yZCB7XAogIGNvbG9yOiBibHVlO1wKfVwKXAouYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9idWlsZGluIHtcCiAgY29sb3I6IHJnYig4OCwgNzIsIDI0Nik7XAp9XApcCi5hY2UtdG0gLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX2xhbmd1YWdlIHtcCiAgY29sb3I6IHJnYig4OCwgOTIsIDI0Nik7XAp9XApcCi5hY2UtdG0gLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX2xpYnJhcnkge1wKICBjb2xvcjogcmdiKDYsIDE1MCwgMTQpO1wKfVwKXAouYWNlLXRtIC5hY2VfbGluZSAuYWNlX2ludmFsaWQge1wKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTUzLCAwLCAwKTtcCiAgY29sb3I6IHdoaXRlO1wKfVwKXAouYWNlLXRtIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHtcCiAgY29sb3I6IHJnYig2MCwgNzYsIDExNCk7XAp9XApcCi5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfY29uc3RhbnQge1wKICBjb2xvcjogcmdiKDYsIDE1MCwgMTQpO1wKfVwKXAouYWNlLXRtIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX3R5cGUsXAouYWNlLXRtIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX2NsYXNzIHtcCiAgY29sb3I6IHJnYigxMDksIDEyMSwgMjIyKTtcCn1cClwKLmFjZS10bSAuYWNlX2xpbmUgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7XAogIGNvbG9yOiByZ2IoMTA0LCAxMTgsIDEzNSk7XAp9XApcCi5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfc3RyaW5nIHtcCiAgY29sb3I6IHJnYigzLCAxMDYsIDcpO1wKfVwKXAouYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQge1wKICBjb2xvcjogcmdiKDc2LCAxMzYsIDEwNyk7XAp9XApcCi5hY2UtdG0gLmFjZV9saW5lIC5hY2VfY29tbWVudC5hY2VfZG9jIHtcCiAgY29sb3I6IHJnYigwLCAxMDIsIDI1NSk7XAp9XApcCi5hY2UtdG0gLmFjZV9saW5lIC5hY2VfY29tbWVudC5hY2VfZG9jLmFjZV90YWcge1wKICBjb2xvcjogcmdiKDEyOCwgMTU5LCAxOTEpO1wKfVwKXAouYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHtcCiAgY29sb3I6IHJnYigwLCAwLCAyMDUpO1wKfVwKXAouYWNlLXRtIC5hY2VfbGluZSAuYWNlX3ZhcmlhYmxlIHtcCiAgY29sb3I6IHJnYig0OSwgMTMyLCAxNDkpO1wKfVwKXAouYWNlLXRtIC5hY2VfbGluZSAuYWNlX3htbF9wZSB7XAogIGNvbG9yOiByZ2IoMTA0LCAxMDQsIDkxKTtcCn1cClwKLmFjZS10bSAuYWNlX2VudGl0eS5hY2VfbmFtZS5hY2VfZnVuY3Rpb24ge1wKICBjb2xvcjogIzAwMDBBMjtcCn1cClwKLmFjZS10bSAuYWNlX21hcmt1cC5hY2VfbWFya3VwaW5lIHtcCiAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wKfVwKXAouYWNlLXRtIC5hY2VfbWFya3VwLmFjZV9oZWFkaW5nIHtcCiAgY29sb3I6IHJnYigxMiwgNywgMjU1KTtcCn1cClwKLmFjZS10bSAuYWNlX21hcmt1cC5hY2VfbGlzdCB7XAogIGNvbG9yOnJnYigxODUsIDYsIDE0NCk7XAp9XApcCi5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wKICBiYWNrZ3JvdW5kOiByZ2IoMTgxLCAyMTMsIDI1NSk7XAp9XApcCi5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwIHtcCiAgYmFja2dyb3VuZDogcmdiKDI1MiwgMjU1LCAwKTtcCn1cClwKLmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0YWNrIHtcCiAgYmFja2dyb3VuZDogcmdiKDE2NCwgMjI5LCAxMDEpO1wKfVwKXAouYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7XAogIG1hcmdpbjogLTFweCAwIDAgLTFweDtcCiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE5MiwgMTkyLCAxOTIpO1wKfVwKXAouYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wKICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDcpO1wKfVwKXAouYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7XAogIGJhY2tncm91bmQ6IHJnYigyNTAsIDI1MCwgMjU1KTtcCiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDIwMCwgMjAwLCAyNTApO1wKfVwKXAouYWNlLXRtIC5hY2VfbWV0YS5hY2VfdGFnIHtcCiAgY29sb3I6cmdiKDI4LCAyLCAyNTUpO1wKfVwKXAouYWNlLXRtIC5hY2Vfc3RyaW5nLmFjZV9yZWdleCB7XAogIGNvbG9yOiByZ2IoMjU1LCAwLCAwKVwKfSI7Cgp2YXIgZG9tID0gcmVxdWlyZSgiLi4vbGliL2RvbSIpOwpkb20uaW1wb3J0Q3NzU3RyaW5nKGV4cG9ydHMuY3NzVGV4dCwgZXhwb3J0cy5jc3NDbGFzcyk7Cn0pOwo7CiAgICAgICAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAg]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-textmate.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvdGV4dG1hdGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiLGIuaXNEYXJrPSExLGIuY3NzQ2xhc3M9ImFjZS10bSIsYi5jc3NUZXh0PSIuYWNlLXRtIC5hY2VfZWRpdG9yIHsgIGJvcmRlcjogMnB4IHNvbGlkIHJnYigxNTksIDE1OSwgMTU5KTt9LmFjZS10bSAuYWNlX2VkaXRvci5hY2VfZm9jdXMgeyAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDt9LmFjZS10bSAuYWNlX2d1dHRlciB7ICBiYWNrZ3JvdW5kOiAjZThlOGU4OyAgY29sb3I6ICMzMzM7fS5hY2UtdG0gLmFjZV9wcmludF9tYXJnaW4geyAgd2lkdGg6IDFweDsgIGJhY2tncm91bmQ6ICNlOGU4ZTg7fS5hY2UtdG0gLmFjZV9mb2xkIHsgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDBBMjt9LmFjZS10bSAuYWNlX3RleHQtbGF5ZXIgeyAgY3Vyc29yOiB0ZXh0O30uYWNlLXRtIC5hY2VfY3Vyc29yIHsgIGJvcmRlci1sZWZ0OiAycHggc29saWQgYmxhY2s7fS5hY2UtdG0gLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7ICBib3JkZXItbGVmdDogMHB4OyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO30gICAgICAgIC5hY2UtdG0gLmFjZV9saW5lIC5hY2VfaW52aXNpYmxlIHsgIGNvbG9yOiByZ2IoMTkxLCAxOTEsIDE5MSk7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfa2V5d29yZCB7ICBjb2xvcjogYmx1ZTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfYnVpbGRpbiB7ICBjb2xvcjogcmdiKDg4LCA3MiwgMjQ2KTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2UgeyAgY29sb3I6IHJnYig4OCwgOTIsIDI0Nik7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2VfY29uc3RhbnQuYWNlX2xpYnJhcnkgeyAgY29sb3I6IHJnYig2LCAxNTAsIDE0KTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9pbnZhbGlkIHsgIGJhY2tncm91bmQtY29sb3I6IHJnYigxNTMsIDAsIDApOyAgY29sb3I6IHdoaXRlO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHsgIGNvbG9yOiByZ2IoNjAsIDc2LCAxMTQpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX2NvbnN0YW50IHsgIGNvbG9yOiByZ2IoNiwgMTUwLCAxNCk7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfc3VwcG9ydC5hY2VfdHlwZSwuYWNlLXRtIC5hY2VfbGluZSAuYWNlX3N1cHBvcnQuYWNlX2NsYXNzIHsgIGNvbG9yOiByZ2IoMTA5LCAxMjEsIDIyMik7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2Vfa2V5d29yZC5hY2Vfb3BlcmF0b3IgeyAgY29sb3I6IHJnYigxMDQsIDExOCwgMTM1KTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9zdHJpbmcgeyAgY29sb3I6IHJnYigzLCAxMDYsIDcpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQgeyAgY29sb3I6IHJnYig3NiwgMTM2LCAxMDcpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbW1lbnQuYWNlX2RvYyB7ICBjb2xvcjogcmdiKDAsIDEwMiwgMjU1KTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV9jb21tZW50LmFjZV9kb2MuYWNlX3RhZyB7ICBjb2xvcjogcmdiKDEyOCwgMTU5LCAxOTEpO30uYWNlLXRtIC5hY2VfbGluZSAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHsgIGNvbG9yOiByZ2IoMCwgMCwgMjA1KTt9LmFjZS10bSAuYWNlX2xpbmUgLmFjZV92YXJpYWJsZSB7ICBjb2xvcjogcmdiKDQ5LCAxMzIsIDE0OSk7fS5hY2UtdG0gLmFjZV9saW5lIC5hY2VfeG1sX3BlIHsgIGNvbG9yOiByZ2IoMTA0LCAxMDQsIDkxKTt9LmFjZS10bSAuYWNlX2VudGl0eS5hY2VfbmFtZS5hY2VfZnVuY3Rpb24geyAgY29sb3I6ICMwMDAwQTI7fS5hY2UtdG0gLmFjZV9tYXJrdXAuYWNlX21hcmt1cGluZSB7ICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fS5hY2UtdG0gLmFjZV9tYXJrdXAuYWNlX2hlYWRpbmcgeyAgY29sb3I6IHJnYigxMiwgNywgMjU1KTt9LmFjZS10bSAuYWNlX21hcmt1cC5hY2VfbGlzdCB7ICBjb2xvcjpyZ2IoMTg1LCA2LCAxNDQpO30uYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHsgIGJhY2tncm91bmQ6IHJnYigxODEsIDIxMywgMjU1KTt9LmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAgeyAgYmFja2dyb3VuZDogcmdiKDI1MiwgMjU1LCAwKTt9LmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0YWNrIHsgIGJhY2tncm91bmQ6IHJnYigxNjQsIDIyOSwgMTAxKTt9LmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQgeyAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4OyAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE5MiwgMTkyLCAxOTIpO30uYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUgeyAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA3KTt9LmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQgeyAgYmFja2dyb3VuZDogcmdiKDI1MCwgMjUwLCAyNTUpOyAgYm9yZGVyOiAxcHggc29saWQgcmdiKDIwMCwgMjAwLCAyNTApO30uYWNlLXRtIC5hY2VfbWV0YS5hY2VfdGFnIHsgIGNvbG9yOnJnYigyOCwgMiwgMjU1KTt9LmFjZS10bSAuYWNlX3N0cmluZy5hY2VfcmVnZXggeyAgY29sb3I6IHJnYigyNTUsIDAsIDApfSI7dmFyIGQ9YSgiLi4vbGliL2RvbSIpO2QuaW1wb3J0Q3NzU3RyaW5nKGIuY3NzVGV4dCxiLmNzc0NsYXNzKX0pLGZ1bmN0aW9uKCl7d2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sZnVuY3Rpb24oYSl7d2luZG93LmFjZXx8KHdpbmRvdy5hY2U9e30pO2Zvcih2YXIgYiBpbiBhKWEuaGFzT3duUHJvcGVydHkoYikmJihhY2VbYl09YVtiXSl9KX0oKQ==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-tomorrow-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvdGhlbWUvdG9tb3Jyb3cnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoKZXhwb3J0cy5pc0RhcmsgPSBmYWxzZTsKZXhwb3J0cy5jc3NDbGFzcyA9ICJhY2UtdG9tb3Jyb3ciOwpleHBvcnRzLmNzc1RleHQgPSAiXAouYWNlLXRvbW9ycm93IC5hY2VfZWRpdG9yIHtcCiAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO1wKfVwKXAouYWNlLXRvbW9ycm93IC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7XAogIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7XAp9XApcCi5hY2UtdG9tb3Jyb3cgLmFjZV9ndXR0ZXIge1wKICBiYWNrZ3JvdW5kOiAjZThlOGU4O1wKICBjb2xvcjogIzMzMztcCn1cClwKLmFjZS10b21vcnJvdyAuYWNlX3ByaW50X21hcmdpbiB7XAogIHdpZHRoOiAxcHg7XAogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XAp9XApcCi5hY2UtdG9tb3Jyb3cgLmFjZV9zY3JvbGxlciB7XAogIGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7XAp9XApcCi5hY2UtdG9tb3Jyb3cgLmFjZV90ZXh0LWxheWVyIHtcCiAgY3Vyc29yOiB0ZXh0O1wKICBjb2xvcjogIzRENEQ0QztcCn1cClwKLmFjZS10b21vcnJvdyAuYWNlX2N1cnNvciB7XAogIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0FFQUZBRDtcCn1cClwKLmFjZS10b21vcnJvdyAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHtcCiAgYm9yZGVyLWxlZnQ6IDBweDtcCiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNBRUFGQUQ7XAp9XAogXAouYWNlLXRvbW9ycm93IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHtcCiAgYmFja2dyb3VuZDogI0Q2RDZENjtcCn1cClwKLmFjZS10b21vcnJvdyAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge1wKICBiYWNrZ3JvdW5kOiByZ2IoMTk4LCAyMTksIDE3NCk7XAp9XApcCi5hY2UtdG9tb3Jyb3cgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHtcCiAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4O1wKICBib3JkZXI6IDFweCBzb2xpZCAjRDFEMUQxO1wKfVwKXAouYWNlLXRvbW9ycm93IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wKICBiYWNrZ3JvdW5kOiAjRUZFRkVGO1wKfVwKXAouYWNlLXRvbW9ycm93IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7XAogIGJvcmRlcjogMXB4IHNvbGlkICNENkQ2RDY7XAp9XAogICAgICAgXAouYWNlLXRvbW9ycm93IC5hY2VfaW52aXNpYmxlIHtcCiAgY29sb3I6ICNEMUQxRDE7XAp9XApcCi5hY2UtdG9tb3Jyb3cgLmFjZV9rZXl3b3JkIHtcCiAgY29sb3I6Izg5NTlBODtcCn1cClwKLmFjZS10b21vcnJvdyAuYWNlX2tleXdvcmQuYWNlX29wZXJhdG9yIHtcCiAgY29sb3I6IzNFOTk5RjtcCn1cClwKLmFjZS10b21vcnJvdyAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7XAogIGNvbG9yOiNGNTg3MUY7XAp9XApcCi5hY2UtdG9tb3Jyb3cgLmFjZV9jb25zdGFudC5hY2VfbnVtZXJpYyB7XAogIGNvbG9yOiNGNTg3MUY7XAp9XApcCi5hY2UtdG9tb3Jyb3cgLmFjZV9pbnZhbGlkIHtcCiAgY29sb3I6I0ZGRkZGRjtcCmJhY2tncm91bmQtY29sb3I6I0M4MjgyOTtcCn1cClwKLmFjZS10b21vcnJvdyAuYWNlX2ludmFsaWQuYWNlX2RlcHJlY2F0ZWQge1wKICBjb2xvcjojRkZGRkZGO1wKYmFja2dyb3VuZC1jb2xvcjojODk1OUE4O1wKfVwKXAouYWNlLXRvbW9ycm93IC5hY2VfZm9sZCB7XAogICAgYmFja2dyb3VuZC1jb2xvcjogIzQyNzFBRTtcCiAgICBib3JkZXItY29sb3I6ICM0RDRENEM7XAp9XApcCi5hY2UtdG9tb3Jyb3cgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7XAogIGNvbG9yOiM0MjcxQUU7XAp9XApcCi5hY2UtdG9tb3Jyb3cgLmFjZV9zdHJpbmcge1wKICBjb2xvcjojNzE4QzAwO1wKfVwKXAouYWNlLXRvbW9ycm93IC5hY2Vfc3RyaW5nLmFjZV9yZWdleHAge1wKICBjb2xvcjojQzgyODI5O1wKfVwKXAouYWNlLXRvbW9ycm93IC5hY2VfY29tbWVudCB7XAogIGNvbG9yOiM4RTkwOEM7XAp9XApcCi5hY2UtdG9tb3Jyb3cgLmFjZV92YXJpYWJsZSB7XAogIGNvbG9yOiNDODI4Mjk7XAp9XApcCi5hY2UtdG9tb3Jyb3cgLmFjZV9tZXRhLmFjZV90YWcge1wKICBjb2xvcjojQzgyODI5O1wKfVwKXAouYWNlLXRvbW9ycm93IC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUge1wKICBjb2xvcjojQzgyODI5O1wKfVwKXAouYWNlLXRvbW9ycm93IC5hY2VfZW50aXR5LmFjZV9uYW1lLmFjZV9mdW5jdGlvbiB7XAogIGNvbG9yOiM0MjcxQUU7XAp9XApcCi5hY2UtdG9tb3Jyb3cgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7XAogICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcCn1cClwKLmFjZS10b21vcnJvdyAuYWNlX21hcmt1cC5hY2VfaGVhZGluZyB7XAogIGNvbG9yOiM3MThDMDA7XAp9IjsKCnZhciBkb20gPSByZXF1aXJlKCIuLi9saWIvZG9tIik7CmRvbS5pbXBvcnRDc3NTdHJpbmcoZXhwb3J0cy5jc3NUZXh0LCBleHBvcnRzLmNzc0NsYXNzKTsKfSk7CjsKICAgICAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgd2luZG93LnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSB7fTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkKICAgICAgICAgICAgICAgICAgICAgICAgYWNlW2tleV0gPSBhW2tleV07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkoKTsKICAgICAgICA=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-tomorrow.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvdG9tb3Jyb3ciLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7Yi5pc0Rhcms9ITEsYi5jc3NDbGFzcz0iYWNlLXRvbW9ycm93IixiLmNzc1RleHQ9Ii5hY2UtdG9tb3Jyb3cgLmFjZV9lZGl0b3IgeyAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO30uYWNlLXRvbW9ycm93IC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7ICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO30uYWNlLXRvbW9ycm93IC5hY2VfZ3V0dGVyIHsgIGJhY2tncm91bmQ6ICNlOGU4ZTg7ICBjb2xvcjogIzMzMzt9LmFjZS10b21vcnJvdyAuYWNlX3ByaW50X21hcmdpbiB7ICB3aWR0aDogMXB4OyAgYmFja2dyb3VuZDogI2U4ZThlODt9LmFjZS10b21vcnJvdyAuYWNlX3Njcm9sbGVyIHsgIGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7fS5hY2UtdG9tb3Jyb3cgLmFjZV90ZXh0LWxheWVyIHsgIGN1cnNvcjogdGV4dDsgIGNvbG9yOiAjNEQ0RDRDO30uYWNlLXRvbW9ycm93IC5hY2VfY3Vyc29yIHsgIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0FFQUZBRDt9LmFjZS10b21vcnJvdyAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHsgIGJvcmRlci1sZWZ0OiAwcHg7ICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0FFQUZBRDt9IC5hY2UtdG9tb3Jyb3cgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24geyAgYmFja2dyb3VuZDogI0Q2RDZENjt9LmFjZS10b21vcnJvdyAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAgeyAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO30uYWNlLXRvbW9ycm93IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7ICBtYXJnaW46IC0xcHggMCAwIC0xcHg7ICBib3JkZXI6IDFweCBzb2xpZCAjRDFEMUQxO30uYWNlLXRvbW9ycm93IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUgeyAgYmFja2dyb3VuZDogI0VGRUZFRjt9LmFjZS10b21vcnJvdyAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQgeyAgYm9yZGVyOiAxcHggc29saWQgI0Q2RDZENjt9ICAgICAgIC5hY2UtdG9tb3Jyb3cgLmFjZV9pbnZpc2libGUgeyAgY29sb3I6ICNEMUQxRDE7fS5hY2UtdG9tb3Jyb3cgLmFjZV9rZXl3b3JkIHsgIGNvbG9yOiM4OTU5QTg7fS5hY2UtdG9tb3Jyb3cgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7ICBjb2xvcjojM0U5OTlGO30uYWNlLXRvbW9ycm93IC5hY2VfY29uc3RhbnQuYWNlX2xhbmd1YWdlIHsgIGNvbG9yOiNGNTg3MUY7fS5hY2UtdG9tb3Jyb3cgLmFjZV9jb25zdGFudC5hY2VfbnVtZXJpYyB7ICBjb2xvcjojRjU4NzFGO30uYWNlLXRvbW9ycm93IC5hY2VfaW52YWxpZCB7ICBjb2xvcjojRkZGRkZGO2JhY2tncm91bmQtY29sb3I6I0M4MjgyOTt9LmFjZS10b21vcnJvdyAuYWNlX2ludmFsaWQuYWNlX2RlcHJlY2F0ZWQgeyAgY29sb3I6I0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOiM4OTU5QTg7fS5hY2UtdG9tb3Jyb3cgLmFjZV9mb2xkIHsgICAgYmFja2dyb3VuZC1jb2xvcjogIzQyNzFBRTsgICAgYm9yZGVyLWNvbG9yOiAjNEQ0RDRDO30uYWNlLXRvbW9ycm93IC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24geyAgY29sb3I6IzQyNzFBRTt9LmFjZS10b21vcnJvdyAuYWNlX3N0cmluZyB7ICBjb2xvcjojNzE4QzAwO30uYWNlLXRvbW9ycm93IC5hY2Vfc3RyaW5nLmFjZV9yZWdleHAgeyAgY29sb3I6I0M4MjgyOTt9LmFjZS10b21vcnJvdyAuYWNlX2NvbW1lbnQgeyAgY29sb3I6IzhFOTA4Qzt9LmFjZS10b21vcnJvdyAuYWNlX3ZhcmlhYmxlIHsgIGNvbG9yOiNDODI4Mjk7fS5hY2UtdG9tb3Jyb3cgLmFjZV9tZXRhLmFjZV90YWcgeyAgY29sb3I6I0M4MjgyOTt9LmFjZS10b21vcnJvdyAuYWNlX2VudGl0eS5hY2Vfb3RoZXIuYWNlX2F0dHJpYnV0ZS1uYW1lIHsgIGNvbG9yOiNDODI4Mjk7fS5hY2UtdG9tb3Jyb3cgLmFjZV9lbnRpdHkuYWNlX25hbWUuYWNlX2Z1bmN0aW9uIHsgIGNvbG9yOiM0MjcxQUU7fS5hY2UtdG9tb3Jyb3cgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7ICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fS5hY2UtdG9tb3Jyb3cgLmFjZV9tYXJrdXAuYWNlX2hlYWRpbmcgeyAgY29sb3I6IzcxOEMwMDt9Ijt2YXIgZD1hKCIuLi9saWIvZG9tIik7ZC5pbXBvcnRDc3NTdHJpbmcoYi5jc3NUZXh0LGIuY3NzQ2xhc3MpfSksZnVuY3Rpb24oKXt3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSxmdW5jdGlvbihhKXt3aW5kb3cuYWNlfHwod2luZG93LmFjZT17fSk7Zm9yKHZhciBiIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShiKSYmKGFjZVtiXT1hW2JdKX0pfSgp]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-tomorrow_night-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvdGhlbWUvdG9tb3Jyb3dfbmlnaHQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoKZXhwb3J0cy5pc0RhcmsgPSB0cnVlOwpleHBvcnRzLmNzc0NsYXNzID0gImFjZS10b21vcnJvdy1uaWdodCI7CmV4cG9ydHMuY3NzVGV4dCA9ICJcCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9lZGl0b3Ige1wKICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHtcCiAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX2d1dHRlciB7XAogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XAogIGNvbG9yOiAjMzMzO1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfcHJpbnRfbWFyZ2luIHtcCiAgd2lkdGg6IDFweDtcCiAgYmFja2dyb3VuZDogI2U4ZThlODtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX3Njcm9sbGVyIHtcCiAgYmFja2dyb3VuZC1jb2xvcjogIzFEMUYyMTtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX3RleHQtbGF5ZXIge1wKICBjdXJzb3I6IHRleHQ7XAogIGNvbG9yOiAjQzVDOEM2O1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfY3Vyc29yIHtcCiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjQUVBRkFEO1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUge1wKICBib3JkZXItbGVmdDogMHB4O1wKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0FFQUZBRDtcCn1cCiBcCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wKICBiYWNrZ3JvdW5kOiAjMzczQjQxO1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7XAogIGJhY2tncm91bmQ6IHJnYigxOTgsIDIxOSwgMTc0KTtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge1wKICBtYXJnaW46IC0xcHggMCAwIC0xcHg7XAogIGJvcmRlcjogMXB4IHNvbGlkICM0QjRFNTU7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7XAogIGJhY2tncm91bmQ6ICMyODJBMkU7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcCiAgYm9yZGVyOiAxcHggc29saWQgIzM3M0I0MTtcCn1cCiAgICAgICBcCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9pbnZpc2libGUge1wKICBjb2xvcjogIzRCNEU1NTtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX2tleXdvcmQge1wKICBjb2xvcjojQjI5NEJCO1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2Vfa2V5d29yZC5hY2Vfb3BlcmF0b3Ige1wKICBjb2xvcjojOEFCRUI3O1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfY29uc3RhbnQuYWNlX2xhbmd1YWdlIHtcCiAgY29sb3I6I0RFOTM1RjtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHtcCiAgY29sb3I6I0RFOTM1RjtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX2ludmFsaWQge1wKICBjb2xvcjojQ0VEMkNGO1wKYmFja2dyb3VuZC1jb2xvcjojREY1RjVGO1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfaW52YWxpZC5hY2VfZGVwcmVjYXRlZCB7XAogIGNvbG9yOiNDRUQyQ0Y7XApiYWNrZ3JvdW5kLWNvbG9yOiNCNzk4QkY7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9mb2xkIHtcCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjODFBMkJFO1wKICAgIGJvcmRlci1jb2xvcjogI0M1QzhDNjtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHtcCiAgY29sb3I6IzgxQTJCRTtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX3N0cmluZyB7XAogIGNvbG9yOiNCNUJENjg7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9zdHJpbmcuYWNlX3JlZ2V4cCB7XAogIGNvbG9yOiNDQzY2NjY7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9jb21tZW50IHtcCiAgY29sb3I6Izk2OTg5NjtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX3ZhcmlhYmxlIHtcCiAgY29sb3I6I0NDNjY2NjtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX21ldGEuYWNlX3RhZyB7XAogIGNvbG9yOiNDQzY2NjY7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9lbnRpdHkuYWNlX290aGVyLmFjZV9hdHRyaWJ1dGUtbmFtZSB7XAogIGNvbG9yOiNDQzY2NjY7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9lbnRpdHkuYWNlX25hbWUuYWNlX2Z1bmN0aW9uIHtcCiAgY29sb3I6IzgxQTJCRTtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodCAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHtcCiAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfbWFya3VwLmFjZV9oZWFkaW5nIHtcCiAgY29sb3I6I0I1QkQ2ODtcCn0iOwoKdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsKZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOwp9KTsKOwogICAgICAgICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgewogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KSgpOwogICAgICAgIA==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-tomorrow_night.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvdG9tb3Jyb3dfbmlnaHQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7Yi5pc0Rhcms9ITAsYi5jc3NDbGFzcz0iYWNlLXRvbW9ycm93LW5pZ2h0IixiLmNzc1RleHQ9Ii5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9lZGl0b3IgeyAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO30uYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7ICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO30uYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfZ3V0dGVyIHsgIGJhY2tncm91bmQ6ICNlOGU4ZTg7ICBjb2xvcjogIzMzMzt9LmFjZS10b21vcnJvdy1uaWdodCAuYWNlX3ByaW50X21hcmdpbiB7ICB3aWR0aDogMXB4OyAgYmFja2dyb3VuZDogI2U4ZThlODt9LmFjZS10b21vcnJvdy1uaWdodCAuYWNlX3Njcm9sbGVyIHsgIGJhY2tncm91bmQtY29sb3I6ICMxRDFGMjE7fS5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV90ZXh0LWxheWVyIHsgIGN1cnNvcjogdGV4dDsgIGNvbG9yOiAjQzVDOEM2O30uYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfY3Vyc29yIHsgIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0FFQUZBRDt9LmFjZS10b21vcnJvdy1uaWdodCAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHsgIGJvcmRlci1sZWZ0OiAwcHg7ICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0FFQUZBRDt9IC5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24geyAgYmFja2dyb3VuZDogIzM3M0I0MTt9LmFjZS10b21vcnJvdy1uaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAgeyAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO30uYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7ICBtYXJnaW46IC0xcHggMCAwIC0xcHg7ICBib3JkZXI6IDFweCBzb2xpZCAjNEI0RTU1O30uYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUgeyAgYmFja2dyb3VuZDogIzI4MkEyRTt9LmFjZS10b21vcnJvdy1uaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQgeyAgYm9yZGVyOiAxcHggc29saWQgIzM3M0I0MTt9ICAgICAgIC5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9pbnZpc2libGUgeyAgY29sb3I6ICM0QjRFNTU7fS5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9rZXl3b3JkIHsgIGNvbG9yOiNCMjk0QkI7fS5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7ICBjb2xvcjojOEFCRUI3O30uYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfY29uc3RhbnQuYWNlX2xhbmd1YWdlIHsgIGNvbG9yOiNERTkzNUY7fS5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9jb25zdGFudC5hY2VfbnVtZXJpYyB7ICBjb2xvcjojREU5MzVGO30uYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2VfaW52YWxpZCB7ICBjb2xvcjojQ0VEMkNGO2JhY2tncm91bmQtY29sb3I6I0RGNUY1Rjt9LmFjZS10b21vcnJvdy1uaWdodCAuYWNlX2ludmFsaWQuYWNlX2RlcHJlY2F0ZWQgeyAgY29sb3I6I0NFRDJDRjtiYWNrZ3JvdW5kLWNvbG9yOiNCNzk4QkY7fS5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9mb2xkIHsgICAgYmFja2dyb3VuZC1jb2xvcjogIzgxQTJCRTsgICAgYm9yZGVyLWNvbG9yOiAjQzVDOEM2O30uYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24geyAgY29sb3I6IzgxQTJCRTt9LmFjZS10b21vcnJvdy1uaWdodCAuYWNlX3N0cmluZyB7ICBjb2xvcjojQjVCRDY4O30uYWNlLXRvbW9ycm93LW5pZ2h0IC5hY2Vfc3RyaW5nLmFjZV9yZWdleHAgeyAgY29sb3I6I0NDNjY2Njt9LmFjZS10b21vcnJvdy1uaWdodCAuYWNlX2NvbW1lbnQgeyAgY29sb3I6Izk2OTg5Njt9LmFjZS10b21vcnJvdy1uaWdodCAuYWNlX3ZhcmlhYmxlIHsgIGNvbG9yOiNDQzY2NjY7fS5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9tZXRhLmFjZV90YWcgeyAgY29sb3I6I0NDNjY2Njt9LmFjZS10b21vcnJvdy1uaWdodCAuYWNlX2VudGl0eS5hY2Vfb3RoZXIuYWNlX2F0dHJpYnV0ZS1uYW1lIHsgIGNvbG9yOiNDQzY2NjY7fS5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9lbnRpdHkuYWNlX25hbWUuYWNlX2Z1bmN0aW9uIHsgIGNvbG9yOiM4MUEyQkU7fS5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7ICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fS5hY2UtdG9tb3Jyb3ctbmlnaHQgLmFjZV9tYXJrdXAuYWNlX2hlYWRpbmcgeyAgY29sb3I6I0I1QkQ2ODt9Ijt2YXIgZD1hKCIuLi9saWIvZG9tIik7ZC5pbXBvcnRDc3NTdHJpbmcoYi5jc3NUZXh0LGIuY3NzQ2xhc3MpfSksZnVuY3Rpb24oKXt3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSxmdW5jdGlvbihhKXt3aW5kb3cuYWNlfHwod2luZG93LmFjZT17fSk7Zm9yKHZhciBiIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShiKSYmKGFjZVtiXT1hW2JdKX0pfSgp]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-tomorrow_night_blue-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvdGhlbWUvdG9tb3Jyb3dfbmlnaHRfYmx1ZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CgpleHBvcnRzLmlzRGFyayA9IHRydWU7CmV4cG9ydHMuY3NzQ2xhc3MgPSAiYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUiOwpleHBvcnRzLmNzc1RleHQgPSAiXAouYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9lZGl0b3Ige1wKICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX2VkaXRvci5hY2VfZm9jdXMge1wKICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9ndXR0ZXIge1wKICBiYWNrZ3JvdW5kOiAjZThlOGU4O1wKICBjb2xvcjogIzMzMztcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfcHJpbnRfbWFyZ2luIHtcCiAgd2lkdGg6IDFweDtcCiAgYmFja2dyb3VuZDogI2U4ZThlODtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2Vfc2Nyb2xsZXIge1wKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAyNDUxO1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV90ZXh0LWxheWVyIHtcCiAgY3Vyc29yOiB0ZXh0O1wKICBjb2xvcjogI0ZGRkZGRjtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfY3Vyc29yIHtcCiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjRkZGRkZGO1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7XAogIGJvcmRlci1sZWZ0OiAwcHg7XAogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRkZGRkZGO1wKfVwKIFwKLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHtcCiAgYmFja2dyb3VuZDogIzAwM0Y4RTtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7XAogIGJhY2tncm91bmQ6IHJnYigxOTgsIDIxOSwgMTc0KTtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7XAogIG1hcmdpbjogLTFweCAwIDAgLTFweDtcCiAgYm9yZGVyOiAxcHggc29saWQgIzQwNEY3RDtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUge1wKICBiYWNrZ3JvdW5kOiAjMDAzNDZFO1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcCiAgYm9yZGVyOiAxcHggc29saWQgIzAwM0Y4RTtcCn1cCiAgICAgICBcCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX2ludmlzaWJsZSB7XAogIGNvbG9yOiAjNDA0RjdEO1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9rZXl3b3JkIHtcCiAgY29sb3I6I0VCQkJGRjtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2Vfa2V5d29yZC5hY2Vfb3BlcmF0b3Ige1wKICBjb2xvcjojOTlGRkZGO1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2Uge1wKICBjb2xvcjojRkZDNThGO1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9jb25zdGFudC5hY2VfbnVtZXJpYyB7XAogIGNvbG9yOiNGRkM1OEY7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX2ludmFsaWQge1wKICBjb2xvcjojRkZGRkZGO1wKYmFja2dyb3VuZC1jb2xvcjojRjk5REE1O1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9pbnZhbGlkLmFjZV9kZXByZWNhdGVkIHtcCiAgY29sb3I6I0ZGRkZGRjtcCmJhY2tncm91bmQtY29sb3I6I0VCQkJGRjtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfZm9sZCB7XAogICAgYmFja2dyb3VuZC1jb2xvcjogI0JCREFGRjtcCiAgICBib3JkZXItY29sb3I6ICNGRkZGRkY7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHtcCiAgY29sb3I6I0JCREFGRjtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2Vfc3RyaW5nIHtcCiAgY29sb3I6I0QxRjFBOTtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2Vfc3RyaW5nLmFjZV9yZWdleHAge1wKICBjb2xvcjojRkY5REE0O1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9jb21tZW50IHtcCiAgY29sb3I6IzcyODVCNztcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfdmFyaWFibGUge1wKICBjb2xvcjojRkY5REE0O1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9tZXRhLmFjZV90YWcge1wKICBjb2xvcjojRkY5REE0O1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9lbnRpdHkuYWNlX290aGVyLmFjZV9hdHRyaWJ1dGUtbmFtZSB7XAogIGNvbG9yOiNGRjlEQTQ7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX2VudGl0eS5hY2VfbmFtZS5hY2VfZnVuY3Rpb24ge1wKICBjb2xvcjojQkJEQUZGO1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7XAogICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfbWFya3VwLmFjZV9oZWFkaW5nIHtcCiAgY29sb3I6I0QxRjFBOTtcCn0iOwoKdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsKZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOwp9KTsKOwogICAgICAgICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgewogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KSgpOwogICAgICAgIA==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-tomorrow_night_blue.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvdG9tb3Jyb3dfbmlnaHRfYmx1ZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGEsYixjKXtiLmlzRGFyaz0hMCxiLmNzc0NsYXNzPSJhY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSIsYi5jc3NUZXh0PSIuYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9lZGl0b3IgeyAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHsgIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX2d1dHRlciB7ICBiYWNrZ3JvdW5kOiAjZThlOGU4OyAgY29sb3I6ICMzMzM7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX3ByaW50X21hcmdpbiB7ICB3aWR0aDogMXB4OyAgYmFja2dyb3VuZDogI2U4ZThlODt9LmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2Vfc2Nyb2xsZXIgeyAgYmFja2dyb3VuZC1jb2xvcjogIzAwMjQ1MTt9LmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfdGV4dC1sYXllciB7ICBjdXJzb3I6IHRleHQ7ICBjb2xvcjogI0ZGRkZGRjt9LmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfY3Vyc29yIHsgIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0ZGRkZGRjt9LmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUgeyAgYm9yZGVyLWxlZnQ6IDBweDsgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRkZGRkZGO30gLmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHsgIGJhY2tncm91bmQ6ICMwMDNGOEU7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAgeyAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHsgIG1hcmdpbjogLTFweCAwIDAgLTFweDsgIGJvcmRlcjogMXB4IHNvbGlkICM0MDRGN0Q7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHsgIGJhY2tncm91bmQ6ICMwMDM0NkU7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQgeyAgYm9yZGVyOiAxcHggc29saWQgIzAwM0Y4RTt9ICAgICAgIC5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX2ludmlzaWJsZSB7ICBjb2xvcjogIzQwNEY3RDt9LmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2Vfa2V5d29yZCB7ICBjb2xvcjojRUJCQkZGO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7ICBjb2xvcjojOTlGRkZGO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2UgeyAgY29sb3I6I0ZGQzU4Rjt9LmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMgeyAgY29sb3I6I0ZGQzU4Rjt9LmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfaW52YWxpZCB7ICBjb2xvcjojRkZGRkZGO2JhY2tncm91bmQtY29sb3I6I0Y5OURBNTt9LmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfaW52YWxpZC5hY2VfZGVwcmVjYXRlZCB7ICBjb2xvcjojRkZGRkZGO2JhY2tncm91bmQtY29sb3I6I0VCQkJGRjt9LmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfZm9sZCB7ICAgIGJhY2tncm91bmQtY29sb3I6ICNCQkRBRkY7ICAgIGJvcmRlci1jb2xvcjogI0ZGRkZGRjt9LmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24geyAgY29sb3I6I0JCREFGRjt9LmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2Vfc3RyaW5nIHsgIGNvbG9yOiNEMUYxQTk7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX3N0cmluZy5hY2VfcmVnZXhwIHsgIGNvbG9yOiNGRjlEQTQ7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX2NvbW1lbnQgeyAgY29sb3I6IzcyODVCNzt9LmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfdmFyaWFibGUgeyAgY29sb3I6I0ZGOURBNDt9LmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfbWV0YS5hY2VfdGFnIHsgIGNvbG9yOiNGRjlEQTQ7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX2VudGl0eS5hY2Vfb3RoZXIuYWNlX2F0dHJpYnV0ZS1uYW1lIHsgIGNvbG9yOiNGRjlEQTQ7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYmx1ZSAuYWNlX2VudGl0eS5hY2VfbmFtZS5hY2VfZnVuY3Rpb24geyAgY29sb3I6I0JCREFGRjt9LmFjZS10b21vcnJvdy1uaWdodC1ibHVlIC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUgeyAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJsdWUgLmFjZV9tYXJrdXAuYWNlX2hlYWRpbmcgeyAgY29sb3I6I0QxRjFBOTt9Ijt2YXIgZD1hKCIuLi9saWIvZG9tIik7ZC5pbXBvcnRDc3NTdHJpbmcoYi5jc3NUZXh0LGIuY3NzQ2xhc3MpfSksZnVuY3Rpb24oKXt3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSxmdW5jdGlvbihhKXt3aW5kb3cuYWNlfHwod2luZG93LmFjZT17fSk7Zm9yKHZhciBiIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShiKSYmKGFjZVtiXT1hW2JdKX0pfSgp]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-tomorrow_night_bright-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvdGhlbWUvdG9tb3Jyb3dfbmlnaHRfYnJpZ2h0JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKCmV4cG9ydHMuaXNEYXJrID0gdHJ1ZTsKZXhwb3J0cy5jc3NDbGFzcyA9ICJhY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IjsKZXhwb3J0cy5jc3NUZXh0ID0gIlwKLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9lZGl0b3Ige1wKICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7XAogIGJvcmRlcjogMnB4IHNvbGlkICMzMjdmYmQ7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfZ3V0dGVyIHtcCiAgYmFja2dyb3VuZDogI2U4ZThlODtcCiAgY29sb3I6ICMzMzM7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfcHJpbnRfbWFyZ2luIHtcCiAgd2lkdGg6IDFweDtcCiAgYmFja2dyb3VuZDogI2U4ZThlODtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9zY3JvbGxlciB7XAogIGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfdGV4dC1sYXllciB7XAogIGN1cnNvcjogdGV4dDtcCiAgY29sb3I6ICNERURFREU7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfY3Vyc29yIHtcCiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjOUY5RjlGO1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHtcCiAgYm9yZGVyLWxlZnQ6IDBweDtcCiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM5RjlGOUY7XAp9XAogXAouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7XAogIGJhY2tncm91bmQ6ICM0MjQyNDI7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7XAogIGJhY2tncm91bmQ6IHJnYigxOTgsIDIxOSwgMTc0KTtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHtcCiAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4O1wKICBib3JkZXI6IDFweCBzb2xpZCAjMzQzNDM0O1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZV9saW5lIHtcCiAgYmFja2dyb3VuZDogIzJBMkEyQTtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcCiAgYm9yZGVyOiAxcHggc29saWQgIzQyNDI0MjtcCn1cCiAgICAgICBcCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfaW52aXNpYmxlIHtcCiAgY29sb3I6ICMzNDM0MzQ7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2Vfa2V5d29yZCB7XAogIGNvbG9yOiNDMzk3RDg7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2Vfa2V5d29yZC5hY2Vfb3BlcmF0b3Ige1wKICBjb2xvcjojNzBDMEIxO1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7XAogIGNvbG9yOiNFNzhDNDU7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMge1wKICBjb2xvcjojRTc4QzQ1O1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2ludmFsaWQge1wKICBjb2xvcjojQ0VEMkNGO1wKYmFja2dyb3VuZC1jb2xvcjojREY1RjVGO1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2ludmFsaWQuYWNlX2RlcHJlY2F0ZWQge1wKICBjb2xvcjojQ0VEMkNGO1wKYmFja2dyb3VuZC1jb2xvcjojQjc5OEJGO1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2ZvbGQge1wKICAgIGJhY2tncm91bmQtY29sb3I6ICM3QUE2REE7XAogICAgYm9yZGVyLWNvbG9yOiAjREVERURFO1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHtcCiAgY29sb3I6IzdBQTZEQTtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9zdHJpbmcge1wKICBjb2xvcjojQjlDQTRBO1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX3N0cmluZy5hY2VfcmVnZXhwIHtcCiAgY29sb3I6I0Q1NEU1MztcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9jb21tZW50IHtcCiAgY29sb3I6Izk2OTg5NjtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV92YXJpYWJsZSB7XAogIGNvbG9yOiNENTRFNTM7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfbWV0YS5hY2VfdGFnIHtcCiAgY29sb3I6I0Q1NEU1MztcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9lbnRpdHkuYWNlX290aGVyLmFjZV9hdHRyaWJ1dGUtbmFtZSB7XAogIGNvbG9yOiNENTRFNTM7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfZW50aXR5LmFjZV9uYW1lLmFjZV9mdW5jdGlvbiB7XAogIGNvbG9yOiM3QUE2REE7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUge1wKICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfbWFya3VwLmFjZV9oZWFkaW5nIHtcCiAgY29sb3I6I0I5Q0E0QTtcCn0iOwoKdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsKZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOwp9KTsKOwogICAgICAgICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgewogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KSgpOwogICAgICAgIA==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-tomorrow_night_bright.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvdG9tb3Jyb3dfbmlnaHRfYnJpZ2h0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oYSxiLGMpe2IuaXNEYXJrPSEwLGIuY3NzQ2xhc3M9ImFjZS10b21vcnJvdy1uaWdodC1icmlnaHQiLGIuY3NzVGV4dD0iLmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9lZGl0b3IgeyAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2VkaXRvci5hY2VfZm9jdXMgeyAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDt9LmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9ndXR0ZXIgeyAgYmFja2dyb3VuZDogI2U4ZThlODsgIGNvbG9yOiAjMzMzO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX3ByaW50X21hcmdpbiB7ICB3aWR0aDogMXB4OyAgYmFja2dyb3VuZDogI2U4ZThlODt9LmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9zY3JvbGxlciB7ICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX3RleHQtbGF5ZXIgeyAgY3Vyc29yOiB0ZXh0OyAgY29sb3I6ICNERURFREU7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfY3Vyc29yIHsgIGJvcmRlci1sZWZ0OiAycHggc29saWQgIzlGOUY5Rjt9LmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9jdXJzb3IuYWNlX292ZXJ3cml0ZSB7ICBib3JkZXItbGVmdDogMHB4OyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM5RjlGOUY7fSAuYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7ICBiYWNrZ3JvdW5kOiAjNDI0MjQyO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAgeyAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQgeyAgbWFyZ2luOiAtMXB4IDAgMCAtMXB4OyAgYm9yZGVyOiAxcHggc29saWQgIzM0MzQzNDt9LmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7ICBiYWNrZ3JvdW5kOiAjMkEyQTJBO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQgeyAgYm9yZGVyOiAxcHggc29saWQgIzQyNDI0Mjt9ICAgICAgIC5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfaW52aXNpYmxlIHsgIGNvbG9yOiAjMzQzNDM0O30uYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2tleXdvcmQgeyAgY29sb3I6I0MzOTdEODt9LmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7ICBjb2xvcjojNzBDMEIxO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7ICBjb2xvcjojRTc4QzQ1O30uYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHsgIGNvbG9yOiNFNzhDNDU7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfaW52YWxpZCB7ICBjb2xvcjojQ0VEMkNGO2JhY2tncm91bmQtY29sb3I6I0RGNUY1Rjt9LmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9pbnZhbGlkLmFjZV9kZXByZWNhdGVkIHsgIGNvbG9yOiNDRUQyQ0Y7YmFja2dyb3VuZC1jb2xvcjojQjc5OEJGO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2ZvbGQgeyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjN0FBNkRBOyAgICBib3JkZXItY29sb3I6ICNERURFREU7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24geyAgY29sb3I6IzdBQTZEQTt9LmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9zdHJpbmcgeyAgY29sb3I6I0I5Q0E0QTt9LmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9zdHJpbmcuYWNlX3JlZ2V4cCB7ICBjb2xvcjojRDU0RTUzO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2NvbW1lbnQgeyAgY29sb3I6Izk2OTg5Njt9LmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV92YXJpYWJsZSB7ICBjb2xvcjojRDU0RTUzO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX21ldGEuYWNlX3RhZyB7ICBjb2xvcjojRDU0RTUzO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX2VudGl0eS5hY2Vfb3RoZXIuYWNlX2F0dHJpYnV0ZS1uYW1lIHsgIGNvbG9yOiNENTRFNTM7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5hY2VfZW50aXR5LmFjZV9uYW1lLmFjZV9mdW5jdGlvbiB7ICBjb2xvcjojN0FBNkRBO30uYWNlLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHsgICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9LmFjZS10b21vcnJvdy1uaWdodC1icmlnaHQgLmFjZV9tYXJrdXAuYWNlX2hlYWRpbmcgeyAgY29sb3I6I0I5Q0E0QTt9Ijt2YXIgZD1hKCIuLi9saWIvZG9tIik7ZC5pbXBvcnRDc3NTdHJpbmcoYi5jc3NUZXh0LGIuY3NzQ2xhc3MpfSksZnVuY3Rpb24oKXt3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSxmdW5jdGlvbihhKXt3aW5kb3cuYWNlfHwod2luZG93LmFjZT17fSk7Zm9yKHZhciBiIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShiKSYmKGFjZVtiXT1hW2JdKX0pfSgp]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-tomorrow_night_eighties-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvdGhlbWUvdG9tb3Jyb3dfbmlnaHRfZWlnaHRpZXMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoKZXhwb3J0cy5pc0RhcmsgPSB0cnVlOwpleHBvcnRzLmNzc0NsYXNzID0gImFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyI7CmV4cG9ydHMuY3NzVGV4dCA9ICJcCi5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9lZGl0b3Ige1wKICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHtcCiAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX2d1dHRlciB7XAogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XAogIGNvbG9yOiAjMzMzO1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfcHJpbnRfbWFyZ2luIHtcCiAgd2lkdGg6IDFweDtcCiAgYmFja2dyb3VuZDogI2U4ZThlODtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX3Njcm9sbGVyIHtcCiAgYmFja2dyb3VuZC1jb2xvcjogIzJEMkQyRDtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX3RleHQtbGF5ZXIge1wKICBjdXJzb3I6IHRleHQ7XAogIGNvbG9yOiAjQ0NDQ0NDO1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfY3Vyc29yIHtcCiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjQ0NDQ0NDO1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUge1wKICBib3JkZXItbGVmdDogMHB4O1wKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0NDQ0NDQztcCn1cCiBcCi5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wKICBiYWNrZ3JvdW5kOiAjNTE1MTUxO1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7XAogIGJhY2tncm91bmQ6IHJnYigxOTgsIDIxOSwgMTc0KTtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge1wKICBtYXJnaW46IC0xcHggMCAwIC0xcHg7XAogIGJvcmRlcjogMXB4IHNvbGlkICM2QTZBNkE7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7XAogIGJhY2tncm91bmQ6ICMzOTM5Mzk7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcCiAgYm9yZGVyOiAxcHggc29saWQgIzUxNTE1MTtcCn1cCiAgICAgICBcCi5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9pbnZpc2libGUge1wKICBjb2xvcjogIzZBNkE2QTtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX2tleXdvcmQge1wKICBjb2xvcjojQ0M5OUNDO1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2Vfa2V5d29yZC5hY2Vfb3BlcmF0b3Ige1wKICBjb2xvcjojNjZDQ0NDO1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfY29uc3RhbnQuYWNlX2xhbmd1YWdlIHtcCiAgY29sb3I6I0Y5OTE1NztcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHtcCiAgY29sb3I6I0Y5OTE1NztcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX2ludmFsaWQge1wKICBjb2xvcjojQ0RDRENEO1wKYmFja2dyb3VuZC1jb2xvcjojRjI3NzdBO1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfaW52YWxpZC5hY2VfZGVwcmVjYXRlZCB7XAogIGNvbG9yOiNDRENEQ0Q7XApiYWNrZ3JvdW5kLWNvbG9yOiNDQzk5Q0M7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9mb2xkIHtcCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNjY5OUNDO1wKICAgIGJvcmRlci1jb2xvcjogI0NDQ0NDQztcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHtcCiAgY29sb3I6IzY2OTlDQztcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX3N0cmluZyB7XAogIGNvbG9yOiM5OUNDOTk7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9jb21tZW50IHtcCiAgY29sb3I6Izk5OTk5OTtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX3ZhcmlhYmxlIHtcCiAgY29sb3I6I0YyNzc3QTtcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX21ldGEuYWNlX3RhZyB7XAogIGNvbG9yOiNGMjc3N0E7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9lbnRpdHkuYWNlX290aGVyLmFjZV9hdHRyaWJ1dGUtbmFtZSB7XAogIGNvbG9yOiNGMjc3N0E7XAp9XApcCi5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9lbnRpdHkuYWNlX25hbWUuYWNlX2Z1bmN0aW9uIHtcCiAgY29sb3I6IzY2OTlDQztcCn1cClwKLmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHtcCiAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wKfVwKXAouYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfbWFya3VwLmFjZV9oZWFkaW5nIHtcCiAgY29sb3I6Izk5Q0M5OTtcCn0iOwoKdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsKZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOwp9KTsKOwogICAgICAgICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgewogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KSgpOwogICAgICAgIA==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-tomorrow_night_eighties.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvdG9tb3Jyb3dfbmlnaHRfZWlnaHRpZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7Yi5pc0Rhcms9ITAsYi5jc3NDbGFzcz0iYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIixiLmNzc1RleHQ9Ii5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9lZGl0b3IgeyAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO30uYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7ICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO30uYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfZ3V0dGVyIHsgIGJhY2tncm91bmQ6ICNlOGU4ZTg7ICBjb2xvcjogIzMzMzt9LmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX3ByaW50X21hcmdpbiB7ICB3aWR0aDogMXB4OyAgYmFja2dyb3VuZDogI2U4ZThlODt9LmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX3Njcm9sbGVyIHsgIGJhY2tncm91bmQtY29sb3I6ICMyRDJEMkQ7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV90ZXh0LWxheWVyIHsgIGN1cnNvcjogdGV4dDsgIGNvbG9yOiAjQ0NDQ0NDO30uYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfY3Vyc29yIHsgIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0NDQ0NDQzt9LmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHsgIGJvcmRlci1sZWZ0OiAwcHg7ICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0NDQ0NDQzt9IC5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24geyAgYmFja2dyb3VuZDogIzUxNTE1MTt9LmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAgeyAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO30uYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7ICBtYXJnaW46IC0xcHggMCAwIC0xcHg7ICBib3JkZXI6IDFweCBzb2xpZCAjNkE2QTZBO30uYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUgeyAgYmFja2dyb3VuZDogIzM5MzkzOTt9LmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQgeyAgYm9yZGVyOiAxcHggc29saWQgIzUxNTE1MTt9ICAgICAgIC5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9pbnZpc2libGUgeyAgY29sb3I6ICM2QTZBNkE7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9rZXl3b3JkIHsgIGNvbG9yOiNDQzk5Q0M7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7ICBjb2xvcjojNjZDQ0NDO30uYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfY29uc3RhbnQuYWNlX2xhbmd1YWdlIHsgIGNvbG9yOiNGOTkxNTc7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9jb25zdGFudC5hY2VfbnVtZXJpYyB7ICBjb2xvcjojRjk5MTU3O30uYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfaW52YWxpZCB7ICBjb2xvcjojQ0RDRENEO2JhY2tncm91bmQtY29sb3I6I0YyNzc3QTt9LmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX2ludmFsaWQuYWNlX2RlcHJlY2F0ZWQgeyAgY29sb3I6I0NEQ0RDRDtiYWNrZ3JvdW5kLWNvbG9yOiNDQzk5Q0M7fS5hY2UtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLmFjZV9mb2xkIHsgICAgYmFja2dyb3VuZC1jb2xvcjogIzY2OTlDQzsgICAgYm9yZGVyLWNvbG9yOiAjQ0NDQ0NDO30uYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24geyAgY29sb3I6IzY2OTlDQzt9LmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX3N0cmluZyB7ICBjb2xvcjojOTlDQzk5O30uYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfY29tbWVudCB7ICBjb2xvcjojOTk5OTk5O30uYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfdmFyaWFibGUgeyAgY29sb3I6I0YyNzc3QTt9LmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX21ldGEuYWNlX3RhZyB7ICBjb2xvcjojRjI3NzdBO30uYWNlLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUgeyAgY29sb3I6I0YyNzc3QTt9LmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX2VudGl0eS5hY2VfbmFtZS5hY2VfZnVuY3Rpb24geyAgY29sb3I6IzY2OTlDQzt9LmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHsgICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9LmFjZS10b21vcnJvdy1uaWdodC1laWdodGllcyAuYWNlX21hcmt1cC5hY2VfaGVhZGluZyB7ICBjb2xvcjojOTlDQzk5O30iO3ZhciBkPWEoIi4uL2xpYi9kb20iKTtkLmltcG9ydENzc1N0cmluZyhiLmNzc1RleHQsYi5jc3NDbGFzcyl9KSxmdW5jdGlvbigpe3dpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLGZ1bmN0aW9uKGEpe3dpbmRvdy5hY2V8fCh3aW5kb3cuYWNlPXt9KTtmb3IodmFyIGIgaW4gYSlhLmhhc093blByb3BlcnR5KGIpJiYoYWNlW2JdPWFbYl0pfSl9KCk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-twilight-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvdGhlbWUvdHdpbGlnaHQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoKZXhwb3J0cy5pc0RhcmsgPSB0cnVlOwpleHBvcnRzLmNzc0NsYXNzID0gImFjZS10d2lsaWdodCI7CmV4cG9ydHMuY3NzVGV4dCA9ICJcCi5hY2UtdHdpbGlnaHQgLmFjZV9lZGl0b3Ige1wKICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7XAp9XApcCi5hY2UtdHdpbGlnaHQgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHtcCiAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDtcCn1cClwKLmFjZS10d2lsaWdodCAuYWNlX2d1dHRlciB7XAogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XAogIGNvbG9yOiAjMzMzO1wKfVwKXAouYWNlLXR3aWxpZ2h0IC5hY2VfcHJpbnRfbWFyZ2luIHtcCiAgd2lkdGg6IDFweDtcCiAgYmFja2dyb3VuZDogI2U4ZThlODtcCn1cClwKLmFjZS10d2lsaWdodCAuYWNlX3Njcm9sbGVyIHtcCiAgYmFja2dyb3VuZC1jb2xvcjogIzE0MTQxNDtcCn1cClwKLmFjZS10d2lsaWdodCAuYWNlX3RleHQtbGF5ZXIge1wKICBjdXJzb3I6IHRleHQ7XAogIGNvbG9yOiAjRjhGOEY4O1wKfVwKXAouYWNlLXR3aWxpZ2h0IC5hY2VfY3Vyc29yIHtcCiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjQTdBN0E3O1wKfVwKXAouYWNlLXR3aWxpZ2h0IC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUge1wKICBib3JkZXItbGVmdDogMHB4O1wKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0E3QTdBNztcCn1cCiBcCi5hY2UtdHdpbGlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wKICBiYWNrZ3JvdW5kOiByZ2JhKDIyMSwgMjQwLCAyNTUsIDAuMjApO1wKfVwKXAouYWNlLXR3aWxpZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7XAogIGJhY2tncm91bmQ6IHJnYigxOTgsIDIxOSwgMTc0KTtcCn1cClwKLmFjZS10d2lsaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge1wKICBtYXJnaW46IC0xcHggMCAwIC0xcHg7XAogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNSk7XAp9XApcCi5hY2UtdHdpbGlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7XAogIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMzEpO1wKfVwKXAouYWNlLXR3aWxpZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWRfd29yZCB7XAogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjIxLCAyNDAsIDI1NSwgMC4yMCk7XAp9XAogICAgICAgXAouYWNlLXR3aWxpZ2h0IC5hY2VfaW52aXNpYmxlIHtcCiAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNSk7XAp9XApcCi5hY2UtdHdpbGlnaHQgLmFjZV9rZXl3b3JkIHtcCiAgY29sb3I6I0NEQTg2OTtcCn1cClwKLmFjZS10d2lsaWdodCAuYWNlX2NvbnN0YW50IHtcCiAgY29sb3I6I0NGNkE0QztcCn1cClwKLmFjZS10d2lsaWdodCAuYWNlX2ludmFsaWQuYWNlX2lsbGVnYWwge1wKICBjb2xvcjojRjhGOEY4O1wKYmFja2dyb3VuZC1jb2xvcjpyZ2JhKDg2LCA0NSwgODYsIDAuNzUpO1wKfVwKXAouYWNlLXR3aWxpZ2h0IC5hY2VfaW52YWxpZC5hY2VfZGVwcmVjYXRlZCB7XAogIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XApmb250LXN0eWxlOml0YWxpYztcCmNvbG9yOiNEMkE4QTE7XAp9XApcCi5hY2UtdHdpbGlnaHQgLmFjZV9zdXBwb3J0IHtcCiAgY29sb3I6IzlCODU5RDtcCn1cClwKLmFjZS10d2lsaWdodCAuYWNlX2ZvbGQge1wKICAgIGJhY2tncm91bmQtY29sb3I6ICNBQzg4NUI7XAogICAgYm9yZGVyLWNvbG9yOiAjRjhGOEY4O1wKfVwKXAouYWNlLXR3aWxpZ2h0IC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge1wKICBjb2xvcjojREFEMDg1O1wKfVwKXAouYWNlLXR3aWxpZ2h0IC5hY2Vfc3RyaW5nIHtcCiAgY29sb3I6IzhGOUQ2QTtcCn1cClwKLmFjZS10d2lsaWdodCAuYWNlX3N0cmluZy5hY2VfcmVnZXhwIHtcCiAgY29sb3I6I0U5QzA2MjtcCn1cClwKLmFjZS10d2lsaWdodCAuYWNlX2NvbW1lbnQge1wKICBmb250LXN0eWxlOml0YWxpYztcCmNvbG9yOiM1RjVBNjA7XAp9XApcCi5hY2UtdHdpbGlnaHQgLmFjZV92YXJpYWJsZSB7XAogIGNvbG9yOiM3NTg3QTY7XAp9XApcCi5hY2UtdHdpbGlnaHQgLmFjZV94bWxfcGUge1wKICBjb2xvcjojNDk0OTQ5O1wKfVwKXAouYWNlLXR3aWxpZ2h0IC5hY2VfbWV0YS5hY2VfdGFnIHtcCiAgY29sb3I6I0FDODg1QjtcCn1cClwKLmFjZS10d2lsaWdodCAuYWNlX2VudGl0eS5hY2VfbmFtZS5hY2VfZnVuY3Rpb24ge1wKICBjb2xvcjojQUM4ODVCO1wKfVwKXAouYWNlLXR3aWxpZ2h0IC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUge1wKICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XAp9XApcCi5hY2UtdHdpbGlnaHQgLmFjZV9tYXJrdXAuYWNlX2hlYWRpbmcge1wKICBjb2xvcjojQ0Y2QTRDO1wKfVwKXAouYWNlLXR3aWxpZ2h0IC5hY2VfbWFya3VwLmFjZV9saXN0IHtcCiAgY29sb3I6I0Y5RUU5ODtcCn0iOwoKdmFyIGRvbSA9IHJlcXVpcmUoIi4uL2xpYi9kb20iKTsKZG9tLmltcG9ydENzc1N0cmluZyhleHBvcnRzLmNzc1RleHQsIGV4cG9ydHMuY3NzQ2xhc3MpOwp9KTsKOwogICAgICAgICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgewogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQogICAgICAgICAgICAgICAgICAgICAgICBhY2Vba2V5XSA9IGFba2V5XTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KSgpOwogICAgICAgIA==]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-twilight.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvdHdpbGlnaHQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7Yi5pc0Rhcms9ITAsYi5jc3NDbGFzcz0iYWNlLXR3aWxpZ2h0IixiLmNzc1RleHQ9Ii5hY2UtdHdpbGlnaHQgLmFjZV9lZGl0b3IgeyAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO30uYWNlLXR3aWxpZ2h0IC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7ICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO30uYWNlLXR3aWxpZ2h0IC5hY2VfZ3V0dGVyIHsgIGJhY2tncm91bmQ6ICNlOGU4ZTg7ICBjb2xvcjogIzMzMzt9LmFjZS10d2lsaWdodCAuYWNlX3ByaW50X21hcmdpbiB7ICB3aWR0aDogMXB4OyAgYmFja2dyb3VuZDogI2U4ZThlODt9LmFjZS10d2lsaWdodCAuYWNlX3Njcm9sbGVyIHsgIGJhY2tncm91bmQtY29sb3I6ICMxNDE0MTQ7fS5hY2UtdHdpbGlnaHQgLmFjZV90ZXh0LWxheWVyIHsgIGN1cnNvcjogdGV4dDsgIGNvbG9yOiAjRjhGOEY4O30uYWNlLXR3aWxpZ2h0IC5hY2VfY3Vyc29yIHsgIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0E3QTdBNzt9LmFjZS10d2lsaWdodCAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHsgIGJvcmRlci1sZWZ0OiAwcHg7ICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0E3QTdBNzt9IC5hY2UtdHdpbGlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24geyAgYmFja2dyb3VuZDogcmdiYSgyMjEsIDI0MCwgMjU1LCAwLjIwKTt9LmFjZS10d2lsaWdodCAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAgeyAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO30uYWNlLXR3aWxpZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7ICBtYXJnaW46IC0xcHggMCAwIC0xcHg7ICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjUpO30uYWNlLXR3aWxpZ2h0IC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUgeyAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzMSk7fS5hY2UtdHdpbGlnaHQgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHsgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjIxLCAyNDAsIDI1NSwgMC4yMCk7fSAgICAgICAuYWNlLXR3aWxpZ2h0IC5hY2VfaW52aXNpYmxlIHsgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjUpO30uYWNlLXR3aWxpZ2h0IC5hY2Vfa2V5d29yZCB7ICBjb2xvcjojQ0RBODY5O30uYWNlLXR3aWxpZ2h0IC5hY2VfY29uc3RhbnQgeyAgY29sb3I6I0NGNkE0Qzt9LmFjZS10d2lsaWdodCAuYWNlX2ludmFsaWQuYWNlX2lsbGVnYWwgeyAgY29sb3I6I0Y4RjhGODtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoODYsIDQ1LCA4NiwgMC43NSk7fS5hY2UtdHdpbGlnaHQgLmFjZV9pbnZhbGlkLmFjZV9kZXByZWNhdGVkIHsgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Zm9udC1zdHlsZTppdGFsaWM7Y29sb3I6I0QyQThBMTt9LmFjZS10d2lsaWdodCAuYWNlX3N1cHBvcnQgeyAgY29sb3I6IzlCODU5RDt9LmFjZS10d2lsaWdodCAuYWNlX2ZvbGQgeyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQUM4ODVCOyAgICBib3JkZXItY29sb3I6ICNGOEY4Rjg7fS5hY2UtdHdpbGlnaHQgLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7ICBjb2xvcjojREFEMDg1O30uYWNlLXR3aWxpZ2h0IC5hY2Vfc3RyaW5nIHsgIGNvbG9yOiM4RjlENkE7fS5hY2UtdHdpbGlnaHQgLmFjZV9zdHJpbmcuYWNlX3JlZ2V4cCB7ICBjb2xvcjojRTlDMDYyO30uYWNlLXR3aWxpZ2h0IC5hY2VfY29tbWVudCB7ICBmb250LXN0eWxlOml0YWxpYztjb2xvcjojNUY1QTYwO30uYWNlLXR3aWxpZ2h0IC5hY2VfdmFyaWFibGUgeyAgY29sb3I6Izc1ODdBNjt9LmFjZS10d2lsaWdodCAuYWNlX3htbF9wZSB7ICBjb2xvcjojNDk0OTQ5O30uYWNlLXR3aWxpZ2h0IC5hY2VfbWV0YS5hY2VfdGFnIHsgIGNvbG9yOiNBQzg4NUI7fS5hY2UtdHdpbGlnaHQgLmFjZV9lbnRpdHkuYWNlX25hbWUuYWNlX2Z1bmN0aW9uIHsgIGNvbG9yOiNBQzg4NUI7fS5hY2UtdHdpbGlnaHQgLmFjZV9tYXJrdXAuYWNlX3VuZGVybGluZSB7ICAgIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fS5hY2UtdHdpbGlnaHQgLmFjZV9tYXJrdXAuYWNlX2hlYWRpbmcgeyAgY29sb3I6I0NGNkE0Qzt9LmFjZS10d2lsaWdodCAuYWNlX21hcmt1cC5hY2VfbGlzdCB7ICBjb2xvcjojRjlFRTk4O30iO3ZhciBkPWEoIi4uL2xpYi9kb20iKTtkLmltcG9ydENzc1N0cmluZyhiLmNzc1RleHQsYi5jc3NDbGFzcyl9KSxmdW5jdGlvbigpe3dpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLGZ1bmN0aW9uKGEpe3dpbmRvdy5hY2V8fCh3aW5kb3cuYWNlPXt9KTtmb3IodmFyIGIgaW4gYSlhLmhhc093blByb3BlcnR5KGIpJiYoYWNlW2JdPWFbYl0pfSl9KCk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-vibrant_ink-uncompressed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBNaWNoYWVsIFNjaHdhcnR6IDxtci5wYW50cyBBVCBnbWFpbCBET1QgY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvdGhlbWUvdmlicmFudF9pbmsnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoKZXhwb3J0cy5pc0RhcmsgPSB0cnVlOwpleHBvcnRzLmNzc0NsYXNzID0gImFjZS12aWJyYW50LWluayI7CmV4cG9ydHMuY3NzVGV4dCA9ICJcCi5hY2UtdmlicmFudC1pbmsgLmFjZV9lZGl0b3Ige1wKICBib3JkZXI6IDJweCBzb2xpZCByZ2IoMTU5LCAxNTksIDE1OSk7XAp9XApcCi5hY2UtdmlicmFudC1pbmsgLmFjZV9lZGl0b3IuYWNlX2ZvY3VzIHtcCiAgYm9yZGVyOiAycHggc29saWQgIzMyN2ZiZDtcCn1cClwKLmFjZS12aWJyYW50LWluayAuYWNlX2d1dHRlciB7XAogIGJhY2tncm91bmQ6ICNlOGU4ZTg7XAogIGNvbG9yOiAjMzMzO1wKfVwKXAouYWNlLXZpYnJhbnQtaW5rIC5hY2VfcHJpbnRfbWFyZ2luIHtcCiAgd2lkdGg6IDFweDtcCiAgYmFja2dyb3VuZDogI2U4ZThlODtcCn1cClwKLmFjZS12aWJyYW50LWluayAuYWNlX3Njcm9sbGVyIHtcCiAgYmFja2dyb3VuZC1jb2xvcjogIzBGMEYwRjtcCn1cClwKLmFjZS12aWJyYW50LWluayAuYWNlX3RleHQtbGF5ZXIge1wKICBjdXJzb3I6IHRleHQ7XAogIGNvbG9yOiAjRkZGRkZGO1wKfVwKXAouYWNlLXZpYnJhbnQtaW5rIC5hY2VfY3Vyc29yIHtcCiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjRkZGRkZGO1wKfVwKXAouYWNlLXZpYnJhbnQtaW5rIC5hY2VfY3Vyc29yLmFjZV9vdmVyd3JpdGUge1wKICBib3JkZXItbGVmdDogMHB4O1wKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0ZGRkZGRjtcCn1cCiBcCi5hY2UtdmlicmFudC1pbmsgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge1wKICBiYWNrZ3JvdW5kOiAjNjY5OUNDO1wKfVwKXAouYWNlLXZpYnJhbnQtaW5rIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7XAogIGJhY2tncm91bmQ6IHJnYigxOTgsIDIxOSwgMTc0KTtcCn1cClwKLmFjZS12aWJyYW50LWluayAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge1wKICBtYXJnaW46IC0xcHggMCAwIC0xcHg7XAogIGJvcmRlcjogMXB4IHNvbGlkICM0MDQwNDA7XAp9XApcCi5hY2UtdmlicmFudC1pbmsgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmVfbGluZSB7XAogIGJhY2tncm91bmQ6ICMzMzMzMzM7XAp9XApcCi5hY2UtdmlicmFudC1pbmsgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZF93b3JkIHtcCiAgYm9yZGVyOiAxcHggc29saWQgIzY2OTlDQztcCn1cCiAgICAgICBcCi5hY2UtdmlicmFudC1pbmsgLmFjZV9pbnZpc2libGUge1wKICBjb2xvcjogIzQwNDA0MDtcCn1cClwKLmFjZS12aWJyYW50LWluayAuYWNlX2tleXdvcmQge1wKICBjb2xvcjojRkY2NjAwO1wKfVwKXAouYWNlLXZpYnJhbnQtaW5rIC5hY2VfY29uc3RhbnQge1wKICBjb2xvcjojMzM5OTk5O1wKfVwKXAouYWNlLXZpYnJhbnQtaW5rIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMge1wKICBjb2xvcjojOTlDQzk5O1wKfVwKXAouYWNlLXZpYnJhbnQtaW5rIC5hY2VfaW52YWxpZCB7XAogIGNvbG9yOiNDQ0ZGMzM7XApiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwMDA7XAp9XApcCi5hY2UtdmlicmFudC1pbmsgLmFjZV9pbnZhbGlkLmFjZV9kZXByZWNhdGVkIHtcCiAgY29sb3I6I0NDRkYzMztcCmJhY2tncm91bmQtY29sb3I6IzAwMDAwMDtcCn1cClwKLmFjZS12aWJyYW50LWluayAuYWNlX2ZvbGQge1wKICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkNDMDA7XAogICAgYm9yZGVyLWNvbG9yOiAjRkZGRkZGO1wKfVwKXAouYWNlLXZpYnJhbnQtaW5rIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge1wKICBjb2xvcjojRkZDQzAwO1wKfVwKXAouYWNlLXZpYnJhbnQtaW5rIC5hY2Vfc3RyaW5nIHtcCiAgY29sb3I6IzY2RkYwMDtcCn1cClwKLmFjZS12aWJyYW50LWluayAuYWNlX3N0cmluZy5hY2VfcmVnZXhwIHtcCiAgY29sb3I6IzQ0QjRDQztcCn1cClwKLmFjZS12aWJyYW50LWluayAuYWNlX2NvbW1lbnQge1wKICBjb2xvcjojOTkzM0NDO1wKfVwKXAouYWNlLXZpYnJhbnQtaW5rIC5hY2VfZW50aXR5LmFjZV9vdGhlci5hY2VfYXR0cmlidXRlLW5hbWUge1wKICBmb250LXN0eWxlOml0YWxpYztcCmNvbG9yOiM5OUNDOTk7XAp9XApcCi5hY2UtdmlicmFudC1pbmsgLmFjZV9lbnRpdHkuYWNlX25hbWUuYWNlX2Z1bmN0aW9uIHtcCiAgY29sb3I6I0ZGQ0MwMDtcCn1cClwKLmFjZS12aWJyYW50LWluayAuYWNlX21hcmt1cC5hY2VfdW5kZXJsaW5lIHtcCiAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wKfSI7Cgp2YXIgZG9tID0gcmVxdWlyZSgiLi4vbGliL2RvbSIpOwpkb20uaW1wb3J0Q3NzU3RyaW5nKGV4cG9ydHMuY3NzVGV4dCwgZXhwb3J0cy5jc3NDbGFzcyk7Cn0pOwo7CiAgICAgICAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0ge307CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGFjZVtrZXldID0gYVtrZXldOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAg]]></data>
	</file>
	<file>
	  <filename>/ace/src/theme-vibrant_ink.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGVmaW5lKCJhY2UvdGhlbWUvdmlicmFudF9pbmsiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihhLGIsYyl7Yi5pc0Rhcms9ITAsYi5jc3NDbGFzcz0iYWNlLXZpYnJhbnQtaW5rIixiLmNzc1RleHQ9Ii5hY2UtdmlicmFudC1pbmsgLmFjZV9lZGl0b3IgeyAgYm9yZGVyOiAycHggc29saWQgcmdiKDE1OSwgMTU5LCAxNTkpO30uYWNlLXZpYnJhbnQtaW5rIC5hY2VfZWRpdG9yLmFjZV9mb2N1cyB7ICBib3JkZXI6IDJweCBzb2xpZCAjMzI3ZmJkO30uYWNlLXZpYnJhbnQtaW5rIC5hY2VfZ3V0dGVyIHsgIGJhY2tncm91bmQ6ICNlOGU4ZTg7ICBjb2xvcjogIzMzMzt9LmFjZS12aWJyYW50LWluayAuYWNlX3ByaW50X21hcmdpbiB7ICB3aWR0aDogMXB4OyAgYmFja2dyb3VuZDogI2U4ZThlODt9LmFjZS12aWJyYW50LWluayAuYWNlX3Njcm9sbGVyIHsgIGJhY2tncm91bmQtY29sb3I6ICMwRjBGMEY7fS5hY2UtdmlicmFudC1pbmsgLmFjZV90ZXh0LWxheWVyIHsgIGN1cnNvcjogdGV4dDsgIGNvbG9yOiAjRkZGRkZGO30uYWNlLXZpYnJhbnQtaW5rIC5hY2VfY3Vyc29yIHsgIGJvcmRlci1sZWZ0OiAycHggc29saWQgI0ZGRkZGRjt9LmFjZS12aWJyYW50LWluayAuYWNlX2N1cnNvci5hY2Vfb3ZlcndyaXRlIHsgIGJvcmRlci1sZWZ0OiAwcHg7ICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0ZGRkZGRjt9IC5hY2UtdmlicmFudC1pbmsgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24geyAgYmFja2dyb3VuZDogIzY2OTlDQzt9LmFjZS12aWJyYW50LWluayAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAgeyAgYmFja2dyb3VuZDogcmdiKDE5OCwgMjE5LCAxNzQpO30uYWNlLXZpYnJhbnQtaW5rIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7ICBtYXJnaW46IC0xcHggMCAwIC0xcHg7ICBib3JkZXI6IDFweCBzb2xpZCAjNDA0MDQwO30uYWNlLXZpYnJhbnQtaW5rIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlX2xpbmUgeyAgYmFja2dyb3VuZDogIzMzMzMzMzt9LmFjZS12aWJyYW50LWluayAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkX3dvcmQgeyAgYm9yZGVyOiAxcHggc29saWQgIzY2OTlDQzt9ICAgICAgIC5hY2UtdmlicmFudC1pbmsgLmFjZV9pbnZpc2libGUgeyAgY29sb3I6ICM0MDQwNDA7fS5hY2UtdmlicmFudC1pbmsgLmFjZV9rZXl3b3JkIHsgIGNvbG9yOiNGRjY2MDA7fS5hY2UtdmlicmFudC1pbmsgLmFjZV9jb25zdGFudCB7ICBjb2xvcjojMzM5OTk5O30uYWNlLXZpYnJhbnQtaW5rIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMgeyAgY29sb3I6Izk5Q0M5OTt9LmFjZS12aWJyYW50LWluayAuYWNlX2ludmFsaWQgeyAgY29sb3I6I0NDRkYzMztiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwMDA7fS5hY2UtdmlicmFudC1pbmsgLmFjZV9pbnZhbGlkLmFjZV9kZXByZWNhdGVkIHsgIGNvbG9yOiNDQ0ZGMzM7YmFja2dyb3VuZC1jb2xvcjojMDAwMDAwO30uYWNlLXZpYnJhbnQtaW5rIC5hY2VfZm9sZCB7ICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkNDMDA7ICAgIGJvcmRlci1jb2xvcjogI0ZGRkZGRjt9LmFjZS12aWJyYW50LWluayAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHsgIGNvbG9yOiNGRkNDMDA7fS5hY2UtdmlicmFudC1pbmsgLmFjZV9zdHJpbmcgeyAgY29sb3I6IzY2RkYwMDt9LmFjZS12aWJyYW50LWluayAuYWNlX3N0cmluZy5hY2VfcmVnZXhwIHsgIGNvbG9yOiM0NEI0Q0M7fS5hY2UtdmlicmFudC1pbmsgLmFjZV9jb21tZW50IHsgIGNvbG9yOiM5OTMzQ0M7fS5hY2UtdmlicmFudC1pbmsgLmFjZV9lbnRpdHkuYWNlX290aGVyLmFjZV9hdHRyaWJ1dGUtbmFtZSB7ICBmb250LXN0eWxlOml0YWxpYztjb2xvcjojOTlDQzk5O30uYWNlLXZpYnJhbnQtaW5rIC5hY2VfZW50aXR5LmFjZV9uYW1lLmFjZV9mdW5jdGlvbiB7ICBjb2xvcjojRkZDQzAwO30uYWNlLXZpYnJhbnQtaW5rIC5hY2VfbWFya3VwLmFjZV91bmRlcmxpbmUgeyAgICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30iO3ZhciBkPWEoIi4uL2xpYi9kb20iKTtkLmltcG9ydENzc1N0cmluZyhiLmNzc1RleHQsYi5jc3NDbGFzcyl9KSxmdW5jdGlvbigpe3dpbmRvdy5yZXF1aXJlKFsiYWNlL2FjZSJdLGZ1bmN0aW9uKGEpe3dpbmRvdy5hY2V8fCh3aW5kb3cuYWNlPXt9KTtmb3IodmFyIGIgaW4gYSlhLmhhc093blByb3BlcnR5KGIpJiYoYWNlW2JdPWFbYl0pfSl9KCk=]]></data>
	</file>
	<file>
	  <filename>/ace/src/worker-coffee.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Im5vIHVzZSBzdHJpY3QiOwoKdmFyIGNvbnNvbGUgPSB7CiAgICBsb2c6IGZ1bmN0aW9uKG1zZykgewogICAgICAgIHBvc3RNZXNzYWdlKHt0eXBlOiAibG9nIiwgZGF0YTogbXNnfSk7CiAgICB9Cn07CnZhciB3aW5kb3cgPSB7CiAgICBjb25zb2xlOiBjb25zb2xlCn07Cgp2YXIgbm9ybWFsaXplTW9kdWxlID0gZnVuY3Rpb24ocGFyZW50SWQsIG1vZHVsZU5hbWUpIHsKICAgIC8vIG5vcm1hbGl6ZSBwbHVnaW4gcmVxdWlyZXMKICAgIGlmIChtb2R1bGVOYW1lLmluZGV4T2YoIiEiKSAhPT0gLTEpIHsKICAgICAgICB2YXIgY2h1bmtzID0gbW9kdWxlTmFtZS5zcGxpdCgiISIpOwogICAgICAgIHJldHVybiBub3JtYWxpemVNb2R1bGUocGFyZW50SWQsIGNodW5rc1swXSkgKyAiISIgKyBub3JtYWxpemVNb2R1bGUocGFyZW50SWQsIGNodW5rc1sxXSk7CiAgICB9CiAgICAvLyBub3JtYWxpemUgcmVsYXRpdmUgcmVxdWlyZXMKICAgIGlmIChtb2R1bGVOYW1lLmNoYXJBdCgwKSA9PSAiLiIpIHsKICAgICAgICB2YXIgYmFzZSA9IHBhcmVudElkLnNwbGl0KCIvIikuc2xpY2UoMCwgLTEpLmpvaW4oIi8iKTsKICAgICAgICB2YXIgbW9kdWxlTmFtZSA9IGJhc2UgKyAiLyIgKyBtb2R1bGVOYW1lOwogICAgICAgIAogICAgICAgIHdoaWxlKG1vZHVsZU5hbWUuaW5kZXhPZigiLiIpICE9PSAtMSAmJiBwcmV2aW91cyAhPSBtb2R1bGVOYW1lKSB7CiAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IG1vZHVsZU5hbWU7CiAgICAgICAgICAgIHZhciBtb2R1bGVOYW1lID0gbW9kdWxlTmFtZS5yZXBsYWNlKC9cL1wuXC8vLCAiLyIpLnJlcGxhY2UoL1teXC9dK1wvXC5cLlwvLywgIiIpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgcmV0dXJuIG1vZHVsZU5hbWU7Cn07Cgp2YXIgcmVxdWlyZSA9IGZ1bmN0aW9uKHBhcmVudElkLCBpZCkgewogICAgdmFyIGlkID0gbm9ybWFsaXplTW9kdWxlKHBhcmVudElkLCBpZCk7CiAgICAKICAgIHZhciBtb2R1bGUgPSByZXF1aXJlLm1vZHVsZXNbaWRdOwogICAgaWYgKG1vZHVsZSkgewogICAgICAgIGlmICghbW9kdWxlLmluaXRpYWxpemVkKSB7CiAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gbW9kdWxlLmZhY3RvcnkoKS5leHBvcnRzOwogICAgICAgICAgICBtb2R1bGUuaW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbW9kdWxlLmV4cG9ydHM7CiAgICB9CiAgICAKICAgIHZhciBjaHVua3MgPSBpZC5zcGxpdCgiLyIpOwogICAgY2h1bmtzWzBdID0gcmVxdWlyZS50bG5zW2NodW5rc1swXV0gfHwgY2h1bmtzWzBdOwogICAgdmFyIHBhdGggPSBjaHVua3Muam9pbigiLyIpICsgIi5qcyI7CiAgICAKICAgIHJlcXVpcmUuaWQgPSBpZDsKICAgIGltcG9ydFNjcmlwdHMocGF0aCk7CiAgICByZXR1cm4gcmVxdWlyZShwYXJlbnRJZCwgaWQpOyAgICAKfTsKCnJlcXVpcmUubW9kdWxlcyA9IHt9OwpyZXF1aXJlLnRsbnMgPSB7fTsKCnZhciBkZWZpbmUgPSBmdW5jdGlvbihpZCwgZGVwcywgZmFjdG9yeSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICAgIGZhY3RvcnkgPSBkZXBzOwogICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgICBmYWN0b3J5ID0gaWQ7CiAgICAgICAgaWQgPSByZXF1aXJlLmlkOwogICAgfQoKICAgIGlmIChpZC5pbmRleE9mKCJ0ZXh0ISIpID09PSAwKSAKICAgICAgICByZXR1cm47CiAgICAKICAgIHZhciByZXEgPSBmdW5jdGlvbihkZXBzLCBmYWN0b3J5KSB7CiAgICAgICAgcmV0dXJuIHJlcXVpcmUoaWQsIGRlcHMsIGZhY3RvcnkpOwogICAgfTsKCiAgICByZXF1aXJlLm1vZHVsZXNbaWRdID0gewogICAgICAgIGZhY3Rvcnk6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgbW9kdWxlID0gewogICAgICAgICAgICAgICAgZXhwb3J0czoge30KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHJldHVybkV4cG9ydHMgPSBmYWN0b3J5KHJlcSwgbW9kdWxlLmV4cG9ydHMsIG1vZHVsZSk7CiAgICAgICAgICAgIGlmIChyZXR1cm5FeHBvcnRzKQogICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSByZXR1cm5FeHBvcnRzOwogICAgICAgICAgICByZXR1cm4gbW9kdWxlOwogICAgICAgIH0KICAgIH07Cn07CgpmdW5jdGlvbiBpbml0QmFzZVVybHModG9wTGV2ZWxOYW1lc3BhY2VzKSB7CiAgICByZXF1aXJlLnRsbnMgPSB0b3BMZXZlbE5hbWVzcGFjZXM7Cn0KCmZ1bmN0aW9uIGluaXRTZW5kZXIoKSB7CgogICAgdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUobnVsbCwgImFjZS9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsKICAgIHZhciBvb3AgPSByZXF1aXJlKG51bGwsICJhY2UvbGliL29vcCIpOwogICAgCiAgICB2YXIgU2VuZGVyID0gZnVuY3Rpb24oKSB7fTsKICAgIAogICAgKGZ1bmN0aW9uKCkgewogICAgICAgIAogICAgICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsKICAgICAgICAgICAgICAgIAogICAgICAgIHRoaXMuY2FsbGJhY2sgPSBmdW5jdGlvbihkYXRhLCBjYWxsYmFja0lkKSB7CiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgIHR5cGU6ICJjYWxsIiwKICAgICAgICAgICAgICAgIGlkOiBjYWxsYmFja0lkLAogICAgICAgICAgICAgICAgZGF0YTogZGF0YQogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgCiAgICAgICAgdGhpcy5lbWl0ID0gZnVuY3Rpb24obmFtZSwgZGF0YSkgewogICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICB0eXBlOiAiZXZlbnQiLAogICAgICAgICAgICAgICAgbmFtZTogbmFtZSwKICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAKICAgIH0pLmNhbGwoU2VuZGVyLnByb3RvdHlwZSk7CiAgICAKICAgIHJldHVybiBuZXcgU2VuZGVyKCk7Cn0KCnZhciBtYWluOwp2YXIgc2VuZGVyOwoKb25tZXNzYWdlID0gZnVuY3Rpb24oZSkgewogICAgdmFyIG1zZyA9IGUuZGF0YTsKICAgIGlmIChtc2cuY29tbWFuZCkgewogICAgICAgIG1haW5bbXNnLmNvbW1hbmRdLmFwcGx5KG1haW4sIG1zZy5hcmdzKTsKICAgIH0KICAgIGVsc2UgaWYgKG1zZy5pbml0KSB7ICAgICAgICAKICAgICAgICBpbml0QmFzZVVybHMobXNnLnRsbnMpOwogICAgICAgIHJlcXVpcmUobnVsbCwgImFjZS9saWIvZml4b2xkYnJvd3NlcnMiKTsKICAgICAgICBzZW5kZXIgPSBpbml0U2VuZGVyKCk7CiAgICAgICAgdmFyIGNsYXp6ID0gcmVxdWlyZShudWxsLCBtc2cubW9kdWxlKVttc2cuY2xhc3NuYW1lXTsKICAgICAgICBtYWluID0gbmV3IGNsYXp6KHNlbmRlcik7CiAgICB9IAogICAgZWxzZSBpZiAobXNnLmV2ZW50ICYmIHNlbmRlcikgewogICAgICAgIHNlbmRlci5fZW1pdChtc2cuZXZlbnQsIG1zZy5kYXRhKTsKICAgIH0KfTsKLy8gdmltOnNldCB0cz00IHN0cz00IHN3PTQgc3Q6Ci8vIC0tIGtyaXNrb3dhbCBLcmlzIEtvd2FsIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1JVCBMaWNlbnNlCi8vIC0tIHRscm9iaW5zb24gVG9tIFJvYmluc29uIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1JVCBMaWNlbnNlIChOYXJ3aGFsIFByb2plY3QpCi8vIC0tIGRhbnRtYW4gRGFuaWVsIEZyaWVzZW4gQ29weXJpZ2h0KEMpIDIwMTAgWFhYIE5vIExpY2Vuc2UgU3BlY2lmaWVkCi8vIC0tIGZzY2hhZWZlciBGbG9yaWFuIFNjaMOkZmVyIENvcHlyaWdodCAoQykgMjAxMCBNSVQgTGljZW5zZQovLyAtLSBJcmFrbGkgR296YWxpc2h2aWxpIENvcHlyaWdodCAoQykgMjAxMCBNSVQgTGljZW5zZQoKLyohCiAgICBDb3B5cmlnaHQgKGMpIDIwMDksIDI4MCBOb3J0aCBJbmMuIGh0dHA6Ly8yODBub3J0aC5jb20vCiAgICBNSVQgTGljZW5zZS4gaHR0cDovL2dpdGh1Yi5jb20vMjgwbm9ydGgvbmFyd2hhbC9ibG9iL21hc3Rlci9SRUFETUUubWQKKi8KCmRlZmluZSgnYWNlL2xpYi9maXhvbGRicm93c2VycycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9yZWdleHAnLCAnYWNlL2xpYi9lczUtc2hpbSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKcmVxdWlyZSgiLi9yZWdleHAiKTsKcmVxdWlyZSgiLi9lczUtc2hpbSIpOwoKfSk7LyoqCiAqICBCYXNlZCBvbiBjb2RlIGZyb206CiAqCiAqIFhSZWdFeHAgMS41LjAKICogKGMpIDIwMDctMjAxMCBTdGV2ZW4gTGV2aXRoYW4KICogTUlUIExpY2Vuc2UKICogPGh0dHA6Ly94cmVnZXhwLmNvbT4KICogUHJvdmlkZXMgYW4gYXVnbWVudGVkLCBleHRlbnNpYmxlLCBjcm9zcy1icm93c2VyIGltcGxlbWVudGF0aW9uIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMsCiAqIGluY2x1ZGluZyBzdXBwb3J0IGZvciBhZGRpdGlvbmFsIHN5bnRheCwgZmxhZ3MsIGFuZCBtZXRob2RzCiAqLwogCmRlZmluZSgnYWNlL2xpYi9yZWdleHAnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7CgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vICBQcml2YXRlIHZhcmlhYmxlcwogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICB2YXIgcmVhbCA9IHsKICAgICAgICAgICAgZXhlYzogUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICAgICB0ZXN0OiBSZWdFeHAucHJvdG90eXBlLnRlc3QsCiAgICAgICAgICAgIG1hdGNoOiBTdHJpbmcucHJvdG90eXBlLm1hdGNoLAogICAgICAgICAgICByZXBsYWNlOiBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2UsCiAgICAgICAgICAgIHNwbGl0OiBTdHJpbmcucHJvdG90eXBlLnNwbGl0CiAgICAgICAgfSwKICAgICAgICBjb21wbGlhbnRFeGVjTnBjZyA9IHJlYWwuZXhlYy5jYWxsKC8oKT8/LywgIiIpWzFdID09PSB1bmRlZmluZWQsIC8vIGNoZWNrIGBleGVjYCBoYW5kbGluZyBvZiBub25wYXJ0aWNpcGF0aW5nIGNhcHR1cmluZyBncm91cHMKICAgICAgICBjb21wbGlhbnRMYXN0SW5kZXhJbmNyZW1lbnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciB4ID0gL14vZzsKICAgICAgICAgICAgcmVhbC50ZXN0LmNhbGwoeCwgIiIpOwogICAgICAgICAgICByZXR1cm4gIXgubGFzdEluZGV4OwogICAgICAgIH0oKTsKCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gIE92ZXJyaWRlbiBuYXRpdmUgbWV0aG9kcwogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAvLyBBZGRzIG5hbWVkIGNhcHR1cmUgc3VwcG9ydCAod2l0aCBiYWNrcmVmZXJlbmNlcyByZXR1cm5lZCBhcyBgcmVzdWx0Lm5hbWVgKSwgYW5kIGZpeGVzIHR3bwogICAgLy8gY3Jvc3MtYnJvd3NlciBpc3N1ZXMgcGVyIEVTMzoKICAgIC8vIC0gQ2FwdHVyZWQgdmFsdWVzIGZvciBub25wYXJ0aWNpcGF0aW5nIGNhcHR1cmluZyBncm91cHMgc2hvdWxkIGJlIHJldHVybmVkIGFzIGB1bmRlZmluZWRgLAogICAgLy8gICByYXRoZXIgdGhhbiB0aGUgZW1wdHkgc3RyaW5nLgogICAgLy8gLSBgbGFzdEluZGV4YCBzaG91bGQgbm90IGJlIGluY3JlbWVudGVkIGFmdGVyIHplcm8tbGVuZ3RoIG1hdGNoZXMuCiAgICBSZWdFeHAucHJvdG90eXBlLmV4ZWMgPSBmdW5jdGlvbiAoc3RyKSB7CiAgICAgICAgdmFyIG1hdGNoID0gcmVhbC5leGVjLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksCiAgICAgICAgICAgIG5hbWUsIHIyOwogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICAvLyBGaXggYnJvd3NlcnMgd2hvc2UgYGV4ZWNgIG1ldGhvZHMgZG9uJ3QgY29uc2lzdGVudGx5IHJldHVybiBgdW5kZWZpbmVkYCBmb3IKICAgICAgICAgICAgLy8gbm9ucGFydGljaXBhdGluZyBjYXB0dXJpbmcgZ3JvdXBzCiAgICAgICAgICAgIGlmICghY29tcGxpYW50RXhlY05wY2cgJiYgbWF0Y2gubGVuZ3RoID4gMSAmJiBpbmRleE9mKG1hdGNoLCAiIikgPiAtMSkgewogICAgICAgICAgICAgICAgcjIgPSBSZWdFeHAodGhpcy5zb3VyY2UsIHJlYWwucmVwbGFjZS5jYWxsKGdldE5hdGl2ZUZsYWdzKHRoaXMpLCAiZyIsICIiKSk7CiAgICAgICAgICAgICAgICAvLyBVc2luZyBgc3RyLnNsaWNlKG1hdGNoLmluZGV4KWAgcmF0aGVyIHRoYW4gYG1hdGNoWzBdYCBpbiBjYXNlIGxvb2thaGVhZCBhbGxvd2VkCiAgICAgICAgICAgICAgICAvLyBtYXRjaGluZyBkdWUgdG8gY2hhcmFjdGVycyBvdXRzaWRlIHRoZSBtYXRjaAogICAgICAgICAgICAgICAgcmVhbC5yZXBsYWNlLmNhbGwoc3RyLnNsaWNlKG1hdGNoLmluZGV4KSwgcjIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAyOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50c1tpXSA9PT0gdW5kZWZpbmVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbaV0gPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQXR0YWNoIG5hbWVkIGNhcHR1cmUgcHJvcGVydGllcwogICAgICAgICAgICBpZiAodGhpcy5feHJlZ2V4cCAmJiB0aGlzLl94cmVnZXhwLmNhcHR1cmVOYW1lcykgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBtYXRjaC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIG5hbWUgPSB0aGlzLl94cmVnZXhwLmNhcHR1cmVOYW1lc1tpIC0gMV07CiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbbmFtZV0gPSBtYXRjaFtpXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBGaXggYnJvd3NlcnMgdGhhdCBpbmNyZW1lbnQgYGxhc3RJbmRleGAgYWZ0ZXIgemVyby1sZW5ndGggbWF0Y2hlcwogICAgICAgICAgICBpZiAoIWNvbXBsaWFudExhc3RJbmRleEluY3JlbWVudCAmJiB0aGlzLmdsb2JhbCAmJiAhbWF0Y2hbMF0ubGVuZ3RoICYmICh0aGlzLmxhc3RJbmRleCA+IG1hdGNoLmluZGV4KSkKICAgICAgICAgICAgICAgIHRoaXMubGFzdEluZGV4LS07CiAgICAgICAgfQogICAgICAgIHJldHVybiBtYXRjaDsKICAgIH07CgogICAgLy8gRG9uJ3Qgb3ZlcnJpZGUgYHRlc3RgIGlmIGl0IHdvbid0IGNoYW5nZSBhbnl0aGluZwogICAgaWYgKCFjb21wbGlhbnRMYXN0SW5kZXhJbmNyZW1lbnQpIHsKICAgICAgICAvLyBGaXggYnJvd3NlciBidWcgaW4gbmF0aXZlIG1ldGhvZAogICAgICAgIFJlZ0V4cC5wcm90b3R5cGUudGVzdCA9IGZ1bmN0aW9uIChzdHIpIHsKICAgICAgICAgICAgLy8gVXNlIHRoZSBuYXRpdmUgYGV4ZWNgIHRvIHNraXAgc29tZSBwcm9jZXNzaW5nIG92ZXJoZWFkLCBldmVuIHRob3VnaCB0aGUgb3ZlcnJpZGVuCiAgICAgICAgICAgIC8vIGBleGVjYCB3b3VsZCB0YWtlIGNhcmUgb2YgdGhlIGBsYXN0SW5kZXhgIGZpeAogICAgICAgICAgICB2YXIgbWF0Y2ggPSByZWFsLmV4ZWMuY2FsbCh0aGlzLCBzdHIpOwogICAgICAgICAgICAvLyBGaXggYnJvd3NlcnMgdGhhdCBpbmNyZW1lbnQgYGxhc3RJbmRleGAgYWZ0ZXIgemVyby1sZW5ndGggbWF0Y2hlcwogICAgICAgICAgICBpZiAobWF0Y2ggJiYgdGhpcy5nbG9iYWwgJiYgIW1hdGNoWzBdLmxlbmd0aCAmJiAodGhpcy5sYXN0SW5kZXggPiBtYXRjaC5pbmRleCkpCiAgICAgICAgICAgICAgICB0aGlzLmxhc3RJbmRleC0tOwogICAgICAgICAgICByZXR1cm4gISFtYXRjaDsKICAgICAgICB9OwogICAgfQoKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyAgUHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb25zCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIGZ1bmN0aW9uIGdldE5hdGl2ZUZsYWdzIChyZWdleCkgewogICAgICAgIHJldHVybiAocmVnZXguZ2xvYmFsICAgICA/ICJnIiA6ICIiKSArCiAgICAgICAgICAgICAgIChyZWdleC5pZ25vcmVDYXNlID8gImkiIDogIiIpICsKICAgICAgICAgICAgICAgKHJlZ2V4Lm11bHRpbGluZSAgPyAibSIgOiAiIikgKwogICAgICAgICAgICAgICAocmVnZXguZXh0ZW5kZWQgICA/ICJ4IiA6ICIiKSArIC8vIFByb3Bvc2VkIGZvciBFUzQ7IGluY2x1ZGVkIGluIEFTMwogICAgICAgICAgICAgICAocmVnZXguc3RpY2t5ICAgICA/ICJ5IiA6ICIiKTsKICAgIH07CgogICAgZnVuY3Rpb24gaW5kZXhPZiAoYXJyYXksIGl0ZW0sIGZyb20pIHsKICAgICAgICBpZiAoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpIC8vIFVzZSB0aGUgbmF0aXZlIGFycmF5IG1ldGhvZCBpZiBhdmFpbGFibGUKICAgICAgICAgICAgcmV0dXJuIGFycmF5LmluZGV4T2YoaXRlbSwgZnJvbSk7CiAgICAgICAgZm9yICh2YXIgaSA9IGZyb20gfHwgMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChhcnJheVtpXSA9PT0gaXRlbSkKICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gLTE7CiAgICB9OwoKfSk7Ly8gdmltOiB0cz00IHN0cz00IHN3PTQgZXhwYW5kdGFiCi8vIC0tIGtyaXNrb3dhbCBLcmlzIEtvd2FsIENvcHlyaWdodCAoQykgMjAwOS0yMDExIE1JVCBMaWNlbnNlCi8vIC0tIHRscm9iaW5zb24gVG9tIFJvYmluc29uIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1JVCBMaWNlbnNlIChOYXJ3aGFsIFByb2plY3QpCi8vIC0tIGRhbnRtYW4gRGFuaWVsIEZyaWVzZW4gQ29weXJpZ2h0IChDKSAyMDEwIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBCi8vIC0tIGZzY2hhZWZlciBGbG9yaWFuIFNjaMOkZmVyIENvcHlyaWdodCAoQykgMjAxMCBNSVQgTGljZW5zZQovLyAtLSBHb3phbGEgSXJha2xpIEdvemFsaXNodmlsaSBDb3B5cmlnaHQgKEMpIDIwMTAgTUlUIExpY2Vuc2UKLy8gLS0ga2l0Y2FtYnJpZGdlIEtpdCBDYW1icmlkZ2UgQ29weXJpZ2h0IChDKSAyMDExIE1JVCBMaWNlbnNlCi8vIC0tIGtvc3Nub2NvcnAgU2FzaGEgS29zcyBYWFggVE9ETyBMaWNlbnNlIG9yIENMQQovLyAtLSBicnlhbmZvcmJlcyBCcnlhbiBGb3JiZXMgWFhYIFRPRE8gTGljZW5zZSBvciBDTEEKLy8gLS0ga2lsbGRyZWFtIFF1aWxkcmVlbiBNb3R0YSBDb3B5cmlnaHQgKEMpIDIwMTEgTUlUIExpY2VuY2UKLy8gLS0gbWljaGFlbGZpY2FycmEgTWljaGFlbCBGaWNhcnJhIENvcHlyaWdodCAoQykgMjAxMSAzLWNsYXVzZSBCU0QgTGljZW5zZQovLyAtLSBzaGFya2JyYWluZ3V5IEdlcmFyZCBQYWFwdSBDb3B5cmlnaHQgKEMpIDIwMTEgTUlUIExpY2Vuc2UKLy8gLS0gYmJxc3JjIEJyZW5kYW4gTW9sbG95IChDKSAyMDExIENyZWF0aXZlIENvbW1vbnMgWmVybyAocHVibGljIGRvbWFpbikKLy8gLS0gaXd5ZyBYWFggVE9ETyBMaWNlbnNlIG9yIENMQQovLyAtLSBEb21lbmljRGVuaWNvbGEgRG9tZW5pYyBEZW5pY29sYSBDb3B5cmlnaHQgKEMpIDIwMTEgTUlUIExpY2Vuc2UKLy8gLS0geGF2aWVybTAyIE1vbnRpbGxldCBYYXZpZXIgWFhYIFRPRE8gTGljZW5zZSBvciBDTEEKLy8gLS0gUmF5bm9zIFJheW5vcyBYWFggVE9ETyBMaWNlbnNlIG9yIENMQQovLyAtLSBzYW1zb25qcyBTYW1pIFNhbWh1cmkgQ29weXJpZ2h0IChDKSAyMDEwIE1JVCBMaWNlbnNlCi8vIC0tIHJ3bGRybiBSaWNrIFdhbGRyb24gQ29weXJpZ2h0IChDKSAyMDExIE1JVCBMaWNlbnNlCi8vIC0tIGxleGVyIEFsZXhleSBaYWtoYXJvdiBYWFggVE9ETyBMaWNlbnNlIG9yIENMQQoKLyohCiAgICBDb3B5cmlnaHQgKGMpIDIwMDksIDI4MCBOb3J0aCBJbmMuIGh0dHA6Ly8yODBub3J0aC5jb20vCiAgICBNSVQgTGljZW5zZS4gaHR0cDovL2dpdGh1Yi5jb20vMjgwbm9ydGgvbmFyd2hhbC9ibG9iL21hc3Rlci9SRUFETUUubWQKKi8KCmRlZmluZSgnYWNlL2xpYi9lczUtc2hpbScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CgovKioKICogQnJpbmdzIGFuIGVudmlyb25tZW50IGFzIGNsb3NlIHRvIEVDTUFTY3JpcHQgNSBjb21wbGlhbmNlCiAqIGFzIGlzIHBvc3NpYmxlIHdpdGggdGhlIGZhY2lsaXRpZXMgb2YgZXJzdHdoaWxlIGVuZ2luZXMuCiAqCiAqIEFubm90YXRlZCBFUzU6IGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8gKHNwZWNpZmljIGxpbmtzIGJlbG93KQogKiBFUzUgU3BlYzogaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL3B1YmxpY2F0aW9ucy9maWxlcy9FQ01BLVNUL0VjbWEtMjYyLnBkZgogKgogKiBAbW9kdWxlCiAqLwoKLyp3aGF0c3VwZG9jKi8KCi8vCi8vIEZ1bmN0aW9uCi8vID09PT09PT09Ci8vCgovLyBFUy01IDE1LjMuNC41Ci8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjMuNC41CgppZiAoIUZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kKSB7CiAgICBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uIGJpbmQodGhhdCkgeyAvLyAubGVuZ3RoIGlzIDEKICAgICAgICAvLyAxLiBMZXQgVGFyZ2V0IGJlIHRoZSB0aGlzIHZhbHVlLgogICAgICAgIHZhciB0YXJnZXQgPSB0aGlzOwogICAgICAgIC8vIDIuIElmIElzQ2FsbGFibGUoVGFyZ2V0KSBpcyBmYWxzZSwgdGhyb3cgYSBUeXBlRXJyb3IgZXhjZXB0aW9uLgogICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9ICJmdW5jdGlvbiIpCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlCiAgICAgICAgLy8gMy4gTGV0IEEgYmUgYSBuZXcgKHBvc3NpYmx5IGVtcHR5KSBpbnRlcm5hbCBsaXN0IG9mIGFsbCBvZiB0aGUKICAgICAgICAvLyAgIGFyZ3VtZW50IHZhbHVlcyBwcm92aWRlZCBhZnRlciB0aGlzQXJnIChhcmcxLCBhcmcyIGV0YyksIGluIG9yZGVyLgogICAgICAgIC8vIFhYWCBzbGljZWRBcmdzIHdpbGwgc3RhbmQgaW4gZm9yICJBIiBpZiB1c2VkCiAgICAgICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7IC8vIGZvciBub3JtYWwgY2FsbAogICAgICAgIC8vIDQuIExldCBGIGJlIGEgbmV3IG5hdGl2ZSBFQ01BU2NyaXB0IG9iamVjdC4KICAgICAgICAvLyAxMS4gU2V0IHRoZSBbW1Byb3RvdHlwZV1dIGludGVybmFsIHByb3BlcnR5IG9mIEYgdG8gdGhlIHN0YW5kYXJkCiAgICAgICAgLy8gICBidWlsdC1pbiBGdW5jdGlvbiBwcm90b3R5cGUgb2JqZWN0IGFzIHNwZWNpZmllZCBpbiAxNS4zLjMuMS4KICAgICAgICAvLyAxMi4gU2V0IHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIGFzIGRlc2NyaWJlZCBpbgogICAgICAgIC8vICAgMTUuMy40LjUuMS4KICAgICAgICAvLyAxMy4gU2V0IHRoZSBbW0NvbnN0cnVjdF1dIGludGVybmFsIHByb3BlcnR5IG9mIEYgYXMgZGVzY3JpYmVkIGluCiAgICAgICAgLy8gICAxNS4zLjQuNS4yLgogICAgICAgIC8vIDE0LiBTZXQgdGhlIFtbSGFzSW5zdGFuY2VdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIGFzIGRlc2NyaWJlZCBpbgogICAgICAgIC8vICAgMTUuMy40LjUuMy4KICAgICAgICB2YXIgYm91bmQgPSBmdW5jdGlvbiAoKSB7CgogICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIGJvdW5kKSB7CiAgICAgICAgICAgICAgICAvLyAxNS4zLjQuNS4yIFtbQ29uc3RydWN0XV0KICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgbWV0aG9kIG9mIGEgZnVuY3Rpb24gb2JqZWN0LAogICAgICAgICAgICAgICAgLy8gRiB0aGF0IHdhcyBjcmVhdGVkIHVzaW5nIHRoZSBiaW5kIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGEKICAgICAgICAgICAgICAgIC8vIGxpc3Qgb2YgYXJndW1lbnRzIEV4dHJhQXJncywgdGhlIGZvbGxvd2luZyBzdGVwcyBhcmUgdGFrZW46CiAgICAgICAgICAgICAgICAvLyAxLiBMZXQgdGFyZ2V0IGJlIHRoZSB2YWx1ZSBvZiBGJ3MgW1tUYXJnZXRGdW5jdGlvbl1dCiAgICAgICAgICAgICAgICAvLyAgIGludGVybmFsIHByb3BlcnR5LgogICAgICAgICAgICAgICAgLy8gMi4gSWYgdGFyZ2V0IGhhcyBubyBbW0NvbnN0cnVjdF1dIGludGVybmFsIG1ldGhvZCwgYQogICAgICAgICAgICAgICAgLy8gICBUeXBlRXJyb3IgZXhjZXB0aW9uIGlzIHRocm93bi4KICAgICAgICAgICAgICAgIC8vIDMuIExldCBib3VuZEFyZ3MgYmUgdGhlIHZhbHVlIG9mIEYncyBbW0JvdW5kQXJnc11dIGludGVybmFsCiAgICAgICAgICAgICAgICAvLyAgIHByb3BlcnR5LgogICAgICAgICAgICAgICAgLy8gNC4gTGV0IGFyZ3MgYmUgYSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGUKICAgICAgICAgICAgICAgIC8vICAgbGlzdCBib3VuZEFyZ3MgaW4gdGhlIHNhbWUgb3JkZXIgZm9sbG93ZWQgYnkgdGhlIHNhbWUKICAgICAgICAgICAgICAgIC8vICAgdmFsdWVzIGFzIHRoZSBsaXN0IEV4dHJhQXJncyBpbiB0aGUgc2FtZSBvcmRlci4KICAgICAgICAgICAgICAgIC8vIDUuIFJldHVybiB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgCiAgICAgICAgICAgICAgICAvLyAgIG1ldGhvZCBvZiB0YXJnZXQgcHJvdmlkaW5nIGFyZ3MgYXMgdGhlIGFyZ3VtZW50cy4KCiAgICAgICAgICAgICAgICB2YXIgRiA9IGZ1bmN0aW9uKCl7fTsKICAgICAgICAgICAgICAgIEYucHJvdG90eXBlID0gdGFyZ2V0LnByb3RvdHlwZTsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gbmV3IEY7CgogICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRhcmdldC5hcHBseSgKICAgICAgICAgICAgICAgICAgICBzZWxmLAogICAgICAgICAgICAgICAgICAgIGFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIE9iamVjdChyZXN1bHQpID09PSByZXN1bHQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOwoKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIDE1LjMuNC41LjEgW1tDYWxsXV0KICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZCBvZiBhIGZ1bmN0aW9uIG9iamVjdCwgRiwKICAgICAgICAgICAgICAgIC8vIHdoaWNoIHdhcyBjcmVhdGVkIHVzaW5nIHRoZSBiaW5kIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGEKICAgICAgICAgICAgICAgIC8vIHRoaXMgdmFsdWUgYW5kIGEgbGlzdCBvZiBhcmd1bWVudHMgRXh0cmFBcmdzLCB0aGUgZm9sbG93aW5nCiAgICAgICAgICAgICAgICAvLyBzdGVwcyBhcmUgdGFrZW46CiAgICAgICAgICAgICAgICAvLyAxLiBMZXQgYm91bmRBcmdzIGJlIHRoZSB2YWx1ZSBvZiBGJ3MgW1tCb3VuZEFyZ3NdXSBpbnRlcm5hbAogICAgICAgICAgICAgICAgLy8gICBwcm9wZXJ0eS4KICAgICAgICAgICAgICAgIC8vIDIuIExldCBib3VuZFRoaXMgYmUgdGhlIHZhbHVlIG9mIEYncyBbW0JvdW5kVGhpc11dIGludGVybmFsCiAgICAgICAgICAgICAgICAvLyAgIHByb3BlcnR5LgogICAgICAgICAgICAgICAgLy8gMy4gTGV0IHRhcmdldCBiZSB0aGUgdmFsdWUgb2YgRidzIFtbVGFyZ2V0RnVuY3Rpb25dXSBpbnRlcm5hbAogICAgICAgICAgICAgICAgLy8gICBwcm9wZXJ0eS4KICAgICAgICAgICAgICAgIC8vIDQuIExldCBhcmdzIGJlIGEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgc2FtZSB2YWx1ZXMgYXMgdGhlIAogICAgICAgICAgICAgICAgLy8gICBsaXN0IGJvdW5kQXJncyBpbiB0aGUgc2FtZSBvcmRlciBmb2xsb3dlZCBieSB0aGUgc2FtZSAKICAgICAgICAgICAgICAgIC8vICAgdmFsdWVzIGFzIHRoZSBsaXN0IEV4dHJhQXJncyBpbiB0aGUgc2FtZSBvcmRlci4KICAgICAgICAgICAgICAgIC8vIDUuIFJldHVybiB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZCAKICAgICAgICAgICAgICAgIC8vICAgb2YgdGFyZ2V0IHByb3ZpZGluZyBib3VuZFRoaXMgYXMgdGhlIHRoaXMgdmFsdWUgYW5kIAogICAgICAgICAgICAgICAgLy8gICBwcm92aWRpbmcgYXJncyBhcyB0aGUgYXJndW1lbnRzLgoKICAgICAgICAgICAgICAgIC8vIGVxdWl2OiB0YXJnZXQuY2FsbCh0aGlzLCAuLi5ib3VuZEFyZ3MsIC4uLmFyZ3MpCiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmFwcGx5KAogICAgICAgICAgICAgICAgICAgIHRoYXQsCiAgICAgICAgICAgICAgICAgICAgYXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgfTsKICAgICAgICAvLyBYWFggYm91bmQubGVuZ3RoIGlzIG5ldmVyIHdyaXRhYmxlLCBzbyBkb24ndCBldmVuIHRyeQogICAgICAgIC8vCiAgICAgICAgLy8gMTUuIElmIHRoZSBbW0NsYXNzXV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgVGFyZ2V0IGlzICJGdW5jdGlvbiIsIHRoZW4KICAgICAgICAvLyAgICAgYS4gTGV0IEwgYmUgdGhlIGxlbmd0aCBwcm9wZXJ0eSBvZiBUYXJnZXQgbWludXMgdGhlIGxlbmd0aCBvZiBBLgogICAgICAgIC8vICAgICBiLiBTZXQgdGhlIGxlbmd0aCBvd24gcHJvcGVydHkgb2YgRiB0byBlaXRoZXIgMCBvciBMLCB3aGljaGV2ZXIgaXMgCiAgICAgICAgLy8gICAgICAgbGFyZ2VyLgogICAgICAgIC8vIDE2LiBFbHNlIHNldCB0aGUgbGVuZ3RoIG93biBwcm9wZXJ0eSBvZiBGIHRvIDAuCiAgICAgICAgLy8gMTcuIFNldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbGVuZ3RoIG93biBwcm9wZXJ0eSBvZiBGIHRvIHRoZSB2YWx1ZXMKICAgICAgICAvLyAgIHNwZWNpZmllZCBpbiAxNS4zLjUuMS4KCiAgICAgICAgLy8gVE9ETwogICAgICAgIC8vIDE4LiBTZXQgdGhlIFtbRXh0ZW5zaWJsZV1dIGludGVybmFsIHByb3BlcnR5IG9mIEYgdG8gdHJ1ZS4KICAgICAgICAKICAgICAgICAvLyBUT0RPCiAgICAgICAgLy8gMTkuIExldCB0aHJvd2VyIGJlIHRoZSBbW1Rocm93VHlwZUVycm9yXV0gZnVuY3Rpb24gT2JqZWN0ICgxMy4yLjMpLgogICAgICAgIC8vIDIwLiBDYWxsIHRoZSBbW0RlZmluZU93blByb3BlcnR5XV0gaW50ZXJuYWwgbWV0aG9kIG9mIEYgd2l0aCAKICAgICAgICAvLyAgIGFyZ3VtZW50cyAiY2FsbGVyIiwgUHJvcGVydHlEZXNjcmlwdG9yIHtbW0dldF1dOiB0aHJvd2VyLCBbW1NldF1dOgogICAgICAgIC8vICAgdGhyb3dlciwgW1tFbnVtZXJhYmxlXV06IGZhbHNlLCBbW0NvbmZpZ3VyYWJsZV1dOiBmYWxzZX0sIGFuZCAKICAgICAgICAvLyAgIGZhbHNlLgogICAgICAgIC8vIDIxLiBDYWxsIHRoZSBbW0RlZmluZU93blByb3BlcnR5XV0gaW50ZXJuYWwgbWV0aG9kIG9mIEYgd2l0aCAKICAgICAgICAvLyAgIGFyZ3VtZW50cyAiYXJndW1lbnRzIiwgUHJvcGVydHlEZXNjcmlwdG9yIHtbW0dldF1dOiB0aHJvd2VyLCAKICAgICAgICAvLyAgIFtbU2V0XV06IHRocm93ZXIsIFtbRW51bWVyYWJsZV1dOiBmYWxzZSwgW1tDb25maWd1cmFibGVdXTogZmFsc2V9LAogICAgICAgIC8vICAgYW5kIGZhbHNlLgoKICAgICAgICAvLyBUT0RPCiAgICAgICAgLy8gTk9URSBGdW5jdGlvbiBvYmplY3RzIGNyZWF0ZWQgdXNpbmcgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgZG8gbm90IAogICAgICAgIC8vIGhhdmUgYSBwcm90b3R5cGUgcHJvcGVydHkgb3IgdGhlIFtbQ29kZV1dLCBbW0Zvcm1hbFBhcmFtZXRlcnNdXSwgYW5kCiAgICAgICAgLy8gW1tTY29wZV1dIGludGVybmFsIHByb3BlcnRpZXMuCiAgICAgICAgLy8gWFhYIGNhbid0IGRlbGV0ZSBwcm90b3R5cGUgaW4gcHVyZS1qcy4KCiAgICAgICAgLy8gMjIuIFJldHVybiBGLgogICAgICAgIHJldHVybiBib3VuZDsKICAgIH07Cn0KCi8vIFNob3J0Y3V0IHRvIGFuIG9mdGVuIGFjY2Vzc2VkIHByb3BlcnRpZXMsIGluIG9yZGVyIHRvIGF2b2lkIG11bHRpcGxlCi8vIGRlcmVmZXJlbmNlIHRoYXQgY29zdHMgdW5pdmVyc2FsbHkuCi8vIF9QbGVhc2Ugbm90ZTogU2hvcnRjdXRzIGFyZSBkZWZpbmVkIGFmdGVyIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAgYXMgd2UKLy8gdXMgaXQgaW4gZGVmaW5pbmcgc2hvcnRjdXRzLgp2YXIgY2FsbCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsOwp2YXIgcHJvdG90eXBlT2ZBcnJheSA9IEFycmF5LnByb3RvdHlwZTsKdmFyIHByb3RvdHlwZU9mT2JqZWN0ID0gT2JqZWN0LnByb3RvdHlwZTsKdmFyIHNsaWNlID0gcHJvdG90eXBlT2ZBcnJheS5zbGljZTsKdmFyIHRvU3RyaW5nID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0LnRvU3RyaW5nKTsKdmFyIG93bnMgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuaGFzT3duUHJvcGVydHkpOwoKLy8gSWYgSlMgZW5naW5lIHN1cHBvcnRzIGFjY2Vzc29ycyBjcmVhdGluZyBzaG9ydGN1dHMuCnZhciBkZWZpbmVHZXR0ZXI7CnZhciBkZWZpbmVTZXR0ZXI7CnZhciBsb29rdXBHZXR0ZXI7CnZhciBsb29rdXBTZXR0ZXI7CnZhciBzdXBwb3J0c0FjY2Vzc29yczsKaWYgKChzdXBwb3J0c0FjY2Vzc29ycyA9IG93bnMocHJvdG90eXBlT2ZPYmplY3QsICJfX2RlZmluZUdldHRlcl9fIikpKSB7CiAgICBkZWZpbmVHZXR0ZXIgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuX19kZWZpbmVHZXR0ZXJfXyk7CiAgICBkZWZpbmVTZXR0ZXIgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuX19kZWZpbmVTZXR0ZXJfXyk7CiAgICBsb29rdXBHZXR0ZXIgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuX19sb29rdXBHZXR0ZXJfXyk7CiAgICBsb29rdXBTZXR0ZXIgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuX19sb29rdXBTZXR0ZXJfXyk7Cn0KCi8vCi8vIEFycmF5Ci8vID09PT09Ci8vCgovLyBFUzUgMTUuNC4zLjIKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC4zLjIKLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvaXNBcnJheQppZiAoIUFycmF5LmlzQXJyYXkpIHsKICAgIEFycmF5LmlzQXJyYXkgPSBmdW5jdGlvbiBpc0FycmF5KG9iaikgewogICAgICAgIHJldHVybiB0b1N0cmluZyhvYmopID09ICJbb2JqZWN0IEFycmF5XSI7CiAgICB9Owp9CgovLyBUaGUgSXNDYWxsYWJsZSgpIGNoZWNrIGluIHRoZSBBcnJheSBmdW5jdGlvbnMKLy8gaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCBhIHN0cmljdCBjaGVjayBvbiB0aGUKLy8gaW50ZXJuYWwgY2xhc3Mgb2YgdGhlIG9iamVjdCB0byB0cmFwIGNhc2VzIHdoZXJlCi8vIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB3YXMgYWN0dWFsbHkgYSByZWd1bGFyCi8vIGV4cHJlc3Npb24gbGl0ZXJhbCwgd2hpY2ggaW4gVjggYW5kCi8vIEphdmFTY3JpcHRDb3JlIGlzIGEgdHlwZW9mICJmdW5jdGlvbiIuICBPbmx5IGluCi8vIFY4IGFyZSByZWd1bGFyIGV4cHJlc3Npb24gbGl0ZXJhbHMgcGVybWl0dGVkIGFzCi8vIHJlZHVjZSBwYXJhbWV0ZXJzLCBzbyBpdCBpcyBkZXNpcmFibGUgaW4gdGhlCi8vIGdlbmVyYWwgY2FzZSBmb3IgdGhlIHNoaW0gdG8gbWF0Y2ggdGhlIG1vcmUKLy8gc3RyaWN0IGFuZCBjb21tb24gYmVoYXZpb3Igb2YgcmVqZWN0aW5nIHJlZ3VsYXIKLy8gZXhwcmVzc2lvbnMuCgovLyBFUzUgMTUuNC40LjE4Ci8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuNC4xOAovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9hcnJheS9mb3JFYWNoCmlmICghQXJyYXkucHJvdG90eXBlLmZvckVhY2gpIHsKICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gZm9yRWFjaChmdW4gLyosIHRoaXNwKi8pIHsKICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLAogICAgICAgICAgICB0aGlzcCA9IGFyZ3VtZW50c1sxXSwKICAgICAgICAgICAgaSA9IDAsCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwOwoKICAgICAgICAvLyBJZiBubyBjYWxsYmFjayBmdW5jdGlvbiBvciBpZiBjYWxsYmFjayBpcyBub3QgYSBjYWxsYWJsZSBmdW5jdGlvbgogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UKICAgICAgICB9CgogICAgICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7CiAgICAgICAgICAgIGlmIChpIGluIHNlbGYpIHsKICAgICAgICAgICAgICAgIC8vIEludm9rZSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBjYWxsLCBwYXNzaW5nIGFyZ3VtZW50czoKICAgICAgICAgICAgICAgIC8vIGNvbnRleHQsIHByb3BlcnR5IHZhbHVlLCBwcm9wZXJ0eSBrZXksIHRoaXNBcmcgb2JqZWN0IGNvbnRleHQKICAgICAgICAgICAgICAgIGZ1bi5jYWxsKHRoaXNwLCBzZWxmW2ldLCBpLCBzZWxmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpKys7CiAgICAgICAgfQogICAgfTsKfQoKLy8gRVM1IDE1LjQuNC4xOQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTkKLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vQ29yZV9KYXZhU2NyaXB0XzEuNV9SZWZlcmVuY2UvT2JqZWN0cy9BcnJheS9tYXAKaWYgKCFBcnJheS5wcm90b3R5cGUubWFwKSB7CiAgICBBcnJheS5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24gbWFwKGZ1biAvKiwgdGhpc3AqLykgewogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwLAogICAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpLAogICAgICAgICAgICB0aGlzcCA9IGFyZ3VtZW50c1sxXTsKCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24KICAgICAgICBpZiAodG9TdHJpbmcoZnVuKSAhPSAiW29iamVjdCBGdW5jdGlvbl0iKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlCiAgICAgICAgfQoKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChpIGluIHNlbGYpCiAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBmdW4uY2FsbCh0aGlzcCwgc2VsZltpXSwgaSwgc2VsZik7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9Owp9CgovLyBFUzUgMTUuNC40LjIwCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuNC4yMAovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9PYmplY3RzL0FycmF5L2ZpbHRlcgppZiAoIUFycmF5LnByb3RvdHlwZS5maWx0ZXIpIHsKICAgIEFycmF5LnByb3RvdHlwZS5maWx0ZXIgPSBmdW5jdGlvbiBmaWx0ZXIoZnVuIC8qLCB0aGlzcCAqLykgewogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwLAogICAgICAgICAgICByZXN1bHQgPSBbXSwKICAgICAgICAgICAgdGhpc3AgPSBhcmd1bWVudHNbMV07CgogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQogICAgICAgIH0KCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmIGZ1bi5jYWxsKHRoaXNwLCBzZWxmW2ldLCBpLCBzZWxmKSkKICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNlbGZbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfTsKfQoKLy8gRVM1IDE1LjQuNC4xNgovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTYKLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZXZlcnkKaWYgKCFBcnJheS5wcm90b3R5cGUuZXZlcnkpIHsKICAgIEFycmF5LnByb3RvdHlwZS5ldmVyeSA9IGZ1bmN0aW9uIGV2ZXJ5KGZ1biAvKiwgdGhpc3AgKi8pIHsKICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLAogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMCwKICAgICAgICAgICAgdGhpc3AgPSBhcmd1bWVudHNbMV07CgogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQogICAgICAgIH0KCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmICFmdW4uY2FsbCh0aGlzcCwgc2VsZltpXSwgaSwgc2VsZikpCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfTsKfQoKLy8gRVM1IDE1LjQuNC4xNwovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTcKLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvc29tZQppZiAoIUFycmF5LnByb3RvdHlwZS5zb21lKSB7CiAgICBBcnJheS5wcm90b3R5cGUuc29tZSA9IGZ1bmN0aW9uIHNvbWUoZnVuIC8qLCB0aGlzcCAqLykgewogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwLAogICAgICAgICAgICB0aGlzcCA9IGFyZ3VtZW50c1sxXTsKCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24KICAgICAgICBpZiAodG9TdHJpbmcoZnVuKSAhPSAiW29iamVjdCBGdW5jdGlvbl0iKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlCiAgICAgICAgfQoKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChpIGluIHNlbGYgJiYgZnVuLmNhbGwodGhpc3AsIHNlbGZbaV0sIGksIHNlbGYpKQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH07Cn0KCi8vIEVTNSAxNS40LjQuMjEKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjIxCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlL09iamVjdHMvQXJyYXkvcmVkdWNlCmlmICghQXJyYXkucHJvdG90eXBlLnJlZHVjZSkgewogICAgQXJyYXkucHJvdG90eXBlLnJlZHVjZSA9IGZ1bmN0aW9uIHJlZHVjZShmdW4gLyosIGluaXRpYWwqLykgewogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwOwoKICAgICAgICAvLyBJZiBubyBjYWxsYmFjayBmdW5jdGlvbiBvciBpZiBjYWxsYmFjayBpcyBub3QgYSBjYWxsYWJsZSBmdW5jdGlvbgogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UKICAgICAgICB9CgogICAgICAgIC8vIG5vIHZhbHVlIHRvIHJldHVybiBpZiBubyBpbml0aWFsIHZhbHVlIGFuZCBhbiBlbXB0eSBhcnJheQogICAgICAgIGlmICghbGVuZ3RoICYmIGFyZ3VtZW50cy5sZW5ndGggPT0gMSkKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UKCiAgICAgICAgdmFyIGkgPSAwOwogICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikgewogICAgICAgICAgICByZXN1bHQgPSBhcmd1bWVudHNbMV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgaWYgKGkgaW4gc2VsZikgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGZbaSsrXTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiBhcnJheSBjb250YWlucyBubyB2YWx1ZXMsIG5vIGluaXRpYWwgdmFsdWUgdG8gcmV0dXJuCiAgICAgICAgICAgICAgICBpZiAoKytpID49IGxlbmd0aCkKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQogICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKICAgICAgICB9CgogICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKGkgaW4gc2VsZikKICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZ1bi5jYWxsKHZvaWQgMCwgcmVzdWx0LCBzZWxmW2ldLCBpLCBzZWxmKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9Owp9CgovLyBFUzUgMTUuNC40LjIyCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuNC4yMgovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9PYmplY3RzL0FycmF5L3JlZHVjZVJpZ2h0CmlmICghQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0KSB7CiAgICBBcnJheS5wcm90b3R5cGUucmVkdWNlUmlnaHQgPSBmdW5jdGlvbiByZWR1Y2VSaWdodChmdW4gLyosIGluaXRpYWwqLykgewogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwOwoKICAgICAgICAvLyBJZiBubyBjYWxsYmFjayBmdW5jdGlvbiBvciBpZiBjYWxsYmFjayBpcyBub3QgYSBjYWxsYWJsZSBmdW5jdGlvbgogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UKICAgICAgICB9CgogICAgICAgIC8vIG5vIHZhbHVlIHRvIHJldHVybiBpZiBubyBpbml0aWFsIHZhbHVlLCBlbXB0eSBhcnJheQogICAgICAgIGlmICghbGVuZ3RoICYmIGFyZ3VtZW50cy5sZW5ndGggPT0gMSkKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UKCiAgICAgICAgdmFyIHJlc3VsdCwgaSA9IGxlbmd0aCAtIDE7CiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikgewogICAgICAgICAgICByZXN1bHQgPSBhcmd1bWVudHNbMV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgaWYgKGkgaW4gc2VsZikgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGZbaS0tXTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiBhcnJheSBjb250YWlucyBubyB2YWx1ZXMsIG5vIGluaXRpYWwgdmFsdWUgdG8gcmV0dXJuCiAgICAgICAgICAgICAgICBpZiAoLS1pIDwgMCkKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQogICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKICAgICAgICB9CgogICAgICAgIGRvIHsKICAgICAgICAgICAgaWYgKGkgaW4gdGhpcykKICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZ1bi5jYWxsKHZvaWQgMCwgcmVzdWx0LCBzZWxmW2ldLCBpLCBzZWxmKTsKICAgICAgICB9IHdoaWxlIChpLS0pOwoKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfTsKfQoKLy8gRVM1IDE1LjQuNC4xNAovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTQKLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvaW5kZXhPZgppZiAoIUFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7CiAgICBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2Yoc291Z2h0IC8qLCBmcm9tSW5kZXggKi8gKSB7CiAgICAgICAgdmFyIHNlbGYgPSB0b09iamVjdCh0aGlzKSwKICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7CgogICAgICAgIGlmICghbGVuZ3RoKQogICAgICAgICAgICByZXR1cm4gLTE7CgogICAgICAgIHZhciBpID0gMDsKICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpCiAgICAgICAgICAgIGkgPSB0b0ludGVnZXIoYXJndW1lbnRzWzFdKTsKCiAgICAgICAgLy8gaGFuZGxlIG5lZ2F0aXZlIGluZGljZXMKICAgICAgICBpID0gaSA+PSAwID8gaSA6IE1hdGgubWF4KDAsIGxlbmd0aCArIGkpOwogICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKGkgaW4gc2VsZiAmJiBzZWxmW2ldID09PSBzb3VnaHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAtMTsKICAgIH07Cn0KCi8vIEVTNSAxNS40LjQuMTUKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE1Ci8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2xhc3RJbmRleE9mCmlmICghQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mKSB7CiAgICBBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZihzb3VnaHQgLyosIGZyb21JbmRleCAqLykgewogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwOwoKICAgICAgICBpZiAoIWxlbmd0aCkKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIHZhciBpID0gbGVuZ3RoIC0gMTsKICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpCiAgICAgICAgICAgIGkgPSBNYXRoLm1pbihpLCB0b0ludGVnZXIoYXJndW1lbnRzWzFdKSk7CiAgICAgICAgLy8gaGFuZGxlIG5lZ2F0aXZlIGluZGljZXMKICAgICAgICBpID0gaSA+PSAwID8gaSA6IGxlbmd0aCAtIE1hdGguYWJzKGkpOwogICAgICAgIGZvciAoOyBpID49IDA7IGktLSkgewogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmIHNvdWdodCA9PT0gc2VsZltpXSkKICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gLTE7CiAgICB9Owp9CgovLwovLyBPYmplY3QKLy8gPT09PT09Ci8vCgovLyBFUzUgMTUuMi4zLjIKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjIKaWYgKCFPYmplY3QuZ2V0UHJvdG90eXBlT2YpIHsKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9rcmlza293YWwvZXM1LXNoaW0vaXNzdWVzI2lzc3VlLzIKICAgIC8vIGh0dHA6Ly9lam9obi5vcmcvYmxvZy9vYmplY3RnZXRwcm90b3R5cGVvZi8KICAgIC8vIHJlY29tbWVuZGVkIGJ5IGZzY2hhZWZlciBvbiBnaXRodWIKICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZiA9IGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKG9iamVjdCkgewogICAgICAgIHJldHVybiBvYmplY3QuX19wcm90b19fIHx8ICgKICAgICAgICAgICAgb2JqZWN0LmNvbnN0cnVjdG9yID8KICAgICAgICAgICAgb2JqZWN0LmNvbnN0cnVjdG9yLnByb3RvdHlwZSA6CiAgICAgICAgICAgIHByb3RvdHlwZU9mT2JqZWN0CiAgICAgICAgKTsKICAgIH07Cn0KCi8vIEVTNSAxNS4yLjMuMwovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuMwppZiAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IpIHsKICAgIHZhciBFUlJfTk9OX09CSkVDVCA9ICJPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIGNhbGxlZCBvbiBhICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgIm5vbi1vYmplY3Q6ICI7CiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpIHsKICAgICAgICBpZiAoKHR5cGVvZiBvYmplY3QgIT0gIm9iamVjdCIgJiYgdHlwZW9mIG9iamVjdCAhPSAiZnVuY3Rpb24iKSB8fCBvYmplY3QgPT09IG51bGwpCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJSX05PTl9PQkpFQ1QgKyBvYmplY3QpOwogICAgICAgIC8vIElmIG9iamVjdCBkb2VzIG5vdCBvd25zIHByb3BlcnR5IHJldHVybiB1bmRlZmluZWQgaW1tZWRpYXRlbHkuCiAgICAgICAgaWYgKCFvd25zKG9iamVjdCwgcHJvcGVydHkpKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIHZhciBkZXNjcmlwdG9yLCBnZXR0ZXIsIHNldHRlcjsKCiAgICAgICAgLy8gSWYgb2JqZWN0IGhhcyBhIHByb3BlcnR5IHRoZW4gaXQncyBmb3Igc3VyZSBib3RoIGBlbnVtZXJhYmxlYCBhbmQKICAgICAgICAvLyBgY29uZmlndXJhYmxlYC4KICAgICAgICBkZXNjcmlwdG9yID0gIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH07CgogICAgICAgIC8vIElmIEpTIGVuZ2luZSBzdXBwb3J0cyBhY2Nlc3NvciBwcm9wZXJ0aWVzIHRoZW4gcHJvcGVydHkgbWF5IGJlIGEKICAgICAgICAvLyBnZXR0ZXIgb3Igc2V0dGVyLgogICAgICAgIGlmIChzdXBwb3J0c0FjY2Vzc29ycykgewogICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5IGBfX2xvb2t1cEdldHRlcl9fYCB3aWxsIHJldHVybiBhIGdldHRlciBldmVuCiAgICAgICAgICAgIC8vIGlmIG9iamVjdCBoYXMgb3duIG5vbiBnZXR0ZXIgcHJvcGVydHkgYWxvbmcgd2l0aCBhIHNhbWUgbmFtZWQKICAgICAgICAgICAgLy8gaW5oZXJpdGVkIGdldHRlci4gVG8gYXZvaWQgbWlzYmVoYXZpb3Igd2UgdGVtcG9yYXJ5IHJlbW92ZQogICAgICAgICAgICAvLyBgX19wcm90b19fYCBzbyB0aGF0IGBfX2xvb2t1cEdldHRlcl9fYCB3aWxsIHJldHVybiBnZXR0ZXIgb25seQogICAgICAgICAgICAvLyBpZiBpdCdzIG93bmVkIGJ5IGFuIG9iamVjdC4KICAgICAgICAgICAgdmFyIHByb3RvdHlwZSA9IG9iamVjdC5fX3Byb3RvX187CiAgICAgICAgICAgIG9iamVjdC5fX3Byb3RvX18gPSBwcm90b3R5cGVPZk9iamVjdDsKCiAgICAgICAgICAgIHZhciBnZXR0ZXIgPSBsb29rdXBHZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSk7CiAgICAgICAgICAgIHZhciBzZXR0ZXIgPSBsb29rdXBTZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSk7CgogICAgICAgICAgICAvLyBPbmNlIHdlIGhhdmUgZ2V0dGVyIGFuZCBzZXR0ZXIgd2UgY2FuIHB1dCB2YWx1ZXMgYmFjay4KICAgICAgICAgICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZTsKCiAgICAgICAgICAgIGlmIChnZXR0ZXIgfHwgc2V0dGVyKSB7CiAgICAgICAgICAgICAgICBpZiAoZ2V0dGVyKSBkZXNjcmlwdG9yLmdldCA9IGdldHRlcjsKICAgICAgICAgICAgICAgIGlmIChzZXR0ZXIpIGRlc2NyaXB0b3Iuc2V0ID0gc2V0dGVyOwoKICAgICAgICAgICAgICAgIC8vIElmIGl0IHdhcyBhY2Nlc3NvciBwcm9wZXJ0eSB3ZSdyZSBkb25lIGFuZCByZXR1cm4gaGVyZQogICAgICAgICAgICAgICAgLy8gaW4gb3JkZXIgdG8gYXZvaWQgYWRkaW5nIGB2YWx1ZWAgdG8gdGhlIGRlc2NyaXB0b3IuCiAgICAgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gSWYgd2UgZ290IHRoaXMgZmFyIHdlIGtub3cgdGhhdCBvYmplY3QgaGFzIGFuIG93biBwcm9wZXJ0eSB0aGF0IGlzCiAgICAgICAgLy8gbm90IGFuIGFjY2Vzc29yIHNvIHdlIHNldCBpdCBhcyBhIHZhbHVlIGFuZCByZXR1cm4gZGVzY3JpcHRvci4KICAgICAgICBkZXNjcmlwdG9yLnZhbHVlID0gb2JqZWN0W3Byb3BlcnR5XTsKICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsKICAgIH07Cn0KCi8vIEVTNSAxNS4yLjMuNAovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuNAppZiAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKSB7CiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMob2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdCk7CiAgICB9Owp9CgovLyBFUzUgMTUuMi4zLjUKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjUKaWYgKCFPYmplY3QuY3JlYXRlKSB7CiAgICBPYmplY3QuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKHByb3RvdHlwZSwgcHJvcGVydGllcykgewogICAgICAgIHZhciBvYmplY3Q7CiAgICAgICAgaWYgKHByb3RvdHlwZSA9PT0gbnVsbCkgewogICAgICAgICAgICBvYmplY3QgPSB7ICJfX3Byb3RvX18iOiBudWxsIH07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm90b3R5cGUgIT0gIm9iamVjdCIpCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJ0eXBlb2YgcHJvdG90eXBlWyIrKHR5cGVvZiBwcm90b3R5cGUpKyJdICE9ICdvYmplY3QnIik7CiAgICAgICAgICAgIHZhciBUeXBlID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgIFR5cGUucHJvdG90eXBlID0gcHJvdG90eXBlOwogICAgICAgICAgICBvYmplY3QgPSBuZXcgVHlwZSgpOwogICAgICAgICAgICAvLyBJRSBoYXMgbm8gYnVpbHQtaW4gaW1wbGVtZW50YXRpb24gb2YgYE9iamVjdC5nZXRQcm90b3R5cGVPZmAKICAgICAgICAgICAgLy8gbmVpdGhlciBgX19wcm90b19fYCwgYnV0IHRoaXMgbWFudWFsbHkgc2V0dGluZyBgX19wcm90b19fYCB3aWxsCiAgICAgICAgICAgIC8vIGd1YXJhbnRlZSB0aGF0IGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgIHdpbGwgd29yayBhcyBleHBlY3RlZCB3aXRoCiAgICAgICAgICAgIC8vIG9iamVjdHMgY3JlYXRlZCB1c2luZyBgT2JqZWN0LmNyZWF0ZWAKICAgICAgICAgICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZTsKICAgICAgICB9CiAgICAgICAgaWYgKHByb3BlcnRpZXMgIT09IHZvaWQgMCkKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMob2JqZWN0LCBwcm9wZXJ0aWVzKTsKICAgICAgICByZXR1cm4gb2JqZWN0OwogICAgfTsKfQoKLy8gRVM1IDE1LjIuMy42Ci8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy42CgovLyBQYXRjaCBmb3IgV2ViS2l0IGFuZCBJRTggc3RhbmRhcmQgbW9kZQovLyBEZXNpZ25lZCBieSBoYXggPGhheC5naXRodWIuY29tPgovLyByZWxhdGVkIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20va3Jpc2tvd2FsL2VzNS1zaGltL2lzc3VlcyNpc3N1ZS81Ci8vIElFOCBSZWZlcmVuY2U6Ci8vICAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZGQyODI5MDAuYXNweAovLyAgICAgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2RkMjI5OTE2LmFzcHgKLy8gV2ViS2l0IEJ1Z3M6Ci8vICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzY0MjMKCmZ1bmN0aW9uIGRvZXNEZWZpbmVQcm9wZXJ0eVdvcmsob2JqZWN0KSB7CiAgICB0cnkgewogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsICJzZW50aW5lbCIsIHt9KTsKICAgICAgICByZXR1cm4gInNlbnRpbmVsIiBpbiBvYmplY3Q7CiAgICB9IGNhdGNoIChleGNlcHRpb24pIHsKICAgICAgICAvLyByZXR1cm5zIGZhbHN5CiAgICB9Cn0KCi8vIGNoZWNrIHdoZXRoZXIgZGVmaW5lUHJvcGVydHkgd29ya3MgaWYgaXQncyBnaXZlbi4gT3RoZXJ3aXNlLAovLyBzaGltIHBhcnRpYWxseS4KaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgewogICAgdmFyIGRlZmluZVByb3BlcnR5V29ya3NPbk9iamVjdCA9IGRvZXNEZWZpbmVQcm9wZXJ0eVdvcmsoe30pOwogICAgdmFyIGRlZmluZVByb3BlcnR5V29ya3NPbkRvbSA9IHR5cGVvZiBkb2N1bWVudCA9PSAidW5kZWZpbmVkIiB8fAogICAgICAgIGRvZXNEZWZpbmVQcm9wZXJ0eVdvcmsoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpOwogICAgaWYgKCFkZWZpbmVQcm9wZXJ0eVdvcmtzT25PYmplY3QgfHwgIWRlZmluZVByb3BlcnR5V29ya3NPbkRvbSkgewogICAgICAgIHZhciBkZWZpbmVQcm9wZXJ0eUZhbGxiYWNrID0gT2JqZWN0LmRlZmluZVByb3BlcnR5OwogICAgfQp9CgppZiAoIU9iamVjdC5kZWZpbmVQcm9wZXJ0eSB8fCBkZWZpbmVQcm9wZXJ0eUZhbGxiYWNrKSB7CiAgICB2YXIgRVJSX05PTl9PQkpFQ1RfREVTQ1JJUFRPUiA9ICJQcm9wZXJ0eSBkZXNjcmlwdGlvbiBtdXN0IGJlIGFuIG9iamVjdDogIjsKICAgIHZhciBFUlJfTk9OX09CSkVDVF9UQVJHRVQgPSAiT2JqZWN0LmRlZmluZVByb3BlcnR5IGNhbGxlZCBvbiBub24tb2JqZWN0OiAiCiAgICB2YXIgRVJSX0FDQ0VTU09SU19OT1RfU1VQUE9SVEVEID0gImdldHRlcnMgJiBzZXR0ZXJzIGNhbiBub3QgYmUgZGVmaW5lZCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib24gdGhpcyBqYXZhc2NyaXB0IGVuZ2luZSI7CgogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvcikgewogICAgICAgIGlmICgodHlwZW9mIG9iamVjdCAhPSAib2JqZWN0IiAmJiB0eXBlb2Ygb2JqZWN0ICE9ICJmdW5jdGlvbiIpIHx8IG9iamVjdCA9PT0gbnVsbCkKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihFUlJfTk9OX09CSkVDVF9UQVJHRVQgKyBvYmplY3QpOwogICAgICAgIGlmICgodHlwZW9mIGRlc2NyaXB0b3IgIT0gIm9iamVjdCIgJiYgdHlwZW9mIGRlc2NyaXB0b3IgIT0gImZ1bmN0aW9uIikgfHwgZGVzY3JpcHRvciA9PT0gbnVsbCkKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihFUlJfTk9OX09CSkVDVF9ERVNDUklQVE9SICsgZGVzY3JpcHRvcik7CgogICAgICAgIC8vIG1ha2UgYSB2YWxpYW50IGF0dGVtcHQgdG8gdXNlIHRoZSByZWFsIGRlZmluZVByb3BlcnR5CiAgICAgICAgLy8gZm9yIEk4J3MgRE9NIGVsZW1lbnRzLgogICAgICAgIGlmIChkZWZpbmVQcm9wZXJ0eUZhbGxiYWNrKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lUHJvcGVydHlGYWxsYmFjay5jYWxsKE9iamVjdCwgb2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvcik7CiAgICAgICAgICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgLy8gdHJ5IHRoZSBzaGltIGlmIHRoZSByZWFsIG9uZSBkb2Vzbid0IHdvcmsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gSWYgaXQncyBhIGRhdGEgcHJvcGVydHkuCiAgICAgICAgaWYgKG93bnMoZGVzY3JpcHRvciwgInZhbHVlIikpIHsKICAgICAgICAgICAgLy8gZmFpbCBzaWxlbnRseSBpZiAid3JpdGFibGUiLCAiZW51bWVyYWJsZSIsIG9yICJjb25maWd1cmFibGUiCiAgICAgICAgICAgIC8vIGFyZSByZXF1ZXN0ZWQgYnV0IG5vdCBzdXBwb3J0ZWQKICAgICAgICAgICAgLyoKICAgICAgICAgICAgLy8gYWx0ZXJuYXRlIGFwcHJvYWNoOgogICAgICAgICAgICBpZiAoIC8vIGNhbid0IGltcGxlbWVudCB0aGVzZSBmZWF0dXJlczsgYWxsb3cgZmFsc2UgYnV0IG5vdCB0cnVlCiAgICAgICAgICAgICAgICAhKG93bnMoZGVzY3JpcHRvciwgIndyaXRhYmxlIikgPyBkZXNjcmlwdG9yLndyaXRhYmxlIDogdHJ1ZSkgfHwKICAgICAgICAgICAgICAgICEob3ducyhkZXNjcmlwdG9yLCAiZW51bWVyYWJsZSIpID8gZGVzY3JpcHRvci5lbnVtZXJhYmxlIDogdHJ1ZSkgfHwKICAgICAgICAgICAgICAgICEob3ducyhkZXNjcmlwdG9yLCAiY29uZmlndXJhYmxlIikgPyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA6IHRydWUpCiAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKAogICAgICAgICAgICAgICAgICAgICJUaGlzIGltcGxlbWVudGF0aW9uIG9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBkb2VzIG5vdCAiICsKICAgICAgICAgICAgICAgICAgICAic3VwcG9ydCBjb25maWd1cmFibGUsIGVudW1lcmFibGUsIG9yIHdyaXRhYmxlLiIKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICovCgogICAgICAgICAgICBpZiAoc3VwcG9ydHNBY2Nlc3NvcnMgJiYgKGxvb2t1cEdldHRlcihvYmplY3QsIHByb3BlcnR5KSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cFNldHRlcihvYmplY3QsIHByb3BlcnR5KSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIEFzIGFjY2Vzc29ycyBhcmUgc3VwcG9ydGVkIG9ubHkgb24gZW5naW5lcyBpbXBsZW1lbnRpbmcKICAgICAgICAgICAgICAgIC8vIGBfX3Byb3RvX19gIHdlIGNhbiBzYWZlbHkgb3ZlcnJpZGUgYF9fcHJvdG9fX2Agd2hpbGUgZGVmaW5pbmcKICAgICAgICAgICAgICAgIC8vIGEgcHJvcGVydHkgdG8gbWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3QgaGl0IGFuIGluaGVyaXRlZAogICAgICAgICAgICAgICAgLy8gYWNjZXNzb3IuCiAgICAgICAgICAgICAgICB2YXIgcHJvdG90eXBlID0gb2JqZWN0Ll9fcHJvdG9fXzsKICAgICAgICAgICAgICAgIG9iamVjdC5fX3Byb3RvX18gPSBwcm90b3R5cGVPZk9iamVjdDsKICAgICAgICAgICAgICAgIC8vIERlbGV0aW5nIGEgcHJvcGVydHkgYW55d2F5IHNpbmNlIGdldHRlciAvIHNldHRlciBtYXkgYmUKICAgICAgICAgICAgICAgIC8vIGRlZmluZWQgb24gb2JqZWN0IGl0c2VsZi4KICAgICAgICAgICAgICAgIGRlbGV0ZSBvYmplY3RbcHJvcGVydHldOwogICAgICAgICAgICAgICAgb2JqZWN0W3Byb3BlcnR5XSA9IGRlc2NyaXB0b3IudmFsdWU7CiAgICAgICAgICAgICAgICAvLyBTZXR0aW5nIG9yaWdpbmFsIGBfX3Byb3RvX19gIGJhY2sgbm93LgogICAgICAgICAgICAgICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG9iamVjdFtwcm9wZXJ0eV0gPSBkZXNjcmlwdG9yLnZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCFzdXBwb3J0c0FjY2Vzc29ycykKICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJSX0FDQ0VTU09SU19OT1RfU1VQUE9SVEVEKTsKICAgICAgICAgICAgLy8gSWYgd2UgZ290IHRoYXQgZmFyIHRoZW4gZ2V0dGVycyBhbmQgc2V0dGVycyBjYW4gYmUgZGVmaW5lZCAhIQogICAgICAgICAgICBpZiAob3ducyhkZXNjcmlwdG9yLCAiZ2V0IikpCiAgICAgICAgICAgICAgICBkZWZpbmVHZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvci5nZXQpOwogICAgICAgICAgICBpZiAob3ducyhkZXNjcmlwdG9yLCAic2V0IikpCiAgICAgICAgICAgICAgICBkZWZpbmVTZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvci5zZXQpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG9iamVjdDsKICAgIH07Cn0KCi8vIEVTNSAxNS4yLjMuNwovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuNwppZiAoIU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKSB7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMob2JqZWN0LCBwcm9wZXJ0aWVzKSB7CiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gcHJvcGVydGllcykgewogICAgICAgICAgICBpZiAob3ducyhwcm9wZXJ0aWVzLCBwcm9wZXJ0eSkpCiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgcHJvcGVydGllc1twcm9wZXJ0eV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gb2JqZWN0OwogICAgfTsKfQoKLy8gRVM1IDE1LjIuMy44Ci8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy44CmlmICghT2JqZWN0LnNlYWwpIHsKICAgIE9iamVjdC5zZWFsID0gZnVuY3Rpb24gc2VhbChvYmplY3QpIHsKICAgICAgICAvLyB0aGlzIGlzIG1pc2xlYWRpbmcgYW5kIGJyZWFrcyBmZWF0dXJlLWRldGVjdGlvbiwgYnV0CiAgICAgICAgLy8gYWxsb3dzICJzZWN1cmFibGUiIGNvZGUgdG8gImdyYWNlZnVsbHkiIGRlZ3JhZGUgdG8gd29ya2luZwogICAgICAgIC8vIGJ1dCBpbnNlY3VyZSBjb2RlLgogICAgICAgIHJldHVybiBvYmplY3Q7CiAgICB9Owp9CgovLyBFUzUgMTUuMi4zLjkKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjkKaWYgKCFPYmplY3QuZnJlZXplKSB7CiAgICBPYmplY3QuZnJlZXplID0gZnVuY3Rpb24gZnJlZXplKG9iamVjdCkgewogICAgICAgIC8vIHRoaXMgaXMgbWlzbGVhZGluZyBhbmQgYnJlYWtzIGZlYXR1cmUtZGV0ZWN0aW9uLCBidXQKICAgICAgICAvLyBhbGxvd3MgInNlY3VyYWJsZSIgY29kZSB0byAiZ3JhY2VmdWxseSIgZGVncmFkZSB0byB3b3JraW5nCiAgICAgICAgLy8gYnV0IGluc2VjdXJlIGNvZGUuCiAgICAgICAgcmV0dXJuIG9iamVjdDsKICAgIH07Cn0KCi8vIGRldGVjdCBhIFJoaW5vIGJ1ZyBhbmQgcGF0Y2ggaXQKdHJ5IHsKICAgIE9iamVjdC5mcmVlemUoZnVuY3Rpb24gKCkge30pOwp9IGNhdGNoIChleGNlcHRpb24pIHsKICAgIE9iamVjdC5mcmVlemUgPSAoZnVuY3Rpb24gZnJlZXplKGZyZWV6ZU9iamVjdCkgewogICAgICAgIHJldHVybiBmdW5jdGlvbiBmcmVlemUob2JqZWN0KSB7CiAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0ID09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3Q7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnJlZXplT2JqZWN0KG9iamVjdCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfSkoT2JqZWN0LmZyZWV6ZSk7Cn0KCi8vIEVTNSAxNS4yLjMuMTAKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjEwCmlmICghT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKSB7CiAgICBPYmplY3QucHJldmVudEV4dGVuc2lvbnMgPSBmdW5jdGlvbiBwcmV2ZW50RXh0ZW5zaW9ucyhvYmplY3QpIHsKICAgICAgICAvLyB0aGlzIGlzIG1pc2xlYWRpbmcgYW5kIGJyZWFrcyBmZWF0dXJlLWRldGVjdGlvbiwgYnV0CiAgICAgICAgLy8gYWxsb3dzICJzZWN1cmFibGUiIGNvZGUgdG8gImdyYWNlZnVsbHkiIGRlZ3JhZGUgdG8gd29ya2luZwogICAgICAgIC8vIGJ1dCBpbnNlY3VyZSBjb2RlLgogICAgICAgIHJldHVybiBvYmplY3Q7CiAgICB9Owp9CgovLyBFUzUgMTUuMi4zLjExCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMQppZiAoIU9iamVjdC5pc1NlYWxlZCkgewogICAgT2JqZWN0LmlzU2VhbGVkID0gZnVuY3Rpb24gaXNTZWFsZWQob2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfTsKfQoKLy8gRVM1IDE1LjIuMy4xMgovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuMTIKaWYgKCFPYmplY3QuaXNGcm96ZW4pIHsKICAgIE9iamVjdC5pc0Zyb3plbiA9IGZ1bmN0aW9uIGlzRnJvemVuKG9iamVjdCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH07Cn0KCi8vIEVTNSAxNS4yLjMuMTMKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjEzCmlmICghT2JqZWN0LmlzRXh0ZW5zaWJsZSkgewogICAgT2JqZWN0LmlzRXh0ZW5zaWJsZSA9IGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZShvYmplY3QpIHsKICAgICAgICAvLyAxLiBJZiBUeXBlKE8pIGlzIG5vdCBPYmplY3QgdGhyb3cgYSBUeXBlRXJyb3IgZXhjZXB0aW9uLgogICAgICAgIGlmIChPYmplY3Qob2JqZWN0KSA9PT0gb2JqZWN0KSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlCiAgICAgICAgfQogICAgICAgIC8vIDIuIFJldHVybiB0aGUgQm9vbGVhbiB2YWx1ZSBvZiB0aGUgW1tFeHRlbnNpYmxlXV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgTy4KICAgICAgICB2YXIgbmFtZSA9ICcnOwogICAgICAgIHdoaWxlIChvd25zKG9iamVjdCwgbmFtZSkpIHsKICAgICAgICAgICAgbmFtZSArPSAnPyc7CiAgICAgICAgfQogICAgICAgIG9iamVjdFtuYW1lXSA9IHRydWU7CiAgICAgICAgdmFyIHJldHVyblZhbHVlID0gb3ducyhvYmplY3QsIG5hbWUpOwogICAgICAgIGRlbGV0ZSBvYmplY3RbbmFtZV07CiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwogICAgfTsKfQoKLy8gRVM1IDE1LjIuMy4xNAovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuMTQKaWYgKCFPYmplY3Qua2V5cykgewogICAgLy8gaHR0cDovL3doYXR0aGVoZWFkc2FpZC5jb20vMjAxMC8xMC9hLXNhZmVyLW9iamVjdC1rZXlzLWNvbXBhdGliaWxpdHktaW1wbGVtZW50YXRpb24KICAgIHZhciBoYXNEb250RW51bUJ1ZyA9IHRydWUsCiAgICAgICAgZG9udEVudW1zID0gWwogICAgICAgICAgICAidG9TdHJpbmciLAogICAgICAgICAgICAidG9Mb2NhbGVTdHJpbmciLAogICAgICAgICAgICAidmFsdWVPZiIsCiAgICAgICAgICAgICJoYXNPd25Qcm9wZXJ0eSIsCiAgICAgICAgICAgICJpc1Byb3RvdHlwZU9mIiwKICAgICAgICAgICAgInByb3BlcnR5SXNFbnVtZXJhYmxlIiwKICAgICAgICAgICAgImNvbnN0cnVjdG9yIgogICAgICAgIF0sCiAgICAgICAgZG9udEVudW1zTGVuZ3RoID0gZG9udEVudW1zLmxlbmd0aDsKCiAgICBmb3IgKHZhciBrZXkgaW4geyJ0b1N0cmluZyI6IG51bGx9KQogICAgICAgIGhhc0RvbnRFbnVtQnVnID0gZmFsc2U7CgogICAgT2JqZWN0LmtleXMgPSBmdW5jdGlvbiBrZXlzKG9iamVjdCkgewoKICAgICAgICBpZiAoKHR5cGVvZiBvYmplY3QgIT0gIm9iamVjdCIgJiYgdHlwZW9mIG9iamVjdCAhPSAiZnVuY3Rpb24iKSB8fCBvYmplY3QgPT09IG51bGwpCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdC5rZXlzIGNhbGxlZCBvbiBhIG5vbi1vYmplY3QiKTsKCiAgICAgICAgdmFyIGtleXMgPSBbXTsKICAgICAgICBmb3IgKHZhciBuYW1lIGluIG9iamVjdCkgewogICAgICAgICAgICBpZiAob3ducyhvYmplY3QsIG5hbWUpKSB7CiAgICAgICAgICAgICAgICBrZXlzLnB1c2gobmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChoYXNEb250RW51bUJ1ZykgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBkb250RW51bXNMZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgZG9udEVudW0gPSBkb250RW51bXNbaV07CiAgICAgICAgICAgICAgICBpZiAob3ducyhvYmplY3QsIGRvbnRFbnVtKSkgewogICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChkb250RW51bSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBrZXlzOwogICAgfTsKCn0KCi8vCi8vIERhdGUKLy8gPT09PQovLwoKLy8gRVM1IDE1LjkuNS40MwovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS45LjUuNDMKLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgU3RyaW5nIHZhbHVlIHJlcHJlc2VudCB0aGUgaW5zdGFuY2UgaW4gdGltZSAKLy8gcmVwcmVzZW50ZWQgYnkgdGhpcyBEYXRlIG9iamVjdC4gVGhlIGZvcm1hdCBvZiB0aGUgU3RyaW5nIGlzIHRoZSBEYXRlIFRpbWUgCi8vIHN0cmluZyBmb3JtYXQgZGVmaW5lZCBpbiAxNS45LjEuMTUuIEFsbCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIFN0cmluZy4gCi8vIFRoZSB0aW1lIHpvbmUgaXMgYWx3YXlzIFVUQywgZGVub3RlZCBieSB0aGUgc3VmZml4IFouIElmIHRoZSB0aW1lIHZhbHVlIG9mIAovLyB0aGlzIG9iamVjdCBpcyBub3QgYSBmaW5pdGUgTnVtYmVyIGEgUmFuZ2VFcnJvciBleGNlcHRpb24gaXMgdGhyb3duLgppZiAoIURhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nIHx8IChuZXcgRGF0ZSgtNjIxOTg3NTUyMDAwMDApLnRvSVNPU3RyaW5nKCkuaW5kZXhPZignLTAwMDAwMScpID09PSAtMSkpIHsKICAgIERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nID0gZnVuY3Rpb24gdG9JU09TdHJpbmcoKSB7CiAgICAgICAgdmFyIHJlc3VsdCwgbGVuZ3RoLCB2YWx1ZSwgeWVhcjsKICAgICAgICBpZiAoIWlzRmluaXRlKHRoaXMpKQogICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcjsKCiAgICAgICAgLy8gdGhlIGRhdGUgdGltZSBzdHJpbmcgZm9ybWF0IGlzIHNwZWNpZmllZCBpbiAxNS45LjEuMTUuCiAgICAgICAgcmVzdWx0ID0gW3RoaXMuZ2V0VVRDTW9udGgoKSArIDEsIHRoaXMuZ2V0VVRDRGF0ZSgpLAogICAgICAgICAgICB0aGlzLmdldFVUQ0hvdXJzKCksIHRoaXMuZ2V0VVRDTWludXRlcygpLCB0aGlzLmdldFVUQ1NlY29uZHMoKV07CiAgICAgICAgeWVhciA9IHRoaXMuZ2V0VVRDRnVsbFllYXIoKTsKICAgICAgICB5ZWFyID0gKHllYXIgPCAwID8gJy0nIDogKHllYXIgPiA5OTk5ID8gJysnIDogJycpKSArICgnMDAwMDAnICsgTWF0aC5hYnMoeWVhcikpLnNsaWNlKDAgPD0geWVhciAmJiB5ZWFyIDw9IDk5OTkgPyAtNCA6IC02KTsKCiAgICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDsKICAgICAgICB3aGlsZSAobGVuZ3RoLS0pIHsKICAgICAgICAgICAgdmFsdWUgPSByZXN1bHRbbGVuZ3RoXTsKICAgICAgICAgICAgLy8gcGFkIG1vbnRocywgZGF5cywgaG91cnMsIG1pbnV0ZXMsIGFuZCBzZWNvbmRzIHRvIGhhdmUgdHdvIGRpZ2l0cy4KICAgICAgICAgICAgaWYgKHZhbHVlIDwgMTApCiAgICAgICAgICAgICAgICByZXN1bHRbbGVuZ3RoXSA9ICIwIiArIHZhbHVlOwogICAgICAgIH0KICAgICAgICAvLyBwYWQgbWlsbGlzZWNvbmRzIHRvIGhhdmUgdGhyZWUgZGlnaXRzLgogICAgICAgIHJldHVybiB5ZWFyICsgIi0iICsgcmVzdWx0LnNsaWNlKDAsIDIpLmpvaW4oIi0iKSArICJUIiArIHJlc3VsdC5zbGljZSgyKS5qb2luKCI6IikgKyAiLiIgKwogICAgICAgICAgICAoIjAwMCIgKyB0aGlzLmdldFVUQ01pbGxpc2Vjb25kcygpKS5zbGljZSgtMykgKyAiWiI7CiAgICB9Cn0KCi8vIEVTNSAxNS45LjQuNAovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS45LjQuNAppZiAoIURhdGUubm93KSB7CiAgICBEYXRlLm5vdyA9IGZ1bmN0aW9uIG5vdygpIHsKICAgICAgICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICB9Owp9CgovLyBFUzUgMTUuOS41LjQ0Ci8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjkuNS40NAovLyBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgRGF0ZSBvYmplY3QgZm9yIHVzZSBieSAKLy8gSlNPTi5zdHJpbmdpZnkgKDE1LjEyLjMpLgppZiAoIURhdGUucHJvdG90eXBlLnRvSlNPTikgewogICAgRGF0ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OKGtleSkgewogICAgICAgIC8vIFdoZW4gdGhlIHRvSlNPTiBtZXRob2QgaXMgY2FsbGVkIHdpdGggYXJndW1lbnQga2V5LCB0aGUgZm9sbG93aW5nIAogICAgICAgIC8vIHN0ZXBzIGFyZSB0YWtlbjoKCiAgICAgICAgLy8gMS4gIExldCBPIGJlIHRoZSByZXN1bHQgb2YgY2FsbGluZyBUb09iamVjdCwgZ2l2aW5nIGl0IHRoZSB0aGlzCiAgICAgICAgLy8gdmFsdWUgYXMgaXRzIGFyZ3VtZW50LgogICAgICAgIC8vIDIuIExldCB0diBiZSBUb1ByaW1pdGl2ZShPLCBoaW50IE51bWJlcikuCiAgICAgICAgLy8gMy4gSWYgdHYgaXMgYSBOdW1iZXIgYW5kIGlzIG5vdCBmaW5pdGUsIHJldHVybiBudWxsLgogICAgICAgIC8vIFhYWAogICAgICAgIC8vIDQuIExldCB0b0lTTyBiZSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIFtbR2V0XV0gaW50ZXJuYWwgbWV0aG9kIG9mCiAgICAgICAgLy8gTyB3aXRoIGFyZ3VtZW50ICJ0b0lTT1N0cmluZyIuCiAgICAgICAgLy8gNS4gSWYgSXNDYWxsYWJsZSh0b0lTTykgaXMgZmFsc2UsIHRocm93IGEgVHlwZUVycm9yIGV4Y2VwdGlvbi4KICAgICAgICBpZiAodHlwZW9mIHRoaXMudG9JU09TdHJpbmcgIT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UKICAgICAgICAvLyA2LiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBtZXRob2Qgb2YKICAgICAgICAvLyAgdG9JU08gd2l0aCBPIGFzIHRoZSB0aGlzIHZhbHVlIGFuZCBhbiBlbXB0eSBhcmd1bWVudCBsaXN0LgogICAgICAgIHJldHVybiB0aGlzLnRvSVNPU3RyaW5nKCk7CgogICAgICAgIC8vIE5PVEUgMSBUaGUgYXJndW1lbnQgaXMgaWdub3JlZC4KCiAgICAgICAgLy8gTk9URSAyIFRoZSB0b0pTT04gZnVuY3Rpb24gaXMgaW50ZW50aW9uYWxseSBnZW5lcmljOyBpdCBkb2VzIG5vdAogICAgICAgIC8vIHJlcXVpcmUgdGhhdCBpdHMgdGhpcyB2YWx1ZSBiZSBhIERhdGUgb2JqZWN0LiBUaGVyZWZvcmUsIGl0IGNhbiBiZQogICAgICAgIC8vIHRyYW5zZmVycmVkIHRvIG90aGVyIGtpbmRzIG9mIG9iamVjdHMgZm9yIHVzZSBhcyBhIG1ldGhvZC4gSG93ZXZlciwKICAgICAgICAvLyBpdCBkb2VzIHJlcXVpcmUgdGhhdCBhbnkgc3VjaCBvYmplY3QgaGF2ZSBhIHRvSVNPU3RyaW5nIG1ldGhvZC4gQW4KICAgICAgICAvLyBvYmplY3QgaXMgZnJlZSB0byB1c2UgdGhlIGFyZ3VtZW50IGtleSB0byBmaWx0ZXIgaXRzCiAgICAgICAgLy8gc3RyaW5naWZpY2F0aW9uLgogICAgfTsKfQoKLy8gRVM1IDE1LjkuNC4yCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjkuNC4yCi8vIGJhc2VkIG9uIHdvcmsgc2hhcmVkIGJ5IERhbmllbCBGcmllc2VuIChkYW50bWFuKQovLyBodHRwOi8vZ2lzdC5naXRodWIuY29tLzMwMzI0OQppZiAoRGF0ZS5wYXJzZSgiKzI3NTc2MC0wOS0xM1QwMDowMDowMC4wMDBaIikgIT09IDguNjRlMTUpIHsKICAgIC8vIFhYWCBnbG9iYWwgYXNzaWdubWVudCB3b24ndCB3b3JrIGluIGVtYmVkZGluZ3MgdGhhdCB1c2UKICAgIC8vIGFuIGFsdGVybmF0ZSBvYmplY3QgZm9yIHRoZSBjb250ZXh0LgogICAgRGF0ZSA9IChmdW5jdGlvbihOYXRpdmVEYXRlKSB7CgogICAgICAgIC8vIERhdGUubGVuZ3RoID09PSA3CiAgICAgICAgdmFyIERhdGUgPSBmdW5jdGlvbiBEYXRlKFksIE0sIEQsIGgsIG0sIHMsIG1zKSB7CiAgICAgICAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOwogICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIE5hdGl2ZURhdGUpIHsKICAgICAgICAgICAgICAgIHZhciBkYXRlID0gbGVuZ3RoID09IDEgJiYgU3RyaW5nKFkpID09PSBZID8gLy8gaXNTdHJpbmcoWSkKICAgICAgICAgICAgICAgICAgICAvLyBXZSBleHBsaWNpdGx5IHBhc3MgaXQgdGhyb3VnaCBwYXJzZToKICAgICAgICAgICAgICAgICAgICBuZXcgTmF0aXZlRGF0ZShEYXRlLnBhcnNlKFkpKSA6CiAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byBtYW51YWxseSBtYWtlIGNhbGxzIGRlcGVuZGluZyBvbiBhcmd1bWVudAogICAgICAgICAgICAgICAgICAgIC8vIGxlbmd0aCBoZXJlCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDcgPyBuZXcgTmF0aXZlRGF0ZShZLCBNLCBELCBoLCBtLCBzLCBtcykgOgogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSA2ID8gbmV3IE5hdGl2ZURhdGUoWSwgTSwgRCwgaCwgbSwgcykgOgogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSA1ID8gbmV3IE5hdGl2ZURhdGUoWSwgTSwgRCwgaCwgbSkgOgogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSA0ID8gbmV3IE5hdGl2ZURhdGUoWSwgTSwgRCwgaCkgOgogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSAzID8gbmV3IE5hdGl2ZURhdGUoWSwgTSwgRCkgOgogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSAyID8gbmV3IE5hdGl2ZURhdGUoWSwgTSkgOgogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSAxID8gbmV3IE5hdGl2ZURhdGUoWSkgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5hdGl2ZURhdGUoKTsKICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgbWl4dXBzIHdpdGggdW5maXhlZCBEYXRlIG9iamVjdAogICAgICAgICAgICAgICAgZGF0ZS5jb25zdHJ1Y3RvciA9IERhdGU7CiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH07CgogICAgICAgIC8vIDE1LjkuMS4xNSBEYXRlIFRpbWUgU3RyaW5nIEZvcm1hdC4KICAgICAgICB2YXIgaXNvRGF0ZUV4cHJlc3Npb24gPSBuZXcgUmVnRXhwKCJeIiArCiAgICAgICAgICAgICIoXFxkezR9fFtcK1wtXVxcZHs2fSkiICsgLy8gZm91ci1kaWdpdCB5ZWFyIGNhcHR1cmUgb3Igc2lnbiArIDYtZGlnaXQgZXh0ZW5kZWQgeWVhcgogICAgICAgICAgICAiKD86LShcXGR7Mn0pIiArIC8vIG9wdGlvbmFsIG1vbnRoIGNhcHR1cmUKICAgICAgICAgICAgIig/Oi0oXFxkezJ9KSIgKyAvLyBvcHRpb25hbCBkYXkgY2FwdHVyZQogICAgICAgICAgICAiKD86IiArIC8vIGNhcHR1cmUgaG91cnM6bWludXRlczpzZWNvbmRzLm1pbGxpc2Vjb25kcwogICAgICAgICAgICAgICAgIlQoXFxkezJ9KSIgKyAvLyBob3VycyBjYXB0dXJlCiAgICAgICAgICAgICAgICAiOihcXGR7Mn0pIiArIC8vIG1pbnV0ZXMgY2FwdHVyZQogICAgICAgICAgICAgICAgIig/OiIgKyAvLyBvcHRpb25hbCA6c2Vjb25kcy5taWxsaXNlY29uZHMKICAgICAgICAgICAgICAgICAgICAiOihcXGR7Mn0pIiArIC8vIHNlY29uZHMgY2FwdHVyZQogICAgICAgICAgICAgICAgICAgICIoPzpcXC4oXFxkezN9KSk/IiArIC8vIG1pbGxpc2Vjb25kcyBjYXB0dXJlCiAgICAgICAgICAgICAgICAiKT8iICsKICAgICAgICAgICAgIig/OiIgKyAvLyBjYXB0dXJlIFVUQyBvZmZzZXQgY29tcG9uZW50CiAgICAgICAgICAgICAgICAiWnwiICsgLy8gVVRDIGNhcHR1cmUKICAgICAgICAgICAgICAgICIoPzoiICsgLy8gb2Zmc2V0IHNwZWNpZmllciArLy1ob3VyczptaW51dGVzCiAgICAgICAgICAgICAgICAgICAgIihbLStdKSIgKyAvLyBzaWduIGNhcHR1cmUKICAgICAgICAgICAgICAgICAgICAiKFxcZHsyfSkiICsgLy8gaG91cnMgb2Zmc2V0IGNhcHR1cmUKICAgICAgICAgICAgICAgICAgICAiOihcXGR7Mn0pIiArIC8vIG1pbnV0ZXMgb2Zmc2V0IGNhcHR1cmUKICAgICAgICAgICAgICAgICIpIiArCiAgICAgICAgICAgICIpPyk/KT8pPyIgKwogICAgICAgICIkIik7CgogICAgICAgIC8vIENvcHkgYW55IGN1c3RvbSBtZXRob2RzIGEgM3JkIHBhcnR5IGxpYnJhcnkgbWF5IGhhdmUgYWRkZWQKICAgICAgICBmb3IgKHZhciBrZXkgaW4gTmF0aXZlRGF0ZSkKICAgICAgICAgICAgRGF0ZVtrZXldID0gTmF0aXZlRGF0ZVtrZXldOwoKICAgICAgICAvLyBDb3B5ICJuYXRpdmUiIG1ldGhvZHMgZXhwbGljaXRseTsgdGhleSBtYXkgYmUgbm9uLWVudW1lcmFibGUKICAgICAgICBEYXRlLm5vdyA9IE5hdGl2ZURhdGUubm93OwogICAgICAgIERhdGUuVVRDID0gTmF0aXZlRGF0ZS5VVEM7CiAgICAgICAgRGF0ZS5wcm90b3R5cGUgPSBOYXRpdmVEYXRlLnByb3RvdHlwZTsKICAgICAgICBEYXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERhdGU7CgogICAgICAgIC8vIFVwZ3JhZGUgRGF0ZS5wYXJzZSB0byBoYW5kbGUgc2ltcGxpZmllZCBJU08gODYwMSBzdHJpbmdzCiAgICAgICAgRGF0ZS5wYXJzZSA9IGZ1bmN0aW9uIHBhcnNlKHN0cmluZykgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBpc29EYXRlRXhwcmVzc2lvbi5leGVjKHN0cmluZyk7CiAgICAgICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICAgICAgbWF0Y2guc2hpZnQoKTsgLy8ga2lsbCBtYXRjaFswXSwgdGhlIGZ1bGwgbWF0Y2gKICAgICAgICAgICAgICAgIC8vIHBhcnNlIG1vbnRocywgZGF5cywgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGFuZCBtaWxsaXNlY29uZHMKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgNzsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gcHJvdmlkZSBkZWZhdWx0IHZhbHVlcyBpZiBuZWNlc3NhcnkKICAgICAgICAgICAgICAgICAgICBtYXRjaFtpXSA9ICsobWF0Y2hbaV0gfHwgKGkgPCAzID8gMSA6IDApKTsKICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaFsxXSBpcyB0aGUgbW9udGguIE1vbnRocyBhcmUgMC0xMSBpbiBKYXZhU2NyaXB0CiAgICAgICAgICAgICAgICAgICAgLy8gYERhdGVgIG9iamVjdHMsIGJ1dCAxLTEyIGluIElTTyBub3RhdGlvbiwgc28gd2UKICAgICAgICAgICAgICAgICAgICAvLyBkZWNyZW1lbnQuCiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbaV0tLTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBwYXJzZSB0aGUgVVRDIG9mZnNldCBjb21wb25lbnQKICAgICAgICAgICAgICAgIHZhciBtaW51dGVPZmZzZXQgPSArbWF0Y2gucG9wKCksIGhvdXJPZmZzZXQgPSArbWF0Y2gucG9wKCksIHNpZ24gPSBtYXRjaC5wb3AoKTsKCiAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHRoZSBleHBsaWNpdCB0aW1lIHpvbmUgb2Zmc2V0IGlmIHNwZWNpZmllZAogICAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IDA7CiAgICAgICAgICAgICAgICBpZiAoc2lnbikgewogICAgICAgICAgICAgICAgICAgIC8vIGRldGVjdCBpbnZhbGlkIG9mZnNldHMgYW5kIHJldHVybiBlYXJseQogICAgICAgICAgICAgICAgICAgIGlmIChob3VyT2Zmc2V0ID4gMjMgfHwgbWludXRlT2Zmc2V0ID4gNTkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOYU47CgogICAgICAgICAgICAgICAgICAgIC8vIGV4cHJlc3MgdGhlIHByb3ZpZGVkIHRpbWUgem9uZSBvZmZzZXQgaW4gbWludXRlcy4gVGhlIG9mZnNldCBpcwogICAgICAgICAgICAgICAgICAgIC8vIG5lZ2F0aXZlIGZvciB0aW1lIHpvbmVzIHdlc3Qgb2YgVVRDOyBwb3NpdGl2ZSBvdGhlcndpc2UuCiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKGhvdXJPZmZzZXQgKiA2MCArIG1pbnV0ZU9mZnNldCkgKiA2ZTQgKiAoc2lnbiA9PSAiKyIgPyAtMSA6IDEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIERhdGUuVVRDIGZvciB5ZWFycyBiZXR3ZWVuIDAgYW5kIDk5IGNvbnZlcnRzIHllYXIgdG8gMTkwMCArIHllYXIKICAgICAgICAgICAgICAgIC8vIFRoZSBHcmVnb3JpYW4gY2FsZW5kYXIgaGFzIGEgNDAwLXllYXIgY3ljbGUsIHNvIAogICAgICAgICAgICAgICAgLy8gdG8gRGF0ZS5VVEMoeWVhciArIDQwMCwgLi4uLiApIC0gMTI2MjI3ODA4MDAwMDAgPT0gRGF0ZS5VVEMoeWVhciwgLi4uKSwKICAgICAgICAgICAgICAgIC8vIHdoZXJlIDEyNjIyNzgwODAwMDAwIC0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBHcmVnb3JpYW4gY2FsZW5kYXIgNDAwIHllYXJzCiAgICAgICAgICAgICAgICB2YXIgeWVhciA9ICttYXRjaFswXTsKICAgICAgICAgICAgICAgIGlmICgwIDw9IHllYXIgJiYgeWVhciA8PSA5OSkgewogICAgICAgICAgICAgICAgICAgIG1hdGNoWzBdID0geWVhciArIDQwMDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5VVEMuYXBwbHkodGhpcywgbWF0Y2gpICsgb2Zmc2V0IC0gMTI2MjI3ODA4MDAwMDA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gY29tcHV0ZSBhIG5ldyBVVEMgZGF0ZSB2YWx1ZSwgYWNjb3VudGluZyBmb3IgdGhlIG9wdGlvbmFsIG9mZnNldAogICAgICAgICAgICAgICAgcmV0dXJuIE5hdGl2ZURhdGUuVVRDLmFwcGx5KHRoaXMsIG1hdGNoKSArIG9mZnNldDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5wYXJzZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH07CgogICAgICAgIHJldHVybiBEYXRlOwogICAgfSkoRGF0ZSk7Cn0KCi8vCi8vIFN0cmluZwovLyA9PT09PT0KLy8KCi8vIEVTNSAxNS41LjQuMjAKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNS40LjIwCnZhciB3cyA9ICJceDA5XHgwQVx4MEJceDBDXHgwRFx4MjBceEEwXHUxNjgwXHUxODBFXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzIiArCiAgICAiXHUyMDA0XHUyMDA1XHUyMDA2XHUyMDA3XHUyMDA4XHUyMDA5XHUyMDBBXHUyMDJGXHUyMDVGXHUzMDAwXHUyMDI4IiArCiAgICAiXHUyMDI5XHVGRUZGIjsKaWYgKCFTdHJpbmcucHJvdG90eXBlLnRyaW0gfHwgd3MudHJpbSgpKSB7CiAgICAvLyBodHRwOi8vYmxvZy5zdGV2ZW5sZXZpdGhhbi5jb20vYXJjaGl2ZXMvZmFzdGVyLXRyaW0tamF2YXNjcmlwdAogICAgLy8gaHR0cDovL3BlcmZlY3Rpb25raWxscy5jb20vd2hpdGVzcGFjZS1kZXZpYXRpb25zLwogICAgd3MgPSAiWyIgKyB3cyArICJdIjsKICAgIHZhciB0cmltQmVnaW5SZWdleHAgPSBuZXcgUmVnRXhwKCJeIiArIHdzICsgd3MgKyAiKiIpLAogICAgICAgIHRyaW1FbmRSZWdleHAgPSBuZXcgUmVnRXhwKHdzICsgd3MgKyAiKiQiKTsKICAgIFN0cmluZy5wcm90b3R5cGUudHJpbSA9IGZ1bmN0aW9uIHRyaW0oKSB7CiAgICAgICAgcmV0dXJuIFN0cmluZyh0aGlzKS5yZXBsYWNlKHRyaW1CZWdpblJlZ2V4cCwgIiIpLnJlcGxhY2UodHJpbUVuZFJlZ2V4cCwgIiIpOwogICAgfTsKfQoKLy8KLy8gVXRpbAovLyA9PT09PT0KLy8KCi8vIEVTNSA5LjQKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4OS40Ci8vIGh0dHA6Ly9qc3BlcmYuY29tL3RvLWludGVnZXIKdmFyIHRvSW50ZWdlciA9IGZ1bmN0aW9uIChuKSB7CiAgICBuID0gK247CiAgICBpZiAobiAhPT0gbikgLy8gaXNOYU4KICAgICAgICBuID0gMDsKICAgIGVsc2UgaWYgKG4gIT09IDAgJiYgbiAhPT0gKDEvMCkgJiYgbiAhPT0gLSgxLzApKQogICAgICAgIG4gPSAobiA+IDAgfHwgLTEpICogTWF0aC5mbG9vcihNYXRoLmFicyhuKSk7CiAgICByZXR1cm4gbjsKfTsKCnZhciBwcmVwYXJlU3RyaW5nID0gImEiWzBdICE9ICJhIiwKICAgIC8vIEVTNSA5LjkKICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDkuOQogICAgdG9PYmplY3QgPSBmdW5jdGlvbiAobykgewogICAgICAgIGlmIChvID09IG51bGwpIHsgLy8gdGhpcyBtYXRjaGVzIGJvdGggbnVsbCBhbmQgdW5kZWZpbmVkCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlCiAgICAgICAgfQogICAgICAgIC8vIElmIHRoZSBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHN1cHBvcnQgYnktaW5kZXggYWNjZXNzIG9mCiAgICAgICAgLy8gc3RyaW5nIGNoYXJhY3RlcnMgKGV4LiBJRSA8IDcpLCBzcGxpdCB0aGUgc3RyaW5nCiAgICAgICAgaWYgKHByZXBhcmVTdHJpbmcgJiYgdHlwZW9mIG8gPT0gInN0cmluZyIgJiYgbykgewogICAgICAgICAgICByZXR1cm4gby5zcGxpdCgiIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBPYmplY3Qobyk7CiAgICB9Owp9KTsvKiB2aW06dHM9NDpzdHM9NDpzdz00OgogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqICAgICAgSXJha2xpIEdvemFsaXNodmlsaSA8cmZvYmljQGdtYWlsLmNvbT4gKGh0dHA6Ly9qZWRpdG9vbGtpdC5jb20pCiAqICAgICAgTWlrZSBkZSBCb2VyIDxtaWtlIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL2xpYi9ldmVudF9lbWl0dGVyJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIEV2ZW50RW1pdHRlciA9IHt9OwoKRXZlbnRFbWl0dGVyLl9lbWl0ID0KRXZlbnRFbWl0dGVyLl9kaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24oZXZlbnROYW1lLCBlKSB7CiAgICB0aGlzLl9ldmVudFJlZ2lzdHJ5ID0gdGhpcy5fZXZlbnRSZWdpc3RyeSB8fCB7fTsKICAgIHRoaXMuX2RlZmF1bHRIYW5kbGVycyA9IHRoaXMuX2RlZmF1bHRIYW5kbGVycyB8fCB7fTsKCiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdIHx8IFtdOwogICAgdmFyIGRlZmF1bHRIYW5kbGVyID0gdGhpcy5fZGVmYXVsdEhhbmRsZXJzW2V2ZW50TmFtZV07CiAgICBpZiAoIWxpc3RlbmVycy5sZW5ndGggJiYgIWRlZmF1bHRIYW5kbGVyKQogICAgICAgIHJldHVybjsKCiAgICBlID0gZSB8fCB7fTsKICAgIGUudHlwZSA9IGV2ZW50TmFtZTsKICAgIAogICAgaWYgKCFlLnN0b3BQcm9wYWdhdGlvbikgewogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZTsKICAgICAgICB9OwogICAgfQogICAgCiAgICBpZiAoIWUucHJldmVudERlZmF1bHQpIHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7CiAgICAgICAgfTsKICAgIH0KCiAgICBmb3IgKHZhciBpPTA7IGk8bGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbGlzdGVuZXJzW2ldKGUpOwogICAgICAgIGlmIChlLnByb3BhZ2F0aW9uU3RvcHBlZCkKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICAKICAgIGlmIChkZWZhdWx0SGFuZGxlciAmJiAhZS5kZWZhdWx0UHJldmVudGVkKQogICAgICAgIGRlZmF1bHRIYW5kbGVyKGUpOwp9OwoKRXZlbnRFbWl0dGVyLnNldERlZmF1bHRIYW5kbGVyID0gZnVuY3Rpb24oZXZlbnROYW1lLCBjYWxsYmFjaykgewogICAgdGhpcy5fZGVmYXVsdEhhbmRsZXJzID0gdGhpcy5fZGVmYXVsdEhhbmRsZXJzIHx8IHt9OwogICAgCiAgICBpZiAodGhpcy5fZGVmYXVsdEhhbmRsZXJzW2V2ZW50TmFtZV0pCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgZGVmYXVsdCBoYW5kbGVyIGZvciAnIiArIGV2ZW50TmFtZSArICInIGlzIGFscmVhZHkgc2V0Iik7CiAgICAgICAgCiAgICB0aGlzLl9kZWZhdWx0SGFuZGxlcnNbZXZlbnROYW1lXSA9IGNhbGxiYWNrOwp9OwoKRXZlbnRFbWl0dGVyLm9uID0KRXZlbnRFbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7CiAgICB0aGlzLl9ldmVudFJlZ2lzdHJ5ID0gdGhpcy5fZXZlbnRSZWdpc3RyeSB8fCB7fTsKCiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdOwogICAgaWYgKCFsaXN0ZW5lcnMpCiAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50UmVnaXN0cnlbZXZlbnROYW1lXSA9IFtdOwoKICAgIGlmIChsaXN0ZW5lcnMuaW5kZXhPZihjYWxsYmFjaykgPT0gLTEpCiAgICAgICAgbGlzdGVuZXJzLnB1c2goY2FsbGJhY2spOwp9OwoKRXZlbnRFbWl0dGVyLnJlbW92ZUxpc3RlbmVyID0KRXZlbnRFbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7CiAgICB0aGlzLl9ldmVudFJlZ2lzdHJ5ID0gdGhpcy5fZXZlbnRSZWdpc3RyeSB8fCB7fTsKCiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdOwogICAgaWYgKCFsaXN0ZW5lcnMpCiAgICAgICAgcmV0dXJuOwoKICAgIHZhciBpbmRleCA9IGxpc3RlbmVycy5pbmRleE9mKGNhbGxiYWNrKTsKICAgIGlmIChpbmRleCAhPT0gLTEpCiAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7Cn07CgpFdmVudEVtaXR0ZXIucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnROYW1lKSB7CiAgICBpZiAodGhpcy5fZXZlbnRSZWdpc3RyeSkgdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdID0gW107Cn07CgpleHBvcnRzLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjsKCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL2xpYi9vb3AnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7CgpleHBvcnRzLmluaGVyaXRzID0gKGZ1bmN0aW9uKCkgewogICAgdmFyIHRlbXBDdG9yID0gZnVuY3Rpb24oKSB7fTsKICAgIHJldHVybiBmdW5jdGlvbihjdG9yLCBzdXBlckN0b3IpIHsKICAgICAgICB0ZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlOwogICAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yLnByb3RvdHlwZTsKICAgICAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyB0ZW1wQ3RvcigpOwogICAgICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvcjsKICAgIH07Cn0oKSk7CgpleHBvcnRzLm1peGluID0gZnVuY3Rpb24ob2JqLCBtaXhpbikgewogICAgZm9yICh2YXIga2V5IGluIG1peGluKSB7CiAgICAgICAgb2JqW2tleV0gPSBtaXhpbltrZXldOwogICAgfQp9OwoKZXhwb3J0cy5pbXBsZW1lbnQgPSBmdW5jdGlvbihwcm90bywgbWl4aW4pIHsKICAgIGV4cG9ydHMubWl4aW4ocHJvdG8sIG1peGluKTsKfTsKCn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCiAKZGVmaW5lKCdhY2UvbW9kZS9jb2ZmZWVfd29ya2VyJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2Uvd29ya2VyL21pcnJvcicsICdhY2UvbW9kZS9jb2ZmZWUvY29mZmVlLXNjcmlwdCddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwogICAgCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBNaXJyb3IgPSByZXF1aXJlKCIuLi93b3JrZXIvbWlycm9yIikuTWlycm9yOwp2YXIgY29mZmVlID0gcmVxdWlyZSgiLi4vbW9kZS9jb2ZmZWUvY29mZmVlLXNjcmlwdCIpOwoKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbigpIHt9OwoKCnZhciBXb3JrZXIgPSBleHBvcnRzLldvcmtlciA9IGZ1bmN0aW9uKHNlbmRlcikgewogICAgTWlycm9yLmNhbGwodGhpcywgc2VuZGVyKTsKICAgIHRoaXMuc2V0VGltZW91dCgyMDApOwp9OwoKb29wLmluaGVyaXRzKFdvcmtlciwgTWlycm9yKTsKCihmdW5jdGlvbigpIHsKICAgIAogICAgdGhpcy5vblVwZGF0ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuZG9jLmdldFZhbHVlKCk7CiAgICAgICAgCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29mZmVlLnBhcnNlKHZhbHVlKTsKICAgICAgICB9IGNhdGNoKGUpIHsKICAgICAgICAgICAgdmFyIG0gPSBlLm1lc3NhZ2UubWF0Y2goL1BhcnNlIGVycm9yIG9uIGxpbmUgKFxkKyk6ICguKikvKTsKICAgICAgICAgICAgaWYgKG0pIHsKICAgICAgICAgICAgICAgIHRoaXMuc2VuZGVyLmVtaXQoImVycm9yIiwgewogICAgICAgICAgICAgICAgICAgIHJvdzogcGFyc2VJbnQobVsxXSkgLSAxLAogICAgICAgICAgICAgICAgICAgIGNvbHVtbjogbnVsbCwKICAgICAgICAgICAgICAgICAgICB0ZXh0OiBtWzJdLAogICAgICAgICAgICAgICAgICAgIHR5cGU6ICJlcnJvciIKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7CiAgICAgICAgICAgICAgICB2YXIgbSA9IGUubWVzc2FnZS5tYXRjaCgvIG9uIGxpbmUgKFxkKykvKTsKICAgICAgICAgICAgICAgIGlmIChtKSB7ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbmRlci5lbWl0KCJlcnJvciIsIHsKICAgICAgICAgICAgICAgICAgICAgICAgcm93OiBwYXJzZUludChtWzFdKSAtIDEsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogZS5tZXNzYWdlLnJlcGxhY2UobVswXSwgIiIpLAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAiZXJyb3IiCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLnNlbmRlci5lbWl0KCJvayIpOwogICAgfTsKICAgIAp9KS5jYWxsKFdvcmtlci5wcm90b3R5cGUpOwoKfSk7ZGVmaW5lKCdhY2Uvd29ya2VyL21pcnJvcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2RvY3VtZW50JywgJ2FjZS9saWIvbGFuZyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIERvY3VtZW50ID0gcmVxdWlyZSgiLi4vZG9jdW1lbnQiKS5Eb2N1bWVudDsKdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOwogICAgCnZhciBNaXJyb3IgPSBleHBvcnRzLk1pcnJvciA9IGZ1bmN0aW9uKHNlbmRlcikgewogICAgdGhpcy5zZW5kZXIgPSBzZW5kZXI7CiAgICB2YXIgZG9jID0gdGhpcy5kb2MgPSBuZXcgRG9jdW1lbnQoIiIpOwogICAgCiAgICB2YXIgZGVmZXJyZWRVcGRhdGUgPSB0aGlzLmRlZmVycmVkVXBkYXRlID0gbGFuZy5kZWZlcnJlZENhbGwodGhpcy5vblVwZGF0ZS5iaW5kKHRoaXMpKTsKICAgIAogICAgdmFyIF9zZWxmID0gdGhpczsKICAgIHNlbmRlci5vbigiY2hhbmdlIiwgZnVuY3Rpb24oZSkgewogICAgICAgIGRvYy5hcHBseURlbHRhcyhbZS5kYXRhXSk7ICAgICAgICAKICAgICAgICBkZWZlcnJlZFVwZGF0ZS5zY2hlZHVsZShfc2VsZi4kdGltZW91dCk7CiAgICB9KTsKfTsKCihmdW5jdGlvbigpIHsKICAgIAogICAgdGhpcy4kdGltZW91dCA9IDUwMDsKICAgIAogICAgdGhpcy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24odGltZW91dCkgewogICAgICAgIHRoaXMuJHRpbWVvdXQgPSB0aW1lb3V0OwogICAgfTsKICAgIAogICAgdGhpcy5zZXRWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgdGhpcy5kb2Muc2V0VmFsdWUodmFsdWUpOwogICAgICAgIHRoaXMuZGVmZXJyZWRVcGRhdGUuc2NoZWR1bGUodGhpcy4kdGltZW91dCk7CiAgICB9OwogICAgCiAgICB0aGlzLmdldFZhbHVlID0gZnVuY3Rpb24oY2FsbGJhY2tJZCkgewogICAgICAgIHRoaXMuc2VuZGVyLmNhbGxiYWNrKHRoaXMuZG9jLmdldFZhbHVlKCksIGNhbGxiYWNrSWQpOwogICAgfTsKICAgIAogICAgdGhpcy5vblVwZGF0ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIGFic3RyYWN0IG1ldGhvZAogICAgfTsKICAgIAp9KS5jYWxsKE1pcnJvci5wcm90b3R5cGUpOwoKfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvZG9jdW1lbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvZXZlbnRfZW1pdHRlcicsICdhY2UvcmFuZ2UnLCAnYWNlL2FuY2hvciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4vbGliL29vcCIpOwp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi9yYW5nZSIpLlJhbmdlOwp2YXIgQW5jaG9yID0gcmVxdWlyZSgiLi9hbmNob3IiKS5BbmNob3I7Cgp2YXIgRG9jdW1lbnQgPSBmdW5jdGlvbih0ZXh0KSB7CiAgICB0aGlzLiRsaW5lcyA9IFtdOwoKICAgIGlmIChBcnJheS5pc0FycmF5KHRleHQpKSB7CiAgICAgICAgdGhpcy5pbnNlcnRMaW5lcygwLCB0ZXh0KTsKICAgIH0KICAgIC8vIFRoZXJlIGhhcyB0byBiZSBvbmUgbGluZSBhdCBsZWFzdCBpbiB0aGUgZG9jdW1lbnQuIElmIHlvdSBwYXNzIGFuIGVtcHR5CiAgICAvLyBzdHJpbmcgdG8gdGhlIGluc2VydCBmdW5jdGlvbiwgbm90aGluZyB3aWxsIGhhcHBlbi4gV29ya2Fyb3VuZC4KICAgIGVsc2UgaWYgKHRleHQubGVuZ3RoID09IDApIHsKICAgICAgICB0aGlzLiRsaW5lcyA9IFsiIl07CiAgICB9IGVsc2UgewogICAgICAgIHRoaXMuaW5zZXJ0KHtyb3c6IDAsIGNvbHVtbjowfSwgdGV4dCk7CiAgICB9Cn07CgooZnVuY3Rpb24oKSB7CgogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOwoKICAgIHRoaXMuc2V0VmFsdWUgPSBmdW5jdGlvbih0ZXh0KSB7CiAgICAgICAgdmFyIGxlbiA9IHRoaXMuZ2V0TGVuZ3RoKCk7CiAgICAgICAgdGhpcy5yZW1vdmUobmV3IFJhbmdlKDAsIDAsIGxlbiwgdGhpcy5nZXRMaW5lKGxlbi0xKS5sZW5ndGgpKTsKICAgICAgICB0aGlzLmluc2VydCh7cm93OiAwLCBjb2x1bW46MH0sIHRleHQpOwogICAgfTsKCiAgICB0aGlzLmdldFZhbHVlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWxsTGluZXMoKS5qb2luKHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpKTsKICAgIH07CgogICAgdGhpcy5jcmVhdGVBbmNob3IgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIHJldHVybiBuZXcgQW5jaG9yKHRoaXMsIHJvdywgY29sdW1uKTsKICAgIH07CgogICAgLy8gY2hlY2sgZm9yIElFIHNwbGl0IGJ1ZwogICAgaWYgKCJhYWEiLnNwbGl0KC9hLykubGVuZ3RoID09IDApCiAgICAgICAgdGhpcy4kc3BsaXQgPSBmdW5jdGlvbih0ZXh0KSB7CiAgICAgICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL1xyXG58XHIvZywgIlxuIikuc3BsaXQoIlxuIik7CiAgICAgICAgfQogICAgZWxzZQogICAgICAgIHRoaXMuJHNwbGl0ID0gZnVuY3Rpb24odGV4dCkgewogICAgICAgICAgICByZXR1cm4gdGV4dC5zcGxpdCgvXHJcbnxccnxcbi8pOwogICAgICAgIH07CgoKICAgIHRoaXMuJGRldGVjdE5ld0xpbmUgPSBmdW5jdGlvbih0ZXh0KSB7CiAgICAgICAgdmFyIG1hdGNoID0gdGV4dC5tYXRjaCgvXi4qPyhcclxufFxyfFxuKS9tKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgdGhpcy4kYXV0b05ld0xpbmUgPSBtYXRjaFsxXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLiRhdXRvTmV3TGluZSA9ICJcbiI7CiAgICAgICAgfQogICAgfTsKCiAgICB0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIgPSBmdW5jdGlvbigpIHsKICAgICAgc3dpdGNoICh0aGlzLiRuZXdMaW5lTW9kZSkgewogICAgICAgICAgY2FzZSAid2luZG93cyI6CiAgICAgICAgICAgICAgcmV0dXJuICJcclxuIjsKCiAgICAgICAgICBjYXNlICJ1bml4IjoKICAgICAgICAgICAgICByZXR1cm4gIlxuIjsKCiAgICAgICAgICBjYXNlICJhdXRvIjoKICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kYXV0b05ld0xpbmU7CiAgICAgIH0KICAgIH07CgogICAgdGhpcy4kYXV0b05ld0xpbmUgPSAiXG4iOwogICAgdGhpcy4kbmV3TGluZU1vZGUgPSAiYXV0byI7CiAgICB0aGlzLnNldE5ld0xpbmVNb2RlID0gZnVuY3Rpb24obmV3TGluZU1vZGUpIHsKICAgICAgICBpZiAodGhpcy4kbmV3TGluZU1vZGUgPT09IG5ld0xpbmVNb2RlKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIHRoaXMuJG5ld0xpbmVNb2RlID0gbmV3TGluZU1vZGU7CiAgICB9OwoKICAgIHRoaXMuZ2V0TmV3TGluZU1vZGUgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy4kbmV3TGluZU1vZGU7CiAgICB9OwoKICAgIHRoaXMuaXNOZXdMaW5lID0gZnVuY3Rpb24odGV4dCkgewogICAgICAgIHJldHVybiAodGV4dCA9PSAiXHJcbiIgfHwgdGV4dCA9PSAiXHIiIHx8IHRleHQgPT0gIlxuIik7CiAgICB9OwoKICAgIC8qKgogICAgICogR2V0IGEgdmVyYmF0aW0gY29weSBvZiB0aGUgZ2l2ZW4gbGluZSBhcyBpdCBpcyBpbiB0aGUgZG9jdW1lbnQKICAgICAqLwogICAgdGhpcy5nZXRMaW5lID0gZnVuY3Rpb24ocm93KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJGxpbmVzW3Jvd10gfHwgIiI7CiAgICB9OwoKICAgIHRoaXMuZ2V0TGluZXMgPSBmdW5jdGlvbihmaXJzdFJvdywgbGFzdFJvdykgewogICAgICAgIHJldHVybiB0aGlzLiRsaW5lcy5zbGljZShmaXJzdFJvdywgbGFzdFJvdyArIDEpOwogICAgfTsKCiAgICAvKioKICAgICAqIFJldHVybnMgYWxsIGxpbmVzIGluIHRoZSBkb2N1bWVudCBhcyBzdHJpbmcgYXJyYXkuIFdhcm5pbmc6IFRoZSBjYWxsZXIKICAgICAqIHNob3VsZCBub3QgbW9kaWZ5IHRoaXMgYXJyYXkhCiAgICAgKi8KICAgIHRoaXMuZ2V0QWxsTGluZXMgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRMaW5lcygwLCB0aGlzLmdldExlbmd0aCgpKTsKICAgIH07CgogICAgdGhpcy5nZXRMZW5ndGggPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy4kbGluZXMubGVuZ3RoOwogICAgfTsKCiAgICB0aGlzLmdldFRleHRSYW5nZSA9IGZ1bmN0aW9uKHJhbmdlKSB7CiAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA9PSByYW5nZS5lbmQucm93KSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLiRsaW5lc1tyYW5nZS5zdGFydC5yb3ddLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4pOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdmFyIGxpbmVzID0gW107CiAgICAgICAgICAgIGxpbmVzLnB1c2godGhpcy4kbGluZXNbcmFuZ2Uuc3RhcnQucm93XS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uKSk7CiAgICAgICAgICAgIGxpbmVzLnB1c2guYXBwbHkobGluZXMsIHRoaXMuZ2V0TGluZXMocmFuZ2Uuc3RhcnQucm93KzEsIHJhbmdlLmVuZC5yb3ctMSkpOwogICAgICAgICAgICBsaW5lcy5wdXNoKHRoaXMuJGxpbmVzW3JhbmdlLmVuZC5yb3ddLnN1YnN0cmluZygwLCByYW5nZS5lbmQuY29sdW1uKSk7CiAgICAgICAgICAgIHJldHVybiBsaW5lcy5qb2luKHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpKTsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMuJGNsaXBQb3NpdGlvbiA9IGZ1bmN0aW9uKHBvc2l0aW9uKSB7CiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMuZ2V0TGVuZ3RoKCk7CiAgICAgICAgaWYgKHBvc2l0aW9uLnJvdyA+PSBsZW5ndGgpIHsKICAgICAgICAgICAgcG9zaXRpb24ucm93ID0gTWF0aC5tYXgoMCwgbGVuZ3RoIC0gMSk7CiAgICAgICAgICAgIHBvc2l0aW9uLmNvbHVtbiA9IHRoaXMuZ2V0TGluZShsZW5ndGgtMSkubGVuZ3RoOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcG9zaXRpb247CiAgICB9OwoKICAgIHRoaXMuaW5zZXJ0ID0gZnVuY3Rpb24ocG9zaXRpb24sIHRleHQpIHsKICAgICAgICBpZiAodGV4dC5sZW5ndGggPT0gMCkKICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uOwoKICAgICAgICBwb3NpdGlvbiA9IHRoaXMuJGNsaXBQb3NpdGlvbihwb3NpdGlvbik7CgogICAgICAgIGlmICh0aGlzLmdldExlbmd0aCgpIDw9IDEpCiAgICAgICAgICAgIHRoaXMuJGRldGVjdE5ld0xpbmUodGV4dCk7CgogICAgICAgIHZhciBsaW5lcyA9IHRoaXMuJHNwbGl0KHRleHQpOwogICAgICAgIHZhciBmaXJzdExpbmUgPSBsaW5lcy5zcGxpY2UoMCwgMSlbMF07CiAgICAgICAgdmFyIGxhc3RMaW5lID0gbGluZXMubGVuZ3RoID09IDAgPyBudWxsIDogbGluZXMuc3BsaWNlKGxpbmVzLmxlbmd0aCAtIDEsIDEpWzBdOwoKICAgICAgICBwb3NpdGlvbiA9IHRoaXMuaW5zZXJ0SW5MaW5lKHBvc2l0aW9uLCBmaXJzdExpbmUpOwogICAgICAgIGlmIChsYXN0TGluZSAhPT0gbnVsbCkgewogICAgICAgICAgICBwb3NpdGlvbiA9IHRoaXMuaW5zZXJ0TmV3TGluZShwb3NpdGlvbik7IC8vIHRlcm1pbmF0ZSBmaXJzdCBsaW5lCiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5pbnNlcnRMaW5lcyhwb3NpdGlvbi5yb3csIGxpbmVzKTsKICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLmluc2VydEluTGluZShwb3NpdGlvbiwgbGFzdExpbmUgfHwgIiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcG9zaXRpb247CiAgICB9OwoKICAgIHRoaXMuaW5zZXJ0TGluZXMgPSBmdW5jdGlvbihyb3csIGxpbmVzKSB7CiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA9PSAwKQogICAgICAgICAgICByZXR1cm4ge3Jvdzogcm93LCBjb2x1bW46IDB9OwoKICAgICAgICB2YXIgYXJncyA9IFtyb3csIDBdOwogICAgICAgIGFyZ3MucHVzaC5hcHBseShhcmdzLCBsaW5lcyk7CiAgICAgICAgdGhpcy4kbGluZXMuc3BsaWNlLmFwcGx5KHRoaXMuJGxpbmVzLCBhcmdzKTsKCiAgICAgICAgdmFyIHJhbmdlID0gbmV3IFJhbmdlKHJvdywgMCwgcm93ICsgbGluZXMubGVuZ3RoLCAwKTsKICAgICAgICB2YXIgZGVsdGEgPSB7CiAgICAgICAgICAgIGFjdGlvbjogImluc2VydExpbmVzIiwKICAgICAgICAgICAgcmFuZ2U6IHJhbmdlLAogICAgICAgICAgICBsaW5lczogbGluZXMKICAgICAgICB9OwogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7CiAgICAgICAgcmV0dXJuIHJhbmdlLmVuZDsKICAgIH07CgogICAgdGhpcy5pbnNlcnROZXdMaW5lID0gZnVuY3Rpb24ocG9zaXRpb24pIHsKICAgICAgICBwb3NpdGlvbiA9IHRoaXMuJGNsaXBQb3NpdGlvbihwb3NpdGlvbik7CiAgICAgICAgdmFyIGxpbmUgPSB0aGlzLiRsaW5lc1twb3NpdGlvbi5yb3ddIHx8ICIiOwoKICAgICAgICB0aGlzLiRsaW5lc1twb3NpdGlvbi5yb3ddID0gbGluZS5zdWJzdHJpbmcoMCwgcG9zaXRpb24uY29sdW1uKTsKICAgICAgICB0aGlzLiRsaW5lcy5zcGxpY2UocG9zaXRpb24ucm93ICsgMSwgMCwgbGluZS5zdWJzdHJpbmcocG9zaXRpb24uY29sdW1uLCBsaW5lLmxlbmd0aCkpOwoKICAgICAgICB2YXIgZW5kID0gewogICAgICAgICAgICByb3cgOiBwb3NpdGlvbi5yb3cgKyAxLAogICAgICAgICAgICBjb2x1bW4gOiAwCiAgICAgICAgfTsKCiAgICAgICAgdmFyIGRlbHRhID0gewogICAgICAgICAgICBhY3Rpb246ICJpbnNlcnRUZXh0IiwKICAgICAgICAgICAgcmFuZ2U6IFJhbmdlLmZyb21Qb2ludHMocG9zaXRpb24sIGVuZCksCiAgICAgICAgICAgIHRleHQ6IHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpCiAgICAgICAgfTsKICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2UiLCB7IGRhdGE6IGRlbHRhIH0pOwoKICAgICAgICByZXR1cm4gZW5kOwogICAgfTsKCiAgICB0aGlzLmluc2VydEluTGluZSA9IGZ1bmN0aW9uKHBvc2l0aW9uLCB0ZXh0KSB7CiAgICAgICAgaWYgKHRleHQubGVuZ3RoID09IDApCiAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsKCiAgICAgICAgdmFyIGxpbmUgPSB0aGlzLiRsaW5lc1twb3NpdGlvbi5yb3ddIHx8ICIiOwoKICAgICAgICB0aGlzLiRsaW5lc1twb3NpdGlvbi5yb3ddID0gbGluZS5zdWJzdHJpbmcoMCwgcG9zaXRpb24uY29sdW1uKSArIHRleHQKICAgICAgICAgICAgICAgICsgbGluZS5zdWJzdHJpbmcocG9zaXRpb24uY29sdW1uKTsKCiAgICAgICAgdmFyIGVuZCA9IHsKICAgICAgICAgICAgcm93IDogcG9zaXRpb24ucm93LAogICAgICAgICAgICBjb2x1bW4gOiBwb3NpdGlvbi5jb2x1bW4gKyB0ZXh0Lmxlbmd0aAogICAgICAgIH07CgogICAgICAgIHZhciBkZWx0YSA9IHsKICAgICAgICAgICAgYWN0aW9uOiAiaW5zZXJ0VGV4dCIsCiAgICAgICAgICAgIHJhbmdlOiBSYW5nZS5mcm9tUG9pbnRzKHBvc2l0aW9uLCBlbmQpLAogICAgICAgICAgICB0ZXh0OiB0ZXh0CiAgICAgICAgfTsKICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2UiLCB7IGRhdGE6IGRlbHRhIH0pOwoKICAgICAgICByZXR1cm4gZW5kOwogICAgfTsKCiAgICB0aGlzLnJlbW92ZSA9IGZ1bmN0aW9uKHJhbmdlKSB7CiAgICAgICAgLy8gY2xpcCB0byBkb2N1bWVudAogICAgICAgIHJhbmdlLnN0YXJ0ID0gdGhpcy4kY2xpcFBvc2l0aW9uKHJhbmdlLnN0YXJ0KTsKICAgICAgICByYW5nZS5lbmQgPSB0aGlzLiRjbGlwUG9zaXRpb24ocmFuZ2UuZW5kKTsKCiAgICAgICAgaWYgKHJhbmdlLmlzRW1wdHkoKSkKICAgICAgICAgICAgcmV0dXJuIHJhbmdlLnN0YXJ0OwoKICAgICAgICB2YXIgZmlyc3RSb3cgPSByYW5nZS5zdGFydC5yb3c7CiAgICAgICAgdmFyIGxhc3RSb3cgPSByYW5nZS5lbmQucm93OwoKICAgICAgICBpZiAocmFuZ2UuaXNNdWx0aUxpbmUoKSkgewogICAgICAgICAgICB2YXIgZmlyc3RGdWxsUm93ID0gcmFuZ2Uuc3RhcnQuY29sdW1uID09IDAgPyBmaXJzdFJvdyA6IGZpcnN0Um93ICsgMTsKICAgICAgICAgICAgdmFyIGxhc3RGdWxsUm93ID0gbGFzdFJvdyAtIDE7CgogICAgICAgICAgICBpZiAocmFuZ2UuZW5kLmNvbHVtbiA+IDApCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUluTGluZShsYXN0Um93LCAwLCByYW5nZS5lbmQuY29sdW1uKTsKCiAgICAgICAgICAgIGlmIChsYXN0RnVsbFJvdyA+PSBmaXJzdEZ1bGxSb3cpCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxpbmVzKGZpcnN0RnVsbFJvdywgbGFzdEZ1bGxSb3cpOwoKICAgICAgICAgICAgaWYgKGZpcnN0RnVsbFJvdyAhPSBmaXJzdFJvdykgewogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVJbkxpbmUoZmlyc3RSb3csIHJhbmdlLnN0YXJ0LmNvbHVtbiwgdGhpcy5nZXRMaW5lKGZpcnN0Um93KS5sZW5ndGgpOwogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVOZXdMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMucmVtb3ZlSW5MaW5lKGZpcnN0Um93LCByYW5nZS5zdGFydC5jb2x1bW4sIHJhbmdlLmVuZC5jb2x1bW4pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmFuZ2Uuc3RhcnQ7CiAgICB9OwoKICAgIHRoaXMucmVtb3ZlSW5MaW5lID0gZnVuY3Rpb24ocm93LCBzdGFydENvbHVtbiwgZW5kQ29sdW1uKSB7CiAgICAgICAgaWYgKHN0YXJ0Q29sdW1uID09IGVuZENvbHVtbikKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICB2YXIgcmFuZ2UgPSBuZXcgUmFuZ2Uocm93LCBzdGFydENvbHVtbiwgcm93LCBlbmRDb2x1bW4pOwogICAgICAgIHZhciBsaW5lID0gdGhpcy5nZXRMaW5lKHJvdyk7CiAgICAgICAgdmFyIHJlbW92ZWQgPSBsaW5lLnN1YnN0cmluZyhzdGFydENvbHVtbiwgZW5kQ29sdW1uKTsKICAgICAgICB2YXIgbmV3TGluZSA9IGxpbmUuc3Vic3RyaW5nKDAsIHN0YXJ0Q29sdW1uKSArIGxpbmUuc3Vic3RyaW5nKGVuZENvbHVtbiwgbGluZS5sZW5ndGgpOwogICAgICAgIHRoaXMuJGxpbmVzLnNwbGljZShyb3csIDEsIG5ld0xpbmUpOwoKICAgICAgICB2YXIgZGVsdGEgPSB7CiAgICAgICAgICAgIGFjdGlvbjogInJlbW92ZVRleHQiLAogICAgICAgICAgICByYW5nZTogcmFuZ2UsCiAgICAgICAgICAgIHRleHQ6IHJlbW92ZWQKICAgICAgICB9OwogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7CiAgICAgICAgcmV0dXJuIHJhbmdlLnN0YXJ0OwogICAgfTsKCiAgICAvKioKICAgICAqIFJlbW92ZXMgYSByYW5nZSBvZiBmdWxsIGxpbmVzCiAgICAgKgogICAgICogQHBhcmFtIGZpcnN0Um93IHtJbnRlZ2VyfSBUaGUgZmlyc3Qgcm93IHRvIGJlIHJlbW92ZWQKICAgICAqIEBwYXJhbSBsYXN0Um93IHtJbnRlZ2VyfSBUaGUgbGFzdCByb3cgdG8gYmUgcmVtb3ZlZAogICAgICogQHJldHVybiB7U3RyaW5nW119IFRoZSByZW1vdmVkIGxpbmVzCiAgICAgKi8KICAgIHRoaXMucmVtb3ZlTGluZXMgPSBmdW5jdGlvbihmaXJzdFJvdywgbGFzdFJvdykgewogICAgICAgIHZhciByYW5nZSA9IG5ldyBSYW5nZShmaXJzdFJvdywgMCwgbGFzdFJvdyArIDEsIDApOwogICAgICAgIHZhciByZW1vdmVkID0gdGhpcy4kbGluZXMuc3BsaWNlKGZpcnN0Um93LCBsYXN0Um93IC0gZmlyc3RSb3cgKyAxKTsKCiAgICAgICAgdmFyIGRlbHRhID0gewogICAgICAgICAgICBhY3Rpb246ICJyZW1vdmVMaW5lcyIsCiAgICAgICAgICAgIHJhbmdlOiByYW5nZSwKICAgICAgICAgICAgbmw6IHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpLAogICAgICAgICAgICBsaW5lczogcmVtb3ZlZAogICAgICAgIH07CiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgeyBkYXRhOiBkZWx0YSB9KTsKICAgICAgICByZXR1cm4gcmVtb3ZlZDsKICAgIH07CgogICAgdGhpcy5yZW1vdmVOZXdMaW5lID0gZnVuY3Rpb24ocm93KSB7CiAgICAgICAgdmFyIGZpcnN0TGluZSA9IHRoaXMuZ2V0TGluZShyb3cpOwogICAgICAgIHZhciBzZWNvbmRMaW5lID0gdGhpcy5nZXRMaW5lKHJvdysxKTsKCiAgICAgICAgdmFyIHJhbmdlID0gbmV3IFJhbmdlKHJvdywgZmlyc3RMaW5lLmxlbmd0aCwgcm93KzEsIDApOwogICAgICAgIHZhciBsaW5lID0gZmlyc3RMaW5lICsgc2Vjb25kTGluZTsKCiAgICAgICAgdGhpcy4kbGluZXMuc3BsaWNlKHJvdywgMiwgbGluZSk7CgogICAgICAgIHZhciBkZWx0YSA9IHsKICAgICAgICAgICAgYWN0aW9uOiAicmVtb3ZlVGV4dCIsCiAgICAgICAgICAgIHJhbmdlOiByYW5nZSwKICAgICAgICAgICAgdGV4dDogdGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkKICAgICAgICB9OwogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7CiAgICB9OwoKICAgIHRoaXMucmVwbGFjZSA9IGZ1bmN0aW9uKHJhbmdlLCB0ZXh0KSB7CiAgICAgICAgaWYgKHRleHQubGVuZ3RoID09IDAgJiYgcmFuZ2UuaXNFbXB0eSgpKQogICAgICAgICAgICByZXR1cm4gcmFuZ2Uuc3RhcnQ7CgogICAgICAgIC8vIFNob3J0Y3V0OiBJZiB0aGUgdGV4dCB3ZSB3YW50IHRvIGluc2VydCBpcyB0aGUgc2FtZSBhcyBpdCBpcyBhbHJlYWR5CiAgICAgICAgLy8gaW4gdGhlIGRvY3VtZW50LCB3ZSBkb24ndCBoYXZlIHRvIHJlcGxhY2UgYW55dGhpbmcuCiAgICAgICAgaWYgKHRleHQgPT0gdGhpcy5nZXRUZXh0UmFuZ2UocmFuZ2UpKQogICAgICAgICAgICByZXR1cm4gcmFuZ2UuZW5kOwoKICAgICAgICB0aGlzLnJlbW92ZShyYW5nZSk7CiAgICAgICAgaWYgKHRleHQpIHsKICAgICAgICAgICAgdmFyIGVuZCA9IHRoaXMuaW5zZXJ0KHJhbmdlLnN0YXJ0LCB0ZXh0KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGVuZCA9IHJhbmdlLnN0YXJ0OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGVuZDsKICAgIH07CgogICAgdGhpcy5hcHBseURlbHRhcyA9IGZ1bmN0aW9uKGRlbHRhcykgewogICAgICAgIGZvciAodmFyIGk9MDsgaTxkZWx0YXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGRlbHRhID0gZGVsdGFzW2ldOwogICAgICAgICAgICB2YXIgcmFuZ2UgPSBSYW5nZS5mcm9tUG9pbnRzKGRlbHRhLnJhbmdlLnN0YXJ0LCBkZWx0YS5yYW5nZS5lbmQpOwoKICAgICAgICAgICAgaWYgKGRlbHRhLmFjdGlvbiA9PSAiaW5zZXJ0TGluZXMiKQogICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRMaW5lcyhyYW5nZS5zdGFydC5yb3csIGRlbHRhLmxpbmVzKTsKICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJpbnNlcnRUZXh0IikKICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0KHJhbmdlLnN0YXJ0LCBkZWx0YS50ZXh0KTsKICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJyZW1vdmVMaW5lcyIpCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxpbmVzKHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2UuZW5kLnJvdyAtIDEpOwogICAgICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZVRleHQiKQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUocmFuZ2UpOwogICAgICAgIH0KICAgIH07CgogICAgdGhpcy5yZXZlcnREZWx0YXMgPSBmdW5jdGlvbihkZWx0YXMpIHsKICAgICAgICBmb3IgKHZhciBpPWRlbHRhcy5sZW5ndGgtMTsgaT49MDsgaS0tKSB7CiAgICAgICAgICAgIHZhciBkZWx0YSA9IGRlbHRhc1tpXTsKCiAgICAgICAgICAgIHZhciByYW5nZSA9IFJhbmdlLmZyb21Qb2ludHMoZGVsdGEucmFuZ2Uuc3RhcnQsIGRlbHRhLnJhbmdlLmVuZCk7CgogICAgICAgICAgICBpZiAoZGVsdGEuYWN0aW9uID09ICJpbnNlcnRMaW5lcyIpCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxpbmVzKHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2UuZW5kLnJvdyAtIDEpOwogICAgICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gImluc2VydFRleHQiKQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUocmFuZ2UpOwogICAgICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZUxpbmVzIikKICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0TGluZXMocmFuZ2Uuc3RhcnQucm93LCBkZWx0YS5saW5lcyk7CiAgICAgICAgICAgIGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAicmVtb3ZlVGV4dCIpCiAgICAgICAgICAgICAgICB0aGlzLmluc2VydChyYW5nZS5zdGFydCwgZGVsdGEudGV4dCk7CiAgICAgICAgfQogICAgfTsKCn0pLmNhbGwoRG9jdW1lbnQucHJvdG90eXBlKTsKCmV4cG9ydHMuRG9jdW1lbnQgPSBEb2N1bWVudDsKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL3JhbmdlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIFJhbmdlID0gZnVuY3Rpb24oc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbikgewogICAgdGhpcy5zdGFydCA9IHsKICAgICAgICByb3c6IHN0YXJ0Um93LAogICAgICAgIGNvbHVtbjogc3RhcnRDb2x1bW4KICAgIH07CgogICAgdGhpcy5lbmQgPSB7CiAgICAgICAgcm93OiBlbmRSb3csCiAgICAgICAgY29sdW1uOiBlbmRDb2x1bW4KICAgIH07Cn07CgooZnVuY3Rpb24oKSB7CiAgICB0aGlzLmlzRWVxdWFsID0gZnVuY3Rpb24ocmFuZ2UpIHsKICAgICAgICByZXR1cm4gdGhpcy5zdGFydC5yb3cgPT0gcmFuZ2Uuc3RhcnQucm93ICYmCiAgICAgICAgICAgIHRoaXMuZW5kLnJvdyA9PSByYW5nZS5lbmQucm93ICYmCiAgICAgICAgICAgIHRoaXMuc3RhcnQuY29sdW1uID09IHJhbmdlLnN0YXJ0LmNvbHVtbiAmJgogICAgICAgICAgICB0aGlzLmVuZC5jb2x1bW4gPT0gcmFuZ2UuZW5kLmNvbHVtbgogICAgfTsKCiAgICB0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuICgiUmFuZ2U6IFsiICsgdGhpcy5zdGFydC5yb3cgKyAiLyIgKyB0aGlzLnN0YXJ0LmNvbHVtbiArCiAgICAgICAgICAgICJdIC0+IFsiICsgdGhpcy5lbmQucm93ICsgIi8iICsgdGhpcy5lbmQuY29sdW1uICsgIl0iKTsKICAgIH07CgogICAgdGhpcy5jb250YWlucyA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbikgPT0gMDsKICAgIH07CgogICAgLyoqCiAgICAgKiBDb21wYXJlcyB0aGlzIHJhbmdlIChBKSB3aXRoIGFub3RoZXIgcmFuZ2UgKEIpLCB3aGVyZSBCIGlzIHRoZSBwYXNzZWQgaW4KICAgICAqIHJhbmdlLgogICAgICoKICAgICAqIFJldHVybiB2YWx1ZXM6CiAgICAgKiAgLTI6IChCKSBpcyBpbmZyb250IG9mIChBKSBhbmQgZG9lc24ndCBpbnRlcnNlY3Qgd2l0aCAoQSkKICAgICAqICAtMTogKEIpIGJlZ2lucyBiZWZvcmUgKEEpIGJ1dCBlbmRzIGluc2lkZSBvZiAoQSkKICAgICAqICAgMDogKEIpIGlzIGNvbXBsZXRseSBpbnNpZGUgb2YgKEEpIE9SIChBKSBpcyBjb21wbGV0eSBpbnNpZGUgb2YgKEIpCiAgICAgKiAgKzE6IChCKSBiZWdpbnMgaW5zaWRlIG9mIChBKSBidXQgZW5kcyBvdXRzaWRlIG9mIChBKQogICAgICogICsyOiAoQikgaXMgYWZ0ZXIgKEEpIGFuZCBkb2Vzbid0IGludGVyc2VjdCB3aXRoIChBKQogICAgICoKICAgICAqICA0MjogRlRXIHN0YXRlOiAoQikgZW5kcyBpbiAoQSkgYnV0IHN0YXJ0cyBvdXRzaWRlIG9mIChBKQogICAgICovCiAgICB0aGlzLmNvbXBhcmVSYW5nZSA9IGZ1bmN0aW9uKHJhbmdlKSB7CiAgICAgICAgdmFyIGNtcCwKICAgICAgICAgICAgZW5kID0gcmFuZ2UuZW5kLAogICAgICAgICAgICBzdGFydCA9IHJhbmdlLnN0YXJ0OwoKICAgICAgICBjbXAgPSB0aGlzLmNvbXBhcmUoZW5kLnJvdywgZW5kLmNvbHVtbik7CiAgICAgICAgaWYgKGNtcCA9PSAxKSB7CiAgICAgICAgICAgIGNtcCA9IHRoaXMuY29tcGFyZShzdGFydC5yb3csIHN0YXJ0LmNvbHVtbik7CiAgICAgICAgICAgIGlmIChjbXAgPT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoY21wID09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGNtcCA9PSAtMSkgewogICAgICAgICAgICByZXR1cm4gLTI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY21wID0gdGhpcy5jb21wYXJlKHN0YXJ0LnJvdywgc3RhcnQuY29sdW1uKTsKICAgICAgICAgICAgaWYgKGNtcCA9PSAtMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9IGVsc2UgaWYgKGNtcCA9PSAxKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gNDI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICB0aGlzLmNvbXBhcmVQb2ludCA9IGZ1bmN0aW9uKHApIHsKICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlKHAucm93LCBwLmNvbHVtbik7CiAgICB9CgogICAgdGhpcy5jb250YWluc1JhbmdlID0gZnVuY3Rpb24ocmFuZ2UpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlUG9pbnQocmFuZ2Uuc3RhcnQpID09IDAgJiYgdGhpcy5jb21wYXJlUG9pbnQocmFuZ2UuZW5kKSA9PSAwOwogICAgfQoKICAgIHRoaXMuaXNFbmQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIHJldHVybiB0aGlzLmVuZC5yb3cgPT0gcm93ICYmIHRoaXMuZW5kLmNvbHVtbiA9PSBjb2x1bW47CiAgICB9CgogICAgdGhpcy5pc1N0YXJ0ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsKICAgICAgICByZXR1cm4gdGhpcy5zdGFydC5yb3cgPT0gcm93ICYmIHRoaXMuc3RhcnQuY29sdW1uID09IGNvbHVtbjsKICAgIH0KCiAgICB0aGlzLnNldFN0YXJ0ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsKICAgICAgICBpZiAodHlwZW9mIHJvdyA9PSAib2JqZWN0IikgewogICAgICAgICAgICB0aGlzLnN0YXJ0LmNvbHVtbiA9IHJvdy5jb2x1bW47CiAgICAgICAgICAgIHRoaXMuc3RhcnQucm93ID0gcm93LnJvdzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLnN0YXJ0LnJvdyA9IHJvdzsKICAgICAgICAgICAgdGhpcy5zdGFydC5jb2x1bW4gPSBjb2x1bW47CiAgICAgICAgfQogICAgfQoKICAgIHRoaXMuc2V0RW5kID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsKICAgICAgICBpZiAodHlwZW9mIHJvdyA9PSAib2JqZWN0IikgewogICAgICAgICAgICB0aGlzLmVuZC5jb2x1bW4gPSByb3cuY29sdW1uOwogICAgICAgICAgICB0aGlzLmVuZC5yb3cgPSByb3cucm93OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMuZW5kLnJvdyA9IHJvdzsKICAgICAgICAgICAgdGhpcy5lbmQuY29sdW1uID0gY29sdW1uOwogICAgICAgIH0KICAgIH0KCiAgICB0aGlzLmluc2lkZSA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7CiAgICAgICAgaWYgKHRoaXMuY29tcGFyZShyb3csIGNvbHVtbikgPT0gMCkgewogICAgICAgICAgICBpZiAodGhpcy5pc0VuZChyb3csIGNvbHVtbikgfHwgdGhpcy5pc1N0YXJ0KHJvdywgY29sdW1uKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHRoaXMuaW5zaWRlU3RhcnQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIGlmICh0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pID09IDApIHsKICAgICAgICAgICAgaWYgKHRoaXMuaXNFbmQocm93LCBjb2x1bW4pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgdGhpcy5pbnNpZGVFbmQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIGlmICh0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pID09IDApIHsKICAgICAgICAgICAgaWYgKHRoaXMuaXNTdGFydChyb3csIGNvbHVtbikpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICB0aGlzLmNvbXBhcmUgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIGlmICghdGhpcy5pc011bHRpTGluZSgpKSB7CiAgICAgICAgICAgIGlmIChyb3cgPT09IHRoaXMuc3RhcnQucm93KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uIDwgdGhpcy5zdGFydC5jb2x1bW4gPyAtMSA6IChjb2x1bW4gPiB0aGlzLmVuZC5jb2x1bW4gPyAxIDogMCk7CiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBpZiAocm93IDwgdGhpcy5zdGFydC5yb3cpCiAgICAgICAgICAgIHJldHVybiAtMTsKCiAgICAgICAgaWYgKHJvdyA+IHRoaXMuZW5kLnJvdykKICAgICAgICAgICAgcmV0dXJuIDE7CgogICAgICAgIGlmICh0aGlzLnN0YXJ0LnJvdyA9PT0gcm93KQogICAgICAgICAgICByZXR1cm4gY29sdW1uID49IHRoaXMuc3RhcnQuY29sdW1uID8gMCA6IC0xOwoKICAgICAgICBpZiAodGhpcy5lbmQucm93ID09PSByb3cpCiAgICAgICAgICAgIHJldHVybiBjb2x1bW4gPD0gdGhpcy5lbmQuY29sdW1uID8gMCA6IDE7CgogICAgICAgIHJldHVybiAwOwogICAgfTsKCiAgICAvKioKICAgICAqIExpa2UgLmNvbXBhcmUoKSwgYnV0IGlmIGlzU3RhcnQgaXMgdHJ1ZSwgcmV0dXJuIC0xOwogICAgICovCiAgICB0aGlzLmNvbXBhcmVTdGFydCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7CiAgICAgICAgaWYgKHRoaXMuc3RhcnQucm93ID09IHJvdyAmJiB0aGlzLnN0YXJ0LmNvbHVtbiA9PSBjb2x1bW4pIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIExpa2UgLmNvbXBhcmUoKSwgYnV0IGlmIGlzRW5kIGlzIHRydWUsIHJldHVybiAxOwogICAgICovCiAgICB0aGlzLmNvbXBhcmVFbmQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIGlmICh0aGlzLmVuZC5yb3cgPT0gcm93ICYmIHRoaXMuZW5kLmNvbHVtbiA9PSBjb2x1bW4pIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbik7CiAgICAgICAgfQogICAgfQoKICAgIHRoaXMuY29tcGFyZUluc2lkZSA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7CiAgICAgICAgaWYgKHRoaXMuZW5kLnJvdyA9PSByb3cgJiYgdGhpcy5lbmQuY29sdW1uID09IGNvbHVtbikgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhcnQucm93ID09IHJvdyAmJiB0aGlzLnN0YXJ0LmNvbHVtbiA9PSBjb2x1bW4pIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pOwogICAgICAgIH0KICAgIH0KCiAgICB0aGlzLmNsaXBSb3dzID0gZnVuY3Rpb24oZmlyc3RSb3csIGxhc3RSb3cpIHsKICAgICAgICBpZiAodGhpcy5lbmQucm93ID4gbGFzdFJvdykgewogICAgICAgICAgICB2YXIgZW5kID0gewogICAgICAgICAgICAgICAgcm93OiBsYXN0Um93KzEsCiAgICAgICAgICAgICAgICBjb2x1bW46IDAKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIGlmICh0aGlzLnN0YXJ0LnJvdyA+IGxhc3RSb3cpIHsKICAgICAgICAgICAgdmFyIHN0YXJ0ID0gewogICAgICAgICAgICAgICAgcm93OiBsYXN0Um93KzEsCiAgICAgICAgICAgICAgICBjb2x1bW46IDAKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIGlmICh0aGlzLnN0YXJ0LnJvdyA8IGZpcnN0Um93KSB7CiAgICAgICAgICAgIHZhciBzdGFydCA9IHsKICAgICAgICAgICAgICAgIHJvdzogZmlyc3RSb3csCiAgICAgICAgICAgICAgICBjb2x1bW46IDAKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIGlmICh0aGlzLmVuZC5yb3cgPCBmaXJzdFJvdykgewogICAgICAgICAgICB2YXIgZW5kID0gewogICAgICAgICAgICAgICAgcm93OiBmaXJzdFJvdywKICAgICAgICAgICAgICAgIGNvbHVtbjogMAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyhzdGFydCB8fCB0aGlzLnN0YXJ0LCBlbmQgfHwgdGhpcy5lbmQpOwogICAgfTsKCiAgICB0aGlzLmV4dGVuZCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7CiAgICAgICAgdmFyIGNtcCA9IHRoaXMuY29tcGFyZShyb3csIGNvbHVtbik7CgogICAgICAgIGlmIChjbXAgPT0gMCkKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgZWxzZSBpZiAoY21wID09IC0xKQogICAgICAgICAgICB2YXIgc3RhcnQgPSB7cm93OiByb3csIGNvbHVtbjogY29sdW1ufTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiByb3csIGNvbHVtbjogY29sdW1ufTsKCiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQgfHwgdGhpcy5zdGFydCwgZW5kIHx8IHRoaXMuZW5kKTsKICAgIH07CgogICAgdGhpcy5pc0VtcHR5ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuICh0aGlzLnN0YXJ0LnJvdyA9PSB0aGlzLmVuZC5yb3cgJiYgdGhpcy5zdGFydC5jb2x1bW4gPT0gdGhpcy5lbmQuY29sdW1uKTsKICAgIH07CgogICAgdGhpcy5pc011bHRpTGluZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAodGhpcy5zdGFydC5yb3cgIT09IHRoaXMuZW5kLnJvdyk7CiAgICB9OwoKICAgIHRoaXMuY2xvbmUgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyh0aGlzLnN0YXJ0LCB0aGlzLmVuZCk7CiAgICB9OwoKICAgIHRoaXMuY29sbGFwc2VSb3dzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuZW5kLmNvbHVtbiA9PSAwKQogICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHRoaXMuc3RhcnQucm93LCAwLCBNYXRoLm1heCh0aGlzLnN0YXJ0LnJvdywgdGhpcy5lbmQucm93LTEpLCAwKQogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZSh0aGlzLnN0YXJ0LnJvdywgMCwgdGhpcy5lbmQucm93LCAwKQogICAgfTsKCiAgICB0aGlzLnRvU2NyZWVuUmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uKSB7CiAgICAgICAgdmFyIHNjcmVlblBvc1N0YXJ0ID0KICAgICAgICAgICAgc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24odGhpcy5zdGFydCk7CiAgICAgICAgdmFyIHNjcmVlblBvc0VuZCA9CiAgICAgICAgICAgIHNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHRoaXMuZW5kKTsKCiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZSgKICAgICAgICAgICAgc2NyZWVuUG9zU3RhcnQucm93LCBzY3JlZW5Qb3NTdGFydC5jb2x1bW4sCiAgICAgICAgICAgIHNjcmVlblBvc0VuZC5yb3csIHNjcmVlblBvc0VuZC5jb2x1bW4KICAgICAgICApOwogICAgfTsKCn0pLmNhbGwoUmFuZ2UucHJvdG90eXBlKTsKCgpSYW5nZS5mcm9tUG9pbnRzID0gZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgcmV0dXJuIG5ldyBSYW5nZShzdGFydC5yb3csIHN0YXJ0LmNvbHVtbiwgZW5kLnJvdywgZW5kLmNvbHVtbik7Cn07CgpleHBvcnRzLlJhbmdlID0gUmFuZ2U7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9hbmNob3InLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvZXZlbnRfZW1pdHRlciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4vbGliL29vcCIpOwp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsKCi8qKgogKiBBbiBBbmNob3IgaXMgYSBmbG9hdGluZyBwb2ludGVyIGluIHRoZSBkb2N1bWVudC4gV2hlbmV2ZXIgdGV4dCBpcyBpbnNlcnRlZCBvcgogKiBkZWxldGVkIGJlZm9yZSB0aGUgY3Vyc29yLCB0aGUgcG9zaXRpb24gb2YgdGhlIGN1cnNvciBpcyB1cGRhdGVkCiAqLwp2YXIgQW5jaG9yID0gZXhwb3J0cy5BbmNob3IgPSBmdW5jdGlvbihkb2MsIHJvdywgY29sdW1uKSB7CiAgICB0aGlzLmRvY3VtZW50ID0gZG9jOwogICAgCiAgICBpZiAodHlwZW9mIGNvbHVtbiA9PSAidW5kZWZpbmVkIikKICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHJvdy5yb3csIHJvdy5jb2x1bW4pOwogICAgZWxzZQogICAgICAgIHRoaXMuc2V0UG9zaXRpb24ocm93LCBjb2x1bW4pOwoKICAgIHRoaXMuJG9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpOwogICAgZG9jLm9uKCJjaGFuZ2UiLCB0aGlzLiRvbkNoYW5nZSk7Cn07CgooZnVuY3Rpb24oKSB7CgogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOwogICAgCiAgICB0aGlzLmdldFBvc2l0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQodGhpcy5yb3csIHRoaXMuY29sdW1uKTsKICAgIH07CiAgICAKICAgIHRoaXMuZ2V0RG9jdW1lbnQgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudDsKICAgIH07CiAgICAKICAgIHRoaXMub25DaGFuZ2UgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgdmFyIGRlbHRhID0gZS5kYXRhOwogICAgICAgIHZhciByYW5nZSA9IGRlbHRhLnJhbmdlOwogICAgICAgICAgICAKICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09IHJhbmdlLmVuZC5yb3cgJiYgcmFuZ2Uuc3RhcnQucm93ICE9IHRoaXMucm93KQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIAogICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPiB0aGlzLnJvdykKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAKICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09IHRoaXMucm93ICYmIHJhbmdlLnN0YXJ0LmNvbHVtbiA+IHRoaXMuY29sdW1uKQogICAgICAgICAgICByZXR1cm47CiAgICAKICAgICAgICB2YXIgcm93ID0gdGhpcy5yb3c7CiAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMuY29sdW1uOwogICAgICAgIAogICAgICAgIGlmIChkZWx0YS5hY3Rpb24gPT09ICJpbnNlcnRUZXh0IikgewogICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09PSByb3cgJiYgcmFuZ2Uuc3RhcnQuY29sdW1uIDw9IGNvbHVtbikgewogICAgICAgICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA9PT0gcmFuZ2UuZW5kLnJvdykgewogICAgICAgICAgICAgICAgICAgIGNvbHVtbiArPSByYW5nZS5lbmQuY29sdW1uIC0gcmFuZ2Uuc3RhcnQuY29sdW1uOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY29sdW1uIC09IHJhbmdlLnN0YXJ0LmNvbHVtbjsKICAgICAgICAgICAgICAgICAgICByb3cgKz0gcmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChyYW5nZS5zdGFydC5yb3cgIT09IHJhbmdlLmVuZC5yb3cgJiYgcmFuZ2Uuc3RhcnQucm93IDwgcm93KSB7CiAgICAgICAgICAgICAgICByb3cgKz0gcmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdzsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09PSAiaW5zZXJ0TGluZXMiKSB7CiAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPD0gcm93KSB7CiAgICAgICAgICAgICAgICByb3cgKz0gcmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZVRleHQiKSB7CiAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT0gcm93ICYmIHJhbmdlLnN0YXJ0LmNvbHVtbiA8IGNvbHVtbikgewogICAgICAgICAgICAgICAgaWYgKHJhbmdlLmVuZC5jb2x1bW4gPj0gY29sdW1uKQogICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IHJhbmdlLnN0YXJ0LmNvbHVtbjsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSBNYXRoLm1heCgwLCBjb2x1bW4gLSAocmFuZ2UuZW5kLmNvbHVtbiAtIHJhbmdlLnN0YXJ0LmNvbHVtbikpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0gZWxzZSBpZiAocmFuZ2Uuc3RhcnQucm93ICE9PSByYW5nZS5lbmQucm93ICYmIHJhbmdlLnN0YXJ0LnJvdyA8IHJvdykgewogICAgICAgICAgICAgICAgaWYgKHJhbmdlLmVuZC5yb3cgPT0gcm93KSB7CiAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gTWF0aC5tYXgoMCwgY29sdW1uIC0gcmFuZ2UuZW5kLmNvbHVtbikgKyByYW5nZS5zdGFydC5jb2x1bW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByb3cgLT0gKHJhbmdlLmVuZC5yb3cgLSByYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHJhbmdlLmVuZC5yb3cgPT0gcm93KSB7CiAgICAgICAgICAgICAgICByb3cgLT0gcmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdzsKICAgICAgICAgICAgICAgIGNvbHVtbiA9IE1hdGgubWF4KDAsIGNvbHVtbiAtIHJhbmdlLmVuZC5jb2x1bW4pICsgcmFuZ2Uuc3RhcnQuY29sdW1uOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZUxpbmVzIikgewogICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93IDw9IHJvdykgewogICAgICAgICAgICAgICAgaWYgKHJhbmdlLmVuZC5yb3cgPD0gcm93KQogICAgICAgICAgICAgICAgICAgIHJvdyAtPSByYW5nZS5lbmQucm93IC0gcmFuZ2Uuc3RhcnQucm93OwogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcm93ID0gcmFuZ2Uuc3RhcnQucm93OwogICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRoaXMuc2V0UG9zaXRpb24ocm93LCBjb2x1bW4sIHRydWUpOwogICAgfTsKCiAgICB0aGlzLnNldFBvc2l0aW9uID0gZnVuY3Rpb24ocm93LCBjb2x1bW4sIG5vQ2xpcCkgewogICAgICAgIHZhciBwb3M7CiAgICAgICAgaWYgKG5vQ2xpcCkgewogICAgICAgICAgICBwb3MgPSB7CiAgICAgICAgICAgICAgICByb3c6IHJvdywKICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwb3MgPSB0aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50KHJvdywgY29sdW1uKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKHRoaXMucm93ID09IHBvcy5yb3cgJiYgdGhpcy5jb2x1bW4gPT0gcG9zLmNvbHVtbikKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAKICAgICAgICB2YXIgb2xkID0gewogICAgICAgICAgICByb3c6IHRoaXMucm93LAogICAgICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uCiAgICAgICAgfTsKICAgICAgICAKICAgICAgICB0aGlzLnJvdyA9IHBvcy5yb3c7CiAgICAgICAgdGhpcy5jb2x1bW4gPSBwb3MuY29sdW1uOwogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsKICAgICAgICAgICAgb2xkOiBvbGQsCiAgICAgICAgICAgIHZhbHVlOiBwb3MKICAgICAgICB9KTsKICAgIH07CiAgICAKICAgIHRoaXMuZGV0YWNoID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCB0aGlzLiRvbkNoYW5nZSk7CiAgICB9OwogICAgCiAgICB0aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsKICAgICAgICB2YXIgcG9zID0ge307CiAgICAKICAgICAgICBpZiAocm93ID49IHRoaXMuZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsKICAgICAgICAgICAgcG9zLnJvdyA9IE1hdGgubWF4KDAsIHRoaXMuZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgLSAxKTsKICAgICAgICAgICAgcG9zLmNvbHVtbiA9IHRoaXMuZG9jdW1lbnQuZ2V0TGluZShwb3Mucm93KS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHJvdyA8IDApIHsKICAgICAgICAgICAgcG9zLnJvdyA9IDA7CiAgICAgICAgICAgIHBvcy5jb2x1bW4gPSAwOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcG9zLnJvdyA9IHJvdzsKICAgICAgICAgICAgcG9zLmNvbHVtbiA9IE1hdGgubWluKHRoaXMuZG9jdW1lbnQuZ2V0TGluZShwb3Mucm93KS5sZW5ndGgsIE1hdGgubWF4KDAsIGNvbHVtbikpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoY29sdW1uIDwgMCkKICAgICAgICAgICAgcG9zLmNvbHVtbiA9IDA7CiAgICAgICAgICAgIAogICAgICAgIHJldHVybiBwb3M7CiAgICB9OwogICAgCn0pLmNhbGwoQW5jaG9yLnByb3RvdHlwZSk7Cgp9KTsKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbGliL2xhbmcnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7CgpleHBvcnRzLnN0cmluZ1JldmVyc2UgPSBmdW5jdGlvbihzdHJpbmcpIHsKICAgIHJldHVybiBzdHJpbmcuc3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKTsKfTsKCmV4cG9ydHMuc3RyaW5nUmVwZWF0ID0gZnVuY3Rpb24gKHN0cmluZywgY291bnQpIHsKICAgICByZXR1cm4gbmV3IEFycmF5KGNvdW50ICsgMSkuam9pbihzdHJpbmcpOwp9OwoKdmFyIHRyaW1CZWdpblJlZ2V4cCA9IC9eXHNccyovOwp2YXIgdHJpbUVuZFJlZ2V4cCA9IC9cc1xzKiQvOwoKZXhwb3J0cy5zdHJpbmdUcmltTGVmdCA9IGZ1bmN0aW9uIChzdHJpbmcpIHsKICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSh0cmltQmVnaW5SZWdleHAsICcnKTsKfTsKCmV4cG9ydHMuc3RyaW5nVHJpbVJpZ2h0ID0gZnVuY3Rpb24gKHN0cmluZykgewogICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHRyaW1FbmRSZWdleHAsICcnKTsKfTsKCmV4cG9ydHMuY29weU9iamVjdCA9IGZ1bmN0aW9uKG9iaikgewogICAgdmFyIGNvcHkgPSB7fTsKICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKICAgICAgICBjb3B5W2tleV0gPSBvYmpba2V5XTsKICAgIH0KICAgIHJldHVybiBjb3B5Owp9OwoKZXhwb3J0cy5jb3B5QXJyYXkgPSBmdW5jdGlvbihhcnJheSl7CiAgICB2YXIgY29weSA9IFtdOwogICAgZm9yICh2YXIgaT0wLCBsPWFycmF5Lmxlbmd0aDsgaTxsOyBpKyspIHsKICAgICAgICBpZiAoYXJyYXlbaV0gJiYgdHlwZW9mIGFycmF5W2ldID09ICJvYmplY3QiKQogICAgICAgICAgICBjb3B5W2ldID0gdGhpcy5jb3B5T2JqZWN0KCBhcnJheVtpXSApOwogICAgICAgIGVsc2UgCiAgICAgICAgICAgIGNvcHlbaV0gPSBhcnJheVtpXTsKICAgIH0KICAgIHJldHVybiBjb3B5Owp9OwoKZXhwb3J0cy5kZWVwQ29weSA9IGZ1bmN0aW9uIChvYmopIHsKICAgIGlmICh0eXBlb2Ygb2JqICE9ICJvYmplY3QiKSB7CiAgICAgICAgcmV0dXJuIG9iajsKICAgIH0KICAgIAogICAgdmFyIGNvcHkgPSBvYmouY29uc3RydWN0b3IoKTsKICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKICAgICAgICBpZiAodHlwZW9mIG9ialtrZXldID09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIGNvcHlba2V5XSA9IHRoaXMuZGVlcENvcHkob2JqW2tleV0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvcHlba2V5XSA9IG9ialtrZXldOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBjb3B5Owp9OwoKZXhwb3J0cy5hcnJheVRvTWFwID0gZnVuY3Rpb24oYXJyKSB7CiAgICB2YXIgbWFwID0ge307CiAgICBmb3IgKHZhciBpPTA7IGk8YXJyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbWFwW2FycltpXV0gPSAxOwogICAgfQogICAgcmV0dXJuIG1hcDsKCn07CgovKioKICogc3BsaWNlIG91dCBvZiAnYXJyYXknIGFueXRoaW5nIHRoYXQgPT09ICd2YWx1ZScKICovCmV4cG9ydHMuYXJyYXlSZW1vdmUgPSBmdW5jdGlvbihhcnJheSwgdmFsdWUpIHsKICBmb3IgKHZhciBpID0gMDsgaSA8PSBhcnJheS5sZW5ndGg7IGkrKykgewogICAgaWYgKHZhbHVlID09PSBhcnJheVtpXSkgewogICAgICBhcnJheS5zcGxpY2UoaSwgMSk7CiAgICB9CiAgfQp9OwoKZXhwb3J0cy5lc2NhcGVSZWdFeHAgPSBmdW5jdGlvbihzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvKFsuKis/XiR7fSgpfFtcXVwvXFxdKS9nLCAnXFwkMScpOwp9OwoKZXhwb3J0cy5kZWZlcnJlZENhbGwgPSBmdW5jdGlvbihmY24pIHsKCiAgICB2YXIgdGltZXIgPSBudWxsOwogICAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGltZXIgPSBudWxsOwogICAgICAgIGZjbigpOwogICAgfTsKCiAgICB2YXIgZGVmZXJyZWQgPSBmdW5jdGlvbih0aW1lb3V0KSB7CiAgICAgICAgZGVmZXJyZWQuY2FuY2VsKCk7CiAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGNhbGxiYWNrLCB0aW1lb3V0IHx8IDApOwogICAgICAgIHJldHVybiBkZWZlcnJlZDsKICAgIH07CgogICAgZGVmZXJyZWQuc2NoZWR1bGUgPSBkZWZlcnJlZDsKCiAgICBkZWZlcnJlZC5jYWxsID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5jYW5jZWwoKTsKICAgICAgICBmY24oKTsKICAgICAgICByZXR1cm4gZGVmZXJyZWQ7CiAgICB9OwoKICAgIGRlZmVycmVkLmNhbmNlbCA9IGZ1bmN0aW9uKCkgewogICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7CiAgICAgICAgdGltZXIgPSBudWxsOwogICAgICAgIHJldHVybiBkZWZlcnJlZDsKICAgIH07CgogICAgcmV0dXJuIGRlZmVycmVkOwp9OwoKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KIApkZWZpbmUoJ2FjZS9tb2RlL2NvZmZlZS9jb2ZmZWUtc2NyaXB0JywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbW9kZS9jb2ZmZWUvbGV4ZXInLCAnYWNlL21vZGUvY29mZmVlL3BhcnNlcicsICdhY2UvbW9kZS9jb2ZmZWUvbm9kZXMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiAgICAKICAgIHZhciBMZXhlciA9IHJlcXVpcmUoIi4vbGV4ZXIiKS5MZXhlcjsKICAgIHZhciBwYXJzZXIgPSByZXF1aXJlKCIuL3BhcnNlciIpOwoKICAgIHZhciBsZXhlciA9IG5ldyBMZXhlcigpOwogICAgcGFyc2VyLmxleGVyID0gewogICAgICAgIGxleDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciB0YWcsIF9yZWYyOwogICAgICAgICAgICBfcmVmMiA9IHRoaXMudG9rZW5zW3RoaXMucG9zKytdIHx8IFsnJ10sIHRhZyA9IF9yZWYyWzBdLCB0aGlzLnl5dGV4dCA9IF9yZWYyWzFdLCB0aGlzLnl5bGluZW5vID0gX3JlZjJbMl07CiAgICAgICAgICAgIHJldHVybiB0YWc7CiAgICAgICAgfSwKICAgICAgICBzZXRJbnB1dDogZnVuY3Rpb24odG9rZW5zKSB7CiAgICAgICAgICAgIHRoaXMudG9rZW5zID0gdG9rZW5zOwogICAgICAgICAgICByZXR1cm4gdGhpcy5wb3MgPSAwOwogICAgICAgIH0sCiAgICAgICAgdXBjb21pbmdJbnB1dDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CiAgICB9OwogICAgcGFyc2VyLnl5ID0gcmVxdWlyZSgnLi9ub2RlcycpOwogICAgCiAgICBleHBvcnRzLnBhcnNlID0gZnVuY3Rpb24oY29kZSkgewogICAgICAgIHJldHVybiBwYXJzZXIucGFyc2UobGV4ZXIudG9rZW5pemUoY29kZSkpOwogICAgfTsKfSk7LyoqCiAqIENvcHlyaWdodCAoYykgMjAxMSBKZXJlbXkgQXNoa2VuYXMKICoKICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAogKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKICogY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCiAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCiAqIGNvbmRpdGlvbnM6CiAqIAogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQogKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KICogCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAogKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKICogT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKICogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCiAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORwogKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCiAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICovCgpkZWZpbmUoJ2FjZS9tb2RlL2NvZmZlZS9sZXhlcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL21vZGUvY29mZmVlL3Jld3JpdGVyJywgJ2FjZS9tb2RlL2NvZmZlZS9oZWxwZXJzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewogICAgCiAgdmFyIEFTU0lHTkVELCBCT09MLCBDQUxMQUJMRSwgQ09ERSwgQ09GRkVFX0FMSUFTRVMsIENPRkZFRV9BTElBU19NQVAsIENPRkZFRV9LRVlXT1JEUywgQ09NTUVOVCwgQ09NUEFSRSwgQ09NUE9VTkRfQVNTSUdOLCBIRVJFRE9DLCBIRVJFRE9DX0lMTEVHQUwsIEhFUkVET0NfSU5ERU5ULCBIRVJFR0VYLCBIRVJFR0VYX09NSVQsIElERU5USUZJRVIsIElOREVYQUJMRSwgSlNUT0tFTiwgSlNfRk9SQklEREVOLCBKU19LRVlXT1JEUywgTElORV9CUkVBSywgTElORV9DT05USU5VRVIsIExPR0lDLCBMZXhlciwgTUFUSCwgTVVMVElMSU5FUiwgTVVMVElfREVOVCwgTk9UX1JFR0VYLCBOT1RfU1BBQ0VEX1JFR0VYLCBOT19ORVdMSU5FLCBOVU1CRVIsIE9QRVJBVE9SLCBSRUdFWCwgUkVMQVRJT04sIFJFU0VSVkVELCBSZXdyaXRlciwgU0hJRlQsIFNJTVBMRVNUUiwgVFJBSUxJTkdfU1BBQ0VTLCBVTkFSWSwgV0hJVEVTUEFDRSwgY29tcGFjdCwgY291bnQsIGtleSwgbGFzdCwgc3RhcnRzLCBfcmVmOwogIHZhciBfX2luZGV4T2YgPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiB8fCBmdW5jdGlvbihpdGVtKSB7CiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgIGlmICh0aGlzW2ldID09PSBpdGVtKSByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9OwogIFJld3JpdGVyID0gcmVxdWlyZSgnLi9yZXdyaXRlcicpLlJld3JpdGVyOwogIF9yZWYgPSByZXF1aXJlKCcuL2hlbHBlcnMnKSwgY291bnQgPSBfcmVmLmNvdW50LCBzdGFydHMgPSBfcmVmLnN0YXJ0cywgY29tcGFjdCA9IF9yZWYuY29tcGFjdCwgbGFzdCA9IF9yZWYubGFzdDsKICBleHBvcnRzLkxleGVyID0gTGV4ZXIgPSAoZnVuY3Rpb24oKSB7CiAgICBmdW5jdGlvbiBMZXhlcigpIHt9CiAgICBMZXhlci5wcm90b3R5cGUudG9rZW5pemUgPSBmdW5jdGlvbihjb2RlLCBvcHRzKSB7CiAgICAgIHZhciBpOwogICAgICBpZiAob3B0cyA9PSBudWxsKSB7CiAgICAgICAgb3B0cyA9IHt9OwogICAgICB9CiAgICAgIGlmIChXSElURVNQQUNFLnRlc3QoY29kZSkpIHsKICAgICAgICBjb2RlID0gIlxuIiArIGNvZGU7CiAgICAgIH0KICAgICAgY29kZSA9IGNvZGUucmVwbGFjZSgvXHIvZywgJycpLnJlcGxhY2UoVFJBSUxJTkdfU1BBQ0VTLCAnJyk7CiAgICAgIHRoaXMuY29kZSA9IGNvZGU7CiAgICAgIHRoaXMubGluZSA9IG9wdHMubGluZSB8fCAwOwogICAgICB0aGlzLmluZGVudCA9IDA7CiAgICAgIHRoaXMuaW5kZWJ0ID0gMDsKICAgICAgdGhpcy5vdXRkZWJ0ID0gMDsKICAgICAgdGhpcy5pbmRlbnRzID0gW107CiAgICAgIHRoaXMudG9rZW5zID0gW107CiAgICAgIGkgPSAwOwogICAgICB3aGlsZSAodGhpcy5jaHVuayA9IGNvZGUuc2xpY2UoaSkpIHsKICAgICAgICBpICs9IHRoaXMuaWRlbnRpZmllclRva2VuKCkgfHwgdGhpcy5jb21tZW50VG9rZW4oKSB8fCB0aGlzLndoaXRlc3BhY2VUb2tlbigpIHx8IHRoaXMubGluZVRva2VuKCkgfHwgdGhpcy5oZXJlZG9jVG9rZW4oKSB8fCB0aGlzLnN0cmluZ1Rva2VuKCkgfHwgdGhpcy5udW1iZXJUb2tlbigpIHx8IHRoaXMucmVnZXhUb2tlbigpIHx8IHRoaXMuanNUb2tlbigpIHx8IHRoaXMubGl0ZXJhbFRva2VuKCk7CiAgICAgIH0KICAgICAgdGhpcy5jbG9zZUluZGVudGF0aW9uKCk7CiAgICAgIGlmIChvcHRzLnJld3JpdGUgPT09IGZhbHNlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zOwogICAgICB9CiAgICAgIHJldHVybiAobmV3IFJld3JpdGVyKS5yZXdyaXRlKHRoaXMudG9rZW5zKTsKICAgIH07CiAgICBMZXhlci5wcm90b3R5cGUuaWRlbnRpZmllclRva2VuID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBjb2xvbiwgZm9yY2VkSWRlbnRpZmllciwgaWQsIGlucHV0LCBtYXRjaCwgcHJldiwgdGFnLCBfcmVmMiwgX3JlZjM7CiAgICAgIGlmICghKG1hdGNoID0gSURFTlRJRklFUi5leGVjKHRoaXMuY2h1bmspKSkgewogICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIGlucHV0ID0gbWF0Y2hbMF0sIGlkID0gbWF0Y2hbMV0sIGNvbG9uID0gbWF0Y2hbMl07CiAgICAgIGlmIChpZCA9PT0gJ293bicgJiYgdGhpcy50YWcoKSA9PT0gJ0ZPUicpIHsKICAgICAgICB0aGlzLnRva2VuKCdPV04nLCBpZCk7CiAgICAgICAgcmV0dXJuIGlkLmxlbmd0aDsKICAgICAgfQogICAgICBmb3JjZWRJZGVudGlmaWVyID0gY29sb24gfHwgKHByZXYgPSBsYXN0KHRoaXMudG9rZW5zKSkgJiYgKCgoX3JlZjIgPSBwcmV2WzBdKSA9PT0gJy4nIHx8IF9yZWYyID09PSAnPy4nIHx8IF9yZWYyID09PSAnOjonKSB8fCAhcHJldi5zcGFjZWQgJiYgcHJldlswXSA9PT0gJ0AnKTsKICAgICAgdGFnID0gJ0lERU5USUZJRVInOwogICAgICBpZiAoX19pbmRleE9mLmNhbGwoSlNfS0VZV09SRFMsIGlkKSA+PSAwIHx8ICFmb3JjZWRJZGVudGlmaWVyICYmIF9faW5kZXhPZi5jYWxsKENPRkZFRV9LRVlXT1JEUywgaWQpID49IDApIHsKICAgICAgICB0YWcgPSBpZC50b1VwcGVyQ2FzZSgpOwogICAgICAgIGlmICh0YWcgPT09ICdXSEVOJyAmJiAoX3JlZjMgPSB0aGlzLnRhZygpLCBfX2luZGV4T2YuY2FsbChMSU5FX0JSRUFLLCBfcmVmMykgPj0gMCkpIHsKICAgICAgICAgIHRhZyA9ICdMRUFESU5HX1dIRU4nOwogICAgICAgIH0gZWxzZSBpZiAodGFnID09PSAnRk9SJykgewogICAgICAgICAgdGhpcy5zZWVuRm9yID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PT0gJ1VOTEVTUycpIHsKICAgICAgICAgIHRhZyA9ICdJRic7CiAgICAgICAgfSBlbHNlIGlmIChfX2luZGV4T2YuY2FsbChVTkFSWSwgdGFnKSA+PSAwKSB7CiAgICAgICAgICB0YWcgPSAnVU5BUlknOwogICAgICAgIH0gZWxzZSBpZiAoX19pbmRleE9mLmNhbGwoUkVMQVRJT04sIHRhZykgPj0gMCkgewogICAgICAgICAgaWYgKHRhZyAhPT0gJ0lOU1RBTkNFT0YnICYmIHRoaXMuc2VlbkZvcikgewogICAgICAgICAgICB0YWcgPSAnRk9SJyArIHRhZzsKICAgICAgICAgICAgdGhpcy5zZWVuRm9yID0gZmFsc2U7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0YWcgPSAnUkVMQVRJT04nOwogICAgICAgICAgICBpZiAodGhpcy52YWx1ZSgpID09PSAnIScpIHsKICAgICAgICAgICAgICB0aGlzLnRva2Vucy5wb3AoKTsKICAgICAgICAgICAgICBpZCA9ICchJyArIGlkOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChfX2luZGV4T2YuY2FsbChKU19GT1JCSURERU4sIGlkKSA+PSAwKSB7CiAgICAgICAgaWYgKGZvcmNlZElkZW50aWZpZXIpIHsKICAgICAgICAgIHRhZyA9ICdJREVOVElGSUVSJzsKICAgICAgICAgIGlkID0gbmV3IFN0cmluZyhpZCk7CiAgICAgICAgICBpZC5yZXNlcnZlZCA9IHRydWU7CiAgICAgICAgfSBlbHNlIGlmIChfX2luZGV4T2YuY2FsbChSRVNFUlZFRCwgaWQpID49IDApIHsKICAgICAgICAgIHRoaXMuaWRlbnRpZmllckVycm9yKGlkKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFmb3JjZWRJZGVudGlmaWVyKSB7CiAgICAgICAgaWYgKF9faW5kZXhPZi5jYWxsKENPRkZFRV9BTElBU0VTLCBpZCkgPj0gMCkgewogICAgICAgICAgaWQgPSBDT0ZGRUVfQUxJQVNfTUFQW2lkXTsKICAgICAgICB9CiAgICAgICAgdGFnID0gKGZ1bmN0aW9uKCkgewogICAgICAgICAgc3dpdGNoIChpZCkgewogICAgICAgICAgICBjYXNlICchJzoKICAgICAgICAgICAgICByZXR1cm4gJ1VOQVJZJzsKICAgICAgICAgICAgY2FzZSAnPT0nOgogICAgICAgICAgICBjYXNlICchPSc6CiAgICAgICAgICAgICAgcmV0dXJuICdDT01QQVJFJzsKICAgICAgICAgICAgY2FzZSAnJiYnOgogICAgICAgICAgICBjYXNlICd8fCc6CiAgICAgICAgICAgICAgcmV0dXJuICdMT0dJQyc7CiAgICAgICAgICAgIGNhc2UgJ3RydWUnOgogICAgICAgICAgICBjYXNlICdmYWxzZSc6CiAgICAgICAgICAgIGNhc2UgJ251bGwnOgogICAgICAgICAgICBjYXNlICd1bmRlZmluZWQnOgogICAgICAgICAgICAgIHJldHVybiAnQk9PTCc7CiAgICAgICAgICAgIGNhc2UgJ2JyZWFrJzoKICAgICAgICAgICAgY2FzZSAnY29udGludWUnOgogICAgICAgICAgICBjYXNlICdkZWJ1Z2dlcic6CiAgICAgICAgICAgICAgcmV0dXJuICdTVEFURU1FTlQnOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHJldHVybiB0YWc7CiAgICAgICAgICB9CiAgICAgICAgfSkoKTsKICAgICAgfQogICAgICB0aGlzLnRva2VuKHRhZywgaWQpOwogICAgICBpZiAoY29sb24pIHsKICAgICAgICB0aGlzLnRva2VuKCc6JywgJzonKTsKICAgICAgfQogICAgICByZXR1cm4gaW5wdXQubGVuZ3RoOwogICAgfTsKICAgIExleGVyLnByb3RvdHlwZS5udW1iZXJUb2tlbiA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgbWF0Y2gsIG51bWJlcjsKICAgICAgaWYgKCEobWF0Y2ggPSBOVU1CRVIuZXhlYyh0aGlzLmNodW5rKSkpIHsKICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgICBudW1iZXIgPSBtYXRjaFswXTsKICAgICAgdGhpcy50b2tlbignTlVNQkVSJywgbnVtYmVyKTsKICAgICAgcmV0dXJuIG51bWJlci5sZW5ndGg7CiAgICB9OwogICAgTGV4ZXIucHJvdG90eXBlLnN0cmluZ1Rva2VuID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBtYXRjaCwgc3RyaW5nOwogICAgICBzd2l0Y2ggKHRoaXMuY2h1bmsuY2hhckF0KDApKSB7CiAgICAgICAgY2FzZSAiJyI6CiAgICAgICAgICBpZiAoIShtYXRjaCA9IFNJTVBMRVNUUi5leGVjKHRoaXMuY2h1bmspKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMudG9rZW4oJ1NUUklORycsIChzdHJpbmcgPSBtYXRjaFswXSkucmVwbGFjZShNVUxUSUxJTkVSLCAnXFxcbicpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJyInOgogICAgICAgICAgaWYgKCEoc3RyaW5nID0gdGhpcy5iYWxhbmNlZFN0cmluZyh0aGlzLmNodW5rLCAnIicpKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgIH0KICAgICAgICAgIGlmICgwIDwgc3RyaW5nLmluZGV4T2YoJyN7JywgMSkpIHsKICAgICAgICAgICAgdGhpcy5pbnRlcnBvbGF0ZVN0cmluZyhzdHJpbmcuc2xpY2UoMSwgLTEpKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMudG9rZW4oJ1NUUklORycsIHRoaXMuZXNjYXBlTGluZXMoc3RyaW5nKSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgICAgdGhpcy5saW5lICs9IGNvdW50KHN0cmluZywgJ1xuJyk7CiAgICAgIHJldHVybiBzdHJpbmcubGVuZ3RoOwogICAgfTsKICAgIExleGVyLnByb3RvdHlwZS5oZXJlZG9jVG9rZW4gPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIGRvYywgaGVyZWRvYywgbWF0Y2gsIHF1b3RlOwogICAgICBpZiAoIShtYXRjaCA9IEhFUkVET0MuZXhlYyh0aGlzLmNodW5rKSkpIHsKICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgICBoZXJlZG9jID0gbWF0Y2hbMF07CiAgICAgIHF1b3RlID0gaGVyZWRvYy5jaGFyQXQoMCk7CiAgICAgIGRvYyA9IHRoaXMuc2FuaXRpemVIZXJlZG9jKG1hdGNoWzJdLCB7CiAgICAgICAgcXVvdGU6IHF1b3RlLAogICAgICAgIGluZGVudDogbnVsbAogICAgICB9KTsKICAgICAgaWYgKHF1b3RlID09PSAnIicgJiYgMCA8PSBkb2MuaW5kZXhPZignI3snKSkgewogICAgICAgIHRoaXMuaW50ZXJwb2xhdGVTdHJpbmcoZG9jLCB7CiAgICAgICAgICBoZXJlZG9jOiB0cnVlCiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy50b2tlbignU1RSSU5HJywgdGhpcy5tYWtlU3RyaW5nKGRvYywgcXVvdGUsIHRydWUpKTsKICAgICAgfQogICAgICB0aGlzLmxpbmUgKz0gY291bnQoaGVyZWRvYywgJ1xuJyk7CiAgICAgIHJldHVybiBoZXJlZG9jLmxlbmd0aDsKICAgIH07CiAgICBMZXhlci5wcm90b3R5cGUuY29tbWVudFRva2VuID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBjb21tZW50LCBoZXJlLCBtYXRjaDsKICAgICAgaWYgKCEobWF0Y2ggPSB0aGlzLmNodW5rLm1hdGNoKENPTU1FTlQpKSkgewogICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIGNvbW1lbnQgPSBtYXRjaFswXSwgaGVyZSA9IG1hdGNoWzFdOwogICAgICBpZiAoaGVyZSkgewogICAgICAgIHRoaXMudG9rZW4oJ0hFUkVDT01NRU5UJywgdGhpcy5zYW5pdGl6ZUhlcmVkb2MoaGVyZSwgewogICAgICAgICAgaGVyZWNvbW1lbnQ6IHRydWUsCiAgICAgICAgICBpbmRlbnQ6IEFycmF5KHRoaXMuaW5kZW50ICsgMSkuam9pbignICcpCiAgICAgICAgfSkpOwogICAgICAgIHRoaXMudG9rZW4oJ1RFUk1JTkFUT1InLCAnXG4nKTsKICAgICAgfQogICAgICB0aGlzLmxpbmUgKz0gY291bnQoY29tbWVudCwgJ1xuJyk7CiAgICAgIHJldHVybiBjb21tZW50Lmxlbmd0aDsKICAgIH07CiAgICBMZXhlci5wcm90b3R5cGUuanNUb2tlbiA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgbWF0Y2gsIHNjcmlwdDsKICAgICAgaWYgKCEodGhpcy5jaHVuay5jaGFyQXQoMCkgPT09ICdgJyAmJiAobWF0Y2ggPSBKU1RPS0VOLmV4ZWModGhpcy5jaHVuaykpKSkgewogICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIHRoaXMudG9rZW4oJ0pTJywgKHNjcmlwdCA9IG1hdGNoWzBdKS5zbGljZSgxLCAtMSkpOwogICAgICByZXR1cm4gc2NyaXB0Lmxlbmd0aDsKICAgIH07CiAgICBMZXhlci5wcm90b3R5cGUucmVnZXhUb2tlbiA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgbWF0Y2gsIHByZXYsIHJlZ2V4LCBfcmVmMjsKICAgICAgaWYgKHRoaXMuY2h1bmsuY2hhckF0KDApICE9PSAnLycpIHsKICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgICBpZiAobWF0Y2ggPSBIRVJFR0VYLmV4ZWModGhpcy5jaHVuaykpIHsKICAgICAgICB0aGlzLmxpbmUgKz0gY291bnQobWF0Y2hbMF0sICdcbicpOyAgICAgICAgCiAgICAgICAgcmV0dXJuIHRoaXMuaGVyZWdleFRva2VuKG1hdGNoKTsKICAgICAgfQogICAgICBwcmV2ID0gbGFzdCh0aGlzLnRva2Vucyk7CiAgICAgIGlmIChwcmV2ICYmIChfcmVmMiA9IHByZXZbMF0sIF9faW5kZXhPZi5jYWxsKChwcmV2LnNwYWNlZCA/IE5PVF9SRUdFWCA6IE5PVF9TUEFDRURfUkVHRVgpLCBfcmVmMikgPj0gMCkpIHsKICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgICBpZiAoIShtYXRjaCA9IFJFR0VYLmV4ZWModGhpcy5jaHVuaykpKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgICAgcmVnZXggPSBtYXRjaFswXTsKICAgICAgdGhpcy50b2tlbignUkVHRVgnLCByZWdleCA9PT0gJy8vJyA/ICcvKD86KS8nIDogcmVnZXgpOwogICAgICByZXR1cm4gcmVnZXgubGVuZ3RoOwogICAgfTsKICAgIExleGVyLnByb3RvdHlwZS5oZXJlZ2V4VG9rZW4gPSBmdW5jdGlvbihtYXRjaCkgewogICAgICB2YXIgYm9keSwgZmxhZ3MsIGhlcmVnZXgsIHJlLCB0YWcsIHRva2VucywgdmFsdWUsIF9pLCBfbGVuLCBfcmVmMiwgX3JlZjMsIF9yZWY0LCBfcmVmNTsKICAgICAgaGVyZWdleCA9IG1hdGNoWzBdLCBib2R5ID0gbWF0Y2hbMV0sIGZsYWdzID0gbWF0Y2hbMl07CiAgICAgIGlmICgwID4gYm9keS5pbmRleE9mKCcjeycpKSB7CiAgICAgICAgcmUgPSBib2R5LnJlcGxhY2UoSEVSRUdFWF9PTUlULCAnJykucmVwbGFjZSgvXC8vZywgJ1xcLycpOwogICAgICAgIHRoaXMudG9rZW4oJ1JFR0VYJywgIi8iICsgKHJlIHx8ICcoPzopJykgKyAiLyIgKyBmbGFncyk7CiAgICAgICAgcmV0dXJuIGhlcmVnZXgubGVuZ3RoOwogICAgICB9CiAgICAgIHRoaXMudG9rZW4oJ0lERU5USUZJRVInLCAnUmVnRXhwJyk7CiAgICAgIHRoaXMudG9rZW5zLnB1c2goWydDQUxMX1NUQVJUJywgJygnXSk7CiAgICAgIHRva2VucyA9IFtdOwogICAgICBfcmVmMiA9IHRoaXMuaW50ZXJwb2xhdGVTdHJpbmcoYm9keSwgewogICAgICAgIHJlZ2V4OiB0cnVlCiAgICAgIH0pOwogICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYyLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7CiAgICAgICAgX3JlZjMgPSBfcmVmMltfaV0sIHRhZyA9IF9yZWYzWzBdLCB2YWx1ZSA9IF9yZWYzWzFdOwogICAgICAgIGlmICh0YWcgPT09ICdUT0tFTlMnKSB7CiAgICAgICAgICB0b2tlbnMucHVzaC5hcHBseSh0b2tlbnMsIHZhbHVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKCEodmFsdWUgPSB2YWx1ZS5yZXBsYWNlKEhFUkVHRVhfT01JVCwgJycpKSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXFwvZywgJ1xcXFwnKTsKICAgICAgICAgIHRva2Vucy5wdXNoKFsnU1RSSU5HJywgdGhpcy5tYWtlU3RyaW5nKHZhbHVlLCAnIicsIHRydWUpXSk7CiAgICAgICAgfQogICAgICAgIHRva2Vucy5wdXNoKFsnKycsICcrJ10pOwogICAgICB9CiAgICAgIHRva2Vucy5wb3AoKTsKICAgICAgaWYgKCgoX3JlZjQgPSB0b2tlbnNbMF0pICE9IG51bGwgPyBfcmVmNFswXSA6IHZvaWQgMCkgIT09ICdTVFJJTkcnKSB7CiAgICAgICAgdGhpcy50b2tlbnMucHVzaChbJ1NUUklORycsICciIiddLCBbJysnLCAnKyddKTsKICAgICAgfQogICAgICAoX3JlZjUgPSB0aGlzLnRva2VucykucHVzaC5hcHBseShfcmVmNSwgdG9rZW5zKTsKICAgICAgaWYgKGZsYWdzKSB7CiAgICAgICAgdGhpcy50b2tlbnMucHVzaChbJywnLCAnLCddLCBbJ1NUUklORycsICciJyArIGZsYWdzICsgJyInXSk7CiAgICAgIH0KICAgICAgdGhpcy50b2tlbignKScsICcpJyk7CiAgICAgIHJldHVybiBoZXJlZ2V4Lmxlbmd0aDsKICAgIH07CiAgICBMZXhlci5wcm90b3R5cGUubGluZVRva2VuID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBkaWZmLCBpbmRlbnQsIG1hdGNoLCBub05ld2xpbmVzLCBwcmV2LCBzaXplOwogICAgICBpZiAoIShtYXRjaCA9IE1VTFRJX0RFTlQuZXhlYyh0aGlzLmNodW5rKSkpIHsKICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgICBpbmRlbnQgPSBtYXRjaFswXTsKICAgICAgdGhpcy5saW5lICs9IGNvdW50KGluZGVudCwgJ1xuJyk7CiAgICAgIHByZXYgPSBsYXN0KHRoaXMudG9rZW5zLCAxKTsKICAgICAgc2l6ZSA9IGluZGVudC5sZW5ndGggLSAxIC0gaW5kZW50Lmxhc3RJbmRleE9mKCdcbicpOwogICAgICBub05ld2xpbmVzID0gdGhpcy51bmZpbmlzaGVkKCk7CiAgICAgIGlmIChzaXplIC0gdGhpcy5pbmRlYnQgPT09IHRoaXMuaW5kZW50KSB7CiAgICAgICAgaWYgKG5vTmV3bGluZXMpIHsKICAgICAgICAgIHRoaXMuc3VwcHJlc3NOZXdsaW5lcygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLm5ld2xpbmVUb2tlbigpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaW5kZW50Lmxlbmd0aDsKICAgICAgfQogICAgICBpZiAoc2l6ZSA+IHRoaXMuaW5kZW50KSB7CiAgICAgICAgaWYgKG5vTmV3bGluZXMpIHsKICAgICAgICAgIHRoaXMuaW5kZWJ0ID0gc2l6ZSAtIHRoaXMuaW5kZW50OwogICAgICAgICAgdGhpcy5zdXBwcmVzc05ld2xpbmVzKCk7CiAgICAgICAgICByZXR1cm4gaW5kZW50Lmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgZGlmZiA9IHNpemUgLSB0aGlzLmluZGVudCArIHRoaXMub3V0ZGVidDsKICAgICAgICB0aGlzLnRva2VuKCdJTkRFTlQnLCBkaWZmKTsKICAgICAgICB0aGlzLmluZGVudHMucHVzaChkaWZmKTsKICAgICAgICB0aGlzLm91dGRlYnQgPSB0aGlzLmluZGVidCA9IDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5pbmRlYnQgPSAwOwogICAgICAgIHRoaXMub3V0ZGVudFRva2VuKHRoaXMuaW5kZW50IC0gc2l6ZSwgbm9OZXdsaW5lcyk7CiAgICAgIH0KICAgICAgdGhpcy5pbmRlbnQgPSBzaXplOwogICAgICByZXR1cm4gaW5kZW50Lmxlbmd0aDsKICAgIH07CiAgICBMZXhlci5wcm90b3R5cGUub3V0ZGVudFRva2VuID0gZnVuY3Rpb24obW92ZU91dCwgbm9OZXdsaW5lcywgY2xvc2UpIHsKICAgICAgdmFyIGRlbnQsIGxlbjsKICAgICAgd2hpbGUgKG1vdmVPdXQgPiAwKSB7CiAgICAgICAgbGVuID0gdGhpcy5pbmRlbnRzLmxlbmd0aCAtIDE7CiAgICAgICAgaWYgKHRoaXMuaW5kZW50c1tsZW5dID09PSB2b2lkIDApIHsKICAgICAgICAgIG1vdmVPdXQgPSAwOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5pbmRlbnRzW2xlbl0gPT09IHRoaXMub3V0ZGVidCkgewogICAgICAgICAgbW92ZU91dCAtPSB0aGlzLm91dGRlYnQ7CiAgICAgICAgICB0aGlzLm91dGRlYnQgPSAwOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5pbmRlbnRzW2xlbl0gPCB0aGlzLm91dGRlYnQpIHsKICAgICAgICAgIHRoaXMub3V0ZGVidCAtPSB0aGlzLmluZGVudHNbbGVuXTsKICAgICAgICAgIG1vdmVPdXQgLT0gdGhpcy5pbmRlbnRzW2xlbl07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGRlbnQgPSB0aGlzLmluZGVudHMucG9wKCkgLSB0aGlzLm91dGRlYnQ7CiAgICAgICAgICBtb3ZlT3V0IC09IGRlbnQ7CiAgICAgICAgICB0aGlzLm91dGRlYnQgPSAwOwogICAgICAgICAgdGhpcy50b2tlbignT1VUREVOVCcsIGRlbnQpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZGVudCkgewogICAgICAgIHRoaXMub3V0ZGVidCAtPSBtb3ZlT3V0OwogICAgICB9CiAgICAgIGlmICghKHRoaXMudGFnKCkgPT09ICdURVJNSU5BVE9SJyB8fCBub05ld2xpbmVzKSkgewogICAgICAgIHRoaXMudG9rZW4oJ1RFUk1JTkFUT1InLCAnXG4nKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH07CiAgICBMZXhlci5wcm90b3R5cGUud2hpdGVzcGFjZVRva2VuID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBtYXRjaCwgbmxpbmUsIHByZXY7CiAgICAgIGlmICghKChtYXRjaCA9IFdISVRFU1BBQ0UuZXhlYyh0aGlzLmNodW5rKSkgfHwgKG5saW5lID0gdGhpcy5jaHVuay5jaGFyQXQoMCkgPT09ICdcbicpKSkgewogICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIHByZXYgPSBsYXN0KHRoaXMudG9rZW5zKTsKICAgICAgaWYgKHByZXYpIHsKICAgICAgICBwcmV2W21hdGNoID8gJ3NwYWNlZCcgOiAnbmV3TGluZSddID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAobWF0Y2gpIHsKICAgICAgICByZXR1cm4gbWF0Y2hbMF0ubGVuZ3RoOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICB9OwogICAgTGV4ZXIucHJvdG90eXBlLm5ld2xpbmVUb2tlbiA9IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy50YWcoKSAhPT0gJ1RFUk1JTkFUT1InKSB7CiAgICAgICAgdGhpcy50b2tlbignVEVSTUlOQVRPUicsICdcbicpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIExleGVyLnByb3RvdHlwZS5zdXBwcmVzc05ld2xpbmVzID0gZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0aGlzLnZhbHVlKCkgPT09ICdcXCcpIHsKICAgICAgICB0aGlzLnRva2Vucy5wb3AoKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH07CiAgICBMZXhlci5wcm90b3R5cGUubGl0ZXJhbFRva2VuID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBtYXRjaCwgcHJldiwgdGFnLCB2YWx1ZSwgX3JlZjIsIF9yZWYzLCBfcmVmNCwgX3JlZjU7CiAgICAgIGlmIChtYXRjaCA9IE9QRVJBVE9SLmV4ZWModGhpcy5jaHVuaykpIHsKICAgICAgICB2YWx1ZSA9IG1hdGNoWzBdOwogICAgICAgIGlmIChDT0RFLnRlc3QodmFsdWUpKSB7CiAgICAgICAgICB0aGlzLnRhZ1BhcmFtZXRlcnMoKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFsdWUgPSB0aGlzLmNodW5rLmNoYXJBdCgwKTsKICAgICAgfQogICAgICB0YWcgPSB2YWx1ZTsKICAgICAgcHJldiA9IGxhc3QodGhpcy50b2tlbnMpOwogICAgICBpZiAodmFsdWUgPT09ICc9JyAmJiBwcmV2KSB7CiAgICAgICAgaWYgKCFwcmV2WzFdLnJlc2VydmVkICYmIChfcmVmMiA9IHByZXZbMV0sIF9faW5kZXhPZi5jYWxsKEpTX0ZPUkJJRERFTiwgX3JlZjIpID49IDApKSB7CiAgICAgICAgICB0aGlzLmFzc2lnbm1lbnRFcnJvcigpOwogICAgICAgIH0KICAgICAgICBpZiAoKF9yZWYzID0gcHJldlsxXSkgPT09ICd8fCcgfHwgX3JlZjMgPT09ICcmJicpIHsKICAgICAgICAgIHByZXZbMF0gPSAnQ09NUE9VTkRfQVNTSUdOJzsKICAgICAgICAgIHByZXZbMV0gKz0gJz0nOwogICAgICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aDsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHZhbHVlID09PSAnOycpIHsKICAgICAgICB0YWcgPSAnVEVSTUlOQVRPUic7CiAgICAgIH0gZWxzZSBpZiAoX19pbmRleE9mLmNhbGwoTUFUSCwgdmFsdWUpID49IDApIHsKICAgICAgICB0YWcgPSAnTUFUSCc7CiAgICAgIH0gZWxzZSBpZiAoX19pbmRleE9mLmNhbGwoQ09NUEFSRSwgdmFsdWUpID49IDApIHsKICAgICAgICB0YWcgPSAnQ09NUEFSRSc7CiAgICAgIH0gZWxzZSBpZiAoX19pbmRleE9mLmNhbGwoQ09NUE9VTkRfQVNTSUdOLCB2YWx1ZSkgPj0gMCkgewogICAgICAgIHRhZyA9ICdDT01QT1VORF9BU1NJR04nOwogICAgICB9IGVsc2UgaWYgKF9faW5kZXhPZi5jYWxsKFVOQVJZLCB2YWx1ZSkgPj0gMCkgewogICAgICAgIHRhZyA9ICdVTkFSWSc7CiAgICAgIH0gZWxzZSBpZiAoX19pbmRleE9mLmNhbGwoU0hJRlQsIHZhbHVlKSA+PSAwKSB7CiAgICAgICAgdGFnID0gJ1NISUZUJzsKICAgICAgfSBlbHNlIGlmIChfX2luZGV4T2YuY2FsbChMT0dJQywgdmFsdWUpID49IDAgfHwgdmFsdWUgPT09ICc/JyAmJiAocHJldiAhPSBudWxsID8gcHJldi5zcGFjZWQgOiB2b2lkIDApKSB7CiAgICAgICAgdGFnID0gJ0xPR0lDJzsKICAgICAgfSBlbHNlIGlmIChwcmV2ICYmICFwcmV2LnNwYWNlZCkgewogICAgICAgIGlmICh2YWx1ZSA9PT0gJygnICYmIChfcmVmNCA9IHByZXZbMF0sIF9faW5kZXhPZi5jYWxsKENBTExBQkxFLCBfcmVmNCkgPj0gMCkpIHsKICAgICAgICAgIGlmIChwcmV2WzBdID09PSAnPycpIHsKICAgICAgICAgICAgcHJldlswXSA9ICdGVU5DX0VYSVNUJzsKICAgICAgICAgIH0KICAgICAgICAgIHRhZyA9ICdDQUxMX1NUQVJUJzsKICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnWycgJiYgKF9yZWY1ID0gcHJldlswXSwgX19pbmRleE9mLmNhbGwoSU5ERVhBQkxFLCBfcmVmNSkgPj0gMCkpIHsKICAgICAgICAgIHRhZyA9ICdJTkRFWF9TVEFSVCc7CiAgICAgICAgICBzd2l0Y2ggKHByZXZbMF0pIHsKICAgICAgICAgICAgY2FzZSAnPyc6CiAgICAgICAgICAgICAgcHJldlswXSA9ICdJTkRFWF9TT0FLJzsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnOjonOgogICAgICAgICAgICAgIHByZXZbMF0gPSAnSU5ERVhfUFJPVE8nOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICB0aGlzLnRva2VuKHRhZywgdmFsdWUpOwogICAgICByZXR1cm4gdmFsdWUubGVuZ3RoOwogICAgfTsKICAgIExleGVyLnByb3RvdHlwZS5zYW5pdGl6ZUhlcmVkb2MgPSBmdW5jdGlvbihkb2MsIG9wdGlvbnMpIHsKICAgICAgdmFyIGF0dGVtcHQsIGhlcmVjb21tZW50LCBpbmRlbnQsIG1hdGNoLCBfcmVmMjsKICAgICAgaW5kZW50ID0gb3B0aW9ucy5pbmRlbnQsIGhlcmVjb21tZW50ID0gb3B0aW9ucy5oZXJlY29tbWVudDsKICAgICAgaWYgKGhlcmVjb21tZW50KSB7CiAgICAgICAgaWYgKEhFUkVET0NfSUxMRUdBTC50ZXN0KGRvYykpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiYmxvY2sgY29tbWVudCBjYW5ub3QgY29udGFpbiBcIiovXCIsIHN0YXJ0aW5nIG9uIGxpbmUgIiArICh0aGlzLmxpbmUgKyAxKSk7CiAgICAgICAgfQogICAgICAgIGlmIChkb2MuaW5kZXhPZignXG4nKSA8PSAwKSB7CiAgICAgICAgICByZXR1cm4gZG9jOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB3aGlsZSAobWF0Y2ggPSBIRVJFRE9DX0lOREVOVC5leGVjKGRvYykpIHsKICAgICAgICAgIGF0dGVtcHQgPSBtYXRjaFsxXTsKICAgICAgICAgIGlmIChpbmRlbnQgPT09IG51bGwgfHwgKDAgPCAoX3JlZjIgPSBhdHRlbXB0Lmxlbmd0aCkgJiYgX3JlZjIgPCBpbmRlbnQubGVuZ3RoKSkgewogICAgICAgICAgICBpbmRlbnQgPSBhdHRlbXB0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaW5kZW50KSB7CiAgICAgICAgZG9jID0gZG9jLnJlcGxhY2UoUmVnRXhwKCJcXG4iICsgaW5kZW50LCAiZyIpLCAnXG4nKTsKICAgICAgfQogICAgICBpZiAoIWhlcmVjb21tZW50KSB7CiAgICAgICAgZG9jID0gZG9jLnJlcGxhY2UoL15cbi8sICcnKTsKICAgICAgfQogICAgICByZXR1cm4gZG9jOwogICAgfTsKICAgIExleGVyLnByb3RvdHlwZS50YWdQYXJhbWV0ZXJzID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBpLCBzdGFjaywgdG9rLCB0b2tlbnM7CiAgICAgIGlmICh0aGlzLnRhZygpICE9PSAnKScpIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICBzdGFjayA9IFtdOwogICAgICB0b2tlbnMgPSB0aGlzLnRva2VuczsKICAgICAgaSA9IHRva2Vucy5sZW5ndGg7CiAgICAgIHRva2Vuc1stLWldWzBdID0gJ1BBUkFNX0VORCc7CiAgICAgIHdoaWxlICh0b2sgPSB0b2tlbnNbLS1pXSkgewogICAgICAgIHN3aXRjaCAodG9rWzBdKSB7CiAgICAgICAgICBjYXNlICcpJzoKICAgICAgICAgICAgc3RhY2sucHVzaCh0b2spOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJygnOgogICAgICAgICAgY2FzZSAnQ0FMTF9TVEFSVCc6CiAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGgpIHsKICAgICAgICAgICAgICBzdGFjay5wb3AoKTsKICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tbMF0gPT09ICcoJykgewogICAgICAgICAgICAgIHRva1swXSA9ICdQQVJBTV9TVEFSVCc7CiAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwogICAgTGV4ZXIucHJvdG90eXBlLmNsb3NlSW5kZW50YXRpb24gPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMub3V0ZGVudFRva2VuKHRoaXMuaW5kZW50KTsKICAgIH07CiAgICBMZXhlci5wcm90b3R5cGUuaWRlbnRpZmllckVycm9yID0gZnVuY3Rpb24od29yZCkgewogICAgICB0aHJvdyBTeW50YXhFcnJvcigiUmVzZXJ2ZWQgd29yZCBcIiIgKyB3b3JkICsgIlwiIG9uIGxpbmUgIiArICh0aGlzLmxpbmUgKyAxKSk7CiAgICB9OwogICAgTGV4ZXIucHJvdG90eXBlLmFzc2lnbm1lbnRFcnJvciA9IGZ1bmN0aW9uKCkgewogICAgICB0aHJvdyBTeW50YXhFcnJvcigiUmVzZXJ2ZWQgd29yZCBcIiIgKyAodGhpcy52YWx1ZSgpKSArICJcIiBvbiBsaW5lICIgKyAodGhpcy5saW5lICsgMSkgKyAiIGNhbid0IGJlIGFzc2lnbmVkIik7CiAgICB9OwogICAgTGV4ZXIucHJvdG90eXBlLmJhbGFuY2VkU3RyaW5nID0gZnVuY3Rpb24oc3RyLCBlbmQpIHsKICAgICAgdmFyIGksIGxldHRlciwgcHJldiwgc3RhY2ssIF9yZWYyOwogICAgICBzdGFjayA9IFtlbmRdOwogICAgICBmb3IgKGkgPSAxLCBfcmVmMiA9IHN0ci5sZW5ndGg7IDEgPD0gX3JlZjIgPyBpIDwgX3JlZjIgOiBpID4gX3JlZjI7IDEgPD0gX3JlZjIgPyBpKysgOiBpLS0pIHsKICAgICAgICBzd2l0Y2ggKGxldHRlciA9IHN0ci5jaGFyQXQoaSkpIHsKICAgICAgICAgIGNhc2UgJ1xcJzoKICAgICAgICAgICAgaSsrOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIGNhc2UgZW5kOgogICAgICAgICAgICBzdGFjay5wb3AoKTsKICAgICAgICAgICAgaWYgKCFzdGFjay5sZW5ndGgpIHsKICAgICAgICAgICAgICByZXR1cm4gc3RyLnNsaWNlKDAsIGkgKyAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbmQgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmIChlbmQgPT09ICd9JyAmJiAobGV0dGVyID09PSAnIicgfHwgbGV0dGVyID09PSAiJyIpKSB7CiAgICAgICAgICBzdGFjay5wdXNoKGVuZCA9IGxldHRlcik7CiAgICAgICAgfSBlbHNlIGlmIChlbmQgPT09ICd9JyAmJiBsZXR0ZXIgPT09ICd7JykgewogICAgICAgICAgc3RhY2sucHVzaChlbmQgPSAnfScpOwogICAgICAgIH0gZWxzZSBpZiAoZW5kID09PSAnIicgJiYgcHJldiA9PT0gJyMnICYmIGxldHRlciA9PT0gJ3snKSB7CiAgICAgICAgICBzdGFjay5wdXNoKGVuZCA9ICd9Jyk7CiAgICAgICAgfQogICAgICAgIHByZXYgPSBsZXR0ZXI7CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nICIgKyAoc3RhY2sucG9wKCkpICsgIiwgc3RhcnRpbmcgb24gbGluZSAiICsgKHRoaXMubGluZSArIDEpKTsKICAgIH07CiAgICBMZXhlci5wcm90b3R5cGUuaW50ZXJwb2xhdGVTdHJpbmcgPSBmdW5jdGlvbihzdHIsIG9wdGlvbnMpIHsKICAgICAgdmFyIGV4cHIsIGhlcmVkb2MsIGksIGlubmVyLCBpbnRlcnBvbGF0ZWQsIGxlbiwgbGV0dGVyLCBuZXN0ZWQsIHBpLCByZWdleCwgdGFnLCB0b2tlbnMsIHZhbHVlLCBfbGVuLCBfcmVmMiwgX3JlZjMsIF9yZWY0OwogICAgICBpZiAob3B0aW9ucyA9PSBudWxsKSB7CiAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICB9CiAgICAgIGhlcmVkb2MgPSBvcHRpb25zLmhlcmVkb2MsIHJlZ2V4ID0gb3B0aW9ucy5yZWdleDsKICAgICAgdG9rZW5zID0gW107CiAgICAgIHBpID0gMDsKICAgICAgaSA9IC0xOwogICAgICB3aGlsZSAobGV0dGVyID0gc3RyLmNoYXJBdChpICs9IDEpKSB7CiAgICAgICAgaWYgKGxldHRlciA9PT0gJ1xcJykgewogICAgICAgICAgaSArPSAxOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICghKGxldHRlciA9PT0gJyMnICYmIHN0ci5jaGFyQXQoaSArIDEpID09PSAneycgJiYgKGV4cHIgPSB0aGlzLmJhbGFuY2VkU3RyaW5nKHN0ci5zbGljZShpICsgMSksICd9JykpKSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmIChwaSA8IGkpIHsKICAgICAgICAgIHRva2Vucy5wdXNoKFsnTkVPU1RSSU5HJywgc3RyLnNsaWNlKHBpLCBpKV0pOwogICAgICAgIH0KICAgICAgICBpbm5lciA9IGV4cHIuc2xpY2UoMSwgLTEpOwogICAgICAgIGlmIChpbm5lci5sZW5ndGgpIHsKICAgICAgICAgIG5lc3RlZCA9IG5ldyBMZXhlcigpLnRva2VuaXplKGlubmVyLCB7CiAgICAgICAgICAgIGxpbmU6IHRoaXMubGluZSwKICAgICAgICAgICAgcmV3cml0ZTogZmFsc2UKICAgICAgICAgIH0pOwogICAgICAgICAgbmVzdGVkLnBvcCgpOwogICAgICAgICAgaWYgKCgoX3JlZjIgPSBuZXN0ZWRbMF0pICE9IG51bGwgPyBfcmVmMlswXSA6IHZvaWQgMCkgPT09ICdURVJNSU5BVE9SJykgewogICAgICAgICAgICBuZXN0ZWQuc2hpZnQoKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChsZW4gPSBuZXN0ZWQubGVuZ3RoKSB7CiAgICAgICAgICAgIGlmIChsZW4gPiAxKSB7CiAgICAgICAgICAgICAgbmVzdGVkLnVuc2hpZnQoWycoJywgJygnXSk7CiAgICAgICAgICAgICAgbmVzdGVkLnB1c2goWycpJywgJyknXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdG9rZW5zLnB1c2goWydUT0tFTlMnLCBuZXN0ZWRdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaSArPSBleHByLmxlbmd0aDsKICAgICAgICBwaSA9IGkgKyAxOwogICAgICB9CiAgICAgIGlmICgoaSA+IHBpICYmIHBpIDwgc3RyLmxlbmd0aCkpIHsKICAgICAgICB0b2tlbnMucHVzaChbJ05FT1NUUklORycsIHN0ci5zbGljZShwaSldKTsKICAgICAgfQogICAgICBpZiAocmVnZXgpIHsKICAgICAgICByZXR1cm4gdG9rZW5zOwogICAgICB9CiAgICAgIGlmICghdG9rZW5zLmxlbmd0aCkgewogICAgICAgIHJldHVybiB0aGlzLnRva2VuKCdTVFJJTkcnLCAnIiInKTsKICAgICAgfQogICAgICBpZiAodG9rZW5zWzBdWzBdICE9PSAnTkVPU1RSSU5HJykgewogICAgICAgIHRva2Vucy51bnNoaWZ0KFsnJywgJyddKTsKICAgICAgfQogICAgICBpZiAoaW50ZXJwb2xhdGVkID0gdG9rZW5zLmxlbmd0aCA+IDEpIHsKICAgICAgICB0aGlzLnRva2VuKCcoJywgJygnKTsKICAgICAgfQogICAgICBmb3IgKGkgPSAwLCBfbGVuID0gdG9rZW5zLmxlbmd0aDsgaSA8IF9sZW47IGkrKykgewogICAgICAgIF9yZWYzID0gdG9rZW5zW2ldLCB0YWcgPSBfcmVmM1swXSwgdmFsdWUgPSBfcmVmM1sxXTsKICAgICAgICBpZiAoaSkgewogICAgICAgICAgdGhpcy50b2tlbignKycsICcrJyk7CiAgICAgICAgfQogICAgICAgIGlmICh0YWcgPT09ICdUT0tFTlMnKSB7CiAgICAgICAgICAoX3JlZjQgPSB0aGlzLnRva2VucykucHVzaC5hcHBseShfcmVmNCwgdmFsdWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnRva2VuKCdTVFJJTkcnLCB0aGlzLm1ha2VTdHJpbmcodmFsdWUsICciJywgaGVyZWRvYykpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaW50ZXJwb2xhdGVkKSB7CiAgICAgICAgdGhpcy50b2tlbignKScsICcpJyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRva2VuczsKICAgIH07CiAgICBMZXhlci5wcm90b3R5cGUudG9rZW4gPSBmdW5jdGlvbih0YWcsIHZhbHVlKSB7CiAgICAgIHJldHVybiB0aGlzLnRva2Vucy5wdXNoKFt0YWcsIHZhbHVlLCB0aGlzLmxpbmVdKTsKICAgIH07CiAgICBMZXhlci5wcm90b3R5cGUudGFnID0gZnVuY3Rpb24oaW5kZXgsIHRhZykgewogICAgICB2YXIgdG9rOwogICAgICByZXR1cm4gKHRvayA9IGxhc3QodGhpcy50b2tlbnMsIGluZGV4KSkgJiYgKHRhZyA/IHRva1swXSA9IHRhZyA6IHRva1swXSk7CiAgICB9OwogICAgTGV4ZXIucHJvdG90eXBlLnZhbHVlID0gZnVuY3Rpb24oaW5kZXgsIHZhbCkgewogICAgICB2YXIgdG9rOwogICAgICByZXR1cm4gKHRvayA9IGxhc3QodGhpcy50b2tlbnMsIGluZGV4KSkgJiYgKHZhbCA/IHRva1sxXSA9IHZhbCA6IHRva1sxXSk7CiAgICB9OwogICAgTGV4ZXIucHJvdG90eXBlLnVuZmluaXNoZWQgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIHByZXYsIHZhbHVlOwogICAgICByZXR1cm4gTElORV9DT05USU5VRVIudGVzdCh0aGlzLmNodW5rKSB8fCAocHJldiA9IGxhc3QodGhpcy50b2tlbnMsIDEpKSAmJiBwcmV2WzBdICE9PSAnLicgJiYgKHZhbHVlID0gdGhpcy52YWx1ZSgpKSAmJiAhdmFsdWUucmVzZXJ2ZWQgJiYgTk9fTkVXTElORS50ZXN0KHZhbHVlKSAmJiAhQ09ERS50ZXN0KHZhbHVlKSAmJiAhQVNTSUdORUQudGVzdCh0aGlzLmNodW5rKTsKICAgIH07CiAgICBMZXhlci5wcm90b3R5cGUuZXNjYXBlTGluZXMgPSBmdW5jdGlvbihzdHIsIGhlcmVkb2MpIHsKICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKE1VTFRJTElORVIsIGhlcmVkb2MgPyAnXFxuJyA6ICcnKTsKICAgIH07CiAgICBMZXhlci5wcm90b3R5cGUubWFrZVN0cmluZyA9IGZ1bmN0aW9uKGJvZHksIHF1b3RlLCBoZXJlZG9jKSB7CiAgICAgIGlmICghYm9keSkgewogICAgICAgIHJldHVybiBxdW90ZSArIHF1b3RlOwogICAgICB9CiAgICAgIGJvZHkgPSBib2R5LnJlcGxhY2UoL1xcKFtcc1xTXSkvZywgZnVuY3Rpb24obWF0Y2gsIGNvbnRlbnRzKSB7CiAgICAgICAgaWYgKGNvbnRlbnRzID09PSAnXG4nIHx8IGNvbnRlbnRzID09PSBxdW90ZSkgewogICAgICAgICAgcmV0dXJuIGNvbnRlbnRzOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgYm9keSA9IGJvZHkucmVwbGFjZShSZWdFeHAoIiIgKyBxdW90ZSwgImciKSwgJ1xcJCYnKTsKICAgICAgcmV0dXJuIHF1b3RlICsgdGhpcy5lc2NhcGVMaW5lcyhib2R5LCBoZXJlZG9jKSArIHF1b3RlOwogICAgfTsKICAgIHJldHVybiBMZXhlcjsKICB9KSgpOwogIEpTX0tFWVdPUkRTID0gWyd0cnVlJywgJ2ZhbHNlJywgJ251bGwnLCAndGhpcycsICduZXcnLCAnZGVsZXRlJywgJ3R5cGVvZicsICdpbicsICdpbnN0YW5jZW9mJywgJ3JldHVybicsICd0aHJvdycsICdicmVhaycsICdjb250aW51ZScsICdkZWJ1Z2dlcicsICdpZicsICdlbHNlJywgJ3N3aXRjaCcsICdmb3InLCAnd2hpbGUnLCAnZG8nLCAndHJ5JywgJ2NhdGNoJywgJ2ZpbmFsbHknLCAnY2xhc3MnLCAnZXh0ZW5kcycsICdzdXBlciddOwogIENPRkZFRV9LRVlXT1JEUyA9IFsndW5kZWZpbmVkJywgJ3RoZW4nLCAndW5sZXNzJywgJ3VudGlsJywgJ2xvb3AnLCAnb2YnLCAnYnknLCAnd2hlbiddOwogIENPRkZFRV9BTElBU19NQVAgPSB7CiAgICBhbmQ6ICcmJicsCiAgICBvcjogJ3x8JywKICAgIGlzOiAnPT0nLAogICAgaXNudDogJyE9JywKICAgIG5vdDogJyEnLAogICAgeWVzOiAndHJ1ZScsCiAgICBubzogJ2ZhbHNlJywKICAgIG9uOiAndHJ1ZScsCiAgICBvZmY6ICdmYWxzZScKICB9OwogIENPRkZFRV9BTElBU0VTID0gKGZ1bmN0aW9uKCkgewogICAgdmFyIF9yZXN1bHRzOwogICAgX3Jlc3VsdHMgPSBbXTsKICAgIGZvciAoa2V5IGluIENPRkZFRV9BTElBU19NQVApIHsKICAgICAgX3Jlc3VsdHMucHVzaChrZXkpOwogICAgfQogICAgcmV0dXJuIF9yZXN1bHRzOwogIH0pKCk7CiAgQ09GRkVFX0tFWVdPUkRTID0gQ09GRkVFX0tFWVdPUkRTLmNvbmNhdChDT0ZGRUVfQUxJQVNFUyk7CiAgUkVTRVJWRUQgPSBbJ2Nhc2UnLCAnZGVmYXVsdCcsICdmdW5jdGlvbicsICd2YXInLCAndm9pZCcsICd3aXRoJywgJ2NvbnN0JywgJ2xldCcsICdlbnVtJywgJ2V4cG9ydCcsICdpbXBvcnQnLCAnbmF0aXZlJywgJ19faGFzUHJvcCcsICdfX2V4dGVuZHMnLCAnX19zbGljZScsICdfX2JpbmQnLCAnX19pbmRleE9mJ107CiAgSlNfRk9SQklEREVOID0gSlNfS0VZV09SRFMuY29uY2F0KFJFU0VSVkVEKTsKICBleHBvcnRzLlJFU0VSVkVEID0gUkVTRVJWRUQuY29uY2F0KEpTX0tFWVdPUkRTKS5jb25jYXQoQ09GRkVFX0tFWVdPUkRTKTsKICBJREVOVElGSUVSID0gL14oWyRBLVphLXpfXHg3Zi1cdWZmZmZdWyRcd1x4N2YtXHVmZmZmXSopKFteXG5cU10qOig/ITopKT8vOwogIE5VTUJFUiA9IC9eMHhbXGRhLWZdK3xeKD86XGQrKFwuXGQrKT98XC5cZCspKD86ZVsrLV0/XGQrKT8vaTsKICBIRVJFRE9DID0gL14oIiIifCcnJykoW1xzXFNdKj8pKD86XG5bXlxuXFNdKik/XDEvOwogIE9QRVJBVE9SID0gL14oPzpbLT1dPnxbLSsqXC8lPD4mfF4hPz1dPXw+Pj49P3woWy0rOl0pXDF8KFsmfDw+XSlcMj0/fFw/XC58XC57MiwzfSkvOwogIFdISVRFU1BBQ0UgPSAvXlteXG5cU10rLzsKICBDT01NRU5UID0gL14jIyMoW14jXVtcc1xTXSo/KSg/OiMjI1teXG5cU10qfCg/OiMjIyk/JCl8Xig/OlxzKiMoPyEjI1teI10pLiopKy87CiAgQ09ERSA9IC9eWy09XT4vOwogIE1VTFRJX0RFTlQgPSAvXig/OlxuW15cblxTXSopKy87CiAgU0lNUExFU1RSID0gL14nW15cXCddKig/OlxcLlteXFwnXSopKicvOwogIEpTVE9LRU4gPSAvXmBbXlxcYF0qKD86XFwuW15cXGBdKikqYC87CiAgUkVHRVggPSAvXlwvKD8hW1xzPV0pW15bXC9cblxcXSooPzooPzpcXFtcc1xTXXxcW1teXF1cblxcXSooPzpcXFtcc1xTXVteXF1cblxcXSopKl0pW15bXC9cblxcXSopKlwvW2ltZ3ldezAsNH0oPyFcdykvOwogIEhFUkVHRVggPSAvXlwvezN9KFtcc1xTXSs/KVwvezN9KFtpbWd5XXswLDR9KSg/IVx3KS87CiAgSEVSRUdFWF9PTUlUID0gL1xzKyg/OiMuKik/L2c7CiAgTVVMVElMSU5FUiA9IC9cbi9nOwogIEhFUkVET0NfSU5ERU5UID0gL1xuKyhbXlxuXFNdKikvZzsKICBIRVJFRE9DX0lMTEVHQUwgPSAvXCpcLy87CiAgQVNTSUdORUQgPSAvXlxzKkA/KFskQS1aYS16X11bJFx3XHg3Zi1cdWZmZmZdKnxbJyJdLipbJyJdKVteXG5cU10qP1s6PV1bXjo9Pl0vOwogIExJTkVfQ09OVElOVUVSID0gL15ccyooPzosfFw/P1wuKD8hWy5cZF0pfDo6KS87CiAgVFJBSUxJTkdfU1BBQ0VTID0gL1xzKyQvOwogIE5PX05FV0xJTkUgPSAvXig/OlstKyomfFwvJT08PiEuXFxdWzw+PSZ8XSp8YW5kfG9yfGlzKD86bnQpP3xuKD86b3R8ZXcpfGRlbGV0ZXx0eXBlb2Z8aW5zdGFuY2VvZikkLzsKICBDT01QT1VORF9BU1NJR04gPSBbJy09JywgJys9JywgJy89JywgJyo9JywgJyU9JywgJ3x8PScsICcmJj0nLCAnPz0nLCAnPDw9JywgJz4+PScsICc+Pj49JywgJyY9JywgJ149JywgJ3w9J107CiAgVU5BUlkgPSBbJyEnLCAnficsICdORVcnLCAnVFlQRU9GJywgJ0RFTEVURScsICdETyddOwogIExPR0lDID0gWycmJicsICd8fCcsICcmJywgJ3wnLCAnXiddOwogIFNISUZUID0gWyc8PCcsICc+PicsICc+Pj4nXTsKICBDT01QQVJFID0gWyc9PScsICchPScsICc8JywgJz4nLCAnPD0nLCAnPj0nXTsKICBNQVRIID0gWycqJywgJy8nLCAnJSddOwogIFJFTEFUSU9OID0gWydJTicsICdPRicsICdJTlNUQU5DRU9GJ107CiAgQk9PTCA9IFsnVFJVRScsICdGQUxTRScsICdOVUxMJywgJ1VOREVGSU5FRCddOwogIE5PVF9SRUdFWCA9IFsnTlVNQkVSJywgJ1JFR0VYJywgJ0JPT0wnLCAnKysnLCAnLS0nLCAnXSddOwogIE5PVF9TUEFDRURfUkVHRVggPSBOT1RfUkVHRVguY29uY2F0KCcpJywgJ30nLCAnVEhJUycsICdJREVOVElGSUVSJywgJ1NUUklORycpOwogIENBTExBQkxFID0gWydJREVOVElGSUVSJywgJ1NUUklORycsICdSRUdFWCcsICcpJywgJ10nLCAnfScsICc/JywgJzo6JywgJ0AnLCAnVEhJUycsICdTVVBFUiddOwogIElOREVYQUJMRSA9IENBTExBQkxFLmNvbmNhdCgnTlVNQkVSJywgJ0JPT0wnKTsKICBMSU5FX0JSRUFLID0gWydJTkRFTlQnLCAnT1VUREVOVCcsICdURVJNSU5BVE9SJ107Cn0pOwovKioKICogQ29weXJpZ2h0IChjKSAyMDExIEplcmVteSBBc2hrZW5hcwogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgogKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgogKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CiAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAogKiBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAogKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKICogY29uZGl0aW9uczoKICogCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCiAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgogKiAKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCiAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUwogKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAogKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAogKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCiAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogKi8KCmRlZmluZSgnYWNlL21vZGUvY29mZmVlL3Jld3JpdGVyJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKICAgIAogIHZhciBCQUxBTkNFRF9QQUlSUywgRVhQUkVTU0lPTl9DTE9TRSwgRVhQUkVTU0lPTl9FTkQsIEVYUFJFU1NJT05fU1RBUlQsIElNUExJQ0lUX0JMT0NLLCBJTVBMSUNJVF9DQUxMLCBJTVBMSUNJVF9FTkQsIElNUExJQ0lUX0ZVTkMsIElNUExJQ0lUX1VOU1BBQ0VEX0NBTEwsIElOVkVSU0VTLCBMSU5FQlJFQUtTLCBTSU5HTEVfQ0xPU0VSUywgU0lOR0xFX0xJTkVSUywgbGVmdCwgcml0ZSwgX2ksIF9sZW4sIF9yZWY7CiAgdmFyIF9faW5kZXhPZiA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mIHx8IGZ1bmN0aW9uKGl0ZW0pIHsKICAgIGZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgaWYgKHRoaXNbaV0gPT09IGl0ZW0pIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0sIF9fc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CiAgZXhwb3J0cy5SZXdyaXRlciA9IChmdW5jdGlvbigpIHsKICAgIGZ1bmN0aW9uIFJld3JpdGVyKCkge30KICAgIFJld3JpdGVyLnByb3RvdHlwZS5yZXdyaXRlID0gZnVuY3Rpb24odG9rZW5zKSB7CiAgICAgIHRoaXMudG9rZW5zID0gdG9rZW5zOwogICAgICB0aGlzLnJlbW92ZUxlYWRpbmdOZXdsaW5lcygpOwogICAgICB0aGlzLnJlbW92ZU1pZEV4cHJlc3Npb25OZXdsaW5lcygpOwogICAgICB0aGlzLmNsb3NlT3BlbkNhbGxzKCk7CiAgICAgIHRoaXMuY2xvc2VPcGVuSW5kZXhlcygpOwogICAgICB0aGlzLmFkZEltcGxpY2l0SW5kZW50YXRpb24oKTsKICAgICAgdGhpcy50YWdQb3N0Zml4Q29uZGl0aW9uYWxzKCk7CiAgICAgIHRoaXMuYWRkSW1wbGljaXRCcmFjZXMoKTsKICAgICAgdGhpcy5hZGRJbXBsaWNpdFBhcmVudGhlc2VzKCk7CiAgICAgIHRoaXMuZW5zdXJlQmFsYW5jZShCQUxBTkNFRF9QQUlSUyk7CiAgICAgIHRoaXMucmV3cml0ZUNsb3NpbmdQYXJlbnMoKTsKICAgICAgcmV0dXJuIHRoaXMudG9rZW5zOwogICAgfTsKICAgIFJld3JpdGVyLnByb3RvdHlwZS5zY2FuVG9rZW5zID0gZnVuY3Rpb24oYmxvY2spIHsKICAgICAgdmFyIGksIHRva2VuLCB0b2tlbnM7CiAgICAgIHRva2VucyA9IHRoaXMudG9rZW5zOwogICAgICBpID0gMDsKICAgICAgd2hpbGUgKHRva2VuID0gdG9rZW5zW2ldKSB7CiAgICAgICAgaSArPSBibG9jay5jYWxsKHRoaXMsIHRva2VuLCBpLCB0b2tlbnMpOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfTsKICAgIFJld3JpdGVyLnByb3RvdHlwZS5kZXRlY3RFbmQgPSBmdW5jdGlvbihpLCBjb25kaXRpb24sIGFjdGlvbikgewogICAgICB2YXIgbGV2ZWxzLCB0b2tlbiwgdG9rZW5zLCBfcmVmLCBfcmVmMjsKICAgICAgdG9rZW5zID0gdGhpcy50b2tlbnM7CiAgICAgIGxldmVscyA9IDA7CiAgICAgIHdoaWxlICh0b2tlbiA9IHRva2Vuc1tpXSkgewogICAgICAgIGlmIChsZXZlbHMgPT09IDAgJiYgY29uZGl0aW9uLmNhbGwodGhpcywgdG9rZW4sIGkpKSB7CiAgICAgICAgICByZXR1cm4gYWN0aW9uLmNhbGwodGhpcywgdG9rZW4sIGkpOwogICAgICAgIH0KICAgICAgICBpZiAoIXRva2VuIHx8IGxldmVscyA8IDApIHsKICAgICAgICAgIHJldHVybiBhY3Rpb24uY2FsbCh0aGlzLCB0b2tlbiwgaSAtIDEpOwogICAgICAgIH0KICAgICAgICBpZiAoX3JlZiA9IHRva2VuWzBdLCBfX2luZGV4T2YuY2FsbChFWFBSRVNTSU9OX1NUQVJULCBfcmVmKSA+PSAwKSB7CiAgICAgICAgICBsZXZlbHMgKz0gMTsKICAgICAgICB9IGVsc2UgaWYgKF9yZWYyID0gdG9rZW5bMF0sIF9faW5kZXhPZi5jYWxsKEVYUFJFU1NJT05fRU5ELCBfcmVmMikgPj0gMCkgewogICAgICAgICAgbGV2ZWxzIC09IDE7CiAgICAgICAgfQogICAgICAgIGkgKz0gMTsKICAgICAgfQogICAgICByZXR1cm4gaSAtIDE7CiAgICB9OwogICAgUmV3cml0ZXIucHJvdG90eXBlLnJlbW92ZUxlYWRpbmdOZXdsaW5lcyA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgaSwgdGFnLCBfbGVuLCBfcmVmOwogICAgICBfcmVmID0gdGhpcy50b2tlbnM7CiAgICAgIGZvciAoaSA9IDAsIF9sZW4gPSBfcmVmLmxlbmd0aDsgaSA8IF9sZW47IGkrKykgewogICAgICAgIHRhZyA9IF9yZWZbaV1bMF07CiAgICAgICAgaWYgKHRhZyAhPT0gJ1RFUk1JTkFUT1InKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy50b2tlbnMuc3BsaWNlKDAsIGkpOwogICAgICB9CiAgICB9OwogICAgUmV3cml0ZXIucHJvdG90eXBlLnJlbW92ZU1pZEV4cHJlc3Npb25OZXdsaW5lcyA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5zY2FuVG9rZW5zKGZ1bmN0aW9uKHRva2VuLCBpLCB0b2tlbnMpIHsKICAgICAgICB2YXIgX3JlZjsKICAgICAgICBpZiAoISh0b2tlblswXSA9PT0gJ1RFUk1JTkFUT1InICYmIChfcmVmID0gdGhpcy50YWcoaSArIDEpLCBfX2luZGV4T2YuY2FsbChFWFBSRVNTSU9OX0NMT1NFLCBfcmVmKSA+PSAwKSkpIHsKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICAgICB0b2tlbnMuc3BsaWNlKGksIDEpOwogICAgICAgIHJldHVybiAwOwogICAgICB9KTsKICAgIH07CiAgICBSZXdyaXRlci5wcm90b3R5cGUuY2xvc2VPcGVuQ2FsbHMgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIGFjdGlvbiwgY29uZGl0aW9uOwogICAgICBjb25kaXRpb24gPSBmdW5jdGlvbih0b2tlbiwgaSkgewogICAgICAgIHZhciBfcmVmOwogICAgICAgIHJldHVybiAoKF9yZWYgPSB0b2tlblswXSkgPT09ICcpJyB8fCBfcmVmID09PSAnQ0FMTF9FTkQnKSB8fCB0b2tlblswXSA9PT0gJ09VVERFTlQnICYmIHRoaXMudGFnKGkgLSAxKSA9PT0gJyknOwogICAgICB9OwogICAgICBhY3Rpb24gPSBmdW5jdGlvbih0b2tlbiwgaSkgewogICAgICAgIHJldHVybiB0aGlzLnRva2Vuc1t0b2tlblswXSA9PT0gJ09VVERFTlQnID8gaSAtIDEgOiBpXVswXSA9ICdDQUxMX0VORCc7CiAgICAgIH07CiAgICAgIHJldHVybiB0aGlzLnNjYW5Ub2tlbnMoZnVuY3Rpb24odG9rZW4sIGkpIHsKICAgICAgICBpZiAodG9rZW5bMF0gPT09ICdDQUxMX1NUQVJUJykgewogICAgICAgICAgdGhpcy5kZXRlY3RFbmQoaSArIDEsIGNvbmRpdGlvbiwgYWN0aW9uKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIDE7CiAgICAgIH0pOwogICAgfTsKICAgIFJld3JpdGVyLnByb3RvdHlwZS5jbG9zZU9wZW5JbmRleGVzID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBhY3Rpb24sIGNvbmRpdGlvbjsKICAgICAgY29uZGl0aW9uID0gZnVuY3Rpb24odG9rZW4sIGkpIHsKICAgICAgICB2YXIgX3JlZjsKICAgICAgICByZXR1cm4gKF9yZWYgPSB0b2tlblswXSkgPT09ICddJyB8fCBfcmVmID09PSAnSU5ERVhfRU5EJzsKICAgICAgfTsKICAgICAgYWN0aW9uID0gZnVuY3Rpb24odG9rZW4sIGkpIHsKICAgICAgICByZXR1cm4gdG9rZW5bMF0gPSAnSU5ERVhfRU5EJzsKICAgICAgfTsKICAgICAgcmV0dXJuIHRoaXMuc2NhblRva2VucyhmdW5jdGlvbih0b2tlbiwgaSkgewogICAgICAgIGlmICh0b2tlblswXSA9PT0gJ0lOREVYX1NUQVJUJykgewogICAgICAgICAgdGhpcy5kZXRlY3RFbmQoaSArIDEsIGNvbmRpdGlvbiwgYWN0aW9uKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIDE7CiAgICAgIH0pOwogICAgfTsKICAgIFJld3JpdGVyLnByb3RvdHlwZS5hZGRJbXBsaWNpdEJyYWNlcyA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgYWN0aW9uLCBjb25kaXRpb24sIHN0YWNrLCBzdGFydCwgc3RhcnRJbmRlbnQ7CiAgICAgIHN0YWNrID0gW107CiAgICAgIHN0YXJ0ID0gbnVsbDsKICAgICAgc3RhcnRJbmRlbnQgPSAwOwogICAgICBjb25kaXRpb24gPSBmdW5jdGlvbih0b2tlbiwgaSkgewogICAgICAgIHZhciBvbmUsIHRhZywgdGhyZWUsIHR3bywgX3JlZiwgX3JlZjI7CiAgICAgICAgX3JlZiA9IHRoaXMudG9rZW5zLnNsaWNlKGkgKyAxLCAoaSArIDMgKyAxKSB8fCA5ZTkpLCBvbmUgPSBfcmVmWzBdLCB0d28gPSBfcmVmWzFdLCB0aHJlZSA9IF9yZWZbMl07CiAgICAgICAgaWYgKCdIRVJFQ09NTUVOVCcgPT09IChvbmUgIT0gbnVsbCA/IG9uZVswXSA6IHZvaWQgMCkpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgdGFnID0gdG9rZW5bMF07CiAgICAgICAgcmV0dXJuICgodGFnID09PSAnVEVSTUlOQVRPUicgfHwgdGFnID09PSAnT1VUREVOVCcpICYmICEoKHR3byAhPSBudWxsID8gdHdvWzBdIDogdm9pZCAwKSA9PT0gJzonIHx8IChvbmUgIT0gbnVsbCA/IG9uZVswXSA6IHZvaWQgMCkgPT09ICdAJyAmJiAodGhyZWUgIT0gbnVsbCA/IHRocmVlWzBdIDogdm9pZCAwKSA9PT0gJzonKSkgfHwgKHRhZyA9PT0gJywnICYmIG9uZSAmJiAoKF9yZWYyID0gb25lWzBdKSAhPT0gJ0lERU5USUZJRVInICYmIF9yZWYyICE9PSAnTlVNQkVSJyAmJiBfcmVmMiAhPT0gJ1NUUklORycgJiYgX3JlZjIgIT09ICdAJyAmJiBfcmVmMiAhPT0gJ1RFUk1JTkFUT1InICYmIF9yZWYyICE9PSAnT1VUREVOVCcpKTsKICAgICAgfTsKICAgICAgYWN0aW9uID0gZnVuY3Rpb24odG9rZW4sIGkpIHsKICAgICAgICB2YXIgdG9rOwogICAgICAgIHRvayA9IFsnfScsICd9JywgdG9rZW5bMl1dOwogICAgICAgIHRvay5nZW5lcmF0ZWQgPSB0cnVlOwogICAgICAgIHJldHVybiB0aGlzLnRva2Vucy5zcGxpY2UoaSwgMCwgdG9rKTsKICAgICAgfTsKICAgICAgcmV0dXJuIHRoaXMuc2NhblRva2VucyhmdW5jdGlvbih0b2tlbiwgaSwgdG9rZW5zKSB7CiAgICAgICAgdmFyIGFnbywgaWR4LCB0YWcsIHRvaywgdmFsdWUsIF9yZWYsIF9yZWYyOwogICAgICAgIGlmIChfcmVmID0gKHRhZyA9IHRva2VuWzBdKSwgX19pbmRleE9mLmNhbGwoRVhQUkVTU0lPTl9TVEFSVCwgX3JlZikgPj0gMCkgewogICAgICAgICAgc3RhY2sucHVzaChbKHRhZyA9PT0gJ0lOREVOVCcgJiYgdGhpcy50YWcoaSAtIDEpID09PSAneycgPyAneycgOiB0YWcpLCBpXSk7CiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgaWYgKF9faW5kZXhPZi5jYWxsKEVYUFJFU1NJT05fRU5ELCB0YWcpID49IDApIHsKICAgICAgICAgIHN0YXJ0ID0gc3RhY2sucG9wKCk7CiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgaWYgKCEodGFnID09PSAnOicgJiYgKChhZ28gPSB0aGlzLnRhZyhpIC0gMikpID09PSAnOicgfHwgKChfcmVmMiA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdKSAhPSBudWxsID8gX3JlZjJbMF0gOiB2b2lkIDApICE9PSAneycpKSkgewogICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIHN0YWNrLnB1c2goWyd7J10pOwogICAgICAgIGlkeCA9IGFnbyA9PT0gJ0AnID8gaSAtIDIgOiBpIC0gMTsKICAgICAgICB3aGlsZSAodGhpcy50YWcoaWR4IC0gMikgPT09ICdIRVJFQ09NTUVOVCcpIHsKICAgICAgICAgIGlkeCAtPSAyOwogICAgICAgIH0KICAgICAgICB2YWx1ZSA9IG5ldyBTdHJpbmcoJ3snKTsKICAgICAgICB2YWx1ZS5nZW5lcmF0ZWQgPSB0cnVlOwogICAgICAgIHRvayA9IFsneycsIHZhbHVlLCB0b2tlblsyXV07CiAgICAgICAgdG9rLmdlbmVyYXRlZCA9IHRydWU7CiAgICAgICAgdG9rZW5zLnNwbGljZShpZHgsIDAsIHRvayk7CiAgICAgICAgdGhpcy5kZXRlY3RFbmQoaSArIDIsIGNvbmRpdGlvbiwgYWN0aW9uKTsKICAgICAgICByZXR1cm4gMjsKICAgICAgfSk7CiAgICB9OwogICAgUmV3cml0ZXIucHJvdG90eXBlLmFkZEltcGxpY2l0UGFyZW50aGVzZXMgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIGFjdGlvbiwgbm9DYWxsOwogICAgICBub0NhbGwgPSBmYWxzZTsKICAgICAgYWN0aW9uID0gZnVuY3Rpb24odG9rZW4sIGkpIHsKICAgICAgICB2YXIgaWR4OwogICAgICAgIGlkeCA9IHRva2VuWzBdID09PSAnT1VUREVOVCcgPyBpICsgMSA6IGk7CiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zLnNwbGljZShpZHgsIDAsIFsnQ0FMTF9FTkQnLCAnKScsIHRva2VuWzJdXSk7CiAgICAgIH07CiAgICAgIHJldHVybiB0aGlzLnNjYW5Ub2tlbnMoZnVuY3Rpb24odG9rZW4sIGksIHRva2VucykgewogICAgICAgIHZhciBjYWxsT2JqZWN0LCBjdXJyZW50LCBuZXh0LCBwcmV2LCBzZWVuQ29udHJvbCwgc2VlblNpbmdsZSwgdGFnLCBfcmVmLCBfcmVmMiwgX3JlZjM7CiAgICAgICAgdGFnID0gdG9rZW5bMF07CiAgICAgICAgaWYgKHRhZyA9PT0gJ0NMQVNTJyB8fCB0YWcgPT09ICdJRicpIHsKICAgICAgICAgIG5vQ2FsbCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIF9yZWYgPSB0b2tlbnMuc2xpY2UoaSAtIDEsIChpICsgMSArIDEpIHx8IDllOSksIHByZXYgPSBfcmVmWzBdLCBjdXJyZW50ID0gX3JlZlsxXSwgbmV4dCA9IF9yZWZbMl07CiAgICAgICAgY2FsbE9iamVjdCA9ICFub0NhbGwgJiYgdGFnID09PSAnSU5ERU5UJyAmJiBuZXh0ICYmIG5leHQuZ2VuZXJhdGVkICYmIG5leHRbMF0gPT09ICd7JyAmJiBwcmV2ICYmIChfcmVmMiA9IHByZXZbMF0sIF9faW5kZXhPZi5jYWxsKElNUExJQ0lUX0ZVTkMsIF9yZWYyKSA+PSAwKTsKICAgICAgICBzZWVuU2luZ2xlID0gZmFsc2U7CiAgICAgICAgc2VlbkNvbnRyb2wgPSBmYWxzZTsKICAgICAgICBpZiAoX19pbmRleE9mLmNhbGwoTElORUJSRUFLUywgdGFnKSA+PSAwKSB7CiAgICAgICAgICBub0NhbGwgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKHByZXYgJiYgIXByZXYuc3BhY2VkICYmIHRhZyA9PT0gJz8nKSB7CiAgICAgICAgICB0b2tlbi5jYWxsID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHRva2VuLmZyb21UaGVuKSB7CiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgaWYgKCEoY2FsbE9iamVjdCB8fCAocHJldiAhPSBudWxsID8gcHJldi5zcGFjZWQgOiB2b2lkIDApICYmIChwcmV2LmNhbGwgfHwgKF9yZWYzID0gcHJldlswXSwgX19pbmRleE9mLmNhbGwoSU1QTElDSVRfRlVOQywgX3JlZjMpID49IDApKSAmJiAoX19pbmRleE9mLmNhbGwoSU1QTElDSVRfQ0FMTCwgdGFnKSA+PSAwIHx8ICEodG9rZW4uc3BhY2VkIHx8IHRva2VuLm5ld0xpbmUpICYmIF9faW5kZXhPZi5jYWxsKElNUExJQ0lUX1VOU1BBQ0VEX0NBTEwsIHRhZykgPj0gMCkpKSB7CiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgdG9rZW5zLnNwbGljZShpLCAwLCBbJ0NBTExfU1RBUlQnLCAnKCcsIHRva2VuWzJdXSk7CiAgICAgICAgdGhpcy5kZXRlY3RFbmQoaSArIDEsIGZ1bmN0aW9uKHRva2VuLCBpKSB7CiAgICAgICAgICB2YXIgcG9zdCwgX3JlZjQ7CiAgICAgICAgICB0YWcgPSB0b2tlblswXTsKICAgICAgICAgIGlmICghc2VlblNpbmdsZSAmJiB0b2tlbi5mcm9tVGhlbikgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0YWcgPT09ICdJRicgfHwgdGFnID09PSAnRUxTRScgfHwgdGFnID09PSAnQ0FUQ0gnIHx8IHRhZyA9PT0gJy0+JyB8fCB0YWcgPT09ICc9PicpIHsKICAgICAgICAgICAgc2VlblNpbmdsZSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGFnID09PSAnSUYnIHx8IHRhZyA9PT0gJ0VMU0UnIHx8IHRhZyA9PT0gJ1NXSVRDSCcgfHwgdGFnID09PSAnVFJZJykgewogICAgICAgICAgICBzZWVuQ29udHJvbCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoKHRhZyA9PT0gJy4nIHx8IHRhZyA9PT0gJz8uJyB8fCB0YWcgPT09ICc6OicpICYmIHRoaXMudGFnKGkgLSAxKSA9PT0gJ09VVERFTlQnKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuICF0b2tlbi5nZW5lcmF0ZWQgJiYgdGhpcy50YWcoaSAtIDEpICE9PSAnLCcgJiYgKF9faW5kZXhPZi5jYWxsKElNUExJQ0lUX0VORCwgdGFnKSA+PSAwIHx8ICh0YWcgPT09ICdJTkRFTlQnICYmICFzZWVuQ29udHJvbCkpICYmICh0YWcgIT09ICdJTkRFTlQnIHx8ICh0aGlzLnRhZyhpIC0gMikgIT09ICdDTEFTUycgJiYgKF9yZWY0ID0gdGhpcy50YWcoaSAtIDEpLCBfX2luZGV4T2YuY2FsbChJTVBMSUNJVF9CTE9DSywgX3JlZjQpIDwgMCkgJiYgISgocG9zdCA9IHRoaXMudG9rZW5zW2kgKyAxXSkgJiYgcG9zdC5nZW5lcmF0ZWQgJiYgcG9zdFswXSA9PT0gJ3snKSkpOwogICAgICAgIH0sIGFjdGlvbik7CiAgICAgICAgaWYgKHByZXZbMF0gPT09ICc/JykgewogICAgICAgICAgcHJldlswXSA9ICdGVU5DX0VYSVNUJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIDI7CiAgICAgIH0pOwogICAgfTsKICAgIFJld3JpdGVyLnByb3RvdHlwZS5hZGRJbXBsaWNpdEluZGVudGF0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLnNjYW5Ub2tlbnMoZnVuY3Rpb24odG9rZW4sIGksIHRva2VucykgewogICAgICAgIHZhciBhY3Rpb24sIGNvbmRpdGlvbiwgaW5kZW50LCBvdXRkZW50LCBzdGFydGVyLCB0YWcsIF9yZWYsIF9yZWYyOwogICAgICAgIHRhZyA9IHRva2VuWzBdOwogICAgICAgIGlmICh0YWcgPT09ICdURVJNSU5BVE9SJyAmJiB0aGlzLnRhZyhpICsgMSkgPT09ICdUSEVOJykgewogICAgICAgICAgdG9rZW5zLnNwbGljZShpLCAxKTsKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBpZiAodGFnID09PSAnRUxTRScgJiYgdGhpcy50YWcoaSAtIDEpICE9PSAnT1VUREVOVCcpIHsKICAgICAgICAgIHRva2Vucy5zcGxpY2UuYXBwbHkodG9rZW5zLCBbaSwgMF0uY29uY2F0KF9fc2xpY2UuY2FsbCh0aGlzLmluZGVudGF0aW9uKHRva2VuKSkpKTsKICAgICAgICAgIHJldHVybiAyOwogICAgICAgIH0KICAgICAgICBpZiAodGFnID09PSAnQ0FUQ0gnICYmICgoX3JlZiA9IHRoaXMudGFnKGkgKyAyKSkgPT09ICdPVVRERU5UJyB8fCBfcmVmID09PSAnVEVSTUlOQVRPUicgfHwgX3JlZiA9PT0gJ0ZJTkFMTFknKSkgewogICAgICAgICAgdG9rZW5zLnNwbGljZS5hcHBseSh0b2tlbnMsIFtpICsgMiwgMF0uY29uY2F0KF9fc2xpY2UuY2FsbCh0aGlzLmluZGVudGF0aW9uKHRva2VuKSkpKTsKICAgICAgICAgIHJldHVybiA0OwogICAgICAgIH0KICAgICAgICBpZiAoX19pbmRleE9mLmNhbGwoU0lOR0xFX0xJTkVSUywgdGFnKSA+PSAwICYmIHRoaXMudGFnKGkgKyAxKSAhPT0gJ0lOREVOVCcgJiYgISh0YWcgPT09ICdFTFNFJyAmJiB0aGlzLnRhZyhpICsgMSkgPT09ICdJRicpKSB7CiAgICAgICAgICBzdGFydGVyID0gdGFnOwogICAgICAgICAgX3JlZjIgPSB0aGlzLmluZGVudGF0aW9uKHRva2VuKSwgaW5kZW50ID0gX3JlZjJbMF0sIG91dGRlbnQgPSBfcmVmMlsxXTsKICAgICAgICAgIGlmIChzdGFydGVyID09PSAnVEhFTicpIHsKICAgICAgICAgICAgaW5kZW50LmZyb21UaGVuID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGluZGVudC5nZW5lcmF0ZWQgPSBvdXRkZW50LmdlbmVyYXRlZCA9IHRydWU7CiAgICAgICAgICB0b2tlbnMuc3BsaWNlKGkgKyAxLCAwLCBpbmRlbnQpOwogICAgICAgICAgY29uZGl0aW9uID0gZnVuY3Rpb24odG9rZW4sIGkpIHsKICAgICAgICAgICAgdmFyIF9yZWYzOwogICAgICAgICAgICByZXR1cm4gdG9rZW5bMV0gIT09ICc7JyAmJiAoX3JlZjMgPSB0b2tlblswXSwgX19pbmRleE9mLmNhbGwoU0lOR0xFX0NMT1NFUlMsIF9yZWYzKSA+PSAwKSAmJiAhKHRva2VuWzBdID09PSAnRUxTRScgJiYgKHN0YXJ0ZXIgIT09ICdJRicgJiYgc3RhcnRlciAhPT0gJ1RIRU4nKSk7CiAgICAgICAgICB9OwogICAgICAgICAgYWN0aW9uID0gZnVuY3Rpb24odG9rZW4sIGkpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zLnNwbGljZSgodGhpcy50YWcoaSAtIDEpID09PSAnLCcgPyBpIC0gMSA6IGkpLCAwLCBvdXRkZW50KTsKICAgICAgICAgIH07CiAgICAgICAgICB0aGlzLmRldGVjdEVuZChpICsgMiwgY29uZGl0aW9uLCBhY3Rpb24pOwogICAgICAgICAgaWYgKHRhZyA9PT0gJ1RIRU4nKSB7CiAgICAgICAgICAgIHRva2Vucy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIDE7CiAgICAgIH0pOwogICAgfTsKICAgIFJld3JpdGVyLnByb3RvdHlwZS50YWdQb3N0Zml4Q29uZGl0aW9uYWxzID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBjb25kaXRpb247CiAgICAgIGNvbmRpdGlvbiA9IGZ1bmN0aW9uKHRva2VuLCBpKSB7CiAgICAgICAgdmFyIF9yZWY7CiAgICAgICAgcmV0dXJuIChfcmVmID0gdG9rZW5bMF0pID09PSAnVEVSTUlOQVRPUicgfHwgX3JlZiA9PT0gJ0lOREVOVCc7CiAgICAgIH07CiAgICAgIHJldHVybiB0aGlzLnNjYW5Ub2tlbnMoZnVuY3Rpb24odG9rZW4sIGkpIHsKICAgICAgICB2YXIgb3JpZ2luYWw7CiAgICAgICAgaWYgKHRva2VuWzBdICE9PSAnSUYnKSB7CiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgb3JpZ2luYWwgPSB0b2tlbjsKICAgICAgICB0aGlzLmRldGVjdEVuZChpICsgMSwgY29uZGl0aW9uLCBmdW5jdGlvbih0b2tlbiwgaSkgewogICAgICAgICAgaWYgKHRva2VuWzBdICE9PSAnSU5ERU5UJykgewogICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxbMF0gPSAnUE9TVF8nICsgb3JpZ2luYWxbMF07CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIDE7CiAgICAgIH0pOwogICAgfTsKICAgIFJld3JpdGVyLnByb3RvdHlwZS5lbnN1cmVCYWxhbmNlID0gZnVuY3Rpb24ocGFpcnMpIHsKICAgICAgdmFyIGNsb3NlLCBsZXZlbCwgbGV2ZWxzLCBvcGVuLCBvcGVuTGluZSwgdGFnLCB0b2tlbiwgX2ksIF9qLCBfbGVuLCBfbGVuMiwgX3JlZiwgX3JlZjI7CiAgICAgIGxldmVscyA9IHt9OwogICAgICBvcGVuTGluZSA9IHt9OwogICAgICBfcmVmID0gdGhpcy50b2tlbnM7CiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgewogICAgICAgIHRva2VuID0gX3JlZltfaV07CiAgICAgICAgdGFnID0gdG9rZW5bMF07CiAgICAgICAgZm9yIChfaiA9IDAsIF9sZW4yID0gcGFpcnMubGVuZ3RoOyBfaiA8IF9sZW4yOyBfaisrKSB7CiAgICAgICAgICBfcmVmMiA9IHBhaXJzW19qXSwgb3BlbiA9IF9yZWYyWzBdLCBjbG9zZSA9IF9yZWYyWzFdOwogICAgICAgICAgbGV2ZWxzW29wZW5dIHw9IDA7CiAgICAgICAgICBpZiAodGFnID09PSBvcGVuKSB7CiAgICAgICAgICAgIGlmIChsZXZlbHNbb3Blbl0rKyA9PT0gMCkgewogICAgICAgICAgICAgIG9wZW5MaW5lW29wZW5dID0gdG9rZW5bMl07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAodGFnID09PSBjbG9zZSAmJiAtLWxldmVsc1tvcGVuXSA8IDApIHsKICAgICAgICAgICAgdGhyb3cgRXJyb3IoInRvbyBtYW55ICIgKyB0b2tlblsxXSArICIgb24gbGluZSAiICsgKHRva2VuWzJdICsgMSkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKG9wZW4gaW4gbGV2ZWxzKSB7CiAgICAgICAgbGV2ZWwgPSBsZXZlbHNbb3Blbl07CiAgICAgICAgaWYgKGxldmVsID4gMCkgewogICAgICAgICAgdGhyb3cgRXJyb3IoInVuY2xvc2VkICIgKyBvcGVuICsgIiBvbiBsaW5lICIgKyAob3BlbkxpbmVbb3Blbl0gKyAxKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIFJld3JpdGVyLnByb3RvdHlwZS5yZXdyaXRlQ2xvc2luZ1BhcmVucyA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgZGVidCwga2V5LCBzdGFjazsKICAgICAgc3RhY2sgPSBbXTsKICAgICAgZGVidCA9IHt9OwogICAgICBmb3IgKGtleSBpbiBJTlZFUlNFUykgewogICAgICAgIGRlYnRba2V5XSA9IDA7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuc2NhblRva2VucyhmdW5jdGlvbih0b2tlbiwgaSwgdG9rZW5zKSB7CiAgICAgICAgdmFyIGludiwgbWF0Y2gsIG10YWcsIG9wcG9zLCB0YWcsIHZhbCwgX3JlZjsKICAgICAgICBpZiAoX3JlZiA9ICh0YWcgPSB0b2tlblswXSksIF9faW5kZXhPZi5jYWxsKEVYUFJFU1NJT05fU1RBUlQsIF9yZWYpID49IDApIHsKICAgICAgICAgIHN0YWNrLnB1c2godG9rZW4pOwogICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIGlmIChfX2luZGV4T2YuY2FsbChFWFBSRVNTSU9OX0VORCwgdGFnKSA8IDApIHsKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICAgICBpZiAoZGVidFtpbnYgPSBJTlZFUlNFU1t0YWddXSA+IDApIHsKICAgICAgICAgIGRlYnRbaW52XSAtPSAxOwogICAgICAgICAgdG9rZW5zLnNwbGljZShpLCAxKTsKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBtYXRjaCA9IHN0YWNrLnBvcCgpOwogICAgICAgIG10YWcgPSBtYXRjaFswXTsKICAgICAgICBvcHBvcyA9IElOVkVSU0VTW210YWddOwogICAgICAgIGlmICh0YWcgPT09IG9wcG9zKSB7CiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgZGVidFttdGFnXSArPSAxOwogICAgICAgIHZhbCA9IFtvcHBvcywgbXRhZyA9PT0gJ0lOREVOVCcgPyBtYXRjaFsxXSA6IG9wcG9zXTsKICAgICAgICBpZiAodGhpcy50YWcoaSArIDIpID09PSBtdGFnKSB7CiAgICAgICAgICB0b2tlbnMuc3BsaWNlKGkgKyAzLCAwLCB2YWwpOwogICAgICAgICAgc3RhY2sucHVzaChtYXRjaCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRva2Vucy5zcGxpY2UoaSwgMCwgdmFsKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIDE7CiAgICAgIH0pOwogICAgfTsKICAgIFJld3JpdGVyLnByb3RvdHlwZS5pbmRlbnRhdGlvbiA9IGZ1bmN0aW9uKHRva2VuKSB7CiAgICAgIHJldHVybiBbWydJTkRFTlQnLCAyLCB0b2tlblsyXV0sIFsnT1VUREVOVCcsIDIsIHRva2VuWzJdXV07CiAgICB9OwogICAgUmV3cml0ZXIucHJvdG90eXBlLnRhZyA9IGZ1bmN0aW9uKGkpIHsKICAgICAgdmFyIF9yZWY7CiAgICAgIHJldHVybiAoX3JlZiA9IHRoaXMudG9rZW5zW2ldKSAhPSBudWxsID8gX3JlZlswXSA6IHZvaWQgMDsKICAgIH07CiAgICByZXR1cm4gUmV3cml0ZXI7CiAgfSkoKTsKICBCQUxBTkNFRF9QQUlSUyA9IFtbJygnLCAnKSddLCBbJ1snLCAnXSddLCBbJ3snLCAnfSddLCBbJ0lOREVOVCcsICdPVVRERU5UJ10sIFsnQ0FMTF9TVEFSVCcsICdDQUxMX0VORCddLCBbJ1BBUkFNX1NUQVJUJywgJ1BBUkFNX0VORCddLCBbJ0lOREVYX1NUQVJUJywgJ0lOREVYX0VORCddXTsKICBJTlZFUlNFUyA9IHt9OwogIEVYUFJFU1NJT05fU1RBUlQgPSBbXTsKICBFWFBSRVNTSU9OX0VORCA9IFtdOwogIGZvciAoX2kgPSAwLCBfbGVuID0gQkFMQU5DRURfUEFJUlMubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsKICAgIF9yZWYgPSBCQUxBTkNFRF9QQUlSU1tfaV0sIGxlZnQgPSBfcmVmWzBdLCByaXRlID0gX3JlZlsxXTsKICAgIEVYUFJFU1NJT05fU1RBUlQucHVzaChJTlZFUlNFU1tyaXRlXSA9IGxlZnQpOwogICAgRVhQUkVTU0lPTl9FTkQucHVzaChJTlZFUlNFU1tsZWZ0XSA9IHJpdGUpOwogIH0KICBFWFBSRVNTSU9OX0NMT1NFID0gWydDQVRDSCcsICdXSEVOJywgJ0VMU0UnLCAnRklOQUxMWSddLmNvbmNhdChFWFBSRVNTSU9OX0VORCk7CiAgSU1QTElDSVRfRlVOQyA9IFsnSURFTlRJRklFUicsICdTVVBFUicsICcpJywgJ0NBTExfRU5EJywgJ10nLCAnSU5ERVhfRU5EJywgJ0AnLCAnVEhJUyddOwogIElNUExJQ0lUX0NBTEwgPSBbJ0lERU5USUZJRVInLCAnTlVNQkVSJywgJ1NUUklORycsICdKUycsICdSRUdFWCcsICdORVcnLCAnUEFSQU1fU1RBUlQnLCAnQ0xBU1MnLCAnSUYnLCAnVFJZJywgJ1NXSVRDSCcsICdUSElTJywgJ0JPT0wnLCAnVU5BUlknLCAnU1VQRVInLCAnQCcsICctPicsICc9PicsICdbJywgJygnLCAneycsICctLScsICcrKyddOwogIElNUExJQ0lUX1VOU1BBQ0VEX0NBTEwgPSBbJysnLCAnLSddOwogIElNUExJQ0lUX0JMT0NLID0gWyctPicsICc9PicsICd7JywgJ1snLCAnLCddOwogIElNUExJQ0lUX0VORCA9IFsnUE9TVF9JRicsICdGT1InLCAnV0hJTEUnLCAnVU5USUwnLCAnV0hFTicsICdCWScsICdMT09QJywgJ1RFUk1JTkFUT1InXTsKICBTSU5HTEVfTElORVJTID0gWydFTFNFJywgJy0+JywgJz0+JywgJ1RSWScsICdGSU5BTExZJywgJ1RIRU4nXTsKICBTSU5HTEVfQ0xPU0VSUyA9IFsnVEVSTUlOQVRPUicsICdDQVRDSCcsICdGSU5BTExZJywgJ0VMU0UnLCAnT1VUREVOVCcsICdMRUFESU5HX1dIRU4nXTsKICBMSU5FQlJFQUtTID0gWydURVJNSU5BVE9SJywgJ0lOREVOVCcsICdPVVRERU5UJ107Cn0pOwovKioKICogQ29weXJpZ2h0IChjKSAyMDExIEplcmVteSBBc2hrZW5hcwogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgogKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgogKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CiAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAogKiBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAogKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKICogY29uZGl0aW9uczoKICogCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCiAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgogKiAKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCiAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUwogKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAogKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAogKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCiAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogKi8KCmRlZmluZSgnYWNlL21vZGUvY29mZmVlL2hlbHBlcnMnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewogICAgCiAgdmFyIGV4dGVuZCwgZmxhdHRlbjsKICBleHBvcnRzLnN0YXJ0cyA9IGZ1bmN0aW9uKHN0cmluZywgbGl0ZXJhbCwgc3RhcnQpIHsKICAgIHJldHVybiBsaXRlcmFsID09PSBzdHJpbmcuc3Vic3RyKHN0YXJ0LCBsaXRlcmFsLmxlbmd0aCk7CiAgfTsKICBleHBvcnRzLmVuZHMgPSBmdW5jdGlvbihzdHJpbmcsIGxpdGVyYWwsIGJhY2spIHsKICAgIHZhciBsZW47CiAgICBsZW4gPSBsaXRlcmFsLmxlbmd0aDsKICAgIHJldHVybiBsaXRlcmFsID09PSBzdHJpbmcuc3Vic3RyKHN0cmluZy5sZW5ndGggLSBsZW4gLSAoYmFjayB8fCAwKSwgbGVuKTsKICB9OwogIGV4cG9ydHMuY29tcGFjdCA9IGZ1bmN0aW9uKGFycmF5KSB7CiAgICB2YXIgaXRlbSwgX2ksIF9sZW4sIF9yZXN1bHRzOwogICAgX3Jlc3VsdHMgPSBbXTsKICAgIGZvciAoX2kgPSAwLCBfbGVuID0gYXJyYXkubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsKICAgICAgaXRlbSA9IGFycmF5W19pXTsKICAgICAgaWYgKGl0ZW0pIHsKICAgICAgICBfcmVzdWx0cy5wdXNoKGl0ZW0pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gX3Jlc3VsdHM7CiAgfTsKICBleHBvcnRzLmNvdW50ID0gZnVuY3Rpb24oc3RyaW5nLCBzdWJzdHIpIHsKICAgIHZhciBudW0sIHBvczsKICAgIG51bSA9IHBvcyA9IDA7CiAgICBpZiAoIXN1YnN0ci5sZW5ndGgpIHsKICAgICAgcmV0dXJuIDEgLyAwOwogICAgfQogICAgd2hpbGUgKHBvcyA9IDEgKyBzdHJpbmcuaW5kZXhPZihzdWJzdHIsIHBvcykpIHsKICAgICAgbnVtKys7CiAgICB9CiAgICByZXR1cm4gbnVtOwogIH07CiAgZXhwb3J0cy5tZXJnZSA9IGZ1bmN0aW9uKG9wdGlvbnMsIG92ZXJyaWRlcykgewogICAgcmV0dXJuIGV4dGVuZChleHRlbmQoe30sIG9wdGlvbnMpLCBvdmVycmlkZXMpOwogIH07CiAgZXh0ZW5kID0gZXhwb3J0cy5leHRlbmQgPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnRpZXMpIHsKICAgIHZhciBrZXksIHZhbDsKICAgIGZvciAoa2V5IGluIHByb3BlcnRpZXMpIHsKICAgICAgdmFsID0gcHJvcGVydGllc1trZXldOwogICAgICBvYmplY3Rba2V5XSA9IHZhbDsKICAgIH0KICAgIHJldHVybiBvYmplY3Q7CiAgfTsKICBleHBvcnRzLmZsYXR0ZW4gPSBmbGF0dGVuID0gZnVuY3Rpb24oYXJyYXkpIHsKICAgIHZhciBlbGVtZW50LCBmbGF0dGVuZWQsIF9pLCBfbGVuOwogICAgZmxhdHRlbmVkID0gW107CiAgICBmb3IgKF9pID0gMCwgX2xlbiA9IGFycmF5Lmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7CiAgICAgIGVsZW1lbnQgPSBhcnJheVtfaV07CiAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICBmbGF0dGVuZWQgPSBmbGF0dGVuZWQuY29uY2F0KGZsYXR0ZW4oZWxlbWVudCkpOwogICAgICB9IGVsc2UgewogICAgICAgIGZsYXR0ZW5lZC5wdXNoKGVsZW1lbnQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmxhdHRlbmVkOwogIH07CiAgZXhwb3J0cy5kZWwgPSBmdW5jdGlvbihvYmosIGtleSkgewogICAgdmFyIHZhbDsKICAgIHZhbCA9IG9ialtrZXldOwogICAgZGVsZXRlIG9ialtrZXldOwogICAgcmV0dXJuIHZhbDsKICB9OwogIGV4cG9ydHMubGFzdCA9IGZ1bmN0aW9uKGFycmF5LCBiYWNrKSB7CiAgICByZXR1cm4gYXJyYXlbYXJyYXkubGVuZ3RoIC0gKGJhY2sgfHwgMCkgLSAxXTsKICB9Owp9KTsKLyoqCiAqIENvcHlyaWdodCAoYykgMjAxMSBKZXJlbXkgQXNoa2VuYXMKICoKICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAogKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKICogY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCiAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCiAqIGNvbmRpdGlvbnM6CiAqIAogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQogKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KICogCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAogKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKICogT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKICogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCiAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORwogKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCiAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICovCgpkZWZpbmUoJ2FjZS9tb2RlL2NvZmZlZS9wYXJzZXInLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoKLyogSmlzb24gZ2VuZXJhdGVkIHBhcnNlciAqLwp2YXIgcGFyc2VyID0ge3RyYWNlOiBmdW5jdGlvbiB0cmFjZSgpIHsgfSwKeXk6IHt9LApzeW1ib2xzXzogeyJlcnJvciI6MiwiUm9vdCI6MywiQm9keSI6NCwiQmxvY2siOjUsIlRFUk1JTkFUT1IiOjYsIkxpbmUiOjcsIkV4cHJlc3Npb24iOjgsIlN0YXRlbWVudCI6OSwiUmV0dXJuIjoxMCwiVGhyb3ciOjExLCJDb21tZW50IjoxMiwiU1RBVEVNRU5UIjoxMywiVmFsdWUiOjE0LCJJbnZvY2F0aW9uIjoxNSwiQ29kZSI6MTYsIk9wZXJhdGlvbiI6MTcsIkFzc2lnbiI6MTgsIklmIjoxOSwiVHJ5IjoyMCwiV2hpbGUiOjIxLCJGb3IiOjIyLCJTd2l0Y2giOjIzLCJDbGFzcyI6MjQsIklOREVOVCI6MjUsIk9VVERFTlQiOjI2LCJJZGVudGlmaWVyIjoyNywiSURFTlRJRklFUiI6MjgsIkFscGhhTnVtZXJpYyI6MjksIk5VTUJFUiI6MzAsIlNUUklORyI6MzEsIkxpdGVyYWwiOjMyLCJKUyI6MzMsIlJFR0VYIjozNCwiQk9PTCI6MzUsIkFzc2lnbmFibGUiOjM2LCI9IjozNywiQXNzaWduT2JqIjozOCwiT2JqQXNzaWduYWJsZSI6MzksIjoiOjQwLCJUaGlzUHJvcGVydHkiOjQxLCJSRVRVUk4iOjQyLCJIRVJFQ09NTUVOVCI6NDMsIlBBUkFNX1NUQVJUIjo0NCwiUGFyYW1MaXN0Ijo0NSwiUEFSQU1fRU5EIjo0NiwiRnVuY0dseXBoIjo0NywiLT4iOjQ4LCI9PiI6NDksIk9wdENvbW1hIjo1MCwiLCI6NTEsIlBhcmFtIjo1MiwiUGFyYW1WYXIiOjUzLCIuLi4iOjU0LCJBcnJheSI6NTUsIk9iamVjdCI6NTYsIlNwbGF0Ijo1NywiU2ltcGxlQXNzaWduYWJsZSI6NTgsIkFjY2Vzc29yIjo1OSwiUGFyZW50aGV0aWNhbCI6NjAsIlJhbmdlIjo2MSwiVGhpcyI6NjIsIi4iOjYzLCI/LiI6NjQsIjo6Ijo2NSwiSW5kZXgiOjY2LCJJTkRFWF9TVEFSVCI6NjcsIkluZGV4VmFsdWUiOjY4LCJJTkRFWF9FTkQiOjY5LCJJTkRFWF9TT0FLIjo3MCwiSU5ERVhfUFJPVE8iOjcxLCJTbGljZSI6NzIsInsiOjczLCJBc3NpZ25MaXN0Ijo3NCwifSI6NzUsIkNMQVNTIjo3NiwiRVhURU5EUyI6NzcsIk9wdEZ1bmNFeGlzdCI6NzgsIkFyZ3VtZW50cyI6NzksIlNVUEVSIjo4MCwiRlVOQ19FWElTVCI6ODEsIkNBTExfU1RBUlQiOjgyLCJDQUxMX0VORCI6ODMsIkFyZ0xpc3QiOjg0LCJUSElTIjo4NSwiQCI6ODYsIlsiOjg3LCJdIjo4OCwiUmFuZ2VEb3RzIjo4OSwiLi4iOjkwLCJBcmciOjkxLCJTaW1wbGVBcmdzIjo5MiwiVFJZIjo5MywiQ2F0Y2giOjk0LCJGSU5BTExZIjo5NSwiQ0FUQ0giOjk2LCJUSFJPVyI6OTcsIigiOjk4LCIpIjo5OSwiV2hpbGVTb3VyY2UiOjEwMCwiV0hJTEUiOjEwMSwiV0hFTiI6MTAyLCJVTlRJTCI6MTAzLCJMb29wIjoxMDQsIkxPT1AiOjEwNSwiRm9yQm9keSI6MTA2LCJGT1IiOjEwNywiRm9yU3RhcnQiOjEwOCwiRm9yU291cmNlIjoxMDksIkZvclZhcmlhYmxlcyI6MTEwLCJPV04iOjExMSwiRm9yVmFsdWUiOjExMiwiRk9SSU4iOjExMywiRk9ST0YiOjExNCwiQlkiOjExNSwiU1dJVENIIjoxMTYsIldoZW5zIjoxMTcsIkVMU0UiOjExOCwiV2hlbiI6MTE5LCJMRUFESU5HX1dIRU4iOjEyMCwiSWZCbG9jayI6MTIxLCJJRiI6MTIyLCJQT1NUX0lGIjoxMjMsIlVOQVJZIjoxMjQsIi0iOjEyNSwiKyI6MTI2LCItLSI6MTI3LCIrKyI6MTI4LCI/IjoxMjksIk1BVEgiOjEzMCwiU0hJRlQiOjEzMSwiQ09NUEFSRSI6MTMyLCJMT0dJQyI6MTMzLCJSRUxBVElPTiI6MTM0LCJDT01QT1VORF9BU1NJR04iOjEzNSwiJGFjY2VwdCI6MCwiJGVuZCI6MX0sCnRlcm1pbmFsc186IHsyOiJlcnJvciIsNjoiVEVSTUlOQVRPUiIsMTM6IlNUQVRFTUVOVCIsMjU6IklOREVOVCIsMjY6Ik9VVERFTlQiLDI4OiJJREVOVElGSUVSIiwzMDoiTlVNQkVSIiwzMToiU1RSSU5HIiwzMzoiSlMiLDM0OiJSRUdFWCIsMzU6IkJPT0wiLDM3OiI9Iiw0MDoiOiIsNDI6IlJFVFVSTiIsNDM6IkhFUkVDT01NRU5UIiw0NDoiUEFSQU1fU1RBUlQiLDQ2OiJQQVJBTV9FTkQiLDQ4OiItPiIsNDk6Ij0+Iiw1MToiLCIsNTQ6Ii4uLiIsNjM6Ii4iLDY0OiI/LiIsNjU6Ijo6Iiw2NzoiSU5ERVhfU1RBUlQiLDY5OiJJTkRFWF9FTkQiLDcwOiJJTkRFWF9TT0FLIiw3MToiSU5ERVhfUFJPVE8iLDczOiJ7Iiw3NToifSIsNzY6IkNMQVNTIiw3NzoiRVhURU5EUyIsODA6IlNVUEVSIiw4MToiRlVOQ19FWElTVCIsODI6IkNBTExfU1RBUlQiLDgzOiJDQUxMX0VORCIsODU6IlRISVMiLDg2OiJAIiw4NzoiWyIsODg6Il0iLDkwOiIuLiIsOTM6IlRSWSIsOTU6IkZJTkFMTFkiLDk2OiJDQVRDSCIsOTc6IlRIUk9XIiw5ODoiKCIsOTk6IikiLDEwMToiV0hJTEUiLDEwMjoiV0hFTiIsMTAzOiJVTlRJTCIsMTA1OiJMT09QIiwxMDc6IkZPUiIsMTExOiJPV04iLDExMzoiRk9SSU4iLDExNDoiRk9ST0YiLDExNToiQlkiLDExNjoiU1dJVENIIiwxMTg6IkVMU0UiLDEyMDoiTEVBRElOR19XSEVOIiwxMjI6IklGIiwxMjM6IlBPU1RfSUYiLDEyNDoiVU5BUlkiLDEyNToiLSIsMTI2OiIrIiwxMjc6Ii0tIiwxMjg6IisrIiwxMjk6Ij8iLDEzMDoiTUFUSCIsMTMxOiJTSElGVCIsMTMyOiJDT01QQVJFIiwxMzM6IkxPR0lDIiwxMzQ6IlJFTEFUSU9OIiwxMzU6IkNPTVBPVU5EX0FTU0lHTiJ9LApwcm9kdWN0aW9uc186IFswLFszLDBdLFszLDFdLFszLDJdLFs0LDFdLFs0LDNdLFs0LDJdLFs3LDFdLFs3LDFdLFs5LDFdLFs5LDFdLFs5LDFdLFs5LDFdLFs4LDFdLFs4LDFdLFs4LDFdLFs4LDFdLFs4LDFdLFs4LDFdLFs4LDFdLFs4LDFdLFs4LDFdLFs4LDFdLFs4LDFdLFs1LDJdLFs1LDNdLFsyNywxXSxbMjksMV0sWzI5LDFdLFszMiwxXSxbMzIsMV0sWzMyLDFdLFszMiwxXSxbMTgsM10sWzE4LDVdLFszOCwxXSxbMzgsM10sWzM4LDVdLFszOCwxXSxbMzksMV0sWzM5LDFdLFszOSwxXSxbMTAsMl0sWzEwLDFdLFsxMiwxXSxbMTYsNV0sWzE2LDJdLFs0NywxXSxbNDcsMV0sWzUwLDBdLFs1MCwxXSxbNDUsMF0sWzQ1LDFdLFs0NSwzXSxbNTIsMV0sWzUyLDJdLFs1MiwzXSxbNTMsMV0sWzUzLDFdLFs1MywxXSxbNTMsMV0sWzU3LDJdLFs1OCwxXSxbNTgsMl0sWzU4LDJdLFs1OCwxXSxbMzYsMV0sWzM2LDFdLFszNiwxXSxbMTQsMV0sWzE0LDFdLFsxNCwxXSxbMTQsMV0sWzE0LDFdLFs1OSwyXSxbNTksMl0sWzU5LDJdLFs1OSwxXSxbNTksMV0sWzY2LDNdLFs2NiwyXSxbNjYsMl0sWzY4LDFdLFs2OCwxXSxbNTYsNF0sWzc0LDBdLFs3NCwxXSxbNzQsM10sWzc0LDRdLFs3NCw2XSxbMjQsMV0sWzI0LDJdLFsyNCwzXSxbMjQsNF0sWzI0LDJdLFsyNCwzXSxbMjQsNF0sWzI0LDVdLFsxNSwzXSxbMTUsM10sWzE1LDFdLFsxNSwyXSxbNzgsMF0sWzc4LDFdLFs3OSwyXSxbNzksNF0sWzYyLDFdLFs2MiwxXSxbNDEsMl0sWzU1LDJdLFs1NSw0XSxbODksMV0sWzg5LDFdLFs2MSw1XSxbNzIsM10sWzcyLDJdLFs3MiwyXSxbODQsMV0sWzg0LDNdLFs4NCw0XSxbODQsNF0sWzg0LDZdLFs5MSwxXSxbOTEsMV0sWzkyLDFdLFs5MiwzXSxbMjAsMl0sWzIwLDNdLFsyMCw0XSxbMjAsNV0sWzk0LDNdLFsxMSwyXSxbNjAsM10sWzYwLDVdLFsxMDAsMl0sWzEwMCw0XSxbMTAwLDJdLFsxMDAsNF0sWzIxLDJdLFsyMSwyXSxbMjEsMl0sWzIxLDFdLFsxMDQsMl0sWzEwNCwyXSxbMjIsMl0sWzIyLDJdLFsyMiwyXSxbMTA2LDJdLFsxMDYsMl0sWzEwOCwyXSxbMTA4LDNdLFsxMTIsMV0sWzExMiwxXSxbMTEyLDFdLFsxMTAsMV0sWzExMCwzXSxbMTA5LDJdLFsxMDksMl0sWzEwOSw0XSxbMTA5LDRdLFsxMDksNF0sWzEwOSw2XSxbMTA5LDZdLFsyMyw1XSxbMjMsN10sWzIzLDRdLFsyMyw2XSxbMTE3LDFdLFsxMTcsMl0sWzExOSwzXSxbMTE5LDRdLFsxMjEsM10sWzEyMSw1XSxbMTksMV0sWzE5LDNdLFsxOSwzXSxbMTksM10sWzE3LDJdLFsxNywyXSxbMTcsMl0sWzE3LDJdLFsxNywyXSxbMTcsMl0sWzE3LDJdLFsxNywyXSxbMTcsM10sWzE3LDNdLFsxNywzXSxbMTcsM10sWzE3LDNdLFsxNywzXSxbMTcsM10sWzE3LDNdLFsxNyw1XSxbMTcsM11dLApwZXJmb3JtQWN0aW9uOiBmdW5jdGlvbiBhbm9ueW1vdXMoeXl0ZXh0LHl5bGVuZyx5eWxpbmVubyx5eSx5eXN0YXRlLCQkLF8kKSB7Cgp2YXIgJDAgPSAkJC5sZW5ndGggLSAxOwpzd2l0Y2ggKHl5c3RhdGUpIHsKY2FzZSAxOnJldHVybiB0aGlzLiQgPSBuZXcgeXkuQmxvY2s7CmJyZWFrOwpjYXNlIDI6cmV0dXJuIHRoaXMuJCA9ICQkWyQwXTsKYnJlYWs7CmNhc2UgMzpyZXR1cm4gdGhpcy4kID0gJCRbJDAtMV07CmJyZWFrOwpjYXNlIDQ6dGhpcy4kID0geXkuQmxvY2sud3JhcChbJCRbJDBdXSk7CmJyZWFrOwpjYXNlIDU6dGhpcy4kID0gJCRbJDAtMl0ucHVzaCgkJFskMF0pOwpicmVhazsKY2FzZSA2OnRoaXMuJCA9ICQkWyQwLTFdOwpicmVhazsKY2FzZSA3OnRoaXMuJCA9ICQkWyQwXTsKYnJlYWs7CmNhc2UgODp0aGlzLiQgPSAkJFskMF07CmJyZWFrOwpjYXNlIDk6dGhpcy4kID0gJCRbJDBdOwpicmVhazsKY2FzZSAxMDp0aGlzLiQgPSAkJFskMF07CmJyZWFrOwpjYXNlIDExOnRoaXMuJCA9ICQkWyQwXTsKYnJlYWs7CmNhc2UgMTI6dGhpcy4kID0gbmV3IHl5LkxpdGVyYWwoJCRbJDBdKTsKYnJlYWs7CmNhc2UgMTM6dGhpcy4kID0gJCRbJDBdOwpicmVhazsKY2FzZSAxNDp0aGlzLiQgPSAkJFskMF07CmJyZWFrOwpjYXNlIDE1OnRoaXMuJCA9ICQkWyQwXTsKYnJlYWs7CmNhc2UgMTY6dGhpcy4kID0gJCRbJDBdOwpicmVhazsKY2FzZSAxNzp0aGlzLiQgPSAkJFskMF07CmJyZWFrOwpjYXNlIDE4OnRoaXMuJCA9ICQkWyQwXTsKYnJlYWs7CmNhc2UgMTk6dGhpcy4kID0gJCRbJDBdOwpicmVhazsKY2FzZSAyMDp0aGlzLiQgPSAkJFskMF07CmJyZWFrOwpjYXNlIDIxOnRoaXMuJCA9ICQkWyQwXTsKYnJlYWs7CmNhc2UgMjI6dGhpcy4kID0gJCRbJDBdOwpicmVhazsKY2FzZSAyMzp0aGlzLiQgPSAkJFskMF07CmJyZWFrOwpjYXNlIDI0OnRoaXMuJCA9IG5ldyB5eS5CbG9jazsKYnJlYWs7CmNhc2UgMjU6dGhpcy4kID0gJCRbJDAtMV07CmJyZWFrOwpjYXNlIDI2OnRoaXMuJCA9IG5ldyB5eS5MaXRlcmFsKCQkWyQwXSk7CmJyZWFrOwpjYXNlIDI3OnRoaXMuJCA9IG5ldyB5eS5MaXRlcmFsKCQkWyQwXSk7CmJyZWFrOwpjYXNlIDI4OnRoaXMuJCA9IG5ldyB5eS5MaXRlcmFsKCQkWyQwXSk7CmJyZWFrOwpjYXNlIDI5OnRoaXMuJCA9ICQkWyQwXTsKYnJlYWs7CmNhc2UgMzA6dGhpcy4kID0gbmV3IHl5LkxpdGVyYWwoJCRbJDBdKTsKYnJlYWs7CmNhc2UgMzE6dGhpcy4kID0gbmV3IHl5LkxpdGVyYWwoJCRbJDBdKTsKYnJlYWs7CmNhc2UgMzI6dGhpcy4kID0gKGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgdmFsOwogICAgICAgIHZhbCA9IG5ldyB5eS5MaXRlcmFsKCQkWyQwXSk7CiAgICAgICAgaWYgKCQkWyQwXSA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgIHZhbC5pc1VuZGVmaW5lZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWw7CiAgICAgIH0oKSk7CmJyZWFrOwpjYXNlIDMzOnRoaXMuJCA9IG5ldyB5eS5Bc3NpZ24oJCRbJDAtMl0sICQkWyQwXSk7CmJyZWFrOwpjYXNlIDM0OnRoaXMuJCA9IG5ldyB5eS5Bc3NpZ24oJCRbJDAtNF0sICQkWyQwLTFdKTsKYnJlYWs7CmNhc2UgMzU6dGhpcy4kID0gbmV3IHl5LlZhbHVlKCQkWyQwXSk7CmJyZWFrOwpjYXNlIDM2OnRoaXMuJCA9IG5ldyB5eS5Bc3NpZ24obmV3IHl5LlZhbHVlKCQkWyQwLTJdKSwgJCRbJDBdLCAnb2JqZWN0Jyk7CmJyZWFrOwpjYXNlIDM3OnRoaXMuJCA9IG5ldyB5eS5Bc3NpZ24obmV3IHl5LlZhbHVlKCQkWyQwLTRdKSwgJCRbJDAtMV0sICdvYmplY3QnKTsKYnJlYWs7CmNhc2UgMzg6dGhpcy4kID0gJCRbJDBdOwpicmVhazsKY2FzZSAzOTp0aGlzLiQgPSAkJFskMF07CmJyZWFrOwpjYXNlIDQwOnRoaXMuJCA9ICQkWyQwXTsKYnJlYWs7CmNhc2UgNDE6dGhpcy4kID0gJCRbJDBdOwpicmVhazsKY2FzZSA0Mjp0aGlzLiQgPSBuZXcgeXkuUmV0dXJuKCQkWyQwXSk7CmJyZWFrOwpjYXNlIDQzOnRoaXMuJCA9IG5ldyB5eS5SZXR1cm47CmJyZWFrOwpjYXNlIDQ0OnRoaXMuJCA9IG5ldyB5eS5Db21tZW50KCQkWyQwXSk7CmJyZWFrOwpjYXNlIDQ1OnRoaXMuJCA9IG5ldyB5eS5Db2RlKCQkWyQwLTNdLCAkJFskMF0sICQkWyQwLTFdKTsKYnJlYWs7CmNhc2UgNDY6dGhpcy4kID0gbmV3IHl5LkNvZGUoW10sICQkWyQwXSwgJCRbJDAtMV0pOwpicmVhazsKY2FzZSA0Nzp0aGlzLiQgPSAnZnVuYyc7CmJyZWFrOwpjYXNlIDQ4OnRoaXMuJCA9ICdib3VuZGZ1bmMnOwpicmVhazsKY2FzZSA0OTp0aGlzLiQgPSAkJFskMF07CmJyZWFrOwpjYXNlIDUwOnRoaXMuJCA9ICQkWyQwXTsKYnJlYWs7CmNhc2UgNTE6dGhpcy4kID0gW107CmJyZWFrOwpjYXNlIDUyOnRoaXMuJCA9IFskJFskMF1dOwpicmVhazsKY2FzZSA1Mzp0aGlzLiQgPSAkJFskMC0yXS5jb25jYXQoJCRbJDBdKTsKYnJlYWs7CmNhc2UgNTQ6dGhpcy4kID0gbmV3IHl5LlBhcmFtKCQkWyQwXSk7CmJyZWFrOwpjYXNlIDU1OnRoaXMuJCA9IG5ldyB5eS5QYXJhbSgkJFskMC0xXSwgbnVsbCwgdHJ1ZSk7CmJyZWFrOwpjYXNlIDU2OnRoaXMuJCA9IG5ldyB5eS5QYXJhbSgkJFskMC0yXSwgJCRbJDBdKTsKYnJlYWs7CmNhc2UgNTc6dGhpcy4kID0gJCRbJDBdOwpicmVhazsKY2FzZSA1ODp0aGlzLiQgPSAkJFskMF07CmJyZWFrOwpjYXNlIDU5OnRoaXMuJCA9ICQkWyQwXTsKYnJlYWs7CmNhc2UgNjA6dGhpcy4kID0gJCRbJDBdOwpicmVhazsKY2FzZSA2MTp0aGlzLiQgPSBuZXcgeXkuU3BsYXQoJCRbJDAtMV0pOwpicmVhazsKY2FzZSA2Mjp0aGlzLiQgPSBuZXcgeXkuVmFsdWUoJCRbJDBdKTsKYnJlYWs7CmNhc2UgNjM6dGhpcy4kID0gJCRbJDAtMV0ucHVzaCgkJFskMF0pOwpicmVhazsKY2FzZSA2NDp0aGlzLiQgPSBuZXcgeXkuVmFsdWUoJCRbJDAtMV0sIFskJFskMF1dKTsKYnJlYWs7CmNhc2UgNjU6dGhpcy4kID0gJCRbJDBdOwpicmVhazsKY2FzZSA2Njp0aGlzLiQgPSAkJFskMF07CmJyZWFrOwpjYXNlIDY3OnRoaXMuJCA9IG5ldyB5eS5WYWx1ZSgkJFskMF0pOwpicmVhazsKY2FzZSA2ODp0aGlzLiQgPSBuZXcgeXkuVmFsdWUoJCRbJDBdKTsKYnJlYWs7CmNhc2UgNjk6dGhpcy4kID0gJCRbJDBdOwpicmVhazsKY2FzZSA3MDp0aGlzLiQgPSBuZXcgeXkuVmFsdWUoJCRbJDBdKTsKYnJlYWs7CmNhc2UgNzE6dGhpcy4kID0gbmV3IHl5LlZhbHVlKCQkWyQwXSk7CmJyZWFrOwpjYXNlIDcyOnRoaXMuJCA9IG5ldyB5eS5WYWx1ZSgkJFskMF0pOwpicmVhazsKY2FzZSA3Mzp0aGlzLiQgPSAkJFskMF07CmJyZWFrOwpjYXNlIDc0OnRoaXMuJCA9IG5ldyB5eS5BY2Nlc3MoJCRbJDBdKTsKYnJlYWs7CmNhc2UgNzU6dGhpcy4kID0gbmV3IHl5LkFjY2VzcygkJFskMF0sICdzb2FrJyk7CmJyZWFrOwpjYXNlIDc2OnRoaXMuJCA9IG5ldyB5eS5BY2Nlc3MoJCRbJDBdLCAncHJvdG8nKTsKYnJlYWs7CmNhc2UgNzc6dGhpcy4kID0gbmV3IHl5LkFjY2VzcyhuZXcgeXkuTGl0ZXJhbCgncHJvdG90eXBlJykpOwpicmVhazsKY2FzZSA3ODp0aGlzLiQgPSAkJFskMF07CmJyZWFrOwpjYXNlIDc5OnRoaXMuJCA9ICQkWyQwLTFdOwpicmVhazsKY2FzZSA4MDp0aGlzLiQgPSB5eS5leHRlbmQoJCRbJDBdLCB7CiAgICAgICAgICBzb2FrOiB0cnVlCiAgICAgICAgfSk7CmJyZWFrOwpjYXNlIDgxOnRoaXMuJCA9IHl5LmV4dGVuZCgkJFskMF0sIHsKICAgICAgICAgIHByb3RvOiB0cnVlCiAgICAgICAgfSk7CmJyZWFrOwpjYXNlIDgyOnRoaXMuJCA9IG5ldyB5eS5JbmRleCgkJFskMF0pOwpicmVhazsKY2FzZSA4Mzp0aGlzLiQgPSBuZXcgeXkuU2xpY2UoJCRbJDBdKTsKYnJlYWs7CmNhc2UgODQ6dGhpcy4kID0gbmV3IHl5Lk9iaigkJFskMC0yXSwgJCRbJDAtM10uZ2VuZXJhdGVkKTsKYnJlYWs7CmNhc2UgODU6dGhpcy4kID0gW107CmJyZWFrOwpjYXNlIDg2OnRoaXMuJCA9IFskJFskMF1dOwpicmVhazsKY2FzZSA4Nzp0aGlzLiQgPSAkJFskMC0yXS5jb25jYXQoJCRbJDBdKTsKYnJlYWs7CmNhc2UgODg6dGhpcy4kID0gJCRbJDAtM10uY29uY2F0KCQkWyQwXSk7CmJyZWFrOwpjYXNlIDg5OnRoaXMuJCA9ICQkWyQwLTVdLmNvbmNhdCgkJFskMC0yXSk7CmJyZWFrOwpjYXNlIDkwOnRoaXMuJCA9IG5ldyB5eS5DbGFzczsKYnJlYWs7CmNhc2UgOTE6dGhpcy4kID0gbmV3IHl5LkNsYXNzKG51bGwsIG51bGwsICQkWyQwXSk7CmJyZWFrOwpjYXNlIDkyOnRoaXMuJCA9IG5ldyB5eS5DbGFzcyhudWxsLCAkJFskMF0pOwpicmVhazsKY2FzZSA5Mzp0aGlzLiQgPSBuZXcgeXkuQ2xhc3MobnVsbCwgJCRbJDAtMV0sICQkWyQwXSk7CmJyZWFrOwpjYXNlIDk0OnRoaXMuJCA9IG5ldyB5eS5DbGFzcygkJFskMF0pOwpicmVhazsKY2FzZSA5NTp0aGlzLiQgPSBuZXcgeXkuQ2xhc3MoJCRbJDAtMV0sIG51bGwsICQkWyQwXSk7CmJyZWFrOwpjYXNlIDk2OnRoaXMuJCA9IG5ldyB5eS5DbGFzcygkJFskMC0yXSwgJCRbJDBdKTsKYnJlYWs7CmNhc2UgOTc6dGhpcy4kID0gbmV3IHl5LkNsYXNzKCQkWyQwLTNdLCAkJFskMC0xXSwgJCRbJDBdKTsKYnJlYWs7CmNhc2UgOTg6dGhpcy4kID0gbmV3IHl5LkNhbGwoJCRbJDAtMl0sICQkWyQwXSwgJCRbJDAtMV0pOwpicmVhazsKY2FzZSA5OTp0aGlzLiQgPSBuZXcgeXkuQ2FsbCgkJFskMC0yXSwgJCRbJDBdLCAkJFskMC0xXSk7CmJyZWFrOwpjYXNlIDEwMDp0aGlzLiQgPSBuZXcgeXkuQ2FsbCgnc3VwZXInLCBbbmV3IHl5LlNwbGF0KG5ldyB5eS5MaXRlcmFsKCdhcmd1bWVudHMnKSldKTsKYnJlYWs7CmNhc2UgMTAxOnRoaXMuJCA9IG5ldyB5eS5DYWxsKCdzdXBlcicsICQkWyQwXSk7CmJyZWFrOwpjYXNlIDEwMjp0aGlzLiQgPSBmYWxzZTsKYnJlYWs7CmNhc2UgMTAzOnRoaXMuJCA9IHRydWU7CmJyZWFrOwpjYXNlIDEwNDp0aGlzLiQgPSBbXTsKYnJlYWs7CmNhc2UgMTA1OnRoaXMuJCA9ICQkWyQwLTJdOwpicmVhazsKY2FzZSAxMDY6dGhpcy4kID0gbmV3IHl5LlZhbHVlKG5ldyB5eS5MaXRlcmFsKCd0aGlzJykpOwpicmVhazsKY2FzZSAxMDc6dGhpcy4kID0gbmV3IHl5LlZhbHVlKG5ldyB5eS5MaXRlcmFsKCd0aGlzJykpOwpicmVhazsKY2FzZSAxMDg6dGhpcy4kID0gbmV3IHl5LlZhbHVlKG5ldyB5eS5MaXRlcmFsKCd0aGlzJyksIFtuZXcgeXkuQWNjZXNzKCQkWyQwXSldLCAndGhpcycpOwpicmVhazsKY2FzZSAxMDk6dGhpcy4kID0gbmV3IHl5LkFycihbXSk7CmJyZWFrOwpjYXNlIDExMDp0aGlzLiQgPSBuZXcgeXkuQXJyKCQkWyQwLTJdKTsKYnJlYWs7CmNhc2UgMTExOnRoaXMuJCA9ICdpbmNsdXNpdmUnOwpicmVhazsKY2FzZSAxMTI6dGhpcy4kID0gJ2V4Y2x1c2l2ZSc7CmJyZWFrOwpjYXNlIDExMzp0aGlzLiQgPSBuZXcgeXkuUmFuZ2UoJCRbJDAtM10sICQkWyQwLTFdLCAkJFskMC0yXSk7CmJyZWFrOwpjYXNlIDExNDp0aGlzLiQgPSBuZXcgeXkuUmFuZ2UoJCRbJDAtMl0sICQkWyQwXSwgJCRbJDAtMV0pOwpicmVhazsKY2FzZSAxMTU6dGhpcy4kID0gbmV3IHl5LlJhbmdlKCQkWyQwLTFdLCBudWxsLCAkJFskMF0pOwpicmVhazsKY2FzZSAxMTY6dGhpcy4kID0gbmV3IHl5LlJhbmdlKG51bGwsICQkWyQwXSwgJCRbJDAtMV0pOwpicmVhazsKY2FzZSAxMTc6dGhpcy4kID0gWyQkWyQwXV07CmJyZWFrOwpjYXNlIDExODp0aGlzLiQgPSAkJFskMC0yXS5jb25jYXQoJCRbJDBdKTsKYnJlYWs7CmNhc2UgMTE5OnRoaXMuJCA9ICQkWyQwLTNdLmNvbmNhdCgkJFskMF0pOwpicmVhazsKY2FzZSAxMjA6dGhpcy4kID0gJCRbJDAtMl07CmJyZWFrOwpjYXNlIDEyMTp0aGlzLiQgPSAkJFskMC01XS5jb25jYXQoJCRbJDAtMl0pOwpicmVhazsKY2FzZSAxMjI6dGhpcy4kID0gJCRbJDBdOwpicmVhazsKY2FzZSAxMjM6dGhpcy4kID0gJCRbJDBdOwpicmVhazsKY2FzZSAxMjQ6dGhpcy4kID0gJCRbJDBdOwpicmVhazsKY2FzZSAxMjU6dGhpcy4kID0gW10uY29uY2F0KCQkWyQwLTJdLCAkJFskMF0pOwpicmVhazsKY2FzZSAxMjY6dGhpcy4kID0gbmV3IHl5LlRyeSgkJFskMF0pOwpicmVhazsKY2FzZSAxMjc6dGhpcy4kID0gbmV3IHl5LlRyeSgkJFskMC0xXSwgJCRbJDBdWzBdLCAkJFskMF1bMV0pOwpicmVhazsKY2FzZSAxMjg6dGhpcy4kID0gbmV3IHl5LlRyeSgkJFskMC0yXSwgbnVsbCwgbnVsbCwgJCRbJDBdKTsKYnJlYWs7CmNhc2UgMTI5OnRoaXMuJCA9IG5ldyB5eS5UcnkoJCRbJDAtM10sICQkWyQwLTJdWzBdLCAkJFskMC0yXVsxXSwgJCRbJDBdKTsKYnJlYWs7CmNhc2UgMTMwOnRoaXMuJCA9IFskJFskMC0xXSwgJCRbJDBdXTsKYnJlYWs7CmNhc2UgMTMxOnRoaXMuJCA9IG5ldyB5eS5UaHJvdygkJFskMF0pOwpicmVhazsKY2FzZSAxMzI6dGhpcy4kID0gbmV3IHl5LlBhcmVucygkJFskMC0xXSk7CmJyZWFrOwpjYXNlIDEzMzp0aGlzLiQgPSBuZXcgeXkuUGFyZW5zKCQkWyQwLTJdKTsKYnJlYWs7CmNhc2UgMTM0OnRoaXMuJCA9IG5ldyB5eS5XaGlsZSgkJFskMF0pOwpicmVhazsKY2FzZSAxMzU6dGhpcy4kID0gbmV3IHl5LldoaWxlKCQkWyQwLTJdLCB7CiAgICAgICAgICBndWFyZDogJCRbJDBdCiAgICAgICAgfSk7CmJyZWFrOwpjYXNlIDEzNjp0aGlzLiQgPSBuZXcgeXkuV2hpbGUoJCRbJDBdLCB7CiAgICAgICAgICBpbnZlcnQ6IHRydWUKICAgICAgICB9KTsKYnJlYWs7CmNhc2UgMTM3OnRoaXMuJCA9IG5ldyB5eS5XaGlsZSgkJFskMC0yXSwgewogICAgICAgICAgaW52ZXJ0OiB0cnVlLAogICAgICAgICAgZ3VhcmQ6ICQkWyQwXQogICAgICAgIH0pOwpicmVhazsKY2FzZSAxMzg6dGhpcy4kID0gJCRbJDAtMV0uYWRkQm9keSgkJFskMF0pOwpicmVhazsKY2FzZSAxMzk6dGhpcy4kID0gJCRbJDBdLmFkZEJvZHkoeXkuQmxvY2sud3JhcChbJCRbJDAtMV1dKSk7CmJyZWFrOwpjYXNlIDE0MDp0aGlzLiQgPSAkJFskMF0uYWRkQm9keSh5eS5CbG9jay53cmFwKFskJFskMC0xXV0pKTsKYnJlYWs7CmNhc2UgMTQxOnRoaXMuJCA9ICQkWyQwXTsKYnJlYWs7CmNhc2UgMTQyOnRoaXMuJCA9IG5ldyB5eS5XaGlsZShuZXcgeXkuTGl0ZXJhbCgndHJ1ZScpKS5hZGRCb2R5KCQkWyQwXSk7CmJyZWFrOwpjYXNlIDE0Mzp0aGlzLiQgPSBuZXcgeXkuV2hpbGUobmV3IHl5LkxpdGVyYWwoJ3RydWUnKSkuYWRkQm9keSh5eS5CbG9jay53cmFwKFskJFskMF1dKSk7CmJyZWFrOwpjYXNlIDE0NDp0aGlzLiQgPSBuZXcgeXkuRm9yKCQkWyQwLTFdLCAkJFskMF0pOwpicmVhazsKY2FzZSAxNDU6dGhpcy4kID0gbmV3IHl5LkZvcigkJFskMC0xXSwgJCRbJDBdKTsKYnJlYWs7CmNhc2UgMTQ2OnRoaXMuJCA9IG5ldyB5eS5Gb3IoJCRbJDBdLCAkJFskMC0xXSk7CmJyZWFrOwpjYXNlIDE0Nzp0aGlzLiQgPSB7CiAgICAgICAgICBzb3VyY2U6IG5ldyB5eS5WYWx1ZSgkJFskMF0pCiAgICAgICAgfTsKYnJlYWs7CmNhc2UgMTQ4OnRoaXMuJCA9IChmdW5jdGlvbiAoKSB7CiAgICAgICAgJCRbJDBdLm93biA9ICQkWyQwLTFdLm93bjsKICAgICAgICAkJFskMF0ubmFtZSA9ICQkWyQwLTFdWzBdOwogICAgICAgICQkWyQwXS5pbmRleCA9ICQkWyQwLTFdWzFdOwogICAgICAgIHJldHVybiAkJFskMF07CiAgICAgIH0oKSk7CmJyZWFrOwpjYXNlIDE0OTp0aGlzLiQgPSAkJFskMF07CmJyZWFrOwpjYXNlIDE1MDp0aGlzLiQgPSAoZnVuY3Rpb24gKCkgewogICAgICAgICQkWyQwXS5vd24gPSB0cnVlOwogICAgICAgIHJldHVybiAkJFskMF07CiAgICAgIH0oKSk7CmJyZWFrOwpjYXNlIDE1MTp0aGlzLiQgPSAkJFskMF07CmJyZWFrOwpjYXNlIDE1Mjp0aGlzLiQgPSBuZXcgeXkuVmFsdWUoJCRbJDBdKTsKYnJlYWs7CmNhc2UgMTUzOnRoaXMuJCA9IG5ldyB5eS5WYWx1ZSgkJFskMF0pOwpicmVhazsKY2FzZSAxNTQ6dGhpcy4kID0gWyQkWyQwXV07CmJyZWFrOwpjYXNlIDE1NTp0aGlzLiQgPSBbJCRbJDAtMl0sICQkWyQwXV07CmJyZWFrOwpjYXNlIDE1Njp0aGlzLiQgPSB7CiAgICAgICAgICBzb3VyY2U6ICQkWyQwXQogICAgICAgIH07CmJyZWFrOwpjYXNlIDE1Nzp0aGlzLiQgPSB7CiAgICAgICAgICBzb3VyY2U6ICQkWyQwXSwKICAgICAgICAgIG9iamVjdDogdHJ1ZQogICAgICAgIH07CmJyZWFrOwpjYXNlIDE1ODp0aGlzLiQgPSB7CiAgICAgICAgICBzb3VyY2U6ICQkWyQwLTJdLAogICAgICAgICAgZ3VhcmQ6ICQkWyQwXQogICAgICAgIH07CmJyZWFrOwpjYXNlIDE1OTp0aGlzLiQgPSB7CiAgICAgICAgICBzb3VyY2U6ICQkWyQwLTJdLAogICAgICAgICAgZ3VhcmQ6ICQkWyQwXSwKICAgICAgICAgIG9iamVjdDogdHJ1ZQogICAgICAgIH07CmJyZWFrOwpjYXNlIDE2MDp0aGlzLiQgPSB7CiAgICAgICAgICBzb3VyY2U6ICQkWyQwLTJdLAogICAgICAgICAgc3RlcDogJCRbJDBdCiAgICAgICAgfTsKYnJlYWs7CmNhc2UgMTYxOnRoaXMuJCA9IHsKICAgICAgICAgIHNvdXJjZTogJCRbJDAtNF0sCiAgICAgICAgICBndWFyZDogJCRbJDAtMl0sCiAgICAgICAgICBzdGVwOiAkJFskMF0KICAgICAgICB9OwpicmVhazsKY2FzZSAxNjI6dGhpcy4kID0gewogICAgICAgICAgc291cmNlOiAkJFskMC00XSwKICAgICAgICAgIHN0ZXA6ICQkWyQwLTJdLAogICAgICAgICAgZ3VhcmQ6ICQkWyQwXQogICAgICAgIH07CmJyZWFrOwpjYXNlIDE2Mzp0aGlzLiQgPSBuZXcgeXkuU3dpdGNoKCQkWyQwLTNdLCAkJFskMC0xXSk7CmJyZWFrOwpjYXNlIDE2NDp0aGlzLiQgPSBuZXcgeXkuU3dpdGNoKCQkWyQwLTVdLCAkJFskMC0zXSwgJCRbJDAtMV0pOwpicmVhazsKY2FzZSAxNjU6dGhpcy4kID0gbmV3IHl5LlN3aXRjaChudWxsLCAkJFskMC0xXSk7CmJyZWFrOwpjYXNlIDE2Njp0aGlzLiQgPSBuZXcgeXkuU3dpdGNoKG51bGwsICQkWyQwLTNdLCAkJFskMC0xXSk7CmJyZWFrOwpjYXNlIDE2Nzp0aGlzLiQgPSAkJFskMF07CmJyZWFrOwpjYXNlIDE2ODp0aGlzLiQgPSAkJFskMC0xXS5jb25jYXQoJCRbJDBdKTsKYnJlYWs7CmNhc2UgMTY5OnRoaXMuJCA9IFtbJCRbJDAtMV0sICQkWyQwXV1dOwpicmVhazsKY2FzZSAxNzA6dGhpcy4kID0gW1skJFskMC0yXSwgJCRbJDAtMV1dXTsKYnJlYWs7CmNhc2UgMTcxOnRoaXMuJCA9IG5ldyB5eS5JZigkJFskMC0xXSwgJCRbJDBdLCB7CiAgICAgICAgICB0eXBlOiAkJFskMC0yXQogICAgICAgIH0pOwpicmVhazsKY2FzZSAxNzI6dGhpcy4kID0gJCRbJDAtNF0uYWRkRWxzZShuZXcgeXkuSWYoJCRbJDAtMV0sICQkWyQwXSwgewogICAgICAgICAgdHlwZTogJCRbJDAtMl0KICAgICAgICB9KSk7CmJyZWFrOwpjYXNlIDE3Mzp0aGlzLiQgPSAkJFskMF07CmJyZWFrOwpjYXNlIDE3NDp0aGlzLiQgPSAkJFskMC0yXS5hZGRFbHNlKCQkWyQwXSk7CmJyZWFrOwpjYXNlIDE3NTp0aGlzLiQgPSBuZXcgeXkuSWYoJCRbJDBdLCB5eS5CbG9jay53cmFwKFskJFskMC0yXV0pLCB7CiAgICAgICAgICB0eXBlOiAkJFskMC0xXSwKICAgICAgICAgIHN0YXRlbWVudDogdHJ1ZQogICAgICAgIH0pOwpicmVhazsKY2FzZSAxNzY6dGhpcy4kID0gbmV3IHl5LklmKCQkWyQwXSwgeXkuQmxvY2sud3JhcChbJCRbJDAtMl1dKSwgewogICAgICAgICAgdHlwZTogJCRbJDAtMV0sCiAgICAgICAgICBzdGF0ZW1lbnQ6IHRydWUKICAgICAgICB9KTsKYnJlYWs7CmNhc2UgMTc3OnRoaXMuJCA9IG5ldyB5eS5PcCgkJFskMC0xXSwgJCRbJDBdKTsKYnJlYWs7CmNhc2UgMTc4OnRoaXMuJCA9IG5ldyB5eS5PcCgnLScsICQkWyQwXSk7CmJyZWFrOwpjYXNlIDE3OTp0aGlzLiQgPSBuZXcgeXkuT3AoJysnLCAkJFskMF0pOwpicmVhazsKY2FzZSAxODA6dGhpcy4kID0gbmV3IHl5Lk9wKCctLScsICQkWyQwXSk7CmJyZWFrOwpjYXNlIDE4MTp0aGlzLiQgPSBuZXcgeXkuT3AoJysrJywgJCRbJDBdKTsKYnJlYWs7CmNhc2UgMTgyOnRoaXMuJCA9IG5ldyB5eS5PcCgnLS0nLCAkJFskMC0xXSwgbnVsbCwgdHJ1ZSk7CmJyZWFrOwpjYXNlIDE4Mzp0aGlzLiQgPSBuZXcgeXkuT3AoJysrJywgJCRbJDAtMV0sIG51bGwsIHRydWUpOwpicmVhazsKY2FzZSAxODQ6dGhpcy4kID0gbmV3IHl5LkV4aXN0ZW5jZSgkJFskMC0xXSk7CmJyZWFrOwpjYXNlIDE4NTp0aGlzLiQgPSBuZXcgeXkuT3AoJysnLCAkJFskMC0yXSwgJCRbJDBdKTsKYnJlYWs7CmNhc2UgMTg2OnRoaXMuJCA9IG5ldyB5eS5PcCgnLScsICQkWyQwLTJdLCAkJFskMF0pOwpicmVhazsKY2FzZSAxODc6dGhpcy4kID0gbmV3IHl5Lk9wKCQkWyQwLTFdLCAkJFskMC0yXSwgJCRbJDBdKTsKYnJlYWs7CmNhc2UgMTg4OnRoaXMuJCA9IG5ldyB5eS5PcCgkJFskMC0xXSwgJCRbJDAtMl0sICQkWyQwXSk7CmJyZWFrOwpjYXNlIDE4OTp0aGlzLiQgPSBuZXcgeXkuT3AoJCRbJDAtMV0sICQkWyQwLTJdLCAkJFskMF0pOwpicmVhazsKY2FzZSAxOTA6dGhpcy4kID0gbmV3IHl5Lk9wKCQkWyQwLTFdLCAkJFskMC0yXSwgJCRbJDBdKTsKYnJlYWs7CmNhc2UgMTkxOnRoaXMuJCA9IChmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCQkWyQwLTFdLmNoYXJBdCgwKSA9PT0gJyEnKSB7CiAgICAgICAgICByZXR1cm4gbmV3IHl5Lk9wKCQkWyQwLTFdLnNsaWNlKDEpLCAkJFskMC0yXSwgJCRbJDBdKS5pbnZlcnQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIG5ldyB5eS5PcCgkJFskMC0xXSwgJCRbJDAtMl0sICQkWyQwXSk7CiAgICAgICAgfQogICAgICB9KCkpOwpicmVhazsKY2FzZSAxOTI6dGhpcy4kID0gbmV3IHl5LkFzc2lnbigkJFskMC0yXSwgJCRbJDBdLCAkJFskMC0xXSk7CmJyZWFrOwpjYXNlIDE5Mzp0aGlzLiQgPSBuZXcgeXkuQXNzaWduKCQkWyQwLTRdLCAkJFskMC0xXSwgJCRbJDAtM10pOwpicmVhazsKY2FzZSAxOTQ6dGhpcy4kID0gbmV3IHl5LkV4dGVuZHMoJCRbJDAtMl0sICQkWyQwXSk7CmJyZWFrOwp9Cn0sCnRhYmxlOiBbezE6WzIsMV0sMzoxLDQ6Miw1OjMsNzo0LDg6Niw5OjcsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNTpbMSw1XSwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7MTpbM119LHsxOlsyLDJdLDY6WzEsNzFdfSx7NjpbMSw3Ml19LHsxOlsyLDRdLDY6WzIsNF0sMjY6WzIsNF0sOTk6WzIsNF19LHs0Ojc0LDc6NCw4OjYsOTo3LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjY6WzEsNzNdLDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHsxOlsyLDddLDY6WzIsN10sMjY6WzIsN10sOTk6WzIsN10sMTAwOjg0LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDY6ODUsMTA3OlsxLDY1XSwxMDg6NjYsMTIzOlsxLDgzXSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHsxOlsyLDhdLDY6WzIsOF0sMjY6WzIsOF0sOTk6WzIsOF0sMTAwOjg3LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDY6ODgsMTA3OlsxLDY1XSwxMDg6NjYsMTIzOlsxLDg2XX0sezE6WzIsMTNdLDY6WzIsMTNdLDI1OlsyLDEzXSwyNjpbMiwxM10sNDY6WzIsMTNdLDUxOlsyLDEzXSw1NDpbMiwxM10sNTk6OTAsNjM6WzEsOTJdLDY0OlsxLDkzXSw2NTpbMSw5NF0sNjY6OTUsNjc6WzEsOTZdLDY5OlsyLDEzXSw3MDpbMSw5N10sNzE6WzEsOThdLDc1OlsyLDEzXSw3ODo4OSw4MTpbMSw5MV0sODI6WzIsMTAyXSw4MzpbMiwxM10sODg6WzIsMTNdLDkwOlsyLDEzXSw5OTpbMiwxM10sMTAxOlsyLDEzXSwxMDI6WzIsMTNdLDEwMzpbMiwxM10sMTA3OlsyLDEzXSwxMTU6WzIsMTNdLDEyMzpbMiwxM10sMTI1OlsyLDEzXSwxMjY6WzIsMTNdLDEyOTpbMiwxM10sMTMwOlsyLDEzXSwxMzE6WzIsMTNdLDEzMjpbMiwxM10sMTMzOlsyLDEzXSwxMzQ6WzIsMTNdfSx7MTpbMiwxNF0sNjpbMiwxNF0sMjU6WzIsMTRdLDI2OlsyLDE0XSw0NjpbMiwxNF0sNTE6WzIsMTRdLDU0OlsyLDE0XSw1OToxMDAsNjM6WzEsOTJdLDY0OlsxLDkzXSw2NTpbMSw5NF0sNjY6OTUsNjc6WzEsOTZdLDY5OlsyLDE0XSw3MDpbMSw5N10sNzE6WzEsOThdLDc1OlsyLDE0XSw3ODo5OSw4MTpbMSw5MV0sODI6WzIsMTAyXSw4MzpbMiwxNF0sODg6WzIsMTRdLDkwOlsyLDE0XSw5OTpbMiwxNF0sMTAxOlsyLDE0XSwxMDI6WzIsMTRdLDEwMzpbMiwxNF0sMTA3OlsyLDE0XSwxMTU6WzIsMTRdLDEyMzpbMiwxNF0sMTI1OlsyLDE0XSwxMjY6WzIsMTRdLDEyOTpbMiwxNF0sMTMwOlsyLDE0XSwxMzE6WzIsMTRdLDEzMjpbMiwxNF0sMTMzOlsyLDE0XSwxMzQ6WzIsMTRdfSx7MTpbMiwxNV0sNjpbMiwxNV0sMjU6WzIsMTVdLDI2OlsyLDE1XSw0NjpbMiwxNV0sNTE6WzIsMTVdLDU0OlsyLDE1XSw2OTpbMiwxNV0sNzU6WzIsMTVdLDgzOlsyLDE1XSw4ODpbMiwxNV0sOTA6WzIsMTVdLDk5OlsyLDE1XSwxMDE6WzIsMTVdLDEwMjpbMiwxNV0sMTAzOlsyLDE1XSwxMDc6WzIsMTVdLDExNTpbMiwxNV0sMTIzOlsyLDE1XSwxMjU6WzIsMTVdLDEyNjpbMiwxNV0sMTI5OlsyLDE1XSwxMzA6WzIsMTVdLDEzMTpbMiwxNV0sMTMyOlsyLDE1XSwxMzM6WzIsMTVdLDEzNDpbMiwxNV19LHsxOlsyLDE2XSw2OlsyLDE2XSwyNTpbMiwxNl0sMjY6WzIsMTZdLDQ2OlsyLDE2XSw1MTpbMiwxNl0sNTQ6WzIsMTZdLDY5OlsyLDE2XSw3NTpbMiwxNl0sODM6WzIsMTZdLDg4OlsyLDE2XSw5MDpbMiwxNl0sOTk6WzIsMTZdLDEwMTpbMiwxNl0sMTAyOlsyLDE2XSwxMDM6WzIsMTZdLDEwNzpbMiwxNl0sMTE1OlsyLDE2XSwxMjM6WzIsMTZdLDEyNTpbMiwxNl0sMTI2OlsyLDE2XSwxMjk6WzIsMTZdLDEzMDpbMiwxNl0sMTMxOlsyLDE2XSwxMzI6WzIsMTZdLDEzMzpbMiwxNl0sMTM0OlsyLDE2XX0sezE6WzIsMTddLDY6WzIsMTddLDI1OlsyLDE3XSwyNjpbMiwxN10sNDY6WzIsMTddLDUxOlsyLDE3XSw1NDpbMiwxN10sNjk6WzIsMTddLDc1OlsyLDE3XSw4MzpbMiwxN10sODg6WzIsMTddLDkwOlsyLDE3XSw5OTpbMiwxN10sMTAxOlsyLDE3XSwxMDI6WzIsMTddLDEwMzpbMiwxN10sMTA3OlsyLDE3XSwxMTU6WzIsMTddLDEyMzpbMiwxN10sMTI1OlsyLDE3XSwxMjY6WzIsMTddLDEyOTpbMiwxN10sMTMwOlsyLDE3XSwxMzE6WzIsMTddLDEzMjpbMiwxN10sMTMzOlsyLDE3XSwxMzQ6WzIsMTddfSx7MTpbMiwxOF0sNjpbMiwxOF0sMjU6WzIsMThdLDI2OlsyLDE4XSw0NjpbMiwxOF0sNTE6WzIsMThdLDU0OlsyLDE4XSw2OTpbMiwxOF0sNzU6WzIsMThdLDgzOlsyLDE4XSw4ODpbMiwxOF0sOTA6WzIsMThdLDk5OlsyLDE4XSwxMDE6WzIsMThdLDEwMjpbMiwxOF0sMTAzOlsyLDE4XSwxMDc6WzIsMThdLDExNTpbMiwxOF0sMTIzOlsyLDE4XSwxMjU6WzIsMThdLDEyNjpbMiwxOF0sMTI5OlsyLDE4XSwxMzA6WzIsMThdLDEzMTpbMiwxOF0sMTMyOlsyLDE4XSwxMzM6WzIsMThdLDEzNDpbMiwxOF19LHsxOlsyLDE5XSw2OlsyLDE5XSwyNTpbMiwxOV0sMjY6WzIsMTldLDQ2OlsyLDE5XSw1MTpbMiwxOV0sNTQ6WzIsMTldLDY5OlsyLDE5XSw3NTpbMiwxOV0sODM6WzIsMTldLDg4OlsyLDE5XSw5MDpbMiwxOV0sOTk6WzIsMTldLDEwMTpbMiwxOV0sMTAyOlsyLDE5XSwxMDM6WzIsMTldLDEwNzpbMiwxOV0sMTE1OlsyLDE5XSwxMjM6WzIsMTldLDEyNTpbMiwxOV0sMTI2OlsyLDE5XSwxMjk6WzIsMTldLDEzMDpbMiwxOV0sMTMxOlsyLDE5XSwxMzI6WzIsMTldLDEzMzpbMiwxOV0sMTM0OlsyLDE5XX0sezE6WzIsMjBdLDY6WzIsMjBdLDI1OlsyLDIwXSwyNjpbMiwyMF0sNDY6WzIsMjBdLDUxOlsyLDIwXSw1NDpbMiwyMF0sNjk6WzIsMjBdLDc1OlsyLDIwXSw4MzpbMiwyMF0sODg6WzIsMjBdLDkwOlsyLDIwXSw5OTpbMiwyMF0sMTAxOlsyLDIwXSwxMDI6WzIsMjBdLDEwMzpbMiwyMF0sMTA3OlsyLDIwXSwxMTU6WzIsMjBdLDEyMzpbMiwyMF0sMTI1OlsyLDIwXSwxMjY6WzIsMjBdLDEyOTpbMiwyMF0sMTMwOlsyLDIwXSwxMzE6WzIsMjBdLDEzMjpbMiwyMF0sMTMzOlsyLDIwXSwxMzQ6WzIsMjBdfSx7MTpbMiwyMV0sNjpbMiwyMV0sMjU6WzIsMjFdLDI2OlsyLDIxXSw0NjpbMiwyMV0sNTE6WzIsMjFdLDU0OlsyLDIxXSw2OTpbMiwyMV0sNzU6WzIsMjFdLDgzOlsyLDIxXSw4ODpbMiwyMV0sOTA6WzIsMjFdLDk5OlsyLDIxXSwxMDE6WzIsMjFdLDEwMjpbMiwyMV0sMTAzOlsyLDIxXSwxMDc6WzIsMjFdLDExNTpbMiwyMV0sMTIzOlsyLDIxXSwxMjU6WzIsMjFdLDEyNjpbMiwyMV0sMTI5OlsyLDIxXSwxMzA6WzIsMjFdLDEzMTpbMiwyMV0sMTMyOlsyLDIxXSwxMzM6WzIsMjFdLDEzNDpbMiwyMV19LHsxOlsyLDIyXSw2OlsyLDIyXSwyNTpbMiwyMl0sMjY6WzIsMjJdLDQ2OlsyLDIyXSw1MTpbMiwyMl0sNTQ6WzIsMjJdLDY5OlsyLDIyXSw3NTpbMiwyMl0sODM6WzIsMjJdLDg4OlsyLDIyXSw5MDpbMiwyMl0sOTk6WzIsMjJdLDEwMTpbMiwyMl0sMTAyOlsyLDIyXSwxMDM6WzIsMjJdLDEwNzpbMiwyMl0sMTE1OlsyLDIyXSwxMjM6WzIsMjJdLDEyNTpbMiwyMl0sMTI2OlsyLDIyXSwxMjk6WzIsMjJdLDEzMDpbMiwyMl0sMTMxOlsyLDIyXSwxMzI6WzIsMjJdLDEzMzpbMiwyMl0sMTM0OlsyLDIyXX0sezE6WzIsMjNdLDY6WzIsMjNdLDI1OlsyLDIzXSwyNjpbMiwyM10sNDY6WzIsMjNdLDUxOlsyLDIzXSw1NDpbMiwyM10sNjk6WzIsMjNdLDc1OlsyLDIzXSw4MzpbMiwyM10sODg6WzIsMjNdLDkwOlsyLDIzXSw5OTpbMiwyM10sMTAxOlsyLDIzXSwxMDI6WzIsMjNdLDEwMzpbMiwyM10sMTA3OlsyLDIzXSwxMTU6WzIsMjNdLDEyMzpbMiwyM10sMTI1OlsyLDIzXSwxMjY6WzIsMjNdLDEyOTpbMiwyM10sMTMwOlsyLDIzXSwxMzE6WzIsMjNdLDEzMjpbMiwyM10sMTMzOlsyLDIzXSwxMzQ6WzIsMjNdfSx7MTpbMiw5XSw2OlsyLDldLDI2OlsyLDldLDk5OlsyLDldLDEwMTpbMiw5XSwxMDM6WzIsOV0sMTA3OlsyLDldLDEyMzpbMiw5XX0sezE6WzIsMTBdLDY6WzIsMTBdLDI2OlsyLDEwXSw5OTpbMiwxMF0sMTAxOlsyLDEwXSwxMDM6WzIsMTBdLDEwNzpbMiwxMF0sMTIzOlsyLDEwXX0sezE6WzIsMTFdLDY6WzIsMTFdLDI2OlsyLDExXSw5OTpbMiwxMV0sMTAxOlsyLDExXSwxMDM6WzIsMTFdLDEwNzpbMiwxMV0sMTIzOlsyLDExXX0sezE6WzIsMTJdLDY6WzIsMTJdLDI2OlsyLDEyXSw5OTpbMiwxMl0sMTAxOlsyLDEyXSwxMDM6WzIsMTJdLDEwNzpbMiwxMl0sMTIzOlsyLDEyXX0sezE6WzIsNjldLDY6WzIsNjldLDI1OlsyLDY5XSwyNjpbMiw2OV0sMzc6WzEsMTAxXSw0NjpbMiw2OV0sNTE6WzIsNjldLDU0OlsyLDY5XSw2MzpbMiw2OV0sNjQ6WzIsNjldLDY1OlsyLDY5XSw2NzpbMiw2OV0sNjk6WzIsNjldLDcwOlsyLDY5XSw3MTpbMiw2OV0sNzU6WzIsNjldLDgxOlsyLDY5XSw4MjpbMiw2OV0sODM6WzIsNjldLDg4OlsyLDY5XSw5MDpbMiw2OV0sOTk6WzIsNjldLDEwMTpbMiw2OV0sMTAyOlsyLDY5XSwxMDM6WzIsNjldLDEwNzpbMiw2OV0sMTE1OlsyLDY5XSwxMjM6WzIsNjldLDEyNTpbMiw2OV0sMTI2OlsyLDY5XSwxMjk6WzIsNjldLDEzMDpbMiw2OV0sMTMxOlsyLDY5XSwxMzI6WzIsNjldLDEzMzpbMiw2OV0sMTM0OlsyLDY5XX0sezE6WzIsNzBdLDY6WzIsNzBdLDI1OlsyLDcwXSwyNjpbMiw3MF0sNDY6WzIsNzBdLDUxOlsyLDcwXSw1NDpbMiw3MF0sNjM6WzIsNzBdLDY0OlsyLDcwXSw2NTpbMiw3MF0sNjc6WzIsNzBdLDY5OlsyLDcwXSw3MDpbMiw3MF0sNzE6WzIsNzBdLDc1OlsyLDcwXSw4MTpbMiw3MF0sODI6WzIsNzBdLDgzOlsyLDcwXSw4ODpbMiw3MF0sOTA6WzIsNzBdLDk5OlsyLDcwXSwxMDE6WzIsNzBdLDEwMjpbMiw3MF0sMTAzOlsyLDcwXSwxMDc6WzIsNzBdLDExNTpbMiw3MF0sMTIzOlsyLDcwXSwxMjU6WzIsNzBdLDEyNjpbMiw3MF0sMTI5OlsyLDcwXSwxMzA6WzIsNzBdLDEzMTpbMiw3MF0sMTMyOlsyLDcwXSwxMzM6WzIsNzBdLDEzNDpbMiw3MF19LHsxOlsyLDcxXSw2OlsyLDcxXSwyNTpbMiw3MV0sMjY6WzIsNzFdLDQ2OlsyLDcxXSw1MTpbMiw3MV0sNTQ6WzIsNzFdLDYzOlsyLDcxXSw2NDpbMiw3MV0sNjU6WzIsNzFdLDY3OlsyLDcxXSw2OTpbMiw3MV0sNzA6WzIsNzFdLDcxOlsyLDcxXSw3NTpbMiw3MV0sODE6WzIsNzFdLDgyOlsyLDcxXSw4MzpbMiw3MV0sODg6WzIsNzFdLDkwOlsyLDcxXSw5OTpbMiw3MV0sMTAxOlsyLDcxXSwxMDI6WzIsNzFdLDEwMzpbMiw3MV0sMTA3OlsyLDcxXSwxMTU6WzIsNzFdLDEyMzpbMiw3MV0sMTI1OlsyLDcxXSwxMjY6WzIsNzFdLDEyOTpbMiw3MV0sMTMwOlsyLDcxXSwxMzE6WzIsNzFdLDEzMjpbMiw3MV0sMTMzOlsyLDcxXSwxMzQ6WzIsNzFdfSx7MTpbMiw3Ml0sNjpbMiw3Ml0sMjU6WzIsNzJdLDI2OlsyLDcyXSw0NjpbMiw3Ml0sNTE6WzIsNzJdLDU0OlsyLDcyXSw2MzpbMiw3Ml0sNjQ6WzIsNzJdLDY1OlsyLDcyXSw2NzpbMiw3Ml0sNjk6WzIsNzJdLDcwOlsyLDcyXSw3MTpbMiw3Ml0sNzU6WzIsNzJdLDgxOlsyLDcyXSw4MjpbMiw3Ml0sODM6WzIsNzJdLDg4OlsyLDcyXSw5MDpbMiw3Ml0sOTk6WzIsNzJdLDEwMTpbMiw3Ml0sMTAyOlsyLDcyXSwxMDM6WzIsNzJdLDEwNzpbMiw3Ml0sMTE1OlsyLDcyXSwxMjM6WzIsNzJdLDEyNTpbMiw3Ml0sMTI2OlsyLDcyXSwxMjk6WzIsNzJdLDEzMDpbMiw3Ml0sMTMxOlsyLDcyXSwxMzI6WzIsNzJdLDEzMzpbMiw3Ml0sMTM0OlsyLDcyXX0sezE6WzIsNzNdLDY6WzIsNzNdLDI1OlsyLDczXSwyNjpbMiw3M10sNDY6WzIsNzNdLDUxOlsyLDczXSw1NDpbMiw3M10sNjM6WzIsNzNdLDY0OlsyLDczXSw2NTpbMiw3M10sNjc6WzIsNzNdLDY5OlsyLDczXSw3MDpbMiw3M10sNzE6WzIsNzNdLDc1OlsyLDczXSw4MTpbMiw3M10sODI6WzIsNzNdLDgzOlsyLDczXSw4ODpbMiw3M10sOTA6WzIsNzNdLDk5OlsyLDczXSwxMDE6WzIsNzNdLDEwMjpbMiw3M10sMTAzOlsyLDczXSwxMDc6WzIsNzNdLDExNTpbMiw3M10sMTIzOlsyLDczXSwxMjU6WzIsNzNdLDEyNjpbMiw3M10sMTI5OlsyLDczXSwxMzA6WzIsNzNdLDEzMTpbMiw3M10sMTMyOlsyLDczXSwxMzM6WzIsNzNdLDEzNDpbMiw3M119LHsxOlsyLDEwMF0sNjpbMiwxMDBdLDI1OlsyLDEwMF0sMjY6WzIsMTAwXSw0NjpbMiwxMDBdLDUxOlsyLDEwMF0sNTQ6WzIsMTAwXSw2MzpbMiwxMDBdLDY0OlsyLDEwMF0sNjU6WzIsMTAwXSw2NzpbMiwxMDBdLDY5OlsyLDEwMF0sNzA6WzIsMTAwXSw3MTpbMiwxMDBdLDc1OlsyLDEwMF0sNzk6MTAyLDgxOlsyLDEwMF0sODI6WzEsMTAzXSw4MzpbMiwxMDBdLDg4OlsyLDEwMF0sOTA6WzIsMTAwXSw5OTpbMiwxMDBdLDEwMTpbMiwxMDBdLDEwMjpbMiwxMDBdLDEwMzpbMiwxMDBdLDEwNzpbMiwxMDBdLDExNTpbMiwxMDBdLDEyMzpbMiwxMDBdLDEyNTpbMiwxMDBdLDEyNjpbMiwxMDBdLDEyOTpbMiwxMDBdLDEzMDpbMiwxMDBdLDEzMTpbMiwxMDBdLDEzMjpbMiwxMDBdLDEzMzpbMiwxMDBdLDEzNDpbMiwxMDBdfSx7Mjc6MTA3LDI4OlsxLDcwXSw0MToxMDgsNDU6MTA0LDQ2OlsyLDUxXSw1MTpbMiw1MV0sNTI6MTA1LDUzOjEwNiw1NToxMDksNTY6MTEwLDczOlsxLDY3XSw4NjpbMSwxMTFdLDg3OlsxLDExMl19LHs1OjExMywyNTpbMSw1XX0sezg6MTE0LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezg6MTE2LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezg6MTE3LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezE0OjExOSwxNToxMjAsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MTIxLDQxOjYwLDU1OjQ3LDU2OjQ4LDU4OjExOCw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDk4OlsxLDUzXX0sezE0OjExOSwxNToxMjAsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MTIxLDQxOjYwLDU1OjQ3LDU2OjQ4LDU4OjEyMiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDk4OlsxLDUzXX0sezE6WzIsNjZdLDY6WzIsNjZdLDI1OlsyLDY2XSwyNjpbMiw2Nl0sMzc6WzIsNjZdLDQ2OlsyLDY2XSw1MTpbMiw2Nl0sNTQ6WzIsNjZdLDYzOlsyLDY2XSw2NDpbMiw2Nl0sNjU6WzIsNjZdLDY3OlsyLDY2XSw2OTpbMiw2Nl0sNzA6WzIsNjZdLDcxOlsyLDY2XSw3NTpbMiw2Nl0sNzc6WzEsMTI2XSw4MTpbMiw2Nl0sODI6WzIsNjZdLDgzOlsyLDY2XSw4ODpbMiw2Nl0sOTA6WzIsNjZdLDk5OlsyLDY2XSwxMDE6WzIsNjZdLDEwMjpbMiw2Nl0sMTAzOlsyLDY2XSwxMDc6WzIsNjZdLDExNTpbMiw2Nl0sMTIzOlsyLDY2XSwxMjU6WzIsNjZdLDEyNjpbMiw2Nl0sMTI3OlsxLDEyM10sMTI4OlsxLDEyNF0sMTI5OlsyLDY2XSwxMzA6WzIsNjZdLDEzMTpbMiw2Nl0sMTMyOlsyLDY2XSwxMzM6WzIsNjZdLDEzNDpbMiw2Nl0sMTM1OlsxLDEyNV19LHsxOlsyLDE3M10sNjpbMiwxNzNdLDI1OlsyLDE3M10sMjY6WzIsMTczXSw0NjpbMiwxNzNdLDUxOlsyLDE3M10sNTQ6WzIsMTczXSw2OTpbMiwxNzNdLDc1OlsyLDE3M10sODM6WzIsMTczXSw4ODpbMiwxNzNdLDkwOlsyLDE3M10sOTk6WzIsMTczXSwxMDE6WzIsMTczXSwxMDI6WzIsMTczXSwxMDM6WzIsMTczXSwxMDc6WzIsMTczXSwxMTU6WzIsMTczXSwxMTg6WzEsMTI3XSwxMjM6WzIsMTczXSwxMjU6WzIsMTczXSwxMjY6WzIsMTczXSwxMjk6WzIsMTczXSwxMzA6WzIsMTczXSwxMzE6WzIsMTczXSwxMzI6WzIsMTczXSwxMzM6WzIsMTczXSwxMzQ6WzIsMTczXX0sezU6MTI4LDI1OlsxLDVdfSx7NToxMjksMjU6WzEsNV19LHsxOlsyLDE0MV0sNjpbMiwxNDFdLDI1OlsyLDE0MV0sMjY6WzIsMTQxXSw0NjpbMiwxNDFdLDUxOlsyLDE0MV0sNTQ6WzIsMTQxXSw2OTpbMiwxNDFdLDc1OlsyLDE0MV0sODM6WzIsMTQxXSw4ODpbMiwxNDFdLDkwOlsyLDE0MV0sOTk6WzIsMTQxXSwxMDE6WzIsMTQxXSwxMDI6WzIsMTQxXSwxMDM6WzIsMTQxXSwxMDc6WzIsMTQxXSwxMTU6WzIsMTQxXSwxMjM6WzIsMTQxXSwxMjU6WzIsMTQxXSwxMjY6WzIsMTQxXSwxMjk6WzIsMTQxXSwxMzA6WzIsMTQxXSwxMzE6WzIsMTQxXSwxMzI6WzIsMTQxXSwxMzM6WzIsMTQxXSwxMzQ6WzIsMTQxXX0sezU6MTMwLDI1OlsxLDVdfSx7ODoxMzEsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNTpbMSwxMzJdLDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHsxOlsyLDkwXSw1OjEzMyw2OlsyLDkwXSwxNDoxMTksMTU6MTIwLDI1OlsxLDVdLDI2OlsyLDkwXSwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoxMjEsNDE6NjAsNDY6WzIsOTBdLDUxOlsyLDkwXSw1NDpbMiw5MF0sNTU6NDcsNTY6NDgsNTg6MTM1LDYwOjI1LDYxOjI2LDYyOjI3LDY5OlsyLDkwXSw3MzpbMSw2N10sNzU6WzIsOTBdLDc3OlsxLDEzNF0sODA6WzEsMjhdLDgzOlsyLDkwXSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw4ODpbMiw5MF0sOTA6WzIsOTBdLDk4OlsxLDUzXSw5OTpbMiw5MF0sMTAxOlsyLDkwXSwxMDI6WzIsOTBdLDEwMzpbMiw5MF0sMTA3OlsyLDkwXSwxMTU6WzIsOTBdLDEyMzpbMiw5MF0sMTI1OlsyLDkwXSwxMjY6WzIsOTBdLDEyOTpbMiw5MF0sMTMwOlsyLDkwXSwxMzE6WzIsOTBdLDEzMjpbMiw5MF0sMTMzOlsyLDkwXSwxMzQ6WzIsOTBdfSx7MTpbMiw0M10sNjpbMiw0M10sODoxMzYsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNjpbMiw0M10sMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSw5OTpbMiw0M10sMTAwOjM5LDEwMTpbMiw0M10sMTAzOlsyLDQzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsyLDQzXSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjM6WzIsNDNdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezg6MTM3LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezE6WzIsNDRdLDY6WzIsNDRdLDI1OlsyLDQ0XSwyNjpbMiw0NF0sNTE6WzIsNDRdLDc1OlsyLDQ0XSw5OTpbMiw0NF0sMTAxOlsyLDQ0XSwxMDM6WzIsNDRdLDEwNzpbMiw0NF0sMTIzOlsyLDQ0XX0sezE6WzIsNjddLDY6WzIsNjddLDI1OlsyLDY3XSwyNjpbMiw2N10sMzc6WzIsNjddLDQ2OlsyLDY3XSw1MTpbMiw2N10sNTQ6WzIsNjddLDYzOlsyLDY3XSw2NDpbMiw2N10sNjU6WzIsNjddLDY3OlsyLDY3XSw2OTpbMiw2N10sNzA6WzIsNjddLDcxOlsyLDY3XSw3NTpbMiw2N10sODE6WzIsNjddLDgyOlsyLDY3XSw4MzpbMiw2N10sODg6WzIsNjddLDkwOlsyLDY3XSw5OTpbMiw2N10sMTAxOlsyLDY3XSwxMDI6WzIsNjddLDEwMzpbMiw2N10sMTA3OlsyLDY3XSwxMTU6WzIsNjddLDEyMzpbMiw2N10sMTI1OlsyLDY3XSwxMjY6WzIsNjddLDEyOTpbMiw2N10sMTMwOlsyLDY3XSwxMzE6WzIsNjddLDEzMjpbMiw2N10sMTMzOlsyLDY3XSwxMzQ6WzIsNjddfSx7MTpbMiw2OF0sNjpbMiw2OF0sMjU6WzIsNjhdLDI2OlsyLDY4XSwzNzpbMiw2OF0sNDY6WzIsNjhdLDUxOlsyLDY4XSw1NDpbMiw2OF0sNjM6WzIsNjhdLDY0OlsyLDY4XSw2NTpbMiw2OF0sNjc6WzIsNjhdLDY5OlsyLDY4XSw3MDpbMiw2OF0sNzE6WzIsNjhdLDc1OlsyLDY4XSw4MTpbMiw2OF0sODI6WzIsNjhdLDgzOlsyLDY4XSw4ODpbMiw2OF0sOTA6WzIsNjhdLDk5OlsyLDY4XSwxMDE6WzIsNjhdLDEwMjpbMiw2OF0sMTAzOlsyLDY4XSwxMDc6WzIsNjhdLDExNTpbMiw2OF0sMTIzOlsyLDY4XSwxMjU6WzIsNjhdLDEyNjpbMiw2OF0sMTI5OlsyLDY4XSwxMzA6WzIsNjhdLDEzMTpbMiw2OF0sMTMyOlsyLDY4XSwxMzM6WzIsNjhdLDEzNDpbMiw2OF19LHsxOlsyLDI5XSw2OlsyLDI5XSwyNTpbMiwyOV0sMjY6WzIsMjldLDQ2OlsyLDI5XSw1MTpbMiwyOV0sNTQ6WzIsMjldLDYzOlsyLDI5XSw2NDpbMiwyOV0sNjU6WzIsMjldLDY3OlsyLDI5XSw2OTpbMiwyOV0sNzA6WzIsMjldLDcxOlsyLDI5XSw3NTpbMiwyOV0sODE6WzIsMjldLDgyOlsyLDI5XSw4MzpbMiwyOV0sODg6WzIsMjldLDkwOlsyLDI5XSw5OTpbMiwyOV0sMTAxOlsyLDI5XSwxMDI6WzIsMjldLDEwMzpbMiwyOV0sMTA3OlsyLDI5XSwxMTU6WzIsMjldLDEyMzpbMiwyOV0sMTI1OlsyLDI5XSwxMjY6WzIsMjldLDEyOTpbMiwyOV0sMTMwOlsyLDI5XSwxMzE6WzIsMjldLDEzMjpbMiwyOV0sMTMzOlsyLDI5XSwxMzQ6WzIsMjldfSx7MTpbMiwzMF0sNjpbMiwzMF0sMjU6WzIsMzBdLDI2OlsyLDMwXSw0NjpbMiwzMF0sNTE6WzIsMzBdLDU0OlsyLDMwXSw2MzpbMiwzMF0sNjQ6WzIsMzBdLDY1OlsyLDMwXSw2NzpbMiwzMF0sNjk6WzIsMzBdLDcwOlsyLDMwXSw3MTpbMiwzMF0sNzU6WzIsMzBdLDgxOlsyLDMwXSw4MjpbMiwzMF0sODM6WzIsMzBdLDg4OlsyLDMwXSw5MDpbMiwzMF0sOTk6WzIsMzBdLDEwMTpbMiwzMF0sMTAyOlsyLDMwXSwxMDM6WzIsMzBdLDEwNzpbMiwzMF0sMTE1OlsyLDMwXSwxMjM6WzIsMzBdLDEyNTpbMiwzMF0sMTI2OlsyLDMwXSwxMjk6WzIsMzBdLDEzMDpbMiwzMF0sMTMxOlsyLDMwXSwxMzI6WzIsMzBdLDEzMzpbMiwzMF0sMTM0OlsyLDMwXX0sezE6WzIsMzFdLDY6WzIsMzFdLDI1OlsyLDMxXSwyNjpbMiwzMV0sNDY6WzIsMzFdLDUxOlsyLDMxXSw1NDpbMiwzMV0sNjM6WzIsMzFdLDY0OlsyLDMxXSw2NTpbMiwzMV0sNjc6WzIsMzFdLDY5OlsyLDMxXSw3MDpbMiwzMV0sNzE6WzIsMzFdLDc1OlsyLDMxXSw4MTpbMiwzMV0sODI6WzIsMzFdLDgzOlsyLDMxXSw4ODpbMiwzMV0sOTA6WzIsMzFdLDk5OlsyLDMxXSwxMDE6WzIsMzFdLDEwMjpbMiwzMV0sMTAzOlsyLDMxXSwxMDc6WzIsMzFdLDExNTpbMiwzMV0sMTIzOlsyLDMxXSwxMjU6WzIsMzFdLDEyNjpbMiwzMV0sMTI5OlsyLDMxXSwxMzA6WzIsMzFdLDEzMTpbMiwzMV0sMTMyOlsyLDMxXSwxMzM6WzIsMzFdLDEzNDpbMiwzMV19LHsxOlsyLDMyXSw2OlsyLDMyXSwyNTpbMiwzMl0sMjY6WzIsMzJdLDQ2OlsyLDMyXSw1MTpbMiwzMl0sNTQ6WzIsMzJdLDYzOlsyLDMyXSw2NDpbMiwzMl0sNjU6WzIsMzJdLDY3OlsyLDMyXSw2OTpbMiwzMl0sNzA6WzIsMzJdLDcxOlsyLDMyXSw3NTpbMiwzMl0sODE6WzIsMzJdLDgyOlsyLDMyXSw4MzpbMiwzMl0sODg6WzIsMzJdLDkwOlsyLDMyXSw5OTpbMiwzMl0sMTAxOlsyLDMyXSwxMDI6WzIsMzJdLDEwMzpbMiwzMl0sMTA3OlsyLDMyXSwxMTU6WzIsMzJdLDEyMzpbMiwzMl0sMTI1OlsyLDMyXSwxMjY6WzIsMzJdLDEyOTpbMiwzMl0sMTMwOlsyLDMyXSwxMzE6WzIsMzJdLDEzMjpbMiwzMl0sMTMzOlsyLDMyXSwxMzQ6WzIsMzJdfSx7NDoxMzgsNzo0LDg6Niw5OjcsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNTpbMSwxMzldLDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHs4OjE0MCw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI1OlsxLDE0NF0sMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1NzoxNDUsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODQ6MTQyLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDg4OlsxLDE0MV0sOTE6MTQzLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7MTpbMiwxMDZdLDY6WzIsMTA2XSwyNTpbMiwxMDZdLDI2OlsyLDEwNl0sNDY6WzIsMTA2XSw1MTpbMiwxMDZdLDU0OlsyLDEwNl0sNjM6WzIsMTA2XSw2NDpbMiwxMDZdLDY1OlsyLDEwNl0sNjc6WzIsMTA2XSw2OTpbMiwxMDZdLDcwOlsyLDEwNl0sNzE6WzIsMTA2XSw3NTpbMiwxMDZdLDgxOlsyLDEwNl0sODI6WzIsMTA2XSw4MzpbMiwxMDZdLDg4OlsyLDEwNl0sOTA6WzIsMTA2XSw5OTpbMiwxMDZdLDEwMTpbMiwxMDZdLDEwMjpbMiwxMDZdLDEwMzpbMiwxMDZdLDEwNzpbMiwxMDZdLDExNTpbMiwxMDZdLDEyMzpbMiwxMDZdLDEyNTpbMiwxMDZdLDEyNjpbMiwxMDZdLDEyOTpbMiwxMDZdLDEzMDpbMiwxMDZdLDEzMTpbMiwxMDZdLDEzMjpbMiwxMDZdLDEzMzpbMiwxMDZdLDEzNDpbMiwxMDZdfSx7MTpbMiwxMDddLDY6WzIsMTA3XSwyNTpbMiwxMDddLDI2OlsyLDEwN10sMjc6MTQ2LDI4OlsxLDcwXSw0NjpbMiwxMDddLDUxOlsyLDEwN10sNTQ6WzIsMTA3XSw2MzpbMiwxMDddLDY0OlsyLDEwN10sNjU6WzIsMTA3XSw2NzpbMiwxMDddLDY5OlsyLDEwN10sNzA6WzIsMTA3XSw3MTpbMiwxMDddLDc1OlsyLDEwN10sODE6WzIsMTA3XSw4MjpbMiwxMDddLDgzOlsyLDEwN10sODg6WzIsMTA3XSw5MDpbMiwxMDddLDk5OlsyLDEwN10sMTAxOlsyLDEwN10sMTAyOlsyLDEwN10sMTAzOlsyLDEwN10sMTA3OlsyLDEwN10sMTE1OlsyLDEwN10sMTIzOlsyLDEwN10sMTI1OlsyLDEwN10sMTI2OlsyLDEwN10sMTI5OlsyLDEwN10sMTMwOlsyLDEwN10sMTMxOlsyLDEwN10sMTMyOlsyLDEwN10sMTMzOlsyLDEwN10sMTM0OlsyLDEwN119LHsyNTpbMiw0N119LHsyNTpbMiw0OF19LHsxOlsyLDYyXSw2OlsyLDYyXSwyNTpbMiw2Ml0sMjY6WzIsNjJdLDM3OlsyLDYyXSw0NjpbMiw2Ml0sNTE6WzIsNjJdLDU0OlsyLDYyXSw2MzpbMiw2Ml0sNjQ6WzIsNjJdLDY1OlsyLDYyXSw2NzpbMiw2Ml0sNjk6WzIsNjJdLDcwOlsyLDYyXSw3MTpbMiw2Ml0sNzU6WzIsNjJdLDc3OlsyLDYyXSw4MTpbMiw2Ml0sODI6WzIsNjJdLDgzOlsyLDYyXSw4ODpbMiw2Ml0sOTA6WzIsNjJdLDk5OlsyLDYyXSwxMDE6WzIsNjJdLDEwMjpbMiw2Ml0sMTAzOlsyLDYyXSwxMDc6WzIsNjJdLDExNTpbMiw2Ml0sMTIzOlsyLDYyXSwxMjU6WzIsNjJdLDEyNjpbMiw2Ml0sMTI3OlsyLDYyXSwxMjg6WzIsNjJdLDEyOTpbMiw2Ml0sMTMwOlsyLDYyXSwxMzE6WzIsNjJdLDEzMjpbMiw2Ml0sMTMzOlsyLDYyXSwxMzQ6WzIsNjJdLDEzNTpbMiw2Ml19LHsxOlsyLDY1XSw2OlsyLDY1XSwyNTpbMiw2NV0sMjY6WzIsNjVdLDM3OlsyLDY1XSw0NjpbMiw2NV0sNTE6WzIsNjVdLDU0OlsyLDY1XSw2MzpbMiw2NV0sNjQ6WzIsNjVdLDY1OlsyLDY1XSw2NzpbMiw2NV0sNjk6WzIsNjVdLDcwOlsyLDY1XSw3MTpbMiw2NV0sNzU6WzIsNjVdLDc3OlsyLDY1XSw4MTpbMiw2NV0sODI6WzIsNjVdLDgzOlsyLDY1XSw4ODpbMiw2NV0sOTA6WzIsNjVdLDk5OlsyLDY1XSwxMDE6WzIsNjVdLDEwMjpbMiw2NV0sMTAzOlsyLDY1XSwxMDc6WzIsNjVdLDExNTpbMiw2NV0sMTIzOlsyLDY1XSwxMjU6WzIsNjVdLDEyNjpbMiw2NV0sMTI3OlsyLDY1XSwxMjg6WzIsNjVdLDEyOTpbMiw2NV0sMTMwOlsyLDY1XSwxMzE6WzIsNjVdLDEzMjpbMiw2NV0sMTMzOlsyLDY1XSwxMzQ6WzIsNjVdLDEzNTpbMiw2NV19LHs4OjE0Nyw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHs4OjE0OCw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHs4OjE0OSw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHs1OjE1MCw4OjE1MSw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI1OlsxLDVdLDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHsyNzoxNTYsMjg6WzEsNzBdLDU1OjE1Nyw1NjoxNTgsNjE6MTUyLDczOlsxLDY3XSw4NzpbMSw1NF0sMTEwOjE1MywxMTE6WzEsMTU0XSwxMTI6MTU1fSx7MTA5OjE1OSwxMTM6WzEsMTYwXSwxMTQ6WzEsMTYxXX0sezY6WzIsODVdLDEyOjE2NSwyNTpbMiw4NV0sMjc6MTY2LDI4OlsxLDcwXSwyOToxNjcsMzA6WzEsNjhdLDMxOlsxLDY5XSwzODoxNjMsMzk6MTY0LDQxOjE2OCw0MzpbMSw0Nl0sNTE6WzIsODVdLDc0OjE2Miw3NTpbMiw4NV0sODY6WzEsMTExXX0sezE6WzIsMjddLDY6WzIsMjddLDI1OlsyLDI3XSwyNjpbMiwyN10sNDA6WzIsMjddLDQ2OlsyLDI3XSw1MTpbMiwyN10sNTQ6WzIsMjddLDYzOlsyLDI3XSw2NDpbMiwyN10sNjU6WzIsMjddLDY3OlsyLDI3XSw2OTpbMiwyN10sNzA6WzIsMjddLDcxOlsyLDI3XSw3NTpbMiwyN10sODE6WzIsMjddLDgyOlsyLDI3XSw4MzpbMiwyN10sODg6WzIsMjddLDkwOlsyLDI3XSw5OTpbMiwyN10sMTAxOlsyLDI3XSwxMDI6WzIsMjddLDEwMzpbMiwyN10sMTA3OlsyLDI3XSwxMTU6WzIsMjddLDEyMzpbMiwyN10sMTI1OlsyLDI3XSwxMjY6WzIsMjddLDEyOTpbMiwyN10sMTMwOlsyLDI3XSwxMzE6WzIsMjddLDEzMjpbMiwyN10sMTMzOlsyLDI3XSwxMzQ6WzIsMjddfSx7MTpbMiwyOF0sNjpbMiwyOF0sMjU6WzIsMjhdLDI2OlsyLDI4XSw0MDpbMiwyOF0sNDY6WzIsMjhdLDUxOlsyLDI4XSw1NDpbMiwyOF0sNjM6WzIsMjhdLDY0OlsyLDI4XSw2NTpbMiwyOF0sNjc6WzIsMjhdLDY5OlsyLDI4XSw3MDpbMiwyOF0sNzE6WzIsMjhdLDc1OlsyLDI4XSw4MTpbMiwyOF0sODI6WzIsMjhdLDgzOlsyLDI4XSw4ODpbMiwyOF0sOTA6WzIsMjhdLDk5OlsyLDI4XSwxMDE6WzIsMjhdLDEwMjpbMiwyOF0sMTAzOlsyLDI4XSwxMDc6WzIsMjhdLDExNTpbMiwyOF0sMTIzOlsyLDI4XSwxMjU6WzIsMjhdLDEyNjpbMiwyOF0sMTI5OlsyLDI4XSwxMzA6WzIsMjhdLDEzMTpbMiwyOF0sMTMyOlsyLDI4XSwxMzM6WzIsMjhdLDEzNDpbMiwyOF19LHsxOlsyLDI2XSw2OlsyLDI2XSwyNTpbMiwyNl0sMjY6WzIsMjZdLDM3OlsyLDI2XSw0MDpbMiwyNl0sNDY6WzIsMjZdLDUxOlsyLDI2XSw1NDpbMiwyNl0sNjM6WzIsMjZdLDY0OlsyLDI2XSw2NTpbMiwyNl0sNjc6WzIsMjZdLDY5OlsyLDI2XSw3MDpbMiwyNl0sNzE6WzIsMjZdLDc1OlsyLDI2XSw3NzpbMiwyNl0sODE6WzIsMjZdLDgyOlsyLDI2XSw4MzpbMiwyNl0sODg6WzIsMjZdLDkwOlsyLDI2XSw5OTpbMiwyNl0sMTAxOlsyLDI2XSwxMDI6WzIsMjZdLDEwMzpbMiwyNl0sMTA3OlsyLDI2XSwxMTM6WzIsMjZdLDExNDpbMiwyNl0sMTE1OlsyLDI2XSwxMjM6WzIsMjZdLDEyNTpbMiwyNl0sMTI2OlsyLDI2XSwxMjc6WzIsMjZdLDEyODpbMiwyNl0sMTI5OlsyLDI2XSwxMzA6WzIsMjZdLDEzMTpbMiwyNl0sMTMyOlsyLDI2XSwxMzM6WzIsMjZdLDEzNDpbMiwyNl0sMTM1OlsyLDI2XX0sezE6WzIsNl0sNjpbMiw2XSw3OjE2OSw4OjYsOTo3LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjY6WzIsNl0sMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSw5OTpbMiw2XSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezE6WzIsM119LHsxOlsyLDI0XSw2OlsyLDI0XSwyNTpbMiwyNF0sMjY6WzIsMjRdLDQ2OlsyLDI0XSw1MTpbMiwyNF0sNTQ6WzIsMjRdLDY5OlsyLDI0XSw3NTpbMiwyNF0sODM6WzIsMjRdLDg4OlsyLDI0XSw5MDpbMiwyNF0sOTU6WzIsMjRdLDk2OlsyLDI0XSw5OTpbMiwyNF0sMTAxOlsyLDI0XSwxMDI6WzIsMjRdLDEwMzpbMiwyNF0sMTA3OlsyLDI0XSwxMTU6WzIsMjRdLDExODpbMiwyNF0sMTIwOlsyLDI0XSwxMjM6WzIsMjRdLDEyNTpbMiwyNF0sMTI2OlsyLDI0XSwxMjk6WzIsMjRdLDEzMDpbMiwyNF0sMTMxOlsyLDI0XSwxMzI6WzIsMjRdLDEzMzpbMiwyNF0sMTM0OlsyLDI0XX0sezY6WzEsNzFdLDI2OlsxLDE3MF19LHsxOlsyLDE4NF0sNjpbMiwxODRdLDI1OlsyLDE4NF0sMjY6WzIsMTg0XSw0NjpbMiwxODRdLDUxOlsyLDE4NF0sNTQ6WzIsMTg0XSw2OTpbMiwxODRdLDc1OlsyLDE4NF0sODM6WzIsMTg0XSw4ODpbMiwxODRdLDkwOlsyLDE4NF0sOTk6WzIsMTg0XSwxMDE6WzIsMTg0XSwxMDI6WzIsMTg0XSwxMDM6WzIsMTg0XSwxMDc6WzIsMTg0XSwxMTU6WzIsMTg0XSwxMjM6WzIsMTg0XSwxMjU6WzIsMTg0XSwxMjY6WzIsMTg0XSwxMjk6WzIsMTg0XSwxMzA6WzIsMTg0XSwxMzE6WzIsMTg0XSwxMzI6WzIsMTg0XSwxMzM6WzIsMTg0XSwxMzQ6WzIsMTg0XX0sezg6MTcxLDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezg6MTcyLDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezg6MTczLDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezg6MTc0LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezg6MTc1LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezg6MTc2LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezg6MTc3LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezg6MTc4LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezE6WzIsMTQwXSw2OlsyLDE0MF0sMjU6WzIsMTQwXSwyNjpbMiwxNDBdLDQ2OlsyLDE0MF0sNTE6WzIsMTQwXSw1NDpbMiwxNDBdLDY5OlsyLDE0MF0sNzU6WzIsMTQwXSw4MzpbMiwxNDBdLDg4OlsyLDE0MF0sOTA6WzIsMTQwXSw5OTpbMiwxNDBdLDEwMTpbMiwxNDBdLDEwMjpbMiwxNDBdLDEwMzpbMiwxNDBdLDEwNzpbMiwxNDBdLDExNTpbMiwxNDBdLDEyMzpbMiwxNDBdLDEyNTpbMiwxNDBdLDEyNjpbMiwxNDBdLDEyOTpbMiwxNDBdLDEzMDpbMiwxNDBdLDEzMTpbMiwxNDBdLDEzMjpbMiwxNDBdLDEzMzpbMiwxNDBdLDEzNDpbMiwxNDBdfSx7MTpbMiwxNDVdLDY6WzIsMTQ1XSwyNTpbMiwxNDVdLDI2OlsyLDE0NV0sNDY6WzIsMTQ1XSw1MTpbMiwxNDVdLDU0OlsyLDE0NV0sNjk6WzIsMTQ1XSw3NTpbMiwxNDVdLDgzOlsyLDE0NV0sODg6WzIsMTQ1XSw5MDpbMiwxNDVdLDk5OlsyLDE0NV0sMTAxOlsyLDE0NV0sMTAyOlsyLDE0NV0sMTAzOlsyLDE0NV0sMTA3OlsyLDE0NV0sMTE1OlsyLDE0NV0sMTIzOlsyLDE0NV0sMTI1OlsyLDE0NV0sMTI2OlsyLDE0NV0sMTI5OlsyLDE0NV0sMTMwOlsyLDE0NV0sMTMxOlsyLDE0NV0sMTMyOlsyLDE0NV0sMTMzOlsyLDE0NV0sMTM0OlsyLDE0NV19LHs4OjE3OSw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHsxOlsyLDEzOV0sNjpbMiwxMzldLDI1OlsyLDEzOV0sMjY6WzIsMTM5XSw0NjpbMiwxMzldLDUxOlsyLDEzOV0sNTQ6WzIsMTM5XSw2OTpbMiwxMzldLDc1OlsyLDEzOV0sODM6WzIsMTM5XSw4ODpbMiwxMzldLDkwOlsyLDEzOV0sOTk6WzIsMTM5XSwxMDE6WzIsMTM5XSwxMDI6WzIsMTM5XSwxMDM6WzIsMTM5XSwxMDc6WzIsMTM5XSwxMTU6WzIsMTM5XSwxMjM6WzIsMTM5XSwxMjU6WzIsMTM5XSwxMjY6WzIsMTM5XSwxMjk6WzIsMTM5XSwxMzA6WzIsMTM5XSwxMzE6WzIsMTM5XSwxMzI6WzIsMTM5XSwxMzM6WzIsMTM5XSwxMzQ6WzIsMTM5XX0sezE6WzIsMTQ0XSw2OlsyLDE0NF0sMjU6WzIsMTQ0XSwyNjpbMiwxNDRdLDQ2OlsyLDE0NF0sNTE6WzIsMTQ0XSw1NDpbMiwxNDRdLDY5OlsyLDE0NF0sNzU6WzIsMTQ0XSw4MzpbMiwxNDRdLDg4OlsyLDE0NF0sOTA6WzIsMTQ0XSw5OTpbMiwxNDRdLDEwMTpbMiwxNDRdLDEwMjpbMiwxNDRdLDEwMzpbMiwxNDRdLDEwNzpbMiwxNDRdLDExNTpbMiwxNDRdLDEyMzpbMiwxNDRdLDEyNTpbMiwxNDRdLDEyNjpbMiwxNDRdLDEyOTpbMiwxNDRdLDEzMDpbMiwxNDRdLDEzMTpbMiwxNDRdLDEzMjpbMiwxNDRdLDEzMzpbMiwxNDRdLDEzNDpbMiwxNDRdfSx7Nzk6MTgwLDgyOlsxLDEwM119LHsxOlsyLDYzXSw2OlsyLDYzXSwyNTpbMiw2M10sMjY6WzIsNjNdLDM3OlsyLDYzXSw0NjpbMiw2M10sNTE6WzIsNjNdLDU0OlsyLDYzXSw2MzpbMiw2M10sNjQ6WzIsNjNdLDY1OlsyLDYzXSw2NzpbMiw2M10sNjk6WzIsNjNdLDcwOlsyLDYzXSw3MTpbMiw2M10sNzU6WzIsNjNdLDc3OlsyLDYzXSw4MTpbMiw2M10sODI6WzIsNjNdLDgzOlsyLDYzXSw4ODpbMiw2M10sOTA6WzIsNjNdLDk5OlsyLDYzXSwxMDE6WzIsNjNdLDEwMjpbMiw2M10sMTAzOlsyLDYzXSwxMDc6WzIsNjNdLDExNTpbMiw2M10sMTIzOlsyLDYzXSwxMjU6WzIsNjNdLDEyNjpbMiw2M10sMTI3OlsyLDYzXSwxMjg6WzIsNjNdLDEyOTpbMiw2M10sMTMwOlsyLDYzXSwxMzE6WzIsNjNdLDEzMjpbMiw2M10sMTMzOlsyLDYzXSwxMzQ6WzIsNjNdLDEzNTpbMiw2M119LHs4MjpbMiwxMDNdfSx7Mjc6MTgxLDI4OlsxLDcwXX0sezI3OjE4MiwyODpbMSw3MF19LHsxOlsyLDc3XSw2OlsyLDc3XSwyNTpbMiw3N10sMjY6WzIsNzddLDI3OjE4MywyODpbMSw3MF0sMzc6WzIsNzddLDQ2OlsyLDc3XSw1MTpbMiw3N10sNTQ6WzIsNzddLDYzOlsyLDc3XSw2NDpbMiw3N10sNjU6WzIsNzddLDY3OlsyLDc3XSw2OTpbMiw3N10sNzA6WzIsNzddLDcxOlsyLDc3XSw3NTpbMiw3N10sNzc6WzIsNzddLDgxOlsyLDc3XSw4MjpbMiw3N10sODM6WzIsNzddLDg4OlsyLDc3XSw5MDpbMiw3N10sOTk6WzIsNzddLDEwMTpbMiw3N10sMTAyOlsyLDc3XSwxMDM6WzIsNzddLDEwNzpbMiw3N10sMTE1OlsyLDc3XSwxMjM6WzIsNzddLDEyNTpbMiw3N10sMTI2OlsyLDc3XSwxMjc6WzIsNzddLDEyODpbMiw3N10sMTI5OlsyLDc3XSwxMzA6WzIsNzddLDEzMTpbMiw3N10sMTMyOlsyLDc3XSwxMzM6WzIsNzddLDEzNDpbMiw3N10sMTM1OlsyLDc3XX0sezE6WzIsNzhdLDY6WzIsNzhdLDI1OlsyLDc4XSwyNjpbMiw3OF0sMzc6WzIsNzhdLDQ2OlsyLDc4XSw1MTpbMiw3OF0sNTQ6WzIsNzhdLDYzOlsyLDc4XSw2NDpbMiw3OF0sNjU6WzIsNzhdLDY3OlsyLDc4XSw2OTpbMiw3OF0sNzA6WzIsNzhdLDcxOlsyLDc4XSw3NTpbMiw3OF0sNzc6WzIsNzhdLDgxOlsyLDc4XSw4MjpbMiw3OF0sODM6WzIsNzhdLDg4OlsyLDc4XSw5MDpbMiw3OF0sOTk6WzIsNzhdLDEwMTpbMiw3OF0sMTAyOlsyLDc4XSwxMDM6WzIsNzhdLDEwNzpbMiw3OF0sMTE1OlsyLDc4XSwxMjM6WzIsNzhdLDEyNTpbMiw3OF0sMTI2OlsyLDc4XSwxMjc6WzIsNzhdLDEyODpbMiw3OF0sMTI5OlsyLDc4XSwxMzA6WzIsNzhdLDEzMTpbMiw3OF0sMTMyOlsyLDc4XSwxMzM6WzIsNzhdLDEzNDpbMiw3OF0sMTM1OlsyLDc4XX0sezg6MTg1LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NDpbMSwxODldLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDY4OjE4NCw3MjoxODYsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sODk6MTg3LDkwOlsxLDE4OF0sOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHs2NjoxOTAsNjc6WzEsOTZdLDcwOlsxLDk3XSw3MTpbMSw5OF19LHs2NjoxOTEsNjc6WzEsOTZdLDcwOlsxLDk3XSw3MTpbMSw5OF19LHs3OToxOTIsODI6WzEsMTAzXX0sezE6WzIsNjRdLDY6WzIsNjRdLDI1OlsyLDY0XSwyNjpbMiw2NF0sMzc6WzIsNjRdLDQ2OlsyLDY0XSw1MTpbMiw2NF0sNTQ6WzIsNjRdLDYzOlsyLDY0XSw2NDpbMiw2NF0sNjU6WzIsNjRdLDY3OlsyLDY0XSw2OTpbMiw2NF0sNzA6WzIsNjRdLDcxOlsyLDY0XSw3NTpbMiw2NF0sNzc6WzIsNjRdLDgxOlsyLDY0XSw4MjpbMiw2NF0sODM6WzIsNjRdLDg4OlsyLDY0XSw5MDpbMiw2NF0sOTk6WzIsNjRdLDEwMTpbMiw2NF0sMTAyOlsyLDY0XSwxMDM6WzIsNjRdLDEwNzpbMiw2NF0sMTE1OlsyLDY0XSwxMjM6WzIsNjRdLDEyNTpbMiw2NF0sMTI2OlsyLDY0XSwxMjc6WzIsNjRdLDEyODpbMiw2NF0sMTI5OlsyLDY0XSwxMzA6WzIsNjRdLDEzMTpbMiw2NF0sMTMyOlsyLDY0XSwxMzM6WzIsNjRdLDEzNDpbMiw2NF0sMTM1OlsyLDY0XX0sezg6MTkzLDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjU6WzEsMTk0XSwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7MTpbMiwxMDFdLDY6WzIsMTAxXSwyNTpbMiwxMDFdLDI2OlsyLDEwMV0sNDY6WzIsMTAxXSw1MTpbMiwxMDFdLDU0OlsyLDEwMV0sNjM6WzIsMTAxXSw2NDpbMiwxMDFdLDY1OlsyLDEwMV0sNjc6WzIsMTAxXSw2OTpbMiwxMDFdLDcwOlsyLDEwMV0sNzE6WzIsMTAxXSw3NTpbMiwxMDFdLDgxOlsyLDEwMV0sODI6WzIsMTAxXSw4MzpbMiwxMDFdLDg4OlsyLDEwMV0sOTA6WzIsMTAxXSw5OTpbMiwxMDFdLDEwMTpbMiwxMDFdLDEwMjpbMiwxMDFdLDEwMzpbMiwxMDFdLDEwNzpbMiwxMDFdLDExNTpbMiwxMDFdLDEyMzpbMiwxMDFdLDEyNTpbMiwxMDFdLDEyNjpbMiwxMDFdLDEyOTpbMiwxMDFdLDEzMDpbMiwxMDFdLDEzMTpbMiwxMDFdLDEzMjpbMiwxMDFdLDEzMzpbMiwxMDFdLDEzNDpbMiwxMDFdfSx7ODoxOTcsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNTpbMSwxNDRdLDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTc6MTQ1LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDgzOlsxLDE5NV0sODQ6MTk2LDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkxOjE0Myw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezQ2OlsxLDE5OF0sNTE6WzEsMTk5XX0sezQ2OlsyLDUyXSw1MTpbMiw1Ml19LHszNzpbMSwyMDFdLDQ2OlsyLDU0XSw1MTpbMiw1NF0sNTQ6WzEsMjAwXX0sezM3OlsyLDU3XSw0NjpbMiw1N10sNTE6WzIsNTddLDU0OlsyLDU3XX0sezM3OlsyLDU4XSw0NjpbMiw1OF0sNTE6WzIsNThdLDU0OlsyLDU4XX0sezM3OlsyLDU5XSw0NjpbMiw1OV0sNTE6WzIsNTldLDU0OlsyLDU5XX0sezM3OlsyLDYwXSw0NjpbMiw2MF0sNTE6WzIsNjBdLDU0OlsyLDYwXX0sezI3OjE0NiwyODpbMSw3MF19LHs4OjE5Nyw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI1OlsxLDE0NF0sMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1NzoxNDUsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODQ6MTQyLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDg4OlsxLDE0MV0sOTE6MTQzLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7MTpbMiw0Nl0sNjpbMiw0Nl0sMjU6WzIsNDZdLDI2OlsyLDQ2XSw0NjpbMiw0Nl0sNTE6WzIsNDZdLDU0OlsyLDQ2XSw2OTpbMiw0Nl0sNzU6WzIsNDZdLDgzOlsyLDQ2XSw4ODpbMiw0Nl0sOTA6WzIsNDZdLDk5OlsyLDQ2XSwxMDE6WzIsNDZdLDEwMjpbMiw0Nl0sMTAzOlsyLDQ2XSwxMDc6WzIsNDZdLDExNTpbMiw0Nl0sMTIzOlsyLDQ2XSwxMjU6WzIsNDZdLDEyNjpbMiw0Nl0sMTI5OlsyLDQ2XSwxMzA6WzIsNDZdLDEzMTpbMiw0Nl0sMTMyOlsyLDQ2XSwxMzM6WzIsNDZdLDEzNDpbMiw0Nl19LHsxOlsyLDE3N10sNjpbMiwxNzddLDI1OlsyLDE3N10sMjY6WzIsMTc3XSw0NjpbMiwxNzddLDUxOlsyLDE3N10sNTQ6WzIsMTc3XSw2OTpbMiwxNzddLDc1OlsyLDE3N10sODM6WzIsMTc3XSw4ODpbMiwxNzddLDkwOlsyLDE3N10sOTk6WzIsMTc3XSwxMDA6ODQsMTAxOlsyLDE3N10sMTAyOlsyLDE3N10sMTAzOlsyLDE3N10sMTA2Ojg1LDEwNzpbMiwxNzddLDEwODo2NiwxMTU6WzIsMTc3XSwxMjM6WzIsMTc3XSwxMjU6WzIsMTc3XSwxMjY6WzIsMTc3XSwxMjk6WzEsNzVdLDEzMDpbMiwxNzddLDEzMTpbMiwxNzddLDEzMjpbMiwxNzddLDEzMzpbMiwxNzddLDEzNDpbMiwxNzddfSx7MTAwOjg3LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDY6ODgsMTA3OlsxLDY1XSwxMDg6NjYsMTIzOlsxLDg2XX0sezE6WzIsMTc4XSw2OlsyLDE3OF0sMjU6WzIsMTc4XSwyNjpbMiwxNzhdLDQ2OlsyLDE3OF0sNTE6WzIsMTc4XSw1NDpbMiwxNzhdLDY5OlsyLDE3OF0sNzU6WzIsMTc4XSw4MzpbMiwxNzhdLDg4OlsyLDE3OF0sOTA6WzIsMTc4XSw5OTpbMiwxNzhdLDEwMDo4NCwxMDE6WzIsMTc4XSwxMDI6WzIsMTc4XSwxMDM6WzIsMTc4XSwxMDY6ODUsMTA3OlsyLDE3OF0sMTA4OjY2LDExNTpbMiwxNzhdLDEyMzpbMiwxNzhdLDEyNTpbMiwxNzhdLDEyNjpbMiwxNzhdLDEyOTpbMSw3NV0sMTMwOlsyLDE3OF0sMTMxOlsyLDE3OF0sMTMyOlsyLDE3OF0sMTMzOlsyLDE3OF0sMTM0OlsyLDE3OF19LHsxOlsyLDE3OV0sNjpbMiwxNzldLDI1OlsyLDE3OV0sMjY6WzIsMTc5XSw0NjpbMiwxNzldLDUxOlsyLDE3OV0sNTQ6WzIsMTc5XSw2OTpbMiwxNzldLDc1OlsyLDE3OV0sODM6WzIsMTc5XSw4ODpbMiwxNzldLDkwOlsyLDE3OV0sOTk6WzIsMTc5XSwxMDA6ODQsMTAxOlsyLDE3OV0sMTAyOlsyLDE3OV0sMTAzOlsyLDE3OV0sMTA2Ojg1LDEwNzpbMiwxNzldLDEwODo2NiwxMTU6WzIsMTc5XSwxMjM6WzIsMTc5XSwxMjU6WzIsMTc5XSwxMjY6WzIsMTc5XSwxMjk6WzEsNzVdLDEzMDpbMiwxNzldLDEzMTpbMiwxNzldLDEzMjpbMiwxNzldLDEzMzpbMiwxNzldLDEzNDpbMiwxNzldfSx7MTpbMiwxODBdLDY6WzIsMTgwXSwyNTpbMiwxODBdLDI2OlsyLDE4MF0sNDY6WzIsMTgwXSw1MTpbMiwxODBdLDU0OlsyLDE4MF0sNjM6WzIsNjZdLDY0OlsyLDY2XSw2NTpbMiw2Nl0sNjc6WzIsNjZdLDY5OlsyLDE4MF0sNzA6WzIsNjZdLDcxOlsyLDY2XSw3NTpbMiwxODBdLDgxOlsyLDY2XSw4MjpbMiw2Nl0sODM6WzIsMTgwXSw4ODpbMiwxODBdLDkwOlsyLDE4MF0sOTk6WzIsMTgwXSwxMDE6WzIsMTgwXSwxMDI6WzIsMTgwXSwxMDM6WzIsMTgwXSwxMDc6WzIsMTgwXSwxMTU6WzIsMTgwXSwxMjM6WzIsMTgwXSwxMjU6WzIsMTgwXSwxMjY6WzIsMTgwXSwxMjk6WzIsMTgwXSwxMzA6WzIsMTgwXSwxMzE6WzIsMTgwXSwxMzI6WzIsMTgwXSwxMzM6WzIsMTgwXSwxMzQ6WzIsMTgwXX0sezU5OjkwLDYzOlsxLDkyXSw2NDpbMSw5M10sNjU6WzEsOTRdLDY2Ojk1LDY3OlsxLDk2XSw3MDpbMSw5N10sNzE6WzEsOThdLDc4Ojg5LDgxOlsxLDkxXSw4MjpbMiwxMDJdfSx7NTk6MTAwLDYzOlsxLDkyXSw2NDpbMSw5M10sNjU6WzEsOTRdLDY2Ojk1LDY3OlsxLDk2XSw3MDpbMSw5N10sNzE6WzEsOThdLDc4Ojk5LDgxOlsxLDkxXSw4MjpbMiwxMDJdfSx7MTpbMiw2OV0sNjpbMiw2OV0sMjU6WzIsNjldLDI2OlsyLDY5XSw0NjpbMiw2OV0sNTE6WzIsNjldLDU0OlsyLDY5XSw2MzpbMiw2OV0sNjQ6WzIsNjldLDY1OlsyLDY5XSw2NzpbMiw2OV0sNjk6WzIsNjldLDcwOlsyLDY5XSw3MTpbMiw2OV0sNzU6WzIsNjldLDgxOlsyLDY5XSw4MjpbMiw2OV0sODM6WzIsNjldLDg4OlsyLDY5XSw5MDpbMiw2OV0sOTk6WzIsNjldLDEwMTpbMiw2OV0sMTAyOlsyLDY5XSwxMDM6WzIsNjldLDEwNzpbMiw2OV0sMTE1OlsyLDY5XSwxMjM6WzIsNjldLDEyNTpbMiw2OV0sMTI2OlsyLDY5XSwxMjk6WzIsNjldLDEzMDpbMiw2OV0sMTMxOlsyLDY5XSwxMzI6WzIsNjldLDEzMzpbMiw2OV0sMTM0OlsyLDY5XX0sezE6WzIsMTgxXSw2OlsyLDE4MV0sMjU6WzIsMTgxXSwyNjpbMiwxODFdLDQ2OlsyLDE4MV0sNTE6WzIsMTgxXSw1NDpbMiwxODFdLDYzOlsyLDY2XSw2NDpbMiw2Nl0sNjU6WzIsNjZdLDY3OlsyLDY2XSw2OTpbMiwxODFdLDcwOlsyLDY2XSw3MTpbMiw2Nl0sNzU6WzIsMTgxXSw4MTpbMiw2Nl0sODI6WzIsNjZdLDgzOlsyLDE4MV0sODg6WzIsMTgxXSw5MDpbMiwxODFdLDk5OlsyLDE4MV0sMTAxOlsyLDE4MV0sMTAyOlsyLDE4MV0sMTAzOlsyLDE4MV0sMTA3OlsyLDE4MV0sMTE1OlsyLDE4MV0sMTIzOlsyLDE4MV0sMTI1OlsyLDE4MV0sMTI2OlsyLDE4MV0sMTI5OlsyLDE4MV0sMTMwOlsyLDE4MV0sMTMxOlsyLDE4MV0sMTMyOlsyLDE4MV0sMTMzOlsyLDE4MV0sMTM0OlsyLDE4MV19LHsxOlsyLDE4Ml0sNjpbMiwxODJdLDI1OlsyLDE4Ml0sMjY6WzIsMTgyXSw0NjpbMiwxODJdLDUxOlsyLDE4Ml0sNTQ6WzIsMTgyXSw2OTpbMiwxODJdLDc1OlsyLDE4Ml0sODM6WzIsMTgyXSw4ODpbMiwxODJdLDkwOlsyLDE4Ml0sOTk6WzIsMTgyXSwxMDE6WzIsMTgyXSwxMDI6WzIsMTgyXSwxMDM6WzIsMTgyXSwxMDc6WzIsMTgyXSwxMTU6WzIsMTgyXSwxMjM6WzIsMTgyXSwxMjU6WzIsMTgyXSwxMjY6WzIsMTgyXSwxMjk6WzIsMTgyXSwxMzA6WzIsMTgyXSwxMzE6WzIsMTgyXSwxMzI6WzIsMTgyXSwxMzM6WzIsMTgyXSwxMzQ6WzIsMTgyXX0sezE6WzIsMTgzXSw2OlsyLDE4M10sMjU6WzIsMTgzXSwyNjpbMiwxODNdLDQ2OlsyLDE4M10sNTE6WzIsMTgzXSw1NDpbMiwxODNdLDY5OlsyLDE4M10sNzU6WzIsMTgzXSw4MzpbMiwxODNdLDg4OlsyLDE4M10sOTA6WzIsMTgzXSw5OTpbMiwxODNdLDEwMTpbMiwxODNdLDEwMjpbMiwxODNdLDEwMzpbMiwxODNdLDEwNzpbMiwxODNdLDExNTpbMiwxODNdLDEyMzpbMiwxODNdLDEyNTpbMiwxODNdLDEyNjpbMiwxODNdLDEyOTpbMiwxODNdLDEzMDpbMiwxODNdLDEzMTpbMiwxODNdLDEzMjpbMiwxODNdLDEzMzpbMiwxODNdLDEzNDpbMiwxODNdfSx7ODoyMDIsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNTpbMSwyMDNdLDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHs4OjIwNCw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHs1OjIwNSwyNTpbMSw1XSwxMjI6WzEsMjA2XX0sezE6WzIsMTI2XSw2OlsyLDEyNl0sMjU6WzIsMTI2XSwyNjpbMiwxMjZdLDQ2OlsyLDEyNl0sNTE6WzIsMTI2XSw1NDpbMiwxMjZdLDY5OlsyLDEyNl0sNzU6WzIsMTI2XSw4MzpbMiwxMjZdLDg4OlsyLDEyNl0sOTA6WzIsMTI2XSw5NDoyMDcsOTU6WzEsMjA4XSw5NjpbMSwyMDldLDk5OlsyLDEyNl0sMTAxOlsyLDEyNl0sMTAyOlsyLDEyNl0sMTAzOlsyLDEyNl0sMTA3OlsyLDEyNl0sMTE1OlsyLDEyNl0sMTIzOlsyLDEyNl0sMTI1OlsyLDEyNl0sMTI2OlsyLDEyNl0sMTI5OlsyLDEyNl0sMTMwOlsyLDEyNl0sMTMxOlsyLDEyNl0sMTMyOlsyLDEyNl0sMTMzOlsyLDEyNl0sMTM0OlsyLDEyNl19LHsxOlsyLDEzOF0sNjpbMiwxMzhdLDI1OlsyLDEzOF0sMjY6WzIsMTM4XSw0NjpbMiwxMzhdLDUxOlsyLDEzOF0sNTQ6WzIsMTM4XSw2OTpbMiwxMzhdLDc1OlsyLDEzOF0sODM6WzIsMTM4XSw4ODpbMiwxMzhdLDkwOlsyLDEzOF0sOTk6WzIsMTM4XSwxMDE6WzIsMTM4XSwxMDI6WzIsMTM4XSwxMDM6WzIsMTM4XSwxMDc6WzIsMTM4XSwxMTU6WzIsMTM4XSwxMjM6WzIsMTM4XSwxMjU6WzIsMTM4XSwxMjY6WzIsMTM4XSwxMjk6WzIsMTM4XSwxMzA6WzIsMTM4XSwxMzE6WzIsMTM4XSwxMzI6WzIsMTM4XSwxMzM6WzIsMTM4XSwxMzQ6WzIsMTM4XX0sezE6WzIsMTQ2XSw2OlsyLDE0Nl0sMjU6WzIsMTQ2XSwyNjpbMiwxNDZdLDQ2OlsyLDE0Nl0sNTE6WzIsMTQ2XSw1NDpbMiwxNDZdLDY5OlsyLDE0Nl0sNzU6WzIsMTQ2XSw4MzpbMiwxNDZdLDg4OlsyLDE0Nl0sOTA6WzIsMTQ2XSw5OTpbMiwxNDZdLDEwMTpbMiwxNDZdLDEwMjpbMiwxNDZdLDEwMzpbMiwxNDZdLDEwNzpbMiwxNDZdLDExNTpbMiwxNDZdLDEyMzpbMiwxNDZdLDEyNTpbMiwxNDZdLDEyNjpbMiwxNDZdLDEyOTpbMiwxNDZdLDEzMDpbMiwxNDZdLDEzMTpbMiwxNDZdLDEzMjpbMiwxNDZdLDEzMzpbMiwxNDZdLDEzNDpbMiwxNDZdfSx7MjU6WzEsMjEwXSwxMDA6ODQsMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNjo4NSwxMDc6WzEsNjVdLDEwODo2NiwxMjM6WzEsODNdLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzEsODBdLDEzMzpbMSw4MV0sMTM0OlsxLDgyXX0sezExNzoyMTEsMTE5OjIxMiwxMjA6WzEsMjEzXX0sezE6WzIsOTFdLDY6WzIsOTFdLDI1OlsyLDkxXSwyNjpbMiw5MV0sNDY6WzIsOTFdLDUxOlsyLDkxXSw1NDpbMiw5MV0sNjk6WzIsOTFdLDc1OlsyLDkxXSw4MzpbMiw5MV0sODg6WzIsOTFdLDkwOlsyLDkxXSw5OTpbMiw5MV0sMTAxOlsyLDkxXSwxMDI6WzIsOTFdLDEwMzpbMiw5MV0sMTA3OlsyLDkxXSwxMTU6WzIsOTFdLDEyMzpbMiw5MV0sMTI1OlsyLDkxXSwxMjY6WzIsOTFdLDEyOTpbMiw5MV0sMTMwOlsyLDkxXSwxMzE6WzIsOTFdLDEzMjpbMiw5MV0sMTMzOlsyLDkxXSwxMzQ6WzIsOTFdfSx7MTQ6MjE0LDE1OjEyMCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoxMjEsNDE6NjAsNTU6NDcsNTY6NDgsNTg6MjE1LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTg6WzEsNTNdfSx7MTpbMiw5NF0sNToyMTYsNjpbMiw5NF0sMjU6WzEsNV0sMjY6WzIsOTRdLDQ2OlsyLDk0XSw1MTpbMiw5NF0sNTQ6WzIsOTRdLDYzOlsyLDY2XSw2NDpbMiw2Nl0sNjU6WzIsNjZdLDY3OlsyLDY2XSw2OTpbMiw5NF0sNzA6WzIsNjZdLDcxOlsyLDY2XSw3NTpbMiw5NF0sNzc6WzEsMjE3XSw4MTpbMiw2Nl0sODI6WzIsNjZdLDgzOlsyLDk0XSw4ODpbMiw5NF0sOTA6WzIsOTRdLDk5OlsyLDk0XSwxMDE6WzIsOTRdLDEwMjpbMiw5NF0sMTAzOlsyLDk0XSwxMDc6WzIsOTRdLDExNTpbMiw5NF0sMTIzOlsyLDk0XSwxMjU6WzIsOTRdLDEyNjpbMiw5NF0sMTI5OlsyLDk0XSwxMzA6WzIsOTRdLDEzMTpbMiw5NF0sMTMyOlsyLDk0XSwxMzM6WzIsOTRdLDEzNDpbMiw5NF19LHsxOlsyLDQyXSw2OlsyLDQyXSwyNjpbMiw0Ml0sOTk6WzIsNDJdLDEwMDo4NCwxMDE6WzIsNDJdLDEwMzpbMiw0Ml0sMTA2Ojg1LDEwNzpbMiw0Ml0sMTA4OjY2LDEyMzpbMiw0Ml0sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7MTpbMiwxMzFdLDY6WzIsMTMxXSwyNjpbMiwxMzFdLDk5OlsyLDEzMV0sMTAwOjg0LDEwMTpbMiwxMzFdLDEwMzpbMiwxMzFdLDEwNjo4NSwxMDc6WzIsMTMxXSwxMDg6NjYsMTIzOlsyLDEzMV0sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7NjpbMSw3MV0sOTk6WzEsMjE4XX0sezQ6MjE5LDc6NCw4OjYsOTo3LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezY6WzIsMTIyXSwyNTpbMiwxMjJdLDUxOlsyLDEyMl0sNTQ6WzEsMjIxXSw4ODpbMiwxMjJdLDg5OjIyMCw5MDpbMSwxODhdLDEwMDo4NCwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA2Ojg1LDEwNzpbMSw2NV0sMTA4OjY2LDEyMzpbMSw4M10sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7MTpbMiwxMDldLDY6WzIsMTA5XSwyNTpbMiwxMDldLDI2OlsyLDEwOV0sMzc6WzIsMTA5XSw0NjpbMiwxMDldLDUxOlsyLDEwOV0sNTQ6WzIsMTA5XSw2MzpbMiwxMDldLDY0OlsyLDEwOV0sNjU6WzIsMTA5XSw2NzpbMiwxMDldLDY5OlsyLDEwOV0sNzA6WzIsMTA5XSw3MTpbMiwxMDldLDc1OlsyLDEwOV0sODE6WzIsMTA5XSw4MjpbMiwxMDldLDgzOlsyLDEwOV0sODg6WzIsMTA5XSw5MDpbMiwxMDldLDk5OlsyLDEwOV0sMTAxOlsyLDEwOV0sMTAyOlsyLDEwOV0sMTAzOlsyLDEwOV0sMTA3OlsyLDEwOV0sMTEzOlsyLDEwOV0sMTE0OlsyLDEwOV0sMTE1OlsyLDEwOV0sMTIzOlsyLDEwOV0sMTI1OlsyLDEwOV0sMTI2OlsyLDEwOV0sMTI5OlsyLDEwOV0sMTMwOlsyLDEwOV0sMTMxOlsyLDEwOV0sMTMyOlsyLDEwOV0sMTMzOlsyLDEwOV0sMTM0OlsyLDEwOV19LHs2OlsyLDQ5XSwyNTpbMiw0OV0sNTA6MjIyLDUxOlsxLDIyM10sODg6WzIsNDldfSx7NjpbMiwxMTddLDI1OlsyLDExN10sMjY6WzIsMTE3XSw1MTpbMiwxMTddLDgzOlsyLDExN10sODg6WzIsMTE3XX0sezg6MTk3LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjU6WzEsMTQ0XSwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU3OjE0NSw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NDoyMjQsODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTE6MTQzLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7NjpbMiwxMjNdLDI1OlsyLDEyM10sMjY6WzIsMTIzXSw1MTpbMiwxMjNdLDgzOlsyLDEyM10sODg6WzIsMTIzXX0sezE6WzIsMTA4XSw2OlsyLDEwOF0sMjU6WzIsMTA4XSwyNjpbMiwxMDhdLDM3OlsyLDEwOF0sNDA6WzIsMTA4XSw0NjpbMiwxMDhdLDUxOlsyLDEwOF0sNTQ6WzIsMTA4XSw2MzpbMiwxMDhdLDY0OlsyLDEwOF0sNjU6WzIsMTA4XSw2NzpbMiwxMDhdLDY5OlsyLDEwOF0sNzA6WzIsMTA4XSw3MTpbMiwxMDhdLDc1OlsyLDEwOF0sNzc6WzIsMTA4XSw4MTpbMiwxMDhdLDgyOlsyLDEwOF0sODM6WzIsMTA4XSw4ODpbMiwxMDhdLDkwOlsyLDEwOF0sOTk6WzIsMTA4XSwxMDE6WzIsMTA4XSwxMDI6WzIsMTA4XSwxMDM6WzIsMTA4XSwxMDc6WzIsMTA4XSwxMTU6WzIsMTA4XSwxMjM6WzIsMTA4XSwxMjU6WzIsMTA4XSwxMjY6WzIsMTA4XSwxMjc6WzIsMTA4XSwxMjg6WzIsMTA4XSwxMjk6WzIsMTA4XSwxMzA6WzIsMTA4XSwxMzE6WzIsMTA4XSwxMzI6WzIsMTA4XSwxMzM6WzIsMTA4XSwxMzQ6WzIsMTA4XSwxMzU6WzIsMTA4XX0sezU6MjI1LDI1OlsxLDVdLDEwMDo4NCwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA2Ojg1LDEwNzpbMSw2NV0sMTA4OjY2LDEyMzpbMSw4M10sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7MTpbMiwxMzRdLDY6WzIsMTM0XSwyNTpbMiwxMzRdLDI2OlsyLDEzNF0sNDY6WzIsMTM0XSw1MTpbMiwxMzRdLDU0OlsyLDEzNF0sNjk6WzIsMTM0XSw3NTpbMiwxMzRdLDgzOlsyLDEzNF0sODg6WzIsMTM0XSw5MDpbMiwxMzRdLDk5OlsyLDEzNF0sMTAwOjg0LDEwMTpbMSw2Ml0sMTAyOlsxLDIyNl0sMTAzOlsxLDYzXSwxMDY6ODUsMTA3OlsxLDY1XSwxMDg6NjYsMTE1OlsyLDEzNF0sMTIzOlsyLDEzNF0sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7MTpbMiwxMzZdLDY6WzIsMTM2XSwyNTpbMiwxMzZdLDI2OlsyLDEzNl0sNDY6WzIsMTM2XSw1MTpbMiwxMzZdLDU0OlsyLDEzNl0sNjk6WzIsMTM2XSw3NTpbMiwxMzZdLDgzOlsyLDEzNl0sODg6WzIsMTM2XSw5MDpbMiwxMzZdLDk5OlsyLDEzNl0sMTAwOjg0LDEwMTpbMSw2Ml0sMTAyOlsxLDIyN10sMTAzOlsxLDYzXSwxMDY6ODUsMTA3OlsxLDY1XSwxMDg6NjYsMTE1OlsyLDEzNl0sMTIzOlsyLDEzNl0sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7MTpbMiwxNDJdLDY6WzIsMTQyXSwyNTpbMiwxNDJdLDI2OlsyLDE0Ml0sNDY6WzIsMTQyXSw1MTpbMiwxNDJdLDU0OlsyLDE0Ml0sNjk6WzIsMTQyXSw3NTpbMiwxNDJdLDgzOlsyLDE0Ml0sODg6WzIsMTQyXSw5MDpbMiwxNDJdLDk5OlsyLDE0Ml0sMTAxOlsyLDE0Ml0sMTAyOlsyLDE0Ml0sMTAzOlsyLDE0Ml0sMTA3OlsyLDE0Ml0sMTE1OlsyLDE0Ml0sMTIzOlsyLDE0Ml0sMTI1OlsyLDE0Ml0sMTI2OlsyLDE0Ml0sMTI5OlsyLDE0Ml0sMTMwOlsyLDE0Ml0sMTMxOlsyLDE0Ml0sMTMyOlsyLDE0Ml0sMTMzOlsyLDE0Ml0sMTM0OlsyLDE0Ml19LHsxOlsyLDE0M10sNjpbMiwxNDNdLDI1OlsyLDE0M10sMjY6WzIsMTQzXSw0NjpbMiwxNDNdLDUxOlsyLDE0M10sNTQ6WzIsMTQzXSw2OTpbMiwxNDNdLDc1OlsyLDE0M10sODM6WzIsMTQzXSw4ODpbMiwxNDNdLDkwOlsyLDE0M10sOTk6WzIsMTQzXSwxMDA6ODQsMTAxOlsxLDYyXSwxMDI6WzIsMTQzXSwxMDM6WzEsNjNdLDEwNjo4NSwxMDc6WzEsNjVdLDEwODo2NiwxMTU6WzIsMTQzXSwxMjM6WzIsMTQzXSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHsxOlsyLDE0N10sNjpbMiwxNDddLDI1OlsyLDE0N10sMjY6WzIsMTQ3XSw0NjpbMiwxNDddLDUxOlsyLDE0N10sNTQ6WzIsMTQ3XSw2OTpbMiwxNDddLDc1OlsyLDE0N10sODM6WzIsMTQ3XSw4ODpbMiwxNDddLDkwOlsyLDE0N10sOTk6WzIsMTQ3XSwxMDE6WzIsMTQ3XSwxMDI6WzIsMTQ3XSwxMDM6WzIsMTQ3XSwxMDc6WzIsMTQ3XSwxMTU6WzIsMTQ3XSwxMjM6WzIsMTQ3XSwxMjU6WzIsMTQ3XSwxMjY6WzIsMTQ3XSwxMjk6WzIsMTQ3XSwxMzA6WzIsMTQ3XSwxMzE6WzIsMTQ3XSwxMzI6WzIsMTQ3XSwxMzM6WzIsMTQ3XSwxMzQ6WzIsMTQ3XX0sezExMzpbMiwxNDldLDExNDpbMiwxNDldfSx7Mjc6MTU2LDI4OlsxLDcwXSw1NToxNTcsNTY6MTU4LDczOlsxLDY3XSw4NzpbMSwxMTJdLDExMDoyMjgsMTEyOjE1NX0sezUxOlsxLDIyOV0sMTEzOlsyLDE1NF0sMTE0OlsyLDE1NF19LHs1MTpbMiwxNTFdLDExMzpbMiwxNTFdLDExNDpbMiwxNTFdfSx7NTE6WzIsMTUyXSwxMTM6WzIsMTUyXSwxMTQ6WzIsMTUyXX0sezUxOlsyLDE1M10sMTEzOlsyLDE1M10sMTE0OlsyLDE1M119LHsxOlsyLDE0OF0sNjpbMiwxNDhdLDI1OlsyLDE0OF0sMjY6WzIsMTQ4XSw0NjpbMiwxNDhdLDUxOlsyLDE0OF0sNTQ6WzIsMTQ4XSw2OTpbMiwxNDhdLDc1OlsyLDE0OF0sODM6WzIsMTQ4XSw4ODpbMiwxNDhdLDkwOlsyLDE0OF0sOTk6WzIsMTQ4XSwxMDE6WzIsMTQ4XSwxMDI6WzIsMTQ4XSwxMDM6WzIsMTQ4XSwxMDc6WzIsMTQ4XSwxMTU6WzIsMTQ4XSwxMjM6WzIsMTQ4XSwxMjU6WzIsMTQ4XSwxMjY6WzIsMTQ4XSwxMjk6WzIsMTQ4XSwxMzA6WzIsMTQ4XSwxMzE6WzIsMTQ4XSwxMzI6WzIsMTQ4XSwxMzM6WzIsMTQ4XSwxMzQ6WzIsMTQ4XX0sezg6MjMwLDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezg6MjMxLDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezY6WzIsNDldLDI1OlsyLDQ5XSw1MDoyMzIsNTE6WzEsMjMzXSw3NTpbMiw0OV19LHs2OlsyLDg2XSwyNTpbMiw4Nl0sMjY6WzIsODZdLDUxOlsyLDg2XSw3NTpbMiw4Nl19LHs2OlsyLDM1XSwyNTpbMiwzNV0sMjY6WzIsMzVdLDQwOlsxLDIzNF0sNTE6WzIsMzVdLDc1OlsyLDM1XX0sezY6WzIsMzhdLDI1OlsyLDM4XSwyNjpbMiwzOF0sNTE6WzIsMzhdLDc1OlsyLDM4XX0sezY6WzIsMzldLDI1OlsyLDM5XSwyNjpbMiwzOV0sNDA6WzIsMzldLDUxOlsyLDM5XSw3NTpbMiwzOV19LHs2OlsyLDQwXSwyNTpbMiw0MF0sMjY6WzIsNDBdLDQwOlsyLDQwXSw1MTpbMiw0MF0sNzU6WzIsNDBdfSx7NjpbMiw0MV0sMjU6WzIsNDFdLDI2OlsyLDQxXSw0MDpbMiw0MV0sNTE6WzIsNDFdLDc1OlsyLDQxXX0sezE6WzIsNV0sNjpbMiw1XSwyNjpbMiw1XSw5OTpbMiw1XX0sezE6WzIsMjVdLDY6WzIsMjVdLDI1OlsyLDI1XSwyNjpbMiwyNV0sNDY6WzIsMjVdLDUxOlsyLDI1XSw1NDpbMiwyNV0sNjk6WzIsMjVdLDc1OlsyLDI1XSw4MzpbMiwyNV0sODg6WzIsMjVdLDkwOlsyLDI1XSw5NTpbMiwyNV0sOTY6WzIsMjVdLDk5OlsyLDI1XSwxMDE6WzIsMjVdLDEwMjpbMiwyNV0sMTAzOlsyLDI1XSwxMDc6WzIsMjVdLDExNTpbMiwyNV0sMTE4OlsyLDI1XSwxMjA6WzIsMjVdLDEyMzpbMiwyNV0sMTI1OlsyLDI1XSwxMjY6WzIsMjVdLDEyOTpbMiwyNV0sMTMwOlsyLDI1XSwxMzE6WzIsMjVdLDEzMjpbMiwyNV0sMTMzOlsyLDI1XSwxMzQ6WzIsMjVdfSx7MTpbMiwxODVdLDY6WzIsMTg1XSwyNTpbMiwxODVdLDI2OlsyLDE4NV0sNDY6WzIsMTg1XSw1MTpbMiwxODVdLDU0OlsyLDE4NV0sNjk6WzIsMTg1XSw3NTpbMiwxODVdLDgzOlsyLDE4NV0sODg6WzIsMTg1XSw5MDpbMiwxODVdLDk5OlsyLDE4NV0sMTAwOjg0LDEwMTpbMiwxODVdLDEwMjpbMiwxODVdLDEwMzpbMiwxODVdLDEwNjo4NSwxMDc6WzIsMTg1XSwxMDg6NjYsMTE1OlsyLDE4NV0sMTIzOlsyLDE4NV0sMTI1OlsyLDE4NV0sMTI2OlsyLDE4NV0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMiwxODVdLDEzMjpbMiwxODVdLDEzMzpbMiwxODVdLDEzNDpbMiwxODVdfSx7MTpbMiwxODZdLDY6WzIsMTg2XSwyNTpbMiwxODZdLDI2OlsyLDE4Nl0sNDY6WzIsMTg2XSw1MTpbMiwxODZdLDU0OlsyLDE4Nl0sNjk6WzIsMTg2XSw3NTpbMiwxODZdLDgzOlsyLDE4Nl0sODg6WzIsMTg2XSw5MDpbMiwxODZdLDk5OlsyLDE4Nl0sMTAwOjg0LDEwMTpbMiwxODZdLDEwMjpbMiwxODZdLDEwMzpbMiwxODZdLDEwNjo4NSwxMDc6WzIsMTg2XSwxMDg6NjYsMTE1OlsyLDE4Nl0sMTIzOlsyLDE4Nl0sMTI1OlsyLDE4Nl0sMTI2OlsyLDE4Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMiwxODZdLDEzMjpbMiwxODZdLDEzMzpbMiwxODZdLDEzNDpbMiwxODZdfSx7MTpbMiwxODddLDY6WzIsMTg3XSwyNTpbMiwxODddLDI2OlsyLDE4N10sNDY6WzIsMTg3XSw1MTpbMiwxODddLDU0OlsyLDE4N10sNjk6WzIsMTg3XSw3NTpbMiwxODddLDgzOlsyLDE4N10sODg6WzIsMTg3XSw5MDpbMiwxODddLDk5OlsyLDE4N10sMTAwOjg0LDEwMTpbMiwxODddLDEwMjpbMiwxODddLDEwMzpbMiwxODddLDEwNjo4NSwxMDc6WzIsMTg3XSwxMDg6NjYsMTE1OlsyLDE4N10sMTIzOlsyLDE4N10sMTI1OlsyLDE4N10sMTI2OlsyLDE4N10sMTI5OlsxLDc1XSwxMzA6WzIsMTg3XSwxMzE6WzIsMTg3XSwxMzI6WzIsMTg3XSwxMzM6WzIsMTg3XSwxMzQ6WzIsMTg3XX0sezE6WzIsMTg4XSw2OlsyLDE4OF0sMjU6WzIsMTg4XSwyNjpbMiwxODhdLDQ2OlsyLDE4OF0sNTE6WzIsMTg4XSw1NDpbMiwxODhdLDY5OlsyLDE4OF0sNzU6WzIsMTg4XSw4MzpbMiwxODhdLDg4OlsyLDE4OF0sOTA6WzIsMTg4XSw5OTpbMiwxODhdLDEwMDo4NCwxMDE6WzIsMTg4XSwxMDI6WzIsMTg4XSwxMDM6WzIsMTg4XSwxMDY6ODUsMTA3OlsyLDE4OF0sMTA4OjY2LDExNTpbMiwxODhdLDEyMzpbMiwxODhdLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsyLDE4OF0sMTMyOlsyLDE4OF0sMTMzOlsyLDE4OF0sMTM0OlsyLDE4OF19LHsxOlsyLDE4OV0sNjpbMiwxODldLDI1OlsyLDE4OV0sMjY6WzIsMTg5XSw0NjpbMiwxODldLDUxOlsyLDE4OV0sNTQ6WzIsMTg5XSw2OTpbMiwxODldLDc1OlsyLDE4OV0sODM6WzIsMTg5XSw4ODpbMiwxODldLDkwOlsyLDE4OV0sOTk6WzIsMTg5XSwxMDA6ODQsMTAxOlsyLDE4OV0sMTAyOlsyLDE4OV0sMTAzOlsyLDE4OV0sMTA2Ojg1LDEwNzpbMiwxODldLDEwODo2NiwxMTU6WzIsMTg5XSwxMjM6WzIsMTg5XSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsyLDE4OV0sMTMzOlsyLDE4OV0sMTM0OlsxLDgyXX0sezE6WzIsMTkwXSw2OlsyLDE5MF0sMjU6WzIsMTkwXSwyNjpbMiwxOTBdLDQ2OlsyLDE5MF0sNTE6WzIsMTkwXSw1NDpbMiwxOTBdLDY5OlsyLDE5MF0sNzU6WzIsMTkwXSw4MzpbMiwxOTBdLDg4OlsyLDE5MF0sOTA6WzIsMTkwXSw5OTpbMiwxOTBdLDEwMDo4NCwxMDE6WzIsMTkwXSwxMDI6WzIsMTkwXSwxMDM6WzIsMTkwXSwxMDY6ODUsMTA3OlsyLDE5MF0sMTA4OjY2LDExNTpbMiwxOTBdLDEyMzpbMiwxOTBdLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzEsODBdLDEzMzpbMiwxOTBdLDEzNDpbMSw4Ml19LHsxOlsyLDE5MV0sNjpbMiwxOTFdLDI1OlsyLDE5MV0sMjY6WzIsMTkxXSw0NjpbMiwxOTFdLDUxOlsyLDE5MV0sNTQ6WzIsMTkxXSw2OTpbMiwxOTFdLDc1OlsyLDE5MV0sODM6WzIsMTkxXSw4ODpbMiwxOTFdLDkwOlsyLDE5MV0sOTk6WzIsMTkxXSwxMDA6ODQsMTAxOlsyLDE5MV0sMTAyOlsyLDE5MV0sMTAzOlsyLDE5MV0sMTA2Ojg1LDEwNzpbMiwxOTFdLDEwODo2NiwxMTU6WzIsMTkxXSwxMjM6WzIsMTkxXSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsyLDE5MV0sMTMzOlsyLDE5MV0sMTM0OlsyLDE5MV19LHsxOlsyLDE3Nl0sNjpbMiwxNzZdLDI1OlsyLDE3Nl0sMjY6WzIsMTc2XSw0NjpbMiwxNzZdLDUxOlsyLDE3Nl0sNTQ6WzIsMTc2XSw2OTpbMiwxNzZdLDc1OlsyLDE3Nl0sODM6WzIsMTc2XSw4ODpbMiwxNzZdLDkwOlsyLDE3Nl0sOTk6WzIsMTc2XSwxMDA6ODQsMTAxOlsxLDYyXSwxMDI6WzIsMTc2XSwxMDM6WzEsNjNdLDEwNjo4NSwxMDc6WzEsNjVdLDEwODo2NiwxMTU6WzIsMTc2XSwxMjM6WzEsODNdLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzEsODBdLDEzMzpbMSw4MV0sMTM0OlsxLDgyXX0sezE6WzIsMTc1XSw2OlsyLDE3NV0sMjU6WzIsMTc1XSwyNjpbMiwxNzVdLDQ2OlsyLDE3NV0sNTE6WzIsMTc1XSw1NDpbMiwxNzVdLDY5OlsyLDE3NV0sNzU6WzIsMTc1XSw4MzpbMiwxNzVdLDg4OlsyLDE3NV0sOTA6WzIsMTc1XSw5OTpbMiwxNzVdLDEwMDo4NCwxMDE6WzEsNjJdLDEwMjpbMiwxNzVdLDEwMzpbMSw2M10sMTA2Ojg1LDEwNzpbMSw2NV0sMTA4OjY2LDExNTpbMiwxNzVdLDEyMzpbMSw4M10sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7MTpbMiw5OF0sNjpbMiw5OF0sMjU6WzIsOThdLDI2OlsyLDk4XSw0NjpbMiw5OF0sNTE6WzIsOThdLDU0OlsyLDk4XSw2MzpbMiw5OF0sNjQ6WzIsOThdLDY1OlsyLDk4XSw2NzpbMiw5OF0sNjk6WzIsOThdLDcwOlsyLDk4XSw3MTpbMiw5OF0sNzU6WzIsOThdLDgxOlsyLDk4XSw4MjpbMiw5OF0sODM6WzIsOThdLDg4OlsyLDk4XSw5MDpbMiw5OF0sOTk6WzIsOThdLDEwMTpbMiw5OF0sMTAyOlsyLDk4XSwxMDM6WzIsOThdLDEwNzpbMiw5OF0sMTE1OlsyLDk4XSwxMjM6WzIsOThdLDEyNTpbMiw5OF0sMTI2OlsyLDk4XSwxMjk6WzIsOThdLDEzMDpbMiw5OF0sMTMxOlsyLDk4XSwxMzI6WzIsOThdLDEzMzpbMiw5OF0sMTM0OlsyLDk4XX0sezE6WzIsNzRdLDY6WzIsNzRdLDI1OlsyLDc0XSwyNjpbMiw3NF0sMzc6WzIsNzRdLDQ2OlsyLDc0XSw1MTpbMiw3NF0sNTQ6WzIsNzRdLDYzOlsyLDc0XSw2NDpbMiw3NF0sNjU6WzIsNzRdLDY3OlsyLDc0XSw2OTpbMiw3NF0sNzA6WzIsNzRdLDcxOlsyLDc0XSw3NTpbMiw3NF0sNzc6WzIsNzRdLDgxOlsyLDc0XSw4MjpbMiw3NF0sODM6WzIsNzRdLDg4OlsyLDc0XSw5MDpbMiw3NF0sOTk6WzIsNzRdLDEwMTpbMiw3NF0sMTAyOlsyLDc0XSwxMDM6WzIsNzRdLDEwNzpbMiw3NF0sMTE1OlsyLDc0XSwxMjM6WzIsNzRdLDEyNTpbMiw3NF0sMTI2OlsyLDc0XSwxMjc6WzIsNzRdLDEyODpbMiw3NF0sMTI5OlsyLDc0XSwxMzA6WzIsNzRdLDEzMTpbMiw3NF0sMTMyOlsyLDc0XSwxMzM6WzIsNzRdLDEzNDpbMiw3NF0sMTM1OlsyLDc0XX0sezE6WzIsNzVdLDY6WzIsNzVdLDI1OlsyLDc1XSwyNjpbMiw3NV0sMzc6WzIsNzVdLDQ2OlsyLDc1XSw1MTpbMiw3NV0sNTQ6WzIsNzVdLDYzOlsyLDc1XSw2NDpbMiw3NV0sNjU6WzIsNzVdLDY3OlsyLDc1XSw2OTpbMiw3NV0sNzA6WzIsNzVdLDcxOlsyLDc1XSw3NTpbMiw3NV0sNzc6WzIsNzVdLDgxOlsyLDc1XSw4MjpbMiw3NV0sODM6WzIsNzVdLDg4OlsyLDc1XSw5MDpbMiw3NV0sOTk6WzIsNzVdLDEwMTpbMiw3NV0sMTAyOlsyLDc1XSwxMDM6WzIsNzVdLDEwNzpbMiw3NV0sMTE1OlsyLDc1XSwxMjM6WzIsNzVdLDEyNTpbMiw3NV0sMTI2OlsyLDc1XSwxMjc6WzIsNzVdLDEyODpbMiw3NV0sMTI5OlsyLDc1XSwxMzA6WzIsNzVdLDEzMTpbMiw3NV0sMTMyOlsyLDc1XSwxMzM6WzIsNzVdLDEzNDpbMiw3NV0sMTM1OlsyLDc1XX0sezE6WzIsNzZdLDY6WzIsNzZdLDI1OlsyLDc2XSwyNjpbMiw3Nl0sMzc6WzIsNzZdLDQ2OlsyLDc2XSw1MTpbMiw3Nl0sNTQ6WzIsNzZdLDYzOlsyLDc2XSw2NDpbMiw3Nl0sNjU6WzIsNzZdLDY3OlsyLDc2XSw2OTpbMiw3Nl0sNzA6WzIsNzZdLDcxOlsyLDc2XSw3NTpbMiw3Nl0sNzc6WzIsNzZdLDgxOlsyLDc2XSw4MjpbMiw3Nl0sODM6WzIsNzZdLDg4OlsyLDc2XSw5MDpbMiw3Nl0sOTk6WzIsNzZdLDEwMTpbMiw3Nl0sMTAyOlsyLDc2XSwxMDM6WzIsNzZdLDEwNzpbMiw3Nl0sMTE1OlsyLDc2XSwxMjM6WzIsNzZdLDEyNTpbMiw3Nl0sMTI2OlsyLDc2XSwxMjc6WzIsNzZdLDEyODpbMiw3Nl0sMTI5OlsyLDc2XSwxMzA6WzIsNzZdLDEzMTpbMiw3Nl0sMTMyOlsyLDc2XSwxMzM6WzIsNzZdLDEzNDpbMiw3Nl0sMTM1OlsyLDc2XX0sezY5OlsxLDIzNV19LHs1NDpbMSwxODldLDY5OlsyLDgyXSw4OToyMzYsOTA6WzEsMTg4XSwxMDA6ODQsMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNjo4NSwxMDc6WzEsNjVdLDEwODo2NiwxMjM6WzEsODNdLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzEsODBdLDEzMzpbMSw4MV0sMTM0OlsxLDgyXX0sezY5OlsyLDgzXX0sezg6MjM3LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezEzOlsyLDExMV0sMjg6WzIsMTExXSwzMDpbMiwxMTFdLDMxOlsyLDExMV0sMzM6WzIsMTExXSwzNDpbMiwxMTFdLDM1OlsyLDExMV0sNDI6WzIsMTExXSw0MzpbMiwxMTFdLDQ0OlsyLDExMV0sNDg6WzIsMTExXSw0OTpbMiwxMTFdLDY5OlsyLDExMV0sNzM6WzIsMTExXSw3NjpbMiwxMTFdLDgwOlsyLDExMV0sODU6WzIsMTExXSw4NjpbMiwxMTFdLDg3OlsyLDExMV0sOTM6WzIsMTExXSw5NzpbMiwxMTFdLDk4OlsyLDExMV0sMTAxOlsyLDExMV0sMTAzOlsyLDExMV0sMTA1OlsyLDExMV0sMTA3OlsyLDExMV0sMTE2OlsyLDExMV0sMTIyOlsyLDExMV0sMTI0OlsyLDExMV0sMTI1OlsyLDExMV0sMTI2OlsyLDExMV0sMTI3OlsyLDExMV0sMTI4OlsyLDExMV19LHsxMzpbMiwxMTJdLDI4OlsyLDExMl0sMzA6WzIsMTEyXSwzMTpbMiwxMTJdLDMzOlsyLDExMl0sMzQ6WzIsMTEyXSwzNTpbMiwxMTJdLDQyOlsyLDExMl0sNDM6WzIsMTEyXSw0NDpbMiwxMTJdLDQ4OlsyLDExMl0sNDk6WzIsMTEyXSw2OTpbMiwxMTJdLDczOlsyLDExMl0sNzY6WzIsMTEyXSw4MDpbMiwxMTJdLDg1OlsyLDExMl0sODY6WzIsMTEyXSw4NzpbMiwxMTJdLDkzOlsyLDExMl0sOTc6WzIsMTEyXSw5ODpbMiwxMTJdLDEwMTpbMiwxMTJdLDEwMzpbMiwxMTJdLDEwNTpbMiwxMTJdLDEwNzpbMiwxMTJdLDExNjpbMiwxMTJdLDEyMjpbMiwxMTJdLDEyNDpbMiwxMTJdLDEyNTpbMiwxMTJdLDEyNjpbMiwxMTJdLDEyNzpbMiwxMTJdLDEyODpbMiwxMTJdfSx7MTpbMiw4MF0sNjpbMiw4MF0sMjU6WzIsODBdLDI2OlsyLDgwXSwzNzpbMiw4MF0sNDY6WzIsODBdLDUxOlsyLDgwXSw1NDpbMiw4MF0sNjM6WzIsODBdLDY0OlsyLDgwXSw2NTpbMiw4MF0sNjc6WzIsODBdLDY5OlsyLDgwXSw3MDpbMiw4MF0sNzE6WzIsODBdLDc1OlsyLDgwXSw3NzpbMiw4MF0sODE6WzIsODBdLDgyOlsyLDgwXSw4MzpbMiw4MF0sODg6WzIsODBdLDkwOlsyLDgwXSw5OTpbMiw4MF0sMTAxOlsyLDgwXSwxMDI6WzIsODBdLDEwMzpbMiw4MF0sMTA3OlsyLDgwXSwxMTU6WzIsODBdLDEyMzpbMiw4MF0sMTI1OlsyLDgwXSwxMjY6WzIsODBdLDEyNzpbMiw4MF0sMTI4OlsyLDgwXSwxMjk6WzIsODBdLDEzMDpbMiw4MF0sMTMxOlsyLDgwXSwxMzI6WzIsODBdLDEzMzpbMiw4MF0sMTM0OlsyLDgwXSwxMzU6WzIsODBdfSx7MTpbMiw4MV0sNjpbMiw4MV0sMjU6WzIsODFdLDI2OlsyLDgxXSwzNzpbMiw4MV0sNDY6WzIsODFdLDUxOlsyLDgxXSw1NDpbMiw4MV0sNjM6WzIsODFdLDY0OlsyLDgxXSw2NTpbMiw4MV0sNjc6WzIsODFdLDY5OlsyLDgxXSw3MDpbMiw4MV0sNzE6WzIsODFdLDc1OlsyLDgxXSw3NzpbMiw4MV0sODE6WzIsODFdLDgyOlsyLDgxXSw4MzpbMiw4MV0sODg6WzIsODFdLDkwOlsyLDgxXSw5OTpbMiw4MV0sMTAxOlsyLDgxXSwxMDI6WzIsODFdLDEwMzpbMiw4MV0sMTA3OlsyLDgxXSwxMTU6WzIsODFdLDEyMzpbMiw4MV0sMTI1OlsyLDgxXSwxMjY6WzIsODFdLDEyNzpbMiw4MV0sMTI4OlsyLDgxXSwxMjk6WzIsODFdLDEzMDpbMiw4MV0sMTMxOlsyLDgxXSwxMzI6WzIsODFdLDEzMzpbMiw4MV0sMTM0OlsyLDgxXSwxMzU6WzIsODFdfSx7MTpbMiw5OV0sNjpbMiw5OV0sMjU6WzIsOTldLDI2OlsyLDk5XSw0NjpbMiw5OV0sNTE6WzIsOTldLDU0OlsyLDk5XSw2MzpbMiw5OV0sNjQ6WzIsOTldLDY1OlsyLDk5XSw2NzpbMiw5OV0sNjk6WzIsOTldLDcwOlsyLDk5XSw3MTpbMiw5OV0sNzU6WzIsOTldLDgxOlsyLDk5XSw4MjpbMiw5OV0sODM6WzIsOTldLDg4OlsyLDk5XSw5MDpbMiw5OV0sOTk6WzIsOTldLDEwMTpbMiw5OV0sMTAyOlsyLDk5XSwxMDM6WzIsOTldLDEwNzpbMiw5OV0sMTE1OlsyLDk5XSwxMjM6WzIsOTldLDEyNTpbMiw5OV0sMTI2OlsyLDk5XSwxMjk6WzIsOTldLDEzMDpbMiw5OV0sMTMxOlsyLDk5XSwxMzI6WzIsOTldLDEzMzpbMiw5OV0sMTM0OlsyLDk5XX0sezE6WzIsMzNdLDY6WzIsMzNdLDI1OlsyLDMzXSwyNjpbMiwzM10sNDY6WzIsMzNdLDUxOlsyLDMzXSw1NDpbMiwzM10sNjk6WzIsMzNdLDc1OlsyLDMzXSw4MzpbMiwzM10sODg6WzIsMzNdLDkwOlsyLDMzXSw5OTpbMiwzM10sMTAwOjg0LDEwMTpbMiwzM10sMTAyOlsyLDMzXSwxMDM6WzIsMzNdLDEwNjo4NSwxMDc6WzIsMzNdLDEwODo2NiwxMTU6WzIsMzNdLDEyMzpbMiwzM10sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7ODoyMzgsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7MTpbMiwxMDRdLDY6WzIsMTA0XSwyNTpbMiwxMDRdLDI2OlsyLDEwNF0sNDY6WzIsMTA0XSw1MTpbMiwxMDRdLDU0OlsyLDEwNF0sNjM6WzIsMTA0XSw2NDpbMiwxMDRdLDY1OlsyLDEwNF0sNjc6WzIsMTA0XSw2OTpbMiwxMDRdLDcwOlsyLDEwNF0sNzE6WzIsMTA0XSw3NTpbMiwxMDRdLDgxOlsyLDEwNF0sODI6WzIsMTA0XSw4MzpbMiwxMDRdLDg4OlsyLDEwNF0sOTA6WzIsMTA0XSw5OTpbMiwxMDRdLDEwMTpbMiwxMDRdLDEwMjpbMiwxMDRdLDEwMzpbMiwxMDRdLDEwNzpbMiwxMDRdLDExNTpbMiwxMDRdLDEyMzpbMiwxMDRdLDEyNTpbMiwxMDRdLDEyNjpbMiwxMDRdLDEyOTpbMiwxMDRdLDEzMDpbMiwxMDRdLDEzMTpbMiwxMDRdLDEzMjpbMiwxMDRdLDEzMzpbMiwxMDRdLDEzNDpbMiwxMDRdfSx7NjpbMiw0OV0sMjU6WzIsNDldLDUwOjIzOSw1MTpbMSwyMjNdLDgzOlsyLDQ5XX0sezY6WzIsMTIyXSwyNTpbMiwxMjJdLDI2OlsyLDEyMl0sNTE6WzIsMTIyXSw1NDpbMSwyNDBdLDgzOlsyLDEyMl0sODg6WzIsMTIyXSwxMDA6ODQsMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNjo4NSwxMDc6WzEsNjVdLDEwODo2NiwxMjM6WzEsODNdLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzEsODBdLDEzMzpbMSw4MV0sMTM0OlsxLDgyXX0sezQ3OjI0MSw0ODpbMSw1N10sNDk6WzEsNThdfSx7Mjc6MTA3LDI4OlsxLDcwXSw0MToxMDgsNTI6MjQyLDUzOjEwNiw1NToxMDksNTY6MTEwLDczOlsxLDY3XSw4NjpbMSwxMTFdLDg3OlsxLDExMl19LHs0NjpbMiw1NV0sNTE6WzIsNTVdfSx7ODoyNDMsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7MTpbMiwxOTJdLDY6WzIsMTkyXSwyNTpbMiwxOTJdLDI2OlsyLDE5Ml0sNDY6WzIsMTkyXSw1MTpbMiwxOTJdLDU0OlsyLDE5Ml0sNjk6WzIsMTkyXSw3NTpbMiwxOTJdLDgzOlsyLDE5Ml0sODg6WzIsMTkyXSw5MDpbMiwxOTJdLDk5OlsyLDE5Ml0sMTAwOjg0LDEwMTpbMiwxOTJdLDEwMjpbMiwxOTJdLDEwMzpbMiwxOTJdLDEwNjo4NSwxMDc6WzIsMTkyXSwxMDg6NjYsMTE1OlsyLDE5Ml0sMTIzOlsyLDE5Ml0sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7ODoyNDQsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU4OjM2LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7MTpbMiwxOTRdLDY6WzIsMTk0XSwyNTpbMiwxOTRdLDI2OlsyLDE5NF0sNDY6WzIsMTk0XSw1MTpbMiwxOTRdLDU0OlsyLDE5NF0sNjk6WzIsMTk0XSw3NTpbMiwxOTRdLDgzOlsyLDE5NF0sODg6WzIsMTk0XSw5MDpbMiwxOTRdLDk5OlsyLDE5NF0sMTAwOjg0LDEwMTpbMiwxOTRdLDEwMjpbMiwxOTRdLDEwMzpbMiwxOTRdLDEwNjo4NSwxMDc6WzIsMTk0XSwxMDg6NjYsMTE1OlsyLDE5NF0sMTIzOlsyLDE5NF0sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7MTpbMiwxNzRdLDY6WzIsMTc0XSwyNTpbMiwxNzRdLDI2OlsyLDE3NF0sNDY6WzIsMTc0XSw1MTpbMiwxNzRdLDU0OlsyLDE3NF0sNjk6WzIsMTc0XSw3NTpbMiwxNzRdLDgzOlsyLDE3NF0sODg6WzIsMTc0XSw5MDpbMiwxNzRdLDk5OlsyLDE3NF0sMTAxOlsyLDE3NF0sMTAyOlsyLDE3NF0sMTAzOlsyLDE3NF0sMTA3OlsyLDE3NF0sMTE1OlsyLDE3NF0sMTIzOlsyLDE3NF0sMTI1OlsyLDE3NF0sMTI2OlsyLDE3NF0sMTI5OlsyLDE3NF0sMTMwOlsyLDE3NF0sMTMxOlsyLDE3NF0sMTMyOlsyLDE3NF0sMTMzOlsyLDE3NF0sMTM0OlsyLDE3NF19LHs4OjI0NSw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHsxOlsyLDEyN10sNjpbMiwxMjddLDI1OlsyLDEyN10sMjY6WzIsMTI3XSw0NjpbMiwxMjddLDUxOlsyLDEyN10sNTQ6WzIsMTI3XSw2OTpbMiwxMjddLDc1OlsyLDEyN10sODM6WzIsMTI3XSw4ODpbMiwxMjddLDkwOlsyLDEyN10sOTU6WzEsMjQ2XSw5OTpbMiwxMjddLDEwMTpbMiwxMjddLDEwMjpbMiwxMjddLDEwMzpbMiwxMjddLDEwNzpbMiwxMjddLDExNTpbMiwxMjddLDEyMzpbMiwxMjddLDEyNTpbMiwxMjddLDEyNjpbMiwxMjddLDEyOTpbMiwxMjddLDEzMDpbMiwxMjddLDEzMTpbMiwxMjddLDEzMjpbMiwxMjddLDEzMzpbMiwxMjddLDEzNDpbMiwxMjddfSx7NToyNDcsMjU6WzEsNV19LHsyNzoyNDgsMjg6WzEsNzBdfSx7MTE3OjI0OSwxMTk6MjEyLDEyMDpbMSwyMTNdfSx7MjY6WzEsMjUwXSwxMTg6WzEsMjUxXSwxMTk6MjUyLDEyMDpbMSwyMTNdfSx7MjY6WzIsMTY3XSwxMTg6WzIsMTY3XSwxMjA6WzIsMTY3XX0sezg6MjU0LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MjoyNTMsOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHsxOlsyLDkyXSw1OjI1NSw2OlsyLDkyXSwyNTpbMSw1XSwyNjpbMiw5Ml0sNDY6WzIsOTJdLDUxOlsyLDkyXSw1NDpbMiw5Ml0sNTk6OTAsNjM6WzEsOTJdLDY0OlsxLDkzXSw2NTpbMSw5NF0sNjY6OTUsNjc6WzEsOTZdLDY5OlsyLDkyXSw3MDpbMSw5N10sNzE6WzEsOThdLDc1OlsyLDkyXSw3ODo4OSw4MTpbMSw5MV0sODI6WzIsMTAyXSw4MzpbMiw5Ml0sODg6WzIsOTJdLDkwOlsyLDkyXSw5OTpbMiw5Ml0sMTAxOlsyLDkyXSwxMDI6WzIsOTJdLDEwMzpbMiw5Ml0sMTA3OlsyLDkyXSwxMTU6WzIsOTJdLDEyMzpbMiw5Ml0sMTI1OlsyLDkyXSwxMjY6WzIsOTJdLDEyOTpbMiw5Ml0sMTMwOlsyLDkyXSwxMzE6WzIsOTJdLDEzMjpbMiw5Ml0sMTMzOlsyLDkyXSwxMzQ6WzIsOTJdfSx7MTpbMiw2Nl0sNjpbMiw2Nl0sMjU6WzIsNjZdLDI2OlsyLDY2XSw0NjpbMiw2Nl0sNTE6WzIsNjZdLDU0OlsyLDY2XSw2MzpbMiw2Nl0sNjQ6WzIsNjZdLDY1OlsyLDY2XSw2NzpbMiw2Nl0sNjk6WzIsNjZdLDcwOlsyLDY2XSw3MTpbMiw2Nl0sNzU6WzIsNjZdLDgxOlsyLDY2XSw4MjpbMiw2Nl0sODM6WzIsNjZdLDg4OlsyLDY2XSw5MDpbMiw2Nl0sOTk6WzIsNjZdLDEwMTpbMiw2Nl0sMTAyOlsyLDY2XSwxMDM6WzIsNjZdLDEwNzpbMiw2Nl0sMTE1OlsyLDY2XSwxMjM6WzIsNjZdLDEyNTpbMiw2Nl0sMTI2OlsyLDY2XSwxMjk6WzIsNjZdLDEzMDpbMiw2Nl0sMTMxOlsyLDY2XSwxMzI6WzIsNjZdLDEzMzpbMiw2Nl0sMTM0OlsyLDY2XX0sezE6WzIsOTVdLDY6WzIsOTVdLDI1OlsyLDk1XSwyNjpbMiw5NV0sNDY6WzIsOTVdLDUxOlsyLDk1XSw1NDpbMiw5NV0sNjk6WzIsOTVdLDc1OlsyLDk1XSw4MzpbMiw5NV0sODg6WzIsOTVdLDkwOlsyLDk1XSw5OTpbMiw5NV0sMTAxOlsyLDk1XSwxMDI6WzIsOTVdLDEwMzpbMiw5NV0sMTA3OlsyLDk1XSwxMTU6WzIsOTVdLDEyMzpbMiw5NV0sMTI1OlsyLDk1XSwxMjY6WzIsOTVdLDEyOTpbMiw5NV0sMTMwOlsyLDk1XSwxMzE6WzIsOTVdLDEzMjpbMiw5NV0sMTMzOlsyLDk1XSwxMzQ6WzIsOTVdfSx7MTQ6MjU2LDE1OjEyMCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoxMjEsNDE6NjAsNTU6NDcsNTY6NDgsNTg6MjE1LDYwOjI1LDYxOjI2LDYyOjI3LDczOlsxLDY3XSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTg6WzEsNTNdfSx7MTpbMiwxMzJdLDY6WzIsMTMyXSwyNTpbMiwxMzJdLDI2OlsyLDEzMl0sNDY6WzIsMTMyXSw1MTpbMiwxMzJdLDU0OlsyLDEzMl0sNjM6WzIsMTMyXSw2NDpbMiwxMzJdLDY1OlsyLDEzMl0sNjc6WzIsMTMyXSw2OTpbMiwxMzJdLDcwOlsyLDEzMl0sNzE6WzIsMTMyXSw3NTpbMiwxMzJdLDgxOlsyLDEzMl0sODI6WzIsMTMyXSw4MzpbMiwxMzJdLDg4OlsyLDEzMl0sOTA6WzIsMTMyXSw5OTpbMiwxMzJdLDEwMTpbMiwxMzJdLDEwMjpbMiwxMzJdLDEwMzpbMiwxMzJdLDEwNzpbMiwxMzJdLDExNTpbMiwxMzJdLDEyMzpbMiwxMzJdLDEyNTpbMiwxMzJdLDEyNjpbMiwxMzJdLDEyOTpbMiwxMzJdLDEzMDpbMiwxMzJdLDEzMTpbMiwxMzJdLDEzMjpbMiwxMzJdLDEzMzpbMiwxMzJdLDEzNDpbMiwxMzJdfSx7NjpbMSw3MV0sMjY6WzEsMjU3XX0sezg6MjU4LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezY6WzIsNjFdLDEzOlsyLDExMl0sMjU6WzIsNjFdLDI4OlsyLDExMl0sMzA6WzIsMTEyXSwzMTpbMiwxMTJdLDMzOlsyLDExMl0sMzQ6WzIsMTEyXSwzNTpbMiwxMTJdLDQyOlsyLDExMl0sNDM6WzIsMTEyXSw0NDpbMiwxMTJdLDQ4OlsyLDExMl0sNDk6WzIsMTEyXSw1MTpbMiw2MV0sNzM6WzIsMTEyXSw3NjpbMiwxMTJdLDgwOlsyLDExMl0sODU6WzIsMTEyXSw4NjpbMiwxMTJdLDg3OlsyLDExMl0sODg6WzIsNjFdLDkzOlsyLDExMl0sOTc6WzIsMTEyXSw5ODpbMiwxMTJdLDEwMTpbMiwxMTJdLDEwMzpbMiwxMTJdLDEwNTpbMiwxMTJdLDEwNzpbMiwxMTJdLDExNjpbMiwxMTJdLDEyMjpbMiwxMTJdLDEyNDpbMiwxMTJdLDEyNTpbMiwxMTJdLDEyNjpbMiwxMTJdLDEyNzpbMiwxMTJdLDEyODpbMiwxMTJdfSx7NjpbMSwyNjBdLDI1OlsxLDI2MV0sODg6WzEsMjU5XX0sezY6WzIsNTBdLDg6MTk3LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjU6WzIsNTBdLDI2OlsyLDUwXSwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU3OjE0NSw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4MzpbMiw1MF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sODg6WzIsNTBdLDkxOjI2Miw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezY6WzIsNDldLDI1OlsyLDQ5XSwyNjpbMiw0OV0sNTA6MjYzLDUxOlsxLDIyM119LHsxOlsyLDE3MV0sNjpbMiwxNzFdLDI1OlsyLDE3MV0sMjY6WzIsMTcxXSw0NjpbMiwxNzFdLDUxOlsyLDE3MV0sNTQ6WzIsMTcxXSw2OTpbMiwxNzFdLDc1OlsyLDE3MV0sODM6WzIsMTcxXSw4ODpbMiwxNzFdLDkwOlsyLDE3MV0sOTk6WzIsMTcxXSwxMDE6WzIsMTcxXSwxMDI6WzIsMTcxXSwxMDM6WzIsMTcxXSwxMDc6WzIsMTcxXSwxMTU6WzIsMTcxXSwxMTg6WzIsMTcxXSwxMjM6WzIsMTcxXSwxMjU6WzIsMTcxXSwxMjY6WzIsMTcxXSwxMjk6WzIsMTcxXSwxMzA6WzIsMTcxXSwxMzE6WzIsMTcxXSwxMzI6WzIsMTcxXSwxMzM6WzIsMTcxXSwxMzQ6WzIsMTcxXX0sezg6MjY0LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezg6MjY1LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezExMzpbMiwxNTBdLDExNDpbMiwxNTBdfSx7Mjc6MTU2LDI4OlsxLDcwXSw1NToxNTcsNTY6MTU4LDczOlsxLDY3XSw4NzpbMSwxMTJdLDExMjoyNjZ9LHsxOlsyLDE1Nl0sNjpbMiwxNTZdLDI1OlsyLDE1Nl0sMjY6WzIsMTU2XSw0NjpbMiwxNTZdLDUxOlsyLDE1Nl0sNTQ6WzIsMTU2XSw2OTpbMiwxNTZdLDc1OlsyLDE1Nl0sODM6WzIsMTU2XSw4ODpbMiwxNTZdLDkwOlsyLDE1Nl0sOTk6WzIsMTU2XSwxMDA6ODQsMTAxOlsyLDE1Nl0sMTAyOlsxLDI2N10sMTAzOlsyLDE1Nl0sMTA2Ojg1LDEwNzpbMiwxNTZdLDEwODo2NiwxMTU6WzEsMjY4XSwxMjM6WzIsMTU2XSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHsxOlsyLDE1N10sNjpbMiwxNTddLDI1OlsyLDE1N10sMjY6WzIsMTU3XSw0NjpbMiwxNTddLDUxOlsyLDE1N10sNTQ6WzIsMTU3XSw2OTpbMiwxNTddLDc1OlsyLDE1N10sODM6WzIsMTU3XSw4ODpbMiwxNTddLDkwOlsyLDE1N10sOTk6WzIsMTU3XSwxMDA6ODQsMTAxOlsyLDE1N10sMTAyOlsxLDI2OV0sMTAzOlsyLDE1N10sMTA2Ojg1LDEwNzpbMiwxNTddLDEwODo2NiwxMTU6WzIsMTU3XSwxMjM6WzIsMTU3XSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHs2OlsxLDI3MV0sMjU6WzEsMjcyXSw3NTpbMSwyNzBdfSx7NjpbMiw1MF0sMTI6MTY1LDI1OlsyLDUwXSwyNjpbMiw1MF0sMjc6MTY2LDI4OlsxLDcwXSwyOToxNjcsMzA6WzEsNjhdLDMxOlsxLDY5XSwzODoyNzMsMzk6MTY0LDQxOjE2OCw0MzpbMSw0Nl0sNzU6WzIsNTBdLDg2OlsxLDExMV19LHs4OjI3NCw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI1OlsxLDI3NV0sMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezE6WzIsNzldLDY6WzIsNzldLDI1OlsyLDc5XSwyNjpbMiw3OV0sMzc6WzIsNzldLDQ2OlsyLDc5XSw1MTpbMiw3OV0sNTQ6WzIsNzldLDYzOlsyLDc5XSw2NDpbMiw3OV0sNjU6WzIsNzldLDY3OlsyLDc5XSw2OTpbMiw3OV0sNzA6WzIsNzldLDcxOlsyLDc5XSw3NTpbMiw3OV0sNzc6WzIsNzldLDgxOlsyLDc5XSw4MjpbMiw3OV0sODM6WzIsNzldLDg4OlsyLDc5XSw5MDpbMiw3OV0sOTk6WzIsNzldLDEwMTpbMiw3OV0sMTAyOlsyLDc5XSwxMDM6WzIsNzldLDEwNzpbMiw3OV0sMTE1OlsyLDc5XSwxMjM6WzIsNzldLDEyNTpbMiw3OV0sMTI2OlsyLDc5XSwxMjc6WzIsNzldLDEyODpbMiw3OV0sMTI5OlsyLDc5XSwxMzA6WzIsNzldLDEzMTpbMiw3OV0sMTMyOlsyLDc5XSwxMzM6WzIsNzldLDEzNDpbMiw3OV0sMTM1OlsyLDc5XX0sezg6Mjc2LDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw2OTpbMiwxMTVdLDczOlsxLDY3XSw3NjpbMSw0M10sODA6WzEsMjhdLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkzOlsxLDM4XSw5NzpbMSw0NV0sOTg6WzEsNTNdLDEwMDozOSwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA0OjQwLDEwNTpbMSw2NF0sMTA2OjQxLDEwNzpbMSw2NV0sMTA4OjY2LDExNjpbMSw0Ml0sMTIxOjM3LDEyMjpbMSw2MV0sMTI0OlsxLDMxXSwxMjU6WzEsMzJdLDEyNjpbMSwzM10sMTI3OlsxLDM0XSwxMjg6WzEsMzVdfSx7Njk6WzIsMTE2XSwxMDA6ODQsMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNjo4NSwxMDc6WzEsNjVdLDEwODo2NiwxMjM6WzEsODNdLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzEsODBdLDEzMzpbMSw4MV0sMTM0OlsxLDgyXX0sezI2OlsxLDI3N10sMTAwOjg0LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDY6ODUsMTA3OlsxLDY1XSwxMDg6NjYsMTIzOlsxLDgzXSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHs2OlsxLDI2MF0sMjU6WzEsMjYxXSw4MzpbMSwyNzhdfSx7NjpbMiw2MV0sMjU6WzIsNjFdLDI2OlsyLDYxXSw1MTpbMiw2MV0sODM6WzIsNjFdLDg4OlsyLDYxXX0sezU6Mjc5LDI1OlsxLDVdfSx7NDY6WzIsNTNdLDUxOlsyLDUzXX0sezQ2OlsyLDU2XSw1MTpbMiw1Nl0sMTAwOjg0LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDY6ODUsMTA3OlsxLDY1XSwxMDg6NjYsMTIzOlsxLDgzXSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHsyNjpbMSwyODBdLDEwMDo4NCwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA2Ojg1LDEwNzpbMSw2NV0sMTA4OjY2LDEyMzpbMSw4M10sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7NToyODEsMjU6WzEsNV0sMTAwOjg0LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDY6ODUsMTA3OlsxLDY1XSwxMDg6NjYsMTIzOlsxLDgzXSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHs1OjI4MiwyNTpbMSw1XX0sezE6WzIsMTI4XSw2OlsyLDEyOF0sMjU6WzIsMTI4XSwyNjpbMiwxMjhdLDQ2OlsyLDEyOF0sNTE6WzIsMTI4XSw1NDpbMiwxMjhdLDY5OlsyLDEyOF0sNzU6WzIsMTI4XSw4MzpbMiwxMjhdLDg4OlsyLDEyOF0sOTA6WzIsMTI4XSw5OTpbMiwxMjhdLDEwMTpbMiwxMjhdLDEwMjpbMiwxMjhdLDEwMzpbMiwxMjhdLDEwNzpbMiwxMjhdLDExNTpbMiwxMjhdLDEyMzpbMiwxMjhdLDEyNTpbMiwxMjhdLDEyNjpbMiwxMjhdLDEyOTpbMiwxMjhdLDEzMDpbMiwxMjhdLDEzMTpbMiwxMjhdLDEzMjpbMiwxMjhdLDEzMzpbMiwxMjhdLDEzNDpbMiwxMjhdfSx7NToyODMsMjU6WzEsNV19LHsyNjpbMSwyODRdLDExODpbMSwyODVdLDExOToyNTIsMTIwOlsxLDIxM119LHsxOlsyLDE2NV0sNjpbMiwxNjVdLDI1OlsyLDE2NV0sMjY6WzIsMTY1XSw0NjpbMiwxNjVdLDUxOlsyLDE2NV0sNTQ6WzIsMTY1XSw2OTpbMiwxNjVdLDc1OlsyLDE2NV0sODM6WzIsMTY1XSw4ODpbMiwxNjVdLDkwOlsyLDE2NV0sOTk6WzIsMTY1XSwxMDE6WzIsMTY1XSwxMDI6WzIsMTY1XSwxMDM6WzIsMTY1XSwxMDc6WzIsMTY1XSwxMTU6WzIsMTY1XSwxMjM6WzIsMTY1XSwxMjU6WzIsMTY1XSwxMjY6WzIsMTY1XSwxMjk6WzIsMTY1XSwxMzA6WzIsMTY1XSwxMzE6WzIsMTY1XSwxMzI6WzIsMTY1XSwxMzM6WzIsMTY1XSwxMzQ6WzIsMTY1XX0sezU6Mjg2LDI1OlsxLDVdfSx7MjY6WzIsMTY4XSwxMTg6WzIsMTY4XSwxMjA6WzIsMTY4XX0sezU6Mjg3LDI1OlsxLDVdLDUxOlsxLDI4OF19LHsyNTpbMiwxMjRdLDUxOlsyLDEyNF0sMTAwOjg0LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDY6ODUsMTA3OlsxLDY1XSwxMDg6NjYsMTIzOlsxLDgzXSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHsxOlsyLDkzXSw2OlsyLDkzXSwyNTpbMiw5M10sMjY6WzIsOTNdLDQ2OlsyLDkzXSw1MTpbMiw5M10sNTQ6WzIsOTNdLDY5OlsyLDkzXSw3NTpbMiw5M10sODM6WzIsOTNdLDg4OlsyLDkzXSw5MDpbMiw5M10sOTk6WzIsOTNdLDEwMTpbMiw5M10sMTAyOlsyLDkzXSwxMDM6WzIsOTNdLDEwNzpbMiw5M10sMTE1OlsyLDkzXSwxMjM6WzIsOTNdLDEyNTpbMiw5M10sMTI2OlsyLDkzXSwxMjk6WzIsOTNdLDEzMDpbMiw5M10sMTMxOlsyLDkzXSwxMzI6WzIsOTNdLDEzMzpbMiw5M10sMTM0OlsyLDkzXX0sezE6WzIsOTZdLDU6Mjg5LDY6WzIsOTZdLDI1OlsxLDVdLDI2OlsyLDk2XSw0NjpbMiw5Nl0sNTE6WzIsOTZdLDU0OlsyLDk2XSw1OTo5MCw2MzpbMSw5Ml0sNjQ6WzEsOTNdLDY1OlsxLDk0XSw2Njo5NSw2NzpbMSw5Nl0sNjk6WzIsOTZdLDcwOlsxLDk3XSw3MTpbMSw5OF0sNzU6WzIsOTZdLDc4Ojg5LDgxOlsxLDkxXSw4MjpbMiwxMDJdLDgzOlsyLDk2XSw4ODpbMiw5Nl0sOTA6WzIsOTZdLDk5OlsyLDk2XSwxMDE6WzIsOTZdLDEwMjpbMiw5Nl0sMTAzOlsyLDk2XSwxMDc6WzIsOTZdLDExNTpbMiw5Nl0sMTIzOlsyLDk2XSwxMjU6WzIsOTZdLDEyNjpbMiw5Nl0sMTI5OlsyLDk2XSwxMzA6WzIsOTZdLDEzMTpbMiw5Nl0sMTMyOlsyLDk2XSwxMzM6WzIsOTZdLDEzNDpbMiw5Nl19LHs5OTpbMSwyOTBdfSx7ODg6WzEsMjkxXSwxMDA6ODQsMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNjo4NSwxMDc6WzEsNjVdLDEwODo2NiwxMjM6WzEsODNdLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzEsODBdLDEzMzpbMSw4MV0sMTM0OlsxLDgyXX0sezE6WzIsMTEwXSw2OlsyLDExMF0sMjU6WzIsMTEwXSwyNjpbMiwxMTBdLDM3OlsyLDExMF0sNDY6WzIsMTEwXSw1MTpbMiwxMTBdLDU0OlsyLDExMF0sNjM6WzIsMTEwXSw2NDpbMiwxMTBdLDY1OlsyLDExMF0sNjc6WzIsMTEwXSw2OTpbMiwxMTBdLDcwOlsyLDExMF0sNzE6WzIsMTEwXSw3NTpbMiwxMTBdLDgxOlsyLDExMF0sODI6WzIsMTEwXSw4MzpbMiwxMTBdLDg4OlsyLDExMF0sOTA6WzIsMTEwXSw5OTpbMiwxMTBdLDEwMTpbMiwxMTBdLDEwMjpbMiwxMTBdLDEwMzpbMiwxMTBdLDEwNzpbMiwxMTBdLDExMzpbMiwxMTBdLDExNDpbMiwxMTBdLDExNTpbMiwxMTBdLDEyMzpbMiwxMTBdLDEyNTpbMiwxMTBdLDEyNjpbMiwxMTBdLDEyOTpbMiwxMTBdLDEzMDpbMiwxMTBdLDEzMTpbMiwxMTBdLDEzMjpbMiwxMTBdLDEzMzpbMiwxMTBdLDEzNDpbMiwxMTBdfSx7ODoxOTcsOToxMTUsMTA6MTksMTE6MjAsMTI6MjEsMTM6WzEsMjJdLDE0OjgsMTU6OSwxNjoxMCwxNzoxMSwxODoxMiwxOToxMywyMDoxNCwyMToxNSwyMjoxNiwyMzoxNywyNDoxOCwyNzo1OSwyODpbMSw3MF0sMjk6NDksMzA6WzEsNjhdLDMxOlsxLDY5XSwzMjoyNCwzMzpbMSw1MF0sMzQ6WzEsNTFdLDM1OlsxLDUyXSwzNjoyMyw0MTo2MCw0MjpbMSw0NF0sNDM6WzEsNDZdLDQ0OlsxLDI5XSw0NzozMCw0ODpbMSw1N10sNDk6WzEsNThdLDU1OjQ3LDU2OjQ4LDU3OjE0NSw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MToyOTIsOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHs4OjE5Nyw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI1OlsxLDE0NF0sMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1NzoxNDUsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODQ6MjkzLDg1OlsxLDU1XSw4NjpbMSw1Nl0sODc6WzEsNTRdLDkxOjE0Myw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezY6WzIsMTE4XSwyNTpbMiwxMThdLDI2OlsyLDExOF0sNTE6WzIsMTE4XSw4MzpbMiwxMThdLDg4OlsyLDExOF19LHs2OlsxLDI2MF0sMjU6WzEsMjYxXSwyNjpbMSwyOTRdfSx7MTpbMiwxMzVdLDY6WzIsMTM1XSwyNTpbMiwxMzVdLDI2OlsyLDEzNV0sNDY6WzIsMTM1XSw1MTpbMiwxMzVdLDU0OlsyLDEzNV0sNjk6WzIsMTM1XSw3NTpbMiwxMzVdLDgzOlsyLDEzNV0sODg6WzIsMTM1XSw5MDpbMiwxMzVdLDk5OlsyLDEzNV0sMTAwOjg0LDEwMTpbMSw2Ml0sMTAyOlsyLDEzNV0sMTAzOlsxLDYzXSwxMDY6ODUsMTA3OlsxLDY1XSwxMDg6NjYsMTE1OlsyLDEzNV0sMTIzOlsyLDEzNV0sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7MTpbMiwxMzddLDY6WzIsMTM3XSwyNTpbMiwxMzddLDI2OlsyLDEzN10sNDY6WzIsMTM3XSw1MTpbMiwxMzddLDU0OlsyLDEzN10sNjk6WzIsMTM3XSw3NTpbMiwxMzddLDgzOlsyLDEzN10sODg6WzIsMTM3XSw5MDpbMiwxMzddLDk5OlsyLDEzN10sMTAwOjg0LDEwMTpbMSw2Ml0sMTAyOlsyLDEzN10sMTAzOlsxLDYzXSwxMDY6ODUsMTA3OlsxLDY1XSwxMDg6NjYsMTE1OlsyLDEzN10sMTIzOlsyLDEzN10sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7MTEzOlsyLDE1NV0sMTE0OlsyLDE1NV19LHs4OjI5NSw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHs4OjI5Niw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHs4OjI5Nyw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHsxOlsyLDg0XSw2OlsyLDg0XSwyNTpbMiw4NF0sMjY6WzIsODRdLDM3OlsyLDg0XSw0NjpbMiw4NF0sNTE6WzIsODRdLDU0OlsyLDg0XSw2MzpbMiw4NF0sNjQ6WzIsODRdLDY1OlsyLDg0XSw2NzpbMiw4NF0sNjk6WzIsODRdLDcwOlsyLDg0XSw3MTpbMiw4NF0sNzU6WzIsODRdLDgxOlsyLDg0XSw4MjpbMiw4NF0sODM6WzIsODRdLDg4OlsyLDg0XSw5MDpbMiw4NF0sOTk6WzIsODRdLDEwMTpbMiw4NF0sMTAyOlsyLDg0XSwxMDM6WzIsODRdLDEwNzpbMiw4NF0sMTEzOlsyLDg0XSwxMTQ6WzIsODRdLDExNTpbMiw4NF0sMTIzOlsyLDg0XSwxMjU6WzIsODRdLDEyNjpbMiw4NF0sMTI5OlsyLDg0XSwxMzA6WzIsODRdLDEzMTpbMiw4NF0sMTMyOlsyLDg0XSwxMzM6WzIsODRdLDEzNDpbMiw4NF19LHsxMjoxNjUsMjc6MTY2LDI4OlsxLDcwXSwyOToxNjcsMzA6WzEsNjhdLDMxOlsxLDY5XSwzODoyOTgsMzk6MTY0LDQxOjE2OCw0MzpbMSw0Nl0sODY6WzEsMTExXX0sezY6WzIsODVdLDEyOjE2NSwyNTpbMiw4NV0sMjY6WzIsODVdLDI3OjE2NiwyODpbMSw3MF0sMjk6MTY3LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzg6MTYzLDM5OjE2NCw0MToxNjgsNDM6WzEsNDZdLDUxOlsyLDg1XSw3NDoyOTksODY6WzEsMTExXX0sezY6WzIsODddLDI1OlsyLDg3XSwyNjpbMiw4N10sNTE6WzIsODddLDc1OlsyLDg3XX0sezY6WzIsMzZdLDI1OlsyLDM2XSwyNjpbMiwzNl0sNTE6WzIsMzZdLDc1OlsyLDM2XSwxMDA6ODQsMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNjo4NSwxMDc6WzEsNjVdLDEwODo2NiwxMjM6WzEsODNdLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzEsODBdLDEzMzpbMSw4MV0sMTM0OlsxLDgyXX0sezg6MzAwLDk6MTE1LDEwOjE5LDExOjIwLDEyOjIxLDEzOlsxLDIyXSwxNDo4LDE1OjksMTY6MTAsMTc6MTEsMTg6MTIsMTk6MTMsMjA6MTQsMjE6MTUsMjI6MTYsMjM6MTcsMjQ6MTgsMjc6NTksMjg6WzEsNzBdLDI5OjQ5LDMwOlsxLDY4XSwzMTpbMSw2OV0sMzI6MjQsMzM6WzEsNTBdLDM0OlsxLDUxXSwzNTpbMSw1Ml0sMzY6MjMsNDE6NjAsNDI6WzEsNDRdLDQzOlsxLDQ2XSw0NDpbMSwyOV0sNDc6MzAsNDg6WzEsNTddLDQ5OlsxLDU4XSw1NTo0Nyw1Njo0OCw1ODozNiw2MDoyNSw2MToyNiw2MjoyNyw3MzpbMSw2N10sNzY6WzEsNDNdLDgwOlsxLDI4XSw4NTpbMSw1NV0sODY6WzEsNTZdLDg3OlsxLDU0XSw5MzpbMSwzOF0sOTc6WzEsNDVdLDk4OlsxLDUzXSwxMDA6MzksMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNDo0MCwxMDU6WzEsNjRdLDEwNjo0MSwxMDc6WzEsNjVdLDEwODo2NiwxMTY6WzEsNDJdLDEyMTozNywxMjI6WzEsNjFdLDEyNDpbMSwzMV0sMTI1OlsxLDMyXSwxMjY6WzEsMzNdLDEyNzpbMSwzNF0sMTI4OlsxLDM1XX0sezY5OlsyLDExNF0sMTAwOjg0LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDY6ODUsMTA3OlsxLDY1XSwxMDg6NjYsMTIzOlsxLDgzXSwxMjU6WzEsNzddLDEyNjpbMSw3Nl0sMTI5OlsxLDc1XSwxMzA6WzEsNzhdLDEzMTpbMSw3OV0sMTMyOlsxLDgwXSwxMzM6WzEsODFdLDEzNDpbMSw4Ml19LHsxOlsyLDM0XSw2OlsyLDM0XSwyNTpbMiwzNF0sMjY6WzIsMzRdLDQ2OlsyLDM0XSw1MTpbMiwzNF0sNTQ6WzIsMzRdLDY5OlsyLDM0XSw3NTpbMiwzNF0sODM6WzIsMzRdLDg4OlsyLDM0XSw5MDpbMiwzNF0sOTk6WzIsMzRdLDEwMTpbMiwzNF0sMTAyOlsyLDM0XSwxMDM6WzIsMzRdLDEwNzpbMiwzNF0sMTE1OlsyLDM0XSwxMjM6WzIsMzRdLDEyNTpbMiwzNF0sMTI2OlsyLDM0XSwxMjk6WzIsMzRdLDEzMDpbMiwzNF0sMTMxOlsyLDM0XSwxMzI6WzIsMzRdLDEzMzpbMiwzNF0sMTM0OlsyLDM0XX0sezE6WzIsMTA1XSw2OlsyLDEwNV0sMjU6WzIsMTA1XSwyNjpbMiwxMDVdLDQ2OlsyLDEwNV0sNTE6WzIsMTA1XSw1NDpbMiwxMDVdLDYzOlsyLDEwNV0sNjQ6WzIsMTA1XSw2NTpbMiwxMDVdLDY3OlsyLDEwNV0sNjk6WzIsMTA1XSw3MDpbMiwxMDVdLDcxOlsyLDEwNV0sNzU6WzIsMTA1XSw4MTpbMiwxMDVdLDgyOlsyLDEwNV0sODM6WzIsMTA1XSw4ODpbMiwxMDVdLDkwOlsyLDEwNV0sOTk6WzIsMTA1XSwxMDE6WzIsMTA1XSwxMDI6WzIsMTA1XSwxMDM6WzIsMTA1XSwxMDc6WzIsMTA1XSwxMTU6WzIsMTA1XSwxMjM6WzIsMTA1XSwxMjU6WzIsMTA1XSwxMjY6WzIsMTA1XSwxMjk6WzIsMTA1XSwxMzA6WzIsMTA1XSwxMzE6WzIsMTA1XSwxMzI6WzIsMTA1XSwxMzM6WzIsMTA1XSwxMzQ6WzIsMTA1XX0sezE6WzIsNDVdLDY6WzIsNDVdLDI1OlsyLDQ1XSwyNjpbMiw0NV0sNDY6WzIsNDVdLDUxOlsyLDQ1XSw1NDpbMiw0NV0sNjk6WzIsNDVdLDc1OlsyLDQ1XSw4MzpbMiw0NV0sODg6WzIsNDVdLDkwOlsyLDQ1XSw5OTpbMiw0NV0sMTAxOlsyLDQ1XSwxMDI6WzIsNDVdLDEwMzpbMiw0NV0sMTA3OlsyLDQ1XSwxMTU6WzIsNDVdLDEyMzpbMiw0NV0sMTI1OlsyLDQ1XSwxMjY6WzIsNDVdLDEyOTpbMiw0NV0sMTMwOlsyLDQ1XSwxMzE6WzIsNDVdLDEzMjpbMiw0NV0sMTMzOlsyLDQ1XSwxMzQ6WzIsNDVdfSx7MTpbMiwxOTNdLDY6WzIsMTkzXSwyNTpbMiwxOTNdLDI2OlsyLDE5M10sNDY6WzIsMTkzXSw1MTpbMiwxOTNdLDU0OlsyLDE5M10sNjk6WzIsMTkzXSw3NTpbMiwxOTNdLDgzOlsyLDE5M10sODg6WzIsMTkzXSw5MDpbMiwxOTNdLDk5OlsyLDE5M10sMTAxOlsyLDE5M10sMTAyOlsyLDE5M10sMTAzOlsyLDE5M10sMTA3OlsyLDE5M10sMTE1OlsyLDE5M10sMTIzOlsyLDE5M10sMTI1OlsyLDE5M10sMTI2OlsyLDE5M10sMTI5OlsyLDE5M10sMTMwOlsyLDE5M10sMTMxOlsyLDE5M10sMTMyOlsyLDE5M10sMTMzOlsyLDE5M10sMTM0OlsyLDE5M119LHsxOlsyLDE3Ml0sNjpbMiwxNzJdLDI1OlsyLDE3Ml0sMjY6WzIsMTcyXSw0NjpbMiwxNzJdLDUxOlsyLDE3Ml0sNTQ6WzIsMTcyXSw2OTpbMiwxNzJdLDc1OlsyLDE3Ml0sODM6WzIsMTcyXSw4ODpbMiwxNzJdLDkwOlsyLDE3Ml0sOTk6WzIsMTcyXSwxMDE6WzIsMTcyXSwxMDI6WzIsMTcyXSwxMDM6WzIsMTcyXSwxMDc6WzIsMTcyXSwxMTU6WzIsMTcyXSwxMTg6WzIsMTcyXSwxMjM6WzIsMTcyXSwxMjU6WzIsMTcyXSwxMjY6WzIsMTcyXSwxMjk6WzIsMTcyXSwxMzA6WzIsMTcyXSwxMzE6WzIsMTcyXSwxMzI6WzIsMTcyXSwxMzM6WzIsMTcyXSwxMzQ6WzIsMTcyXX0sezE6WzIsMTI5XSw2OlsyLDEyOV0sMjU6WzIsMTI5XSwyNjpbMiwxMjldLDQ2OlsyLDEyOV0sNTE6WzIsMTI5XSw1NDpbMiwxMjldLDY5OlsyLDEyOV0sNzU6WzIsMTI5XSw4MzpbMiwxMjldLDg4OlsyLDEyOV0sOTA6WzIsMTI5XSw5OTpbMiwxMjldLDEwMTpbMiwxMjldLDEwMjpbMiwxMjldLDEwMzpbMiwxMjldLDEwNzpbMiwxMjldLDExNTpbMiwxMjldLDEyMzpbMiwxMjldLDEyNTpbMiwxMjldLDEyNjpbMiwxMjldLDEyOTpbMiwxMjldLDEzMDpbMiwxMjldLDEzMTpbMiwxMjldLDEzMjpbMiwxMjldLDEzMzpbMiwxMjldLDEzNDpbMiwxMjldfSx7MTpbMiwxMzBdLDY6WzIsMTMwXSwyNTpbMiwxMzBdLDI2OlsyLDEzMF0sNDY6WzIsMTMwXSw1MTpbMiwxMzBdLDU0OlsyLDEzMF0sNjk6WzIsMTMwXSw3NTpbMiwxMzBdLDgzOlsyLDEzMF0sODg6WzIsMTMwXSw5MDpbMiwxMzBdLDk1OlsyLDEzMF0sOTk6WzIsMTMwXSwxMDE6WzIsMTMwXSwxMDI6WzIsMTMwXSwxMDM6WzIsMTMwXSwxMDc6WzIsMTMwXSwxMTU6WzIsMTMwXSwxMjM6WzIsMTMwXSwxMjU6WzIsMTMwXSwxMjY6WzIsMTMwXSwxMjk6WzIsMTMwXSwxMzA6WzIsMTMwXSwxMzE6WzIsMTMwXSwxMzI6WzIsMTMwXSwxMzM6WzIsMTMwXSwxMzQ6WzIsMTMwXX0sezE6WzIsMTYzXSw2OlsyLDE2M10sMjU6WzIsMTYzXSwyNjpbMiwxNjNdLDQ2OlsyLDE2M10sNTE6WzIsMTYzXSw1NDpbMiwxNjNdLDY5OlsyLDE2M10sNzU6WzIsMTYzXSw4MzpbMiwxNjNdLDg4OlsyLDE2M10sOTA6WzIsMTYzXSw5OTpbMiwxNjNdLDEwMTpbMiwxNjNdLDEwMjpbMiwxNjNdLDEwMzpbMiwxNjNdLDEwNzpbMiwxNjNdLDExNTpbMiwxNjNdLDEyMzpbMiwxNjNdLDEyNTpbMiwxNjNdLDEyNjpbMiwxNjNdLDEyOTpbMiwxNjNdLDEzMDpbMiwxNjNdLDEzMTpbMiwxNjNdLDEzMjpbMiwxNjNdLDEzMzpbMiwxNjNdLDEzNDpbMiwxNjNdfSx7NTozMDEsMjU6WzEsNV19LHsyNjpbMSwzMDJdfSx7NjpbMSwzMDNdLDI2OlsyLDE2OV0sMTE4OlsyLDE2OV0sMTIwOlsyLDE2OV19LHs4OjMwNCw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHsxOlsyLDk3XSw2OlsyLDk3XSwyNTpbMiw5N10sMjY6WzIsOTddLDQ2OlsyLDk3XSw1MTpbMiw5N10sNTQ6WzIsOTddLDY5OlsyLDk3XSw3NTpbMiw5N10sODM6WzIsOTddLDg4OlsyLDk3XSw5MDpbMiw5N10sOTk6WzIsOTddLDEwMTpbMiw5N10sMTAyOlsyLDk3XSwxMDM6WzIsOTddLDEwNzpbMiw5N10sMTE1OlsyLDk3XSwxMjM6WzIsOTddLDEyNTpbMiw5N10sMTI2OlsyLDk3XSwxMjk6WzIsOTddLDEzMDpbMiw5N10sMTMxOlsyLDk3XSwxMzI6WzIsOTddLDEzMzpbMiw5N10sMTM0OlsyLDk3XX0sezE6WzIsMTMzXSw2OlsyLDEzM10sMjU6WzIsMTMzXSwyNjpbMiwxMzNdLDQ2OlsyLDEzM10sNTE6WzIsMTMzXSw1NDpbMiwxMzNdLDYzOlsyLDEzM10sNjQ6WzIsMTMzXSw2NTpbMiwxMzNdLDY3OlsyLDEzM10sNjk6WzIsMTMzXSw3MDpbMiwxMzNdLDcxOlsyLDEzM10sNzU6WzIsMTMzXSw4MTpbMiwxMzNdLDgyOlsyLDEzM10sODM6WzIsMTMzXSw4ODpbMiwxMzNdLDkwOlsyLDEzM10sOTk6WzIsMTMzXSwxMDE6WzIsMTMzXSwxMDI6WzIsMTMzXSwxMDM6WzIsMTMzXSwxMDc6WzIsMTMzXSwxMTU6WzIsMTMzXSwxMjM6WzIsMTMzXSwxMjU6WzIsMTMzXSwxMjY6WzIsMTMzXSwxMjk6WzIsMTMzXSwxMzA6WzIsMTMzXSwxMzE6WzIsMTMzXSwxMzI6WzIsMTMzXSwxMzM6WzIsMTMzXSwxMzQ6WzIsMTMzXX0sezE6WzIsMTEzXSw2OlsyLDExM10sMjU6WzIsMTEzXSwyNjpbMiwxMTNdLDQ2OlsyLDExM10sNTE6WzIsMTEzXSw1NDpbMiwxMTNdLDYzOlsyLDExM10sNjQ6WzIsMTEzXSw2NTpbMiwxMTNdLDY3OlsyLDExM10sNjk6WzIsMTEzXSw3MDpbMiwxMTNdLDcxOlsyLDExM10sNzU6WzIsMTEzXSw4MTpbMiwxMTNdLDgyOlsyLDExM10sODM6WzIsMTEzXSw4ODpbMiwxMTNdLDkwOlsyLDExM10sOTk6WzIsMTEzXSwxMDE6WzIsMTEzXSwxMDI6WzIsMTEzXSwxMDM6WzIsMTEzXSwxMDc6WzIsMTEzXSwxMTU6WzIsMTEzXSwxMjM6WzIsMTEzXSwxMjU6WzIsMTEzXSwxMjY6WzIsMTEzXSwxMjk6WzIsMTEzXSwxMzA6WzIsMTEzXSwxMzE6WzIsMTEzXSwxMzI6WzIsMTEzXSwxMzM6WzIsMTEzXSwxMzQ6WzIsMTEzXX0sezY6WzIsMTE5XSwyNTpbMiwxMTldLDI2OlsyLDExOV0sNTE6WzIsMTE5XSw4MzpbMiwxMTldLDg4OlsyLDExOV19LHs2OlsyLDQ5XSwyNTpbMiw0OV0sMjY6WzIsNDldLDUwOjMwNSw1MTpbMSwyMjNdfSx7NjpbMiwxMjBdLDI1OlsyLDEyMF0sMjY6WzIsMTIwXSw1MTpbMiwxMjBdLDgzOlsyLDEyMF0sODg6WzIsMTIwXX0sezE6WzIsMTU4XSw2OlsyLDE1OF0sMjU6WzIsMTU4XSwyNjpbMiwxNThdLDQ2OlsyLDE1OF0sNTE6WzIsMTU4XSw1NDpbMiwxNThdLDY5OlsyLDE1OF0sNzU6WzIsMTU4XSw4MzpbMiwxNThdLDg4OlsyLDE1OF0sOTA6WzIsMTU4XSw5OTpbMiwxNThdLDEwMDo4NCwxMDE6WzIsMTU4XSwxMDI6WzIsMTU4XSwxMDM6WzIsMTU4XSwxMDY6ODUsMTA3OlsyLDE1OF0sMTA4OjY2LDExNTpbMSwzMDZdLDEyMzpbMiwxNThdLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzEsODBdLDEzMzpbMSw4MV0sMTM0OlsxLDgyXX0sezE6WzIsMTYwXSw2OlsyLDE2MF0sMjU6WzIsMTYwXSwyNjpbMiwxNjBdLDQ2OlsyLDE2MF0sNTE6WzIsMTYwXSw1NDpbMiwxNjBdLDY5OlsyLDE2MF0sNzU6WzIsMTYwXSw4MzpbMiwxNjBdLDg4OlsyLDE2MF0sOTA6WzIsMTYwXSw5OTpbMiwxNjBdLDEwMDo4NCwxMDE6WzIsMTYwXSwxMDI6WzEsMzA3XSwxMDM6WzIsMTYwXSwxMDY6ODUsMTA3OlsyLDE2MF0sMTA4OjY2LDExNTpbMiwxNjBdLDEyMzpbMiwxNjBdLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzEsODBdLDEzMzpbMSw4MV0sMTM0OlsxLDgyXX0sezE6WzIsMTU5XSw2OlsyLDE1OV0sMjU6WzIsMTU5XSwyNjpbMiwxNTldLDQ2OlsyLDE1OV0sNTE6WzIsMTU5XSw1NDpbMiwxNTldLDY5OlsyLDE1OV0sNzU6WzIsMTU5XSw4MzpbMiwxNTldLDg4OlsyLDE1OV0sOTA6WzIsMTU5XSw5OTpbMiwxNTldLDEwMDo4NCwxMDE6WzIsMTU5XSwxMDI6WzIsMTU5XSwxMDM6WzIsMTU5XSwxMDY6ODUsMTA3OlsyLDE1OV0sMTA4OjY2LDExNTpbMiwxNTldLDEyMzpbMiwxNTldLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzEsODBdLDEzMzpbMSw4MV0sMTM0OlsxLDgyXX0sezY6WzIsODhdLDI1OlsyLDg4XSwyNjpbMiw4OF0sNTE6WzIsODhdLDc1OlsyLDg4XX0sezY6WzIsNDldLDI1OlsyLDQ5XSwyNjpbMiw0OV0sNTA6MzA4LDUxOlsxLDIzM119LHsyNjpbMSwzMDldLDEwMDo4NCwxMDE6WzEsNjJdLDEwMzpbMSw2M10sMTA2Ojg1LDEwNzpbMSw2NV0sMTA4OjY2LDEyMzpbMSw4M10sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7MjY6WzEsMzEwXX0sezE6WzIsMTY2XSw2OlsyLDE2Nl0sMjU6WzIsMTY2XSwyNjpbMiwxNjZdLDQ2OlsyLDE2Nl0sNTE6WzIsMTY2XSw1NDpbMiwxNjZdLDY5OlsyLDE2Nl0sNzU6WzIsMTY2XSw4MzpbMiwxNjZdLDg4OlsyLDE2Nl0sOTA6WzIsMTY2XSw5OTpbMiwxNjZdLDEwMTpbMiwxNjZdLDEwMjpbMiwxNjZdLDEwMzpbMiwxNjZdLDEwNzpbMiwxNjZdLDExNTpbMiwxNjZdLDEyMzpbMiwxNjZdLDEyNTpbMiwxNjZdLDEyNjpbMiwxNjZdLDEyOTpbMiwxNjZdLDEzMDpbMiwxNjZdLDEzMTpbMiwxNjZdLDEzMjpbMiwxNjZdLDEzMzpbMiwxNjZdLDEzNDpbMiwxNjZdfSx7MjY6WzIsMTcwXSwxMTg6WzIsMTcwXSwxMjA6WzIsMTcwXX0sezI1OlsyLDEyNV0sNTE6WzIsMTI1XSwxMDA6ODQsMTAxOlsxLDYyXSwxMDM6WzEsNjNdLDEwNjo4NSwxMDc6WzEsNjVdLDEwODo2NiwxMjM6WzEsODNdLDEyNTpbMSw3N10sMTI2OlsxLDc2XSwxMjk6WzEsNzVdLDEzMDpbMSw3OF0sMTMxOlsxLDc5XSwxMzI6WzEsODBdLDEzMzpbMSw4MV0sMTM0OlsxLDgyXX0sezY6WzEsMjYwXSwyNTpbMSwyNjFdLDI2OlsxLDMxMV19LHs4OjMxMiw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHs4OjMxMyw5OjExNSwxMDoxOSwxMToyMCwxMjoyMSwxMzpbMSwyMl0sMTQ6OCwxNTo5LDE2OjEwLDE3OjExLDE4OjEyLDE5OjEzLDIwOjE0LDIxOjE1LDIyOjE2LDIzOjE3LDI0OjE4LDI3OjU5LDI4OlsxLDcwXSwyOTo0OSwzMDpbMSw2OF0sMzE6WzEsNjldLDMyOjI0LDMzOlsxLDUwXSwzNDpbMSw1MV0sMzU6WzEsNTJdLDM2OjIzLDQxOjYwLDQyOlsxLDQ0XSw0MzpbMSw0Nl0sNDQ6WzEsMjldLDQ3OjMwLDQ4OlsxLDU3XSw0OTpbMSw1OF0sNTU6NDcsNTY6NDgsNTg6MzYsNjA6MjUsNjE6MjYsNjI6MjcsNzM6WzEsNjddLDc2OlsxLDQzXSw4MDpbMSwyOF0sODU6WzEsNTVdLDg2OlsxLDU2XSw4NzpbMSw1NF0sOTM6WzEsMzhdLDk3OlsxLDQ1XSw5ODpbMSw1M10sMTAwOjM5LDEwMTpbMSw2Ml0sMTAzOlsxLDYzXSwxMDQ6NDAsMTA1OlsxLDY0XSwxMDY6NDEsMTA3OlsxLDY1XSwxMDg6NjYsMTE2OlsxLDQyXSwxMjE6MzcsMTIyOlsxLDYxXSwxMjQ6WzEsMzFdLDEyNTpbMSwzMl0sMTI2OlsxLDMzXSwxMjc6WzEsMzRdLDEyODpbMSwzNV19LHs2OlsxLDI3MV0sMjU6WzEsMjcyXSwyNjpbMSwzMTRdfSx7NjpbMiwzN10sMjU6WzIsMzddLDI2OlsyLDM3XSw1MTpbMiwzN10sNzU6WzIsMzddfSx7MTpbMiwxNjRdLDY6WzIsMTY0XSwyNTpbMiwxNjRdLDI2OlsyLDE2NF0sNDY6WzIsMTY0XSw1MTpbMiwxNjRdLDU0OlsyLDE2NF0sNjk6WzIsMTY0XSw3NTpbMiwxNjRdLDgzOlsyLDE2NF0sODg6WzIsMTY0XSw5MDpbMiwxNjRdLDk5OlsyLDE2NF0sMTAxOlsyLDE2NF0sMTAyOlsyLDE2NF0sMTAzOlsyLDE2NF0sMTA3OlsyLDE2NF0sMTE1OlsyLDE2NF0sMTIzOlsyLDE2NF0sMTI1OlsyLDE2NF0sMTI2OlsyLDE2NF0sMTI5OlsyLDE2NF0sMTMwOlsyLDE2NF0sMTMxOlsyLDE2NF0sMTMyOlsyLDE2NF0sMTMzOlsyLDE2NF0sMTM0OlsyLDE2NF19LHs2OlsyLDEyMV0sMjU6WzIsMTIxXSwyNjpbMiwxMjFdLDUxOlsyLDEyMV0sODM6WzIsMTIxXSw4ODpbMiwxMjFdfSx7MTpbMiwxNjFdLDY6WzIsMTYxXSwyNTpbMiwxNjFdLDI2OlsyLDE2MV0sNDY6WzIsMTYxXSw1MTpbMiwxNjFdLDU0OlsyLDE2MV0sNjk6WzIsMTYxXSw3NTpbMiwxNjFdLDgzOlsyLDE2MV0sODg6WzIsMTYxXSw5MDpbMiwxNjFdLDk5OlsyLDE2MV0sMTAwOjg0LDEwMTpbMiwxNjFdLDEwMjpbMiwxNjFdLDEwMzpbMiwxNjFdLDEwNjo4NSwxMDc6WzIsMTYxXSwxMDg6NjYsMTE1OlsyLDE2MV0sMTIzOlsyLDE2MV0sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7MTpbMiwxNjJdLDY6WzIsMTYyXSwyNTpbMiwxNjJdLDI2OlsyLDE2Ml0sNDY6WzIsMTYyXSw1MTpbMiwxNjJdLDU0OlsyLDE2Ml0sNjk6WzIsMTYyXSw3NTpbMiwxNjJdLDgzOlsyLDE2Ml0sODg6WzIsMTYyXSw5MDpbMiwxNjJdLDk5OlsyLDE2Ml0sMTAwOjg0LDEwMTpbMiwxNjJdLDEwMjpbMiwxNjJdLDEwMzpbMiwxNjJdLDEwNjo4NSwxMDc6WzIsMTYyXSwxMDg6NjYsMTE1OlsyLDE2Ml0sMTIzOlsyLDE2Ml0sMTI1OlsxLDc3XSwxMjY6WzEsNzZdLDEyOTpbMSw3NV0sMTMwOlsxLDc4XSwxMzE6WzEsNzldLDEzMjpbMSw4MF0sMTMzOlsxLDgxXSwxMzQ6WzEsODJdfSx7NjpbMiw4OV0sMjU6WzIsODldLDI2OlsyLDg5XSw1MTpbMiw4OV0sNzU6WzIsODldfV0sCmRlZmF1bHRBY3Rpb25zOiB7NTc6WzIsNDddLDU4OlsyLDQ4XSw3MjpbMiwzXSw5MTpbMiwxMDNdLDE4NjpbMiw4M119LApwYXJzZUVycm9yOiBmdW5jdGlvbiBwYXJzZUVycm9yKHN0ciwgaGFzaCkgewogICAgdGhyb3cgbmV3IEVycm9yKHN0cik7Cn0sCnBhcnNlOiBmdW5jdGlvbiBwYXJzZShpbnB1dCkgewogICAgdmFyIHNlbGYgPSB0aGlzLAogICAgICAgIHN0YWNrID0gWzBdLAogICAgICAgIHZzdGFjayA9IFtudWxsXSwgLy8gc2VtYW50aWMgdmFsdWUgc3RhY2sKICAgICAgICBsc3RhY2sgPSBbXSwgLy8gbG9jYXRpb24gc3RhY2sKICAgICAgICB0YWJsZSA9IHRoaXMudGFibGUsCiAgICAgICAgeXl0ZXh0ID0gJycsCiAgICAgICAgeXlsaW5lbm8gPSAwLAogICAgICAgIHl5bGVuZyA9IDAsCiAgICAgICAgcmVjb3ZlcmluZyA9IDAsCiAgICAgICAgVEVSUk9SID0gMiwKICAgICAgICBFT0YgPSAxOwoKICAgIC8vdGhpcy5yZWR1Y3Rpb25Db3VudCA9IHRoaXMuc2hpZnRDb3VudCA9IDA7CgogICAgdGhpcy5sZXhlci5zZXRJbnB1dChpbnB1dCk7CiAgICB0aGlzLmxleGVyLnl5ID0gdGhpcy55eTsKICAgIHRoaXMueXkubGV4ZXIgPSB0aGlzLmxleGVyOwogICAgaWYgKHR5cGVvZiB0aGlzLmxleGVyLnl5bGxvYyA9PSAndW5kZWZpbmVkJykKICAgICAgICB0aGlzLmxleGVyLnl5bGxvYyA9IHt9OwogICAgdmFyIHl5bG9jID0gdGhpcy5sZXhlci55eWxsb2M7CiAgICBsc3RhY2sucHVzaCh5eWxvYyk7CgogICAgaWYgKHR5cGVvZiB0aGlzLnl5LnBhcnNlRXJyb3IgPT09ICdmdW5jdGlvbicpCiAgICAgICAgdGhpcy5wYXJzZUVycm9yID0gdGhpcy55eS5wYXJzZUVycm9yOwoKICAgIGZ1bmN0aW9uIHBvcFN0YWNrIChuKSB7CiAgICAgICAgc3RhY2subGVuZ3RoID0gc3RhY2subGVuZ3RoIC0gMipuOwogICAgICAgIHZzdGFjay5sZW5ndGggPSB2c3RhY2subGVuZ3RoIC0gbjsKICAgICAgICBsc3RhY2subGVuZ3RoID0gbHN0YWNrLmxlbmd0aCAtIG47CiAgICB9CgogICAgZnVuY3Rpb24gbGV4KCkgewogICAgICAgIHZhciB0b2tlbjsKICAgICAgICB0b2tlbiA9IHNlbGYubGV4ZXIubGV4KCkgfHwgMTsgLy8gJGVuZCA9IDEKICAgICAgICAvLyBpZiB0b2tlbiBpc24ndCBpdHMgbnVtZXJpYyB2YWx1ZSwgY29udmVydAogICAgICAgIGlmICh0eXBlb2YgdG9rZW4gIT09ICdudW1iZXInKSB7CiAgICAgICAgICAgIHRva2VuID0gc2VsZi5zeW1ib2xzX1t0b2tlbl0gfHwgdG9rZW47CiAgICAgICAgfQogICAgICAgIHJldHVybiB0b2tlbjsKICAgIH07CgogICAgdmFyIHN5bWJvbCwgcHJlRXJyb3JTeW1ib2wsIHN0YXRlLCBhY3Rpb24sIGEsIHIsIHl5dmFsPXt9LHAsbGVuLG5ld1N0YXRlLCBleHBlY3RlZDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgLy8gcmV0cmVpdmUgc3RhdGUgbnVtYmVyIGZyb20gdG9wIG9mIHN0YWNrCiAgICAgICAgc3RhdGUgPSBzdGFja1tzdGFjay5sZW5ndGgtMV07CgogICAgICAgIC8vIHVzZSBkZWZhdWx0IGFjdGlvbnMgaWYgYXZhaWxhYmxlCiAgICAgICAgaWYgKHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdKSB7CiAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChzeW1ib2wgPT0gbnVsbCkKICAgICAgICAgICAgICAgIHN5bWJvbCA9IGxleCgpOwogICAgICAgICAgICAvLyByZWFkIGFjdGlvbiBmb3IgY3VycmVudCBzdGF0ZSBhbmQgZmlyc3QgaW5wdXQKICAgICAgICAgICAgYWN0aW9uID0gdGFibGVbc3RhdGVdICYmIHRhYmxlW3N0YXRlXVtzeW1ib2xdOwogICAgICAgIH0KCiAgICAgICAgLy8gaGFuZGxlIHBhcnNlIGVycm9yCiAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb24gPT09ICd1bmRlZmluZWQnIHx8ICFhY3Rpb24ubGVuZ3RoIHx8ICFhY3Rpb25bMF0pIHsKCiAgICAgICAgICAgIGlmICghcmVjb3ZlcmluZykgewogICAgICAgICAgICAgICAgLy8gUmVwb3J0IGVycm9yCiAgICAgICAgICAgICAgICBleHBlY3RlZCA9IFtdOwogICAgICAgICAgICAgICAgZm9yIChwIGluIHRhYmxlW3N0YXRlXSkgaWYgKHRoaXMudGVybWluYWxzX1twXSAmJiBwID4gMikgewogICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnB1c2goIiciK3RoaXMudGVybWluYWxzX1twXSsiJyIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGVyclN0ciA9ICcnOwogICAgICAgICAgICAgICAgaWYgKHRoaXMubGV4ZXIuc2hvd1Bvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgZXJyU3RyID0gJ1BhcnNlIGVycm9yIG9uIGxpbmUgJysoeXlsaW5lbm8rMSkrIjpcbiIrdGhpcy5sZXhlci5zaG93UG9zaXRpb24oKSsnXG5FeHBlY3RpbmcgJytleHBlY3RlZC5qb2luKCcsICcpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBlcnJTdHIgPSAnUGFyc2UgZXJyb3Igb24gbGluZSAnKyh5eWxpbmVubysxKSsiOiBVbmV4cGVjdGVkICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN5bWJvbCA9PSAxIC8qRU9GKi8gPyAiZW5kIG9mIGlucHV0IiA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIiciKyh0aGlzLnRlcm1pbmFsc19bc3ltYm9sXSB8fCBzeW1ib2wpKyInIikpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5wYXJzZUVycm9yKGVyclN0ciwKICAgICAgICAgICAgICAgICAgICB7dGV4dDogdGhpcy5sZXhlci5tYXRjaCwgdG9rZW46IHRoaXMudGVybWluYWxzX1tzeW1ib2xdIHx8IHN5bWJvbCwgbGluZTogdGhpcy5sZXhlci55eWxpbmVubywgbG9jOiB5eWxvYywgZXhwZWN0ZWQ6IGV4cGVjdGVkfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGp1c3QgcmVjb3ZlcmVkIGZyb20gYW5vdGhlciBlcnJvcgogICAgICAgICAgICBpZiAocmVjb3ZlcmluZyA9PSAzKSB7CiAgICAgICAgICAgICAgICBpZiAoc3ltYm9sID09IEVPRikgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJTdHIgfHwgJ1BhcnNpbmcgaGFsdGVkLicpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGRpc2NhcmQgY3VycmVudCBsb29rYWhlYWQgYW5kIGdyYWIgYW5vdGhlcgogICAgICAgICAgICAgICAgeXlsZW5nID0gdGhpcy5sZXhlci55eWxlbmc7CiAgICAgICAgICAgICAgICB5eXRleHQgPSB0aGlzLmxleGVyLnl5dGV4dDsKICAgICAgICAgICAgICAgIHl5bGluZW5vID0gdGhpcy5sZXhlci55eWxpbmVubzsKICAgICAgICAgICAgICAgIHl5bG9jID0gdGhpcy5sZXhlci55eWxsb2M7CiAgICAgICAgICAgICAgICBzeW1ib2wgPSBsZXgoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdHJ5IHRvIHJlY292ZXIgZnJvbSBlcnJvcgogICAgICAgICAgICB3aGlsZSAoMSkgewogICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGVycm9yIHJlY292ZXJ5IHJ1bGUgaW4gdGhpcyBzdGF0ZQogICAgICAgICAgICAgICAgaWYgKChURVJST1IudG9TdHJpbmcoKSkgaW4gdGFibGVbc3RhdGVdKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJTdHIgfHwgJ1BhcnNpbmcgaGFsdGVkLicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcG9wU3RhY2soMSk7CiAgICAgICAgICAgICAgICBzdGF0ZSA9IHN0YWNrW3N0YWNrLmxlbmd0aC0xXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHJlRXJyb3JTeW1ib2wgPSBzeW1ib2w7IC8vIHNhdmUgdGhlIGxvb2thaGVhZCB0b2tlbgogICAgICAgICAgICBzeW1ib2wgPSBURVJST1I7ICAgICAgICAgLy8gaW5zZXJ0IGdlbmVyaWMgZXJyb3Igc3ltYm9sIGFzIG5ldyBsb29rYWhlYWQKICAgICAgICAgICAgc3RhdGUgPSBzdGFja1tzdGFjay5sZW5ndGgtMV07CiAgICAgICAgICAgIGFjdGlvbiA9IHRhYmxlW3N0YXRlXSAmJiB0YWJsZVtzdGF0ZV1bVEVSUk9SXTsKICAgICAgICAgICAgcmVjb3ZlcmluZyA9IDM7IC8vIGFsbG93IDMgcmVhbCBzeW1ib2xzIHRvIGJlIHNoaWZ0ZWQgYmVmb3JlIHJlcG9ydGluZyBhIG5ldyBlcnJvcgogICAgICAgIH0KCiAgICAgICAgLy8gdGhpcyBzaG91bGRuJ3QgaGFwcGVuLCB1bmxlc3MgcmVzb2x2ZSBkZWZhdWx0cyBhcmUgb2ZmCiAgICAgICAgaWYgKGFjdGlvblswXSBpbnN0YW5jZW9mIEFycmF5ICYmIGFjdGlvbi5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGFyc2UgRXJyb3I6IG11bHRpcGxlIGFjdGlvbnMgcG9zc2libGUgYXQgc3RhdGU6ICcrc3RhdGUrJywgdG9rZW46ICcrc3ltYm9sKTsKICAgICAgICB9CgogICAgICAgIHN3aXRjaCAoYWN0aW9uWzBdKSB7CgogICAgICAgICAgICBjYXNlIDE6IC8vIHNoaWZ0CiAgICAgICAgICAgICAgICAvL3RoaXMuc2hpZnRDb3VudCsrOwoKICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goc3ltYm9sKTsKICAgICAgICAgICAgICAgIHZzdGFjay5wdXNoKHRoaXMubGV4ZXIueXl0ZXh0KTsKICAgICAgICAgICAgICAgIGxzdGFjay5wdXNoKHRoaXMubGV4ZXIueXlsbG9jKTsKICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYWN0aW9uWzFdKTsgLy8gcHVzaCBzdGF0ZQogICAgICAgICAgICAgICAgc3ltYm9sID0gbnVsbDsKICAgICAgICAgICAgICAgIGlmICghcHJlRXJyb3JTeW1ib2wpIHsgLy8gbm9ybWFsIGV4ZWN1dGlvbi9ubyBlcnJvcgogICAgICAgICAgICAgICAgICAgIHl5bGVuZyA9IHRoaXMubGV4ZXIueXlsZW5nOwogICAgICAgICAgICAgICAgICAgIHl5dGV4dCA9IHRoaXMubGV4ZXIueXl0ZXh0OwogICAgICAgICAgICAgICAgICAgIHl5bGluZW5vID0gdGhpcy5sZXhlci55eWxpbmVubzsKICAgICAgICAgICAgICAgICAgICB5eWxvYyA9IHRoaXMubGV4ZXIueXlsbG9jOwogICAgICAgICAgICAgICAgICAgIGlmIChyZWNvdmVyaW5nID4gMCkKICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3ZlcmluZy0tOwogICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gZXJyb3IganVzdCBvY2N1cnJlZCwgcmVzdW1lIG9sZCBsb29rYWhlYWQgZi8gYmVmb3JlIGVycm9yCiAgICAgICAgICAgICAgICAgICAgc3ltYm9sID0gcHJlRXJyb3JTeW1ib2w7CiAgICAgICAgICAgICAgICAgICAgcHJlRXJyb3JTeW1ib2wgPSBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIDI6IC8vIHJlZHVjZQogICAgICAgICAgICAgICAgLy90aGlzLnJlZHVjdGlvbkNvdW50Kys7CgogICAgICAgICAgICAgICAgbGVuID0gdGhpcy5wcm9kdWN0aW9uc19bYWN0aW9uWzFdXVsxXTsKCiAgICAgICAgICAgICAgICAvLyBwZXJmb3JtIHNlbWFudGljIGFjdGlvbgogICAgICAgICAgICAgICAgeXl2YWwuJCA9IHZzdGFja1t2c3RhY2subGVuZ3RoLWxlbl07IC8vIGRlZmF1bHQgdG8gJCQgPSAkMQogICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBsb2NhdGlvbiwgdXNlcyBmaXJzdCB0b2tlbiBmb3IgZmlyc3RzLCBsYXN0IGZvciBsYXN0cwogICAgICAgICAgICAgICAgeXl2YWwuXyQgPSB7CiAgICAgICAgICAgICAgICAgICAgZmlyc3RfbGluZTogbHN0YWNrW2xzdGFjay5sZW5ndGgtKGxlbnx8MSldLmZpcnN0X2xpbmUsCiAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiBsc3RhY2tbbHN0YWNrLmxlbmd0aC0xXS5sYXN0X2xpbmUsCiAgICAgICAgICAgICAgICAgICAgZmlyc3RfY29sdW1uOiBsc3RhY2tbbHN0YWNrLmxlbmd0aC0obGVufHwxKV0uZmlyc3RfY29sdW1uLAogICAgICAgICAgICAgICAgICAgIGxhc3RfY29sdW1uOiBsc3RhY2tbbHN0YWNrLmxlbmd0aC0xXS5sYXN0X2NvbHVtbgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHIgPSB0aGlzLnBlcmZvcm1BY3Rpb24uY2FsbCh5eXZhbCwgeXl0ZXh0LCB5eWxlbmcsIHl5bGluZW5vLCB0aGlzLnl5LCBhY3Rpb25bMV0sIHZzdGFjaywgbHN0YWNrKTsKCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHIgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gcG9wIG9mZiBzdGFjawogICAgICAgICAgICAgICAgaWYgKGxlbikgewogICAgICAgICAgICAgICAgICAgIHN0YWNrID0gc3RhY2suc2xpY2UoMCwtMSpsZW4qMik7CiAgICAgICAgICAgICAgICAgICAgdnN0YWNrID0gdnN0YWNrLnNsaWNlKDAsIC0xKmxlbik7CiAgICAgICAgICAgICAgICAgICAgbHN0YWNrID0gbHN0YWNrLnNsaWNlKDAsIC0xKmxlbik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc3RhY2sucHVzaCh0aGlzLnByb2R1Y3Rpb25zX1thY3Rpb25bMV1dWzBdKTsgICAgLy8gcHVzaCBub250ZXJtaW5hbCAocmVkdWNlKQogICAgICAgICAgICAgICAgdnN0YWNrLnB1c2goeXl2YWwuJCk7CiAgICAgICAgICAgICAgICBsc3RhY2sucHVzaCh5eXZhbC5fJCk7CiAgICAgICAgICAgICAgICAvLyBnb3RvIG5ldyBzdGF0ZSA9IHRhYmxlW1NUQVRFXVtOT05URVJNSU5BTF0KICAgICAgICAgICAgICAgIG5ld1N0YXRlID0gdGFibGVbc3RhY2tbc3RhY2subGVuZ3RoLTJdXVtzdGFja1tzdGFjay5sZW5ndGgtMV1dOwogICAgICAgICAgICAgICAgc3RhY2sucHVzaChuZXdTdGF0ZSk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgMzogLy8gYWNjZXB0CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgfQoKICAgIHJldHVybiB0cnVlOwp9fTsKCm1vZHVsZS5leHBvcnRzID0gcGFyc2VyOwp9KTsvKioKICogQ29weXJpZ2h0IChjKSAyMDExIEplcmVteSBBc2hrZW5hcwogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgogKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgogKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CiAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAogKiBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAogKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKICogY29uZGl0aW9uczoKICogCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCiAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgogKiAKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCiAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUwogKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAogKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAogKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCiAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogKi8KCmRlZmluZSgnYWNlL21vZGUvY29mZmVlL25vZGVzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbW9kZS9jb2ZmZWUvc2NvcGUnLCAnYWNlL21vZGUvY29mZmVlL2hlbHBlcnMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiAgdmFyIEFjY2VzcywgQXJyLCBBc3NpZ24sIEJhc2UsIEJsb2NrLCBDYWxsLCBDbGFzcywgQ2xvc3VyZSwgQ29kZSwgQ29tbWVudCwgRXhpc3RlbmNlLCBFeHRlbmRzLCBGb3IsIElERU5USUZJRVIsIElTX1NUUklORywgSWYsIEluLCBJbmRleCwgTEVWRUxfQUNDRVNTLCBMRVZFTF9DT05ELCBMRVZFTF9MSVNULCBMRVZFTF9PUCwgTEVWRUxfUEFSRU4sIExFVkVMX1RPUCwgTGl0ZXJhbCwgTUVUSE9EX0RFRiwgTkVHQVRFLCBOTywgT2JqLCBPcCwgUGFyYW0sIFBhcmVucywgUHVzaCwgUmFuZ2UsIFJldHVybiwgU0lNUExFTlVNLCBTY29wZSwgU2xpY2UsIFNwbGF0LCBTd2l0Y2gsIFRBQiwgVEhJUywgVGhyb3csIFRyeSwgVVRJTElUSUVTLCBWYWx1ZSwgV2hpbGUsIFlFUywgY29tcGFjdCwgZGVsLCBlbmRzLCBleHRlbmQsIGZsYXR0ZW4sIGxhc3QsIG1lcmdlLCBtdWx0aWRlbnQsIHN0YXJ0cywgdW5mb2xkU29haywgdXRpbGl0eSwgX3JlZjsKICB2YXIgX19oYXNQcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSwgX19leHRlbmRzID0gZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkgewogICAgZm9yICh2YXIga2V5IGluIHBhcmVudCkgeyBpZiAoX19oYXNQcm9wLmNhbGwocGFyZW50LCBrZXkpKSBjaGlsZFtrZXldID0gcGFyZW50W2tleV07IH0KICAgIGZ1bmN0aW9uIGN0b3IoKSB7IHRoaXMuY29uc3RydWN0b3IgPSBjaGlsZDsgfQogICAgY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlOwogICAgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3I7CiAgICBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlOwogICAgcmV0dXJuIGNoaWxkOwogIH0sIF9fYmluZCA9IGZ1bmN0aW9uKGZuLCBtZSl7IHJldHVybiBmdW5jdGlvbigpeyByZXR1cm4gZm4uYXBwbHkobWUsIGFyZ3VtZW50cyk7IH07IH0sIF9faW5kZXhPZiA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mIHx8IGZ1bmN0aW9uKGl0ZW0pIHsKICAgIGZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgaWYgKHRoaXNbaV0gPT09IGl0ZW0pIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH07CiAgU2NvcGUgPSByZXF1aXJlKCcuL3Njb3BlJykuU2NvcGU7CiAgX3JlZiA9IHJlcXVpcmUoJy4vaGVscGVycycpLCBjb21wYWN0ID0gX3JlZi5jb21wYWN0LCBmbGF0dGVuID0gX3JlZi5mbGF0dGVuLCBleHRlbmQgPSBfcmVmLmV4dGVuZCwgbWVyZ2UgPSBfcmVmLm1lcmdlLCBkZWwgPSBfcmVmLmRlbCwgc3RhcnRzID0gX3JlZi5zdGFydHMsIGVuZHMgPSBfcmVmLmVuZHMsIGxhc3QgPSBfcmVmLmxhc3Q7CiAgZXhwb3J0cy5leHRlbmQgPSBleHRlbmQ7CiAgWUVTID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9OwogIE5PID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKICBUSElTID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpczsKICB9OwogIE5FR0FURSA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5uZWdhdGVkID0gIXRoaXMubmVnYXRlZDsKICAgIHJldHVybiB0aGlzOwogIH07CiAgZXhwb3J0cy5CYXNlID0gQmFzZSA9IChmdW5jdGlvbigpIHsKICAgIGZ1bmN0aW9uIEJhc2UoKSB7fQogICAgQmFzZS5wcm90b3R5cGUuY29tcGlsZSA9IGZ1bmN0aW9uKG8sIGx2bCkgewogICAgICB2YXIgbm9kZTsKICAgICAgbyA9IGV4dGVuZCh7fSwgbyk7CiAgICAgIGlmIChsdmwpIHsKICAgICAgICBvLmxldmVsID0gbHZsOwogICAgICB9CiAgICAgIG5vZGUgPSB0aGlzLnVuZm9sZFNvYWsobykgfHwgdGhpczsKICAgICAgbm9kZS50YWIgPSBvLmluZGVudDsKICAgICAgaWYgKG8ubGV2ZWwgPT09IExFVkVMX1RPUCB8fCAhbm9kZS5pc1N0YXRlbWVudChvKSkgewogICAgICAgIHJldHVybiBub2RlLmNvbXBpbGVOb2RlKG8pOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBub2RlLmNvbXBpbGVDbG9zdXJlKG8pOwogICAgICB9CiAgICB9OwogICAgQmFzZS5wcm90b3R5cGUuY29tcGlsZUNsb3N1cmUgPSBmdW5jdGlvbihvKSB7CiAgICAgIGlmICh0aGlzLmp1bXBzKCkgfHwgdGhpcyBpbnN0YW5jZW9mIFRocm93KSB7CiAgICAgICAgdGhyb3cgU3ludGF4RXJyb3IoJ2Nhbm5vdCB1c2UgYSBwdXJlIHN0YXRlbWVudCBpbiBhbiBleHByZXNzaW9uLicpOwogICAgICB9CiAgICAgIG8uc2hhcmVkU2NvcGUgPSB0cnVlOwogICAgICByZXR1cm4gQ2xvc3VyZS53cmFwKHRoaXMpLmNvbXBpbGVOb2RlKG8pOwogICAgfTsKICAgIEJhc2UucHJvdG90eXBlLmNhY2hlID0gZnVuY3Rpb24obywgbGV2ZWwsIHJldXNlZCkgewogICAgICB2YXIgcmVmLCBzdWI7CiAgICAgIGlmICghdGhpcy5pc0NvbXBsZXgoKSkgewogICAgICAgIHJlZiA9IGxldmVsID8gdGhpcy5jb21waWxlKG8sIGxldmVsKSA6IHRoaXM7CiAgICAgICAgcmV0dXJuIFtyZWYsIHJlZl07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVmID0gbmV3IExpdGVyYWwocmV1c2VkIHx8IG8uc2NvcGUuZnJlZVZhcmlhYmxlKCdyZWYnKSk7CiAgICAgICAgc3ViID0gbmV3IEFzc2lnbihyZWYsIHRoaXMpOwogICAgICAgIGlmIChsZXZlbCkgewogICAgICAgICAgcmV0dXJuIFtzdWIuY29tcGlsZShvLCBsZXZlbCksIHJlZi52YWx1ZV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBbc3ViLCByZWZdOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIEJhc2UucHJvdG90eXBlLmNvbXBpbGVMb29wUmVmZXJlbmNlID0gZnVuY3Rpb24obywgbmFtZSkgewogICAgICB2YXIgc3JjLCB0bXA7CiAgICAgIHNyYyA9IHRtcCA9IHRoaXMuY29tcGlsZShvLCBMRVZFTF9MSVNUKTsKICAgICAgaWYgKCEoKC1JbmZpbml0eSA8ICtzcmMgJiYgK3NyYyA8IEluZmluaXR5KSB8fCBJREVOVElGSUVSLnRlc3Qoc3JjKSAmJiBvLnNjb3BlLmNoZWNrKHNyYywgdHJ1ZSkpKSB7CiAgICAgICAgc3JjID0gIiIgKyAodG1wID0gby5zY29wZS5mcmVlVmFyaWFibGUobmFtZSkpICsgIiA9ICIgKyBzcmM7CiAgICAgIH0KICAgICAgcmV0dXJuIFtzcmMsIHRtcF07CiAgICB9OwogICAgQmFzZS5wcm90b3R5cGUubWFrZVJldHVybiA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gbmV3IFJldHVybih0aGlzKTsKICAgIH07CiAgICBCYXNlLnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uKHByZWQpIHsKICAgICAgdmFyIGNvbnRhaW5zOwogICAgICBjb250YWlucyA9IGZhbHNlOwogICAgICB0aGlzLnRyYXZlcnNlQ2hpbGRyZW4oZmFsc2UsIGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICBpZiAocHJlZChub2RlKSkgewogICAgICAgICAgY29udGFpbnMgPSB0cnVlOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJldHVybiBjb250YWluczsKICAgIH07CiAgICBCYXNlLnByb3RvdHlwZS5jb250YWluc1R5cGUgPSBmdW5jdGlvbih0eXBlKSB7CiAgICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgdHlwZSB8fCB0aGlzLmNvbnRhaW5zKGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIHR5cGU7CiAgICAgIH0pOwogICAgfTsKICAgIEJhc2UucHJvdG90eXBlLmxhc3ROb25Db21tZW50ID0gZnVuY3Rpb24obGlzdCkgewogICAgICB2YXIgaTsKICAgICAgaSA9IGxpc3QubGVuZ3RoOwogICAgICB3aGlsZSAoaS0tKSB7CiAgICAgICAgaWYgKCEobGlzdFtpXSBpbnN0YW5jZW9mIENvbW1lbnQpKSB7CiAgICAgICAgICByZXR1cm4gbGlzdFtpXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwogICAgQmFzZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbihpZHQsIG5hbWUpIHsKICAgICAgdmFyIHRyZWU7CiAgICAgIGlmIChpZHQgPT0gbnVsbCkgewogICAgICAgIGlkdCA9ICcnOwogICAgICB9CiAgICAgIGlmIChuYW1lID09IG51bGwpIHsKICAgICAgICBuYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lOwogICAgICB9CiAgICAgIHRyZWUgPSAnXG4nICsgaWR0ICsgbmFtZTsKICAgICAgaWYgKHRoaXMuc29haykgewogICAgICAgIHRyZWUgKz0gJz8nOwogICAgICB9CiAgICAgIHRoaXMuZWFjaENoaWxkKGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICByZXR1cm4gdHJlZSArPSBub2RlLnRvU3RyaW5nKGlkdCArIFRBQik7CiAgICAgIH0pOwogICAgICByZXR1cm4gdHJlZTsKICAgIH07CiAgICBCYXNlLnByb3RvdHlwZS5lYWNoQ2hpbGQgPSBmdW5jdGlvbihmdW5jKSB7CiAgICAgIHZhciBhdHRyLCBjaGlsZCwgX2ksIF9qLCBfbGVuLCBfbGVuMiwgX3JlZjIsIF9yZWYzOwogICAgICBpZiAoIXRoaXMuY2hpbGRyZW4pIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICBfcmVmMiA9IHRoaXMuY2hpbGRyZW47CiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjIubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsKICAgICAgICBhdHRyID0gX3JlZjJbX2ldOwogICAgICAgIGlmICh0aGlzW2F0dHJdKSB7CiAgICAgICAgICBfcmVmMyA9IGZsYXR0ZW4oW3RoaXNbYXR0cl1dKTsKICAgICAgICAgIGZvciAoX2ogPSAwLCBfbGVuMiA9IF9yZWYzLmxlbmd0aDsgX2ogPCBfbGVuMjsgX2orKykgewogICAgICAgICAgICBjaGlsZCA9IF9yZWYzW19qXTsKICAgICAgICAgICAgaWYgKGZ1bmMoY2hpbGQpID09PSBmYWxzZSkgewogICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIEJhc2UucHJvdG90eXBlLnRyYXZlcnNlQ2hpbGRyZW4gPSBmdW5jdGlvbihjcm9zc1Njb3BlLCBmdW5jKSB7CiAgICAgIHJldHVybiB0aGlzLmVhY2hDaGlsZChmdW5jdGlvbihjaGlsZCkgewogICAgICAgIGlmIChmdW5jKGNoaWxkKSA9PT0gZmFsc2UpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNoaWxkLnRyYXZlcnNlQ2hpbGRyZW4oY3Jvc3NTY29wZSwgZnVuYyk7CiAgICAgIH0pOwogICAgfTsKICAgIEJhc2UucHJvdG90eXBlLmludmVydCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gbmV3IE9wKCchJywgdGhpcyk7CiAgICB9OwogICAgQmFzZS5wcm90b3R5cGUudW53cmFwQWxsID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBub2RlOwogICAgICBub2RlID0gdGhpczsKICAgICAgd2hpbGUgKG5vZGUgIT09IChub2RlID0gbm9kZS51bndyYXAoKSkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICByZXR1cm4gbm9kZTsKICAgIH07CiAgICBCYXNlLnByb3RvdHlwZS5jaGlsZHJlbiA9IFtdOwogICAgQmFzZS5wcm90b3R5cGUuaXNTdGF0ZW1lbnQgPSBOTzsKICAgIEJhc2UucHJvdG90eXBlLmp1bXBzID0gTk87CiAgICBCYXNlLnByb3RvdHlwZS5pc0NvbXBsZXggPSBZRVM7CiAgICBCYXNlLnByb3RvdHlwZS5pc0NoYWluYWJsZSA9IE5POwogICAgQmFzZS5wcm90b3R5cGUuaXNBc3NpZ25hYmxlID0gTk87CiAgICBCYXNlLnByb3RvdHlwZS51bndyYXAgPSBUSElTOwogICAgQmFzZS5wcm90b3R5cGUudW5mb2xkU29hayA9IE5POwogICAgQmFzZS5wcm90b3R5cGUuYXNzaWducyA9IE5POwogICAgcmV0dXJuIEJhc2U7CiAgfSkoKTsKICBleHBvcnRzLkJsb2NrID0gQmxvY2sgPSAoZnVuY3Rpb24oKSB7CiAgICBfX2V4dGVuZHMoQmxvY2ssIEJhc2UpOwogICAgZnVuY3Rpb24gQmxvY2sobm9kZXMpIHsKICAgICAgdGhpcy5leHByZXNzaW9ucyA9IGNvbXBhY3QoZmxhdHRlbihub2RlcyB8fCBbXSkpOwogICAgfQogICAgQmxvY2sucHJvdG90eXBlLmNoaWxkcmVuID0gWydleHByZXNzaW9ucyddOwogICAgQmxvY2sucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbihub2RlKSB7CiAgICAgIHRoaXMuZXhwcmVzc2lvbnMucHVzaChub2RlKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwogICAgQmxvY2sucHJvdG90eXBlLnBvcCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9ucy5wb3AoKTsKICAgIH07CiAgICBCbG9jay5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgdGhpcy5leHByZXNzaW9ucy51bnNoaWZ0KG5vZGUpOwogICAgICByZXR1cm4gdGhpczsKICAgIH07CiAgICBCbG9jay5wcm90b3R5cGUudW53cmFwID0gZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25zLmxlbmd0aCA9PT0gMSkgewogICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb25zWzBdOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICB9OwogICAgQmxvY2sucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuICF0aGlzLmV4cHJlc3Npb25zLmxlbmd0aDsKICAgIH07CiAgICBCbG9jay5wcm90b3R5cGUuaXNTdGF0ZW1lbnQgPSBmdW5jdGlvbihvKSB7CiAgICAgIHZhciBleHAsIF9pLCBfbGVuLCBfcmVmMjsKICAgICAgX3JlZjIgPSB0aGlzLmV4cHJlc3Npb25zOwogICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYyLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7CiAgICAgICAgZXhwID0gX3JlZjJbX2ldOwogICAgICAgIGlmIChleHAuaXNTdGF0ZW1lbnQobykpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwogICAgQmxvY2sucHJvdG90eXBlLmp1bXBzID0gZnVuY3Rpb24obykgewogICAgICB2YXIgZXhwLCBfaSwgX2xlbiwgX3JlZjI7CiAgICAgIF9yZWYyID0gdGhpcy5leHByZXNzaW9uczsKICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmMi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgewogICAgICAgIGV4cCA9IF9yZWYyW19pXTsKICAgICAgICBpZiAoZXhwLmp1bXBzKG8pKSB7CiAgICAgICAgICByZXR1cm4gZXhwOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIEJsb2NrLnByb3RvdHlwZS5tYWtlUmV0dXJuID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBleHByLCBsZW47CiAgICAgIGxlbiA9IHRoaXMuZXhwcmVzc2lvbnMubGVuZ3RoOwogICAgICB3aGlsZSAobGVuLS0pIHsKICAgICAgICBleHByID0gdGhpcy5leHByZXNzaW9uc1tsZW5dOwogICAgICAgIGlmICghKGV4cHIgaW5zdGFuY2VvZiBDb21tZW50KSkgewogICAgICAgICAgdGhpcy5leHByZXNzaW9uc1tsZW5dID0gZXhwci5tYWtlUmV0dXJuKCk7CiAgICAgICAgICBpZiAoZXhwciBpbnN0YW5jZW9mIFJldHVybiAmJiAhZXhwci5leHByZXNzaW9uKSB7CiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbnMuc3BsaWNlKGxlbiwgMSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwogICAgQmxvY2sucHJvdG90eXBlLmNvbXBpbGUgPSBmdW5jdGlvbihvLCBsZXZlbCkgewogICAgICBpZiAobyA9PSBudWxsKSB7CiAgICAgICAgbyA9IHt9OwogICAgICB9CiAgICAgIGlmIChvLnNjb3BlKSB7CiAgICAgICAgcmV0dXJuIEJsb2NrLl9fc3VwZXJfXy5jb21waWxlLmNhbGwodGhpcywgbywgbGV2ZWwpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVSb290KG8pOwogICAgICB9CiAgICB9OwogICAgQmxvY2sucHJvdG90eXBlLmNvbXBpbGVOb2RlID0gZnVuY3Rpb24obykgewogICAgICB2YXIgY29kZSwgY29kZXMsIG5vZGUsIHRvcCwgX2ksIF9sZW4sIF9yZWYyOwogICAgICB0aGlzLnRhYiA9IG8uaW5kZW50OwogICAgICB0b3AgPSBvLmxldmVsID09PSBMRVZFTF9UT1A7CiAgICAgIGNvZGVzID0gW107CiAgICAgIF9yZWYyID0gdGhpcy5leHByZXNzaW9uczsKICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmMi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgewogICAgICAgIG5vZGUgPSBfcmVmMltfaV07CiAgICAgICAgbm9kZSA9IG5vZGUudW53cmFwQWxsKCk7CiAgICAgICAgbm9kZSA9IG5vZGUudW5mb2xkU29hayhvKSB8fCBub2RlOwogICAgICAgIGlmICh0b3ApIHsKICAgICAgICAgIG5vZGUuZnJvbnQgPSB0cnVlOwogICAgICAgICAgY29kZSA9IG5vZGUuY29tcGlsZShvKTsKICAgICAgICAgIGNvZGVzLnB1c2gobm9kZS5pc1N0YXRlbWVudChvKSA/IGNvZGUgOiB0aGlzLnRhYiArIGNvZGUgKyAnOycpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb2Rlcy5wdXNoKG5vZGUuY29tcGlsZShvLCBMRVZFTF9MSVNUKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh0b3ApIHsKICAgICAgICByZXR1cm4gY29kZXMuam9pbignXG4nKTsKICAgICAgfQogICAgICBjb2RlID0gY29kZXMuam9pbignLCAnKSB8fCAndm9pZCAwJzsKICAgICAgaWYgKGNvZGVzLmxlbmd0aCA+IDEgJiYgby5sZXZlbCA+PSBMRVZFTF9MSVNUKSB7CiAgICAgICAgcmV0dXJuICIoIiArIGNvZGUgKyAiKSI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGNvZGU7CiAgICAgIH0KICAgIH07CiAgICBCbG9jay5wcm90b3R5cGUuY29tcGlsZVJvb3QgPSBmdW5jdGlvbihvKSB7CiAgICAgIHZhciBjb2RlOwogICAgICBvLmluZGVudCA9IHRoaXMudGFiID0gby5iYXJlID8gJycgOiBUQUI7CiAgICAgIG8uc2NvcGUgPSBuZXcgU2NvcGUobnVsbCwgdGhpcywgbnVsbCk7CiAgICAgIG8ubGV2ZWwgPSBMRVZFTF9UT1A7CiAgICAgIGNvZGUgPSB0aGlzLmNvbXBpbGVXaXRoRGVjbGFyYXRpb25zKG8pOwogICAgICBpZiAoby5iYXJlKSB7CiAgICAgICAgcmV0dXJuIGNvZGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICIoZnVuY3Rpb24oKSB7XG4iICsgY29kZSArICJcbn0pLmNhbGwodGhpcyk7XG4iOwogICAgICB9CiAgICB9OwogICAgQmxvY2sucHJvdG90eXBlLmNvbXBpbGVXaXRoRGVjbGFyYXRpb25zID0gZnVuY3Rpb24obykgewogICAgICB2YXIgYXNzaWducywgY29kZSwgZGVjbGFycywgZXhwLCBpLCBwb3N0LCByZXN0LCBzY29wZSwgX2xlbiwgX3JlZjI7CiAgICAgIGNvZGUgPSBwb3N0ID0gJyc7CiAgICAgIF9yZWYyID0gdGhpcy5leHByZXNzaW9uczsKICAgICAgZm9yIChpID0gMCwgX2xlbiA9IF9yZWYyLmxlbmd0aDsgaSA8IF9sZW47IGkrKykgewogICAgICAgIGV4cCA9IF9yZWYyW2ldOwogICAgICAgIGV4cCA9IGV4cC51bndyYXAoKTsKICAgICAgICBpZiAoIShleHAgaW5zdGFuY2VvZiBDb21tZW50IHx8IGV4cCBpbnN0YW5jZW9mIExpdGVyYWwpKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgbyA9IG1lcmdlKG8sIHsKICAgICAgICBsZXZlbDogTEVWRUxfVE9QCiAgICAgIH0pOwogICAgICBpZiAoaSkgewogICAgICAgIHJlc3QgPSB0aGlzLmV4cHJlc3Npb25zLnNwbGljZShpLCB0aGlzLmV4cHJlc3Npb25zLmxlbmd0aCk7CiAgICAgICAgY29kZSA9IHRoaXMuY29tcGlsZU5vZGUobyk7CiAgICAgICAgdGhpcy5leHByZXNzaW9ucyA9IHJlc3Q7CiAgICAgIH0KICAgICAgcG9zdCA9IHRoaXMuY29tcGlsZU5vZGUobyk7CiAgICAgIHNjb3BlID0gby5zY29wZTsKICAgICAgaWYgKHNjb3BlLmV4cHJlc3Npb25zID09PSB0aGlzKSB7CiAgICAgICAgZGVjbGFycyA9IG8uc2NvcGUuaGFzRGVjbGFyYXRpb25zKCk7CiAgICAgICAgYXNzaWducyA9IHNjb3BlLmhhc0Fzc2lnbm1lbnRzOwogICAgICAgIGlmICgoZGVjbGFycyB8fCBhc3NpZ25zKSAmJiBpKSB7CiAgICAgICAgICBjb2RlICs9ICdcbic7CiAgICAgICAgfQogICAgICAgIGlmIChkZWNsYXJzKSB7CiAgICAgICAgICBjb2RlICs9ICIiICsgdGhpcy50YWIgKyAidmFyICIgKyAoc2NvcGUuZGVjbGFyZWRWYXJpYWJsZXMoKS5qb2luKCcsICcpKSArICI7XG4iOwogICAgICAgIH0KICAgICAgICBpZiAoYXNzaWducykgewogICAgICAgICAgY29kZSArPSAiIiArIHRoaXMudGFiICsgInZhciAiICsgKG11bHRpZGVudChzY29wZS5hc3NpZ25lZFZhcmlhYmxlcygpLmpvaW4oJywgJyksIHRoaXMudGFiKSkgKyAiO1xuIjsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGNvZGUgKyBwb3N0OwogICAgfTsKICAgIEJsb2NrLndyYXAgPSBmdW5jdGlvbihub2RlcykgewogICAgICBpZiAobm9kZXMubGVuZ3RoID09PSAxICYmIG5vZGVzWzBdIGluc3RhbmNlb2YgQmxvY2spIHsKICAgICAgICByZXR1cm4gbm9kZXNbMF07CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBCbG9jayhub2Rlcyk7CiAgICB9OwogICAgcmV0dXJuIEJsb2NrOwogIH0pKCk7CiAgZXhwb3J0cy5MaXRlcmFsID0gTGl0ZXJhbCA9IChmdW5jdGlvbigpIHsKICAgIF9fZXh0ZW5kcyhMaXRlcmFsLCBCYXNlKTsKICAgIGZ1bmN0aW9uIExpdGVyYWwodmFsdWUpIHsKICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwogICAgfQogICAgTGl0ZXJhbC5wcm90b3R5cGUubWFrZVJldHVybiA9IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5pc1N0YXRlbWVudCgpKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIG5ldyBSZXR1cm4odGhpcyk7CiAgICAgIH0KICAgIH07CiAgICBMaXRlcmFsLnByb3RvdHlwZS5pc0Fzc2lnbmFibGUgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIElERU5USUZJRVIudGVzdCh0aGlzLnZhbHVlKTsKICAgIH07CiAgICBMaXRlcmFsLnByb3RvdHlwZS5pc1N0YXRlbWVudCA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgX3JlZjI7CiAgICAgIHJldHVybiAoX3JlZjIgPSB0aGlzLnZhbHVlKSA9PT0gJ2JyZWFrJyB8fCBfcmVmMiA9PT0gJ2NvbnRpbnVlJyB8fCBfcmVmMiA9PT0gJ2RlYnVnZ2VyJzsKICAgIH07CiAgICBMaXRlcmFsLnByb3RvdHlwZS5pc0NvbXBsZXggPSBOTzsKICAgIExpdGVyYWwucHJvdG90eXBlLmFzc2lnbnMgPSBmdW5jdGlvbihuYW1lKSB7CiAgICAgIHJldHVybiBuYW1lID09PSB0aGlzLnZhbHVlOwogICAgfTsKICAgIExpdGVyYWwucHJvdG90eXBlLmp1bXBzID0gZnVuY3Rpb24obykgewogICAgICBpZiAoIXRoaXMuaXNTdGF0ZW1lbnQoKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAoIShvICYmIChvLmxvb3AgfHwgby5ibG9jayAmJiAodGhpcy52YWx1ZSAhPT0gJ2NvbnRpbnVlJykpKSkgewogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfTsKICAgIExpdGVyYWwucHJvdG90eXBlLmNvbXBpbGVOb2RlID0gZnVuY3Rpb24obykgewogICAgICB2YXIgY29kZTsKICAgICAgY29kZSA9IHRoaXMuaXNVbmRlZmluZWQgPyBvLmxldmVsID49IExFVkVMX0FDQ0VTUyA/ICcodm9pZCAwKScgOiAndm9pZCAwJyA6IHRoaXMudmFsdWUucmVzZXJ2ZWQgPyAiXCIiICsgdGhpcy52YWx1ZSArICJcIiIgOiB0aGlzLnZhbHVlOwogICAgICBpZiAodGhpcy5pc1N0YXRlbWVudCgpKSB7CiAgICAgICAgcmV0dXJuICIiICsgdGhpcy50YWIgKyBjb2RlICsgIjsiOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBjb2RlOwogICAgICB9CiAgICB9OwogICAgTGl0ZXJhbC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuICcgIicgKyB0aGlzLnZhbHVlICsgJyInOwogICAgfTsKICAgIHJldHVybiBMaXRlcmFsOwogIH0pKCk7CiAgZXhwb3J0cy5SZXR1cm4gPSBSZXR1cm4gPSAoZnVuY3Rpb24oKSB7CiAgICBfX2V4dGVuZHMoUmV0dXJuLCBCYXNlKTsKICAgIGZ1bmN0aW9uIFJldHVybihleHByKSB7CiAgICAgIGlmIChleHByICYmICFleHByLnVud3JhcCgpLmlzVW5kZWZpbmVkKSB7CiAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcjsKICAgICAgfQogICAgfQogICAgUmV0dXJuLnByb3RvdHlwZS5jaGlsZHJlbiA9IFsnZXhwcmVzc2lvbiddOwogICAgUmV0dXJuLnByb3RvdHlwZS5pc1N0YXRlbWVudCA9IFlFUzsKICAgIFJldHVybi5wcm90b3R5cGUubWFrZVJldHVybiA9IFRISVM7CiAgICBSZXR1cm4ucHJvdG90eXBlLmp1bXBzID0gVEhJUzsKICAgIFJldHVybi5wcm90b3R5cGUuY29tcGlsZSA9IGZ1bmN0aW9uKG8sIGxldmVsKSB7CiAgICAgIHZhciBleHByLCBfcmVmMjsKICAgICAgZXhwciA9IChfcmVmMiA9IHRoaXMuZXhwcmVzc2lvbikgIT0gbnVsbCA/IF9yZWYyLm1ha2VSZXR1cm4oKSA6IHZvaWQgMDsKICAgICAgaWYgKGV4cHIgJiYgIShleHByIGluc3RhbmNlb2YgUmV0dXJuKSkgewogICAgICAgIHJldHVybiBleHByLmNvbXBpbGUobywgbGV2ZWwpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBSZXR1cm4uX19zdXBlcl9fLmNvbXBpbGUuY2FsbCh0aGlzLCBvLCBsZXZlbCk7CiAgICAgIH0KICAgIH07CiAgICBSZXR1cm4ucHJvdG90eXBlLmNvbXBpbGVOb2RlID0gZnVuY3Rpb24obykgewogICAgICByZXR1cm4gdGhpcy50YWIgKyAoInJldHVybiIgKyAodGhpcy5leHByZXNzaW9uID8gJyAnICsgdGhpcy5leHByZXNzaW9uLmNvbXBpbGUobywgTEVWRUxfUEFSRU4pIDogJycpICsgIjsiKTsKICAgIH07CiAgICByZXR1cm4gUmV0dXJuOwogIH0pKCk7CiAgZXhwb3J0cy5WYWx1ZSA9IFZhbHVlID0gKGZ1bmN0aW9uKCkgewogICAgX19leHRlbmRzKFZhbHVlLCBCYXNlKTsKICAgIGZ1bmN0aW9uIFZhbHVlKGJhc2UsIHByb3BzLCB0YWcpIHsKICAgICAgaWYgKCFwcm9wcyAmJiBiYXNlIGluc3RhbmNlb2YgVmFsdWUpIHsKICAgICAgICByZXR1cm4gYmFzZTsKICAgICAgfQogICAgICB0aGlzLmJhc2UgPSBiYXNlOwogICAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wcyB8fCBbXTsKICAgICAgaWYgKHRhZykgewogICAgICAgIHRoaXNbdGFnXSA9IHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBWYWx1ZS5wcm90b3R5cGUuY2hpbGRyZW4gPSBbJ2Jhc2UnLCAncHJvcGVydGllcyddOwogICAgVmFsdWUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbihwcm9wKSB7CiAgICAgIHRoaXMucHJvcGVydGllcy5wdXNoKHByb3ApOwogICAgICByZXR1cm4gdGhpczsKICAgIH07CiAgICBWYWx1ZS5wcm90b3R5cGUuaGFzUHJvcGVydGllcyA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gISF0aGlzLnByb3BlcnRpZXMubGVuZ3RoOwogICAgfTsKICAgIFZhbHVlLnByb3RvdHlwZS5pc0FycmF5ID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiAhdGhpcy5wcm9wZXJ0aWVzLmxlbmd0aCAmJiB0aGlzLmJhc2UgaW5zdGFuY2VvZiBBcnI7CiAgICB9OwogICAgVmFsdWUucHJvdG90eXBlLmlzQ29tcGxleCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5oYXNQcm9wZXJ0aWVzKCkgfHwgdGhpcy5iYXNlLmlzQ29tcGxleCgpOwogICAgfTsKICAgIFZhbHVlLnByb3RvdHlwZS5pc0Fzc2lnbmFibGUgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuaGFzUHJvcGVydGllcygpIHx8IHRoaXMuYmFzZS5pc0Fzc2lnbmFibGUoKTsKICAgIH07CiAgICBWYWx1ZS5wcm90b3R5cGUuaXNTaW1wbGVOdW1iZXIgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuYmFzZSBpbnN0YW5jZW9mIExpdGVyYWwgJiYgU0lNUExFTlVNLnRlc3QodGhpcy5iYXNlLnZhbHVlKTsKICAgIH07CiAgICBWYWx1ZS5wcm90b3R5cGUuaXNBdG9taWMgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIG5vZGUsIF9pLCBfbGVuLCBfcmVmMjsKICAgICAgX3JlZjIgPSB0aGlzLnByb3BlcnRpZXMuY29uY2F0KHRoaXMuYmFzZSk7CiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjIubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsKICAgICAgICBub2RlID0gX3JlZjJbX2ldOwogICAgICAgIGlmIChub2RlLnNvYWsgfHwgbm9kZSBpbnN0YW5jZW9mIENhbGwpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9OwogICAgVmFsdWUucHJvdG90eXBlLmlzU3RhdGVtZW50ID0gZnVuY3Rpb24obykgewogICAgICByZXR1cm4gIXRoaXMucHJvcGVydGllcy5sZW5ndGggJiYgdGhpcy5iYXNlLmlzU3RhdGVtZW50KG8pOwogICAgfTsKICAgIFZhbHVlLnByb3RvdHlwZS5hc3NpZ25zID0gZnVuY3Rpb24obmFtZSkgewogICAgICByZXR1cm4gIXRoaXMucHJvcGVydGllcy5sZW5ndGggJiYgdGhpcy5iYXNlLmFzc2lnbnMobmFtZSk7CiAgICB9OwogICAgVmFsdWUucHJvdG90eXBlLmp1bXBzID0gZnVuY3Rpb24obykgewogICAgICByZXR1cm4gIXRoaXMucHJvcGVydGllcy5sZW5ndGggJiYgdGhpcy5iYXNlLmp1bXBzKG8pOwogICAgfTsKICAgIFZhbHVlLnByb3RvdHlwZS5pc09iamVjdCA9IGZ1bmN0aW9uKG9ubHlHZW5lcmF0ZWQpIHsKICAgICAgaWYgKHRoaXMucHJvcGVydGllcy5sZW5ndGgpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuICh0aGlzLmJhc2UgaW5zdGFuY2VvZiBPYmopICYmICghb25seUdlbmVyYXRlZCB8fCB0aGlzLmJhc2UuZ2VuZXJhdGVkKTsKICAgIH07CiAgICBWYWx1ZS5wcm90b3R5cGUuaXNTcGxpY2UgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGxhc3QodGhpcy5wcm9wZXJ0aWVzKSBpbnN0YW5jZW9mIFNsaWNlOwogICAgfTsKICAgIFZhbHVlLnByb3RvdHlwZS5tYWtlUmV0dXJuID0gZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0aGlzLnByb3BlcnRpZXMubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIFZhbHVlLl9fc3VwZXJfXy5tYWtlUmV0dXJuLmNhbGwodGhpcyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZS5tYWtlUmV0dXJuKCk7CiAgICAgIH0KICAgIH07CiAgICBWYWx1ZS5wcm90b3R5cGUudW53cmFwID0gZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0aGlzLnByb3BlcnRpZXMubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZTsKICAgICAgfQogICAgfTsKICAgIFZhbHVlLnByb3RvdHlwZS5jYWNoZVJlZmVyZW5jZSA9IGZ1bmN0aW9uKG8pIHsKICAgICAgdmFyIGJhc2UsIGJyZWYsIG5hbWUsIG5yZWY7CiAgICAgIG5hbWUgPSBsYXN0KHRoaXMucHJvcGVydGllcyk7CiAgICAgIGlmICh0aGlzLnByb3BlcnRpZXMubGVuZ3RoIDwgMiAmJiAhdGhpcy5iYXNlLmlzQ29tcGxleCgpICYmICEobmFtZSAhPSBudWxsID8gbmFtZS5pc0NvbXBsZXgoKSA6IHZvaWQgMCkpIHsKICAgICAgICByZXR1cm4gW3RoaXMsIHRoaXNdOwogICAgICB9CiAgICAgIGJhc2UgPSBuZXcgVmFsdWUodGhpcy5iYXNlLCB0aGlzLnByb3BlcnRpZXMuc2xpY2UoMCwgLTEpKTsKICAgICAgaWYgKGJhc2UuaXNDb21wbGV4KCkpIHsKICAgICAgICBicmVmID0gbmV3IExpdGVyYWwoby5zY29wZS5mcmVlVmFyaWFibGUoJ2Jhc2UnKSk7CiAgICAgICAgYmFzZSA9IG5ldyBWYWx1ZShuZXcgUGFyZW5zKG5ldyBBc3NpZ24oYnJlZiwgYmFzZSkpKTsKICAgICAgfQogICAgICBpZiAoIW5hbWUpIHsKICAgICAgICByZXR1cm4gW2Jhc2UsIGJyZWZdOwogICAgICB9CiAgICAgIGlmIChuYW1lLmlzQ29tcGxleCgpKSB7CiAgICAgICAgbnJlZiA9IG5ldyBMaXRlcmFsKG8uc2NvcGUuZnJlZVZhcmlhYmxlKCduYW1lJykpOwogICAgICAgIG5hbWUgPSBuZXcgSW5kZXgobmV3IEFzc2lnbihucmVmLCBuYW1lLmluZGV4KSk7CiAgICAgICAgbnJlZiA9IG5ldyBJbmRleChucmVmKTsKICAgICAgfQogICAgICByZXR1cm4gW2Jhc2UucHVzaChuYW1lKSwgbmV3IFZhbHVlKGJyZWYgfHwgYmFzZS5iYXNlLCBbbnJlZiB8fCBuYW1lXSldOwogICAgfTsKICAgIFZhbHVlLnByb3RvdHlwZS5jb21waWxlTm9kZSA9IGZ1bmN0aW9uKG8pIHsKICAgICAgdmFyIGNvZGUsIHByb3AsIHByb3BzLCBfaSwgX2xlbjsKICAgICAgdGhpcy5iYXNlLmZyb250ID0gdGhpcy5mcm9udDsKICAgICAgcHJvcHMgPSB0aGlzLnByb3BlcnRpZXM7CiAgICAgIGNvZGUgPSB0aGlzLmJhc2UuY29tcGlsZShvLCBwcm9wcy5sZW5ndGggPyBMRVZFTF9BQ0NFU1MgOiBudWxsKTsKICAgICAgaWYgKHByb3BzWzBdIGluc3RhbmNlb2YgQWNjZXNzICYmIHRoaXMuaXNTaW1wbGVOdW1iZXIoKSkgewogICAgICAgIGNvZGUgPSAiKCIgKyBjb2RlICsgIikiOwogICAgICB9CiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gcHJvcHMubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsKICAgICAgICBwcm9wID0gcHJvcHNbX2ldOwogICAgICAgIGNvZGUgKz0gcHJvcC5jb21waWxlKG8pOwogICAgICB9CiAgICAgIHJldHVybiBjb2RlOwogICAgfTsKICAgIFZhbHVlLnByb3RvdHlwZS51bmZvbGRTb2FrID0gZnVuY3Rpb24obykgewogICAgICB2YXIgcmVzdWx0OwogICAgICBpZiAodGhpcy51bmZvbGRlZFNvYWsgIT0gbnVsbCkgewogICAgICAgIHJldHVybiB0aGlzLnVuZm9sZGVkU29hazsKICAgICAgfQogICAgICByZXN1bHQgPSBfX2JpbmQoZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGZzdCwgaSwgaWZuLCBwcm9wLCByZWYsIHNuZCwgX2xlbiwgX3JlZjI7CiAgICAgICAgaWYgKGlmbiA9IHRoaXMuYmFzZS51bmZvbGRTb2FrKG8pKSB7CiAgICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShpZm4uYm9keS5wcm9wZXJ0aWVzLCB0aGlzLnByb3BlcnRpZXMpOwogICAgICAgICAgcmV0dXJuIGlmbjsKICAgICAgICB9CiAgICAgICAgX3JlZjIgPSB0aGlzLnByb3BlcnRpZXM7CiAgICAgICAgZm9yIChpID0gMCwgX2xlbiA9IF9yZWYyLmxlbmd0aDsgaSA8IF9sZW47IGkrKykgewogICAgICAgICAgcHJvcCA9IF9yZWYyW2ldOwogICAgICAgICAgaWYgKHByb3Auc29haykgewogICAgICAgICAgICBwcm9wLnNvYWsgPSBmYWxzZTsKICAgICAgICAgICAgZnN0ID0gbmV3IFZhbHVlKHRoaXMuYmFzZSwgdGhpcy5wcm9wZXJ0aWVzLnNsaWNlKDAsIGkpKTsKICAgICAgICAgICAgc25kID0gbmV3IFZhbHVlKHRoaXMuYmFzZSwgdGhpcy5wcm9wZXJ0aWVzLnNsaWNlKGkpKTsKICAgICAgICAgICAgaWYgKGZzdC5pc0NvbXBsZXgoKSkgewogICAgICAgICAgICAgIHJlZiA9IG5ldyBMaXRlcmFsKG8uc2NvcGUuZnJlZVZhcmlhYmxlKCdyZWYnKSk7CiAgICAgICAgICAgICAgZnN0ID0gbmV3IFBhcmVucyhuZXcgQXNzaWduKHJlZiwgZnN0KSk7CiAgICAgICAgICAgICAgc25kLmJhc2UgPSByZWY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG5ldyBJZihuZXcgRXhpc3RlbmNlKGZzdCksIHNuZCwgewogICAgICAgICAgICAgIHNvYWs6IHRydWUKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9LCB0aGlzKSgpOwogICAgICByZXR1cm4gdGhpcy51bmZvbGRlZFNvYWsgPSByZXN1bHQgfHwgZmFsc2U7CiAgICB9OwogICAgcmV0dXJuIFZhbHVlOwogIH0pKCk7CiAgZXhwb3J0cy5Db21tZW50ID0gQ29tbWVudCA9IChmdW5jdGlvbigpIHsKICAgIF9fZXh0ZW5kcyhDb21tZW50LCBCYXNlKTsKICAgIGZ1bmN0aW9uIENvbW1lbnQoY29tbWVudCkgewogICAgICB0aGlzLmNvbW1lbnQgPSBjb21tZW50OwogICAgfQogICAgQ29tbWVudC5wcm90b3R5cGUuaXNTdGF0ZW1lbnQgPSBZRVM7CiAgICBDb21tZW50LnByb3RvdHlwZS5tYWtlUmV0dXJuID0gVEhJUzsKICAgIENvbW1lbnQucHJvdG90eXBlLmNvbXBpbGVOb2RlID0gZnVuY3Rpb24obywgbGV2ZWwpIHsKICAgICAgdmFyIGNvZGU7CiAgICAgIGNvZGUgPSAnLyonICsgbXVsdGlkZW50KHRoaXMuY29tbWVudCwgdGhpcy50YWIpICsgJyovJzsKICAgICAgaWYgKChsZXZlbCB8fCBvLmxldmVsKSA9PT0gTEVWRUxfVE9QKSB7CiAgICAgICAgY29kZSA9IG8uaW5kZW50ICsgY29kZTsKICAgICAgfQogICAgICByZXR1cm4gY29kZTsKICAgIH07CiAgICByZXR1cm4gQ29tbWVudDsKICB9KSgpOwogIGV4cG9ydHMuQ2FsbCA9IENhbGwgPSAoZnVuY3Rpb24oKSB7CiAgICBfX2V4dGVuZHMoQ2FsbCwgQmFzZSk7CiAgICBmdW5jdGlvbiBDYWxsKHZhcmlhYmxlLCBhcmdzLCBzb2FrKSB7CiAgICAgIHRoaXMuYXJncyA9IGFyZ3MgIT0gbnVsbCA/IGFyZ3MgOiBbXTsKICAgICAgdGhpcy5zb2FrID0gc29hazsKICAgICAgdGhpcy5pc05ldyA9IGZhbHNlOwogICAgICB0aGlzLmlzU3VwZXIgPSB2YXJpYWJsZSA9PT0gJ3N1cGVyJzsKICAgICAgdGhpcy52YXJpYWJsZSA9IHRoaXMuaXNTdXBlciA/IG51bGwgOiB2YXJpYWJsZTsKICAgIH0KICAgIENhbGwucHJvdG90eXBlLmNoaWxkcmVuID0gWyd2YXJpYWJsZScsICdhcmdzJ107CiAgICBDYWxsLnByb3RvdHlwZS5uZXdJbnN0YW5jZSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgYmFzZTsKICAgICAgYmFzZSA9IHRoaXMudmFyaWFibGUuYmFzZSB8fCB0aGlzLnZhcmlhYmxlOwogICAgICBpZiAoYmFzZSBpbnN0YW5jZW9mIENhbGwpIHsKICAgICAgICBiYXNlLm5ld0luc3RhbmNlKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5pc05ldyA9IHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwogICAgQ2FsbC5wcm90b3R5cGUuc3VwZXJSZWZlcmVuY2UgPSBmdW5jdGlvbihvKSB7CiAgICAgIHZhciBtZXRob2QsIG5hbWU7CiAgICAgIG1ldGhvZCA9IG8uc2NvcGUubWV0aG9kOwogICAgICBpZiAoIW1ldGhvZCkgewogICAgICAgIHRocm93IFN5bnRheEVycm9yKCdjYW5ub3QgY2FsbCBzdXBlciBvdXRzaWRlIG9mIGEgZnVuY3Rpb24uJyk7CiAgICAgIH0KICAgICAgbmFtZSA9IG1ldGhvZC5uYW1lOwogICAgICBpZiAoIW5hbWUpIHsKICAgICAgICB0aHJvdyBTeW50YXhFcnJvcignY2Fubm90IGNhbGwgc3VwZXIgb24gYW4gYW5vbnltb3VzIGZ1bmN0aW9uLicpOwogICAgICB9CiAgICAgIGlmIChtZXRob2Qua2xhc3MpIHsKICAgICAgICByZXR1cm4gIiIgKyBtZXRob2Qua2xhc3MgKyAiLl9fc3VwZXJfXy4iICsgbmFtZTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gIiIgKyBuYW1lICsgIi5fX3N1cGVyX18uY29uc3RydWN0b3IiOwogICAgICB9CiAgICB9OwogICAgQ2FsbC5wcm90b3R5cGUudW5mb2xkU29hayA9IGZ1bmN0aW9uKG8pIHsKICAgICAgdmFyIGNhbGwsIGlmbiwgbGVmdCwgbGlzdCwgcml0ZSwgX2ksIF9sZW4sIF9yZWYyLCBfcmVmMzsKICAgICAgaWYgKHRoaXMuc29haykgewogICAgICAgIGlmICh0aGlzLnZhcmlhYmxlKSB7CiAgICAgICAgICBpZiAoaWZuID0gdW5mb2xkU29hayhvLCB0aGlzLCAndmFyaWFibGUnKSkgewogICAgICAgICAgICByZXR1cm4gaWZuOwogICAgICAgICAgfQogICAgICAgICAgX3JlZjIgPSBuZXcgVmFsdWUodGhpcy52YXJpYWJsZSkuY2FjaGVSZWZlcmVuY2UobyksIGxlZnQgPSBfcmVmMlswXSwgcml0ZSA9IF9yZWYyWzFdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsZWZ0ID0gbmV3IExpdGVyYWwodGhpcy5zdXBlclJlZmVyZW5jZShvKSk7CiAgICAgICAgICByaXRlID0gbmV3IFZhbHVlKGxlZnQpOwogICAgICAgIH0KICAgICAgICByaXRlID0gbmV3IENhbGwocml0ZSwgdGhpcy5hcmdzKTsKICAgICAgICByaXRlLmlzTmV3ID0gdGhpcy5pc05ldzsKICAgICAgICBsZWZ0ID0gbmV3IExpdGVyYWwoInR5cGVvZiAiICsgKGxlZnQuY29tcGlsZShvKSkgKyAiID09PSBcImZ1bmN0aW9uXCIiKTsKICAgICAgICByZXR1cm4gbmV3IElmKGxlZnQsIG5ldyBWYWx1ZShyaXRlKSwgewogICAgICAgICAgc29hazogdHJ1ZQogICAgICAgIH0pOwogICAgICB9CiAgICAgIGNhbGwgPSB0aGlzOwogICAgICBsaXN0ID0gW107CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgaWYgKGNhbGwudmFyaWFibGUgaW5zdGFuY2VvZiBDYWxsKSB7CiAgICAgICAgICBsaXN0LnB1c2goY2FsbCk7CiAgICAgICAgICBjYWxsID0gY2FsbC52YXJpYWJsZTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoIShjYWxsLnZhcmlhYmxlIGluc3RhbmNlb2YgVmFsdWUpKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgbGlzdC5wdXNoKGNhbGwpOwogICAgICAgIGlmICghKChjYWxsID0gY2FsbC52YXJpYWJsZS5iYXNlKSBpbnN0YW5jZW9mIENhbGwpKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgX3JlZjMgPSBsaXN0LnJldmVyc2UoKTsKICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmMy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgewogICAgICAgIGNhbGwgPSBfcmVmM1tfaV07CiAgICAgICAgaWYgKGlmbikgewogICAgICAgICAgaWYgKGNhbGwudmFyaWFibGUgaW5zdGFuY2VvZiBDYWxsKSB7CiAgICAgICAgICAgIGNhbGwudmFyaWFibGUgPSBpZm47CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjYWxsLnZhcmlhYmxlLmJhc2UgPSBpZm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmbiA9IHVuZm9sZFNvYWsobywgY2FsbCwgJ3ZhcmlhYmxlJyk7CiAgICAgIH0KICAgICAgcmV0dXJuIGlmbjsKICAgIH07CiAgICBDYWxsLnByb3RvdHlwZS5maWx0ZXJJbXBsaWNpdE9iamVjdHMgPSBmdW5jdGlvbihsaXN0KSB7CiAgICAgIHZhciBub2RlLCBub2Rlcywgb2JqLCBwcm9wLCBwcm9wZXJ0aWVzLCBfaSwgX2osIF9sZW4sIF9sZW4yLCBfcmVmMjsKICAgICAgbm9kZXMgPSBbXTsKICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBsaXN0Lmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7CiAgICAgICAgbm9kZSA9IGxpc3RbX2ldOwogICAgICAgIGlmICghKCh0eXBlb2Ygbm9kZS5pc09iamVjdCA9PT0gImZ1bmN0aW9uIiA/IG5vZGUuaXNPYmplY3QoKSA6IHZvaWQgMCkgJiYgbm9kZS5iYXNlLmdlbmVyYXRlZCkpIHsKICAgICAgICAgIG5vZGVzLnB1c2gobm9kZSk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgb2JqID0gbnVsbDsKICAgICAgICBfcmVmMiA9IG5vZGUuYmFzZS5wcm9wZXJ0aWVzOwogICAgICAgIGZvciAoX2ogPSAwLCBfbGVuMiA9IF9yZWYyLmxlbmd0aDsgX2ogPCBfbGVuMjsgX2orKykgewogICAgICAgICAgcHJvcCA9IF9yZWYyW19qXTsKICAgICAgICAgIGlmIChwcm9wIGluc3RhbmNlb2YgQXNzaWduKSB7CiAgICAgICAgICAgIGlmICghb2JqKSB7CiAgICAgICAgICAgICAgbm9kZXMucHVzaChvYmogPSBuZXcgT2JqKHByb3BlcnRpZXMgPSBbXSwgdHJ1ZSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByb3BlcnRpZXMucHVzaChwcm9wKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5vZGVzLnB1c2gocHJvcCk7CiAgICAgICAgICAgIG9iaiA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBub2RlczsKICAgIH07CiAgICBDYWxsLnByb3RvdHlwZS5jb21waWxlTm9kZSA9IGZ1bmN0aW9uKG8pIHsKICAgICAgdmFyIGFyZywgYXJncywgY29kZSwgX3JlZjI7CiAgICAgIGlmICgoX3JlZjIgPSB0aGlzLnZhcmlhYmxlKSAhPSBudWxsKSB7CiAgICAgICAgX3JlZjIuZnJvbnQgPSB0aGlzLmZyb250OwogICAgICB9CiAgICAgIGlmIChjb2RlID0gU3BsYXQuY29tcGlsZVNwbGF0dGVkQXJyYXkobywgdGhpcy5hcmdzLCB0cnVlKSkgewogICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVTcGxhdChvLCBjb2RlKTsKICAgICAgfQogICAgICBhcmdzID0gdGhpcy5maWx0ZXJJbXBsaWNpdE9iamVjdHModGhpcy5hcmdzKTsKICAgICAgYXJncyA9ICgoZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIF9pLCBfbGVuLCBfcmVzdWx0czsKICAgICAgICBfcmVzdWx0cyA9IFtdOwogICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gYXJncy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgewogICAgICAgICAgYXJnID0gYXJnc1tfaV07CiAgICAgICAgICBfcmVzdWx0cy5wdXNoKGFyZy5jb21waWxlKG8sIExFVkVMX0xJU1QpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9yZXN1bHRzOwogICAgICB9KSgpKS5qb2luKCcsICcpOwogICAgICBpZiAodGhpcy5pc1N1cGVyKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3VwZXJSZWZlcmVuY2UobykgKyAoIi5jYWxsKHRoaXMiICsgKGFyZ3MgJiYgJywgJyArIGFyZ3MpICsgIikiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gKHRoaXMuaXNOZXcgPyAnbmV3ICcgOiAnJykgKyB0aGlzLnZhcmlhYmxlLmNvbXBpbGUobywgTEVWRUxfQUNDRVNTKSArICgiKCIgKyBhcmdzICsgIikiKTsKICAgICAgfQogICAgfTsKICAgIENhbGwucHJvdG90eXBlLmNvbXBpbGVTdXBlciA9IGZ1bmN0aW9uKGFyZ3MsIG8pIHsKICAgICAgcmV0dXJuICIiICsgKHRoaXMuc3VwZXJSZWZlcmVuY2UobykpICsgIi5jYWxsKHRoaXMiICsgKGFyZ3MubGVuZ3RoID8gJywgJyA6ICcnKSArIGFyZ3MgKyAiKSI7CiAgICB9OwogICAgQ2FsbC5wcm90b3R5cGUuY29tcGlsZVNwbGF0ID0gZnVuY3Rpb24obywgc3BsYXRBcmdzKSB7CiAgICAgIHZhciBiYXNlLCBmdW4sIGlkdCwgbmFtZSwgcmVmOwogICAgICBpZiAodGhpcy5pc1N1cGVyKSB7CiAgICAgICAgcmV0dXJuICIiICsgKHRoaXMuc3VwZXJSZWZlcmVuY2UobykpICsgIi5hcHBseSh0aGlzLCAiICsgc3BsYXRBcmdzICsgIikiOwogICAgICB9CiAgICAgIGlmICh0aGlzLmlzTmV3KSB7CiAgICAgICAgaWR0ID0gdGhpcy50YWIgKyBUQUI7CiAgICAgICAgcmV0dXJuICIoZnVuY3Rpb24oZnVuYywgYXJncywgY3Rvcikge1xuIiArIGlkdCArICJjdG9yLnByb3RvdHlwZSA9IGZ1bmMucHJvdG90eXBlO1xuIiArIGlkdCArICJ2YXIgY2hpbGQgPSBuZXcgY3RvciwgcmVzdWx0ID0gZnVuYy5hcHBseShjaGlsZCwgYXJncyk7XG4iICsgaWR0ICsgInJldHVybiB0eXBlb2YgcmVzdWx0ID09PSBcIm9iamVjdFwiID8gcmVzdWx0IDogY2hpbGQ7XG4iICsgdGhpcy50YWIgKyAifSkoIiArICh0aGlzLnZhcmlhYmxlLmNvbXBpbGUobywgTEVWRUxfTElTVCkpICsgIiwgIiArIHNwbGF0QXJncyArICIsIGZ1bmN0aW9uKCkge30pIjsKICAgICAgfQogICAgICBiYXNlID0gbmV3IFZhbHVlKHRoaXMudmFyaWFibGUpOwogICAgICBpZiAoKG5hbWUgPSBiYXNlLnByb3BlcnRpZXMucG9wKCkpICYmIGJhc2UuaXNDb21wbGV4KCkpIHsKICAgICAgICByZWYgPSBvLnNjb3BlLmZyZWVWYXJpYWJsZSgncmVmJyk7CiAgICAgICAgZnVuID0gIigiICsgcmVmICsgIiA9ICIgKyAoYmFzZS5jb21waWxlKG8sIExFVkVMX0xJU1QpKSArICIpIiArIChuYW1lLmNvbXBpbGUobykpOwogICAgICB9IGVsc2UgewogICAgICAgIGZ1biA9IGJhc2UuY29tcGlsZShvLCBMRVZFTF9BQ0NFU1MpOwogICAgICAgIGlmIChTSU1QTEVOVU0udGVzdChmdW4pKSB7CiAgICAgICAgICBmdW4gPSAiKCIgKyBmdW4gKyAiKSI7CiAgICAgICAgfQogICAgICAgIGlmIChuYW1lKSB7CiAgICAgICAgICByZWYgPSBmdW47CiAgICAgICAgICBmdW4gKz0gbmFtZS5jb21waWxlKG8pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZWYgPSAnbnVsbCc7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiAiIiArIGZ1biArICIuYXBwbHkoIiArIHJlZiArICIsICIgKyBzcGxhdEFyZ3MgKyAiKSI7CiAgICB9OwogICAgcmV0dXJuIENhbGw7CiAgfSkoKTsKICBleHBvcnRzLkV4dGVuZHMgPSBFeHRlbmRzID0gKGZ1bmN0aW9uKCkgewogICAgX19leHRlbmRzKEV4dGVuZHMsIEJhc2UpOwogICAgZnVuY3Rpb24gRXh0ZW5kcyhjaGlsZCwgcGFyZW50KSB7CiAgICAgIHRoaXMuY2hpbGQgPSBjaGlsZDsKICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CiAgICB9CiAgICBFeHRlbmRzLnByb3RvdHlwZS5jaGlsZHJlbiA9IFsnY2hpbGQnLCAncGFyZW50J107CiAgICBFeHRlbmRzLnByb3RvdHlwZS5jb21waWxlID0gZnVuY3Rpb24obykgewogICAgICB1dGlsaXR5KCdoYXNQcm9wJyk7CiAgICAgIHJldHVybiBuZXcgQ2FsbChuZXcgVmFsdWUobmV3IExpdGVyYWwodXRpbGl0eSgnZXh0ZW5kcycpKSksIFt0aGlzLmNoaWxkLCB0aGlzLnBhcmVudF0pLmNvbXBpbGUobyk7CiAgICB9OwogICAgcmV0dXJuIEV4dGVuZHM7CiAgfSkoKTsKICBleHBvcnRzLkFjY2VzcyA9IEFjY2VzcyA9IChmdW5jdGlvbigpIHsKICAgIF9fZXh0ZW5kcyhBY2Nlc3MsIEJhc2UpOwogICAgZnVuY3Rpb24gQWNjZXNzKG5hbWUsIHRhZykgewogICAgICB0aGlzLm5hbWUgPSBuYW1lOwogICAgICB0aGlzLm5hbWUuYXNLZXkgPSB0cnVlOwogICAgICB0aGlzLnByb3RvID0gdGFnID09PSAncHJvdG8nID8gJy5wcm90b3R5cGUnIDogJyc7CiAgICAgIHRoaXMuc29hayA9IHRhZyA9PT0gJ3NvYWsnOwogICAgfQogICAgQWNjZXNzLnByb3RvdHlwZS5jaGlsZHJlbiA9IFsnbmFtZSddOwogICAgQWNjZXNzLnByb3RvdHlwZS5jb21waWxlID0gZnVuY3Rpb24obykgewogICAgICB2YXIgbmFtZTsKICAgICAgbmFtZSA9IHRoaXMubmFtZS5jb21waWxlKG8pOwogICAgICByZXR1cm4gdGhpcy5wcm90byArIChJU19TVFJJTkcudGVzdChuYW1lKSA/ICJbIiArIG5hbWUgKyAiXSIgOiAiLiIgKyBuYW1lKTsKICAgIH07CiAgICBBY2Nlc3MucHJvdG90eXBlLmlzQ29tcGxleCA9IE5POwogICAgcmV0dXJuIEFjY2VzczsKICB9KSgpOwogIGV4cG9ydHMuSW5kZXggPSBJbmRleCA9IChmdW5jdGlvbigpIHsKICAgIF9fZXh0ZW5kcyhJbmRleCwgQmFzZSk7CiAgICBmdW5jdGlvbiBJbmRleChpbmRleCkgewogICAgICB0aGlzLmluZGV4ID0gaW5kZXg7CiAgICB9CiAgICBJbmRleC5wcm90b3R5cGUuY2hpbGRyZW4gPSBbJ2luZGV4J107CiAgICBJbmRleC5wcm90b3R5cGUuY29tcGlsZSA9IGZ1bmN0aW9uKG8pIHsKICAgICAgcmV0dXJuICh0aGlzLnByb3RvID8gJy5wcm90b3R5cGUnIDogJycpICsgKCJbIiArICh0aGlzLmluZGV4LmNvbXBpbGUobywgTEVWRUxfUEFSRU4pKSArICJdIik7CiAgICB9OwogICAgSW5kZXgucHJvdG90eXBlLmlzQ29tcGxleCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5pbmRleC5pc0NvbXBsZXgoKTsKICAgIH07CiAgICByZXR1cm4gSW5kZXg7CiAgfSkoKTsKICBleHBvcnRzLlJhbmdlID0gUmFuZ2UgPSAoZnVuY3Rpb24oKSB7CiAgICBfX2V4dGVuZHMoUmFuZ2UsIEJhc2UpOwogICAgUmFuZ2UucHJvdG90eXBlLmNoaWxkcmVuID0gWydmcm9tJywgJ3RvJ107CiAgICBmdW5jdGlvbiBSYW5nZShmcm9tLCB0bywgdGFnKSB7CiAgICAgIHRoaXMuZnJvbSA9IGZyb207CiAgICAgIHRoaXMudG8gPSB0bzsKICAgICAgdGhpcy5leGNsdXNpdmUgPSB0YWcgPT09ICdleGNsdXNpdmUnOwogICAgICB0aGlzLmVxdWFscyA9IHRoaXMuZXhjbHVzaXZlID8gJycgOiAnPSc7CiAgICB9CiAgICBSYW5nZS5wcm90b3R5cGUuY29tcGlsZVZhcmlhYmxlcyA9IGZ1bmN0aW9uKG8pIHsKICAgICAgdmFyIHN0ZXAsIF9yZWYyLCBfcmVmMywgX3JlZjQsIF9yZWY1OwogICAgICBvID0gbWVyZ2UobywgewogICAgICAgIHRvcDogdHJ1ZQogICAgICB9KTsKICAgICAgX3JlZjIgPSB0aGlzLmZyb20uY2FjaGUobywgTEVWRUxfTElTVCksIHRoaXMuZnJvbSA9IF9yZWYyWzBdLCB0aGlzLmZyb21WYXIgPSBfcmVmMlsxXTsKICAgICAgX3JlZjMgPSB0aGlzLnRvLmNhY2hlKG8sIExFVkVMX0xJU1QpLCB0aGlzLnRvID0gX3JlZjNbMF0sIHRoaXMudG9WYXIgPSBfcmVmM1sxXTsKICAgICAgaWYgKHN0ZXAgPSBkZWwobywgJ3N0ZXAnKSkgewogICAgICAgIF9yZWY0ID0gc3RlcC5jYWNoZShvLCBMRVZFTF9MSVNUKSwgdGhpcy5zdGVwID0gX3JlZjRbMF0sIHRoaXMuc3RlcFZhciA9IF9yZWY0WzFdOwogICAgICB9CiAgICAgIF9yZWY1ID0gW3RoaXMuZnJvbVZhci5tYXRjaChTSU1QTEVOVU0pLCB0aGlzLnRvVmFyLm1hdGNoKFNJTVBMRU5VTSldLCB0aGlzLmZyb21OdW0gPSBfcmVmNVswXSwgdGhpcy50b051bSA9IF9yZWY1WzFdOwogICAgICBpZiAodGhpcy5zdGVwVmFyKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3RlcE51bSA9IHRoaXMuc3RlcFZhci5tYXRjaChTSU1QTEVOVU0pOwogICAgICB9CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLmNvbXBpbGVOb2RlID0gZnVuY3Rpb24obykgewogICAgICB2YXIgY29uZCwgY29uZFBhcnQsIGZyb20sIGd0LCBpZHgsIGtub3duLCBsdCwgc3RlcFBhcnQsIHRvLCB2YXJQYXJ0LCBfcmVmMiwgX3JlZjM7CiAgICAgIGlmICghdGhpcy5mcm9tVmFyKSB7CiAgICAgICAgdGhpcy5jb21waWxlVmFyaWFibGVzKG8pOwogICAgICB9CiAgICAgIGlmICghby5pbmRleCkgewogICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVBcnJheShvKTsKICAgICAgfQogICAgICBrbm93biA9IHRoaXMuZnJvbU51bSAmJiB0aGlzLnRvTnVtOwogICAgICBpZHggPSBkZWwobywgJ2luZGV4Jyk7CiAgICAgIHZhclBhcnQgPSAiIiArIGlkeCArICIgPSAiICsgdGhpcy5mcm9tOwogICAgICBpZiAodGhpcy50byAhPT0gdGhpcy50b1ZhcikgewogICAgICAgIHZhclBhcnQgKz0gIiwgIiArIHRoaXMudG87CiAgICAgIH0KICAgICAgaWYgKHRoaXMuc3RlcCAhPT0gdGhpcy5zdGVwVmFyKSB7CiAgICAgICAgdmFyUGFydCArPSAiLCAiICsgdGhpcy5zdGVwOwogICAgICB9CiAgICAgIF9yZWYyID0gWyIiICsgaWR4ICsgIiA8IiArIHRoaXMuZXF1YWxzLCAiIiArIGlkeCArICIgPiIgKyB0aGlzLmVxdWFsc10sIGx0ID0gX3JlZjJbMF0sIGd0ID0gX3JlZjJbMV07CiAgICAgIGNvbmRQYXJ0ID0gdGhpcy5zdGVwTnVtID8gY29uZFBhcnQgPSArdGhpcy5zdGVwTnVtID4gMCA/ICIiICsgbHQgKyAiICIgKyB0aGlzLnRvVmFyIDogIiIgKyBndCArICIgIiArIHRoaXMudG9WYXIgOiBrbm93biA/ICgoX3JlZjMgPSBbK3RoaXMuZnJvbU51bSwgK3RoaXMudG9OdW1dLCBmcm9tID0gX3JlZjNbMF0sIHRvID0gX3JlZjNbMV0sIF9yZWYzKSwgY29uZFBhcnQgPSBmcm9tIDw9IHRvID8gIiIgKyBsdCArICIgIiArIHRvIDogIiIgKyBndCArICIgIiArIHRvKSA6IChjb25kID0gIiIgKyB0aGlzLmZyb21WYXIgKyAiIDw9ICIgKyB0aGlzLnRvVmFyLCBjb25kUGFydCA9ICIiICsgY29uZCArICIgPyAiICsgbHQgKyAiICIgKyB0aGlzLnRvVmFyICsgIiA6ICIgKyBndCArICIgIiArIHRoaXMudG9WYXIpOwogICAgICBzdGVwUGFydCA9IHRoaXMuc3RlcFZhciA/ICIiICsgaWR4ICsgIiArPSAiICsgdGhpcy5zdGVwVmFyIDoga25vd24gPyBmcm9tIDw9IHRvID8gIiIgKyBpZHggKyAiKysiIDogIiIgKyBpZHggKyAiLS0iIDogIiIgKyBjb25kICsgIiA/ICIgKyBpZHggKyAiKysgOiAiICsgaWR4ICsgIi0tIjsKICAgICAgcmV0dXJuICIiICsgdmFyUGFydCArICI7ICIgKyBjb25kUGFydCArICI7ICIgKyBzdGVwUGFydDsKICAgIH07CiAgICBSYW5nZS5wcm90b3R5cGUuY29tcGlsZUFycmF5ID0gZnVuY3Rpb24obykgewogICAgICB2YXIgYm9keSwgY29uZCwgaSwgaWR0LCBwb3N0LCBwcmUsIHJhbmdlLCByZXN1bHQsIHZhcnMsIF9pLCBfcmVmMiwgX3JlZjMsIF9yZXN1bHRzOwogICAgICBpZiAodGhpcy5mcm9tTnVtICYmIHRoaXMudG9OdW0gJiYgTWF0aC5hYnModGhpcy5mcm9tTnVtIC0gdGhpcy50b051bSkgPD0gMjApIHsKICAgICAgICByYW5nZSA9IChmdW5jdGlvbigpIHsKICAgICAgICAgIF9yZXN1bHRzID0gW107CiAgICAgICAgICBmb3IgKHZhciBfaSA9IF9yZWYyID0gK3RoaXMuZnJvbU51bSwgX3JlZjMgPSArdGhpcy50b051bTsgX3JlZjIgPD0gX3JlZjMgPyBfaSA8PSBfcmVmMyA6IF9pID49IF9yZWYzOyBfcmVmMiA8PSBfcmVmMyA/IF9pKysgOiBfaS0tKXsgX3Jlc3VsdHMucHVzaChfaSk7IH0KICAgICAgICAgIHJldHVybiBfcmVzdWx0czsKICAgICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIGlmICh0aGlzLmV4Y2x1c2l2ZSkgewogICAgICAgICAgcmFuZ2UucG9wKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAiWyIgKyAocmFuZ2Uuam9pbignLCAnKSkgKyAiXSI7CiAgICAgIH0KICAgICAgaWR0ID0gdGhpcy50YWIgKyBUQUI7CiAgICAgIGkgPSBvLnNjb3BlLmZyZWVWYXJpYWJsZSgnaScpOwogICAgICByZXN1bHQgPSBvLnNjb3BlLmZyZWVWYXJpYWJsZSgncmVzdWx0cycpOwogICAgICBwcmUgPSAiXG4iICsgaWR0ICsgcmVzdWx0ICsgIiA9IFtdOyI7CiAgICAgIGlmICh0aGlzLmZyb21OdW0gJiYgdGhpcy50b051bSkgewogICAgICAgIG8uaW5kZXggPSBpOwogICAgICAgIGJvZHkgPSB0aGlzLmNvbXBpbGVOb2RlKG8pOwogICAgICB9IGVsc2UgewogICAgICAgIHZhcnMgPSAoIiIgKyBpICsgIiA9ICIgKyB0aGlzLmZyb20pICsgKHRoaXMudG8gIT09IHRoaXMudG9WYXIgPyAiLCAiICsgdGhpcy50byA6ICcnKTsKICAgICAgICBjb25kID0gIiIgKyB0aGlzLmZyb21WYXIgKyAiIDw9ICIgKyB0aGlzLnRvVmFyOwogICAgICAgIGJvZHkgPSAidmFyICIgKyB2YXJzICsgIjsgIiArIGNvbmQgKyAiID8gIiArIGkgKyAiIDwiICsgdGhpcy5lcXVhbHMgKyAiICIgKyB0aGlzLnRvVmFyICsgIiA6ICIgKyBpICsgIiA+IiArIHRoaXMuZXF1YWxzICsgIiAiICsgdGhpcy50b1ZhciArICI7ICIgKyBjb25kICsgIiA/ICIgKyBpICsgIisrIDogIiArIGkgKyAiLS0iOwogICAgICB9CiAgICAgIHBvc3QgPSAieyAiICsgcmVzdWx0ICsgIi5wdXNoKCIgKyBpICsgIik7IH1cbiIgKyBpZHQgKyAicmV0dXJuICIgKyByZXN1bHQgKyAiO1xuIiArIG8uaW5kZW50OwogICAgICByZXR1cm4gIihmdW5jdGlvbigpIHsiICsgcHJlICsgIlxuIiArIGlkdCArICJmb3IgKCIgKyBib2R5ICsgIikiICsgcG9zdCArICJ9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIjsKICAgIH07CiAgICByZXR1cm4gUmFuZ2U7CiAgfSkoKTsKICBleHBvcnRzLlNsaWNlID0gU2xpY2UgPSAoZnVuY3Rpb24oKSB7CiAgICBfX2V4dGVuZHMoU2xpY2UsIEJhc2UpOwogICAgU2xpY2UucHJvdG90eXBlLmNoaWxkcmVuID0gWydyYW5nZSddOwogICAgZnVuY3Rpb24gU2xpY2UocmFuZ2UpIHsKICAgICAgdGhpcy5yYW5nZSA9IHJhbmdlOwogICAgICBTbGljZS5fX3N1cGVyX18uY29uc3RydWN0b3IuY2FsbCh0aGlzKTsKICAgIH0KICAgIFNsaWNlLnByb3RvdHlwZS5jb21waWxlTm9kZSA9IGZ1bmN0aW9uKG8pIHsKICAgICAgdmFyIGNvbXBpbGVkLCBmcm9tLCBmcm9tU3RyLCB0bywgdG9TdHIsIF9yZWYyOwogICAgICBfcmVmMiA9IHRoaXMucmFuZ2UsIHRvID0gX3JlZjIudG8sIGZyb20gPSBfcmVmMi5mcm9tOwogICAgICBmcm9tU3RyID0gZnJvbSAmJiBmcm9tLmNvbXBpbGUobywgTEVWRUxfUEFSRU4pIHx8ICcwJzsKICAgICAgY29tcGlsZWQgPSB0byAmJiB0by5jb21waWxlKG8sIExFVkVMX1BBUkVOKTsKICAgICAgaWYgKHRvICYmICEoIXRoaXMucmFuZ2UuZXhjbHVzaXZlICYmICtjb21waWxlZCA9PT0gLTEpKSB7CiAgICAgICAgdG9TdHIgPSAnLCAnICsgKHRoaXMucmFuZ2UuZXhjbHVzaXZlID8gY29tcGlsZWQgOiBTSU1QTEVOVU0udGVzdChjb21waWxlZCkgPyAoK2NvbXBpbGVkICsgMSkudG9TdHJpbmcoKSA6ICIoIiArIGNvbXBpbGVkICsgIiArIDEpIHx8IDllOSIpOwogICAgICB9CiAgICAgIHJldHVybiAiLnNsaWNlKCIgKyBmcm9tU3RyICsgKHRvU3RyIHx8ICcnKSArICIpIjsKICAgIH07CiAgICByZXR1cm4gU2xpY2U7CiAgfSkoKTsKICBleHBvcnRzLk9iaiA9IE9iaiA9IChmdW5jdGlvbigpIHsKICAgIF9fZXh0ZW5kcyhPYmosIEJhc2UpOwogICAgZnVuY3Rpb24gT2JqKHByb3BzLCBnZW5lcmF0ZWQpIHsKICAgICAgdGhpcy5nZW5lcmF0ZWQgPSBnZW5lcmF0ZWQgIT0gbnVsbCA/IGdlbmVyYXRlZCA6IGZhbHNlOwogICAgICB0aGlzLm9iamVjdHMgPSB0aGlzLnByb3BlcnRpZXMgPSBwcm9wcyB8fCBbXTsKICAgIH0KICAgIE9iai5wcm90b3R5cGUuY2hpbGRyZW4gPSBbJ3Byb3BlcnRpZXMnXTsKICAgIE9iai5wcm90b3R5cGUuY29tcGlsZU5vZGUgPSBmdW5jdGlvbihvKSB7CiAgICAgIHZhciBpLCBpZHQsIGluZGVudCwgam9pbiwgbGFzdE5vbmNvbSwgbm9kZSwgb2JqLCBwcm9wLCBwcm9wcywgX2ksIF9sZW47CiAgICAgIHByb3BzID0gdGhpcy5wcm9wZXJ0aWVzOwogICAgICBpZiAoIXByb3BzLmxlbmd0aCkgewogICAgICAgIGlmICh0aGlzLmZyb250KSB7CiAgICAgICAgICByZXR1cm4gJyh7fSknOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gJ3t9JzsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRoaXMuZ2VuZXJhdGVkKSB7CiAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBwcm9wcy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgewogICAgICAgICAgbm9kZSA9IHByb3BzW19pXTsKICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgVmFsdWUpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgaGF2ZSBhbiBpbXBsaWNpdCB2YWx1ZSBpbiBhbiBpbXBsaWNpdCBvYmplY3QnKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWR0ID0gby5pbmRlbnQgKz0gVEFCOwogICAgICBsYXN0Tm9uY29tID0gdGhpcy5sYXN0Tm9uQ29tbWVudCh0aGlzLnByb3BlcnRpZXMpOwogICAgICBwcm9wcyA9IChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgX2xlbjIsIF9yZXN1bHRzOwogICAgICAgIF9yZXN1bHRzID0gW107CiAgICAgICAgZm9yIChpID0gMCwgX2xlbjIgPSBwcm9wcy5sZW5ndGg7IGkgPCBfbGVuMjsgaSsrKSB7CiAgICAgICAgICBwcm9wID0gcHJvcHNbaV07CiAgICAgICAgICBqb2luID0gaSA9PT0gcHJvcHMubGVuZ3RoIC0gMSA/ICcnIDogcHJvcCA9PT0gbGFzdE5vbmNvbSB8fCBwcm9wIGluc3RhbmNlb2YgQ29tbWVudCA/ICdcbicgOiAnLFxuJzsKICAgICAgICAgIGluZGVudCA9IHByb3AgaW5zdGFuY2VvZiBDb21tZW50ID8gJycgOiBpZHQ7CiAgICAgICAgICBpZiAocHJvcCBpbnN0YW5jZW9mIFZhbHVlICYmIHByb3BbInRoaXMiXSkgewogICAgICAgICAgICBwcm9wID0gbmV3IEFzc2lnbihwcm9wLnByb3BlcnRpZXNbMF0ubmFtZSwgcHJvcCwgJ29iamVjdCcpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCEocHJvcCBpbnN0YW5jZW9mIENvbW1lbnQpKSB7CiAgICAgICAgICAgIGlmICghKHByb3AgaW5zdGFuY2VvZiBBc3NpZ24pKSB7CiAgICAgICAgICAgICAgcHJvcCA9IG5ldyBBc3NpZ24ocHJvcCwgcHJvcCwgJ29iamVjdCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIChwcm9wLnZhcmlhYmxlLmJhc2UgfHwgcHJvcC52YXJpYWJsZSkuYXNLZXkgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgX3Jlc3VsdHMucHVzaChpbmRlbnQgKyBwcm9wLmNvbXBpbGUobywgTEVWRUxfVE9QKSArIGpvaW4pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX3Jlc3VsdHM7CiAgICAgIH0pKCk7CiAgICAgIHByb3BzID0gcHJvcHMuam9pbignJyk7CiAgICAgIG9iaiA9ICJ7IiArIChwcm9wcyAmJiAnXG4nICsgcHJvcHMgKyAnXG4nICsgdGhpcy50YWIpICsgIn0iOwogICAgICBpZiAodGhpcy5mcm9udCkgewogICAgICAgIHJldHVybiAiKCIgKyBvYmogKyAiKSI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIG9iajsKICAgICAgfQogICAgfTsKICAgIE9iai5wcm90b3R5cGUuYXNzaWducyA9IGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgdmFyIHByb3AsIF9pLCBfbGVuLCBfcmVmMjsKICAgICAgX3JlZjIgPSB0aGlzLnByb3BlcnRpZXM7CiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjIubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsKICAgICAgICBwcm9wID0gX3JlZjJbX2ldOwogICAgICAgIGlmIChwcm9wLmFzc2lnbnMobmFtZSkpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwogICAgcmV0dXJuIE9iajsKICB9KSgpOwogIGV4cG9ydHMuQXJyID0gQXJyID0gKGZ1bmN0aW9uKCkgewogICAgX19leHRlbmRzKEFyciwgQmFzZSk7CiAgICBmdW5jdGlvbiBBcnIob2JqcykgewogICAgICB0aGlzLm9iamVjdHMgPSBvYmpzIHx8IFtdOwogICAgfQogICAgQXJyLnByb3RvdHlwZS5jaGlsZHJlbiA9IFsnb2JqZWN0cyddOwogICAgQXJyLnByb3RvdHlwZS5maWx0ZXJJbXBsaWNpdE9iamVjdHMgPSBDYWxsLnByb3RvdHlwZS5maWx0ZXJJbXBsaWNpdE9iamVjdHM7CiAgICBBcnIucHJvdG90eXBlLmNvbXBpbGVOb2RlID0gZnVuY3Rpb24obykgewogICAgICB2YXIgY29kZSwgb2JqLCBvYmpzOwogICAgICBpZiAoIXRoaXMub2JqZWN0cy5sZW5ndGgpIHsKICAgICAgICByZXR1cm4gJ1tdJzsKICAgICAgfQogICAgICBvLmluZGVudCArPSBUQUI7CiAgICAgIG9ianMgPSB0aGlzLmZpbHRlckltcGxpY2l0T2JqZWN0cyh0aGlzLm9iamVjdHMpOwogICAgICBpZiAoY29kZSA9IFNwbGF0LmNvbXBpbGVTcGxhdHRlZEFycmF5KG8sIG9ianMpKSB7CiAgICAgICAgcmV0dXJuIGNvZGU7CiAgICAgIH0KICAgICAgY29kZSA9ICgoZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIF9pLCBfbGVuLCBfcmVzdWx0czsKICAgICAgICBfcmVzdWx0cyA9IFtdOwogICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gb2Jqcy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgewogICAgICAgICAgb2JqID0gb2Jqc1tfaV07CiAgICAgICAgICBfcmVzdWx0cy5wdXNoKG9iai5jb21waWxlKG8sIExFVkVMX0xJU1QpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9yZXN1bHRzOwogICAgICB9KSgpKS5qb2luKCcsICcpOwogICAgICBpZiAoY29kZS5pbmRleE9mKCdcbicpID49IDApIHsKICAgICAgICByZXR1cm4gIltcbiIgKyBvLmluZGVudCArIGNvZGUgKyAiXG4iICsgdGhpcy50YWIgKyAiXSI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICJbIiArIGNvZGUgKyAiXSI7CiAgICAgIH0KICAgIH07CiAgICBBcnIucHJvdG90eXBlLmFzc2lnbnMgPSBmdW5jdGlvbihuYW1lKSB7CiAgICAgIHZhciBvYmosIF9pLCBfbGVuLCBfcmVmMjsKICAgICAgX3JlZjIgPSB0aGlzLm9iamVjdHM7CiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjIubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsKICAgICAgICBvYmogPSBfcmVmMltfaV07CiAgICAgICAgaWYgKG9iai5hc3NpZ25zKG5hbWUpKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfTsKICAgIHJldHVybiBBcnI7CiAgfSkoKTsKICBleHBvcnRzLkNsYXNzID0gQ2xhc3MgPSAoZnVuY3Rpb24oKSB7CiAgICBfX2V4dGVuZHMoQ2xhc3MsIEJhc2UpOwogICAgZnVuY3Rpb24gQ2xhc3ModmFyaWFibGUsIHBhcmVudCwgYm9keSkgewogICAgICB0aGlzLnZhcmlhYmxlID0gdmFyaWFibGU7CiAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwogICAgICB0aGlzLmJvZHkgPSBib2R5ICE9IG51bGwgPyBib2R5IDogbmV3IEJsb2NrOwogICAgICB0aGlzLmJvdW5kRnVuY3MgPSBbXTsKICAgICAgdGhpcy5ib2R5LmNsYXNzQm9keSA9IHRydWU7CiAgICB9CiAgICBDbGFzcy5wcm90b3R5cGUuY2hpbGRyZW4gPSBbJ3ZhcmlhYmxlJywgJ3BhcmVudCcsICdib2R5J107CiAgICBDbGFzcy5wcm90b3R5cGUuZGV0ZXJtaW5lTmFtZSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgZGVjbCwgdGFpbDsKICAgICAgaWYgKCF0aGlzLnZhcmlhYmxlKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgZGVjbCA9ICh0YWlsID0gbGFzdCh0aGlzLnZhcmlhYmxlLnByb3BlcnRpZXMpKSA/IHRhaWwgaW5zdGFuY2VvZiBBY2Nlc3MgJiYgdGFpbC5uYW1lLnZhbHVlIDogdGhpcy52YXJpYWJsZS5iYXNlLnZhbHVlOwogICAgICByZXR1cm4gZGVjbCAmJiAoZGVjbCA9IElERU5USUZJRVIudGVzdChkZWNsKSAmJiBkZWNsKTsKICAgIH07CiAgICBDbGFzcy5wcm90b3R5cGUuc2V0Q29udGV4dCA9IGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgcmV0dXJuIHRoaXMuYm9keS50cmF2ZXJzZUNoaWxkcmVuKGZhbHNlLCBmdW5jdGlvbihub2RlKSB7CiAgICAgICAgaWYgKG5vZGUuY2xhc3NCb2R5KSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgTGl0ZXJhbCAmJiBub2RlLnZhbHVlID09PSAndGhpcycpIHsKICAgICAgICAgIHJldHVybiBub2RlLnZhbHVlID0gbmFtZTsKICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDb2RlKSB7CiAgICAgICAgICBub2RlLmtsYXNzID0gbmFtZTsKICAgICAgICAgIGlmIChub2RlLmJvdW5kKSB7CiAgICAgICAgICAgIHJldHVybiBub2RlLmNvbnRleHQgPSBuYW1lOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9OwogICAgQ2xhc3MucHJvdG90eXBlLmFkZEJvdW5kRnVuY3Rpb25zID0gZnVuY3Rpb24obykgewogICAgICB2YXIgYm5hbWUsIGJ2YXIsIF9pLCBfbGVuLCBfcmVmMiwgX3Jlc3VsdHM7CiAgICAgIGlmICh0aGlzLmJvdW5kRnVuY3MubGVuZ3RoKSB7CiAgICAgICAgX3JlZjIgPSB0aGlzLmJvdW5kRnVuY3M7CiAgICAgICAgX3Jlc3VsdHMgPSBbXTsKICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYyLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7CiAgICAgICAgICBidmFyID0gX3JlZjJbX2ldOwogICAgICAgICAgYm5hbWUgPSBidmFyLmNvbXBpbGUobyk7CiAgICAgICAgICBfcmVzdWx0cy5wdXNoKHRoaXMuY3Rvci5ib2R5LnVuc2hpZnQobmV3IExpdGVyYWwoInRoaXMuIiArIGJuYW1lICsgIiA9ICIgKyAodXRpbGl0eSgnYmluZCcpKSArICIodGhpcy4iICsgYm5hbWUgKyAiLCB0aGlzKSIpKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfcmVzdWx0czsKICAgICAgfQogICAgfTsKICAgIENsYXNzLnByb3RvdHlwZS5hZGRQcm9wZXJ0aWVzID0gZnVuY3Rpb24obm9kZSwgbmFtZSwgbykgewogICAgICB2YXIgYXNzaWduLCBiYXNlLCBleHBycywgZnVuYywgcHJvcHM7CiAgICAgIHByb3BzID0gbm9kZS5iYXNlLnByb3BlcnRpZXMuc2xpY2UoMCk7CiAgICAgIGV4cHJzID0gKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBfcmVzdWx0czsKICAgICAgICBfcmVzdWx0cyA9IFtdOwogICAgICAgIHdoaWxlIChhc3NpZ24gPSBwcm9wcy5zaGlmdCgpKSB7CiAgICAgICAgICBpZiAoYXNzaWduIGluc3RhbmNlb2YgQXNzaWduKSB7CiAgICAgICAgICAgIGJhc2UgPSBhc3NpZ24udmFyaWFibGUuYmFzZTsKICAgICAgICAgICAgZGVsZXRlIGFzc2lnbi5jb250ZXh0OwogICAgICAgICAgICBmdW5jID0gYXNzaWduLnZhbHVlOwogICAgICAgICAgICBpZiAoYmFzZS52YWx1ZSA9PT0gJ2NvbnN0cnVjdG9yJykgewogICAgICAgICAgICAgIGlmICh0aGlzLmN0b3IpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IGRlZmluZSBtb3JlIHRoYW4gb25lIGNvbnN0cnVjdG9yIGluIGEgY2xhc3MnKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGZ1bmMuYm91bmQpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IGRlZmluZSBhIGNvbnN0cnVjdG9yIGFzIGEgYm91bmQgZnVuY3Rpb24nKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGZ1bmMgaW5zdGFuY2VvZiBDb2RlKSB7CiAgICAgICAgICAgICAgICBhc3NpZ24gPSB0aGlzLmN0b3IgPSBmdW5jOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLmV4dGVybmFsQ3RvciA9IG8uc2NvcGUuZnJlZVZhcmlhYmxlKCdjbGFzcycpOwogICAgICAgICAgICAgICAgYXNzaWduID0gbmV3IEFzc2lnbihuZXcgTGl0ZXJhbCh0aGlzLmV4dGVybmFsQ3RvciksIGZ1bmMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpZiAoIWFzc2lnbi52YXJpYWJsZVsidGhpcyJdKSB7CiAgICAgICAgICAgICAgICBhc3NpZ24udmFyaWFibGUgPSBuZXcgVmFsdWUobmV3IExpdGVyYWwobmFtZSksIFtuZXcgQWNjZXNzKGJhc2UsICdwcm90bycpXSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChmdW5jIGluc3RhbmNlb2YgQ29kZSAmJiBmdW5jLmJvdW5kKSB7CiAgICAgICAgICAgICAgICB0aGlzLmJvdW5kRnVuY3MucHVzaChiYXNlKTsKICAgICAgICAgICAgICAgIGZ1bmMuYm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIF9yZXN1bHRzLnB1c2goYXNzaWduKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9yZXN1bHRzOwogICAgICB9KS5jYWxsKHRoaXMpOwogICAgICByZXR1cm4gY29tcGFjdChleHBycyk7CiAgICB9OwogICAgQ2xhc3MucHJvdG90eXBlLndhbGtCb2R5ID0gZnVuY3Rpb24obmFtZSwgbykgewogICAgICByZXR1cm4gdGhpcy50cmF2ZXJzZUNoaWxkcmVuKGZhbHNlLCBfX2JpbmQoZnVuY3Rpb24oY2hpbGQpIHsKICAgICAgICB2YXIgZXhwcywgaSwgbm9kZSwgX2xlbiwgX3JlZjI7CiAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgQ2xhc3MpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgQmxvY2spIHsKICAgICAgICAgIF9yZWYyID0gZXhwcyA9IGNoaWxkLmV4cHJlc3Npb25zOwogICAgICAgICAgZm9yIChpID0gMCwgX2xlbiA9IF9yZWYyLmxlbmd0aDsgaSA8IF9sZW47IGkrKykgewogICAgICAgICAgICBub2RlID0gX3JlZjJbaV07CiAgICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgVmFsdWUgJiYgbm9kZS5pc09iamVjdCh0cnVlKSkgewogICAgICAgICAgICAgIGV4cHNbaV0gPSB0aGlzLmFkZFByb3BlcnRpZXMobm9kZSwgbmFtZSwgbyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBjaGlsZC5leHByZXNzaW9ucyA9IGV4cHMgPSBmbGF0dGVuKGV4cHMpOwogICAgICAgIH0KICAgICAgfSwgdGhpcykpOwogICAgfTsKICAgIENsYXNzLnByb3RvdHlwZS5lbnN1cmVDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgaWYgKCF0aGlzLmN0b3IpIHsKICAgICAgICB0aGlzLmN0b3IgPSBuZXcgQ29kZTsKICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHsKICAgICAgICAgIHRoaXMuY3Rvci5ib2R5LnB1c2gobmV3IExpdGVyYWwoIiIgKyBuYW1lICsgIi5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKSIpKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuZXh0ZXJuYWxDdG9yKSB7CiAgICAgICAgICB0aGlzLmN0b3IuYm9keS5wdXNoKG5ldyBMaXRlcmFsKCIiICsgdGhpcy5leHRlcm5hbEN0b3IgKyAiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykiKSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuYm9keS5leHByZXNzaW9ucy51bnNoaWZ0KHRoaXMuY3Rvcik7CiAgICAgIH0KICAgICAgdGhpcy5jdG9yLmN0b3IgPSB0aGlzLmN0b3IubmFtZSA9IG5hbWU7CiAgICAgIHRoaXMuY3Rvci5rbGFzcyA9IG51bGw7CiAgICAgIHJldHVybiB0aGlzLmN0b3Iubm9SZXR1cm4gPSB0cnVlOwogICAgfTsKICAgIENsYXNzLnByb3RvdHlwZS5jb21waWxlTm9kZSA9IGZ1bmN0aW9uKG8pIHsKICAgICAgdmFyIGRlY2wsIGtsYXNzLCBsbmFtZSwgbmFtZTsKICAgICAgZGVjbCA9IHRoaXMuZGV0ZXJtaW5lTmFtZSgpOwogICAgICBuYW1lID0gZGVjbCB8fCB0aGlzLm5hbWUgfHwgJ19DbGFzcyc7CiAgICAgIGxuYW1lID0gbmV3IExpdGVyYWwobmFtZSk7CiAgICAgIHRoaXMuc2V0Q29udGV4dChuYW1lKTsKICAgICAgdGhpcy53YWxrQm9keShuYW1lLCBvKTsKICAgICAgdGhpcy5lbnN1cmVDb25zdHJ1Y3RvcihuYW1lKTsKICAgICAgaWYgKHRoaXMucGFyZW50KSB7CiAgICAgICAgdGhpcy5ib2R5LmV4cHJlc3Npb25zLnVuc2hpZnQobmV3IEV4dGVuZHMobG5hbWUsIHRoaXMucGFyZW50KSk7CiAgICAgIH0KICAgICAgaWYgKCEodGhpcy5jdG9yIGluc3RhbmNlb2YgQ29kZSkpIHsKICAgICAgICB0aGlzLmJvZHkuZXhwcmVzc2lvbnMudW5zaGlmdCh0aGlzLmN0b3IpOwogICAgICB9CiAgICAgIHRoaXMuYm9keS5leHByZXNzaW9ucy5wdXNoKGxuYW1lKTsKICAgICAgdGhpcy5hZGRCb3VuZEZ1bmN0aW9ucyhvKTsKICAgICAga2xhc3MgPSBuZXcgUGFyZW5zKENsb3N1cmUud3JhcCh0aGlzLmJvZHkpLCB0cnVlKTsKICAgICAgaWYgKHRoaXMudmFyaWFibGUpIHsKICAgICAgICBrbGFzcyA9IG5ldyBBc3NpZ24odGhpcy52YXJpYWJsZSwga2xhc3MpOwogICAgICB9CiAgICAgIHJldHVybiBrbGFzcy5jb21waWxlKG8pOwogICAgfTsKICAgIHJldHVybiBDbGFzczsKICB9KSgpOwogIGV4cG9ydHMuQXNzaWduID0gQXNzaWduID0gKGZ1bmN0aW9uKCkgewogICAgX19leHRlbmRzKEFzc2lnbiwgQmFzZSk7CiAgICBmdW5jdGlvbiBBc3NpZ24odmFyaWFibGUsIHZhbHVlLCBjb250ZXh0LCBvcHRpb25zKSB7CiAgICAgIHRoaXMudmFyaWFibGUgPSB2YXJpYWJsZTsKICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwogICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwogICAgICB0aGlzLnBhcmFtID0gb3B0aW9ucyAmJiBvcHRpb25zLnBhcmFtOwogICAgfQogICAgQXNzaWduLnByb3RvdHlwZS5jaGlsZHJlbiA9IFsndmFyaWFibGUnLCAndmFsdWUnXTsKICAgIEFzc2lnbi5wcm90b3R5cGUuYXNzaWducyA9IGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgcmV0dXJuIHRoaXNbdGhpcy5jb250ZXh0ID09PSAnb2JqZWN0JyA/ICd2YWx1ZScgOiAndmFyaWFibGUnXS5hc3NpZ25zKG5hbWUpOwogICAgfTsKICAgIEFzc2lnbi5wcm90b3R5cGUudW5mb2xkU29hayA9IGZ1bmN0aW9uKG8pIHsKICAgICAgcmV0dXJuIHVuZm9sZFNvYWsobywgdGhpcywgJ3ZhcmlhYmxlJyk7CiAgICB9OwogICAgQXNzaWduLnByb3RvdHlwZS5jb21waWxlTm9kZSA9IGZ1bmN0aW9uKG8pIHsKICAgICAgdmFyIGlzVmFsdWUsIG1hdGNoLCBuYW1lLCB2YWwsIF9yZWYyOwogICAgICBpZiAoaXNWYWx1ZSA9IHRoaXMudmFyaWFibGUgaW5zdGFuY2VvZiBWYWx1ZSkgewogICAgICAgIGlmICh0aGlzLnZhcmlhYmxlLmlzQXJyYXkoKSB8fCB0aGlzLnZhcmlhYmxlLmlzT2JqZWN0KCkpIHsKICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVQYXR0ZXJuTWF0Y2gobyk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLnZhcmlhYmxlLmlzU3BsaWNlKCkpIHsKICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVTcGxpY2Uobyk7CiAgICAgICAgfQogICAgICAgIGlmICgoX3JlZjIgPSB0aGlzLmNvbnRleHQpID09PSAnfHw9JyB8fCBfcmVmMiA9PT0gJyYmPScgfHwgX3JlZjIgPT09ICc/PScpIHsKICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVDb25kaXRpb25hbChvKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgbmFtZSA9IHRoaXMudmFyaWFibGUuY29tcGlsZShvLCBMRVZFTF9MSVNUKTsKICAgICAgaWYgKCEodGhpcy5jb250ZXh0IHx8IHRoaXMudmFyaWFibGUuaXNBc3NpZ25hYmxlKCkpKSB7CiAgICAgICAgdGhyb3cgU3ludGF4RXJyb3IoIlwiIiArICh0aGlzLnZhcmlhYmxlLmNvbXBpbGUobykpICsgIlwiIGNhbm5vdCBiZSBhc3NpZ25lZC4iKTsKICAgICAgfQogICAgICBpZiAoISh0aGlzLmNvbnRleHQgfHwgaXNWYWx1ZSAmJiAodGhpcy52YXJpYWJsZS5uYW1lc3BhY2VkIHx8IHRoaXMudmFyaWFibGUuaGFzUHJvcGVydGllcygpKSkpIHsKICAgICAgICBpZiAodGhpcy5wYXJhbSkgewogICAgICAgICAgby5zY29wZS5hZGQobmFtZSwgJ3ZhcicpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBvLnNjb3BlLmZpbmQobmFtZSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh0aGlzLnZhbHVlIGluc3RhbmNlb2YgQ29kZSAmJiAobWF0Y2ggPSBNRVRIT0RfREVGLmV4ZWMobmFtZSkpKSB7CiAgICAgICAgdGhpcy52YWx1ZS5uYW1lID0gbWF0Y2hbMl07CiAgICAgICAgaWYgKG1hdGNoWzFdKSB7CiAgICAgICAgICB0aGlzLnZhbHVlLmtsYXNzID0gbWF0Y2hbMV07CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhbCA9IHRoaXMudmFsdWUuY29tcGlsZShvLCBMRVZFTF9MSVNUKTsKICAgICAgaWYgKHRoaXMuY29udGV4dCA9PT0gJ29iamVjdCcpIHsKICAgICAgICByZXR1cm4gIiIgKyBuYW1lICsgIjogIiArIHZhbDsKICAgICAgfQogICAgICB2YWwgPSBuYW1lICsgKCIgIiArICh0aGlzLmNvbnRleHQgfHwgJz0nKSArICIgIikgKyB2YWw7CiAgICAgIGlmIChvLmxldmVsIDw9IExFVkVMX0xJU1QpIHsKICAgICAgICByZXR1cm4gdmFsOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAiKCIgKyB2YWwgKyAiKSI7CiAgICAgIH0KICAgIH07CiAgICBBc3NpZ24ucHJvdG90eXBlLmNvbXBpbGVQYXR0ZXJuTWF0Y2ggPSBmdW5jdGlvbihvKSB7CiAgICAgIHZhciBhY2MsIGFzc2lnbnMsIGNvZGUsIGksIGlkeCwgaXNPYmplY3QsIGl2YXIsIG9iaiwgb2JqZWN0cywgb2xlbiwgcmVmLCByZXN0LCBzcGxhdCwgdG9wLCB2YWwsIHZhbHVlLCB2dmFyLCBfbGVuLCBfcmVmMiwgX3JlZjMsIF9yZWY0LCBfcmVmNTsKICAgICAgdG9wID0gby5sZXZlbCA9PT0gTEVWRUxfVE9QOwogICAgICB2YWx1ZSA9IHRoaXMudmFsdWU7CiAgICAgIG9iamVjdHMgPSB0aGlzLnZhcmlhYmxlLmJhc2Uub2JqZWN0czsKICAgICAgaWYgKCEob2xlbiA9IG9iamVjdHMubGVuZ3RoKSkgewogICAgICAgIGNvZGUgPSB2YWx1ZS5jb21waWxlKG8pOwogICAgICAgIGlmIChvLmxldmVsID49IExFVkVMX09QKSB7CiAgICAgICAgICByZXR1cm4gIigiICsgY29kZSArICIpIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGNvZGU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlzT2JqZWN0ID0gdGhpcy52YXJpYWJsZS5pc09iamVjdCgpOwogICAgICBpZiAodG9wICYmIG9sZW4gPT09IDEgJiYgISgob2JqID0gb2JqZWN0c1swXSkgaW5zdGFuY2VvZiBTcGxhdCkpIHsKICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQXNzaWduKSB7CiAgICAgICAgICBfcmVmMiA9IG9iaiwgaWR4ID0gX3JlZjIudmFyaWFibGUuYmFzZSwgb2JqID0gX3JlZjIudmFsdWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChvYmouYmFzZSBpbnN0YW5jZW9mIFBhcmVucykgewogICAgICAgICAgICBfcmVmMyA9IG5ldyBWYWx1ZShvYmoudW53cmFwQWxsKCkpLmNhY2hlUmVmZXJlbmNlKG8pLCBvYmogPSBfcmVmM1swXSwgaWR4ID0gX3JlZjNbMV07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZHggPSBpc09iamVjdCA/IG9ialsidGhpcyJdID8gb2JqLnByb3BlcnRpZXNbMF0ubmFtZSA6IG9iaiA6IG5ldyBMaXRlcmFsKDApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBhY2MgPSBJREVOVElGSUVSLnRlc3QoaWR4LnVud3JhcCgpLnZhbHVlIHx8IDApOwogICAgICAgIHZhbHVlID0gbmV3IFZhbHVlKHZhbHVlKTsKICAgICAgICB2YWx1ZS5wcm9wZXJ0aWVzLnB1c2gobmV3IChhY2MgPyBBY2Nlc3MgOiBJbmRleCkoaWR4KSk7CiAgICAgICAgcmV0dXJuIG5ldyBBc3NpZ24ob2JqLCB2YWx1ZSwgbnVsbCwgewogICAgICAgICAgcGFyYW06IHRoaXMucGFyYW0KICAgICAgICB9KS5jb21waWxlKG8sIExFVkVMX1RPUCk7CiAgICAgIH0KICAgICAgdnZhciA9IHZhbHVlLmNvbXBpbGUobywgTEVWRUxfTElTVCk7CiAgICAgIGFzc2lnbnMgPSBbXTsKICAgICAgc3BsYXQgPSBmYWxzZTsKICAgICAgaWYgKCFJREVOVElGSUVSLnRlc3QodnZhcikgfHwgdGhpcy52YXJpYWJsZS5hc3NpZ25zKHZ2YXIpKSB7CiAgICAgICAgYXNzaWducy5wdXNoKCIiICsgKHJlZiA9IG8uc2NvcGUuZnJlZVZhcmlhYmxlKCdyZWYnKSkgKyAiID0gIiArIHZ2YXIpOwogICAgICAgIHZ2YXIgPSByZWY7CiAgICAgIH0KICAgICAgZm9yIChpID0gMCwgX2xlbiA9IG9iamVjdHMubGVuZ3RoOyBpIDwgX2xlbjsgaSsrKSB7CiAgICAgICAgb2JqID0gb2JqZWN0c1tpXTsKICAgICAgICBpZHggPSBpOwogICAgICAgIGlmIChpc09iamVjdCkgewogICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEFzc2lnbikgewogICAgICAgICAgICBfcmVmNCA9IG9iaiwgaWR4ID0gX3JlZjQudmFyaWFibGUuYmFzZSwgb2JqID0gX3JlZjQudmFsdWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAob2JqLmJhc2UgaW5zdGFuY2VvZiBQYXJlbnMpIHsKICAgICAgICAgICAgICBfcmVmNSA9IG5ldyBWYWx1ZShvYmoudW53cmFwQWxsKCkpLmNhY2hlUmVmZXJlbmNlKG8pLCBvYmogPSBfcmVmNVswXSwgaWR4ID0gX3JlZjVbMV07CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgaWR4ID0gb2JqWyJ0aGlzIl0gPyBvYmoucHJvcGVydGllc1swXS5uYW1lIDogb2JqOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghc3BsYXQgJiYgb2JqIGluc3RhbmNlb2YgU3BsYXQpIHsKICAgICAgICAgIHZhbCA9ICIiICsgb2xlbiArICIgPD0gIiArIHZ2YXIgKyAiLmxlbmd0aCA/ICIgKyAodXRpbGl0eSgnc2xpY2UnKSkgKyAiLmNhbGwoIiArIHZ2YXIgKyAiLCAiICsgaTsKICAgICAgICAgIGlmIChyZXN0ID0gb2xlbiAtIGkgLSAxKSB7CiAgICAgICAgICAgIGl2YXIgPSBvLnNjb3BlLmZyZWVWYXJpYWJsZSgnaScpOwogICAgICAgICAgICB2YWwgKz0gIiwgIiArIGl2YXIgKyAiID0gIiArIHZ2YXIgKyAiLmxlbmd0aCAtICIgKyByZXN0ICsgIikgOiAoIiArIGl2YXIgKyAiID0gIiArIGkgKyAiLCBbXSkiOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFsICs9ICIpIDogW10iOwogICAgICAgICAgfQogICAgICAgICAgdmFsID0gbmV3IExpdGVyYWwodmFsKTsKICAgICAgICAgIHNwbGF0ID0gIiIgKyBpdmFyICsgIisrIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFNwbGF0KSB7CiAgICAgICAgICAgIG9iaiA9IG9iai5uYW1lLmNvbXBpbGUobyk7CiAgICAgICAgICAgIHRocm93IFN5bnRheEVycm9yKCJtdWx0aXBsZSBzcGxhdHMgYXJlIGRpc2FsbG93ZWQgaW4gYW4gYXNzaWdubWVudDogIiArIG9iaiArICIgLi4uIik7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodHlwZW9mIGlkeCA9PT0gJ251bWJlcicpIHsKICAgICAgICAgICAgaWR4ID0gbmV3IExpdGVyYWwoc3BsYXQgfHwgaWR4KTsKICAgICAgICAgICAgYWNjID0gZmFsc2U7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhY2MgPSBpc09iamVjdCAmJiBJREVOVElGSUVSLnRlc3QoaWR4LnVud3JhcCgpLnZhbHVlIHx8IDApOwogICAgICAgICAgfQogICAgICAgICAgdmFsID0gbmV3IFZhbHVlKG5ldyBMaXRlcmFsKHZ2YXIpLCBbbmV3IChhY2MgPyBBY2Nlc3MgOiBJbmRleCkoaWR4KV0pOwogICAgICAgIH0KICAgICAgICBhc3NpZ25zLnB1c2gobmV3IEFzc2lnbihvYmosIHZhbCwgbnVsbCwgewogICAgICAgICAgcGFyYW06IHRoaXMucGFyYW0KICAgICAgICB9KS5jb21waWxlKG8sIExFVkVMX1RPUCkpOwogICAgICB9CiAgICAgIGlmICghdG9wKSB7CiAgICAgICAgYXNzaWducy5wdXNoKHZ2YXIpOwogICAgICB9CiAgICAgIGNvZGUgPSBhc3NpZ25zLmpvaW4oJywgJyk7CiAgICAgIGlmIChvLmxldmVsIDwgTEVWRUxfTElTVCkgewogICAgICAgIHJldHVybiBjb2RlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAiKCIgKyBjb2RlICsgIikiOwogICAgICB9CiAgICB9OwogICAgQXNzaWduLnByb3RvdHlwZS5jb21waWxlQ29uZGl0aW9uYWwgPSBmdW5jdGlvbihvKSB7CiAgICAgIHZhciBsZWZ0LCByaXRlLCBfcmVmMjsKICAgICAgX3JlZjIgPSB0aGlzLnZhcmlhYmxlLmNhY2hlUmVmZXJlbmNlKG8pLCBsZWZ0ID0gX3JlZjJbMF0sIHJpdGUgPSBfcmVmMlsxXTsKICAgICAgaWYgKF9faW5kZXhPZi5jYWxsKHRoaXMuY29udGV4dCwgIj8iKSA+PSAwKSB7CiAgICAgICAgby5pc0V4aXN0ZW50aWFsRXF1YWxzID0gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IE9wKHRoaXMuY29udGV4dC5zbGljZSgwLCAtMSksIGxlZnQsIG5ldyBBc3NpZ24ocml0ZSwgdGhpcy52YWx1ZSwgJz0nKSkuY29tcGlsZShvKTsKICAgIH07CiAgICBBc3NpZ24ucHJvdG90eXBlLmNvbXBpbGVTcGxpY2UgPSBmdW5jdGlvbihvKSB7CiAgICAgIHZhciBjb2RlLCBleGNsdXNpdmUsIGZyb20sIGZyb21EZWNsLCBmcm9tUmVmLCBuYW1lLCB0bywgdmFsRGVmLCB2YWxSZWYsIF9yZWYyLCBfcmVmMywgX3JlZjQ7CiAgICAgIF9yZWYyID0gdGhpcy52YXJpYWJsZS5wcm9wZXJ0aWVzLnBvcCgpLnJhbmdlLCBmcm9tID0gX3JlZjIuZnJvbSwgdG8gPSBfcmVmMi50bywgZXhjbHVzaXZlID0gX3JlZjIuZXhjbHVzaXZlOwogICAgICBuYW1lID0gdGhpcy52YXJpYWJsZS5jb21waWxlKG8pOwogICAgICBfcmVmMyA9IChmcm9tICE9IG51bGwgPyBmcm9tLmNhY2hlKG8sIExFVkVMX09QKSA6IHZvaWQgMCkgfHwgWycwJywgJzAnXSwgZnJvbURlY2wgPSBfcmVmM1swXSwgZnJvbVJlZiA9IF9yZWYzWzFdOwogICAgICBpZiAodG8pIHsKICAgICAgICBpZiAoKGZyb20gIT0gbnVsbCA/IGZyb20uaXNTaW1wbGVOdW1iZXIoKSA6IHZvaWQgMCkgJiYgdG8uaXNTaW1wbGVOdW1iZXIoKSkgewogICAgICAgICAgdG8gPSArdG8uY29tcGlsZShvKSAtICtmcm9tUmVmOwogICAgICAgICAgaWYgKCFleGNsdXNpdmUpIHsKICAgICAgICAgICAgdG8gKz0gMTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdG8gPSB0by5jb21waWxlKG8pICsgJyAtICcgKyBmcm9tUmVmOwogICAgICAgICAgaWYgKCFleGNsdXNpdmUpIHsKICAgICAgICAgICAgdG8gKz0gJyArIDEnOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB0byA9ICI5ZTkiOwogICAgICB9CiAgICAgIF9yZWY0ID0gdGhpcy52YWx1ZS5jYWNoZShvLCBMRVZFTF9MSVNUKSwgdmFsRGVmID0gX3JlZjRbMF0sIHZhbFJlZiA9IF9yZWY0WzFdOwogICAgICBjb2RlID0gIltdLnNwbGljZS5hcHBseSgiICsgbmFtZSArICIsIFsiICsgZnJvbURlY2wgKyAiLCAiICsgdG8gKyAiXS5jb25jYXQoIiArIHZhbERlZiArICIpKSwgIiArIHZhbFJlZjsKICAgICAgaWYgKG8ubGV2ZWwgPiBMRVZFTF9UT1ApIHsKICAgICAgICByZXR1cm4gIigiICsgY29kZSArICIpIjsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gY29kZTsKICAgICAgfQogICAgfTsKICAgIHJldHVybiBBc3NpZ247CiAgfSkoKTsKICBleHBvcnRzLkNvZGUgPSBDb2RlID0gKGZ1bmN0aW9uKCkgewogICAgX19leHRlbmRzKENvZGUsIEJhc2UpOwogICAgZnVuY3Rpb24gQ29kZShwYXJhbXMsIGJvZHksIHRhZykgewogICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcyB8fCBbXTsKICAgICAgdGhpcy5ib2R5ID0gYm9keSB8fCBuZXcgQmxvY2s7CiAgICAgIHRoaXMuYm91bmQgPSB0YWcgPT09ICdib3VuZGZ1bmMnOwogICAgICBpZiAodGhpcy5ib3VuZCkgewogICAgICAgIHRoaXMuY29udGV4dCA9ICd0aGlzJzsKICAgICAgfQogICAgfQogICAgQ29kZS5wcm90b3R5cGUuY2hpbGRyZW4gPSBbJ3BhcmFtcycsICdib2R5J107CiAgICBDb2RlLnByb3RvdHlwZS5pc1N0YXRlbWVudCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gISF0aGlzLmN0b3I7CiAgICB9OwogICAgQ29kZS5wcm90b3R5cGUuanVtcHMgPSBOTzsKICAgIENvZGUucHJvdG90eXBlLmNvbXBpbGVOb2RlID0gZnVuY3Rpb24obykgewogICAgICB2YXIgY29kZSwgZXhwcnMsIGksIGlkdCwgbGl0LCBwLCBwYXJhbSwgcmVmLCBzcGxhdHMsIHYsIHZhbCwgdmFycywgd2FzRW1wdHksIF9pLCBfaiwgX2ssIF9sZW4sIF9sZW4yLCBfbGVuMywgX2xlbjQsIF9yZWYyLCBfcmVmMywgX3JlZjQsIF9yZWY1OwogICAgICBvLnNjb3BlID0gbmV3IFNjb3BlKG8uc2NvcGUsIHRoaXMuYm9keSwgdGhpcyk7CiAgICAgIG8uc2NvcGUuc2hhcmVkID0gZGVsKG8sICdzaGFyZWRTY29wZScpOwogICAgICBvLmluZGVudCArPSBUQUI7CiAgICAgIGRlbGV0ZSBvLmJhcmU7CiAgICAgIHZhcnMgPSBbXTsKICAgICAgZXhwcnMgPSBbXTsKICAgICAgX3JlZjIgPSB0aGlzLnBhcmFtczsKICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmMi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgewogICAgICAgIHBhcmFtID0gX3JlZjJbX2ldOwogICAgICAgIGlmIChwYXJhbS5zcGxhdCkgewogICAgICAgICAgX3JlZjMgPSB0aGlzLnBhcmFtczsKICAgICAgICAgIGZvciAoX2ogPSAwLCBfbGVuMiA9IF9yZWYzLmxlbmd0aDsgX2ogPCBfbGVuMjsgX2orKykgewogICAgICAgICAgICBwID0gX3JlZjNbX2pdOwogICAgICAgICAgICBpZiAocC5uYW1lLnZhbHVlKSB7CiAgICAgICAgICAgICAgby5zY29wZS5hZGQocC5uYW1lLnZhbHVlLCAndmFyJywgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHNwbGF0cyA9IG5ldyBBc3NpZ24obmV3IFZhbHVlKG5ldyBBcnIoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgX2ssIF9sZW4zLCBfcmVmNCwgX3Jlc3VsdHM7CiAgICAgICAgICAgIF9yZWY0ID0gdGhpcy5wYXJhbXM7CiAgICAgICAgICAgIF9yZXN1bHRzID0gW107CiAgICAgICAgICAgIGZvciAoX2sgPSAwLCBfbGVuMyA9IF9yZWY0Lmxlbmd0aDsgX2sgPCBfbGVuMzsgX2srKykgewogICAgICAgICAgICAgIHAgPSBfcmVmNFtfa107CiAgICAgICAgICAgICAgX3Jlc3VsdHMucHVzaChwLmFzUmVmZXJlbmNlKG8pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gX3Jlc3VsdHM7CiAgICAgICAgICB9KS5jYWxsKHRoaXMpKSksIG5ldyBWYWx1ZShuZXcgTGl0ZXJhbCgnYXJndW1lbnRzJykpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBfcmVmNCA9IHRoaXMucGFyYW1zOwogICAgICBmb3IgKF9rID0gMCwgX2xlbjMgPSBfcmVmNC5sZW5ndGg7IF9rIDwgX2xlbjM7IF9rKyspIHsKICAgICAgICBwYXJhbSA9IF9yZWY0W19rXTsKICAgICAgICBpZiAocGFyYW0uaXNDb21wbGV4KCkpIHsKICAgICAgICAgIHZhbCA9IHJlZiA9IHBhcmFtLmFzUmVmZXJlbmNlKG8pOwogICAgICAgICAgaWYgKHBhcmFtLnZhbHVlKSB7CiAgICAgICAgICAgIHZhbCA9IG5ldyBPcCgnPycsIHJlZiwgcGFyYW0udmFsdWUpOwogICAgICAgICAgfQogICAgICAgICAgZXhwcnMucHVzaChuZXcgQXNzaWduKG5ldyBWYWx1ZShwYXJhbS5uYW1lKSwgdmFsLCAnPScsIHsKICAgICAgICAgICAgcGFyYW06IHRydWUKICAgICAgICAgIH0pKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVmID0gcGFyYW07CiAgICAgICAgICBpZiAocGFyYW0udmFsdWUpIHsKICAgICAgICAgICAgbGl0ID0gbmV3IExpdGVyYWwocmVmLm5hbWUudmFsdWUgKyAnID09IG51bGwnKTsKICAgICAgICAgICAgdmFsID0gbmV3IEFzc2lnbihuZXcgVmFsdWUocGFyYW0ubmFtZSksIHBhcmFtLnZhbHVlLCAnPScpOwogICAgICAgICAgICBleHBycy5wdXNoKG5ldyBJZihsaXQsIHZhbCkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIXNwbGF0cykgewogICAgICAgICAgdmFycy5wdXNoKHJlZik7CiAgICAgICAgfQogICAgICB9CiAgICAgIHdhc0VtcHR5ID0gdGhpcy5ib2R5LmlzRW1wdHkoKTsKICAgICAgaWYgKHNwbGF0cykgewogICAgICAgIGV4cHJzLnVuc2hpZnQoc3BsYXRzKTsKICAgICAgfQogICAgICBpZiAoZXhwcnMubGVuZ3RoKSB7CiAgICAgICAgKF9yZWY1ID0gdGhpcy5ib2R5LmV4cHJlc3Npb25zKS51bnNoaWZ0LmFwcGx5KF9yZWY1LCBleHBycyk7CiAgICAgIH0KICAgICAgaWYgKCFzcGxhdHMpIHsKICAgICAgICBmb3IgKGkgPSAwLCBfbGVuNCA9IHZhcnMubGVuZ3RoOyBpIDwgX2xlbjQ7IGkrKykgewogICAgICAgICAgdiA9IHZhcnNbaV07CiAgICAgICAgICBvLnNjb3BlLnBhcmFtZXRlcih2YXJzW2ldID0gdi5jb21waWxlKG8pKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCEod2FzRW1wdHkgfHwgdGhpcy5ub1JldHVybikpIHsKICAgICAgICB0aGlzLmJvZHkubWFrZVJldHVybigpOwogICAgICB9CiAgICAgIGlkdCA9IG8uaW5kZW50OwogICAgICBjb2RlID0gJ2Z1bmN0aW9uJzsKICAgICAgaWYgKHRoaXMuY3RvcikgewogICAgICAgIGNvZGUgKz0gJyAnICsgdGhpcy5uYW1lOwogICAgICB9CiAgICAgIGNvZGUgKz0gJygnICsgdmFycy5qb2luKCcsICcpICsgJykgeyc7CiAgICAgIGlmICghdGhpcy5ib2R5LmlzRW1wdHkoKSkgewogICAgICAgIGNvZGUgKz0gIlxuIiArICh0aGlzLmJvZHkuY29tcGlsZVdpdGhEZWNsYXJhdGlvbnMobykpICsgIlxuIiArIHRoaXMudGFiOwogICAgICB9CiAgICAgIGNvZGUgKz0gJ30nOwogICAgICBpZiAodGhpcy5jdG9yKSB7CiAgICAgICAgcmV0dXJuIHRoaXMudGFiICsgY29kZTsKICAgICAgfQogICAgICBpZiAodGhpcy5ib3VuZCkgewogICAgICAgIHJldHVybiB1dGlsaXR5KCdiaW5kJykgKyAoIigiICsgY29kZSArICIsICIgKyB0aGlzLmNvbnRleHQgKyAiKSIpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmZyb250IHx8IChvLmxldmVsID49IExFVkVMX0FDQ0VTUykpIHsKICAgICAgICByZXR1cm4gIigiICsgY29kZSArICIpIjsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gY29kZTsKICAgICAgfQogICAgfTsKICAgIENvZGUucHJvdG90eXBlLnRyYXZlcnNlQ2hpbGRyZW4gPSBmdW5jdGlvbihjcm9zc1Njb3BlLCBmdW5jKSB7CiAgICAgIGlmIChjcm9zc1Njb3BlKSB7CiAgICAgICAgcmV0dXJuIENvZGUuX19zdXBlcl9fLnRyYXZlcnNlQ2hpbGRyZW4uY2FsbCh0aGlzLCBjcm9zc1Njb3BlLCBmdW5jKTsKICAgICAgfQogICAgfTsKICAgIHJldHVybiBDb2RlOwogIH0pKCk7CiAgZXhwb3J0cy5QYXJhbSA9IFBhcmFtID0gKGZ1bmN0aW9uKCkgewogICAgX19leHRlbmRzKFBhcmFtLCBCYXNlKTsKICAgIGZ1bmN0aW9uIFBhcmFtKG5hbWUsIHZhbHVlLCBzcGxhdCkgewogICAgICB0aGlzLm5hbWUgPSBuYW1lOwogICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CiAgICAgIHRoaXMuc3BsYXQgPSBzcGxhdDsKICAgIH0KICAgIFBhcmFtLnByb3RvdHlwZS5jaGlsZHJlbiA9IFsnbmFtZScsICd2YWx1ZSddOwogICAgUGFyYW0ucHJvdG90eXBlLmNvbXBpbGUgPSBmdW5jdGlvbihvKSB7CiAgICAgIHJldHVybiB0aGlzLm5hbWUuY29tcGlsZShvLCBMRVZFTF9MSVNUKTsKICAgIH07CiAgICBQYXJhbS5wcm90b3R5cGUuYXNSZWZlcmVuY2UgPSBmdW5jdGlvbihvKSB7CiAgICAgIHZhciBub2RlOwogICAgICBpZiAodGhpcy5yZWZlcmVuY2UpIHsKICAgICAgICByZXR1cm4gdGhpcy5yZWZlcmVuY2U7CiAgICAgIH0KICAgICAgbm9kZSA9IHRoaXMubmFtZTsKICAgICAgaWYgKG5vZGVbInRoaXMiXSkgewogICAgICAgIG5vZGUgPSBub2RlLnByb3BlcnRpZXNbMF0ubmFtZTsKICAgICAgICBpZiAobm9kZS52YWx1ZS5yZXNlcnZlZCkgewogICAgICAgICAgbm9kZSA9IG5ldyBMaXRlcmFsKCdfJyArIG5vZGUudmFsdWUpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChub2RlLmlzQ29tcGxleCgpKSB7CiAgICAgICAgbm9kZSA9IG5ldyBMaXRlcmFsKG8uc2NvcGUuZnJlZVZhcmlhYmxlKCdhcmcnKSk7CiAgICAgIH0KICAgICAgbm9kZSA9IG5ldyBWYWx1ZShub2RlKTsKICAgICAgaWYgKHRoaXMuc3BsYXQpIHsKICAgICAgICBub2RlID0gbmV3IFNwbGF0KG5vZGUpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZSA9IG5vZGU7CiAgICB9OwogICAgUGFyYW0ucHJvdG90eXBlLmlzQ29tcGxleCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5uYW1lLmlzQ29tcGxleCgpOwogICAgfTsKICAgIHJldHVybiBQYXJhbTsKICB9KSgpOwogIGV4cG9ydHMuU3BsYXQgPSBTcGxhdCA9IChmdW5jdGlvbigpIHsKICAgIF9fZXh0ZW5kcyhTcGxhdCwgQmFzZSk7CiAgICBTcGxhdC5wcm90b3R5cGUuY2hpbGRyZW4gPSBbJ25hbWUnXTsKICAgIFNwbGF0LnByb3RvdHlwZS5pc0Fzc2lnbmFibGUgPSBZRVM7CiAgICBmdW5jdGlvbiBTcGxhdChuYW1lKSB7CiAgICAgIHRoaXMubmFtZSA9IG5hbWUuY29tcGlsZSA/IG5hbWUgOiBuZXcgTGl0ZXJhbChuYW1lKTsKICAgIH0KICAgIFNwbGF0LnByb3RvdHlwZS5hc3NpZ25zID0gZnVuY3Rpb24obmFtZSkgewogICAgICByZXR1cm4gdGhpcy5uYW1lLmFzc2lnbnMobmFtZSk7CiAgICB9OwogICAgU3BsYXQucHJvdG90eXBlLmNvbXBpbGUgPSBmdW5jdGlvbihvKSB7CiAgICAgIGlmICh0aGlzLmluZGV4ICE9IG51bGwpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb21waWxlUGFyYW0obyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHRoaXMubmFtZS5jb21waWxlKG8pOwogICAgICB9CiAgICB9OwogICAgU3BsYXQuY29tcGlsZVNwbGF0dGVkQXJyYXkgPSBmdW5jdGlvbihvLCBsaXN0LCBhcHBseSkgewogICAgICB2YXIgYXJncywgYmFzZSwgY29kZSwgaSwgaW5kZXgsIG5vZGUsIF9sZW47CiAgICAgIGluZGV4ID0gLTE7CiAgICAgIHdoaWxlICgobm9kZSA9IGxpc3RbKytpbmRleF0pICYmICEobm9kZSBpbnN0YW5jZW9mIFNwbGF0KSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChpbmRleCA+PSBsaXN0Lmxlbmd0aCkgewogICAgICAgIHJldHVybiAnJzsKICAgICAgfQogICAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpIHsKICAgICAgICBjb2RlID0gbGlzdFswXS5jb21waWxlKG8sIExFVkVMX0xJU1QpOwogICAgICAgIGlmIChhcHBseSkgewogICAgICAgICAgcmV0dXJuIGNvZGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiAiIiArICh1dGlsaXR5KCdzbGljZScpKSArICIuY2FsbCgiICsgY29kZSArICIpIjsKICAgICAgfQogICAgICBhcmdzID0gbGlzdC5zbGljZShpbmRleCk7CiAgICAgIGZvciAoaSA9IDAsIF9sZW4gPSBhcmdzLmxlbmd0aDsgaSA8IF9sZW47IGkrKykgewogICAgICAgIG5vZGUgPSBhcmdzW2ldOwogICAgICAgIGNvZGUgPSBub2RlLmNvbXBpbGUobywgTEVWRUxfTElTVCk7CiAgICAgICAgYXJnc1tpXSA9IG5vZGUgaW5zdGFuY2VvZiBTcGxhdCA/ICIiICsgKHV0aWxpdHkoJ3NsaWNlJykpICsgIi5jYWxsKCIgKyBjb2RlICsgIikiIDogIlsiICsgY29kZSArICJdIjsKICAgICAgfQogICAgICBpZiAoaW5kZXggPT09IDApIHsKICAgICAgICByZXR1cm4gYXJnc1swXSArICgiLmNvbmNhdCgiICsgKGFyZ3Muc2xpY2UoMSkuam9pbignLCAnKSkgKyAiKSIpOwogICAgICB9CiAgICAgIGJhc2UgPSAoZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIF9pLCBfbGVuMiwgX3JlZjIsIF9yZXN1bHRzOwogICAgICAgIF9yZWYyID0gbGlzdC5zbGljZSgwLCBpbmRleCk7CiAgICAgICAgX3Jlc3VsdHMgPSBbXTsKICAgICAgICBmb3IgKF9pID0gMCwgX2xlbjIgPSBfcmVmMi5sZW5ndGg7IF9pIDwgX2xlbjI7IF9pKyspIHsKICAgICAgICAgIG5vZGUgPSBfcmVmMltfaV07CiAgICAgICAgICBfcmVzdWx0cy5wdXNoKG5vZGUuY29tcGlsZShvLCBMRVZFTF9MSVNUKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfcmVzdWx0czsKICAgICAgfSkoKTsKICAgICAgcmV0dXJuICJbIiArIChiYXNlLmpvaW4oJywgJykpICsgIl0uY29uY2F0KCIgKyAoYXJncy5qb2luKCcsICcpKSArICIpIjsKICAgIH07CiAgICByZXR1cm4gU3BsYXQ7CiAgfSkoKTsKICBleHBvcnRzLldoaWxlID0gV2hpbGUgPSAoZnVuY3Rpb24oKSB7CiAgICBfX2V4dGVuZHMoV2hpbGUsIEJhc2UpOwogICAgZnVuY3Rpb24gV2hpbGUoY29uZGl0aW9uLCBvcHRpb25zKSB7CiAgICAgIHRoaXMuY29uZGl0aW9uID0gKG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMuaW52ZXJ0IDogdm9pZCAwKSA/IGNvbmRpdGlvbi5pbnZlcnQoKSA6IGNvbmRpdGlvbjsKICAgICAgdGhpcy5ndWFyZCA9IG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMuZ3VhcmQgOiB2b2lkIDA7CiAgICB9CiAgICBXaGlsZS5wcm90b3R5cGUuY2hpbGRyZW4gPSBbJ2NvbmRpdGlvbicsICdndWFyZCcsICdib2R5J107CiAgICBXaGlsZS5wcm90b3R5cGUuaXNTdGF0ZW1lbnQgPSBZRVM7CiAgICBXaGlsZS5wcm90b3R5cGUubWFrZVJldHVybiA9IGZ1bmN0aW9uKCkgewogICAgICB0aGlzLnJldHVybnMgPSB0cnVlOwogICAgICByZXR1cm4gdGhpczsKICAgIH07CiAgICBXaGlsZS5wcm90b3R5cGUuYWRkQm9keSA9IGZ1bmN0aW9uKGJvZHkpIHsKICAgICAgdGhpcy5ib2R5ID0gYm9keTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwogICAgV2hpbGUucHJvdG90eXBlLmp1bXBzID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBleHByZXNzaW9ucywgbm9kZSwgX2ksIF9sZW47CiAgICAgIGV4cHJlc3Npb25zID0gdGhpcy5ib2R5LmV4cHJlc3Npb25zOwogICAgICBpZiAoIWV4cHJlc3Npb25zLmxlbmd0aCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IGV4cHJlc3Npb25zLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7CiAgICAgICAgbm9kZSA9IGV4cHJlc3Npb25zW19pXTsKICAgICAgICBpZiAobm9kZS5qdW1wcyh7CiAgICAgICAgICBsb29wOiB0cnVlCiAgICAgICAgfSkpIHsKICAgICAgICAgIHJldHVybiBub2RlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwogICAgV2hpbGUucHJvdG90eXBlLmNvbXBpbGVOb2RlID0gZnVuY3Rpb24obykgewogICAgICB2YXIgYm9keSwgY29kZSwgcnZhciwgc2V0OwogICAgICBvLmluZGVudCArPSBUQUI7CiAgICAgIHNldCA9ICcnOwogICAgICBib2R5ID0gdGhpcy5ib2R5OwogICAgICBpZiAoYm9keS5pc0VtcHR5KCkpIHsKICAgICAgICBib2R5ID0gJyc7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKG8ubGV2ZWwgPiBMRVZFTF9UT1AgfHwgdGhpcy5yZXR1cm5zKSB7CiAgICAgICAgICBydmFyID0gby5zY29wZS5mcmVlVmFyaWFibGUoJ3Jlc3VsdHMnKTsKICAgICAgICAgIHNldCA9ICIiICsgdGhpcy50YWIgKyBydmFyICsgIiA9IFtdO1xuIjsKICAgICAgICAgIGlmIChib2R5KSB7CiAgICAgICAgICAgIGJvZHkgPSBQdXNoLndyYXAocnZhciwgYm9keSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLmd1YXJkKSB7CiAgICAgICAgICBib2R5ID0gQmxvY2sud3JhcChbbmV3IElmKHRoaXMuZ3VhcmQsIGJvZHkpXSk7CiAgICAgICAgfQogICAgICAgIGJvZHkgPSAiXG4iICsgKGJvZHkuY29tcGlsZShvLCBMRVZFTF9UT1ApKSArICJcbiIgKyB0aGlzLnRhYjsKICAgICAgfQogICAgICBjb2RlID0gc2V0ICsgdGhpcy50YWIgKyAoIndoaWxlICgiICsgKHRoaXMuY29uZGl0aW9uLmNvbXBpbGUobywgTEVWRUxfUEFSRU4pKSArICIpIHsiICsgYm9keSArICJ9Iik7CiAgICAgIGlmICh0aGlzLnJldHVybnMpIHsKICAgICAgICBjb2RlICs9ICJcbiIgKyB0aGlzLnRhYiArICJyZXR1cm4gIiArIHJ2YXIgKyAiOyI7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvZGU7CiAgICB9OwogICAgcmV0dXJuIFdoaWxlOwogIH0pKCk7CiAgZXhwb3J0cy5PcCA9IE9wID0gKGZ1bmN0aW9uKCkgewogICAgdmFyIENPTlZFUlNJT05TLCBJTlZFUlNJT05TOwogICAgX19leHRlbmRzKE9wLCBCYXNlKTsKICAgIGZ1bmN0aW9uIE9wKG9wLCBmaXJzdCwgc2Vjb25kLCBmbGlwKSB7CiAgICAgIHZhciBjYWxsOwogICAgICBpZiAob3AgPT09ICdpbicpIHsKICAgICAgICByZXR1cm4gbmV3IEluKGZpcnN0LCBzZWNvbmQpOwogICAgICB9CiAgICAgIGlmIChvcCA9PT0gJ2RvJykgewogICAgICAgIGNhbGwgPSBuZXcgQ2FsbChmaXJzdCwgZmlyc3QucGFyYW1zIHx8IFtdKTsKICAgICAgICBjYWxsWyJkbyJdID0gdHJ1ZTsKICAgICAgICByZXR1cm4gY2FsbDsKICAgICAgfQogICAgICBpZiAob3AgPT09ICduZXcnKSB7CiAgICAgICAgaWYgKGZpcnN0IGluc3RhbmNlb2YgQ2FsbCAmJiAhZmlyc3RbImRvIl0pIHsKICAgICAgICAgIHJldHVybiBmaXJzdC5uZXdJbnN0YW5jZSgpOwogICAgICAgIH0KICAgICAgICBpZiAoZmlyc3QgaW5zdGFuY2VvZiBDb2RlICYmIGZpcnN0LmJvdW5kIHx8IGZpcnN0WyJkbyJdKSB7CiAgICAgICAgICBmaXJzdCA9IG5ldyBQYXJlbnMoZmlyc3QpOwogICAgICAgIH0KICAgICAgfQogICAgICB0aGlzLm9wZXJhdG9yID0gQ09OVkVSU0lPTlNbb3BdIHx8IG9wOwogICAgICB0aGlzLmZpcnN0ID0gZmlyc3Q7CiAgICAgIHRoaXMuc2Vjb25kID0gc2Vjb25kOwogICAgICB0aGlzLmZsaXAgPSAhIWZsaXA7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgQ09OVkVSU0lPTlMgPSB7CiAgICAgICc9PSc6ICc9PT0nLAogICAgICAnIT0nOiAnIT09JywKICAgICAgJ29mJzogJ2luJwogICAgfTsKICAgIElOVkVSU0lPTlMgPSB7CiAgICAgICchPT0nOiAnPT09JywKICAgICAgJz09PSc6ICchPT0nCiAgICB9OwogICAgT3AucHJvdG90eXBlLmNoaWxkcmVuID0gWydmaXJzdCcsICdzZWNvbmQnXTsKICAgIE9wLnByb3RvdHlwZS5pc1NpbXBsZU51bWJlciA9IE5POwogICAgT3AucHJvdG90eXBlLmlzVW5hcnkgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuICF0aGlzLnNlY29uZDsKICAgIH07CiAgICBPcC5wcm90b3R5cGUuaXNDb21wbGV4ID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBfcmVmMjsKICAgICAgcmV0dXJuICEodGhpcy5pc1VuYXJ5KCkgJiYgKChfcmVmMiA9IHRoaXMub3BlcmF0b3IpID09PSAnKycgfHwgX3JlZjIgPT09ICctJykpIHx8IHRoaXMuZmlyc3QuaXNDb21wbGV4KCk7CiAgICB9OwogICAgT3AucHJvdG90eXBlLmlzQ2hhaW5hYmxlID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBfcmVmMjsKICAgICAgcmV0dXJuIChfcmVmMiA9IHRoaXMub3BlcmF0b3IpID09PSAnPCcgfHwgX3JlZjIgPT09ICc+JyB8fCBfcmVmMiA9PT0gJz49JyB8fCBfcmVmMiA9PT0gJzw9JyB8fCBfcmVmMiA9PT0gJz09PScgfHwgX3JlZjIgPT09ICchPT0nOwogICAgfTsKICAgIE9wLnByb3RvdHlwZS5pbnZlcnQgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIGFsbEludmVydGFibGUsIGN1cnIsIGZzdCwgb3AsIF9yZWYyOwogICAgICBpZiAodGhpcy5pc0NoYWluYWJsZSgpICYmIHRoaXMuZmlyc3QuaXNDaGFpbmFibGUoKSkgewogICAgICAgIGFsbEludmVydGFibGUgPSB0cnVlOwogICAgICAgIGN1cnIgPSB0aGlzOwogICAgICAgIHdoaWxlIChjdXJyICYmIGN1cnIub3BlcmF0b3IpIHsKICAgICAgICAgIGFsbEludmVydGFibGUgJiYgKGFsbEludmVydGFibGUgPSBjdXJyLm9wZXJhdG9yIGluIElOVkVSU0lPTlMpOwogICAgICAgICAgY3VyciA9IGN1cnIuZmlyc3Q7CiAgICAgICAgfQogICAgICAgIGlmICghYWxsSW52ZXJ0YWJsZSkgewogICAgICAgICAgcmV0dXJuIG5ldyBQYXJlbnModGhpcykuaW52ZXJ0KCk7CiAgICAgICAgfQogICAgICAgIGN1cnIgPSB0aGlzOwogICAgICAgIHdoaWxlIChjdXJyICYmIGN1cnIub3BlcmF0b3IpIHsKICAgICAgICAgIGN1cnIuaW52ZXJ0ID0gIWN1cnIuaW52ZXJ0OwogICAgICAgICAgY3Vyci5vcGVyYXRvciA9IElOVkVSU0lPTlNbY3Vyci5vcGVyYXRvcl07CiAgICAgICAgICBjdXJyID0gY3Vyci5maXJzdDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0gZWxzZSBpZiAob3AgPSBJTlZFUlNJT05TW3RoaXMub3BlcmF0b3JdKSB7CiAgICAgICAgdGhpcy5vcGVyYXRvciA9IG9wOwogICAgICAgIGlmICh0aGlzLmZpcnN0LnVud3JhcCgpIGluc3RhbmNlb2YgT3ApIHsKICAgICAgICAgIHRoaXMuZmlyc3QuaW52ZXJ0KCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9IGVsc2UgaWYgKHRoaXMuc2Vjb25kKSB7CiAgICAgICAgcmV0dXJuIG5ldyBQYXJlbnModGhpcykuaW52ZXJ0KCk7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5vcGVyYXRvciA9PT0gJyEnICYmIChmc3QgPSB0aGlzLmZpcnN0LnVud3JhcCgpKSBpbnN0YW5jZW9mIE9wICYmICgoX3JlZjIgPSBmc3Qub3BlcmF0b3IpID09PSAnIScgfHwgX3JlZjIgPT09ICdpbicgfHwgX3JlZjIgPT09ICdpbnN0YW5jZW9mJykpIHsKICAgICAgICByZXR1cm4gZnN0OwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBuZXcgT3AoJyEnLCB0aGlzKTsKICAgICAgfQogICAgfTsKICAgIE9wLnByb3RvdHlwZS51bmZvbGRTb2FrID0gZnVuY3Rpb24obykgewogICAgICB2YXIgX3JlZjI7CiAgICAgIHJldHVybiAoKF9yZWYyID0gdGhpcy5vcGVyYXRvcikgPT09ICcrKycgfHwgX3JlZjIgPT09ICctLScgfHwgX3JlZjIgPT09ICdkZWxldGUnKSAmJiB1bmZvbGRTb2FrKG8sIHRoaXMsICdmaXJzdCcpOwogICAgfTsKICAgIE9wLnByb3RvdHlwZS5jb21waWxlTm9kZSA9IGZ1bmN0aW9uKG8pIHsKICAgICAgdmFyIGNvZGU7CiAgICAgIGlmICh0aGlzLmlzVW5hcnkoKSkgewogICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVVbmFyeShvKTsKICAgICAgfQogICAgICBpZiAodGhpcy5pc0NoYWluYWJsZSgpICYmIHRoaXMuZmlyc3QuaXNDaGFpbmFibGUoKSkgewogICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVDaGFpbihvKTsKICAgICAgfQogICAgICBpZiAodGhpcy5vcGVyYXRvciA9PT0gJz8nKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZUV4aXN0ZW5jZShvKTsKICAgICAgfQogICAgICB0aGlzLmZpcnN0LmZyb250ID0gdGhpcy5mcm9udDsKICAgICAgY29kZSA9IHRoaXMuZmlyc3QuY29tcGlsZShvLCBMRVZFTF9PUCkgKyAnICcgKyB0aGlzLm9wZXJhdG9yICsgJyAnICsgdGhpcy5zZWNvbmQuY29tcGlsZShvLCBMRVZFTF9PUCk7CiAgICAgIGlmIChvLmxldmVsIDw9IExFVkVMX09QKSB7CiAgICAgICAgcmV0dXJuIGNvZGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICIoIiArIGNvZGUgKyAiKSI7CiAgICAgIH0KICAgIH07CiAgICBPcC5wcm90b3R5cGUuY29tcGlsZUNoYWluID0gZnVuY3Rpb24obykgewogICAgICB2YXIgY29kZSwgZnN0LCBzaGFyZWQsIF9yZWYyOwogICAgICBfcmVmMiA9IHRoaXMuZmlyc3Quc2Vjb25kLmNhY2hlKG8pLCB0aGlzLmZpcnN0LnNlY29uZCA9IF9yZWYyWzBdLCBzaGFyZWQgPSBfcmVmMlsxXTsKICAgICAgZnN0ID0gdGhpcy5maXJzdC5jb21waWxlKG8sIExFVkVMX09QKTsKICAgICAgY29kZSA9ICIiICsgZnN0ICsgIiAiICsgKHRoaXMuaW52ZXJ0ID8gJyYmJyA6ICd8fCcpICsgIiAiICsgKHNoYXJlZC5jb21waWxlKG8pKSArICIgIiArIHRoaXMub3BlcmF0b3IgKyAiICIgKyAodGhpcy5zZWNvbmQuY29tcGlsZShvLCBMRVZFTF9PUCkpOwogICAgICByZXR1cm4gIigiICsgY29kZSArICIpIjsKICAgIH07CiAgICBPcC5wcm90b3R5cGUuY29tcGlsZUV4aXN0ZW5jZSA9IGZ1bmN0aW9uKG8pIHsKICAgICAgdmFyIGZzdCwgcmVmOwogICAgICBpZiAodGhpcy5maXJzdC5pc0NvbXBsZXgoKSkgewogICAgICAgIHJlZiA9IG5ldyBMaXRlcmFsKG8uc2NvcGUuZnJlZVZhcmlhYmxlKCdyZWYnKSk7CiAgICAgICAgZnN0ID0gbmV3IFBhcmVucyhuZXcgQXNzaWduKHJlZiwgdGhpcy5maXJzdCkpOwogICAgICB9IGVsc2UgewogICAgICAgIGZzdCA9IHRoaXMuZmlyc3Q7CiAgICAgICAgcmVmID0gZnN0OwogICAgICB9CiAgICAgIHJldHVybiBuZXcgSWYobmV3IEV4aXN0ZW5jZShmc3QpLCByZWYsIHsKICAgICAgICB0eXBlOiAnaWYnCiAgICAgIH0pLmFkZEVsc2UodGhpcy5zZWNvbmQpLmNvbXBpbGUobyk7CiAgICB9OwogICAgT3AucHJvdG90eXBlLmNvbXBpbGVVbmFyeSA9IGZ1bmN0aW9uKG8pIHsKICAgICAgdmFyIG9wLCBwYXJ0czsKICAgICAgcGFydHMgPSBbb3AgPSB0aGlzLm9wZXJhdG9yXTsKICAgICAgaWYgKChvcCA9PT0gJ25ldycgfHwgb3AgPT09ICd0eXBlb2YnIHx8IG9wID09PSAnZGVsZXRlJykgfHwgKG9wID09PSAnKycgfHwgb3AgPT09ICctJykgJiYgdGhpcy5maXJzdCBpbnN0YW5jZW9mIE9wICYmIHRoaXMuZmlyc3Qub3BlcmF0b3IgPT09IG9wKSB7CiAgICAgICAgcGFydHMucHVzaCgnICcpOwogICAgICB9CiAgICAgIGlmIChvcCA9PT0gJ25ldycgJiYgdGhpcy5maXJzdC5pc1N0YXRlbWVudChvKSkgewogICAgICAgIHRoaXMuZmlyc3QgPSBuZXcgUGFyZW5zKHRoaXMuZmlyc3QpOwogICAgICB9CiAgICAgIHBhcnRzLnB1c2godGhpcy5maXJzdC5jb21waWxlKG8sIExFVkVMX09QKSk7CiAgICAgIGlmICh0aGlzLmZsaXApIHsKICAgICAgICBwYXJ0cy5yZXZlcnNlKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oJycpOwogICAgfTsKICAgIE9wLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKGlkdCkgewogICAgICByZXR1cm4gT3AuX19zdXBlcl9fLnRvU3RyaW5nLmNhbGwodGhpcywgaWR0LCB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyAnICcgKyB0aGlzLm9wZXJhdG9yKTsKICAgIH07CiAgICByZXR1cm4gT3A7CiAgfSkoKTsKICBleHBvcnRzLkluID0gSW4gPSAoZnVuY3Rpb24oKSB7CiAgICBfX2V4dGVuZHMoSW4sIEJhc2UpOwogICAgZnVuY3Rpb24gSW4ob2JqZWN0LCBhcnJheSkgewogICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDsKICAgICAgdGhpcy5hcnJheSA9IGFycmF5OwogICAgfQogICAgSW4ucHJvdG90eXBlLmNoaWxkcmVuID0gWydvYmplY3QnLCAnYXJyYXknXTsKICAgIEluLnByb3RvdHlwZS5pbnZlcnQgPSBORUdBVEU7CiAgICBJbi5wcm90b3R5cGUuY29tcGlsZU5vZGUgPSBmdW5jdGlvbihvKSB7CiAgICAgIHZhciBoYXNTcGxhdCwgb2JqLCBfaSwgX2xlbiwgX3JlZjI7CiAgICAgIGlmICh0aGlzLmFycmF5IGluc3RhbmNlb2YgVmFsdWUgJiYgdGhpcy5hcnJheS5pc0FycmF5KCkpIHsKICAgICAgICBfcmVmMiA9IHRoaXMuYXJyYXkuYmFzZS5vYmplY3RzOwogICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjIubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsKICAgICAgICAgIG9iaiA9IF9yZWYyW19pXTsKICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBTcGxhdCkgewogICAgICAgICAgICBoYXNTcGxhdCA9IHRydWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIWhhc1NwbGF0KSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5jb21waWxlT3JUZXN0KG8pOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdGhpcy5jb21waWxlTG9vcFRlc3Qobyk7CiAgICB9OwogICAgSW4ucHJvdG90eXBlLmNvbXBpbGVPclRlc3QgPSBmdW5jdGlvbihvKSB7CiAgICAgIHZhciBjbXAsIGNuaiwgaSwgaXRlbSwgcmVmLCBzdWIsIHRlc3RzLCBfcmVmMiwgX3JlZjM7CiAgICAgIF9yZWYyID0gdGhpcy5vYmplY3QuY2FjaGUobywgTEVWRUxfT1ApLCBzdWIgPSBfcmVmMlswXSwgcmVmID0gX3JlZjJbMV07CiAgICAgIF9yZWYzID0gdGhpcy5uZWdhdGVkID8gWycgIT09ICcsICcgJiYgJ10gOiBbJyA9PT0gJywgJyB8fCAnXSwgY21wID0gX3JlZjNbMF0sIGNuaiA9IF9yZWYzWzFdOwogICAgICB0ZXN0cyA9IChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgX2xlbiwgX3JlZjQsIF9yZXN1bHRzOwogICAgICAgIF9yZWY0ID0gdGhpcy5hcnJheS5iYXNlLm9iamVjdHM7CiAgICAgICAgX3Jlc3VsdHMgPSBbXTsKICAgICAgICBmb3IgKGkgPSAwLCBfbGVuID0gX3JlZjQubGVuZ3RoOyBpIDwgX2xlbjsgaSsrKSB7CiAgICAgICAgICBpdGVtID0gX3JlZjRbaV07CiAgICAgICAgICBfcmVzdWx0cy5wdXNoKChpID8gcmVmIDogc3ViKSArIGNtcCArIGl0ZW0uY29tcGlsZShvLCBMRVZFTF9PUCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX3Jlc3VsdHM7CiAgICAgIH0pLmNhbGwodGhpcyk7CiAgICAgIGlmICh0ZXN0cy5sZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gJ2ZhbHNlJzsKICAgICAgfQogICAgICB0ZXN0cyA9IHRlc3RzLmpvaW4oY25qKTsKICAgICAgaWYgKG8ubGV2ZWwgPCBMRVZFTF9PUCkgewogICAgICAgIHJldHVybiB0ZXN0czsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gIigiICsgdGVzdHMgKyAiKSI7CiAgICAgIH0KICAgIH07CiAgICBJbi5wcm90b3R5cGUuY29tcGlsZUxvb3BUZXN0ID0gZnVuY3Rpb24obykgewogICAgICB2YXIgY29kZSwgcmVmLCBzdWIsIF9yZWYyOwogICAgICBfcmVmMiA9IHRoaXMub2JqZWN0LmNhY2hlKG8sIExFVkVMX0xJU1QpLCBzdWIgPSBfcmVmMlswXSwgcmVmID0gX3JlZjJbMV07CiAgICAgIGNvZGUgPSB1dGlsaXR5KCdpbmRleE9mJykgKyAoIi5jYWxsKCIgKyAodGhpcy5hcnJheS5jb21waWxlKG8sIExFVkVMX0xJU1QpKSArICIsICIgKyByZWYgKyAiKSAiKSArICh0aGlzLm5lZ2F0ZWQgPyAnPCAwJyA6ICc+PSAwJyk7CiAgICAgIGlmIChzdWIgPT09IHJlZikgewogICAgICAgIHJldHVybiBjb2RlOwogICAgICB9CiAgICAgIGNvZGUgPSBzdWIgKyAnLCAnICsgY29kZTsKICAgICAgaWYgKG8ubGV2ZWwgPCBMRVZFTF9MSVNUKSB7CiAgICAgICAgcmV0dXJuIGNvZGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICIoIiArIGNvZGUgKyAiKSI7CiAgICAgIH0KICAgIH07CiAgICBJbi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbihpZHQpIHsKICAgICAgcmV0dXJuIEluLl9fc3VwZXJfXy50b1N0cmluZy5jYWxsKHRoaXMsIGlkdCwgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgKHRoaXMubmVnYXRlZCA/ICchJyA6ICcnKSk7CiAgICB9OwogICAgcmV0dXJuIEluOwogIH0pKCk7CiAgZXhwb3J0cy5UcnkgPSBUcnkgPSAoZnVuY3Rpb24oKSB7CiAgICBfX2V4dGVuZHMoVHJ5LCBCYXNlKTsKICAgIGZ1bmN0aW9uIFRyeShhdHRlbXB0LCBlcnJvciwgcmVjb3ZlcnksIGVuc3VyZSkgewogICAgICB0aGlzLmF0dGVtcHQgPSBhdHRlbXB0OwogICAgICB0aGlzLmVycm9yID0gZXJyb3I7CiAgICAgIHRoaXMucmVjb3ZlcnkgPSByZWNvdmVyeTsKICAgICAgdGhpcy5lbnN1cmUgPSBlbnN1cmU7CiAgICB9CiAgICBUcnkucHJvdG90eXBlLmNoaWxkcmVuID0gWydhdHRlbXB0JywgJ3JlY292ZXJ5JywgJ2Vuc3VyZSddOwogICAgVHJ5LnByb3RvdHlwZS5pc1N0YXRlbWVudCA9IFlFUzsKICAgIFRyeS5wcm90b3R5cGUuanVtcHMgPSBmdW5jdGlvbihvKSB7CiAgICAgIHZhciBfcmVmMjsKICAgICAgcmV0dXJuIHRoaXMuYXR0ZW1wdC5qdW1wcyhvKSB8fCAoKF9yZWYyID0gdGhpcy5yZWNvdmVyeSkgIT0gbnVsbCA/IF9yZWYyLmp1bXBzKG8pIDogdm9pZCAwKTsKICAgIH07CiAgICBUcnkucHJvdG90eXBlLm1ha2VSZXR1cm4gPSBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRoaXMuYXR0ZW1wdCkgewogICAgICAgIHRoaXMuYXR0ZW1wdCA9IHRoaXMuYXR0ZW1wdC5tYWtlUmV0dXJuKCk7CiAgICAgIH0KICAgICAgaWYgKHRoaXMucmVjb3ZlcnkpIHsKICAgICAgICB0aGlzLnJlY292ZXJ5ID0gdGhpcy5yZWNvdmVyeS5tYWtlUmV0dXJuKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwogICAgVHJ5LnByb3RvdHlwZS5jb21waWxlTm9kZSA9IGZ1bmN0aW9uKG8pIHsKICAgICAgdmFyIGNhdGNoUGFydCwgZXJyb3JQYXJ0OwogICAgICBvLmluZGVudCArPSBUQUI7CiAgICAgIGVycm9yUGFydCA9IHRoaXMuZXJyb3IgPyAiICgiICsgKHRoaXMuZXJyb3IuY29tcGlsZShvKSkgKyAiKSAiIDogJyAnOwogICAgICBjYXRjaFBhcnQgPSB0aGlzLnJlY292ZXJ5ID8gIiBjYXRjaCIgKyBlcnJvclBhcnQgKyAie1xuIiArICh0aGlzLnJlY292ZXJ5LmNvbXBpbGUobywgTEVWRUxfVE9QKSkgKyAiXG4iICsgdGhpcy50YWIgKyAifSIgOiAhKHRoaXMuZW5zdXJlIHx8IHRoaXMucmVjb3ZlcnkpID8gJyBjYXRjaCAoX2UpIHt9JyA6IHZvaWQgMDsKICAgICAgcmV0dXJuICgiIiArIHRoaXMudGFiICsgInRyeSB7XG4iICsgKHRoaXMuYXR0ZW1wdC5jb21waWxlKG8sIExFVkVMX1RPUCkpICsgIlxuIiArIHRoaXMudGFiICsgIn0iICsgKGNhdGNoUGFydCB8fCAnJykpICsgKHRoaXMuZW5zdXJlID8gIiBmaW5hbGx5IHtcbiIgKyAodGhpcy5lbnN1cmUuY29tcGlsZShvLCBMRVZFTF9UT1ApKSArICJcbiIgKyB0aGlzLnRhYiArICJ9IiA6ICcnKTsKICAgIH07CiAgICByZXR1cm4gVHJ5OwogIH0pKCk7CiAgZXhwb3J0cy5UaHJvdyA9IFRocm93ID0gKGZ1bmN0aW9uKCkgewogICAgX19leHRlbmRzKFRocm93LCBCYXNlKTsKICAgIGZ1bmN0aW9uIFRocm93KGV4cHJlc3Npb24pIHsKICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKICAgIH0KICAgIFRocm93LnByb3RvdHlwZS5jaGlsZHJlbiA9IFsnZXhwcmVzc2lvbiddOwogICAgVGhyb3cucHJvdG90eXBlLmlzU3RhdGVtZW50ID0gWUVTOwogICAgVGhyb3cucHJvdG90eXBlLmp1bXBzID0gTk87CiAgICBUaHJvdy5wcm90b3R5cGUubWFrZVJldHVybiA9IFRISVM7CiAgICBUaHJvdy5wcm90b3R5cGUuY29tcGlsZU5vZGUgPSBmdW5jdGlvbihvKSB7CiAgICAgIHJldHVybiB0aGlzLnRhYiArICgidGhyb3cgIiArICh0aGlzLmV4cHJlc3Npb24uY29tcGlsZShvKSkgKyAiOyIpOwogICAgfTsKICAgIHJldHVybiBUaHJvdzsKICB9KSgpOwogIGV4cG9ydHMuRXhpc3RlbmNlID0gRXhpc3RlbmNlID0gKGZ1bmN0aW9uKCkgewogICAgX19leHRlbmRzKEV4aXN0ZW5jZSwgQmFzZSk7CiAgICBmdW5jdGlvbiBFeGlzdGVuY2UoZXhwcmVzc2lvbikgewogICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uOwogICAgfQogICAgRXhpc3RlbmNlLnByb3RvdHlwZS5jaGlsZHJlbiA9IFsnZXhwcmVzc2lvbiddOwogICAgRXhpc3RlbmNlLnByb3RvdHlwZS5pbnZlcnQgPSBORUdBVEU7CiAgICBFeGlzdGVuY2UucHJvdG90eXBlLmNvbXBpbGVOb2RlID0gZnVuY3Rpb24obykgewogICAgICB2YXIgY21wLCBjbmosIGNvZGUsIF9yZWYyOwogICAgICBjb2RlID0gdGhpcy5leHByZXNzaW9uLmNvbXBpbGUobywgTEVWRUxfT1ApOwogICAgICBjb2RlID0gSURFTlRJRklFUi50ZXN0KGNvZGUpICYmICFvLnNjb3BlLmNoZWNrKGNvZGUpID8gKChfcmVmMiA9IHRoaXMubmVnYXRlZCA/IFsnPT09JywgJ3x8J10gOiBbJyE9PScsICcmJiddLCBjbXAgPSBfcmVmMlswXSwgY25qID0gX3JlZjJbMV0sIF9yZWYyKSwgInR5cGVvZiAiICsgY29kZSArICIgIiArIGNtcCArICIgXCJ1bmRlZmluZWRcIiAiICsgY25qICsgIiAiICsgY29kZSArICIgIiArIGNtcCArICIgbnVsbCIpIDogIiIgKyBjb2RlICsgIiAiICsgKHRoaXMubmVnYXRlZCA/ICc9PScgOiAnIT0nKSArICIgbnVsbCI7CiAgICAgIGlmIChvLmxldmVsIDw9IExFVkVMX0NPTkQpIHsKICAgICAgICByZXR1cm4gY29kZTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gIigiICsgY29kZSArICIpIjsKICAgICAgfQogICAgfTsKICAgIHJldHVybiBFeGlzdGVuY2U7CiAgfSkoKTsKICBleHBvcnRzLlBhcmVucyA9IFBhcmVucyA9IChmdW5jdGlvbigpIHsKICAgIF9fZXh0ZW5kcyhQYXJlbnMsIEJhc2UpOwogICAgZnVuY3Rpb24gUGFyZW5zKGJvZHkpIHsKICAgICAgdGhpcy5ib2R5ID0gYm9keTsKICAgIH0KICAgIFBhcmVucy5wcm90b3R5cGUuY2hpbGRyZW4gPSBbJ2JvZHknXTsKICAgIFBhcmVucy5wcm90b3R5cGUudW53cmFwID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLmJvZHk7CiAgICB9OwogICAgUGFyZW5zLnByb3RvdHlwZS5pc0NvbXBsZXggPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuYm9keS5pc0NvbXBsZXgoKTsKICAgIH07CiAgICBQYXJlbnMucHJvdG90eXBlLm1ha2VSZXR1cm4gPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuYm9keS5tYWtlUmV0dXJuKCk7CiAgICB9OwogICAgUGFyZW5zLnByb3RvdHlwZS5jb21waWxlTm9kZSA9IGZ1bmN0aW9uKG8pIHsKICAgICAgdmFyIGJhcmUsIGNvZGUsIGV4cHI7CiAgICAgIGV4cHIgPSB0aGlzLmJvZHkudW53cmFwKCk7CiAgICAgIGlmIChleHByIGluc3RhbmNlb2YgVmFsdWUgJiYgZXhwci5pc0F0b21pYygpKSB7CiAgICAgICAgZXhwci5mcm9udCA9IHRoaXMuZnJvbnQ7CiAgICAgICAgcmV0dXJuIGV4cHIuY29tcGlsZShvKTsKICAgICAgfQogICAgICBjb2RlID0gZXhwci5jb21waWxlKG8sIExFVkVMX1BBUkVOKTsKICAgICAgYmFyZSA9IG8ubGV2ZWwgPCBMRVZFTF9PUCAmJiAoZXhwciBpbnN0YW5jZW9mIE9wIHx8IGV4cHIgaW5zdGFuY2VvZiBDYWxsIHx8IChleHByIGluc3RhbmNlb2YgRm9yICYmIGV4cHIucmV0dXJucykpOwogICAgICBpZiAoYmFyZSkgewogICAgICAgIHJldHVybiBjb2RlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAiKCIgKyBjb2RlICsgIikiOwogICAgICB9CiAgICB9OwogICAgcmV0dXJuIFBhcmVuczsKICB9KSgpOwogIGV4cG9ydHMuRm9yID0gRm9yID0gKGZ1bmN0aW9uKCkgewogICAgX19leHRlbmRzKEZvciwgQmFzZSk7CiAgICBmdW5jdGlvbiBGb3IoYm9keSwgc291cmNlKSB7CiAgICAgIHZhciBfcmVmMjsKICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2Uuc291cmNlLCB0aGlzLmd1YXJkID0gc291cmNlLmd1YXJkLCB0aGlzLnN0ZXAgPSBzb3VyY2Uuc3RlcCwgdGhpcy5uYW1lID0gc291cmNlLm5hbWUsIHRoaXMuaW5kZXggPSBzb3VyY2UuaW5kZXg7CiAgICAgIHRoaXMuYm9keSA9IEJsb2NrLndyYXAoW2JvZHldKTsKICAgICAgdGhpcy5vd24gPSAhIXNvdXJjZS5vd247CiAgICAgIHRoaXMub2JqZWN0ID0gISFzb3VyY2Uub2JqZWN0OwogICAgICBpZiAodGhpcy5vYmplY3QpIHsKICAgICAgICBfcmVmMiA9IFt0aGlzLmluZGV4LCB0aGlzLm5hbWVdLCB0aGlzLm5hbWUgPSBfcmVmMlswXSwgdGhpcy5pbmRleCA9IF9yZWYyWzFdOwogICAgICB9CiAgICAgIGlmICh0aGlzLmluZGV4IGluc3RhbmNlb2YgVmFsdWUpIHsKICAgICAgICB0aHJvdyBTeW50YXhFcnJvcignaW5kZXggY2Fubm90IGJlIGEgcGF0dGVybiBtYXRjaGluZyBleHByZXNzaW9uJyk7CiAgICAgIH0KICAgICAgdGhpcy5yYW5nZSA9IHRoaXMuc291cmNlIGluc3RhbmNlb2YgVmFsdWUgJiYgdGhpcy5zb3VyY2UuYmFzZSBpbnN0YW5jZW9mIFJhbmdlICYmICF0aGlzLnNvdXJjZS5wcm9wZXJ0aWVzLmxlbmd0aDsKICAgICAgdGhpcy5wYXR0ZXJuID0gdGhpcy5uYW1lIGluc3RhbmNlb2YgVmFsdWU7CiAgICAgIGlmICh0aGlzLnJhbmdlICYmIHRoaXMuaW5kZXgpIHsKICAgICAgICB0aHJvdyBTeW50YXhFcnJvcignaW5kZXhlcyBkbyBub3QgYXBwbHkgdG8gcmFuZ2UgbG9vcHMnKTsKICAgICAgfQogICAgICBpZiAodGhpcy5yYW5nZSAmJiB0aGlzLnBhdHRlcm4pIHsKICAgICAgICB0aHJvdyBTeW50YXhFcnJvcignY2Fubm90IHBhdHRlcm4gbWF0Y2ggb3ZlciByYW5nZSBsb29wcycpOwogICAgICB9CiAgICAgIHRoaXMucmV0dXJucyA9IGZhbHNlOwogICAgfQogICAgRm9yLnByb3RvdHlwZS5jaGlsZHJlbiA9IFsnYm9keScsICdzb3VyY2UnLCAnZ3VhcmQnLCAnc3RlcCddOwogICAgRm9yLnByb3RvdHlwZS5pc1N0YXRlbWVudCA9IFlFUzsKICAgIEZvci5wcm90b3R5cGUuanVtcHMgPSBXaGlsZS5wcm90b3R5cGUuanVtcHM7CiAgICBGb3IucHJvdG90eXBlLm1ha2VSZXR1cm4gPSBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5yZXR1cm5zID0gdHJ1ZTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwogICAgRm9yLnByb3RvdHlwZS5jb21waWxlTm9kZSA9IGZ1bmN0aW9uKG8pIHsKICAgICAgdmFyIGJvZHksIGRlZlBhcnQsIGZvclBhcnQsIGZvclZhclBhcnQsIGd1YXJkUGFydCwgaWR0MSwgaW5kZXgsIGl2YXIsIGxhc3RKdW1wcywgbHZhciwgbmFtZSwgbmFtZVBhcnQsIHJlZiwgcmVzdWx0UGFydCwgcmV0dXJuUmVzdWx0LCBydmFyLCBzY29wZSwgc291cmNlLCBzdGVwUGFydCwgc3RlcHZhciwgc3ZhciwgdmFyUGFydCwgX3JlZjI7CiAgICAgIGJvZHkgPSBCbG9jay53cmFwKFt0aGlzLmJvZHldKTsKICAgICAgbGFzdEp1bXBzID0gKF9yZWYyID0gbGFzdChib2R5LmV4cHJlc3Npb25zKSkgIT0gbnVsbCA/IF9yZWYyLmp1bXBzKCkgOiB2b2lkIDA7CiAgICAgIGlmIChsYXN0SnVtcHMgJiYgbGFzdEp1bXBzIGluc3RhbmNlb2YgUmV0dXJuKSB7CiAgICAgICAgdGhpcy5yZXR1cm5zID0gZmFsc2U7CiAgICAgIH0KICAgICAgc291cmNlID0gdGhpcy5yYW5nZSA/IHRoaXMuc291cmNlLmJhc2UgOiB0aGlzLnNvdXJjZTsKICAgICAgc2NvcGUgPSBvLnNjb3BlOwogICAgICBuYW1lID0gdGhpcy5uYW1lICYmIHRoaXMubmFtZS5jb21waWxlKG8sIExFVkVMX0xJU1QpOwogICAgICBpbmRleCA9IHRoaXMuaW5kZXggJiYgdGhpcy5pbmRleC5jb21waWxlKG8sIExFVkVMX0xJU1QpOwogICAgICBpZiAobmFtZSAmJiAhdGhpcy5wYXR0ZXJuKSB7CiAgICAgICAgc2NvcGUuZmluZChuYW1lLCB7CiAgICAgICAgICBpbW1lZGlhdGU6IHRydWUKICAgICAgICB9KTsKICAgICAgfQogICAgICBpZiAoaW5kZXgpIHsKICAgICAgICBzY29wZS5maW5kKGluZGV4LCB7CiAgICAgICAgICBpbW1lZGlhdGU6IHRydWUKICAgICAgICB9KTsKICAgICAgfQogICAgICBpZiAodGhpcy5yZXR1cm5zKSB7CiAgICAgICAgcnZhciA9IHNjb3BlLmZyZWVWYXJpYWJsZSgncmVzdWx0cycpOwogICAgICB9CiAgICAgIGl2YXIgPSAodGhpcy5yYW5nZSA/IG5hbWUgOiBpbmRleCkgfHwgc2NvcGUuZnJlZVZhcmlhYmxlKCdpJyk7CiAgICAgIGlmICh0aGlzLnN0ZXAgJiYgIXRoaXMucmFuZ2UpIHsKICAgICAgICBzdGVwdmFyID0gc2NvcGUuZnJlZVZhcmlhYmxlKCJzdGVwIik7CiAgICAgIH0KICAgICAgaWYgKHRoaXMucGF0dGVybikgewogICAgICAgIG5hbWUgPSBpdmFyOwogICAgICB9CiAgICAgIHZhclBhcnQgPSAnJzsKICAgICAgZ3VhcmRQYXJ0ID0gJyc7CiAgICAgIGRlZlBhcnQgPSAnJzsKICAgICAgaWR0MSA9IHRoaXMudGFiICsgVEFCOwogICAgICBpZiAodGhpcy5yYW5nZSkgewogICAgICAgIGZvclBhcnQgPSBzb3VyY2UuY29tcGlsZShtZXJnZShvLCB7CiAgICAgICAgICBpbmRleDogaXZhciwKICAgICAgICAgIHN0ZXA6IHRoaXMuc3RlcAogICAgICAgIH0pKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdmFyID0gdGhpcy5zb3VyY2UuY29tcGlsZShvLCBMRVZFTF9MSVNUKTsKICAgICAgICBpZiAoKG5hbWUgfHwgdGhpcy5vd24pICYmICFJREVOVElGSUVSLnRlc3Qoc3ZhcikpIHsKICAgICAgICAgIGRlZlBhcnQgPSAiIiArIHRoaXMudGFiICsgKHJlZiA9IHNjb3BlLmZyZWVWYXJpYWJsZSgncmVmJykpICsgIiA9ICIgKyBzdmFyICsgIjtcbiI7CiAgICAgICAgICBzdmFyID0gcmVmOwogICAgICAgIH0KICAgICAgICBpZiAobmFtZSAmJiAhdGhpcy5wYXR0ZXJuKSB7CiAgICAgICAgICBuYW1lUGFydCA9ICIiICsgbmFtZSArICIgPSAiICsgc3ZhciArICJbIiArIGl2YXIgKyAiXSI7CiAgICAgICAgfQogICAgICAgIGlmICghdGhpcy5vYmplY3QpIHsKICAgICAgICAgIGx2YXIgPSBzY29wZS5mcmVlVmFyaWFibGUoJ2xlbicpOwogICAgICAgICAgZm9yVmFyUGFydCA9ICgiIiArIGl2YXIgKyAiID0gMCwgIiArIGx2YXIgKyAiID0gIiArIHN2YXIgKyAiLmxlbmd0aCIpICsgKHRoaXMuc3RlcCA/ICIsICIgKyBzdGVwdmFyICsgIiA9ICIgKyAodGhpcy5zdGVwLmNvbXBpbGUobywgTEVWRUxfT1ApKSA6ICcnKTsKICAgICAgICAgIHN0ZXBQYXJ0ID0gdGhpcy5zdGVwID8gIiIgKyBpdmFyICsgIiArPSAiICsgc3RlcHZhciA6ICIiICsgaXZhciArICIrKyI7CiAgICAgICAgICBmb3JQYXJ0ID0gIiIgKyBmb3JWYXJQYXJ0ICsgIjsgIiArIGl2YXIgKyAiIDwgIiArIGx2YXIgKyAiOyAiICsgc3RlcFBhcnQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh0aGlzLnJldHVybnMpIHsKICAgICAgICByZXN1bHRQYXJ0ID0gIiIgKyB0aGlzLnRhYiArIHJ2YXIgKyAiID0gW107XG4iOwogICAgICAgIHJldHVyblJlc3VsdCA9ICJcbiIgKyB0aGlzLnRhYiArICJyZXR1cm4gIiArIHJ2YXIgKyAiOyI7CiAgICAgICAgYm9keSA9IFB1c2gud3JhcChydmFyLCBib2R5KTsKICAgICAgfQogICAgICBpZiAodGhpcy5ndWFyZCkgewogICAgICAgIGJvZHkgPSBCbG9jay53cmFwKFtuZXcgSWYodGhpcy5ndWFyZCwgYm9keSldKTsKICAgICAgfQogICAgICBpZiAodGhpcy5wYXR0ZXJuKSB7CiAgICAgICAgYm9keS5leHByZXNzaW9ucy51bnNoaWZ0KG5ldyBBc3NpZ24odGhpcy5uYW1lLCBuZXcgTGl0ZXJhbCgiIiArIHN2YXIgKyAiWyIgKyBpdmFyICsgIl0iKSkpOwogICAgICB9CiAgICAgIGRlZlBhcnQgKz0gdGhpcy5wbHVja0RpcmVjdENhbGwobywgYm9keSk7CiAgICAgIGlmIChuYW1lUGFydCkgewogICAgICAgIHZhclBhcnQgPSAiXG4iICsgaWR0MSArIG5hbWVQYXJ0ICsgIjsiOwogICAgICB9CiAgICAgIGlmICh0aGlzLm9iamVjdCkgewogICAgICAgIGZvclBhcnQgPSAiIiArIGl2YXIgKyAiIGluICIgKyBzdmFyOwogICAgICAgIGlmICh0aGlzLm93bikgewogICAgICAgICAgZ3VhcmRQYXJ0ID0gIlxuIiArIGlkdDEgKyAiaWYgKCEiICsgKHV0aWxpdHkoJ2hhc1Byb3AnKSkgKyAiLmNhbGwoIiArIHN2YXIgKyAiLCAiICsgaXZhciArICIpKSBjb250aW51ZTsiOwogICAgICAgIH0KICAgICAgfQogICAgICBib2R5ID0gYm9keS5jb21waWxlKG1lcmdlKG8sIHsKICAgICAgICBpbmRlbnQ6IGlkdDEKICAgICAgfSksIExFVkVMX1RPUCk7CiAgICAgIGlmIChib2R5KSB7CiAgICAgICAgYm9keSA9ICdcbicgKyBib2R5ICsgJ1xuJzsKICAgICAgfQogICAgICByZXR1cm4gIiIgKyBkZWZQYXJ0ICsgKHJlc3VsdFBhcnQgfHwgJycpICsgdGhpcy50YWIgKyAiZm9yICgiICsgZm9yUGFydCArICIpIHsiICsgZ3VhcmRQYXJ0ICsgdmFyUGFydCArIGJvZHkgKyB0aGlzLnRhYiArICJ9IiArIChyZXR1cm5SZXN1bHQgfHwgJycpOwogICAgfTsKICAgIEZvci5wcm90b3R5cGUucGx1Y2tEaXJlY3RDYWxsID0gZnVuY3Rpb24obywgYm9keSkgewogICAgICB2YXIgYmFzZSwgZGVmcywgZXhwciwgZm4sIGlkeCwgcmVmLCB2YWwsIF9sZW4sIF9yZWYyLCBfcmVmMywgX3JlZjQsIF9yZWY1LCBfcmVmNiwgX3JlZjc7CiAgICAgIGRlZnMgPSAnJzsKICAgICAgX3JlZjIgPSBib2R5LmV4cHJlc3Npb25zOwogICAgICBmb3IgKGlkeCA9IDAsIF9sZW4gPSBfcmVmMi5sZW5ndGg7IGlkeCA8IF9sZW47IGlkeCsrKSB7CiAgICAgICAgZXhwciA9IF9yZWYyW2lkeF07CiAgICAgICAgZXhwciA9IGV4cHIudW53cmFwQWxsKCk7CiAgICAgICAgaWYgKCEoZXhwciBpbnN0YW5jZW9mIENhbGwpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgdmFsID0gZXhwci52YXJpYWJsZS51bndyYXBBbGwoKTsKICAgICAgICBpZiAoISgodmFsIGluc3RhbmNlb2YgQ29kZSkgfHwgKHZhbCBpbnN0YW5jZW9mIFZhbHVlICYmICgoX3JlZjMgPSB2YWwuYmFzZSkgIT0gbnVsbCA/IF9yZWYzLnVud3JhcEFsbCgpIDogdm9pZCAwKSBpbnN0YW5jZW9mIENvZGUgJiYgdmFsLnByb3BlcnRpZXMubGVuZ3RoID09PSAxICYmICgoX3JlZjQgPSAoX3JlZjUgPSB2YWwucHJvcGVydGllc1swXS5uYW1lKSAhPSBudWxsID8gX3JlZjUudmFsdWUgOiB2b2lkIDApID09PSAnY2FsbCcgfHwgX3JlZjQgPT09ICdhcHBseScpKSkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBmbiA9ICgoX3JlZjYgPSB2YWwuYmFzZSkgIT0gbnVsbCA/IF9yZWY2LnVud3JhcEFsbCgpIDogdm9pZCAwKSB8fCB2YWw7CiAgICAgICAgcmVmID0gbmV3IExpdGVyYWwoby5zY29wZS5mcmVlVmFyaWFibGUoJ2ZuJykpOwogICAgICAgIGJhc2UgPSBuZXcgVmFsdWUocmVmKTsKICAgICAgICBpZiAodmFsLmJhc2UpIHsKICAgICAgICAgIF9yZWY3ID0gW2Jhc2UsIHZhbF0sIHZhbC5iYXNlID0gX3JlZjdbMF0sIGJhc2UgPSBfcmVmN1sxXTsKICAgICAgICAgIGFyZ3MudW5zaGlmdChuZXcgTGl0ZXJhbCgndGhpcycpKTsKICAgICAgICB9CiAgICAgICAgYm9keS5leHByZXNzaW9uc1tpZHhdID0gbmV3IENhbGwoYmFzZSwgZXhwci5hcmdzKTsKICAgICAgICBkZWZzICs9IHRoaXMudGFiICsgbmV3IEFzc2lnbihyZWYsIGZuKS5jb21waWxlKG8sIExFVkVMX1RPUCkgKyAnO1xuJzsKICAgICAgfQogICAgICByZXR1cm4gZGVmczsKICAgIH07CiAgICByZXR1cm4gRm9yOwogIH0pKCk7CiAgZXhwb3J0cy5Td2l0Y2ggPSBTd2l0Y2ggPSAoZnVuY3Rpb24oKSB7CiAgICBfX2V4dGVuZHMoU3dpdGNoLCBCYXNlKTsKICAgIGZ1bmN0aW9uIFN3aXRjaChzdWJqZWN0LCBjYXNlcywgb3RoZXJ3aXNlKSB7CiAgICAgIHRoaXMuc3ViamVjdCA9IHN1YmplY3Q7CiAgICAgIHRoaXMuY2FzZXMgPSBjYXNlczsKICAgICAgdGhpcy5vdGhlcndpc2UgPSBvdGhlcndpc2U7CiAgICB9CiAgICBTd2l0Y2gucHJvdG90eXBlLmNoaWxkcmVuID0gWydzdWJqZWN0JywgJ2Nhc2VzJywgJ290aGVyd2lzZSddOwogICAgU3dpdGNoLnByb3RvdHlwZS5pc1N0YXRlbWVudCA9IFlFUzsKICAgIFN3aXRjaC5wcm90b3R5cGUuanVtcHMgPSBmdW5jdGlvbihvKSB7CiAgICAgIHZhciBibG9jaywgY29uZHMsIF9pLCBfbGVuLCBfcmVmMiwgX3JlZjMsIF9yZWY0OwogICAgICBpZiAobyA9PSBudWxsKSB7CiAgICAgICAgbyA9IHsKICAgICAgICAgIGJsb2NrOiB0cnVlCiAgICAgICAgfTsKICAgICAgfQogICAgICBfcmVmMiA9IHRoaXMuY2FzZXM7CiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjIubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsKICAgICAgICBfcmVmMyA9IF9yZWYyW19pXSwgY29uZHMgPSBfcmVmM1swXSwgYmxvY2sgPSBfcmVmM1sxXTsKICAgICAgICBpZiAoYmxvY2suanVtcHMobykpIHsKICAgICAgICAgIHJldHVybiBibG9jazsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIChfcmVmNCA9IHRoaXMub3RoZXJ3aXNlKSAhPSBudWxsID8gX3JlZjQuanVtcHMobykgOiB2b2lkIDA7CiAgICB9OwogICAgU3dpdGNoLnByb3RvdHlwZS5tYWtlUmV0dXJuID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBwYWlyLCBfaSwgX2xlbiwgX3JlZjIsIF9yZWYzOwogICAgICBfcmVmMiA9IHRoaXMuY2FzZXM7CiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjIubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsKICAgICAgICBwYWlyID0gX3JlZjJbX2ldOwogICAgICAgIHBhaXJbMV0ubWFrZVJldHVybigpOwogICAgICB9CiAgICAgIGlmICgoX3JlZjMgPSB0aGlzLm90aGVyd2lzZSkgIT0gbnVsbCkgewogICAgICAgIF9yZWYzLm1ha2VSZXR1cm4oKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH07CiAgICBTd2l0Y2gucHJvdG90eXBlLmNvbXBpbGVOb2RlID0gZnVuY3Rpb24obykgewogICAgICB2YXIgYmxvY2ssIGJvZHksIGNvZGUsIGNvbmQsIGNvbmRpdGlvbnMsIGV4cHIsIGksIGlkdDEsIGlkdDIsIF9pLCBfbGVuLCBfbGVuMiwgX3JlZjIsIF9yZWYzLCBfcmVmNCwgX3JlZjU7CiAgICAgIGlkdDEgPSBvLmluZGVudCArIFRBQjsKICAgICAgaWR0MiA9IG8uaW5kZW50ID0gaWR0MSArIFRBQjsKICAgICAgY29kZSA9IHRoaXMudGFiICsgKCJzd2l0Y2ggKCIgKyAoKChfcmVmMiA9IHRoaXMuc3ViamVjdCkgIT0gbnVsbCA/IF9yZWYyLmNvbXBpbGUobywgTEVWRUxfUEFSRU4pIDogdm9pZCAwKSB8fCBmYWxzZSkgKyAiKSB7XG4iKTsKICAgICAgX3JlZjMgPSB0aGlzLmNhc2VzOwogICAgICBmb3IgKGkgPSAwLCBfbGVuID0gX3JlZjMubGVuZ3RoOyBpIDwgX2xlbjsgaSsrKSB7CiAgICAgICAgX3JlZjQgPSBfcmVmM1tpXSwgY29uZGl0aW9ucyA9IF9yZWY0WzBdLCBibG9jayA9IF9yZWY0WzFdOwogICAgICAgIF9yZWY1ID0gZmxhdHRlbihbY29uZGl0aW9uc10pOwogICAgICAgIGZvciAoX2kgPSAwLCBfbGVuMiA9IF9yZWY1Lmxlbmd0aDsgX2kgPCBfbGVuMjsgX2krKykgewogICAgICAgICAgY29uZCA9IF9yZWY1W19pXTsKICAgICAgICAgIGlmICghdGhpcy5zdWJqZWN0KSB7CiAgICAgICAgICAgIGNvbmQgPSBjb25kLmludmVydCgpOwogICAgICAgICAgfQogICAgICAgICAgY29kZSArPSBpZHQxICsgKCJjYXNlICIgKyAoY29uZC5jb21waWxlKG8sIExFVkVMX1BBUkVOKSkgKyAiOlxuIik7CiAgICAgICAgfQogICAgICAgIGlmIChib2R5ID0gYmxvY2suY29tcGlsZShvLCBMRVZFTF9UT1ApKSB7CiAgICAgICAgICBjb2RlICs9IGJvZHkgKyAnXG4nOwogICAgICAgIH0KICAgICAgICBpZiAoaSA9PT0gdGhpcy5jYXNlcy5sZW5ndGggLSAxICYmICF0aGlzLm90aGVyd2lzZSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGV4cHIgPSB0aGlzLmxhc3ROb25Db21tZW50KGJsb2NrLmV4cHJlc3Npb25zKTsKICAgICAgICBpZiAoZXhwciBpbnN0YW5jZW9mIFJldHVybiB8fCAoZXhwciBpbnN0YW5jZW9mIExpdGVyYWwgJiYgZXhwci5qdW1wcygpICYmIGV4cHIudmFsdWUgIT09ICdkZWJ1Z2dlcicpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29kZSArPSBpZHQyICsgJ2JyZWFrO1xuJzsKICAgICAgfQogICAgICBpZiAodGhpcy5vdGhlcndpc2UgJiYgdGhpcy5vdGhlcndpc2UuZXhwcmVzc2lvbnMubGVuZ3RoKSB7CiAgICAgICAgY29kZSArPSBpZHQxICsgKCJkZWZhdWx0OlxuIiArICh0aGlzLm90aGVyd2lzZS5jb21waWxlKG8sIExFVkVMX1RPUCkpICsgIlxuIik7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvZGUgKyB0aGlzLnRhYiArICd9JzsKICAgIH07CiAgICByZXR1cm4gU3dpdGNoOwogIH0pKCk7CiAgZXhwb3J0cy5JZiA9IElmID0gKGZ1bmN0aW9uKCkgewogICAgX19leHRlbmRzKElmLCBCYXNlKTsKICAgIGZ1bmN0aW9uIElmKGNvbmRpdGlvbiwgYm9keSwgb3B0aW9ucykgewogICAgICB0aGlzLmJvZHkgPSBib2R5OwogICAgICBpZiAob3B0aW9ucyA9PSBudWxsKSB7CiAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICB9CiAgICAgIHRoaXMuY29uZGl0aW9uID0gb3B0aW9ucy50eXBlID09PSAndW5sZXNzJyA/IGNvbmRpdGlvbi5pbnZlcnQoKSA6IGNvbmRpdGlvbjsKICAgICAgdGhpcy5lbHNlQm9keSA9IG51bGw7CiAgICAgIHRoaXMuaXNDaGFpbiA9IGZhbHNlOwogICAgICB0aGlzLnNvYWsgPSBvcHRpb25zLnNvYWs7CiAgICB9CiAgICBJZi5wcm90b3R5cGUuY2hpbGRyZW4gPSBbJ2NvbmRpdGlvbicsICdib2R5JywgJ2Vsc2VCb2R5J107CiAgICBJZi5wcm90b3R5cGUuYm9keU5vZGUgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIF9yZWYyOwogICAgICByZXR1cm4gKF9yZWYyID0gdGhpcy5ib2R5KSAhPSBudWxsID8gX3JlZjIudW53cmFwKCkgOiB2b2lkIDA7CiAgICB9OwogICAgSWYucHJvdG90eXBlLmVsc2VCb2R5Tm9kZSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgX3JlZjI7CiAgICAgIHJldHVybiAoX3JlZjIgPSB0aGlzLmVsc2VCb2R5KSAhPSBudWxsID8gX3JlZjIudW53cmFwKCkgOiB2b2lkIDA7CiAgICB9OwogICAgSWYucHJvdG90eXBlLmFkZEVsc2UgPSBmdW5jdGlvbihlbHNlQm9keSkgewogICAgICBpZiAodGhpcy5pc0NoYWluKSB7CiAgICAgICAgdGhpcy5lbHNlQm9keU5vZGUoKS5hZGRFbHNlKGVsc2VCb2R5KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmlzQ2hhaW4gPSBlbHNlQm9keSBpbnN0YW5jZW9mIElmOwogICAgICAgIHRoaXMuZWxzZUJvZHkgPSB0aGlzLmVuc3VyZUJsb2NrKGVsc2VCb2R5KTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH07CiAgICBJZi5wcm90b3R5cGUuaXNTdGF0ZW1lbnQgPSBmdW5jdGlvbihvKSB7CiAgICAgIHZhciBfcmVmMjsKICAgICAgcmV0dXJuIChvICE9IG51bGwgPyBvLmxldmVsIDogdm9pZCAwKSA9PT0gTEVWRUxfVE9QIHx8IHRoaXMuYm9keU5vZGUoKS5pc1N0YXRlbWVudChvKSB8fCAoKF9yZWYyID0gdGhpcy5lbHNlQm9keU5vZGUoKSkgIT0gbnVsbCA/IF9yZWYyLmlzU3RhdGVtZW50KG8pIDogdm9pZCAwKTsKICAgIH07CiAgICBJZi5wcm90b3R5cGUuanVtcHMgPSBmdW5jdGlvbihvKSB7CiAgICAgIHZhciBfcmVmMjsKICAgICAgcmV0dXJuIHRoaXMuYm9keS5qdW1wcyhvKSB8fCAoKF9yZWYyID0gdGhpcy5lbHNlQm9keSkgIT0gbnVsbCA/IF9yZWYyLmp1bXBzKG8pIDogdm9pZCAwKTsKICAgIH07CiAgICBJZi5wcm90b3R5cGUuY29tcGlsZU5vZGUgPSBmdW5jdGlvbihvKSB7CiAgICAgIGlmICh0aGlzLmlzU3RhdGVtZW50KG8pKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZVN0YXRlbWVudChvKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdGhpcy5jb21waWxlRXhwcmVzc2lvbihvKTsKICAgICAgfQogICAgfTsKICAgIElmLnByb3RvdHlwZS5tYWtlUmV0dXJuID0gZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMuYm9keSAmJiAodGhpcy5ib2R5ID0gbmV3IEJsb2NrKFt0aGlzLmJvZHkubWFrZVJldHVybigpXSkpOwogICAgICB0aGlzLmVsc2VCb2R5ICYmICh0aGlzLmVsc2VCb2R5ID0gbmV3IEJsb2NrKFt0aGlzLmVsc2VCb2R5Lm1ha2VSZXR1cm4oKV0pKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwogICAgSWYucHJvdG90eXBlLmVuc3VyZUJsb2NrID0gZnVuY3Rpb24obm9kZSkgewogICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEJsb2NrKSB7CiAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIG5ldyBCbG9jayhbbm9kZV0pOwogICAgICB9CiAgICB9OwogICAgSWYucHJvdG90eXBlLmNvbXBpbGVTdGF0ZW1lbnQgPSBmdW5jdGlvbihvKSB7CiAgICAgIHZhciBib2R5LCBjaGlsZCwgY29uZCwgZXhlcSwgaWZQYXJ0OwogICAgICBjaGlsZCA9IGRlbChvLCAnY2hhaW5DaGlsZCcpOwogICAgICBleGVxID0gZGVsKG8sICdpc0V4aXN0ZW50aWFsRXF1YWxzJyk7CiAgICAgIGlmIChleGVxKSB7CiAgICAgICAgcmV0dXJuIG5ldyBJZih0aGlzLmNvbmRpdGlvbi5pbnZlcnQoKSwgdGhpcy5lbHNlQm9keU5vZGUoKSwgewogICAgICAgICAgdHlwZTogJ2lmJwogICAgICAgIH0pLmNvbXBpbGUobyk7CiAgICAgIH0KICAgICAgY29uZCA9IHRoaXMuY29uZGl0aW9uLmNvbXBpbGUobywgTEVWRUxfUEFSRU4pOwogICAgICBvLmluZGVudCArPSBUQUI7CiAgICAgIGJvZHkgPSB0aGlzLmVuc3VyZUJsb2NrKHRoaXMuYm9keSkuY29tcGlsZShvKTsKICAgICAgaWYgKGJvZHkpIHsKICAgICAgICBib2R5ID0gIlxuIiArIGJvZHkgKyAiXG4iICsgdGhpcy50YWI7CiAgICAgIH0KICAgICAgaWZQYXJ0ID0gImlmICgiICsgY29uZCArICIpIHsiICsgYm9keSArICJ9IjsKICAgICAgaWYgKCFjaGlsZCkgewogICAgICAgIGlmUGFydCA9IHRoaXMudGFiICsgaWZQYXJ0OwogICAgICB9CiAgICAgIGlmICghdGhpcy5lbHNlQm9keSkgewogICAgICAgIHJldHVybiBpZlBhcnQ7CiAgICAgIH0KICAgICAgcmV0dXJuIGlmUGFydCArICcgZWxzZSAnICsgKHRoaXMuaXNDaGFpbiA/IChvLmluZGVudCA9IHRoaXMudGFiLCBvLmNoYWluQ2hpbGQgPSB0cnVlLCB0aGlzLmVsc2VCb2R5LnVud3JhcCgpLmNvbXBpbGUobywgTEVWRUxfVE9QKSkgOiAie1xuIiArICh0aGlzLmVsc2VCb2R5LmNvbXBpbGUobywgTEVWRUxfVE9QKSkgKyAiXG4iICsgdGhpcy50YWIgKyAifSIpOwogICAgfTsKICAgIElmLnByb3RvdHlwZS5jb21waWxlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uKG8pIHsKICAgICAgdmFyIGFsdCwgYm9keSwgY29kZSwgY29uZDsKICAgICAgY29uZCA9IHRoaXMuY29uZGl0aW9uLmNvbXBpbGUobywgTEVWRUxfQ09ORCk7CiAgICAgIGJvZHkgPSB0aGlzLmJvZHlOb2RlKCkuY29tcGlsZShvLCBMRVZFTF9MSVNUKTsKICAgICAgYWx0ID0gdGhpcy5lbHNlQm9keU5vZGUoKSA/IHRoaXMuZWxzZUJvZHlOb2RlKCkuY29tcGlsZShvLCBMRVZFTF9MSVNUKSA6ICd2b2lkIDAnOwogICAgICBjb2RlID0gIiIgKyBjb25kICsgIiA/ICIgKyBib2R5ICsgIiA6ICIgKyBhbHQ7CiAgICAgIGlmIChvLmxldmVsID49IExFVkVMX0NPTkQpIHsKICAgICAgICByZXR1cm4gIigiICsgY29kZSArICIpIjsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gY29kZTsKICAgICAgfQogICAgfTsKICAgIElmLnByb3RvdHlwZS51bmZvbGRTb2FrID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLnNvYWsgJiYgdGhpczsKICAgIH07CiAgICByZXR1cm4gSWY7CiAgfSkoKTsKICBQdXNoID0gewogICAgd3JhcDogZnVuY3Rpb24obmFtZSwgZXhwcykgewogICAgICBpZiAoZXhwcy5pc0VtcHR5KCkgfHwgbGFzdChleHBzLmV4cHJlc3Npb25zKS5qdW1wcygpKSB7CiAgICAgICAgcmV0dXJuIGV4cHM7CiAgICAgIH0KICAgICAgcmV0dXJuIGV4cHMucHVzaChuZXcgQ2FsbChuZXcgVmFsdWUobmV3IExpdGVyYWwobmFtZSksIFtuZXcgQWNjZXNzKG5ldyBMaXRlcmFsKCdwdXNoJykpXSksIFtleHBzLnBvcCgpXSkpOwogICAgfQogIH07CiAgQ2xvc3VyZSA9IHsKICAgIHdyYXA6IGZ1bmN0aW9uKGV4cHJlc3Npb25zLCBzdGF0ZW1lbnQsIG5vUmV0dXJuKSB7CiAgICAgIHZhciBhcmdzLCBjYWxsLCBmdW5jLCBtZW50aW9uc0FyZ3MsIG1ldGg7CiAgICAgIGlmIChleHByZXNzaW9ucy5qdW1wcygpKSB7CiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb25zOwogICAgICB9CiAgICAgIGZ1bmMgPSBuZXcgQ29kZShbXSwgQmxvY2sud3JhcChbZXhwcmVzc2lvbnNdKSk7CiAgICAgIGFyZ3MgPSBbXTsKICAgICAgaWYgKChtZW50aW9uc0FyZ3MgPSBleHByZXNzaW9ucy5jb250YWlucyh0aGlzLmxpdGVyYWxBcmdzKSkgfHwgZXhwcmVzc2lvbnMuY29udGFpbnModGhpcy5saXRlcmFsVGhpcykpIHsKICAgICAgICBtZXRoID0gbmV3IExpdGVyYWwobWVudGlvbnNBcmdzID8gJ2FwcGx5JyA6ICdjYWxsJyk7CiAgICAgICAgYXJncyA9IFtuZXcgTGl0ZXJhbCgndGhpcycpXTsKICAgICAgICBpZiAobWVudGlvbnNBcmdzKSB7CiAgICAgICAgICBhcmdzLnB1c2gobmV3IExpdGVyYWwoJ2FyZ3VtZW50cycpKTsKICAgICAgICB9CiAgICAgICAgZnVuYyA9IG5ldyBWYWx1ZShmdW5jLCBbbmV3IEFjY2VzcyhtZXRoKV0pOwogICAgICB9CiAgICAgIGZ1bmMubm9SZXR1cm4gPSBub1JldHVybjsKICAgICAgY2FsbCA9IG5ldyBDYWxsKGZ1bmMsIGFyZ3MpOwogICAgICBpZiAoc3RhdGVtZW50KSB7CiAgICAgICAgcmV0dXJuIEJsb2NrLndyYXAoW2NhbGxdKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gY2FsbDsKICAgICAgfQogICAgfSwKICAgIGxpdGVyYWxBcmdzOiBmdW5jdGlvbihub2RlKSB7CiAgICAgIHJldHVybiBub2RlIGluc3RhbmNlb2YgTGl0ZXJhbCAmJiBub2RlLnZhbHVlID09PSAnYXJndW1lbnRzJyAmJiAhbm9kZS5hc0tleTsKICAgIH0sCiAgICBsaXRlcmFsVGhpczogZnVuY3Rpb24obm9kZSkgewogICAgICByZXR1cm4gKG5vZGUgaW5zdGFuY2VvZiBMaXRlcmFsICYmIG5vZGUudmFsdWUgPT09ICd0aGlzJyAmJiAhbm9kZS5hc0tleSkgfHwgKG5vZGUgaW5zdGFuY2VvZiBDb2RlICYmIG5vZGUuYm91bmQpOwogICAgfQogIH07CiAgdW5mb2xkU29hayA9IGZ1bmN0aW9uKG8sIHBhcmVudCwgbmFtZSkgewogICAgdmFyIGlmbjsKICAgIGlmICghKGlmbiA9IHBhcmVudFtuYW1lXS51bmZvbGRTb2FrKG8pKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBwYXJlbnRbbmFtZV0gPSBpZm4uYm9keTsKICAgIGlmbi5ib2R5ID0gbmV3IFZhbHVlKHBhcmVudCk7CiAgICByZXR1cm4gaWZuOwogIH07CiAgVVRJTElUSUVTID0gewogICAgImV4dGVuZHMiOiAnZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkge1xuICBmb3IgKHZhciBrZXkgaW4gcGFyZW50KSB7IGlmIChfX2hhc1Byb3AuY2FsbChwYXJlbnQsIGtleSkpIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTsgfVxuICBmdW5jdGlvbiBjdG9yKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH1cbiAgY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlO1xuICBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcjtcbiAgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTtcbiAgcmV0dXJuIGNoaWxkO1xufScsCiAgICBiaW5kOiAnZnVuY3Rpb24oZm4sIG1lKXsgcmV0dXJuIGZ1bmN0aW9uKCl7IHJldHVybiBmbi5hcHBseShtZSwgYXJndW1lbnRzKTsgfTsgfScsCiAgICBpbmRleE9mOiAnQXJyYXkucHJvdG90eXBlLmluZGV4T2YgfHwgZnVuY3Rpb24oaXRlbSkge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKHRoaXNbaV0gPT09IGl0ZW0pIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn0nLAogICAgaGFzUHJvcDogJ09iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHknLAogICAgc2xpY2U6ICdBcnJheS5wcm90b3R5cGUuc2xpY2UnCiAgfTsKICBMRVZFTF9UT1AgPSAxOwogIExFVkVMX1BBUkVOID0gMjsKICBMRVZFTF9MSVNUID0gMzsKICBMRVZFTF9DT05EID0gNDsKICBMRVZFTF9PUCA9IDU7CiAgTEVWRUxfQUNDRVNTID0gNjsKICBUQUIgPSAnICAnOwogIElERU5USUZJRVIgPSAvXlskQS1aYS16X1x4N2YtXHVmZmZmXVskXHdceDdmLVx1ZmZmZl0qJC87CiAgU0lNUExFTlVNID0gL15bKy1dP1xkKyQvOwogIE1FVEhPRF9ERUYgPSAvXig/OihbJEEtWmEtel9dWyRcd1x4N2YtXHVmZmZmXSopXC5wcm90b3R5cGVcLik/KFskQS1aYS16X11bJFx3XHg3Zi1cdWZmZmZdKikkLzsKICBJU19TVFJJTkcgPSAvXlsnIl0vOwogIHV0aWxpdHkgPSBmdW5jdGlvbihuYW1lKSB7CiAgICB2YXIgcmVmOwogICAgcmVmID0gIl9fIiArIG5hbWU7CiAgICBTY29wZS5yb290LmFzc2lnbihyZWYsIFVUSUxJVElFU1tuYW1lXSk7CiAgICByZXR1cm4gcmVmOwogIH07CiAgbXVsdGlkZW50ID0gZnVuY3Rpb24oY29kZSwgdGFiKSB7CiAgICByZXR1cm4gY29kZS5yZXBsYWNlKC9cbi9nLCAnJCYnICsgdGFiKTsKICB9Owp9KTsKLyoqCiAqIENvcHlyaWdodCAoYykgMjAxMSBKZXJlbXkgQXNoa2VuYXMKICoKICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAogKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKICogY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCiAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCiAqIGNvbmRpdGlvbnM6CiAqIAogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQogKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KICogCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAogKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKICogT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKICogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCiAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORwogKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCiAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICovCgpkZWZpbmUoJ2FjZS9tb2RlL2NvZmZlZS9zY29wZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL21vZGUvY29mZmVlL2hlbHBlcnMnXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiAgdmFyIFNjb3BlLCBleHRlbmQsIGxhc3QsIF9yZWY7CiAgX3JlZiA9IHJlcXVpcmUoJy4vaGVscGVycycpLCBleHRlbmQgPSBfcmVmLmV4dGVuZCwgbGFzdCA9IF9yZWYubGFzdDsKICBleHBvcnRzLlNjb3BlID0gU2NvcGUgPSAoZnVuY3Rpb24oKSB7CiAgICBTY29wZS5yb290ID0gbnVsbDsKICAgIGZ1bmN0aW9uIFNjb3BlKHBhcmVudCwgZXhwcmVzc2lvbnMsIG1ldGhvZCkgewogICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKICAgICAgdGhpcy5leHByZXNzaW9ucyA9IGV4cHJlc3Npb25zOwogICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDsKICAgICAgdGhpcy52YXJpYWJsZXMgPSBbCiAgICAgICAgewogICAgICAgICAgbmFtZTogJ2FyZ3VtZW50cycsCiAgICAgICAgICB0eXBlOiAnYXJndW1lbnRzJwogICAgICAgIH0KICAgICAgXTsKICAgICAgdGhpcy5wb3NpdGlvbnMgPSB7fTsKICAgICAgaWYgKCF0aGlzLnBhcmVudCkgewogICAgICAgIFNjb3BlLnJvb3QgPSB0aGlzOwogICAgICB9CiAgICB9CiAgICBTY29wZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24obmFtZSwgdHlwZSwgaW1tZWRpYXRlKSB7CiAgICAgIHZhciBwb3M7CiAgICAgIGlmICh0aGlzLnNoYXJlZCAmJiAhaW1tZWRpYXRlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmFkZChuYW1lLCB0eXBlLCBpbW1lZGlhdGUpOwogICAgICB9CiAgICAgIGlmICh0eXBlb2YgKHBvcyA9IHRoaXMucG9zaXRpb25zW25hbWVdKSA9PT0gJ251bWJlcicpIHsKICAgICAgICByZXR1cm4gdGhpcy52YXJpYWJsZXNbcG9zXS50eXBlID0gdHlwZTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbnNbbmFtZV0gPSB0aGlzLnZhcmlhYmxlcy5wdXNoKHsKICAgICAgICAgIG5hbWU6IG5hbWUsCiAgICAgICAgICB0eXBlOiB0eXBlCiAgICAgICAgfSkgLSAxOwogICAgICB9CiAgICB9OwogICAgU2NvcGUucHJvdG90eXBlLmZpbmQgPSBmdW5jdGlvbihuYW1lLCBvcHRpb25zKSB7CiAgICAgIGlmICh0aGlzLmNoZWNrKG5hbWUsIG9wdGlvbnMpKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgdGhpcy5hZGQobmFtZSwgJ3ZhcicpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwogICAgU2NvcGUucHJvdG90eXBlLnBhcmFtZXRlciA9IGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgaWYgKHRoaXMuc2hhcmVkICYmIHRoaXMucGFyZW50LmNoZWNrKG5hbWUsIHRydWUpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLmFkZChuYW1lLCAncGFyYW0nKTsKICAgIH07CiAgICBTY29wZS5wcm90b3R5cGUuY2hlY2sgPSBmdW5jdGlvbihuYW1lLCBpbW1lZGlhdGUpIHsKICAgICAgdmFyIGZvdW5kLCBfcmVmMjsKICAgICAgZm91bmQgPSAhIXRoaXMudHlwZShuYW1lKTsKICAgICAgaWYgKGZvdW5kIHx8IGltbWVkaWF0ZSkgewogICAgICAgIHJldHVybiBmb3VuZDsKICAgICAgfQogICAgICByZXR1cm4gISEoKF9yZWYyID0gdGhpcy5wYXJlbnQpICE9IG51bGwgPyBfcmVmMi5jaGVjayhuYW1lKSA6IHZvaWQgMCk7CiAgICB9OwogICAgU2NvcGUucHJvdG90eXBlLnRlbXBvcmFyeSA9IGZ1bmN0aW9uKG5hbWUsIGluZGV4KSB7CiAgICAgIGlmIChuYW1lLmxlbmd0aCA+IDEpIHsKICAgICAgICByZXR1cm4gJ18nICsgbmFtZSArIChpbmRleCA+IDEgPyBpbmRleCA6ICcnKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gJ18nICsgKGluZGV4ICsgcGFyc2VJbnQobmFtZSwgMzYpKS50b1N0cmluZygzNikucmVwbGFjZSgvXGQvZywgJ2EnKTsKICAgICAgfQogICAgfTsKICAgIFNjb3BlLnByb3RvdHlwZS50eXBlID0gZnVuY3Rpb24obmFtZSkgewogICAgICB2YXIgdiwgX2ksIF9sZW4sIF9yZWYyOwogICAgICBfcmVmMiA9IHRoaXMudmFyaWFibGVzOwogICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYyLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7CiAgICAgICAgdiA9IF9yZWYyW19pXTsKICAgICAgICBpZiAodi5uYW1lID09PSBuYW1lKSB7CiAgICAgICAgICByZXR1cm4gdi50eXBlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH07CiAgICBTY29wZS5wcm90b3R5cGUuZnJlZVZhcmlhYmxlID0gZnVuY3Rpb24odHlwZSkgewogICAgICB2YXIgaW5kZXgsIHRlbXA7CiAgICAgIGluZGV4ID0gMDsKICAgICAgd2hpbGUgKHRoaXMuY2hlY2soKHRlbXAgPSB0aGlzLnRlbXBvcmFyeSh0eXBlLCBpbmRleCkpKSkgewogICAgICAgIGluZGV4Kys7CiAgICAgIH0KICAgICAgdGhpcy5hZGQodGVtcCwgJ3ZhcicsIHRydWUpOwogICAgICByZXR1cm4gdGVtcDsKICAgIH07CiAgICBTY29wZS5wcm90b3R5cGUuYXNzaWduID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKICAgICAgdGhpcy5hZGQobmFtZSwgewogICAgICAgIHZhbHVlOiB2YWx1ZSwKICAgICAgICBhc3NpZ25lZDogdHJ1ZQogICAgICB9KTsKICAgICAgcmV0dXJuIHRoaXMuaGFzQXNzaWdubWVudHMgPSB0cnVlOwogICAgfTsKICAgIFNjb3BlLnByb3RvdHlwZS5oYXNEZWNsYXJhdGlvbnMgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuICEhdGhpcy5kZWNsYXJlZFZhcmlhYmxlcygpLmxlbmd0aDsKICAgIH07CiAgICBTY29wZS5wcm90b3R5cGUuZGVjbGFyZWRWYXJpYWJsZXMgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIHJlYWxWYXJzLCB0ZW1wVmFycywgdiwgX2ksIF9sZW4sIF9yZWYyOwogICAgICByZWFsVmFycyA9IFtdOwogICAgICB0ZW1wVmFycyA9IFtdOwogICAgICBfcmVmMiA9IHRoaXMudmFyaWFibGVzOwogICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYyLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7CiAgICAgICAgdiA9IF9yZWYyW19pXTsKICAgICAgICBpZiAodi50eXBlID09PSAndmFyJykgewogICAgICAgICAgKHYubmFtZS5jaGFyQXQoMCkgPT09ICdfJyA/IHRlbXBWYXJzIDogcmVhbFZhcnMpLnB1c2godi5uYW1lKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlYWxWYXJzLnNvcnQoKS5jb25jYXQodGVtcFZhcnMuc29ydCgpKTsKICAgIH07CiAgICBTY29wZS5wcm90b3R5cGUuYXNzaWduZWRWYXJpYWJsZXMgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIHYsIF9pLCBfbGVuLCBfcmVmMiwgX3Jlc3VsdHM7CiAgICAgIF9yZWYyID0gdGhpcy52YXJpYWJsZXM7CiAgICAgIF9yZXN1bHRzID0gW107CiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjIubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsKICAgICAgICB2ID0gX3JlZjJbX2ldOwogICAgICAgIGlmICh2LnR5cGUuYXNzaWduZWQpIHsKICAgICAgICAgIF9yZXN1bHRzLnB1c2goIiIgKyB2Lm5hbWUgKyAiID0gIiArIHYudHlwZS52YWx1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBfcmVzdWx0czsKICAgIH07CiAgICByZXR1cm4gU2NvcGU7CiAgfSkoKTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/ace/src/worker-css.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Im5vIHVzZSBzdHJpY3QiOwoKdmFyIGNvbnNvbGUgPSB7CiAgICBsb2c6IGZ1bmN0aW9uKG1zZykgewogICAgICAgIHBvc3RNZXNzYWdlKHt0eXBlOiAibG9nIiwgZGF0YTogbXNnfSk7CiAgICB9Cn07CnZhciB3aW5kb3cgPSB7CiAgICBjb25zb2xlOiBjb25zb2xlCn07Cgp2YXIgbm9ybWFsaXplTW9kdWxlID0gZnVuY3Rpb24ocGFyZW50SWQsIG1vZHVsZU5hbWUpIHsKICAgIC8vIG5vcm1hbGl6ZSBwbHVnaW4gcmVxdWlyZXMKICAgIGlmIChtb2R1bGVOYW1lLmluZGV4T2YoIiEiKSAhPT0gLTEpIHsKICAgICAgICB2YXIgY2h1bmtzID0gbW9kdWxlTmFtZS5zcGxpdCgiISIpOwogICAgICAgIHJldHVybiBub3JtYWxpemVNb2R1bGUocGFyZW50SWQsIGNodW5rc1swXSkgKyAiISIgKyBub3JtYWxpemVNb2R1bGUocGFyZW50SWQsIGNodW5rc1sxXSk7CiAgICB9CiAgICAvLyBub3JtYWxpemUgcmVsYXRpdmUgcmVxdWlyZXMKICAgIGlmIChtb2R1bGVOYW1lLmNoYXJBdCgwKSA9PSAiLiIpIHsKICAgICAgICB2YXIgYmFzZSA9IHBhcmVudElkLnNwbGl0KCIvIikuc2xpY2UoMCwgLTEpLmpvaW4oIi8iKTsKICAgICAgICB2YXIgbW9kdWxlTmFtZSA9IGJhc2UgKyAiLyIgKyBtb2R1bGVOYW1lOwogICAgICAgIAogICAgICAgIHdoaWxlKG1vZHVsZU5hbWUuaW5kZXhPZigiLiIpICE9PSAtMSAmJiBwcmV2aW91cyAhPSBtb2R1bGVOYW1lKSB7CiAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IG1vZHVsZU5hbWU7CiAgICAgICAgICAgIHZhciBtb2R1bGVOYW1lID0gbW9kdWxlTmFtZS5yZXBsYWNlKC9cL1wuXC8vLCAiLyIpLnJlcGxhY2UoL1teXC9dK1wvXC5cLlwvLywgIiIpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgcmV0dXJuIG1vZHVsZU5hbWU7Cn07Cgp2YXIgcmVxdWlyZSA9IGZ1bmN0aW9uKHBhcmVudElkLCBpZCkgewogICAgdmFyIGlkID0gbm9ybWFsaXplTW9kdWxlKHBhcmVudElkLCBpZCk7CiAgICAKICAgIHZhciBtb2R1bGUgPSByZXF1aXJlLm1vZHVsZXNbaWRdOwogICAgaWYgKG1vZHVsZSkgewogICAgICAgIGlmICghbW9kdWxlLmluaXRpYWxpemVkKSB7CiAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gbW9kdWxlLmZhY3RvcnkoKS5leHBvcnRzOwogICAgICAgICAgICBtb2R1bGUuaW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbW9kdWxlLmV4cG9ydHM7CiAgICB9CiAgICAKICAgIHZhciBjaHVua3MgPSBpZC5zcGxpdCgiLyIpOwogICAgY2h1bmtzWzBdID0gcmVxdWlyZS50bG5zW2NodW5rc1swXV0gfHwgY2h1bmtzWzBdOwogICAgdmFyIHBhdGggPSBjaHVua3Muam9pbigiLyIpICsgIi5qcyI7CiAgICAKICAgIHJlcXVpcmUuaWQgPSBpZDsKICAgIGltcG9ydFNjcmlwdHMocGF0aCk7CiAgICByZXR1cm4gcmVxdWlyZShwYXJlbnRJZCwgaWQpOyAgICAKfTsKCnJlcXVpcmUubW9kdWxlcyA9IHt9OwpyZXF1aXJlLnRsbnMgPSB7fTsKCnZhciBkZWZpbmUgPSBmdW5jdGlvbihpZCwgZGVwcywgZmFjdG9yeSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICAgIGZhY3RvcnkgPSBkZXBzOwogICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgICBmYWN0b3J5ID0gaWQ7CiAgICAgICAgaWQgPSByZXF1aXJlLmlkOwogICAgfQoKICAgIGlmIChpZC5pbmRleE9mKCJ0ZXh0ISIpID09PSAwKSAKICAgICAgICByZXR1cm47CiAgICAKICAgIHZhciByZXEgPSBmdW5jdGlvbihkZXBzLCBmYWN0b3J5KSB7CiAgICAgICAgcmV0dXJuIHJlcXVpcmUoaWQsIGRlcHMsIGZhY3RvcnkpOwogICAgfTsKCiAgICByZXF1aXJlLm1vZHVsZXNbaWRdID0gewogICAgICAgIGZhY3Rvcnk6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgbW9kdWxlID0gewogICAgICAgICAgICAgICAgZXhwb3J0czoge30KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHJldHVybkV4cG9ydHMgPSBmYWN0b3J5KHJlcSwgbW9kdWxlLmV4cG9ydHMsIG1vZHVsZSk7CiAgICAgICAgICAgIGlmIChyZXR1cm5FeHBvcnRzKQogICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSByZXR1cm5FeHBvcnRzOwogICAgICAgICAgICByZXR1cm4gbW9kdWxlOwogICAgICAgIH0KICAgIH07Cn07CgpmdW5jdGlvbiBpbml0QmFzZVVybHModG9wTGV2ZWxOYW1lc3BhY2VzKSB7CiAgICByZXF1aXJlLnRsbnMgPSB0b3BMZXZlbE5hbWVzcGFjZXM7Cn0KCmZ1bmN0aW9uIGluaXRTZW5kZXIoKSB7CgogICAgdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUobnVsbCwgImFjZS9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsKICAgIHZhciBvb3AgPSByZXF1aXJlKG51bGwsICJhY2UvbGliL29vcCIpOwogICAgCiAgICB2YXIgU2VuZGVyID0gZnVuY3Rpb24oKSB7fTsKICAgIAogICAgKGZ1bmN0aW9uKCkgewogICAgICAgIAogICAgICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsKICAgICAgICAgICAgICAgIAogICAgICAgIHRoaXMuY2FsbGJhY2sgPSBmdW5jdGlvbihkYXRhLCBjYWxsYmFja0lkKSB7CiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgIHR5cGU6ICJjYWxsIiwKICAgICAgICAgICAgICAgIGlkOiBjYWxsYmFja0lkLAogICAgICAgICAgICAgICAgZGF0YTogZGF0YQogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgCiAgICAgICAgdGhpcy5lbWl0ID0gZnVuY3Rpb24obmFtZSwgZGF0YSkgewogICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICB0eXBlOiAiZXZlbnQiLAogICAgICAgICAgICAgICAgbmFtZTogbmFtZSwKICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAKICAgIH0pLmNhbGwoU2VuZGVyLnByb3RvdHlwZSk7CiAgICAKICAgIHJldHVybiBuZXcgU2VuZGVyKCk7Cn0KCnZhciBtYWluOwp2YXIgc2VuZGVyOwoKb25tZXNzYWdlID0gZnVuY3Rpb24oZSkgewogICAgdmFyIG1zZyA9IGUuZGF0YTsKICAgIGlmIChtc2cuY29tbWFuZCkgewogICAgICAgIG1haW5bbXNnLmNvbW1hbmRdLmFwcGx5KG1haW4sIG1zZy5hcmdzKTsKICAgIH0KICAgIGVsc2UgaWYgKG1zZy5pbml0KSB7ICAgICAgICAKICAgICAgICBpbml0QmFzZVVybHMobXNnLnRsbnMpOwogICAgICAgIHJlcXVpcmUobnVsbCwgImFjZS9saWIvZml4b2xkYnJvd3NlcnMiKTsKICAgICAgICBzZW5kZXIgPSBpbml0U2VuZGVyKCk7CiAgICAgICAgdmFyIGNsYXp6ID0gcmVxdWlyZShudWxsLCBtc2cubW9kdWxlKVttc2cuY2xhc3NuYW1lXTsKICAgICAgICBtYWluID0gbmV3IGNsYXp6KHNlbmRlcik7CiAgICB9IAogICAgZWxzZSBpZiAobXNnLmV2ZW50ICYmIHNlbmRlcikgewogICAgICAgIHNlbmRlci5fZW1pdChtc2cuZXZlbnQsIG1zZy5kYXRhKTsKICAgIH0KfTsKLy8gdmltOnNldCB0cz00IHN0cz00IHN3PTQgc3Q6Ci8vIC0tIGtyaXNrb3dhbCBLcmlzIEtvd2FsIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1JVCBMaWNlbnNlCi8vIC0tIHRscm9iaW5zb24gVG9tIFJvYmluc29uIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1JVCBMaWNlbnNlIChOYXJ3aGFsIFByb2plY3QpCi8vIC0tIGRhbnRtYW4gRGFuaWVsIEZyaWVzZW4gQ29weXJpZ2h0KEMpIDIwMTAgWFhYIE5vIExpY2Vuc2UgU3BlY2lmaWVkCi8vIC0tIGZzY2hhZWZlciBGbG9yaWFuIFNjaMOkZmVyIENvcHlyaWdodCAoQykgMjAxMCBNSVQgTGljZW5zZQovLyAtLSBJcmFrbGkgR296YWxpc2h2aWxpIENvcHlyaWdodCAoQykgMjAxMCBNSVQgTGljZW5zZQoKLyohCiAgICBDb3B5cmlnaHQgKGMpIDIwMDksIDI4MCBOb3J0aCBJbmMuIGh0dHA6Ly8yODBub3J0aC5jb20vCiAgICBNSVQgTGljZW5zZS4gaHR0cDovL2dpdGh1Yi5jb20vMjgwbm9ydGgvbmFyd2hhbC9ibG9iL21hc3Rlci9SRUFETUUubWQKKi8KCmRlZmluZSgnYWNlL2xpYi9maXhvbGRicm93c2VycycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9yZWdleHAnLCAnYWNlL2xpYi9lczUtc2hpbSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKcmVxdWlyZSgiLi9yZWdleHAiKTsKcmVxdWlyZSgiLi9lczUtc2hpbSIpOwoKfSk7LyoqCiAqICBCYXNlZCBvbiBjb2RlIGZyb206CiAqCiAqIFhSZWdFeHAgMS41LjAKICogKGMpIDIwMDctMjAxMCBTdGV2ZW4gTGV2aXRoYW4KICogTUlUIExpY2Vuc2UKICogPGh0dHA6Ly94cmVnZXhwLmNvbT4KICogUHJvdmlkZXMgYW4gYXVnbWVudGVkLCBleHRlbnNpYmxlLCBjcm9zcy1icm93c2VyIGltcGxlbWVudGF0aW9uIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMsCiAqIGluY2x1ZGluZyBzdXBwb3J0IGZvciBhZGRpdGlvbmFsIHN5bnRheCwgZmxhZ3MsIGFuZCBtZXRob2RzCiAqLwogCmRlZmluZSgnYWNlL2xpYi9yZWdleHAnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7CgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vICBQcml2YXRlIHZhcmlhYmxlcwogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICB2YXIgcmVhbCA9IHsKICAgICAgICAgICAgZXhlYzogUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICAgICB0ZXN0OiBSZWdFeHAucHJvdG90eXBlLnRlc3QsCiAgICAgICAgICAgIG1hdGNoOiBTdHJpbmcucHJvdG90eXBlLm1hdGNoLAogICAgICAgICAgICByZXBsYWNlOiBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2UsCiAgICAgICAgICAgIHNwbGl0OiBTdHJpbmcucHJvdG90eXBlLnNwbGl0CiAgICAgICAgfSwKICAgICAgICBjb21wbGlhbnRFeGVjTnBjZyA9IHJlYWwuZXhlYy5jYWxsKC8oKT8/LywgIiIpWzFdID09PSB1bmRlZmluZWQsIC8vIGNoZWNrIGBleGVjYCBoYW5kbGluZyBvZiBub25wYXJ0aWNpcGF0aW5nIGNhcHR1cmluZyBncm91cHMKICAgICAgICBjb21wbGlhbnRMYXN0SW5kZXhJbmNyZW1lbnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciB4ID0gL14vZzsKICAgICAgICAgICAgcmVhbC50ZXN0LmNhbGwoeCwgIiIpOwogICAgICAgICAgICByZXR1cm4gIXgubGFzdEluZGV4OwogICAgICAgIH0oKTsKCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gIE92ZXJyaWRlbiBuYXRpdmUgbWV0aG9kcwogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAvLyBBZGRzIG5hbWVkIGNhcHR1cmUgc3VwcG9ydCAod2l0aCBiYWNrcmVmZXJlbmNlcyByZXR1cm5lZCBhcyBgcmVzdWx0Lm5hbWVgKSwgYW5kIGZpeGVzIHR3bwogICAgLy8gY3Jvc3MtYnJvd3NlciBpc3N1ZXMgcGVyIEVTMzoKICAgIC8vIC0gQ2FwdHVyZWQgdmFsdWVzIGZvciBub25wYXJ0aWNpcGF0aW5nIGNhcHR1cmluZyBncm91cHMgc2hvdWxkIGJlIHJldHVybmVkIGFzIGB1bmRlZmluZWRgLAogICAgLy8gICByYXRoZXIgdGhhbiB0aGUgZW1wdHkgc3RyaW5nLgogICAgLy8gLSBgbGFzdEluZGV4YCBzaG91bGQgbm90IGJlIGluY3JlbWVudGVkIGFmdGVyIHplcm8tbGVuZ3RoIG1hdGNoZXMuCiAgICBSZWdFeHAucHJvdG90eXBlLmV4ZWMgPSBmdW5jdGlvbiAoc3RyKSB7CiAgICAgICAgdmFyIG1hdGNoID0gcmVhbC5leGVjLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksCiAgICAgICAgICAgIG5hbWUsIHIyOwogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICAvLyBGaXggYnJvd3NlcnMgd2hvc2UgYGV4ZWNgIG1ldGhvZHMgZG9uJ3QgY29uc2lzdGVudGx5IHJldHVybiBgdW5kZWZpbmVkYCBmb3IKICAgICAgICAgICAgLy8gbm9ucGFydGljaXBhdGluZyBjYXB0dXJpbmcgZ3JvdXBzCiAgICAgICAgICAgIGlmICghY29tcGxpYW50RXhlY05wY2cgJiYgbWF0Y2gubGVuZ3RoID4gMSAmJiBpbmRleE9mKG1hdGNoLCAiIikgPiAtMSkgewogICAgICAgICAgICAgICAgcjIgPSBSZWdFeHAodGhpcy5zb3VyY2UsIHJlYWwucmVwbGFjZS5jYWxsKGdldE5hdGl2ZUZsYWdzKHRoaXMpLCAiZyIsICIiKSk7CiAgICAgICAgICAgICAgICAvLyBVc2luZyBgc3RyLnNsaWNlKG1hdGNoLmluZGV4KWAgcmF0aGVyIHRoYW4gYG1hdGNoWzBdYCBpbiBjYXNlIGxvb2thaGVhZCBhbGxvd2VkCiAgICAgICAgICAgICAgICAvLyBtYXRjaGluZyBkdWUgdG8gY2hhcmFjdGVycyBvdXRzaWRlIHRoZSBtYXRjaAogICAgICAgICAgICAgICAgcmVhbC5yZXBsYWNlLmNhbGwoc3RyLnNsaWNlKG1hdGNoLmluZGV4KSwgcjIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAyOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50c1tpXSA9PT0gdW5kZWZpbmVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbaV0gPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQXR0YWNoIG5hbWVkIGNhcHR1cmUgcHJvcGVydGllcwogICAgICAgICAgICBpZiAodGhpcy5feHJlZ2V4cCAmJiB0aGlzLl94cmVnZXhwLmNhcHR1cmVOYW1lcykgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBtYXRjaC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIG5hbWUgPSB0aGlzLl94cmVnZXhwLmNhcHR1cmVOYW1lc1tpIC0gMV07CiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbbmFtZV0gPSBtYXRjaFtpXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBGaXggYnJvd3NlcnMgdGhhdCBpbmNyZW1lbnQgYGxhc3RJbmRleGAgYWZ0ZXIgemVyby1sZW5ndGggbWF0Y2hlcwogICAgICAgICAgICBpZiAoIWNvbXBsaWFudExhc3RJbmRleEluY3JlbWVudCAmJiB0aGlzLmdsb2JhbCAmJiAhbWF0Y2hbMF0ubGVuZ3RoICYmICh0aGlzLmxhc3RJbmRleCA+IG1hdGNoLmluZGV4KSkKICAgICAgICAgICAgICAgIHRoaXMubGFzdEluZGV4LS07CiAgICAgICAgfQogICAgICAgIHJldHVybiBtYXRjaDsKICAgIH07CgogICAgLy8gRG9uJ3Qgb3ZlcnJpZGUgYHRlc3RgIGlmIGl0IHdvbid0IGNoYW5nZSBhbnl0aGluZwogICAgaWYgKCFjb21wbGlhbnRMYXN0SW5kZXhJbmNyZW1lbnQpIHsKICAgICAgICAvLyBGaXggYnJvd3NlciBidWcgaW4gbmF0aXZlIG1ldGhvZAogICAgICAgIFJlZ0V4cC5wcm90b3R5cGUudGVzdCA9IGZ1bmN0aW9uIChzdHIpIHsKICAgICAgICAgICAgLy8gVXNlIHRoZSBuYXRpdmUgYGV4ZWNgIHRvIHNraXAgc29tZSBwcm9jZXNzaW5nIG92ZXJoZWFkLCBldmVuIHRob3VnaCB0aGUgb3ZlcnJpZGVuCiAgICAgICAgICAgIC8vIGBleGVjYCB3b3VsZCB0YWtlIGNhcmUgb2YgdGhlIGBsYXN0SW5kZXhgIGZpeAogICAgICAgICAgICB2YXIgbWF0Y2ggPSByZWFsLmV4ZWMuY2FsbCh0aGlzLCBzdHIpOwogICAgICAgICAgICAvLyBGaXggYnJvd3NlcnMgdGhhdCBpbmNyZW1lbnQgYGxhc3RJbmRleGAgYWZ0ZXIgemVyby1sZW5ndGggbWF0Y2hlcwogICAgICAgICAgICBpZiAobWF0Y2ggJiYgdGhpcy5nbG9iYWwgJiYgIW1hdGNoWzBdLmxlbmd0aCAmJiAodGhpcy5sYXN0SW5kZXggPiBtYXRjaC5pbmRleCkpCiAgICAgICAgICAgICAgICB0aGlzLmxhc3RJbmRleC0tOwogICAgICAgICAgICByZXR1cm4gISFtYXRjaDsKICAgICAgICB9OwogICAgfQoKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyAgUHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb25zCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIGZ1bmN0aW9uIGdldE5hdGl2ZUZsYWdzIChyZWdleCkgewogICAgICAgIHJldHVybiAocmVnZXguZ2xvYmFsICAgICA/ICJnIiA6ICIiKSArCiAgICAgICAgICAgICAgIChyZWdleC5pZ25vcmVDYXNlID8gImkiIDogIiIpICsKICAgICAgICAgICAgICAgKHJlZ2V4Lm11bHRpbGluZSAgPyAibSIgOiAiIikgKwogICAgICAgICAgICAgICAocmVnZXguZXh0ZW5kZWQgICA/ICJ4IiA6ICIiKSArIC8vIFByb3Bvc2VkIGZvciBFUzQ7IGluY2x1ZGVkIGluIEFTMwogICAgICAgICAgICAgICAocmVnZXguc3RpY2t5ICAgICA/ICJ5IiA6ICIiKTsKICAgIH07CgogICAgZnVuY3Rpb24gaW5kZXhPZiAoYXJyYXksIGl0ZW0sIGZyb20pIHsKICAgICAgICBpZiAoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpIC8vIFVzZSB0aGUgbmF0aXZlIGFycmF5IG1ldGhvZCBpZiBhdmFpbGFibGUKICAgICAgICAgICAgcmV0dXJuIGFycmF5LmluZGV4T2YoaXRlbSwgZnJvbSk7CiAgICAgICAgZm9yICh2YXIgaSA9IGZyb20gfHwgMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChhcnJheVtpXSA9PT0gaXRlbSkKICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gLTE7CiAgICB9OwoKfSk7Ly8gdmltOiB0cz00IHN0cz00IHN3PTQgZXhwYW5kdGFiCi8vIC0tIGtyaXNrb3dhbCBLcmlzIEtvd2FsIENvcHlyaWdodCAoQykgMjAwOS0yMDExIE1JVCBMaWNlbnNlCi8vIC0tIHRscm9iaW5zb24gVG9tIFJvYmluc29uIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1JVCBMaWNlbnNlIChOYXJ3aGFsIFByb2plY3QpCi8vIC0tIGRhbnRtYW4gRGFuaWVsIEZyaWVzZW4gQ29weXJpZ2h0IChDKSAyMDEwIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBCi8vIC0tIGZzY2hhZWZlciBGbG9yaWFuIFNjaMOkZmVyIENvcHlyaWdodCAoQykgMjAxMCBNSVQgTGljZW5zZQovLyAtLSBHb3phbGEgSXJha2xpIEdvemFsaXNodmlsaSBDb3B5cmlnaHQgKEMpIDIwMTAgTUlUIExpY2Vuc2UKLy8gLS0ga2l0Y2FtYnJpZGdlIEtpdCBDYW1icmlkZ2UgQ29weXJpZ2h0IChDKSAyMDExIE1JVCBMaWNlbnNlCi8vIC0tIGtvc3Nub2NvcnAgU2FzaGEgS29zcyBYWFggVE9ETyBMaWNlbnNlIG9yIENMQQovLyAtLSBicnlhbmZvcmJlcyBCcnlhbiBGb3JiZXMgWFhYIFRPRE8gTGljZW5zZSBvciBDTEEKLy8gLS0ga2lsbGRyZWFtIFF1aWxkcmVlbiBNb3R0YSBDb3B5cmlnaHQgKEMpIDIwMTEgTUlUIExpY2VuY2UKLy8gLS0gbWljaGFlbGZpY2FycmEgTWljaGFlbCBGaWNhcnJhIENvcHlyaWdodCAoQykgMjAxMSAzLWNsYXVzZSBCU0QgTGljZW5zZQovLyAtLSBzaGFya2JyYWluZ3V5IEdlcmFyZCBQYWFwdSBDb3B5cmlnaHQgKEMpIDIwMTEgTUlUIExpY2Vuc2UKLy8gLS0gYmJxc3JjIEJyZW5kYW4gTW9sbG95IChDKSAyMDExIENyZWF0aXZlIENvbW1vbnMgWmVybyAocHVibGljIGRvbWFpbikKLy8gLS0gaXd5ZyBYWFggVE9ETyBMaWNlbnNlIG9yIENMQQovLyAtLSBEb21lbmljRGVuaWNvbGEgRG9tZW5pYyBEZW5pY29sYSBDb3B5cmlnaHQgKEMpIDIwMTEgTUlUIExpY2Vuc2UKLy8gLS0geGF2aWVybTAyIE1vbnRpbGxldCBYYXZpZXIgWFhYIFRPRE8gTGljZW5zZSBvciBDTEEKLy8gLS0gUmF5bm9zIFJheW5vcyBYWFggVE9ETyBMaWNlbnNlIG9yIENMQQovLyAtLSBzYW1zb25qcyBTYW1pIFNhbWh1cmkgQ29weXJpZ2h0IChDKSAyMDEwIE1JVCBMaWNlbnNlCi8vIC0tIHJ3bGRybiBSaWNrIFdhbGRyb24gQ29weXJpZ2h0IChDKSAyMDExIE1JVCBMaWNlbnNlCi8vIC0tIGxleGVyIEFsZXhleSBaYWtoYXJvdiBYWFggVE9ETyBMaWNlbnNlIG9yIENMQQoKLyohCiAgICBDb3B5cmlnaHQgKGMpIDIwMDksIDI4MCBOb3J0aCBJbmMuIGh0dHA6Ly8yODBub3J0aC5jb20vCiAgICBNSVQgTGljZW5zZS4gaHR0cDovL2dpdGh1Yi5jb20vMjgwbm9ydGgvbmFyd2hhbC9ibG9iL21hc3Rlci9SRUFETUUubWQKKi8KCmRlZmluZSgnYWNlL2xpYi9lczUtc2hpbScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CgovKioKICogQnJpbmdzIGFuIGVudmlyb25tZW50IGFzIGNsb3NlIHRvIEVDTUFTY3JpcHQgNSBjb21wbGlhbmNlCiAqIGFzIGlzIHBvc3NpYmxlIHdpdGggdGhlIGZhY2lsaXRpZXMgb2YgZXJzdHdoaWxlIGVuZ2luZXMuCiAqCiAqIEFubm90YXRlZCBFUzU6IGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8gKHNwZWNpZmljIGxpbmtzIGJlbG93KQogKiBFUzUgU3BlYzogaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL3B1YmxpY2F0aW9ucy9maWxlcy9FQ01BLVNUL0VjbWEtMjYyLnBkZgogKgogKiBAbW9kdWxlCiAqLwoKLyp3aGF0c3VwZG9jKi8KCi8vCi8vIEZ1bmN0aW9uCi8vID09PT09PT09Ci8vCgovLyBFUy01IDE1LjMuNC41Ci8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjMuNC41CgppZiAoIUZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kKSB7CiAgICBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uIGJpbmQodGhhdCkgeyAvLyAubGVuZ3RoIGlzIDEKICAgICAgICAvLyAxLiBMZXQgVGFyZ2V0IGJlIHRoZSB0aGlzIHZhbHVlLgogICAgICAgIHZhciB0YXJnZXQgPSB0aGlzOwogICAgICAgIC8vIDIuIElmIElzQ2FsbGFibGUoVGFyZ2V0KSBpcyBmYWxzZSwgdGhyb3cgYSBUeXBlRXJyb3IgZXhjZXB0aW9uLgogICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9ICJmdW5jdGlvbiIpCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlCiAgICAgICAgLy8gMy4gTGV0IEEgYmUgYSBuZXcgKHBvc3NpYmx5IGVtcHR5KSBpbnRlcm5hbCBsaXN0IG9mIGFsbCBvZiB0aGUKICAgICAgICAvLyAgIGFyZ3VtZW50IHZhbHVlcyBwcm92aWRlZCBhZnRlciB0aGlzQXJnIChhcmcxLCBhcmcyIGV0YyksIGluIG9yZGVyLgogICAgICAgIC8vIFhYWCBzbGljZWRBcmdzIHdpbGwgc3RhbmQgaW4gZm9yICJBIiBpZiB1c2VkCiAgICAgICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7IC8vIGZvciBub3JtYWwgY2FsbAogICAgICAgIC8vIDQuIExldCBGIGJlIGEgbmV3IG5hdGl2ZSBFQ01BU2NyaXB0IG9iamVjdC4KICAgICAgICAvLyAxMS4gU2V0IHRoZSBbW1Byb3RvdHlwZV1dIGludGVybmFsIHByb3BlcnR5IG9mIEYgdG8gdGhlIHN0YW5kYXJkCiAgICAgICAgLy8gICBidWlsdC1pbiBGdW5jdGlvbiBwcm90b3R5cGUgb2JqZWN0IGFzIHNwZWNpZmllZCBpbiAxNS4zLjMuMS4KICAgICAgICAvLyAxMi4gU2V0IHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIGFzIGRlc2NyaWJlZCBpbgogICAgICAgIC8vICAgMTUuMy40LjUuMS4KICAgICAgICAvLyAxMy4gU2V0IHRoZSBbW0NvbnN0cnVjdF1dIGludGVybmFsIHByb3BlcnR5IG9mIEYgYXMgZGVzY3JpYmVkIGluCiAgICAgICAgLy8gICAxNS4zLjQuNS4yLgogICAgICAgIC8vIDE0LiBTZXQgdGhlIFtbSGFzSW5zdGFuY2VdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIGFzIGRlc2NyaWJlZCBpbgogICAgICAgIC8vICAgMTUuMy40LjUuMy4KICAgICAgICB2YXIgYm91bmQgPSBmdW5jdGlvbiAoKSB7CgogICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIGJvdW5kKSB7CiAgICAgICAgICAgICAgICAvLyAxNS4zLjQuNS4yIFtbQ29uc3RydWN0XV0KICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgbWV0aG9kIG9mIGEgZnVuY3Rpb24gb2JqZWN0LAogICAgICAgICAgICAgICAgLy8gRiB0aGF0IHdhcyBjcmVhdGVkIHVzaW5nIHRoZSBiaW5kIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGEKICAgICAgICAgICAgICAgIC8vIGxpc3Qgb2YgYXJndW1lbnRzIEV4dHJhQXJncywgdGhlIGZvbGxvd2luZyBzdGVwcyBhcmUgdGFrZW46CiAgICAgICAgICAgICAgICAvLyAxLiBMZXQgdGFyZ2V0IGJlIHRoZSB2YWx1ZSBvZiBGJ3MgW1tUYXJnZXRGdW5jdGlvbl1dCiAgICAgICAgICAgICAgICAvLyAgIGludGVybmFsIHByb3BlcnR5LgogICAgICAgICAgICAgICAgLy8gMi4gSWYgdGFyZ2V0IGhhcyBubyBbW0NvbnN0cnVjdF1dIGludGVybmFsIG1ldGhvZCwgYQogICAgICAgICAgICAgICAgLy8gICBUeXBlRXJyb3IgZXhjZXB0aW9uIGlzIHRocm93bi4KICAgICAgICAgICAgICAgIC8vIDMuIExldCBib3VuZEFyZ3MgYmUgdGhlIHZhbHVlIG9mIEYncyBbW0JvdW5kQXJnc11dIGludGVybmFsCiAgICAgICAgICAgICAgICAvLyAgIHByb3BlcnR5LgogICAgICAgICAgICAgICAgLy8gNC4gTGV0IGFyZ3MgYmUgYSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGUKICAgICAgICAgICAgICAgIC8vICAgbGlzdCBib3VuZEFyZ3MgaW4gdGhlIHNhbWUgb3JkZXIgZm9sbG93ZWQgYnkgdGhlIHNhbWUKICAgICAgICAgICAgICAgIC8vICAgdmFsdWVzIGFzIHRoZSBsaXN0IEV4dHJhQXJncyBpbiB0aGUgc2FtZSBvcmRlci4KICAgICAgICAgICAgICAgIC8vIDUuIFJldHVybiB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgCiAgICAgICAgICAgICAgICAvLyAgIG1ldGhvZCBvZiB0YXJnZXQgcHJvdmlkaW5nIGFyZ3MgYXMgdGhlIGFyZ3VtZW50cy4KCiAgICAgICAgICAgICAgICB2YXIgRiA9IGZ1bmN0aW9uKCl7fTsKICAgICAgICAgICAgICAgIEYucHJvdG90eXBlID0gdGFyZ2V0LnByb3RvdHlwZTsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gbmV3IEY7CgogICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRhcmdldC5hcHBseSgKICAgICAgICAgICAgICAgICAgICBzZWxmLAogICAgICAgICAgICAgICAgICAgIGFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIE9iamVjdChyZXN1bHQpID09PSByZXN1bHQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOwoKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIDE1LjMuNC41LjEgW1tDYWxsXV0KICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZCBvZiBhIGZ1bmN0aW9uIG9iamVjdCwgRiwKICAgICAgICAgICAgICAgIC8vIHdoaWNoIHdhcyBjcmVhdGVkIHVzaW5nIHRoZSBiaW5kIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGEKICAgICAgICAgICAgICAgIC8vIHRoaXMgdmFsdWUgYW5kIGEgbGlzdCBvZiBhcmd1bWVudHMgRXh0cmFBcmdzLCB0aGUgZm9sbG93aW5nCiAgICAgICAgICAgICAgICAvLyBzdGVwcyBhcmUgdGFrZW46CiAgICAgICAgICAgICAgICAvLyAxLiBMZXQgYm91bmRBcmdzIGJlIHRoZSB2YWx1ZSBvZiBGJ3MgW1tCb3VuZEFyZ3NdXSBpbnRlcm5hbAogICAgICAgICAgICAgICAgLy8gICBwcm9wZXJ0eS4KICAgICAgICAgICAgICAgIC8vIDIuIExldCBib3VuZFRoaXMgYmUgdGhlIHZhbHVlIG9mIEYncyBbW0JvdW5kVGhpc11dIGludGVybmFsCiAgICAgICAgICAgICAgICAvLyAgIHByb3BlcnR5LgogICAgICAgICAgICAgICAgLy8gMy4gTGV0IHRhcmdldCBiZSB0aGUgdmFsdWUgb2YgRidzIFtbVGFyZ2V0RnVuY3Rpb25dXSBpbnRlcm5hbAogICAgICAgICAgICAgICAgLy8gICBwcm9wZXJ0eS4KICAgICAgICAgICAgICAgIC8vIDQuIExldCBhcmdzIGJlIGEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgc2FtZSB2YWx1ZXMgYXMgdGhlIAogICAgICAgICAgICAgICAgLy8gICBsaXN0IGJvdW5kQXJncyBpbiB0aGUgc2FtZSBvcmRlciBmb2xsb3dlZCBieSB0aGUgc2FtZSAKICAgICAgICAgICAgICAgIC8vICAgdmFsdWVzIGFzIHRoZSBsaXN0IEV4dHJhQXJncyBpbiB0aGUgc2FtZSBvcmRlci4KICAgICAgICAgICAgICAgIC8vIDUuIFJldHVybiB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZCAKICAgICAgICAgICAgICAgIC8vICAgb2YgdGFyZ2V0IHByb3ZpZGluZyBib3VuZFRoaXMgYXMgdGhlIHRoaXMgdmFsdWUgYW5kIAogICAgICAgICAgICAgICAgLy8gICBwcm92aWRpbmcgYXJncyBhcyB0aGUgYXJndW1lbnRzLgoKICAgICAgICAgICAgICAgIC8vIGVxdWl2OiB0YXJnZXQuY2FsbCh0aGlzLCAuLi5ib3VuZEFyZ3MsIC4uLmFyZ3MpCiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmFwcGx5KAogICAgICAgICAgICAgICAgICAgIHRoYXQsCiAgICAgICAgICAgICAgICAgICAgYXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgfTsKICAgICAgICAvLyBYWFggYm91bmQubGVuZ3RoIGlzIG5ldmVyIHdyaXRhYmxlLCBzbyBkb24ndCBldmVuIHRyeQogICAgICAgIC8vCiAgICAgICAgLy8gMTUuIElmIHRoZSBbW0NsYXNzXV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgVGFyZ2V0IGlzICJGdW5jdGlvbiIsIHRoZW4KICAgICAgICAvLyAgICAgYS4gTGV0IEwgYmUgdGhlIGxlbmd0aCBwcm9wZXJ0eSBvZiBUYXJnZXQgbWludXMgdGhlIGxlbmd0aCBvZiBBLgogICAgICAgIC8vICAgICBiLiBTZXQgdGhlIGxlbmd0aCBvd24gcHJvcGVydHkgb2YgRiB0byBlaXRoZXIgMCBvciBMLCB3aGljaGV2ZXIgaXMgCiAgICAgICAgLy8gICAgICAgbGFyZ2VyLgogICAgICAgIC8vIDE2LiBFbHNlIHNldCB0aGUgbGVuZ3RoIG93biBwcm9wZXJ0eSBvZiBGIHRvIDAuCiAgICAgICAgLy8gMTcuIFNldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbGVuZ3RoIG93biBwcm9wZXJ0eSBvZiBGIHRvIHRoZSB2YWx1ZXMKICAgICAgICAvLyAgIHNwZWNpZmllZCBpbiAxNS4zLjUuMS4KCiAgICAgICAgLy8gVE9ETwogICAgICAgIC8vIDE4LiBTZXQgdGhlIFtbRXh0ZW5zaWJsZV1dIGludGVybmFsIHByb3BlcnR5IG9mIEYgdG8gdHJ1ZS4KICAgICAgICAKICAgICAgICAvLyBUT0RPCiAgICAgICAgLy8gMTkuIExldCB0aHJvd2VyIGJlIHRoZSBbW1Rocm93VHlwZUVycm9yXV0gZnVuY3Rpb24gT2JqZWN0ICgxMy4yLjMpLgogICAgICAgIC8vIDIwLiBDYWxsIHRoZSBbW0RlZmluZU93blByb3BlcnR5XV0gaW50ZXJuYWwgbWV0aG9kIG9mIEYgd2l0aCAKICAgICAgICAvLyAgIGFyZ3VtZW50cyAiY2FsbGVyIiwgUHJvcGVydHlEZXNjcmlwdG9yIHtbW0dldF1dOiB0aHJvd2VyLCBbW1NldF1dOgogICAgICAgIC8vICAgdGhyb3dlciwgW1tFbnVtZXJhYmxlXV06IGZhbHNlLCBbW0NvbmZpZ3VyYWJsZV1dOiBmYWxzZX0sIGFuZCAKICAgICAgICAvLyAgIGZhbHNlLgogICAgICAgIC8vIDIxLiBDYWxsIHRoZSBbW0RlZmluZU93blByb3BlcnR5XV0gaW50ZXJuYWwgbWV0aG9kIG9mIEYgd2l0aCAKICAgICAgICAvLyAgIGFyZ3VtZW50cyAiYXJndW1lbnRzIiwgUHJvcGVydHlEZXNjcmlwdG9yIHtbW0dldF1dOiB0aHJvd2VyLCAKICAgICAgICAvLyAgIFtbU2V0XV06IHRocm93ZXIsIFtbRW51bWVyYWJsZV1dOiBmYWxzZSwgW1tDb25maWd1cmFibGVdXTogZmFsc2V9LAogICAgICAgIC8vICAgYW5kIGZhbHNlLgoKICAgICAgICAvLyBUT0RPCiAgICAgICAgLy8gTk9URSBGdW5jdGlvbiBvYmplY3RzIGNyZWF0ZWQgdXNpbmcgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgZG8gbm90IAogICAgICAgIC8vIGhhdmUgYSBwcm90b3R5cGUgcHJvcGVydHkgb3IgdGhlIFtbQ29kZV1dLCBbW0Zvcm1hbFBhcmFtZXRlcnNdXSwgYW5kCiAgICAgICAgLy8gW1tTY29wZV1dIGludGVybmFsIHByb3BlcnRpZXMuCiAgICAgICAgLy8gWFhYIGNhbid0IGRlbGV0ZSBwcm90b3R5cGUgaW4gcHVyZS1qcy4KCiAgICAgICAgLy8gMjIuIFJldHVybiBGLgogICAgICAgIHJldHVybiBib3VuZDsKICAgIH07Cn0KCi8vIFNob3J0Y3V0IHRvIGFuIG9mdGVuIGFjY2Vzc2VkIHByb3BlcnRpZXMsIGluIG9yZGVyIHRvIGF2b2lkIG11bHRpcGxlCi8vIGRlcmVmZXJlbmNlIHRoYXQgY29zdHMgdW5pdmVyc2FsbHkuCi8vIF9QbGVhc2Ugbm90ZTogU2hvcnRjdXRzIGFyZSBkZWZpbmVkIGFmdGVyIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAgYXMgd2UKLy8gdXMgaXQgaW4gZGVmaW5pbmcgc2hvcnRjdXRzLgp2YXIgY2FsbCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsOwp2YXIgcHJvdG90eXBlT2ZBcnJheSA9IEFycmF5LnByb3RvdHlwZTsKdmFyIHByb3RvdHlwZU9mT2JqZWN0ID0gT2JqZWN0LnByb3RvdHlwZTsKdmFyIHNsaWNlID0gcHJvdG90eXBlT2ZBcnJheS5zbGljZTsKdmFyIHRvU3RyaW5nID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0LnRvU3RyaW5nKTsKdmFyIG93bnMgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuaGFzT3duUHJvcGVydHkpOwoKLy8gSWYgSlMgZW5naW5lIHN1cHBvcnRzIGFjY2Vzc29ycyBjcmVhdGluZyBzaG9ydGN1dHMuCnZhciBkZWZpbmVHZXR0ZXI7CnZhciBkZWZpbmVTZXR0ZXI7CnZhciBsb29rdXBHZXR0ZXI7CnZhciBsb29rdXBTZXR0ZXI7CnZhciBzdXBwb3J0c0FjY2Vzc29yczsKaWYgKChzdXBwb3J0c0FjY2Vzc29ycyA9IG93bnMocHJvdG90eXBlT2ZPYmplY3QsICJfX2RlZmluZUdldHRlcl9fIikpKSB7CiAgICBkZWZpbmVHZXR0ZXIgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuX19kZWZpbmVHZXR0ZXJfXyk7CiAgICBkZWZpbmVTZXR0ZXIgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuX19kZWZpbmVTZXR0ZXJfXyk7CiAgICBsb29rdXBHZXR0ZXIgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuX19sb29rdXBHZXR0ZXJfXyk7CiAgICBsb29rdXBTZXR0ZXIgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuX19sb29rdXBTZXR0ZXJfXyk7Cn0KCi8vCi8vIEFycmF5Ci8vID09PT09Ci8vCgovLyBFUzUgMTUuNC4zLjIKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC4zLjIKLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvaXNBcnJheQppZiAoIUFycmF5LmlzQXJyYXkpIHsKICAgIEFycmF5LmlzQXJyYXkgPSBmdW5jdGlvbiBpc0FycmF5KG9iaikgewogICAgICAgIHJldHVybiB0b1N0cmluZyhvYmopID09ICJbb2JqZWN0IEFycmF5XSI7CiAgICB9Owp9CgovLyBUaGUgSXNDYWxsYWJsZSgpIGNoZWNrIGluIHRoZSBBcnJheSBmdW5jdGlvbnMKLy8gaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCBhIHN0cmljdCBjaGVjayBvbiB0aGUKLy8gaW50ZXJuYWwgY2xhc3Mgb2YgdGhlIG9iamVjdCB0byB0cmFwIGNhc2VzIHdoZXJlCi8vIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB3YXMgYWN0dWFsbHkgYSByZWd1bGFyCi8vIGV4cHJlc3Npb24gbGl0ZXJhbCwgd2hpY2ggaW4gVjggYW5kCi8vIEphdmFTY3JpcHRDb3JlIGlzIGEgdHlwZW9mICJmdW5jdGlvbiIuICBPbmx5IGluCi8vIFY4IGFyZSByZWd1bGFyIGV4cHJlc3Npb24gbGl0ZXJhbHMgcGVybWl0dGVkIGFzCi8vIHJlZHVjZSBwYXJhbWV0ZXJzLCBzbyBpdCBpcyBkZXNpcmFibGUgaW4gdGhlCi8vIGdlbmVyYWwgY2FzZSBmb3IgdGhlIHNoaW0gdG8gbWF0Y2ggdGhlIG1vcmUKLy8gc3RyaWN0IGFuZCBjb21tb24gYmVoYXZpb3Igb2YgcmVqZWN0aW5nIHJlZ3VsYXIKLy8gZXhwcmVzc2lvbnMuCgovLyBFUzUgMTUuNC40LjE4Ci8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuNC4xOAovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9hcnJheS9mb3JFYWNoCmlmICghQXJyYXkucHJvdG90eXBlLmZvckVhY2gpIHsKICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gZm9yRWFjaChmdW4gLyosIHRoaXNwKi8pIHsKICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLAogICAgICAgICAgICB0aGlzcCA9IGFyZ3VtZW50c1sxXSwKICAgICAgICAgICAgaSA9IDAsCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwOwoKICAgICAgICAvLyBJZiBubyBjYWxsYmFjayBmdW5jdGlvbiBvciBpZiBjYWxsYmFjayBpcyBub3QgYSBjYWxsYWJsZSBmdW5jdGlvbgogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UKICAgICAgICB9CgogICAgICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7CiAgICAgICAgICAgIGlmIChpIGluIHNlbGYpIHsKICAgICAgICAgICAgICAgIC8vIEludm9rZSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBjYWxsLCBwYXNzaW5nIGFyZ3VtZW50czoKICAgICAgICAgICAgICAgIC8vIGNvbnRleHQsIHByb3BlcnR5IHZhbHVlLCBwcm9wZXJ0eSBrZXksIHRoaXNBcmcgb2JqZWN0IGNvbnRleHQKICAgICAgICAgICAgICAgIGZ1bi5jYWxsKHRoaXNwLCBzZWxmW2ldLCBpLCBzZWxmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpKys7CiAgICAgICAgfQogICAgfTsKfQoKLy8gRVM1IDE1LjQuNC4xOQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTkKLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vQ29yZV9KYXZhU2NyaXB0XzEuNV9SZWZlcmVuY2UvT2JqZWN0cy9BcnJheS9tYXAKaWYgKCFBcnJheS5wcm90b3R5cGUubWFwKSB7CiAgICBBcnJheS5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24gbWFwKGZ1biAvKiwgdGhpc3AqLykgewogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwLAogICAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpLAogICAgICAgICAgICB0aGlzcCA9IGFyZ3VtZW50c1sxXTsKCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24KICAgICAgICBpZiAodG9TdHJpbmcoZnVuKSAhPSAiW29iamVjdCBGdW5jdGlvbl0iKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlCiAgICAgICAgfQoKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChpIGluIHNlbGYpCiAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBmdW4uY2FsbCh0aGlzcCwgc2VsZltpXSwgaSwgc2VsZik7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9Owp9CgovLyBFUzUgMTUuNC40LjIwCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuNC4yMAovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9PYmplY3RzL0FycmF5L2ZpbHRlcgppZiAoIUFycmF5LnByb3RvdHlwZS5maWx0ZXIpIHsKICAgIEFycmF5LnByb3RvdHlwZS5maWx0ZXIgPSBmdW5jdGlvbiBmaWx0ZXIoZnVuIC8qLCB0aGlzcCAqLykgewogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwLAogICAgICAgICAgICByZXN1bHQgPSBbXSwKICAgICAgICAgICAgdGhpc3AgPSBhcmd1bWVudHNbMV07CgogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQogICAgICAgIH0KCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmIGZ1bi5jYWxsKHRoaXNwLCBzZWxmW2ldLCBpLCBzZWxmKSkKICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNlbGZbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfTsKfQoKLy8gRVM1IDE1LjQuNC4xNgovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTYKLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZXZlcnkKaWYgKCFBcnJheS5wcm90b3R5cGUuZXZlcnkpIHsKICAgIEFycmF5LnByb3RvdHlwZS5ldmVyeSA9IGZ1bmN0aW9uIGV2ZXJ5KGZ1biAvKiwgdGhpc3AgKi8pIHsKICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLAogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMCwKICAgICAgICAgICAgdGhpc3AgPSBhcmd1bWVudHNbMV07CgogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQogICAgICAgIH0KCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmICFmdW4uY2FsbCh0aGlzcCwgc2VsZltpXSwgaSwgc2VsZikpCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfTsKfQoKLy8gRVM1IDE1LjQuNC4xNwovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTcKLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvc29tZQppZiAoIUFycmF5LnByb3RvdHlwZS5zb21lKSB7CiAgICBBcnJheS5wcm90b3R5cGUuc29tZSA9IGZ1bmN0aW9uIHNvbWUoZnVuIC8qLCB0aGlzcCAqLykgewogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwLAogICAgICAgICAgICB0aGlzcCA9IGFyZ3VtZW50c1sxXTsKCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24KICAgICAgICBpZiAodG9TdHJpbmcoZnVuKSAhPSAiW29iamVjdCBGdW5jdGlvbl0iKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlCiAgICAgICAgfQoKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChpIGluIHNlbGYgJiYgZnVuLmNhbGwodGhpc3AsIHNlbGZbaV0sIGksIHNlbGYpKQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH07Cn0KCi8vIEVTNSAxNS40LjQuMjEKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjIxCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlL09iamVjdHMvQXJyYXkvcmVkdWNlCmlmICghQXJyYXkucHJvdG90eXBlLnJlZHVjZSkgewogICAgQXJyYXkucHJvdG90eXBlLnJlZHVjZSA9IGZ1bmN0aW9uIHJlZHVjZShmdW4gLyosIGluaXRpYWwqLykgewogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwOwoKICAgICAgICAvLyBJZiBubyBjYWxsYmFjayBmdW5jdGlvbiBvciBpZiBjYWxsYmFjayBpcyBub3QgYSBjYWxsYWJsZSBmdW5jdGlvbgogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UKICAgICAgICB9CgogICAgICAgIC8vIG5vIHZhbHVlIHRvIHJldHVybiBpZiBubyBpbml0aWFsIHZhbHVlIGFuZCBhbiBlbXB0eSBhcnJheQogICAgICAgIGlmICghbGVuZ3RoICYmIGFyZ3VtZW50cy5sZW5ndGggPT0gMSkKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UKCiAgICAgICAgdmFyIGkgPSAwOwogICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikgewogICAgICAgICAgICByZXN1bHQgPSBhcmd1bWVudHNbMV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgaWYgKGkgaW4gc2VsZikgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGZbaSsrXTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiBhcnJheSBjb250YWlucyBubyB2YWx1ZXMsIG5vIGluaXRpYWwgdmFsdWUgdG8gcmV0dXJuCiAgICAgICAgICAgICAgICBpZiAoKytpID49IGxlbmd0aCkKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQogICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKICAgICAgICB9CgogICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKGkgaW4gc2VsZikKICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZ1bi5jYWxsKHZvaWQgMCwgcmVzdWx0LCBzZWxmW2ldLCBpLCBzZWxmKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9Owp9CgovLyBFUzUgMTUuNC40LjIyCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuNC4yMgovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9PYmplY3RzL0FycmF5L3JlZHVjZVJpZ2h0CmlmICghQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0KSB7CiAgICBBcnJheS5wcm90b3R5cGUucmVkdWNlUmlnaHQgPSBmdW5jdGlvbiByZWR1Y2VSaWdodChmdW4gLyosIGluaXRpYWwqLykgewogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwOwoKICAgICAgICAvLyBJZiBubyBjYWxsYmFjayBmdW5jdGlvbiBvciBpZiBjYWxsYmFjayBpcyBub3QgYSBjYWxsYWJsZSBmdW5jdGlvbgogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UKICAgICAgICB9CgogICAgICAgIC8vIG5vIHZhbHVlIHRvIHJldHVybiBpZiBubyBpbml0aWFsIHZhbHVlLCBlbXB0eSBhcnJheQogICAgICAgIGlmICghbGVuZ3RoICYmIGFyZ3VtZW50cy5sZW5ndGggPT0gMSkKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UKCiAgICAgICAgdmFyIHJlc3VsdCwgaSA9IGxlbmd0aCAtIDE7CiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikgewogICAgICAgICAgICByZXN1bHQgPSBhcmd1bWVudHNbMV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgaWYgKGkgaW4gc2VsZikgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGZbaS0tXTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiBhcnJheSBjb250YWlucyBubyB2YWx1ZXMsIG5vIGluaXRpYWwgdmFsdWUgdG8gcmV0dXJuCiAgICAgICAgICAgICAgICBpZiAoLS1pIDwgMCkKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQogICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKICAgICAgICB9CgogICAgICAgIGRvIHsKICAgICAgICAgICAgaWYgKGkgaW4gdGhpcykKICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZ1bi5jYWxsKHZvaWQgMCwgcmVzdWx0LCBzZWxmW2ldLCBpLCBzZWxmKTsKICAgICAgICB9IHdoaWxlIChpLS0pOwoKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfTsKfQoKLy8gRVM1IDE1LjQuNC4xNAovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTQKLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvaW5kZXhPZgppZiAoIUFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7CiAgICBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2Yoc291Z2h0IC8qLCBmcm9tSW5kZXggKi8gKSB7CiAgICAgICAgdmFyIHNlbGYgPSB0b09iamVjdCh0aGlzKSwKICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7CgogICAgICAgIGlmICghbGVuZ3RoKQogICAgICAgICAgICByZXR1cm4gLTE7CgogICAgICAgIHZhciBpID0gMDsKICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpCiAgICAgICAgICAgIGkgPSB0b0ludGVnZXIoYXJndW1lbnRzWzFdKTsKCiAgICAgICAgLy8gaGFuZGxlIG5lZ2F0aXZlIGluZGljZXMKICAgICAgICBpID0gaSA+PSAwID8gaSA6IE1hdGgubWF4KDAsIGxlbmd0aCArIGkpOwogICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKGkgaW4gc2VsZiAmJiBzZWxmW2ldID09PSBzb3VnaHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAtMTsKICAgIH07Cn0KCi8vIEVTNSAxNS40LjQuMTUKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE1Ci8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2xhc3RJbmRleE9mCmlmICghQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mKSB7CiAgICBBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZihzb3VnaHQgLyosIGZyb21JbmRleCAqLykgewogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwOwoKICAgICAgICBpZiAoIWxlbmd0aCkKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIHZhciBpID0gbGVuZ3RoIC0gMTsKICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpCiAgICAgICAgICAgIGkgPSBNYXRoLm1pbihpLCB0b0ludGVnZXIoYXJndW1lbnRzWzFdKSk7CiAgICAgICAgLy8gaGFuZGxlIG5lZ2F0aXZlIGluZGljZXMKICAgICAgICBpID0gaSA+PSAwID8gaSA6IGxlbmd0aCAtIE1hdGguYWJzKGkpOwogICAgICAgIGZvciAoOyBpID49IDA7IGktLSkgewogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmIHNvdWdodCA9PT0gc2VsZltpXSkKICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gLTE7CiAgICB9Owp9CgovLwovLyBPYmplY3QKLy8gPT09PT09Ci8vCgovLyBFUzUgMTUuMi4zLjIKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjIKaWYgKCFPYmplY3QuZ2V0UHJvdG90eXBlT2YpIHsKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9rcmlza293YWwvZXM1LXNoaW0vaXNzdWVzI2lzc3VlLzIKICAgIC8vIGh0dHA6Ly9lam9obi5vcmcvYmxvZy9vYmplY3RnZXRwcm90b3R5cGVvZi8KICAgIC8vIHJlY29tbWVuZGVkIGJ5IGZzY2hhZWZlciBvbiBnaXRodWIKICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZiA9IGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKG9iamVjdCkgewogICAgICAgIHJldHVybiBvYmplY3QuX19wcm90b19fIHx8ICgKICAgICAgICAgICAgb2JqZWN0LmNvbnN0cnVjdG9yID8KICAgICAgICAgICAgb2JqZWN0LmNvbnN0cnVjdG9yLnByb3RvdHlwZSA6CiAgICAgICAgICAgIHByb3RvdHlwZU9mT2JqZWN0CiAgICAgICAgKTsKICAgIH07Cn0KCi8vIEVTNSAxNS4yLjMuMwovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuMwppZiAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IpIHsKICAgIHZhciBFUlJfTk9OX09CSkVDVCA9ICJPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIGNhbGxlZCBvbiBhICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgIm5vbi1vYmplY3Q6ICI7CiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpIHsKICAgICAgICBpZiAoKHR5cGVvZiBvYmplY3QgIT0gIm9iamVjdCIgJiYgdHlwZW9mIG9iamVjdCAhPSAiZnVuY3Rpb24iKSB8fCBvYmplY3QgPT09IG51bGwpCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJSX05PTl9PQkpFQ1QgKyBvYmplY3QpOwogICAgICAgIC8vIElmIG9iamVjdCBkb2VzIG5vdCBvd25zIHByb3BlcnR5IHJldHVybiB1bmRlZmluZWQgaW1tZWRpYXRlbHkuCiAgICAgICAgaWYgKCFvd25zKG9iamVjdCwgcHJvcGVydHkpKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIHZhciBkZXNjcmlwdG9yLCBnZXR0ZXIsIHNldHRlcjsKCiAgICAgICAgLy8gSWYgb2JqZWN0IGhhcyBhIHByb3BlcnR5IHRoZW4gaXQncyBmb3Igc3VyZSBib3RoIGBlbnVtZXJhYmxlYCBhbmQKICAgICAgICAvLyBgY29uZmlndXJhYmxlYC4KICAgICAgICBkZXNjcmlwdG9yID0gIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH07CgogICAgICAgIC8vIElmIEpTIGVuZ2luZSBzdXBwb3J0cyBhY2Nlc3NvciBwcm9wZXJ0aWVzIHRoZW4gcHJvcGVydHkgbWF5IGJlIGEKICAgICAgICAvLyBnZXR0ZXIgb3Igc2V0dGVyLgogICAgICAgIGlmIChzdXBwb3J0c0FjY2Vzc29ycykgewogICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5IGBfX2xvb2t1cEdldHRlcl9fYCB3aWxsIHJldHVybiBhIGdldHRlciBldmVuCiAgICAgICAgICAgIC8vIGlmIG9iamVjdCBoYXMgb3duIG5vbiBnZXR0ZXIgcHJvcGVydHkgYWxvbmcgd2l0aCBhIHNhbWUgbmFtZWQKICAgICAgICAgICAgLy8gaW5oZXJpdGVkIGdldHRlci4gVG8gYXZvaWQgbWlzYmVoYXZpb3Igd2UgdGVtcG9yYXJ5IHJlbW92ZQogICAgICAgICAgICAvLyBgX19wcm90b19fYCBzbyB0aGF0IGBfX2xvb2t1cEdldHRlcl9fYCB3aWxsIHJldHVybiBnZXR0ZXIgb25seQogICAgICAgICAgICAvLyBpZiBpdCdzIG93bmVkIGJ5IGFuIG9iamVjdC4KICAgICAgICAgICAgdmFyIHByb3RvdHlwZSA9IG9iamVjdC5fX3Byb3RvX187CiAgICAgICAgICAgIG9iamVjdC5fX3Byb3RvX18gPSBwcm90b3R5cGVPZk9iamVjdDsKCiAgICAgICAgICAgIHZhciBnZXR0ZXIgPSBsb29rdXBHZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSk7CiAgICAgICAgICAgIHZhciBzZXR0ZXIgPSBsb29rdXBTZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSk7CgogICAgICAgICAgICAvLyBPbmNlIHdlIGhhdmUgZ2V0dGVyIGFuZCBzZXR0ZXIgd2UgY2FuIHB1dCB2YWx1ZXMgYmFjay4KICAgICAgICAgICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZTsKCiAgICAgICAgICAgIGlmIChnZXR0ZXIgfHwgc2V0dGVyKSB7CiAgICAgICAgICAgICAgICBpZiAoZ2V0dGVyKSBkZXNjcmlwdG9yLmdldCA9IGdldHRlcjsKICAgICAgICAgICAgICAgIGlmIChzZXR0ZXIpIGRlc2NyaXB0b3Iuc2V0ID0gc2V0dGVyOwoKICAgICAgICAgICAgICAgIC8vIElmIGl0IHdhcyBhY2Nlc3NvciBwcm9wZXJ0eSB3ZSdyZSBkb25lIGFuZCByZXR1cm4gaGVyZQogICAgICAgICAgICAgICAgLy8gaW4gb3JkZXIgdG8gYXZvaWQgYWRkaW5nIGB2YWx1ZWAgdG8gdGhlIGRlc2NyaXB0b3IuCiAgICAgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gSWYgd2UgZ290IHRoaXMgZmFyIHdlIGtub3cgdGhhdCBvYmplY3QgaGFzIGFuIG93biBwcm9wZXJ0eSB0aGF0IGlzCiAgICAgICAgLy8gbm90IGFuIGFjY2Vzc29yIHNvIHdlIHNldCBpdCBhcyBhIHZhbHVlIGFuZCByZXR1cm4gZGVzY3JpcHRvci4KICAgICAgICBkZXNjcmlwdG9yLnZhbHVlID0gb2JqZWN0W3Byb3BlcnR5XTsKICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsKICAgIH07Cn0KCi8vIEVTNSAxNS4yLjMuNAovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuNAppZiAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKSB7CiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMob2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdCk7CiAgICB9Owp9CgovLyBFUzUgMTUuMi4zLjUKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjUKaWYgKCFPYmplY3QuY3JlYXRlKSB7CiAgICBPYmplY3QuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKHByb3RvdHlwZSwgcHJvcGVydGllcykgewogICAgICAgIHZhciBvYmplY3Q7CiAgICAgICAgaWYgKHByb3RvdHlwZSA9PT0gbnVsbCkgewogICAgICAgICAgICBvYmplY3QgPSB7ICJfX3Byb3RvX18iOiBudWxsIH07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm90b3R5cGUgIT0gIm9iamVjdCIpCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJ0eXBlb2YgcHJvdG90eXBlWyIrKHR5cGVvZiBwcm90b3R5cGUpKyJdICE9ICdvYmplY3QnIik7CiAgICAgICAgICAgIHZhciBUeXBlID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgIFR5cGUucHJvdG90eXBlID0gcHJvdG90eXBlOwogICAgICAgICAgICBvYmplY3QgPSBuZXcgVHlwZSgpOwogICAgICAgICAgICAvLyBJRSBoYXMgbm8gYnVpbHQtaW4gaW1wbGVtZW50YXRpb24gb2YgYE9iamVjdC5nZXRQcm90b3R5cGVPZmAKICAgICAgICAgICAgLy8gbmVpdGhlciBgX19wcm90b19fYCwgYnV0IHRoaXMgbWFudWFsbHkgc2V0dGluZyBgX19wcm90b19fYCB3aWxsCiAgICAgICAgICAgIC8vIGd1YXJhbnRlZSB0aGF0IGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgIHdpbGwgd29yayBhcyBleHBlY3RlZCB3aXRoCiAgICAgICAgICAgIC8vIG9iamVjdHMgY3JlYXRlZCB1c2luZyBgT2JqZWN0LmNyZWF0ZWAKICAgICAgICAgICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZTsKICAgICAgICB9CiAgICAgICAgaWYgKHByb3BlcnRpZXMgIT09IHZvaWQgMCkKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMob2JqZWN0LCBwcm9wZXJ0aWVzKTsKICAgICAgICByZXR1cm4gb2JqZWN0OwogICAgfTsKfQoKLy8gRVM1IDE1LjIuMy42Ci8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy42CgovLyBQYXRjaCBmb3IgV2ViS2l0IGFuZCBJRTggc3RhbmRhcmQgbW9kZQovLyBEZXNpZ25lZCBieSBoYXggPGhheC5naXRodWIuY29tPgovLyByZWxhdGVkIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20va3Jpc2tvd2FsL2VzNS1zaGltL2lzc3VlcyNpc3N1ZS81Ci8vIElFOCBSZWZlcmVuY2U6Ci8vICAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZGQyODI5MDAuYXNweAovLyAgICAgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2RkMjI5OTE2LmFzcHgKLy8gV2ViS2l0IEJ1Z3M6Ci8vICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzY0MjMKCmZ1bmN0aW9uIGRvZXNEZWZpbmVQcm9wZXJ0eVdvcmsob2JqZWN0KSB7CiAgICB0cnkgewogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsICJzZW50aW5lbCIsIHt9KTsKICAgICAgICByZXR1cm4gInNlbnRpbmVsIiBpbiBvYmplY3Q7CiAgICB9IGNhdGNoIChleGNlcHRpb24pIHsKICAgICAgICAvLyByZXR1cm5zIGZhbHN5CiAgICB9Cn0KCi8vIGNoZWNrIHdoZXRoZXIgZGVmaW5lUHJvcGVydHkgd29ya3MgaWYgaXQncyBnaXZlbi4gT3RoZXJ3aXNlLAovLyBzaGltIHBhcnRpYWxseS4KaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgewogICAgdmFyIGRlZmluZVByb3BlcnR5V29ya3NPbk9iamVjdCA9IGRvZXNEZWZpbmVQcm9wZXJ0eVdvcmsoe30pOwogICAgdmFyIGRlZmluZVByb3BlcnR5V29ya3NPbkRvbSA9IHR5cGVvZiBkb2N1bWVudCA9PSAidW5kZWZpbmVkIiB8fAogICAgICAgIGRvZXNEZWZpbmVQcm9wZXJ0eVdvcmsoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpOwogICAgaWYgKCFkZWZpbmVQcm9wZXJ0eVdvcmtzT25PYmplY3QgfHwgIWRlZmluZVByb3BlcnR5V29ya3NPbkRvbSkgewogICAgICAgIHZhciBkZWZpbmVQcm9wZXJ0eUZhbGxiYWNrID0gT2JqZWN0LmRlZmluZVByb3BlcnR5OwogICAgfQp9CgppZiAoIU9iamVjdC5kZWZpbmVQcm9wZXJ0eSB8fCBkZWZpbmVQcm9wZXJ0eUZhbGxiYWNrKSB7CiAgICB2YXIgRVJSX05PTl9PQkpFQ1RfREVTQ1JJUFRPUiA9ICJQcm9wZXJ0eSBkZXNjcmlwdGlvbiBtdXN0IGJlIGFuIG9iamVjdDogIjsKICAgIHZhciBFUlJfTk9OX09CSkVDVF9UQVJHRVQgPSAiT2JqZWN0LmRlZmluZVByb3BlcnR5IGNhbGxlZCBvbiBub24tb2JqZWN0OiAiCiAgICB2YXIgRVJSX0FDQ0VTU09SU19OT1RfU1VQUE9SVEVEID0gImdldHRlcnMgJiBzZXR0ZXJzIGNhbiBub3QgYmUgZGVmaW5lZCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib24gdGhpcyBqYXZhc2NyaXB0IGVuZ2luZSI7CgogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvcikgewogICAgICAgIGlmICgodHlwZW9mIG9iamVjdCAhPSAib2JqZWN0IiAmJiB0eXBlb2Ygb2JqZWN0ICE9ICJmdW5jdGlvbiIpIHx8IG9iamVjdCA9PT0gbnVsbCkKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihFUlJfTk9OX09CSkVDVF9UQVJHRVQgKyBvYmplY3QpOwogICAgICAgIGlmICgodHlwZW9mIGRlc2NyaXB0b3IgIT0gIm9iamVjdCIgJiYgdHlwZW9mIGRlc2NyaXB0b3IgIT0gImZ1bmN0aW9uIikgfHwgZGVzY3JpcHRvciA9PT0gbnVsbCkKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihFUlJfTk9OX09CSkVDVF9ERVNDUklQVE9SICsgZGVzY3JpcHRvcik7CgogICAgICAgIC8vIG1ha2UgYSB2YWxpYW50IGF0dGVtcHQgdG8gdXNlIHRoZSByZWFsIGRlZmluZVByb3BlcnR5CiAgICAgICAgLy8gZm9yIEk4J3MgRE9NIGVsZW1lbnRzLgogICAgICAgIGlmIChkZWZpbmVQcm9wZXJ0eUZhbGxiYWNrKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lUHJvcGVydHlGYWxsYmFjay5jYWxsKE9iamVjdCwgb2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvcik7CiAgICAgICAgICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgLy8gdHJ5IHRoZSBzaGltIGlmIHRoZSByZWFsIG9uZSBkb2Vzbid0IHdvcmsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gSWYgaXQncyBhIGRhdGEgcHJvcGVydHkuCiAgICAgICAgaWYgKG93bnMoZGVzY3JpcHRvciwgInZhbHVlIikpIHsKICAgICAgICAgICAgLy8gZmFpbCBzaWxlbnRseSBpZiAid3JpdGFibGUiLCAiZW51bWVyYWJsZSIsIG9yICJjb25maWd1cmFibGUiCiAgICAgICAgICAgIC8vIGFyZSByZXF1ZXN0ZWQgYnV0IG5vdCBzdXBwb3J0ZWQKICAgICAgICAgICAgLyoKICAgICAgICAgICAgLy8gYWx0ZXJuYXRlIGFwcHJvYWNoOgogICAgICAgICAgICBpZiAoIC8vIGNhbid0IGltcGxlbWVudCB0aGVzZSBmZWF0dXJlczsgYWxsb3cgZmFsc2UgYnV0IG5vdCB0cnVlCiAgICAgICAgICAgICAgICAhKG93bnMoZGVzY3JpcHRvciwgIndyaXRhYmxlIikgPyBkZXNjcmlwdG9yLndyaXRhYmxlIDogdHJ1ZSkgfHwKICAgICAgICAgICAgICAgICEob3ducyhkZXNjcmlwdG9yLCAiZW51bWVyYWJsZSIpID8gZGVzY3JpcHRvci5lbnVtZXJhYmxlIDogdHJ1ZSkgfHwKICAgICAgICAgICAgICAgICEob3ducyhkZXNjcmlwdG9yLCAiY29uZmlndXJhYmxlIikgPyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA6IHRydWUpCiAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKAogICAgICAgICAgICAgICAgICAgICJUaGlzIGltcGxlbWVudGF0aW9uIG9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBkb2VzIG5vdCAiICsKICAgICAgICAgICAgICAgICAgICAic3VwcG9ydCBjb25maWd1cmFibGUsIGVudW1lcmFibGUsIG9yIHdyaXRhYmxlLiIKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICovCgogICAgICAgICAgICBpZiAoc3VwcG9ydHNBY2Nlc3NvcnMgJiYgKGxvb2t1cEdldHRlcihvYmplY3QsIHByb3BlcnR5KSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cFNldHRlcihvYmplY3QsIHByb3BlcnR5KSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIEFzIGFjY2Vzc29ycyBhcmUgc3VwcG9ydGVkIG9ubHkgb24gZW5naW5lcyBpbXBsZW1lbnRpbmcKICAgICAgICAgICAgICAgIC8vIGBfX3Byb3RvX19gIHdlIGNhbiBzYWZlbHkgb3ZlcnJpZGUgYF9fcHJvdG9fX2Agd2hpbGUgZGVmaW5pbmcKICAgICAgICAgICAgICAgIC8vIGEgcHJvcGVydHkgdG8gbWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3QgaGl0IGFuIGluaGVyaXRlZAogICAgICAgICAgICAgICAgLy8gYWNjZXNzb3IuCiAgICAgICAgICAgICAgICB2YXIgcHJvdG90eXBlID0gb2JqZWN0Ll9fcHJvdG9fXzsKICAgICAgICAgICAgICAgIG9iamVjdC5fX3Byb3RvX18gPSBwcm90b3R5cGVPZk9iamVjdDsKICAgICAgICAgICAgICAgIC8vIERlbGV0aW5nIGEgcHJvcGVydHkgYW55d2F5IHNpbmNlIGdldHRlciAvIHNldHRlciBtYXkgYmUKICAgICAgICAgICAgICAgIC8vIGRlZmluZWQgb24gb2JqZWN0IGl0c2VsZi4KICAgICAgICAgICAgICAgIGRlbGV0ZSBvYmplY3RbcHJvcGVydHldOwogICAgICAgICAgICAgICAgb2JqZWN0W3Byb3BlcnR5XSA9IGRlc2NyaXB0b3IudmFsdWU7CiAgICAgICAgICAgICAgICAvLyBTZXR0aW5nIG9yaWdpbmFsIGBfX3Byb3RvX19gIGJhY2sgbm93LgogICAgICAgICAgICAgICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG9iamVjdFtwcm9wZXJ0eV0gPSBkZXNjcmlwdG9yLnZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCFzdXBwb3J0c0FjY2Vzc29ycykKICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJSX0FDQ0VTU09SU19OT1RfU1VQUE9SVEVEKTsKICAgICAgICAgICAgLy8gSWYgd2UgZ290IHRoYXQgZmFyIHRoZW4gZ2V0dGVycyBhbmQgc2V0dGVycyBjYW4gYmUgZGVmaW5lZCAhIQogICAgICAgICAgICBpZiAob3ducyhkZXNjcmlwdG9yLCAiZ2V0IikpCiAgICAgICAgICAgICAgICBkZWZpbmVHZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvci5nZXQpOwogICAgICAgICAgICBpZiAob3ducyhkZXNjcmlwdG9yLCAic2V0IikpCiAgICAgICAgICAgICAgICBkZWZpbmVTZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvci5zZXQpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG9iamVjdDsKICAgIH07Cn0KCi8vIEVTNSAxNS4yLjMuNwovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuNwppZiAoIU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKSB7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMob2JqZWN0LCBwcm9wZXJ0aWVzKSB7CiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gcHJvcGVydGllcykgewogICAgICAgICAgICBpZiAob3ducyhwcm9wZXJ0aWVzLCBwcm9wZXJ0eSkpCiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgcHJvcGVydGllc1twcm9wZXJ0eV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gb2JqZWN0OwogICAgfTsKfQoKLy8gRVM1IDE1LjIuMy44Ci8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy44CmlmICghT2JqZWN0LnNlYWwpIHsKICAgIE9iamVjdC5zZWFsID0gZnVuY3Rpb24gc2VhbChvYmplY3QpIHsKICAgICAgICAvLyB0aGlzIGlzIG1pc2xlYWRpbmcgYW5kIGJyZWFrcyBmZWF0dXJlLWRldGVjdGlvbiwgYnV0CiAgICAgICAgLy8gYWxsb3dzICJzZWN1cmFibGUiIGNvZGUgdG8gImdyYWNlZnVsbHkiIGRlZ3JhZGUgdG8gd29ya2luZwogICAgICAgIC8vIGJ1dCBpbnNlY3VyZSBjb2RlLgogICAgICAgIHJldHVybiBvYmplY3Q7CiAgICB9Owp9CgovLyBFUzUgMTUuMi4zLjkKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjkKaWYgKCFPYmplY3QuZnJlZXplKSB7CiAgICBPYmplY3QuZnJlZXplID0gZnVuY3Rpb24gZnJlZXplKG9iamVjdCkgewogICAgICAgIC8vIHRoaXMgaXMgbWlzbGVhZGluZyBhbmQgYnJlYWtzIGZlYXR1cmUtZGV0ZWN0aW9uLCBidXQKICAgICAgICAvLyBhbGxvd3MgInNlY3VyYWJsZSIgY29kZSB0byAiZ3JhY2VmdWxseSIgZGVncmFkZSB0byB3b3JraW5nCiAgICAgICAgLy8gYnV0IGluc2VjdXJlIGNvZGUuCiAgICAgICAgcmV0dXJuIG9iamVjdDsKICAgIH07Cn0KCi8vIGRldGVjdCBhIFJoaW5vIGJ1ZyBhbmQgcGF0Y2ggaXQKdHJ5IHsKICAgIE9iamVjdC5mcmVlemUoZnVuY3Rpb24gKCkge30pOwp9IGNhdGNoIChleGNlcHRpb24pIHsKICAgIE9iamVjdC5mcmVlemUgPSAoZnVuY3Rpb24gZnJlZXplKGZyZWV6ZU9iamVjdCkgewogICAgICAgIHJldHVybiBmdW5jdGlvbiBmcmVlemUob2JqZWN0KSB7CiAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0ID09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3Q7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnJlZXplT2JqZWN0KG9iamVjdCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfSkoT2JqZWN0LmZyZWV6ZSk7Cn0KCi8vIEVTNSAxNS4yLjMuMTAKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjEwCmlmICghT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKSB7CiAgICBPYmplY3QucHJldmVudEV4dGVuc2lvbnMgPSBmdW5jdGlvbiBwcmV2ZW50RXh0ZW5zaW9ucyhvYmplY3QpIHsKICAgICAgICAvLyB0aGlzIGlzIG1pc2xlYWRpbmcgYW5kIGJyZWFrcyBmZWF0dXJlLWRldGVjdGlvbiwgYnV0CiAgICAgICAgLy8gYWxsb3dzICJzZWN1cmFibGUiIGNvZGUgdG8gImdyYWNlZnVsbHkiIGRlZ3JhZGUgdG8gd29ya2luZwogICAgICAgIC8vIGJ1dCBpbnNlY3VyZSBjb2RlLgogICAgICAgIHJldHVybiBvYmplY3Q7CiAgICB9Owp9CgovLyBFUzUgMTUuMi4zLjExCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMQppZiAoIU9iamVjdC5pc1NlYWxlZCkgewogICAgT2JqZWN0LmlzU2VhbGVkID0gZnVuY3Rpb24gaXNTZWFsZWQob2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfTsKfQoKLy8gRVM1IDE1LjIuMy4xMgovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuMTIKaWYgKCFPYmplY3QuaXNGcm96ZW4pIHsKICAgIE9iamVjdC5pc0Zyb3plbiA9IGZ1bmN0aW9uIGlzRnJvemVuKG9iamVjdCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH07Cn0KCi8vIEVTNSAxNS4yLjMuMTMKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjEzCmlmICghT2JqZWN0LmlzRXh0ZW5zaWJsZSkgewogICAgT2JqZWN0LmlzRXh0ZW5zaWJsZSA9IGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZShvYmplY3QpIHsKICAgICAgICAvLyAxLiBJZiBUeXBlKE8pIGlzIG5vdCBPYmplY3QgdGhyb3cgYSBUeXBlRXJyb3IgZXhjZXB0aW9uLgogICAgICAgIGlmIChPYmplY3Qob2JqZWN0KSA9PT0gb2JqZWN0KSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlCiAgICAgICAgfQogICAgICAgIC8vIDIuIFJldHVybiB0aGUgQm9vbGVhbiB2YWx1ZSBvZiB0aGUgW1tFeHRlbnNpYmxlXV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgTy4KICAgICAgICB2YXIgbmFtZSA9ICcnOwogICAgICAgIHdoaWxlIChvd25zKG9iamVjdCwgbmFtZSkpIHsKICAgICAgICAgICAgbmFtZSArPSAnPyc7CiAgICAgICAgfQogICAgICAgIG9iamVjdFtuYW1lXSA9IHRydWU7CiAgICAgICAgdmFyIHJldHVyblZhbHVlID0gb3ducyhvYmplY3QsIG5hbWUpOwogICAgICAgIGRlbGV0ZSBvYmplY3RbbmFtZV07CiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwogICAgfTsKfQoKLy8gRVM1IDE1LjIuMy4xNAovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuMTQKaWYgKCFPYmplY3Qua2V5cykgewogICAgLy8gaHR0cDovL3doYXR0aGVoZWFkc2FpZC5jb20vMjAxMC8xMC9hLXNhZmVyLW9iamVjdC1rZXlzLWNvbXBhdGliaWxpdHktaW1wbGVtZW50YXRpb24KICAgIHZhciBoYXNEb250RW51bUJ1ZyA9IHRydWUsCiAgICAgICAgZG9udEVudW1zID0gWwogICAgICAgICAgICAidG9TdHJpbmciLAogICAgICAgICAgICAidG9Mb2NhbGVTdHJpbmciLAogICAgICAgICAgICAidmFsdWVPZiIsCiAgICAgICAgICAgICJoYXNPd25Qcm9wZXJ0eSIsCiAgICAgICAgICAgICJpc1Byb3RvdHlwZU9mIiwKICAgICAgICAgICAgInByb3BlcnR5SXNFbnVtZXJhYmxlIiwKICAgICAgICAgICAgImNvbnN0cnVjdG9yIgogICAgICAgIF0sCiAgICAgICAgZG9udEVudW1zTGVuZ3RoID0gZG9udEVudW1zLmxlbmd0aDsKCiAgICBmb3IgKHZhciBrZXkgaW4geyJ0b1N0cmluZyI6IG51bGx9KQogICAgICAgIGhhc0RvbnRFbnVtQnVnID0gZmFsc2U7CgogICAgT2JqZWN0LmtleXMgPSBmdW5jdGlvbiBrZXlzKG9iamVjdCkgewoKICAgICAgICBpZiAoKHR5cGVvZiBvYmplY3QgIT0gIm9iamVjdCIgJiYgdHlwZW9mIG9iamVjdCAhPSAiZnVuY3Rpb24iKSB8fCBvYmplY3QgPT09IG51bGwpCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdC5rZXlzIGNhbGxlZCBvbiBhIG5vbi1vYmplY3QiKTsKCiAgICAgICAgdmFyIGtleXMgPSBbXTsKICAgICAgICBmb3IgKHZhciBuYW1lIGluIG9iamVjdCkgewogICAgICAgICAgICBpZiAob3ducyhvYmplY3QsIG5hbWUpKSB7CiAgICAgICAgICAgICAgICBrZXlzLnB1c2gobmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChoYXNEb250RW51bUJ1ZykgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBkb250RW51bXNMZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgZG9udEVudW0gPSBkb250RW51bXNbaV07CiAgICAgICAgICAgICAgICBpZiAob3ducyhvYmplY3QsIGRvbnRFbnVtKSkgewogICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChkb250RW51bSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBrZXlzOwogICAgfTsKCn0KCi8vCi8vIERhdGUKLy8gPT09PQovLwoKLy8gRVM1IDE1LjkuNS40MwovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS45LjUuNDMKLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgU3RyaW5nIHZhbHVlIHJlcHJlc2VudCB0aGUgaW5zdGFuY2UgaW4gdGltZSAKLy8gcmVwcmVzZW50ZWQgYnkgdGhpcyBEYXRlIG9iamVjdC4gVGhlIGZvcm1hdCBvZiB0aGUgU3RyaW5nIGlzIHRoZSBEYXRlIFRpbWUgCi8vIHN0cmluZyBmb3JtYXQgZGVmaW5lZCBpbiAxNS45LjEuMTUuIEFsbCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIFN0cmluZy4gCi8vIFRoZSB0aW1lIHpvbmUgaXMgYWx3YXlzIFVUQywgZGVub3RlZCBieSB0aGUgc3VmZml4IFouIElmIHRoZSB0aW1lIHZhbHVlIG9mIAovLyB0aGlzIG9iamVjdCBpcyBub3QgYSBmaW5pdGUgTnVtYmVyIGEgUmFuZ2VFcnJvciBleGNlcHRpb24gaXMgdGhyb3duLgppZiAoIURhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nIHx8IChuZXcgRGF0ZSgtNjIxOTg3NTUyMDAwMDApLnRvSVNPU3RyaW5nKCkuaW5kZXhPZignLTAwMDAwMScpID09PSAtMSkpIHsKICAgIERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nID0gZnVuY3Rpb24gdG9JU09TdHJpbmcoKSB7CiAgICAgICAgdmFyIHJlc3VsdCwgbGVuZ3RoLCB2YWx1ZSwgeWVhcjsKICAgICAgICBpZiAoIWlzRmluaXRlKHRoaXMpKQogICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcjsKCiAgICAgICAgLy8gdGhlIGRhdGUgdGltZSBzdHJpbmcgZm9ybWF0IGlzIHNwZWNpZmllZCBpbiAxNS45LjEuMTUuCiAgICAgICAgcmVzdWx0ID0gW3RoaXMuZ2V0VVRDTW9udGgoKSArIDEsIHRoaXMuZ2V0VVRDRGF0ZSgpLAogICAgICAgICAgICB0aGlzLmdldFVUQ0hvdXJzKCksIHRoaXMuZ2V0VVRDTWludXRlcygpLCB0aGlzLmdldFVUQ1NlY29uZHMoKV07CiAgICAgICAgeWVhciA9IHRoaXMuZ2V0VVRDRnVsbFllYXIoKTsKICAgICAgICB5ZWFyID0gKHllYXIgPCAwID8gJy0nIDogKHllYXIgPiA5OTk5ID8gJysnIDogJycpKSArICgnMDAwMDAnICsgTWF0aC5hYnMoeWVhcikpLnNsaWNlKDAgPD0geWVhciAmJiB5ZWFyIDw9IDk5OTkgPyAtNCA6IC02KTsKCiAgICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDsKICAgICAgICB3aGlsZSAobGVuZ3RoLS0pIHsKICAgICAgICAgICAgdmFsdWUgPSByZXN1bHRbbGVuZ3RoXTsKICAgICAgICAgICAgLy8gcGFkIG1vbnRocywgZGF5cywgaG91cnMsIG1pbnV0ZXMsIGFuZCBzZWNvbmRzIHRvIGhhdmUgdHdvIGRpZ2l0cy4KICAgICAgICAgICAgaWYgKHZhbHVlIDwgMTApCiAgICAgICAgICAgICAgICByZXN1bHRbbGVuZ3RoXSA9ICIwIiArIHZhbHVlOwogICAgICAgIH0KICAgICAgICAvLyBwYWQgbWlsbGlzZWNvbmRzIHRvIGhhdmUgdGhyZWUgZGlnaXRzLgogICAgICAgIHJldHVybiB5ZWFyICsgIi0iICsgcmVzdWx0LnNsaWNlKDAsIDIpLmpvaW4oIi0iKSArICJUIiArIHJlc3VsdC5zbGljZSgyKS5qb2luKCI6IikgKyAiLiIgKwogICAgICAgICAgICAoIjAwMCIgKyB0aGlzLmdldFVUQ01pbGxpc2Vjb25kcygpKS5zbGljZSgtMykgKyAiWiI7CiAgICB9Cn0KCi8vIEVTNSAxNS45LjQuNAovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS45LjQuNAppZiAoIURhdGUubm93KSB7CiAgICBEYXRlLm5vdyA9IGZ1bmN0aW9uIG5vdygpIHsKICAgICAgICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICB9Owp9CgovLyBFUzUgMTUuOS41LjQ0Ci8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjkuNS40NAovLyBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgRGF0ZSBvYmplY3QgZm9yIHVzZSBieSAKLy8gSlNPTi5zdHJpbmdpZnkgKDE1LjEyLjMpLgppZiAoIURhdGUucHJvdG90eXBlLnRvSlNPTikgewogICAgRGF0ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OKGtleSkgewogICAgICAgIC8vIFdoZW4gdGhlIHRvSlNPTiBtZXRob2QgaXMgY2FsbGVkIHdpdGggYXJndW1lbnQga2V5LCB0aGUgZm9sbG93aW5nIAogICAgICAgIC8vIHN0ZXBzIGFyZSB0YWtlbjoKCiAgICAgICAgLy8gMS4gIExldCBPIGJlIHRoZSByZXN1bHQgb2YgY2FsbGluZyBUb09iamVjdCwgZ2l2aW5nIGl0IHRoZSB0aGlzCiAgICAgICAgLy8gdmFsdWUgYXMgaXRzIGFyZ3VtZW50LgogICAgICAgIC8vIDIuIExldCB0diBiZSBUb1ByaW1pdGl2ZShPLCBoaW50IE51bWJlcikuCiAgICAgICAgLy8gMy4gSWYgdHYgaXMgYSBOdW1iZXIgYW5kIGlzIG5vdCBmaW5pdGUsIHJldHVybiBudWxsLgogICAgICAgIC8vIFhYWAogICAgICAgIC8vIDQuIExldCB0b0lTTyBiZSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIFtbR2V0XV0gaW50ZXJuYWwgbWV0aG9kIG9mCiAgICAgICAgLy8gTyB3aXRoIGFyZ3VtZW50ICJ0b0lTT1N0cmluZyIuCiAgICAgICAgLy8gNS4gSWYgSXNDYWxsYWJsZSh0b0lTTykgaXMgZmFsc2UsIHRocm93IGEgVHlwZUVycm9yIGV4Y2VwdGlvbi4KICAgICAgICBpZiAodHlwZW9mIHRoaXMudG9JU09TdHJpbmcgIT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UKICAgICAgICAvLyA2LiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBtZXRob2Qgb2YKICAgICAgICAvLyAgdG9JU08gd2l0aCBPIGFzIHRoZSB0aGlzIHZhbHVlIGFuZCBhbiBlbXB0eSBhcmd1bWVudCBsaXN0LgogICAgICAgIHJldHVybiB0aGlzLnRvSVNPU3RyaW5nKCk7CgogICAgICAgIC8vIE5PVEUgMSBUaGUgYXJndW1lbnQgaXMgaWdub3JlZC4KCiAgICAgICAgLy8gTk9URSAyIFRoZSB0b0pTT04gZnVuY3Rpb24gaXMgaW50ZW50aW9uYWxseSBnZW5lcmljOyBpdCBkb2VzIG5vdAogICAgICAgIC8vIHJlcXVpcmUgdGhhdCBpdHMgdGhpcyB2YWx1ZSBiZSBhIERhdGUgb2JqZWN0LiBUaGVyZWZvcmUsIGl0IGNhbiBiZQogICAgICAgIC8vIHRyYW5zZmVycmVkIHRvIG90aGVyIGtpbmRzIG9mIG9iamVjdHMgZm9yIHVzZSBhcyBhIG1ldGhvZC4gSG93ZXZlciwKICAgICAgICAvLyBpdCBkb2VzIHJlcXVpcmUgdGhhdCBhbnkgc3VjaCBvYmplY3QgaGF2ZSBhIHRvSVNPU3RyaW5nIG1ldGhvZC4gQW4KICAgICAgICAvLyBvYmplY3QgaXMgZnJlZSB0byB1c2UgdGhlIGFyZ3VtZW50IGtleSB0byBmaWx0ZXIgaXRzCiAgICAgICAgLy8gc3RyaW5naWZpY2F0aW9uLgogICAgfTsKfQoKLy8gRVM1IDE1LjkuNC4yCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjkuNC4yCi8vIGJhc2VkIG9uIHdvcmsgc2hhcmVkIGJ5IERhbmllbCBGcmllc2VuIChkYW50bWFuKQovLyBodHRwOi8vZ2lzdC5naXRodWIuY29tLzMwMzI0OQppZiAoRGF0ZS5wYXJzZSgiKzI3NTc2MC0wOS0xM1QwMDowMDowMC4wMDBaIikgIT09IDguNjRlMTUpIHsKICAgIC8vIFhYWCBnbG9iYWwgYXNzaWdubWVudCB3b24ndCB3b3JrIGluIGVtYmVkZGluZ3MgdGhhdCB1c2UKICAgIC8vIGFuIGFsdGVybmF0ZSBvYmplY3QgZm9yIHRoZSBjb250ZXh0LgogICAgRGF0ZSA9IChmdW5jdGlvbihOYXRpdmVEYXRlKSB7CgogICAgICAgIC8vIERhdGUubGVuZ3RoID09PSA3CiAgICAgICAgdmFyIERhdGUgPSBmdW5jdGlvbiBEYXRlKFksIE0sIEQsIGgsIG0sIHMsIG1zKSB7CiAgICAgICAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOwogICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIE5hdGl2ZURhdGUpIHsKICAgICAgICAgICAgICAgIHZhciBkYXRlID0gbGVuZ3RoID09IDEgJiYgU3RyaW5nKFkpID09PSBZID8gLy8gaXNTdHJpbmcoWSkKICAgICAgICAgICAgICAgICAgICAvLyBXZSBleHBsaWNpdGx5IHBhc3MgaXQgdGhyb3VnaCBwYXJzZToKICAgICAgICAgICAgICAgICAgICBuZXcgTmF0aXZlRGF0ZShEYXRlLnBhcnNlKFkpKSA6CiAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byBtYW51YWxseSBtYWtlIGNhbGxzIGRlcGVuZGluZyBvbiBhcmd1bWVudAogICAgICAgICAgICAgICAgICAgIC8vIGxlbmd0aCBoZXJlCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDcgPyBuZXcgTmF0aXZlRGF0ZShZLCBNLCBELCBoLCBtLCBzLCBtcykgOgogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSA2ID8gbmV3IE5hdGl2ZURhdGUoWSwgTSwgRCwgaCwgbSwgcykgOgogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSA1ID8gbmV3IE5hdGl2ZURhdGUoWSwgTSwgRCwgaCwgbSkgOgogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSA0ID8gbmV3IE5hdGl2ZURhdGUoWSwgTSwgRCwgaCkgOgogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSAzID8gbmV3IE5hdGl2ZURhdGUoWSwgTSwgRCkgOgogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSAyID8gbmV3IE5hdGl2ZURhdGUoWSwgTSkgOgogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSAxID8gbmV3IE5hdGl2ZURhdGUoWSkgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5hdGl2ZURhdGUoKTsKICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgbWl4dXBzIHdpdGggdW5maXhlZCBEYXRlIG9iamVjdAogICAgICAgICAgICAgICAgZGF0ZS5jb25zdHJ1Y3RvciA9IERhdGU7CiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH07CgogICAgICAgIC8vIDE1LjkuMS4xNSBEYXRlIFRpbWUgU3RyaW5nIEZvcm1hdC4KICAgICAgICB2YXIgaXNvRGF0ZUV4cHJlc3Npb24gPSBuZXcgUmVnRXhwKCJeIiArCiAgICAgICAgICAgICIoXFxkezR9fFtcK1wtXVxcZHs2fSkiICsgLy8gZm91ci1kaWdpdCB5ZWFyIGNhcHR1cmUgb3Igc2lnbiArIDYtZGlnaXQgZXh0ZW5kZWQgeWVhcgogICAgICAgICAgICAiKD86LShcXGR7Mn0pIiArIC8vIG9wdGlvbmFsIG1vbnRoIGNhcHR1cmUKICAgICAgICAgICAgIig/Oi0oXFxkezJ9KSIgKyAvLyBvcHRpb25hbCBkYXkgY2FwdHVyZQogICAgICAgICAgICAiKD86IiArIC8vIGNhcHR1cmUgaG91cnM6bWludXRlczpzZWNvbmRzLm1pbGxpc2Vjb25kcwogICAgICAgICAgICAgICAgIlQoXFxkezJ9KSIgKyAvLyBob3VycyBjYXB0dXJlCiAgICAgICAgICAgICAgICAiOihcXGR7Mn0pIiArIC8vIG1pbnV0ZXMgY2FwdHVyZQogICAgICAgICAgICAgICAgIig/OiIgKyAvLyBvcHRpb25hbCA6c2Vjb25kcy5taWxsaXNlY29uZHMKICAgICAgICAgICAgICAgICAgICAiOihcXGR7Mn0pIiArIC8vIHNlY29uZHMgY2FwdHVyZQogICAgICAgICAgICAgICAgICAgICIoPzpcXC4oXFxkezN9KSk/IiArIC8vIG1pbGxpc2Vjb25kcyBjYXB0dXJlCiAgICAgICAgICAgICAgICAiKT8iICsKICAgICAgICAgICAgIig/OiIgKyAvLyBjYXB0dXJlIFVUQyBvZmZzZXQgY29tcG9uZW50CiAgICAgICAgICAgICAgICAiWnwiICsgLy8gVVRDIGNhcHR1cmUKICAgICAgICAgICAgICAgICIoPzoiICsgLy8gb2Zmc2V0IHNwZWNpZmllciArLy1ob3VyczptaW51dGVzCiAgICAgICAgICAgICAgICAgICAgIihbLStdKSIgKyAvLyBzaWduIGNhcHR1cmUKICAgICAgICAgICAgICAgICAgICAiKFxcZHsyfSkiICsgLy8gaG91cnMgb2Zmc2V0IGNhcHR1cmUKICAgICAgICAgICAgICAgICAgICAiOihcXGR7Mn0pIiArIC8vIG1pbnV0ZXMgb2Zmc2V0IGNhcHR1cmUKICAgICAgICAgICAgICAgICIpIiArCiAgICAgICAgICAgICIpPyk/KT8pPyIgKwogICAgICAgICIkIik7CgogICAgICAgIC8vIENvcHkgYW55IGN1c3RvbSBtZXRob2RzIGEgM3JkIHBhcnR5IGxpYnJhcnkgbWF5IGhhdmUgYWRkZWQKICAgICAgICBmb3IgKHZhciBrZXkgaW4gTmF0aXZlRGF0ZSkKICAgICAgICAgICAgRGF0ZVtrZXldID0gTmF0aXZlRGF0ZVtrZXldOwoKICAgICAgICAvLyBDb3B5ICJuYXRpdmUiIG1ldGhvZHMgZXhwbGljaXRseTsgdGhleSBtYXkgYmUgbm9uLWVudW1lcmFibGUKICAgICAgICBEYXRlLm5vdyA9IE5hdGl2ZURhdGUubm93OwogICAgICAgIERhdGUuVVRDID0gTmF0aXZlRGF0ZS5VVEM7CiAgICAgICAgRGF0ZS5wcm90b3R5cGUgPSBOYXRpdmVEYXRlLnByb3RvdHlwZTsKICAgICAgICBEYXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERhdGU7CgogICAgICAgIC8vIFVwZ3JhZGUgRGF0ZS5wYXJzZSB0byBoYW5kbGUgc2ltcGxpZmllZCBJU08gODYwMSBzdHJpbmdzCiAgICAgICAgRGF0ZS5wYXJzZSA9IGZ1bmN0aW9uIHBhcnNlKHN0cmluZykgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBpc29EYXRlRXhwcmVzc2lvbi5leGVjKHN0cmluZyk7CiAgICAgICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICAgICAgbWF0Y2guc2hpZnQoKTsgLy8ga2lsbCBtYXRjaFswXSwgdGhlIGZ1bGwgbWF0Y2gKICAgICAgICAgICAgICAgIC8vIHBhcnNlIG1vbnRocywgZGF5cywgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGFuZCBtaWxsaXNlY29uZHMKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgNzsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gcHJvdmlkZSBkZWZhdWx0IHZhbHVlcyBpZiBuZWNlc3NhcnkKICAgICAgICAgICAgICAgICAgICBtYXRjaFtpXSA9ICsobWF0Y2hbaV0gfHwgKGkgPCAzID8gMSA6IDApKTsKICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaFsxXSBpcyB0aGUgbW9udGguIE1vbnRocyBhcmUgMC0xMSBpbiBKYXZhU2NyaXB0CiAgICAgICAgICAgICAgICAgICAgLy8gYERhdGVgIG9iamVjdHMsIGJ1dCAxLTEyIGluIElTTyBub3RhdGlvbiwgc28gd2UKICAgICAgICAgICAgICAgICAgICAvLyBkZWNyZW1lbnQuCiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbaV0tLTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBwYXJzZSB0aGUgVVRDIG9mZnNldCBjb21wb25lbnQKICAgICAgICAgICAgICAgIHZhciBtaW51dGVPZmZzZXQgPSArbWF0Y2gucG9wKCksIGhvdXJPZmZzZXQgPSArbWF0Y2gucG9wKCksIHNpZ24gPSBtYXRjaC5wb3AoKTsKCiAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHRoZSBleHBsaWNpdCB0aW1lIHpvbmUgb2Zmc2V0IGlmIHNwZWNpZmllZAogICAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IDA7CiAgICAgICAgICAgICAgICBpZiAoc2lnbikgewogICAgICAgICAgICAgICAgICAgIC8vIGRldGVjdCBpbnZhbGlkIG9mZnNldHMgYW5kIHJldHVybiBlYXJseQogICAgICAgICAgICAgICAgICAgIGlmIChob3VyT2Zmc2V0ID4gMjMgfHwgbWludXRlT2Zmc2V0ID4gNTkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOYU47CgogICAgICAgICAgICAgICAgICAgIC8vIGV4cHJlc3MgdGhlIHByb3ZpZGVkIHRpbWUgem9uZSBvZmZzZXQgaW4gbWludXRlcy4gVGhlIG9mZnNldCBpcwogICAgICAgICAgICAgICAgICAgIC8vIG5lZ2F0aXZlIGZvciB0aW1lIHpvbmVzIHdlc3Qgb2YgVVRDOyBwb3NpdGl2ZSBvdGhlcndpc2UuCiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKGhvdXJPZmZzZXQgKiA2MCArIG1pbnV0ZU9mZnNldCkgKiA2ZTQgKiAoc2lnbiA9PSAiKyIgPyAtMSA6IDEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIERhdGUuVVRDIGZvciB5ZWFycyBiZXR3ZWVuIDAgYW5kIDk5IGNvbnZlcnRzIHllYXIgdG8gMTkwMCArIHllYXIKICAgICAgICAgICAgICAgIC8vIFRoZSBHcmVnb3JpYW4gY2FsZW5kYXIgaGFzIGEgNDAwLXllYXIgY3ljbGUsIHNvIAogICAgICAgICAgICAgICAgLy8gdG8gRGF0ZS5VVEMoeWVhciArIDQwMCwgLi4uLiApIC0gMTI2MjI3ODA4MDAwMDAgPT0gRGF0ZS5VVEMoeWVhciwgLi4uKSwKICAgICAgICAgICAgICAgIC8vIHdoZXJlIDEyNjIyNzgwODAwMDAwIC0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBHcmVnb3JpYW4gY2FsZW5kYXIgNDAwIHllYXJzCiAgICAgICAgICAgICAgICB2YXIgeWVhciA9ICttYXRjaFswXTsKICAgICAgICAgICAgICAgIGlmICgwIDw9IHllYXIgJiYgeWVhciA8PSA5OSkgewogICAgICAgICAgICAgICAgICAgIG1hdGNoWzBdID0geWVhciArIDQwMDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5VVEMuYXBwbHkodGhpcywgbWF0Y2gpICsgb2Zmc2V0IC0gMTI2MjI3ODA4MDAwMDA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gY29tcHV0ZSBhIG5ldyBVVEMgZGF0ZSB2YWx1ZSwgYWNjb3VudGluZyBmb3IgdGhlIG9wdGlvbmFsIG9mZnNldAogICAgICAgICAgICAgICAgcmV0dXJuIE5hdGl2ZURhdGUuVVRDLmFwcGx5KHRoaXMsIG1hdGNoKSArIG9mZnNldDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5wYXJzZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH07CgogICAgICAgIHJldHVybiBEYXRlOwogICAgfSkoRGF0ZSk7Cn0KCi8vCi8vIFN0cmluZwovLyA9PT09PT0KLy8KCi8vIEVTNSAxNS41LjQuMjAKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNS40LjIwCnZhciB3cyA9ICJceDA5XHgwQVx4MEJceDBDXHgwRFx4MjBceEEwXHUxNjgwXHUxODBFXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzIiArCiAgICAiXHUyMDA0XHUyMDA1XHUyMDA2XHUyMDA3XHUyMDA4XHUyMDA5XHUyMDBBXHUyMDJGXHUyMDVGXHUzMDAwXHUyMDI4IiArCiAgICAiXHUyMDI5XHVGRUZGIjsKaWYgKCFTdHJpbmcucHJvdG90eXBlLnRyaW0gfHwgd3MudHJpbSgpKSB7CiAgICAvLyBodHRwOi8vYmxvZy5zdGV2ZW5sZXZpdGhhbi5jb20vYXJjaGl2ZXMvZmFzdGVyLXRyaW0tamF2YXNjcmlwdAogICAgLy8gaHR0cDovL3BlcmZlY3Rpb25raWxscy5jb20vd2hpdGVzcGFjZS1kZXZpYXRpb25zLwogICAgd3MgPSAiWyIgKyB3cyArICJdIjsKICAgIHZhciB0cmltQmVnaW5SZWdleHAgPSBuZXcgUmVnRXhwKCJeIiArIHdzICsgd3MgKyAiKiIpLAogICAgICAgIHRyaW1FbmRSZWdleHAgPSBuZXcgUmVnRXhwKHdzICsgd3MgKyAiKiQiKTsKICAgIFN0cmluZy5wcm90b3R5cGUudHJpbSA9IGZ1bmN0aW9uIHRyaW0oKSB7CiAgICAgICAgcmV0dXJuIFN0cmluZyh0aGlzKS5yZXBsYWNlKHRyaW1CZWdpblJlZ2V4cCwgIiIpLnJlcGxhY2UodHJpbUVuZFJlZ2V4cCwgIiIpOwogICAgfTsKfQoKLy8KLy8gVXRpbAovLyA9PT09PT0KLy8KCi8vIEVTNSA5LjQKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4OS40Ci8vIGh0dHA6Ly9qc3BlcmYuY29tL3RvLWludGVnZXIKdmFyIHRvSW50ZWdlciA9IGZ1bmN0aW9uIChuKSB7CiAgICBuID0gK247CiAgICBpZiAobiAhPT0gbikgLy8gaXNOYU4KICAgICAgICBuID0gMDsKICAgIGVsc2UgaWYgKG4gIT09IDAgJiYgbiAhPT0gKDEvMCkgJiYgbiAhPT0gLSgxLzApKQogICAgICAgIG4gPSAobiA+IDAgfHwgLTEpICogTWF0aC5mbG9vcihNYXRoLmFicyhuKSk7CiAgICByZXR1cm4gbjsKfTsKCnZhciBwcmVwYXJlU3RyaW5nID0gImEiWzBdICE9ICJhIiwKICAgIC8vIEVTNSA5LjkKICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDkuOQogICAgdG9PYmplY3QgPSBmdW5jdGlvbiAobykgewogICAgICAgIGlmIChvID09IG51bGwpIHsgLy8gdGhpcyBtYXRjaGVzIGJvdGggbnVsbCBhbmQgdW5kZWZpbmVkCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlCiAgICAgICAgfQogICAgICAgIC8vIElmIHRoZSBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHN1cHBvcnQgYnktaW5kZXggYWNjZXNzIG9mCiAgICAgICAgLy8gc3RyaW5nIGNoYXJhY3RlcnMgKGV4LiBJRSA8IDcpLCBzcGxpdCB0aGUgc3RyaW5nCiAgICAgICAgaWYgKHByZXBhcmVTdHJpbmcgJiYgdHlwZW9mIG8gPT0gInN0cmluZyIgJiYgbykgewogICAgICAgICAgICByZXR1cm4gby5zcGxpdCgiIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBPYmplY3Qobyk7CiAgICB9Owp9KTsvKiB2aW06dHM9NDpzdHM9NDpzdz00OgogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqICAgICAgSXJha2xpIEdvemFsaXNodmlsaSA8cmZvYmljQGdtYWlsLmNvbT4gKGh0dHA6Ly9qZWRpdG9vbGtpdC5jb20pCiAqICAgICAgTWlrZSBkZSBCb2VyIDxtaWtlIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL2xpYi9ldmVudF9lbWl0dGVyJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIEV2ZW50RW1pdHRlciA9IHt9OwoKRXZlbnRFbWl0dGVyLl9lbWl0ID0KRXZlbnRFbWl0dGVyLl9kaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24oZXZlbnROYW1lLCBlKSB7CiAgICB0aGlzLl9ldmVudFJlZ2lzdHJ5ID0gdGhpcy5fZXZlbnRSZWdpc3RyeSB8fCB7fTsKICAgIHRoaXMuX2RlZmF1bHRIYW5kbGVycyA9IHRoaXMuX2RlZmF1bHRIYW5kbGVycyB8fCB7fTsKCiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdIHx8IFtdOwogICAgdmFyIGRlZmF1bHRIYW5kbGVyID0gdGhpcy5fZGVmYXVsdEhhbmRsZXJzW2V2ZW50TmFtZV07CiAgICBpZiAoIWxpc3RlbmVycy5sZW5ndGggJiYgIWRlZmF1bHRIYW5kbGVyKQogICAgICAgIHJldHVybjsKCiAgICBlID0gZSB8fCB7fTsKICAgIGUudHlwZSA9IGV2ZW50TmFtZTsKICAgIAogICAgaWYgKCFlLnN0b3BQcm9wYWdhdGlvbikgewogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZTsKICAgICAgICB9OwogICAgfQogICAgCiAgICBpZiAoIWUucHJldmVudERlZmF1bHQpIHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7CiAgICAgICAgfTsKICAgIH0KCiAgICBmb3IgKHZhciBpPTA7IGk8bGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbGlzdGVuZXJzW2ldKGUpOwogICAgICAgIGlmIChlLnByb3BhZ2F0aW9uU3RvcHBlZCkKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICAKICAgIGlmIChkZWZhdWx0SGFuZGxlciAmJiAhZS5kZWZhdWx0UHJldmVudGVkKQogICAgICAgIGRlZmF1bHRIYW5kbGVyKGUpOwp9OwoKRXZlbnRFbWl0dGVyLnNldERlZmF1bHRIYW5kbGVyID0gZnVuY3Rpb24oZXZlbnROYW1lLCBjYWxsYmFjaykgewogICAgdGhpcy5fZGVmYXVsdEhhbmRsZXJzID0gdGhpcy5fZGVmYXVsdEhhbmRsZXJzIHx8IHt9OwogICAgCiAgICBpZiAodGhpcy5fZGVmYXVsdEhhbmRsZXJzW2V2ZW50TmFtZV0pCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgZGVmYXVsdCBoYW5kbGVyIGZvciAnIiArIGV2ZW50TmFtZSArICInIGlzIGFscmVhZHkgc2V0Iik7CiAgICAgICAgCiAgICB0aGlzLl9kZWZhdWx0SGFuZGxlcnNbZXZlbnROYW1lXSA9IGNhbGxiYWNrOwp9OwoKRXZlbnRFbWl0dGVyLm9uID0KRXZlbnRFbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7CiAgICB0aGlzLl9ldmVudFJlZ2lzdHJ5ID0gdGhpcy5fZXZlbnRSZWdpc3RyeSB8fCB7fTsKCiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdOwogICAgaWYgKCFsaXN0ZW5lcnMpCiAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50UmVnaXN0cnlbZXZlbnROYW1lXSA9IFtdOwoKICAgIGlmIChsaXN0ZW5lcnMuaW5kZXhPZihjYWxsYmFjaykgPT0gLTEpCiAgICAgICAgbGlzdGVuZXJzLnB1c2goY2FsbGJhY2spOwp9OwoKRXZlbnRFbWl0dGVyLnJlbW92ZUxpc3RlbmVyID0KRXZlbnRFbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7CiAgICB0aGlzLl9ldmVudFJlZ2lzdHJ5ID0gdGhpcy5fZXZlbnRSZWdpc3RyeSB8fCB7fTsKCiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdOwogICAgaWYgKCFsaXN0ZW5lcnMpCiAgICAgICAgcmV0dXJuOwoKICAgIHZhciBpbmRleCA9IGxpc3RlbmVycy5pbmRleE9mKGNhbGxiYWNrKTsKICAgIGlmIChpbmRleCAhPT0gLTEpCiAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7Cn07CgpFdmVudEVtaXR0ZXIucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnROYW1lKSB7CiAgICBpZiAodGhpcy5fZXZlbnRSZWdpc3RyeSkgdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdID0gW107Cn07CgpleHBvcnRzLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjsKCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL2xpYi9vb3AnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7CgpleHBvcnRzLmluaGVyaXRzID0gKGZ1bmN0aW9uKCkgewogICAgdmFyIHRlbXBDdG9yID0gZnVuY3Rpb24oKSB7fTsKICAgIHJldHVybiBmdW5jdGlvbihjdG9yLCBzdXBlckN0b3IpIHsKICAgICAgICB0ZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlOwogICAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yLnByb3RvdHlwZTsKICAgICAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyB0ZW1wQ3RvcigpOwogICAgICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvcjsKICAgIH07Cn0oKSk7CgpleHBvcnRzLm1peGluID0gZnVuY3Rpb24ob2JqLCBtaXhpbikgewogICAgZm9yICh2YXIga2V5IGluIG1peGluKSB7CiAgICAgICAgb2JqW2tleV0gPSBtaXhpbltrZXldOwogICAgfQp9OwoKZXhwb3J0cy5pbXBsZW1lbnQgPSBmdW5jdGlvbihwcm90bywgbWl4aW4pIHsKICAgIGV4cG9ydHMubWl4aW4ocHJvdG8sIG1peGluKTsKfTsKCn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCiAKZGVmaW5lKCdhY2UvbW9kZS9jc3Nfd29ya2VyJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvbGliL29vcCcsICdhY2Uvd29ya2VyL21pcnJvcicsICdhY2UvbW9kZS9jc3MvY3NzbGludCddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIE1pcnJvciA9IHJlcXVpcmUoIi4uL3dvcmtlci9taXJyb3IiKS5NaXJyb3I7CnZhciBDU1NMaW50ID0gcmVxdWlyZSgiLi9jc3MvY3NzbGludCIpLkNTU0xpbnQ7Cgp2YXIgV29ya2VyID0gZXhwb3J0cy5Xb3JrZXIgPSBmdW5jdGlvbihzZW5kZXIpIHsKICAgIE1pcnJvci5jYWxsKHRoaXMsIHNlbmRlcik7CiAgICB0aGlzLnNldFRpbWVvdXQoMjAwKTsKfTsKCm9vcC5pbmhlcml0cyhXb3JrZXIsIE1pcnJvcik7CgooZnVuY3Rpb24oKSB7CiAgICAKICAgIHRoaXMub25VcGRhdGUgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmRvYy5nZXRWYWx1ZSgpOwogICAgICAgIAogICAgICAgIHZhciByZXN1bHQgPSBDU1NMaW50LnZlcmlmeSh2YWx1ZSk7CiAgICAgICAgdGhpcy5zZW5kZXIuZW1pdCgiY3NzbGludCIsIHJlc3VsdC5tZXNzYWdlcy5tYXAoZnVuY3Rpb24obXNnKSB7CiAgICAgICAgICAgIGRlbGV0ZSBtc2cucnVsZTsKICAgICAgICAgICAgcmV0dXJuIG1zZzsKICAgICAgICB9KSk7CiAgICB9OwogICAgCn0pLmNhbGwoV29ya2VyLnByb3RvdHlwZSk7Cgp9KTtkZWZpbmUoJ2FjZS93b3JrZXIvbWlycm9yJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyAsICdhY2UvZG9jdW1lbnQnLCAnYWNlL2xpYi9sYW5nJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgRG9jdW1lbnQgPSByZXF1aXJlKCIuLi9kb2N1bWVudCIpLkRvY3VtZW50Owp2YXIgbGFuZyA9IHJlcXVpcmUoIi4uL2xpYi9sYW5nIik7CiAgICAKdmFyIE1pcnJvciA9IGV4cG9ydHMuTWlycm9yID0gZnVuY3Rpb24oc2VuZGVyKSB7CiAgICB0aGlzLnNlbmRlciA9IHNlbmRlcjsKICAgIHZhciBkb2MgPSB0aGlzLmRvYyA9IG5ldyBEb2N1bWVudCgiIik7CiAgICAKICAgIHZhciBkZWZlcnJlZFVwZGF0ZSA9IHRoaXMuZGVmZXJyZWRVcGRhdGUgPSBsYW5nLmRlZmVycmVkQ2FsbCh0aGlzLm9uVXBkYXRlLmJpbmQodGhpcykpOwogICAgCiAgICB2YXIgX3NlbGYgPSB0aGlzOwogICAgc2VuZGVyLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgZG9jLmFwcGx5RGVsdGFzKFtlLmRhdGFdKTsgICAgICAgIAogICAgICAgIGRlZmVycmVkVXBkYXRlLnNjaGVkdWxlKF9zZWxmLiR0aW1lb3V0KTsKICAgIH0pOwp9OwoKKGZ1bmN0aW9uKCkgewogICAgCiAgICB0aGlzLiR0aW1lb3V0ID0gNTAwOwogICAgCiAgICB0aGlzLnNldFRpbWVvdXQgPSBmdW5jdGlvbih0aW1lb3V0KSB7CiAgICAgICAgdGhpcy4kdGltZW91dCA9IHRpbWVvdXQ7CiAgICB9OwogICAgCiAgICB0aGlzLnNldFZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICB0aGlzLmRvYy5zZXRWYWx1ZSh2YWx1ZSk7CiAgICAgICAgdGhpcy5kZWZlcnJlZFVwZGF0ZS5zY2hlZHVsZSh0aGlzLiR0aW1lb3V0KTsKICAgIH07CiAgICAKICAgIHRoaXMuZ2V0VmFsdWUgPSBmdW5jdGlvbihjYWxsYmFja0lkKSB7CiAgICAgICAgdGhpcy5zZW5kZXIuY2FsbGJhY2sodGhpcy5kb2MuZ2V0VmFsdWUoKSwgY2FsbGJhY2tJZCk7CiAgICB9OwogICAgCiAgICB0aGlzLm9uVXBkYXRlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgLy8gYWJzdHJhY3QgbWV0aG9kCiAgICB9OwogICAgCn0pLmNhbGwoTWlycm9yLnByb3RvdHlwZSk7Cgp9KTsvKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9kb2N1bWVudCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9ldmVudF9lbWl0dGVyJywgJ2FjZS9yYW5nZScsICdhY2UvYW5jaG9yJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi9saWIvb29wIik7CnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOwp2YXIgUmFuZ2UgPSByZXF1aXJlKCIuL3JhbmdlIikuUmFuZ2U7CnZhciBBbmNob3IgPSByZXF1aXJlKCIuL2FuY2hvciIpLkFuY2hvcjsKCnZhciBEb2N1bWVudCA9IGZ1bmN0aW9uKHRleHQpIHsKICAgIHRoaXMuJGxpbmVzID0gW107CgogICAgaWYgKEFycmF5LmlzQXJyYXkodGV4dCkpIHsKICAgICAgICB0aGlzLmluc2VydExpbmVzKDAsIHRleHQpOwogICAgfQogICAgLy8gVGhlcmUgaGFzIHRvIGJlIG9uZSBsaW5lIGF0IGxlYXN0IGluIHRoZSBkb2N1bWVudC4gSWYgeW91IHBhc3MgYW4gZW1wdHkKICAgIC8vIHN0cmluZyB0byB0aGUgaW5zZXJ0IGZ1bmN0aW9uLCBub3RoaW5nIHdpbGwgaGFwcGVuLiBXb3JrYXJvdW5kLgogICAgZWxzZSBpZiAodGV4dC5sZW5ndGggPT0gMCkgewogICAgICAgIHRoaXMuJGxpbmVzID0gWyIiXTsKICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5pbnNlcnQoe3JvdzogMCwgY29sdW1uOjB9LCB0ZXh0KTsKICAgIH0KfTsKCihmdW5jdGlvbigpIHsKCiAgICBvb3AuaW1wbGVtZW50KHRoaXMsIEV2ZW50RW1pdHRlcik7CgogICAgdGhpcy5zZXRWYWx1ZSA9IGZ1bmN0aW9uKHRleHQpIHsKICAgICAgICB2YXIgbGVuID0gdGhpcy5nZXRMZW5ndGgoKTsKICAgICAgICB0aGlzLnJlbW92ZShuZXcgUmFuZ2UoMCwgMCwgbGVuLCB0aGlzLmdldExpbmUobGVuLTEpLmxlbmd0aCkpOwogICAgICAgIHRoaXMuaW5zZXJ0KHtyb3c6IDAsIGNvbHVtbjowfSwgdGV4dCk7CiAgICB9OwoKICAgIHRoaXMuZ2V0VmFsdWUgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRBbGxMaW5lcygpLmpvaW4odGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkpOwogICAgfTsKCiAgICB0aGlzLmNyZWF0ZUFuY2hvciA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7CiAgICAgICAgcmV0dXJuIG5ldyBBbmNob3IodGhpcywgcm93LCBjb2x1bW4pOwogICAgfTsKCiAgICAvLyBjaGVjayBmb3IgSUUgc3BsaXQgYnVnCiAgICBpZiAoImFhYSIuc3BsaXQoL2EvKS5sZW5ndGggPT0gMCkKICAgICAgICB0aGlzLiRzcGxpdCA9IGZ1bmN0aW9uKHRleHQpIHsKICAgICAgICAgICAgcmV0dXJuIHRleHQucmVwbGFjZSgvXHJcbnxcci9nLCAiXG4iKS5zcGxpdCgiXG4iKTsKICAgICAgICB9CiAgICBlbHNlCiAgICAgICAgdGhpcy4kc3BsaXQgPSBmdW5jdGlvbih0ZXh0KSB7CiAgICAgICAgICAgIHJldHVybiB0ZXh0LnNwbGl0KC9cclxufFxyfFxuLyk7CiAgICAgICAgfTsKCgogICAgdGhpcy4kZGV0ZWN0TmV3TGluZSA9IGZ1bmN0aW9uKHRleHQpIHsKICAgICAgICB2YXIgbWF0Y2ggPSB0ZXh0Lm1hdGNoKC9eLio/KFxyXG58XHJ8XG4pL20pOwogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICB0aGlzLiRhdXRvTmV3TGluZSA9IG1hdGNoWzFdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMuJGF1dG9OZXdMaW5lID0gIlxuIjsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlciA9IGZ1bmN0aW9uKCkgewogICAgICBzd2l0Y2ggKHRoaXMuJG5ld0xpbmVNb2RlKSB7CiAgICAgICAgICBjYXNlICJ3aW5kb3dzIjoKICAgICAgICAgICAgICByZXR1cm4gIlxyXG4iOwoKICAgICAgICAgIGNhc2UgInVuaXgiOgogICAgICAgICAgICAgIHJldHVybiAiXG4iOwoKICAgICAgICAgIGNhc2UgImF1dG8iOgogICAgICAgICAgICAgIHJldHVybiB0aGlzLiRhdXRvTmV3TGluZTsKICAgICAgfQogICAgfTsKCiAgICB0aGlzLiRhdXRvTmV3TGluZSA9ICJcbiI7CiAgICB0aGlzLiRuZXdMaW5lTW9kZSA9ICJhdXRvIjsKICAgIHRoaXMuc2V0TmV3TGluZU1vZGUgPSBmdW5jdGlvbihuZXdMaW5lTW9kZSkgewogICAgICAgIGlmICh0aGlzLiRuZXdMaW5lTW9kZSA9PT0gbmV3TGluZU1vZGUpCiAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgdGhpcy4kbmV3TGluZU1vZGUgPSBuZXdMaW5lTW9kZTsKICAgIH07CgogICAgdGhpcy5nZXROZXdMaW5lTW9kZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLiRuZXdMaW5lTW9kZTsKICAgIH07CgogICAgdGhpcy5pc05ld0xpbmUgPSBmdW5jdGlvbih0ZXh0KSB7CiAgICAgICAgcmV0dXJuICh0ZXh0ID09ICJcclxuIiB8fCB0ZXh0ID09ICJcciIgfHwgdGV4dCA9PSAiXG4iKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBHZXQgYSB2ZXJiYXRpbSBjb3B5IG9mIHRoZSBnaXZlbiBsaW5lIGFzIGl0IGlzIGluIHRoZSBkb2N1bWVudAogICAgICovCiAgICB0aGlzLmdldExpbmUgPSBmdW5jdGlvbihyb3cpIHsKICAgICAgICByZXR1cm4gdGhpcy4kbGluZXNbcm93XSB8fCAiIjsKICAgIH07CgogICAgdGhpcy5nZXRMaW5lcyA9IGZ1bmN0aW9uKGZpcnN0Um93LCBsYXN0Um93KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJGxpbmVzLnNsaWNlKGZpcnN0Um93LCBsYXN0Um93ICsgMSk7CiAgICB9OwoKICAgIC8qKgogICAgICogUmV0dXJucyBhbGwgbGluZXMgaW4gdGhlIGRvY3VtZW50IGFzIHN0cmluZyBhcnJheS4gV2FybmluZzogVGhlIGNhbGxlcgogICAgICogc2hvdWxkIG5vdCBtb2RpZnkgdGhpcyBhcnJheSEKICAgICAqLwogICAgdGhpcy5nZXRBbGxMaW5lcyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmdldExpbmVzKDAsIHRoaXMuZ2V0TGVuZ3RoKCkpOwogICAgfTsKCiAgICB0aGlzLmdldExlbmd0aCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLiRsaW5lcy5sZW5ndGg7CiAgICB9OwoKICAgIHRoaXMuZ2V0VGV4dFJhbmdlID0gZnVuY3Rpb24ocmFuZ2UpIHsKICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09IHJhbmdlLmVuZC5yb3cpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGxpbmVzW3JhbmdlLnN0YXJ0LnJvd10uc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuZW5kLmNvbHVtbik7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB2YXIgbGluZXMgPSBbXTsKICAgICAgICAgICAgbGluZXMucHVzaCh0aGlzLiRsaW5lc1tyYW5nZS5zdGFydC5yb3ddLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4pKTsKICAgICAgICAgICAgbGluZXMucHVzaC5hcHBseShsaW5lcywgdGhpcy5nZXRMaW5lcyhyYW5nZS5zdGFydC5yb3crMSwgcmFuZ2UuZW5kLnJvdy0xKSk7CiAgICAgICAgICAgIGxpbmVzLnB1c2godGhpcy4kbGluZXNbcmFuZ2UuZW5kLnJvd10uc3Vic3RyaW5nKDAsIHJhbmdlLmVuZC5jb2x1bW4pKTsKICAgICAgICAgICAgcmV0dXJuIGxpbmVzLmpvaW4odGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkpOwogICAgICAgIH0KICAgIH07CgogICAgdGhpcy4kY2xpcFBvc2l0aW9uID0gZnVuY3Rpb24ocG9zaXRpb24pIHsKICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5nZXRMZW5ndGgoKTsKICAgICAgICBpZiAocG9zaXRpb24ucm93ID49IGxlbmd0aCkgewogICAgICAgICAgICBwb3NpdGlvbi5yb3cgPSBNYXRoLm1heCgwLCBsZW5ndGggLSAxKTsKICAgICAgICAgICAgcG9zaXRpb24uY29sdW1uID0gdGhpcy5nZXRMaW5lKGxlbmd0aC0xKS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwb3NpdGlvbjsKICAgIH07CgogICAgdGhpcy5pbnNlcnQgPSBmdW5jdGlvbihwb3NpdGlvbiwgdGV4dCkgewogICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKQogICAgICAgICAgICByZXR1cm4gcG9zaXRpb247CgogICAgICAgIHBvc2l0aW9uID0gdGhpcy4kY2xpcFBvc2l0aW9uKHBvc2l0aW9uKTsKCiAgICAgICAgaWYgKHRoaXMuZ2V0TGVuZ3RoKCkgPD0gMSkKICAgICAgICAgICAgdGhpcy4kZGV0ZWN0TmV3TGluZSh0ZXh0KTsKCiAgICAgICAgdmFyIGxpbmVzID0gdGhpcy4kc3BsaXQodGV4dCk7CiAgICAgICAgdmFyIGZpcnN0TGluZSA9IGxpbmVzLnNwbGljZSgwLCAxKVswXTsKICAgICAgICB2YXIgbGFzdExpbmUgPSBsaW5lcy5sZW5ndGggPT0gMCA/IG51bGwgOiBsaW5lcy5zcGxpY2UobGluZXMubGVuZ3RoIC0gMSwgMSlbMF07CgogICAgICAgIHBvc2l0aW9uID0gdGhpcy5pbnNlcnRJbkxpbmUocG9zaXRpb24sIGZpcnN0TGluZSk7CiAgICAgICAgaWYgKGxhc3RMaW5lICE9PSBudWxsKSB7CiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5pbnNlcnROZXdMaW5lKHBvc2l0aW9uKTsgLy8gdGVybWluYXRlIGZpcnN0IGxpbmUKICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLmluc2VydExpbmVzKHBvc2l0aW9uLnJvdywgbGluZXMpOwogICAgICAgICAgICBwb3NpdGlvbiA9IHRoaXMuaW5zZXJ0SW5MaW5lKHBvc2l0aW9uLCBsYXN0TGluZSB8fCAiIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwb3NpdGlvbjsKICAgIH07CgogICAgdGhpcy5pbnNlcnRMaW5lcyA9IGZ1bmN0aW9uKHJvdywgbGluZXMpIHsKICAgICAgICBpZiAobGluZXMubGVuZ3RoID09IDApCiAgICAgICAgICAgIHJldHVybiB7cm93OiByb3csIGNvbHVtbjogMH07CgogICAgICAgIHZhciBhcmdzID0gW3JvdywgMF07CiAgICAgICAgYXJncy5wdXNoLmFwcGx5KGFyZ3MsIGxpbmVzKTsKICAgICAgICB0aGlzLiRsaW5lcy5zcGxpY2UuYXBwbHkodGhpcy4kbGluZXMsIGFyZ3MpOwoKICAgICAgICB2YXIgcmFuZ2UgPSBuZXcgUmFuZ2Uocm93LCAwLCByb3cgKyBsaW5lcy5sZW5ndGgsIDApOwogICAgICAgIHZhciBkZWx0YSA9IHsKICAgICAgICAgICAgYWN0aW9uOiAiaW5zZXJ0TGluZXMiLAogICAgICAgICAgICByYW5nZTogcmFuZ2UsCiAgICAgICAgICAgIGxpbmVzOiBsaW5lcwogICAgICAgIH07CiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgeyBkYXRhOiBkZWx0YSB9KTsKICAgICAgICByZXR1cm4gcmFuZ2UuZW5kOwogICAgfTsKCiAgICB0aGlzLmluc2VydE5ld0xpbmUgPSBmdW5jdGlvbihwb3NpdGlvbikgewogICAgICAgIHBvc2l0aW9uID0gdGhpcy4kY2xpcFBvc2l0aW9uKHBvc2l0aW9uKTsKICAgICAgICB2YXIgbGluZSA9IHRoaXMuJGxpbmVzW3Bvc2l0aW9uLnJvd10gfHwgIiI7CgogICAgICAgIHRoaXMuJGxpbmVzW3Bvc2l0aW9uLnJvd10gPSBsaW5lLnN1YnN0cmluZygwLCBwb3NpdGlvbi5jb2x1bW4pOwogICAgICAgIHRoaXMuJGxpbmVzLnNwbGljZShwb3NpdGlvbi5yb3cgKyAxLCAwLCBsaW5lLnN1YnN0cmluZyhwb3NpdGlvbi5jb2x1bW4sIGxpbmUubGVuZ3RoKSk7CgogICAgICAgIHZhciBlbmQgPSB7CiAgICAgICAgICAgIHJvdyA6IHBvc2l0aW9uLnJvdyArIDEsCiAgICAgICAgICAgIGNvbHVtbiA6IDAKICAgICAgICB9OwoKICAgICAgICB2YXIgZGVsdGEgPSB7CiAgICAgICAgICAgIGFjdGlvbjogImluc2VydFRleHQiLAogICAgICAgICAgICByYW5nZTogUmFuZ2UuZnJvbVBvaW50cyhwb3NpdGlvbiwgZW5kKSwKICAgICAgICAgICAgdGV4dDogdGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkKICAgICAgICB9OwogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7CgogICAgICAgIHJldHVybiBlbmQ7CiAgICB9OwoKICAgIHRoaXMuaW5zZXJ0SW5MaW5lID0gZnVuY3Rpb24ocG9zaXRpb24sIHRleHQpIHsKICAgICAgICBpZiAodGV4dC5sZW5ndGggPT0gMCkKICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uOwoKICAgICAgICB2YXIgbGluZSA9IHRoaXMuJGxpbmVzW3Bvc2l0aW9uLnJvd10gfHwgIiI7CgogICAgICAgIHRoaXMuJGxpbmVzW3Bvc2l0aW9uLnJvd10gPSBsaW5lLnN1YnN0cmluZygwLCBwb3NpdGlvbi5jb2x1bW4pICsgdGV4dAogICAgICAgICAgICAgICAgKyBsaW5lLnN1YnN0cmluZyhwb3NpdGlvbi5jb2x1bW4pOwoKICAgICAgICB2YXIgZW5kID0gewogICAgICAgICAgICByb3cgOiBwb3NpdGlvbi5yb3csCiAgICAgICAgICAgIGNvbHVtbiA6IHBvc2l0aW9uLmNvbHVtbiArIHRleHQubGVuZ3RoCiAgICAgICAgfTsKCiAgICAgICAgdmFyIGRlbHRhID0gewogICAgICAgICAgICBhY3Rpb246ICJpbnNlcnRUZXh0IiwKICAgICAgICAgICAgcmFuZ2U6IFJhbmdlLmZyb21Qb2ludHMocG9zaXRpb24sIGVuZCksCiAgICAgICAgICAgIHRleHQ6IHRleHQKICAgICAgICB9OwogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7CgogICAgICAgIHJldHVybiBlbmQ7CiAgICB9OwoKICAgIHRoaXMucmVtb3ZlID0gZnVuY3Rpb24ocmFuZ2UpIHsKICAgICAgICAvLyBjbGlwIHRvIGRvY3VtZW50CiAgICAgICAgcmFuZ2Uuc3RhcnQgPSB0aGlzLiRjbGlwUG9zaXRpb24ocmFuZ2Uuc3RhcnQpOwogICAgICAgIHJhbmdlLmVuZCA9IHRoaXMuJGNsaXBQb3NpdGlvbihyYW5nZS5lbmQpOwoKICAgICAgICBpZiAocmFuZ2UuaXNFbXB0eSgpKQogICAgICAgICAgICByZXR1cm4gcmFuZ2Uuc3RhcnQ7CgogICAgICAgIHZhciBmaXJzdFJvdyA9IHJhbmdlLnN0YXJ0LnJvdzsKICAgICAgICB2YXIgbGFzdFJvdyA9IHJhbmdlLmVuZC5yb3c7CgogICAgICAgIGlmIChyYW5nZS5pc011bHRpTGluZSgpKSB7CiAgICAgICAgICAgIHZhciBmaXJzdEZ1bGxSb3cgPSByYW5nZS5zdGFydC5jb2x1bW4gPT0gMCA/IGZpcnN0Um93IDogZmlyc3RSb3cgKyAxOwogICAgICAgICAgICB2YXIgbGFzdEZ1bGxSb3cgPSBsYXN0Um93IC0gMTsKCiAgICAgICAgICAgIGlmIChyYW5nZS5lbmQuY29sdW1uID4gMCkKICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSW5MaW5lKGxhc3RSb3csIDAsIHJhbmdlLmVuZC5jb2x1bW4pOwoKICAgICAgICAgICAgaWYgKGxhc3RGdWxsUm93ID49IGZpcnN0RnVsbFJvdykKICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlTGluZXMoZmlyc3RGdWxsUm93LCBsYXN0RnVsbFJvdyk7CgogICAgICAgICAgICBpZiAoZmlyc3RGdWxsUm93ICE9IGZpcnN0Um93KSB7CiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUluTGluZShmaXJzdFJvdywgcmFuZ2Uuc3RhcnQuY29sdW1uLCB0aGlzLmdldExpbmUoZmlyc3RSb3cpLmxlbmd0aCk7CiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZU5ld0xpbmUocmFuZ2Uuc3RhcnQucm93KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5yZW1vdmVJbkxpbmUoZmlyc3RSb3csIHJhbmdlLnN0YXJ0LmNvbHVtbiwgcmFuZ2UuZW5kLmNvbHVtbik7CiAgICAgICAgfQogICAgICAgIHJldHVybiByYW5nZS5zdGFydDsKICAgIH07CgogICAgdGhpcy5yZW1vdmVJbkxpbmUgPSBmdW5jdGlvbihyb3csIHN0YXJ0Q29sdW1uLCBlbmRDb2x1bW4pIHsKICAgICAgICBpZiAoc3RhcnRDb2x1bW4gPT0gZW5kQ29sdW1uKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIHZhciByYW5nZSA9IG5ldyBSYW5nZShyb3csIHN0YXJ0Q29sdW1uLCByb3csIGVuZENvbHVtbik7CiAgICAgICAgdmFyIGxpbmUgPSB0aGlzLmdldExpbmUocm93KTsKICAgICAgICB2YXIgcmVtb3ZlZCA9IGxpbmUuc3Vic3RyaW5nKHN0YXJ0Q29sdW1uLCBlbmRDb2x1bW4pOwogICAgICAgIHZhciBuZXdMaW5lID0gbGluZS5zdWJzdHJpbmcoMCwgc3RhcnRDb2x1bW4pICsgbGluZS5zdWJzdHJpbmcoZW5kQ29sdW1uLCBsaW5lLmxlbmd0aCk7CiAgICAgICAgdGhpcy4kbGluZXMuc3BsaWNlKHJvdywgMSwgbmV3TGluZSk7CgogICAgICAgIHZhciBkZWx0YSA9IHsKICAgICAgICAgICAgYWN0aW9uOiAicmVtb3ZlVGV4dCIsCiAgICAgICAgICAgIHJhbmdlOiByYW5nZSwKICAgICAgICAgICAgdGV4dDogcmVtb3ZlZAogICAgICAgIH07CiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgeyBkYXRhOiBkZWx0YSB9KTsKICAgICAgICByZXR1cm4gcmFuZ2Uuc3RhcnQ7CiAgICB9OwoKICAgIC8qKgogICAgICogUmVtb3ZlcyBhIHJhbmdlIG9mIGZ1bGwgbGluZXMKICAgICAqCiAgICAgKiBAcGFyYW0gZmlyc3RSb3cge0ludGVnZXJ9IFRoZSBmaXJzdCByb3cgdG8gYmUgcmVtb3ZlZAogICAgICogQHBhcmFtIGxhc3RSb3cge0ludGVnZXJ9IFRoZSBsYXN0IHJvdyB0byBiZSByZW1vdmVkCiAgICAgKiBAcmV0dXJuIHtTdHJpbmdbXX0gVGhlIHJlbW92ZWQgbGluZXMKICAgICAqLwogICAgdGhpcy5yZW1vdmVMaW5lcyA9IGZ1bmN0aW9uKGZpcnN0Um93LCBsYXN0Um93KSB7CiAgICAgICAgdmFyIHJhbmdlID0gbmV3IFJhbmdlKGZpcnN0Um93LCAwLCBsYXN0Um93ICsgMSwgMCk7CiAgICAgICAgdmFyIHJlbW92ZWQgPSB0aGlzLiRsaW5lcy5zcGxpY2UoZmlyc3RSb3csIGxhc3RSb3cgLSBmaXJzdFJvdyArIDEpOwoKICAgICAgICB2YXIgZGVsdGEgPSB7CiAgICAgICAgICAgIGFjdGlvbjogInJlbW92ZUxpbmVzIiwKICAgICAgICAgICAgcmFuZ2U6IHJhbmdlLAogICAgICAgICAgICBubDogdGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCksCiAgICAgICAgICAgIGxpbmVzOiByZW1vdmVkCiAgICAgICAgfTsKICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2UiLCB7IGRhdGE6IGRlbHRhIH0pOwogICAgICAgIHJldHVybiByZW1vdmVkOwogICAgfTsKCiAgICB0aGlzLnJlbW92ZU5ld0xpbmUgPSBmdW5jdGlvbihyb3cpIHsKICAgICAgICB2YXIgZmlyc3RMaW5lID0gdGhpcy5nZXRMaW5lKHJvdyk7CiAgICAgICAgdmFyIHNlY29uZExpbmUgPSB0aGlzLmdldExpbmUocm93KzEpOwoKICAgICAgICB2YXIgcmFuZ2UgPSBuZXcgUmFuZ2Uocm93LCBmaXJzdExpbmUubGVuZ3RoLCByb3crMSwgMCk7CiAgICAgICAgdmFyIGxpbmUgPSBmaXJzdExpbmUgKyBzZWNvbmRMaW5lOwoKICAgICAgICB0aGlzLiRsaW5lcy5zcGxpY2Uocm93LCAyLCBsaW5lKTsKCiAgICAgICAgdmFyIGRlbHRhID0gewogICAgICAgICAgICBhY3Rpb246ICJyZW1vdmVUZXh0IiwKICAgICAgICAgICAgcmFuZ2U6IHJhbmdlLAogICAgICAgICAgICB0ZXh0OiB0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIoKQogICAgICAgIH07CiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgeyBkYXRhOiBkZWx0YSB9KTsKICAgIH07CgogICAgdGhpcy5yZXBsYWNlID0gZnVuY3Rpb24ocmFuZ2UsIHRleHQpIHsKICAgICAgICBpZiAodGV4dC5sZW5ndGggPT0gMCAmJiByYW5nZS5pc0VtcHR5KCkpCiAgICAgICAgICAgIHJldHVybiByYW5nZS5zdGFydDsKCiAgICAgICAgLy8gU2hvcnRjdXQ6IElmIHRoZSB0ZXh0IHdlIHdhbnQgdG8gaW5zZXJ0IGlzIHRoZSBzYW1lIGFzIGl0IGlzIGFscmVhZHkKICAgICAgICAvLyBpbiB0aGUgZG9jdW1lbnQsIHdlIGRvbid0IGhhdmUgdG8gcmVwbGFjZSBhbnl0aGluZy4KICAgICAgICBpZiAodGV4dCA9PSB0aGlzLmdldFRleHRSYW5nZShyYW5nZSkpCiAgICAgICAgICAgIHJldHVybiByYW5nZS5lbmQ7CgogICAgICAgIHRoaXMucmVtb3ZlKHJhbmdlKTsKICAgICAgICBpZiAodGV4dCkgewogICAgICAgICAgICB2YXIgZW5kID0gdGhpcy5pbnNlcnQocmFuZ2Uuc3RhcnQsIHRleHQpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZW5kID0gcmFuZ2Uuc3RhcnQ7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZW5kOwogICAgfTsKCiAgICB0aGlzLmFwcGx5RGVsdGFzID0gZnVuY3Rpb24oZGVsdGFzKSB7CiAgICAgICAgZm9yICh2YXIgaT0wOyBpPGRlbHRhcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgZGVsdGEgPSBkZWx0YXNbaV07CiAgICAgICAgICAgIHZhciByYW5nZSA9IFJhbmdlLmZyb21Qb2ludHMoZGVsdGEucmFuZ2Uuc3RhcnQsIGRlbHRhLnJhbmdlLmVuZCk7CgogICAgICAgICAgICBpZiAoZGVsdGEuYWN0aW9uID09ICJpbnNlcnRMaW5lcyIpCiAgICAgICAgICAgICAgICB0aGlzLmluc2VydExpbmVzKHJhbmdlLnN0YXJ0LnJvdywgZGVsdGEubGluZXMpOwogICAgICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gImluc2VydFRleHQiKQogICAgICAgICAgICAgICAgdGhpcy5pbnNlcnQocmFuZ2Uuc3RhcnQsIGRlbHRhLnRleHQpOwogICAgICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZUxpbmVzIikKICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlTGluZXMocmFuZ2Uuc3RhcnQucm93LCByYW5nZS5lbmQucm93IC0gMSk7CiAgICAgICAgICAgIGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAicmVtb3ZlVGV4dCIpCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZShyYW5nZSk7CiAgICAgICAgfQogICAgfTsKCiAgICB0aGlzLnJldmVydERlbHRhcyA9IGZ1bmN0aW9uKGRlbHRhcykgewogICAgICAgIGZvciAodmFyIGk9ZGVsdGFzLmxlbmd0aC0xOyBpPj0wOyBpLS0pIHsKICAgICAgICAgICAgdmFyIGRlbHRhID0gZGVsdGFzW2ldOwoKICAgICAgICAgICAgdmFyIHJhbmdlID0gUmFuZ2UuZnJvbVBvaW50cyhkZWx0YS5yYW5nZS5zdGFydCwgZGVsdGEucmFuZ2UuZW5kKTsKCiAgICAgICAgICAgIGlmIChkZWx0YS5hY3Rpb24gPT0gImluc2VydExpbmVzIikKICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlTGluZXMocmFuZ2Uuc3RhcnQucm93LCByYW5nZS5lbmQucm93IC0gMSk7CiAgICAgICAgICAgIGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAiaW5zZXJ0VGV4dCIpCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZShyYW5nZSk7CiAgICAgICAgICAgIGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAicmVtb3ZlTGluZXMiKQogICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRMaW5lcyhyYW5nZS5zdGFydC5yb3csIGRlbHRhLmxpbmVzKTsKICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJyZW1vdmVUZXh0IikKICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0KHJhbmdlLnN0YXJ0LCBkZWx0YS50ZXh0KTsKICAgICAgICB9CiAgICB9OwoKfSkuY2FsbChEb2N1bWVudC5wcm90b3R5cGUpOwoKZXhwb3J0cy5Eb2N1bWVudCA9IERvY3VtZW50Owp9KTsKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvcmFuZ2UnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgUmFuZ2UgPSBmdW5jdGlvbihzdGFydFJvdywgc3RhcnRDb2x1bW4sIGVuZFJvdywgZW5kQ29sdW1uKSB7CiAgICB0aGlzLnN0YXJ0ID0gewogICAgICAgIHJvdzogc3RhcnRSb3csCiAgICAgICAgY29sdW1uOiBzdGFydENvbHVtbgogICAgfTsKCiAgICB0aGlzLmVuZCA9IHsKICAgICAgICByb3c6IGVuZFJvdywKICAgICAgICBjb2x1bW46IGVuZENvbHVtbgogICAgfTsKfTsKCihmdW5jdGlvbigpIHsKICAgIHRoaXMuaXNFZXF1YWwgPSBmdW5jdGlvbihyYW5nZSkgewogICAgICAgIHJldHVybiB0aGlzLnN0YXJ0LnJvdyA9PSByYW5nZS5zdGFydC5yb3cgJiYKICAgICAgICAgICAgdGhpcy5lbmQucm93ID09IHJhbmdlLmVuZC5yb3cgJiYKICAgICAgICAgICAgdGhpcy5zdGFydC5jb2x1bW4gPT0gcmFuZ2Uuc3RhcnQuY29sdW1uICYmCiAgICAgICAgICAgIHRoaXMuZW5kLmNvbHVtbiA9PSByYW5nZS5lbmQuY29sdW1uCiAgICB9OwoKICAgIHRoaXMudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gKCJSYW5nZTogWyIgKyB0aGlzLnN0YXJ0LnJvdyArICIvIiArIHRoaXMuc3RhcnQuY29sdW1uICsKICAgICAgICAgICAgIl0gLT4gWyIgKyB0aGlzLmVuZC5yb3cgKyAiLyIgKyB0aGlzLmVuZC5jb2x1bW4gKyAiXSIpOwogICAgfTsKCiAgICB0aGlzLmNvbnRhaW5zID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsKICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlKHJvdywgY29sdW1uKSA9PSAwOwogICAgfTsKCiAgICAvKioKICAgICAqIENvbXBhcmVzIHRoaXMgcmFuZ2UgKEEpIHdpdGggYW5vdGhlciByYW5nZSAoQiksIHdoZXJlIEIgaXMgdGhlIHBhc3NlZCBpbgogICAgICogcmFuZ2UuCiAgICAgKgogICAgICogUmV0dXJuIHZhbHVlczoKICAgICAqICAtMjogKEIpIGlzIGluZnJvbnQgb2YgKEEpIGFuZCBkb2Vzbid0IGludGVyc2VjdCB3aXRoIChBKQogICAgICogIC0xOiAoQikgYmVnaW5zIGJlZm9yZSAoQSkgYnV0IGVuZHMgaW5zaWRlIG9mIChBKQogICAgICogICAwOiAoQikgaXMgY29tcGxldGx5IGluc2lkZSBvZiAoQSkgT1IgKEEpIGlzIGNvbXBsZXR5IGluc2lkZSBvZiAoQikKICAgICAqICArMTogKEIpIGJlZ2lucyBpbnNpZGUgb2YgKEEpIGJ1dCBlbmRzIG91dHNpZGUgb2YgKEEpCiAgICAgKiAgKzI6IChCKSBpcyBhZnRlciAoQSkgYW5kIGRvZXNuJ3QgaW50ZXJzZWN0IHdpdGggKEEpCiAgICAgKgogICAgICogIDQyOiBGVFcgc3RhdGU6IChCKSBlbmRzIGluIChBKSBidXQgc3RhcnRzIG91dHNpZGUgb2YgKEEpCiAgICAgKi8KICAgIHRoaXMuY29tcGFyZVJhbmdlID0gZnVuY3Rpb24ocmFuZ2UpIHsKICAgICAgICB2YXIgY21wLAogICAgICAgICAgICBlbmQgPSByYW5nZS5lbmQsCiAgICAgICAgICAgIHN0YXJ0ID0gcmFuZ2Uuc3RhcnQ7CgogICAgICAgIGNtcCA9IHRoaXMuY29tcGFyZShlbmQucm93LCBlbmQuY29sdW1uKTsKICAgICAgICBpZiAoY21wID09IDEpIHsKICAgICAgICAgICAgY21wID0gdGhpcy5jb21wYXJlKHN0YXJ0LnJvdywgc3RhcnQuY29sdW1uKTsKICAgICAgICAgICAgaWYgKGNtcCA9PSAxKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICAgICAgfSBlbHNlIGlmIChjbXAgPT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoY21wID09IC0xKSB7CiAgICAgICAgICAgIHJldHVybiAtMjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjbXAgPSB0aGlzLmNvbXBhcmUoc3RhcnQucm93LCBzdGFydC5jb2x1bW4pOwogICAgICAgICAgICBpZiAoY21wID09IC0xKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoY21wID09IDEpIHsKICAgICAgICAgICAgICAgIHJldHVybiA0MjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHRoaXMuY29tcGFyZVBvaW50ID0gZnVuY3Rpb24ocCkgewogICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmUocC5yb3csIHAuY29sdW1uKTsKICAgIH0KCiAgICB0aGlzLmNvbnRhaW5zUmFuZ2UgPSBmdW5jdGlvbihyYW5nZSkgewogICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmVQb2ludChyYW5nZS5zdGFydCkgPT0gMCAmJiB0aGlzLmNvbXBhcmVQb2ludChyYW5nZS5lbmQpID09IDA7CiAgICB9CgogICAgdGhpcy5pc0VuZCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZW5kLnJvdyA9PSByb3cgJiYgdGhpcy5lbmQuY29sdW1uID09IGNvbHVtbjsKICAgIH0KCiAgICB0aGlzLmlzU3RhcnQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIHJldHVybiB0aGlzLnN0YXJ0LnJvdyA9PSByb3cgJiYgdGhpcy5zdGFydC5jb2x1bW4gPT0gY29sdW1uOwogICAgfQoKICAgIHRoaXMuc2V0U3RhcnQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIGlmICh0eXBlb2Ygcm93ID09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIHRoaXMuc3RhcnQuY29sdW1uID0gcm93LmNvbHVtbjsKICAgICAgICAgICAgdGhpcy5zdGFydC5yb3cgPSByb3cucm93OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMuc3RhcnQucm93ID0gcm93OwogICAgICAgICAgICB0aGlzLnN0YXJ0LmNvbHVtbiA9IGNvbHVtbjsKICAgICAgICB9CiAgICB9CgogICAgdGhpcy5zZXRFbmQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIGlmICh0eXBlb2Ygcm93ID09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIHRoaXMuZW5kLmNvbHVtbiA9IHJvdy5jb2x1bW47CiAgICAgICAgICAgIHRoaXMuZW5kLnJvdyA9IHJvdy5yb3c7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5lbmQucm93ID0gcm93OwogICAgICAgICAgICB0aGlzLmVuZC5jb2x1bW4gPSBjb2x1bW47CiAgICAgICAgfQogICAgfQoKICAgIHRoaXMuaW5zaWRlID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsKICAgICAgICBpZiAodGhpcy5jb21wYXJlKHJvdywgY29sdW1uKSA9PSAwKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmlzRW5kKHJvdywgY29sdW1uKSB8fCB0aGlzLmlzU3RhcnQocm93LCBjb2x1bW4pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgdGhpcy5pbnNpZGVTdGFydCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7CiAgICAgICAgaWYgKHRoaXMuY29tcGFyZShyb3csIGNvbHVtbikgPT0gMCkgewogICAgICAgICAgICBpZiAodGhpcy5pc0VuZChyb3csIGNvbHVtbikpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICB0aGlzLmluc2lkZUVuZCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7CiAgICAgICAgaWYgKHRoaXMuY29tcGFyZShyb3csIGNvbHVtbikgPT0gMCkgewogICAgICAgICAgICBpZiAodGhpcy5pc1N0YXJ0KHJvdywgY29sdW1uKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHRoaXMuY29tcGFyZSA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7CiAgICAgICAgaWYgKCF0aGlzLmlzTXVsdGlMaW5lKCkpIHsKICAgICAgICAgICAgaWYgKHJvdyA9PT0gdGhpcy5zdGFydC5yb3cpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW4gPCB0aGlzLnN0YXJ0LmNvbHVtbiA/IC0xIDogKGNvbHVtbiA+IHRoaXMuZW5kLmNvbHVtbiA/IDEgOiAwKTsKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIGlmIChyb3cgPCB0aGlzLnN0YXJ0LnJvdykKICAgICAgICAgICAgcmV0dXJuIC0xOwoKICAgICAgICBpZiAocm93ID4gdGhpcy5lbmQucm93KQogICAgICAgICAgICByZXR1cm4gMTsKCiAgICAgICAgaWYgKHRoaXMuc3RhcnQucm93ID09PSByb3cpCiAgICAgICAgICAgIHJldHVybiBjb2x1bW4gPj0gdGhpcy5zdGFydC5jb2x1bW4gPyAwIDogLTE7CgogICAgICAgIGlmICh0aGlzLmVuZC5yb3cgPT09IHJvdykKICAgICAgICAgICAgcmV0dXJuIGNvbHVtbiA8PSB0aGlzLmVuZC5jb2x1bW4gPyAwIDogMTsKCiAgICAgICAgcmV0dXJuIDA7CiAgICB9OwoKICAgIC8qKgogICAgICogTGlrZSAuY29tcGFyZSgpLCBidXQgaWYgaXNTdGFydCBpcyB0cnVlLCByZXR1cm4gLTE7CiAgICAgKi8KICAgIHRoaXMuY29tcGFyZVN0YXJ0ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsKICAgICAgICBpZiAodGhpcy5zdGFydC5yb3cgPT0gcm93ICYmIHRoaXMuc3RhcnQuY29sdW1uID09IGNvbHVtbikgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbik7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogTGlrZSAuY29tcGFyZSgpLCBidXQgaWYgaXNFbmQgaXMgdHJ1ZSwgcmV0dXJuIDE7CiAgICAgKi8KICAgIHRoaXMuY29tcGFyZUVuZCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7CiAgICAgICAgaWYgKHRoaXMuZW5kLnJvdyA9PSByb3cgJiYgdGhpcy5lbmQuY29sdW1uID09IGNvbHVtbikgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlKHJvdywgY29sdW1uKTsKICAgICAgICB9CiAgICB9CgogICAgdGhpcy5jb21wYXJlSW5zaWRlID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsKICAgICAgICBpZiAodGhpcy5lbmQucm93ID09IHJvdyAmJiB0aGlzLmVuZC5jb2x1bW4gPT0gY29sdW1uKSB7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGFydC5yb3cgPT0gcm93ICYmIHRoaXMuc3RhcnQuY29sdW1uID09IGNvbHVtbikgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbik7CiAgICAgICAgfQogICAgfQoKICAgIHRoaXMuY2xpcFJvd3MgPSBmdW5jdGlvbihmaXJzdFJvdywgbGFzdFJvdykgewogICAgICAgIGlmICh0aGlzLmVuZC5yb3cgPiBsYXN0Um93KSB7CiAgICAgICAgICAgIHZhciBlbmQgPSB7CiAgICAgICAgICAgICAgICByb3c6IGxhc3RSb3crMSwKICAgICAgICAgICAgICAgIGNvbHVtbjogMAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMuc3RhcnQucm93ID4gbGFzdFJvdykgewogICAgICAgICAgICB2YXIgc3RhcnQgPSB7CiAgICAgICAgICAgICAgICByb3c6IGxhc3RSb3crMSwKICAgICAgICAgICAgICAgIGNvbHVtbjogMAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMuc3RhcnQucm93IDwgZmlyc3RSb3cpIHsKICAgICAgICAgICAgdmFyIHN0YXJ0ID0gewogICAgICAgICAgICAgICAgcm93OiBmaXJzdFJvdywKICAgICAgICAgICAgICAgIGNvbHVtbjogMAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMuZW5kLnJvdyA8IGZpcnN0Um93KSB7CiAgICAgICAgICAgIHZhciBlbmQgPSB7CiAgICAgICAgICAgICAgICByb3c6IGZpcnN0Um93LAogICAgICAgICAgICAgICAgY29sdW1uOiAwCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0IHx8IHRoaXMuc3RhcnQsIGVuZCB8fCB0aGlzLmVuZCk7CiAgICB9OwoKICAgIHRoaXMuZXh0ZW5kID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsKICAgICAgICB2YXIgY21wID0gdGhpcy5jb21wYXJlKHJvdywgY29sdW1uKTsKCiAgICAgICAgaWYgKGNtcCA9PSAwKQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICBlbHNlIGlmIChjbXAgPT0gLTEpCiAgICAgICAgICAgIHZhciBzdGFydCA9IHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW59OwogICAgICAgIGVsc2UKICAgICAgICAgICAgdmFyIGVuZCA9IHtyb3c6IHJvdywgY29sdW1uOiBjb2x1bW59OwoKICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyhzdGFydCB8fCB0aGlzLnN0YXJ0LCBlbmQgfHwgdGhpcy5lbmQpOwogICAgfTsKCiAgICB0aGlzLmlzRW1wdHkgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gKHRoaXMuc3RhcnQucm93ID09IHRoaXMuZW5kLnJvdyAmJiB0aGlzLnN0YXJ0LmNvbHVtbiA9PSB0aGlzLmVuZC5jb2x1bW4pOwogICAgfTsKCiAgICB0aGlzLmlzTXVsdGlMaW5lID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuICh0aGlzLnN0YXJ0LnJvdyAhPT0gdGhpcy5lbmQucm93KTsKICAgIH07CgogICAgdGhpcy5jbG9uZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHRoaXMuc3RhcnQsIHRoaXMuZW5kKTsKICAgIH07CgogICAgdGhpcy5jb2xsYXBzZVJvd3MgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5lbmQuY29sdW1uID09IDApCiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2UodGhpcy5zdGFydC5yb3csIDAsIE1hdGgubWF4KHRoaXMuc3RhcnQucm93LCB0aGlzLmVuZC5yb3ctMSksIDApCiAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHRoaXMuc3RhcnQucm93LCAwLCB0aGlzLmVuZC5yb3csIDApCiAgICB9OwoKICAgIHRoaXMudG9TY3JlZW5SYW5nZSA9IGZ1bmN0aW9uKHNlc3Npb24pIHsKICAgICAgICB2YXIgc2NyZWVuUG9zU3RhcnQgPQogICAgICAgICAgICBzZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbih0aGlzLnN0YXJ0KTsKICAgICAgICB2YXIgc2NyZWVuUG9zRW5kID0KICAgICAgICAgICAgc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24odGhpcy5lbmQpOwoKICAgICAgICByZXR1cm4gbmV3IFJhbmdlKAogICAgICAgICAgICBzY3JlZW5Qb3NTdGFydC5yb3csIHNjcmVlblBvc1N0YXJ0LmNvbHVtbiwKICAgICAgICAgICAgc2NyZWVuUG9zRW5kLnJvdywgc2NyZWVuUG9zRW5kLmNvbHVtbgogICAgICAgICk7CiAgICB9OwoKfSkuY2FsbChSYW5nZS5wcm90b3R5cGUpOwoKClJhbmdlLmZyb21Qb2ludHMgPSBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgICByZXR1cm4gbmV3IFJhbmdlKHN0YXJ0LnJvdywgc3RhcnQuY29sdW1uLCBlbmQucm93LCBlbmQuY29sdW1uKTsKfTsKCmV4cG9ydHMuUmFuZ2UgPSBSYW5nZTsKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL2FuY2hvcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL2xpYi9ldmVudF9lbWl0dGVyJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7Cgp2YXIgb29wID0gcmVxdWlyZSgiLi9saWIvb29wIik7CnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOwoKLyoqCiAqIEFuIEFuY2hvciBpcyBhIGZsb2F0aW5nIHBvaW50ZXIgaW4gdGhlIGRvY3VtZW50LiBXaGVuZXZlciB0ZXh0IGlzIGluc2VydGVkIG9yCiAqIGRlbGV0ZWQgYmVmb3JlIHRoZSBjdXJzb3IsIHRoZSBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yIGlzIHVwZGF0ZWQKICovCnZhciBBbmNob3IgPSBleHBvcnRzLkFuY2hvciA9IGZ1bmN0aW9uKGRvYywgcm93LCBjb2x1bW4pIHsKICAgIHRoaXMuZG9jdW1lbnQgPSBkb2M7CiAgICAKICAgIGlmICh0eXBlb2YgY29sdW1uID09ICJ1bmRlZmluZWQiKQogICAgICAgIHRoaXMuc2V0UG9zaXRpb24ocm93LnJvdywgcm93LmNvbHVtbik7CiAgICBlbHNlCiAgICAgICAgdGhpcy5zZXRQb3NpdGlvbihyb3csIGNvbHVtbik7CgogICAgdGhpcy4kb25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7CiAgICBkb2Mub24oImNoYW5nZSIsIHRoaXMuJG9uQ2hhbmdlKTsKfTsKCihmdW5jdGlvbigpIHsKCiAgICBvb3AuaW1wbGVtZW50KHRoaXMsIEV2ZW50RW1pdHRlcik7CiAgICAKICAgIHRoaXMuZ2V0UG9zaXRpb24gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudCh0aGlzLnJvdywgdGhpcy5jb2x1bW4pOwogICAgfTsKICAgIAogICAgdGhpcy5nZXREb2N1bWVudCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmRvY3VtZW50OwogICAgfTsKICAgIAogICAgdGhpcy5vbkNoYW5nZSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICB2YXIgZGVsdGEgPSBlLmRhdGE7CiAgICAgICAgdmFyIHJhbmdlID0gZGVsdGEucmFuZ2U7CiAgICAgICAgICAgIAogICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT0gcmFuZ2UuZW5kLnJvdyAmJiByYW5nZS5zdGFydC5yb3cgIT0gdGhpcy5yb3cpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgCiAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA+IHRoaXMucm93KQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIAogICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT0gdGhpcy5yb3cgJiYgcmFuZ2Uuc3RhcnQuY29sdW1uID4gdGhpcy5jb2x1bW4pCiAgICAgICAgICAgIHJldHVybjsKICAgIAogICAgICAgIHZhciByb3cgPSB0aGlzLnJvdzsKICAgICAgICB2YXIgY29sdW1uID0gdGhpcy5jb2x1bW47CiAgICAgICAgCiAgICAgICAgaWYgKGRlbHRhLmFjdGlvbiA9PT0gImluc2VydFRleHQiKSB7CiAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT09IHJvdyAmJiByYW5nZS5zdGFydC5jb2x1bW4gPD0gY29sdW1uKSB7CiAgICAgICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09PSByYW5nZS5lbmQucm93KSB7CiAgICAgICAgICAgICAgICAgICAgY29sdW1uICs9IHJhbmdlLmVuZC5jb2x1bW4gLSByYW5nZS5zdGFydC5jb2x1bW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb2x1bW4gLT0gcmFuZ2Uuc3RhcnQuY29sdW1uOwogICAgICAgICAgICAgICAgICAgIHJvdyArPSByYW5nZS5lbmQucm93IC0gcmFuZ2Uuc3RhcnQucm93OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHJhbmdlLnN0YXJ0LnJvdyAhPT0gcmFuZ2UuZW5kLnJvdyAmJiByYW5nZS5zdGFydC5yb3cgPCByb3cpIHsKICAgICAgICAgICAgICAgIHJvdyArPSByYW5nZS5lbmQucm93IC0gcmFuZ2Uuc3RhcnQucm93OwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT09ICJpbnNlcnRMaW5lcyIpIHsKICAgICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA8PSByb3cpIHsKICAgICAgICAgICAgICAgIHJvdyArPSByYW5nZS5lbmQucm93IC0gcmFuZ2Uuc3RhcnQucm93OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAicmVtb3ZlVGV4dCIpIHsKICAgICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA9PSByb3cgJiYgcmFuZ2Uuc3RhcnQuY29sdW1uIDwgY29sdW1uKSB7CiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuZW5kLmNvbHVtbiA+PSBjb2x1bW4pCiAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gcmFuZ2Uuc3RhcnQuY29sdW1uOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IE1hdGgubWF4KDAsIGNvbHVtbiAtIChyYW5nZS5lbmQuY29sdW1uIC0gcmFuZ2Uuc3RhcnQuY29sdW1uKSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfSBlbHNlIGlmIChyYW5nZS5zdGFydC5yb3cgIT09IHJhbmdlLmVuZC5yb3cgJiYgcmFuZ2Uuc3RhcnQucm93IDwgcm93KSB7CiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuZW5kLnJvdyA9PSByb3cpIHsKICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSBNYXRoLm1heCgwLCBjb2x1bW4gLSByYW5nZS5lbmQuY29sdW1uKSArIHJhbmdlLnN0YXJ0LmNvbHVtbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJvdyAtPSAocmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocmFuZ2UuZW5kLnJvdyA9PSByb3cpIHsKICAgICAgICAgICAgICAgIHJvdyAtPSByYW5nZS5lbmQucm93IC0gcmFuZ2Uuc3RhcnQucm93OwogICAgICAgICAgICAgICAgY29sdW1uID0gTWF0aC5tYXgoMCwgY29sdW1uIC0gcmFuZ2UuZW5kLmNvbHVtbikgKyByYW5nZS5zdGFydC5jb2x1bW47CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAicmVtb3ZlTGluZXMiKSB7CiAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPD0gcm93KSB7CiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuZW5kLnJvdyA8PSByb3cpCiAgICAgICAgICAgICAgICAgICAgcm93IC09IHJhbmdlLmVuZC5yb3cgLSByYW5nZS5zdGFydC5yb3c7CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByb3cgPSByYW5nZS5zdGFydC5yb3c7CiAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdGhpcy5zZXRQb3NpdGlvbihyb3csIGNvbHVtbiwgdHJ1ZSk7CiAgICB9OwoKICAgIHRoaXMuc2V0UG9zaXRpb24gPSBmdW5jdGlvbihyb3csIGNvbHVtbiwgbm9DbGlwKSB7CiAgICAgICAgdmFyIHBvczsKICAgICAgICBpZiAobm9DbGlwKSB7CiAgICAgICAgICAgIHBvcyA9IHsKICAgICAgICAgICAgICAgIHJvdzogcm93LAogICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHBvcyA9IHRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQocm93LCBjb2x1bW4pOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAodGhpcy5yb3cgPT0gcG9zLnJvdyAmJiB0aGlzLmNvbHVtbiA9PSBwb3MuY29sdW1uKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIAogICAgICAgIHZhciBvbGQgPSB7CiAgICAgICAgICAgIHJvdzogdGhpcy5yb3csCiAgICAgICAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW4KICAgICAgICB9OwogICAgICAgIAogICAgICAgIHRoaXMucm93ID0gcG9zLnJvdzsKICAgICAgICB0aGlzLmNvbHVtbiA9IHBvcy5jb2x1bW47CiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgewogICAgICAgICAgICBvbGQ6IG9sZCwKICAgICAgICAgICAgdmFsdWU6IHBvcwogICAgICAgIH0pOwogICAgfTsKICAgIAogICAgdGhpcy5kZXRhY2ggPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIHRoaXMuJG9uQ2hhbmdlKTsKICAgIH07CiAgICAKICAgIHRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIHZhciBwb3MgPSB7fTsKICAgIAogICAgICAgIGlmIChyb3cgPj0gdGhpcy5kb2N1bWVudC5nZXRMZW5ndGgoKSkgewogICAgICAgICAgICBwb3Mucm93ID0gTWF0aC5tYXgoMCwgdGhpcy5kb2N1bWVudC5nZXRMZW5ndGgoKSAtIDEpOwogICAgICAgICAgICBwb3MuY29sdW1uID0gdGhpcy5kb2N1bWVudC5nZXRMaW5lKHBvcy5yb3cpLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAocm93IDwgMCkgewogICAgICAgICAgICBwb3Mucm93ID0gMDsKICAgICAgICAgICAgcG9zLmNvbHVtbiA9IDA7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwb3Mucm93ID0gcm93OwogICAgICAgICAgICBwb3MuY29sdW1uID0gTWF0aC5taW4odGhpcy5kb2N1bWVudC5nZXRMaW5lKHBvcy5yb3cpLmxlbmd0aCwgTWF0aC5tYXgoMCwgY29sdW1uKSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmIChjb2x1bW4gPCAwKQogICAgICAgICAgICBwb3MuY29sdW1uID0gMDsKICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuIHBvczsKICAgIH07CiAgICAKfSkuY2FsbChBbmNob3IucHJvdG90eXBlKTsKCn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9saWIvbGFuZycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCmV4cG9ydHMuc3RyaW5nUmV2ZXJzZSA9IGZ1bmN0aW9uKHN0cmluZykgewogICAgcmV0dXJuIHN0cmluZy5zcGxpdCgiIikucmV2ZXJzZSgpLmpvaW4oIiIpOwp9OwoKZXhwb3J0cy5zdHJpbmdSZXBlYXQgPSBmdW5jdGlvbiAoc3RyaW5nLCBjb3VudCkgewogICAgIHJldHVybiBuZXcgQXJyYXkoY291bnQgKyAxKS5qb2luKHN0cmluZyk7Cn07Cgp2YXIgdHJpbUJlZ2luUmVnZXhwID0gL15cc1xzKi87CnZhciB0cmltRW5kUmVnZXhwID0gL1xzXHMqJC87CgpleHBvcnRzLnN0cmluZ1RyaW1MZWZ0ID0gZnVuY3Rpb24gKHN0cmluZykgewogICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHRyaW1CZWdpblJlZ2V4cCwgJycpOwp9OwoKZXhwb3J0cy5zdHJpbmdUcmltUmlnaHQgPSBmdW5jdGlvbiAoc3RyaW5nKSB7CiAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UodHJpbUVuZFJlZ2V4cCwgJycpOwp9OwoKZXhwb3J0cy5jb3B5T2JqZWN0ID0gZnVuY3Rpb24ob2JqKSB7CiAgICB2YXIgY29weSA9IHt9OwogICAgZm9yICh2YXIga2V5IGluIG9iaikgewogICAgICAgIGNvcHlba2V5XSA9IG9ialtrZXldOwogICAgfQogICAgcmV0dXJuIGNvcHk7Cn07CgpleHBvcnRzLmNvcHlBcnJheSA9IGZ1bmN0aW9uKGFycmF5KXsKICAgIHZhciBjb3B5ID0gW107CiAgICBmb3IgKHZhciBpPTAsIGw9YXJyYXkubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICAgIGlmIChhcnJheVtpXSAmJiB0eXBlb2YgYXJyYXlbaV0gPT0gIm9iamVjdCIpCiAgICAgICAgICAgIGNvcHlbaV0gPSB0aGlzLmNvcHlPYmplY3QoIGFycmF5W2ldICk7CiAgICAgICAgZWxzZSAKICAgICAgICAgICAgY29weVtpXSA9IGFycmF5W2ldOwogICAgfQogICAgcmV0dXJuIGNvcHk7Cn07CgpleHBvcnRzLmRlZXBDb3B5ID0gZnVuY3Rpb24gKG9iaikgewogICAgaWYgKHR5cGVvZiBvYmogIT0gIm9iamVjdCIpIHsKICAgICAgICByZXR1cm4gb2JqOwogICAgfQogICAgCiAgICB2YXIgY29weSA9IG9iai5jb25zdHJ1Y3RvcigpOwogICAgZm9yICh2YXIga2V5IGluIG9iaikgewogICAgICAgIGlmICh0eXBlb2Ygb2JqW2tleV0gPT0gIm9iamVjdCIpIHsKICAgICAgICAgICAgY29weVtrZXldID0gdGhpcy5kZWVwQ29weShvYmpba2V5XSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29weVtrZXldID0gb2JqW2tleV07CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGNvcHk7Cn07CgpleHBvcnRzLmFycmF5VG9NYXAgPSBmdW5jdGlvbihhcnIpIHsKICAgIHZhciBtYXAgPSB7fTsKICAgIGZvciAodmFyIGk9MDsgaTxhcnIubGVuZ3RoOyBpKyspIHsKICAgICAgICBtYXBbYXJyW2ldXSA9IDE7CiAgICB9CiAgICByZXR1cm4gbWFwOwoKfTsKCi8qKgogKiBzcGxpY2Ugb3V0IG9mICdhcnJheScgYW55dGhpbmcgdGhhdCA9PT0gJ3ZhbHVlJwogKi8KZXhwb3J0cy5hcnJheVJlbW92ZSA9IGZ1bmN0aW9uKGFycmF5LCB2YWx1ZSkgewogIGZvciAodmFyIGkgPSAwOyBpIDw9IGFycmF5Lmxlbmd0aDsgaSsrKSB7CiAgICBpZiAodmFsdWUgPT09IGFycmF5W2ldKSB7CiAgICAgIGFycmF5LnNwbGljZShpLCAxKTsKICAgIH0KICB9Cn07CgpleHBvcnRzLmVzY2FwZVJlZ0V4cCA9IGZ1bmN0aW9uKHN0cikgewogICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oWy4qKz9eJHt9KCl8W1xdXC9cXF0pL2csICdcXCQxJyk7Cn07CgpleHBvcnRzLmRlZmVycmVkQ2FsbCA9IGZ1bmN0aW9uKGZjbikgewoKICAgIHZhciB0aW1lciA9IG51bGw7CiAgICB2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aW1lciA9IG51bGw7CiAgICAgICAgZmNuKCk7CiAgICB9OwoKICAgIHZhciBkZWZlcnJlZCA9IGZ1bmN0aW9uKHRpbWVvdXQpIHsKICAgICAgICBkZWZlcnJlZC5jYW5jZWwoKTsKICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIHRpbWVvdXQgfHwgMCk7CiAgICAgICAgcmV0dXJuIGRlZmVycmVkOwogICAgfTsKCiAgICBkZWZlcnJlZC5zY2hlZHVsZSA9IGRlZmVycmVkOwoKICAgIGRlZmVycmVkLmNhbGwgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLmNhbmNlbCgpOwogICAgICAgIGZjbigpOwogICAgICAgIHJldHVybiBkZWZlcnJlZDsKICAgIH07CgogICAgZGVmZXJyZWQuY2FuY2VsID0gZnVuY3Rpb24oKSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTsKICAgICAgICB0aW1lciA9IG51bGw7CiAgICAgICAgcmV0dXJuIGRlZmVycmVkOwogICAgfTsKCiAgICByZXR1cm4gZGVmZXJyZWQ7Cn07Cgp9KTsKLyogCkNTU0xpbnQKQ29weXJpZ2h0IChjKSAyMDExIE5pY29sZSBTdWxsaXZhbiBhbmQgTmljaG9sYXMgQy4gWmFrYXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKKi8KZGVmaW5lKCdhY2UvbW9kZS9jc3MvY3NzbGludCcsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7Ci8qIQpQYXJzZXItTGliCkNvcHlyaWdodCAoYykgMjAwOS0yMDExIE5pY2hvbGFzIEMuIFpha2FzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgphbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KCiovCi8qIEJ1aWxkIHRpbWU6IDEzLUp1bHktMjAxMSAwNDozNToyOCAqLwp2YXIgcGFyc2VybGliID0ge307CihmdW5jdGlvbigpewoKLyoqCiAqIEEgZ2VuZXJpYyBiYXNlIHRvIGluaGVyaXQgZnJvbSBmb3IgYW55IG9iamVjdAogKiB0aGF0IG5lZWRzIGV2ZW50IGhhbmRsaW5nLgogKiBAY2xhc3MgRXZlbnRUYXJnZXQKICogQGNvbnN0cnVjdG9yCiAqLwpmdW5jdGlvbiBFdmVudFRhcmdldCgpewoKICAgIC8qKgogICAgICogVGhlIGFycmF5IG9mIGxpc3RlbmVycyBmb3IgdmFyaW91cyBldmVudHMuCiAgICAgKiBAdHlwZSBPYmplY3QKICAgICAqIEBwcm9wZXJ0eSBfbGlzdGVuZXJzCiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICB0aGlzLl9saXN0ZW5lcnMgPSB7fTsgICAgCn0KCkV2ZW50VGFyZ2V0LnByb3RvdHlwZSA9IHsKCiAgICAvL3Jlc3RvcmUgY29uc3RydWN0b3IKICAgIGNvbnN0cnVjdG9yOiBFdmVudFRhcmdldCwKCiAgICAvKioKICAgICAqIEFkZHMgYSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudCB0eXBlLgogICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIHR5cGUgb2YgZXZlbnQgdG8gYWRkIGEgbGlzdGVuZXIgZm9yLgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgb2NjdXJzLgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEBtZXRob2QgYWRkTGlzdGVuZXIKICAgICAqLwogICAgYWRkTGlzdGVuZXI6IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKXsKICAgICAgICBpZiAoIXRoaXMuX2xpc3RlbmVyc1t0eXBlXSl7CiAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVyc1t0eXBlXSA9IFtdOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5fbGlzdGVuZXJzW3R5cGVdLnB1c2gobGlzdGVuZXIpOwogICAgfSwKICAgIAogICAgLyoqCiAgICAgKiBGaXJlcyBhbiBldmVudCBiYXNlZCBvbiB0aGUgcGFzc2VkLWluIG9iamVjdC4KICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gZXZlbnQgQW4gb2JqZWN0IHdpdGggYXQgbGVhc3QgYSAndHlwZScgYXR0cmlidXRlCiAgICAgKiAgICAgIG9yIGEgc3RyaW5nIGluZGljYXRpbmcgdGhlIGV2ZW50IG5hbWUuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQG1ldGhvZCBmaXJlCiAgICAgKi8gICAgCiAgICBmaXJlOiBmdW5jdGlvbihldmVudCl7CiAgICAgICAgaWYgKHR5cGVvZiBldmVudCA9PSAic3RyaW5nIil7CiAgICAgICAgICAgIGV2ZW50ID0geyB0eXBlOiBldmVudCB9OwogICAgICAgIH0KICAgICAgICBpZiAoIWV2ZW50LnRhcmdldCl7CiAgICAgICAgICAgIGV2ZW50LnRhcmdldCA9IHRoaXM7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmICghZXZlbnQudHlwZSl7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiRXZlbnQgb2JqZWN0IG1pc3NpbmcgJ3R5cGUnIHByb3BlcnR5LiIpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAodGhpcy5fbGlzdGVuZXJzW2V2ZW50LnR5cGVdKXsKICAgICAgICAKICAgICAgICAgICAgLy9jcmVhdGUgYSBjb3B5IG9mIHRoZSBhcnJheSBhbmQgdXNlIHRoYXQgc28gbGlzdGVuZXJzIGNhbid0IGNoYW5lCiAgICAgICAgICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnNbZXZlbnQudHlwZV0uY29uY2F0KCk7CiAgICAgICAgICAgIGZvciAodmFyIGk9MCwgbGVuPWxpc3RlbmVycy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7CiAgICAgICAgICAgICAgICBsaXN0ZW5lcnNbaV0uY2FsbCh0aGlzLCBldmVudCk7CiAgICAgICAgICAgIH0KICAgICAgICB9ICAgICAgICAgICAgCiAgICB9LAoKICAgIC8qKgogICAgICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZvciBhIGdpdmVuIGV2ZW50IHR5cGUuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgdHlwZSBvZiBldmVudCB0byByZW1vdmUgYSBsaXN0ZW5lciBmcm9tLgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgVGhlIGZ1bmN0aW9uIHRvIHJlbW92ZSBmcm9tIHRoZSBldmVudC4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAbWV0aG9kIHJlbW92ZUxpc3RlbmVyCiAgICAgKi8KICAgIHJlbW92ZUxpc3RlbmVyOiBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcil7CiAgICAgICAgaWYgKHRoaXMuX2xpc3RlbmVyc1t0eXBlXSl7CiAgICAgICAgICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnNbdHlwZV07CiAgICAgICAgICAgIGZvciAodmFyIGk9MCwgbGVuPWxpc3RlbmVycy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7CiAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXJzW2ldID09PSBsaXN0ZW5lcil7CiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgfSAgICAgICAgICAgIAogICAgfQp9OwovKioKICogQ29udmVuaWVudCB3YXkgdG8gcmVhZCB0aHJvdWdoIHN0cmluZ3MuCiAqIEBuYW1lc3BhY2UgcGFyc2VybGliLnV0aWwKICogQGNsYXNzIFN0cmluZ1JlYWRlcgogKiBAY29uc3RydWN0b3IKICogQHBhcmFtIHtTdHJpbmd9IHRleHQgVGhlIHRleHQgdG8gcmVhZC4KICovCmZ1bmN0aW9uIFN0cmluZ1JlYWRlcih0ZXh0KXsKCiAgICAvKioKICAgICAqIFRoZSBpbnB1dCB0ZXh0IHdpdGggbGluZSBlbmRpbmdzIG5vcm1hbGl6ZWQuCiAgICAgKiBAcHJvcGVydHkgX2lucHV0CiAgICAgKiBAdHlwZSBTdHJpbmcKICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIHRoaXMuX2lucHV0ID0gdGV4dC5yZXBsYWNlKC9cblxyPy9nLCAiXG4iKTsKCgogICAgLyoqCiAgICAgKiBUaGUgcm93IGZvciB0aGUgY2hhcmFjdGVyIHRvIGJlIHJlYWQgbmV4dC4KICAgICAqIEBwcm9wZXJ0eSBfbGluZQogICAgICogQHR5cGUgaW50CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICB0aGlzLl9saW5lID0gMTsKCgogICAgLyoqCiAgICAgKiBUaGUgY29sdW1uIGZvciB0aGUgY2hhcmFjdGVyIHRvIGJlIHJlYWQgbmV4dC4KICAgICAqIEBwcm9wZXJ0eSBfY29sCiAgICAgKiBAdHlwZSBpbnQKICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIHRoaXMuX2NvbCA9IDE7CgogICAgLyoqCiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciBpbiB0aGUgaW5wdXQgdG8gYmUgcmVhZCBuZXh0LgogICAgICogQHByb3BlcnR5IF9jdXJzb3IKICAgICAqIEB0eXBlIGludAogICAgICogQHByaXZhdGUKICAgICAqLwogICAgdGhpcy5fY3Vyc29yID0gMDsKfQoKU3RyaW5nUmVhZGVyLnByb3RvdHlwZSA9IHsKCiAgICAvL3Jlc3RvcmUgY29uc3RydWN0b3IKICAgIGNvbnN0cnVjdG9yOiBTdHJpbmdSZWFkZXIsCgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBQb3NpdGlvbiBpbmZvCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGNvbHVtbiBvZiB0aGUgY2hhcmFjdGVyIHRvIGJlIHJlYWQgbmV4dC4KICAgICAqIEByZXR1cm4ge2ludH0gVGhlIGNvbHVtbiBvZiB0aGUgY2hhcmFjdGVyIHRvIGJlIHJlYWQgbmV4dC4KICAgICAqIEBtZXRob2QgZ2V0Q29sCiAgICAgKi8KICAgIGdldENvbDogZnVuY3Rpb24oKXsKICAgICAgICByZXR1cm4gdGhpcy5fY29sOwogICAgfSwKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJvdyBvZiB0aGUgY2hhcmFjdGVyIHRvIGJlIHJlYWQgbmV4dC4KICAgICAqIEByZXR1cm4ge2ludH0gVGhlIHJvdyBvZiB0aGUgY2hhcmFjdGVyIHRvIGJlIHJlYWQgbmV4dC4KICAgICAqIEBtZXRob2QgZ2V0TGluZQogICAgICovCiAgICBnZXRMaW5lOiBmdW5jdGlvbigpewogICAgICAgIHJldHVybiB0aGlzLl9saW5lIDsKICAgIH0sCgogICAgLyoqCiAgICAgKiBEZXRlcm1pbmVzIGlmIHlvdSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dC4KICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhlcmUncyBubyBtb3JlIGlucHV0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgKiBAbWV0aG9kIGVvZgogICAgICovCiAgICBlb2Y6IGZ1bmN0aW9uKCl7CiAgICAgICAgcmV0dXJuICh0aGlzLl9jdXJzb3IgPT0gdGhpcy5faW5wdXQubGVuZ3RoKTsKICAgIH0sCgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBCYXNpYyByZWFkaW5nCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAvKioKICAgICAqIFJlYWRzIHRoZSBuZXh0IGNoYXJhY3RlciB3aXRob3V0IGFkdmFuY2luZyB0aGUgY3Vyc29yLgogICAgICogQHBhcmFtIHtpbnR9IGNvdW50IEhvdyBtYW55IGNoYXJhY3RlcnMgdG8gbG9vayBhaGVhZCAoZGVmYXVsdCBpcyAxKS4KICAgICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIG5leHQgY2hhcmFjdGVyIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gbmV4dCBjaGFyYWN0ZXIuCiAgICAgKiBAbWV0aG9kIHBlZWsKICAgICAqLwogICAgcGVlazogZnVuY3Rpb24oY291bnQpewogICAgICAgIHZhciBjID0gbnVsbDsKICAgICAgICBjb3VudCA9ICh0eXBlb2YgY291bnQgPT0gInVuZGVmaW5lZCIgPyAxIDogY291bnQpOwoKICAgICAgICAvL2lmIHdlJ3JlIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dC4uLgogICAgICAgIGlmICh0aGlzLl9jdXJzb3IgPCB0aGlzLl9pbnB1dC5sZW5ndGgpewoKICAgICAgICAgICAgLy9nZXQgY2hhcmFjdGVyIGFuZCBpbmNyZW1lbnQgY3Vyc29yIGFuZCBjb2x1bW4KICAgICAgICAgICAgYyA9IHRoaXMuX2lucHV0LmNoYXJBdCh0aGlzLl9jdXJzb3IgKyBjb3VudCAtIDEpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGM7CiAgICB9LAoKICAgIC8qKgogICAgICogUmVhZHMgdGhlIG5leHQgY2hhcmFjdGVyIGZyb20gdGhlIGlucHV0IGFuZCBhZGp1c3RzIHRoZSByb3cgYW5kIGNvbHVtbgogICAgICogYWNjb3JkaW5nbHkuCiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBuZXh0IGNoYXJhY3RlciBvciBudWxsIGlmIHRoZXJlIGlzIG5vIG5leHQgY2hhcmFjdGVyLgogICAgICogQG1ldGhvZCByZWFkCiAgICAgKi8KICAgIHJlYWQ6IGZ1bmN0aW9uKCl7CiAgICAgICAgdmFyIGMgPSBudWxsOwoKICAgICAgICAvL2lmIHdlJ3JlIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dC4uLgogICAgICAgIGlmICh0aGlzLl9jdXJzb3IgPCB0aGlzLl9pbnB1dC5sZW5ndGgpewoKICAgICAgICAgICAgLy9pZiB0aGUgbGFzdCBjaGFyYWN0ZXIgd2FzIGEgbmV3bGluZSwgaW5jcmVtZW50IHJvdyBjb3VudAogICAgICAgICAgICAvL2FuZCByZXNldCBjb2x1bW4gY291bnQKICAgICAgICAgICAgaWYgKHRoaXMuX2lucHV0LmNoYXJBdCh0aGlzLl9jdXJzb3IpID09ICJcbiIpewogICAgICAgICAgICAgICAgdGhpcy5fbGluZSsrOwogICAgICAgICAgICAgICAgdGhpcy5fY29sPTE7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jb2wrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9nZXQgY2hhcmFjdGVyIGFuZCBpbmNyZW1lbnQgY3Vyc29yIGFuZCBjb2x1bW4KICAgICAgICAgICAgYyA9IHRoaXMuX2lucHV0LmNoYXJBdCh0aGlzLl9jdXJzb3IrKyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gYzsKICAgIH0sCgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBNaXNjCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAvKioKICAgICAqIFNhdmVzIHRoZSBjdXJyZW50IGxvY2F0aW9uIHNvIGl0IGNhbiBiZSByZXR1cm5lZCB0byBsYXRlci4KICAgICAqIEBtZXRob2QgbWFyawogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgbWFyazogZnVuY3Rpb24oKXsKICAgICAgICB0aGlzLl9ib29rbWFyayA9IHsKICAgICAgICAgICAgY3Vyc29yOiB0aGlzLl9jdXJzb3IsCiAgICAgICAgICAgIGxpbmU6ICAgdGhpcy5fbGluZSwKICAgICAgICAgICAgY29sOiAgICB0aGlzLl9jb2wKICAgICAgICB9OwogICAgfSwKCiAgICByZXNldDogZnVuY3Rpb24oKXsKICAgICAgICBpZiAodGhpcy5fYm9va21hcmspewogICAgICAgICAgICB0aGlzLl9jdXJzb3IgPSB0aGlzLl9ib29rbWFyay5jdXJzb3I7CiAgICAgICAgICAgIHRoaXMuX2xpbmUgPSB0aGlzLl9ib29rbWFyay5saW5lOwogICAgICAgICAgICB0aGlzLl9jb2wgPSB0aGlzLl9ib29rbWFyay5jb2w7CiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9ib29rbWFyazsKICAgICAgICB9CiAgICB9LAoKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gQWR2YW5jZWQgcmVhZGluZwogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgLyoqCiAgICAgKiBSZWFkcyB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBnaXZlbiBzdHJpbmcuIFRocm93cyBhbiBlcnJvciBpZiB0aGF0CiAgICAgKiBzdHJpbmcgaXMgbm90IGZvdW5kLgogICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdHRlcm4gVGhlIHN0cmluZyB0byByZWFkLgogICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgc3RyaW5nIHdoZW4gaXQgaXMgZm91bmQuCiAgICAgKiBAdGhyb3dzIEVycm9yIHdoZW4gdGhlIHN0cmluZyBwYXR0ZXJuIGlzIG5vdCBmb3VuZC4KICAgICAqIEBtZXRob2QgcmVhZFRvCiAgICAgKi8KICAgIHJlYWRUbzogZnVuY3Rpb24ocGF0dGVybil7CgogICAgICAgIHZhciBidWZmZXIgPSAiIiwKICAgICAgICAgICAgYzsKCiAgICAgICAgLyoKICAgICAgICAgKiBGaXJzdCwgYnVmZmVyIG11c3QgYmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBwYXR0ZXJuLgogICAgICAgICAqIFRoZW4sIGJ1ZmZlciBtdXN0IGVuZCB3aXRoIHRoZSBwYXR0ZXJuIG9yIGVsc2UgcmVhY2ggdGhlCiAgICAgICAgICogZW5kIG9mIHRoZSBpbnB1dC4KICAgICAgICAgKi8KICAgICAgICB3aGlsZSAoYnVmZmVyLmxlbmd0aCA8IHBhdHRlcm4ubGVuZ3RoIHx8IGJ1ZmZlci5sYXN0SW5kZXhPZihwYXR0ZXJuKSAhPSBidWZmZXIubGVuZ3RoIC0gcGF0dGVybi5sZW5ndGgpewogICAgICAgICAgICBjID0gdGhpcy5yZWFkKCk7CiAgICAgICAgICAgIGlmIChjKXsKICAgICAgICAgICAgICAgIGJ1ZmZlciArPSBjOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBcIiIgKyBwYXR0ZXJuICsgIlwiIGF0IGxpbmUgIiArIHRoaXMuX2xpbmUgICsgIiwgY29sICIgKyB0aGlzLl9jb2wgKyAiLiIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gYnVmZmVyOwoKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZWFkcyBjaGFyYWN0ZXJzIHdoaWxlIGVhY2ggY2hhcmFjdGVyIGNhdXNlcyB0aGUgZ2l2ZW4KICAgICAqIGZpbHRlciBmdW5jdGlvbiB0byByZXR1cm4gdHJ1ZS4gVGhlIGZ1bmN0aW9uIGlzIHBhc3NlZAogICAgICogaW4gZWFjaCBjaGFyYWN0ZXIgYW5kIGVpdGhlciByZXR1cm5zIHRydWUgdG8gY29udGludWUKICAgICAqIHJlYWRpbmcgb3IgZmFsc2UgdG8gc3RvcC4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZpbHRlciBUaGUgZnVuY3Rpb24gdG8gcmVhZCBvbiBlYWNoIGNoYXJhY3Rlci4KICAgICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIHN0cmluZyBtYWRlIHVwIG9mIGFsbCBjaGFyYWN0ZXJzIHRoYXQgcGFzc2VkIHRoZQogICAgICogICAgICBmaWx0ZXIgY2hlY2suCiAgICAgKiBAbWV0aG9kIHJlYWRXaGlsZQogICAgICovCiAgICByZWFkV2hpbGU6IGZ1bmN0aW9uKGZpbHRlcil7CgogICAgICAgIHZhciBidWZmZXIgPSAiIiwKICAgICAgICAgICAgYyA9IHRoaXMucmVhZCgpOwoKICAgICAgICB3aGlsZShjICE9PSBudWxsICYmIGZpbHRlcihjKSl7CiAgICAgICAgICAgIGJ1ZmZlciArPSBjOwogICAgICAgICAgICBjID0gdGhpcy5yZWFkKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gYnVmZmVyOwoKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZWFkcyBjaGFyYWN0ZXJzIHRoYXQgbWF0Y2ggZWl0aGVyIHRleHQgb3IgYSByZWd1bGFyIGV4cHJlc3Npb24gYW5kCiAgICAgKiByZXR1cm5zIHRob3NlIGNoYXJhY3RlcnMuIElmIGEgbWF0Y2ggaXMgZm91bmQsIHRoZSByb3cgYW5kIGNvbHVtbgogICAgICogYXJlIGFkanVzdGVkOyBpZiBubyBtYXRjaCBpcyBmb3VuZCwgdGhlIHJlYWRlcidzIHN0YXRlIGlzIHVuY2hhbmdlZC4KICAgICAqIHJlYWRpbmcgb3IgZmFsc2UgdG8gc3RvcC4KICAgICAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gbWF0Y2h0ZXIgSWYgYSBzdHJpbmcsIHRoZW4gdGhlIGxpdGVyYWwgc3RyaW5nCiAgICAgKiAgICAgIHZhbHVlIGlzIHNlYXJjaGVkIGZvci4gSWYgYSByZWd1bGFyIGV4cHJlc3Npb24sIHRoZW4gYW55IHN0cmluZwogICAgICogICAgICBtYXRjaGluZyB0aGUgcGF0dGVybiBpcyBzZWFyY2ggZm9yLgogICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgc3RyaW5nIG1hZGUgdXAgb2YgYWxsIGNoYXJhY3RlcnMgdGhhdCBtYXRjaGVkIG9yCiAgICAgKiAgICAgIG51bGwgaWYgdGhlcmUgd2FzIG5vIG1hdGNoLgogICAgICogQG1ldGhvZCByZWFkTWF0Y2gKICAgICAqLwogICAgcmVhZE1hdGNoOiBmdW5jdGlvbihtYXRjaGVyKXsKCiAgICAgICAgdmFyIHNvdXJjZSA9IHRoaXMuX2lucHV0LnN1YnN0cmluZyh0aGlzLl9jdXJzb3IpLAogICAgICAgICAgICB2YWx1ZSA9IG51bGw7CgogICAgICAgIC8vaWYgaXQncyBhIHN0cmluZywganVzdCBkbyBhIHN0cmFpZ2h0IG1hdGNoCiAgICAgICAgaWYgKHR5cGVvZiBtYXRjaGVyID09ICJzdHJpbmciKXsKICAgICAgICAgICAgaWYgKHNvdXJjZS5pbmRleE9mKG1hdGNoZXIpID09PSAwKXsKICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5yZWFkQ291bnQobWF0Y2hlci5sZW5ndGgpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChtYXRjaGVyIGluc3RhbmNlb2YgUmVnRXhwKXsKICAgICAgICAgICAgaWYgKG1hdGNoZXIudGVzdChzb3VyY2UpKXsKICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5yZWFkQ291bnQoUmVnRXhwLmxhc3RNYXRjaC5sZW5ndGgpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICB9LAoKCiAgICAvKioKICAgICAqIFJlYWRzIGEgZ2l2ZW4gbnVtYmVyIG9mIGNoYXJhY3RlcnMuIElmIHRoZSBlbmQgb2YgdGhlIGlucHV0IGlzIHJlYWNoZWQsCiAgICAgKiBpdCByZWFkcyBvbmx5IHRoZSByZW1haW5pbmcgY2hhcmFjdGVycyBhbmQgZG9lcyBub3QgdGhyb3cgYW4gZXJyb3IuCiAgICAgKiBAcGFyYW0ge2ludH0gY291bnQgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlYWQuCiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBzdHJpbmcgbWFkZSB1cCB0aGUgcmVhZCBjaGFyYWN0ZXJzLgogICAgICogQG1ldGhvZCByZWFkQ291bnQKICAgICAqLwogICAgcmVhZENvdW50OiBmdW5jdGlvbihjb3VudCl7CiAgICAgICAgdmFyIGJ1ZmZlciA9ICIiOwoKICAgICAgICB3aGlsZShjb3VudC0tKXsKICAgICAgICAgICAgYnVmZmVyICs9IHRoaXMucmVhZCgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKICAgIH0KCn07Ci8qKgogKiBUeXBlIHRvIHVzZSB3aGVuIGEgc3ludGF4IGVycm9yIG9jY3Vycy4KICogQGNsYXNzIFN5bnRheEVycm9yCiAqIEBuYW1lc3BhY2UgcGFyc2VybGliLnV0aWwKICogQGNvbnN0cnVjdG9yCiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlLgogKiBAcGFyYW0ge2ludH0gbGluZSBUaGUgbGluZSBhdCB3aGljaCB0aGUgZXJyb3Igb2NjdXJyZWQuCiAqIEBwYXJhbSB7aW50fSBjb2wgVGhlIGNvbHVtbiBhdCB3aGljaCB0aGUgZXJyb3Igb2NjdXJyZWQuCiAqLwpmdW5jdGlvbiBTeW50YXhFcnJvcihtZXNzYWdlLCBsaW5lLCBjb2wpewoKICAgIC8qKgogICAgICogVGhlIGNvbHVtbiBhdCB3aGljaCB0aGUgZXJyb3Igb2NjdXJyZWQuCiAgICAgKiBAdHlwZSBpbnQKICAgICAqIEBwcm9wZXJ0eSBjb2wKICAgICAqLwogICAgdGhpcy5jb2wgPSBjb2w7CgogICAgLyoqCiAgICAgKiBUaGUgbGluZSBhdCB3aGljaCB0aGUgZXJyb3Igb2NjdXJyZWQuCiAgICAgKiBAdHlwZSBpbnQKICAgICAqIEBwcm9wZXJ0eSBsaW5lCiAgICAgKi8KICAgIHRoaXMubGluZSA9IGxpbmU7CgogICAgLyoqCiAgICAgKiBUaGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdW5pdC4KICAgICAqIEB0eXBlIFN0cmluZwogICAgICogQHByb3BlcnR5IHRleHQKICAgICAqLwogICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKCn0KCi8vaW5oZXJpdCBmcm9tIEVycm9yClN5bnRheEVycm9yLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpOwovKioKICogQmFzZSB0eXBlIHRvIHJlcHJlc2VudCBhIHNpbmdsZSBzeW50YWN0aWMgdW5pdC4KICogQGNsYXNzIFN5bnRheFVuaXQKICogQG5hbWVzcGFjZSBwYXJzZXJsaWIudXRpbAogKiBAY29uc3RydWN0b3IKICogQHBhcmFtIHtTdHJpbmd9IHRleHQgVGhlIHRleHQgb2YgdGhlIHVuaXQuCiAqIEBwYXJhbSB7aW50fSBsaW5lIFRoZSBsaW5lIG9mIHRleHQgb24gd2hpY2ggdGhlIHVuaXQgcmVzaWRlcy4KICogQHBhcmFtIHtpbnR9IGNvbCBUaGUgY29sdW1uIG9mIHRleHQgb24gd2hpY2ggdGhlIHVuaXQgcmVzaWRlcy4KICovCmZ1bmN0aW9uIFN5bnRheFVuaXQodGV4dCwgbGluZSwgY29sKXsKCgogICAgLyoqCiAgICAgKiBUaGUgY29sdW1uIG9mIHRleHQgb24gd2hpY2ggdGhlIHVuaXQgcmVzaWRlcy4KICAgICAqIEB0eXBlIGludAogICAgICogQHByb3BlcnR5IGNvbAogICAgICovCiAgICB0aGlzLmNvbCA9IGNvbDsKCiAgICAvKioKICAgICAqIFRoZSBsaW5lIG9mIHRleHQgb24gd2hpY2ggdGhlIHVuaXQgcmVzaWRlcy4KICAgICAqIEB0eXBlIGludAogICAgICogQHByb3BlcnR5IGxpbmUKICAgICAqLwogICAgdGhpcy5saW5lID0gbGluZTsKCiAgICAvKioKICAgICAqIFRoZSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB1bml0LgogICAgICogQHR5cGUgU3RyaW5nCiAgICAgKiBAcHJvcGVydHkgdGV4dAogICAgICovCiAgICB0aGlzLnRleHQgPSB0ZXh0OwoKfQoKLyoqCiAqIENyZWF0ZSBhIG5ldyBzeW50YXggdW5pdCBiYXNlZCBzb2xlbHkgb24gdGhlIGdpdmVuIHRva2VuLgogKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNyZWF0aW5nIGEgbmV3IHN5bnRheCB1bml0IHdoZW4KICogaXQgcmVwcmVzZW50cyBhIHNpbmdsZSB0b2tlbiBpbnN0ZWFkIG9mIG11bHRpcGxlLgogKiBAcGFyYW0ge09iamVjdH0gdG9rZW4gVGhlIHRva2VuIG9iamVjdCB0byByZXByZXNlbnQuCiAqIEByZXR1cm4ge3BhcnNlcmxpYi51dGlsLlN5bnRheFVuaXR9IFRoZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSB0b2tlbi4KICogQHN0YXRpYwogKiBAbWV0aG9kIGZyb21Ub2tlbgogKi8KU3ludGF4VW5pdC5mcm9tVG9rZW4gPSBmdW5jdGlvbih0b2tlbil7CiAgICByZXR1cm4gbmV3IFN5bnRheFVuaXQodG9rZW4udmFsdWUsIHRva2VuLnN0YXJ0TGluZSwgdG9rZW4uc3RhcnRDb2wpOwp9OwoKU3ludGF4VW5pdC5wcm90b3R5cGUgPSB7CgogICAgLy9yZXN0b3JlIGNvbnN0cnVjdG9yCiAgICBjb25zdHJ1Y3RvcjogU3ludGF4VW5pdCwKICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB1bml0LgogICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdW5pdC4KICAgICAqIEBtZXRob2QgdmFsdWVPZgogICAgICovCiAgICB2YWx1ZU9mOiBmdW5jdGlvbigpewogICAgICAgIHJldHVybiB0aGlzLnRvU3RyaW5nKCk7CiAgICB9LAogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHVuaXQuCiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB1bml0LgogICAgICogQG1ldGhvZCB0b1N0cmluZwogICAgICovCiAgICB0b1N0cmluZzogZnVuY3Rpb24oKXsKICAgICAgICByZXR1cm4gdGhpcy50ZXh0OwogICAgfQoKfTsKLyoqCiAqIEdlbmVyaWMgVG9rZW5TdHJlYW0gcHJvdmlkaW5nIGJhc2UgZnVuY3Rpb25hbGl0eS4KICogQGNsYXNzIFRva2VuU3RyZWFtQmFzZQogKiBAbmFtZXNwYWNlIHBhcnNlcmxpYi51dGlsCiAqIEBjb25zdHJ1Y3RvcgogKiBAcGFyYW0ge1N0cmluZ3xTdHJpbmdSZWFkZXJ9IGlucHV0IFRoZSB0ZXh0IHRvIHRva2VuaXplIG9yIGEgcmVhZGVyIGZyb20gCiAqICAgICAgd2hpY2ggdG8gcmVhZCB0aGUgaW5wdXQuCiAqLwpmdW5jdGlvbiBUb2tlblN0cmVhbUJhc2UoaW5wdXQsIHRva2VuRGF0YSl7CgogICAgLyoqCiAgICAgKiBUaGUgc3RyaW5nIHJlYWRlciBmb3IgZWFzeSBhY2Nlc3MgdG8gdGhlIHRleHQuCiAgICAgKiBAdHlwZSBTdHJpbmdSZWFkZXIKICAgICAqIEBwcm9wZXJ0eSBfcmVhZGVyCiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICAvL3RoaXMuX3JlYWRlciA9ICh0eXBlb2YgaW5wdXQgPT0gInN0cmluZyIpID8gbmV3IFN0cmluZ1JlYWRlcihpbnB1dCkgOiBpbnB1dDsKICAgIHRoaXMuX3JlYWRlciA9IGlucHV0ID8gbmV3IFN0cmluZ1JlYWRlcihpbnB1dC50b1N0cmluZygpKSA6IG51bGw7CiAgICAKICAgIC8qKgogICAgICogVG9rZW4gb2JqZWN0IGZvciB0aGUgbGFzdCBjb25zdW1lZCB0b2tlbi4KICAgICAqIEB0eXBlIFRva2VuCiAgICAgKiBAcHJvcGVydHkgX3Rva2VuCiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICB0aGlzLl90b2tlbiA9IG51bGw7ICAgIAogICAgCiAgICAvKioKICAgICAqIFRoZSBhcnJheSBvZiB0b2tlbiBpbmZvcm1hdGlvbi4KICAgICAqIEB0eXBlIEFycmF5CiAgICAgKiBAcHJvcGVydHkgX3Rva2VuRGF0YQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgdGhpcy5fdG9rZW5EYXRhID0gdG9rZW5EYXRhOwogICAgCiAgICAvKioKICAgICAqIExvb2thaGVhZCB0b2tlbiBidWZmZXIuCiAgICAgKiBAdHlwZSBBcnJheQogICAgICogQHByb3BlcnR5IF9sdAogICAgICogQHByaXZhdGUKICAgICAqLwogICAgdGhpcy5fbHQgPSBbXTsKICAgIAogICAgLyoqCiAgICAgKiBMb29rYWhlYWQgdG9rZW4gYnVmZmVyIGluZGV4LgogICAgICogQHR5cGUgaW50CiAgICAgKiBAcHJvcGVydHkgX2x0SW5kZXgKICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIHRoaXMuX2x0SW5kZXggPSAwOwogICAgCiAgICB0aGlzLl9sdEluZGV4Q2FjaGUgPSBbXTsKfQoKLyoqCiAqIEFjY2VwdHMgYW4gYXJyYXkgb2YgdG9rZW4gaW5mb3JtYXRpb24gYW5kIG91dHB1dHMKICogYW4gYXJyYXkgb2YgdG9rZW4gZGF0YSBjb250YWluaW5nIGtleS12YWx1ZSBtYXBwaW5ncwogKiBhbmQgbWF0Y2hpbmcgZnVuY3Rpb25zIHRoYXQgdGhlIFRva2VuU3RyZWFtIG5lZWRzLgogKiBAcGFyYW0ge0FycmF5fSB0b2tlbnMgQW4gYXJyYXkgb2YgdG9rZW4gZGVzY3JpcHRvcnMuCiAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBwcm9jZXNzZWQgdG9rZW4gZGF0YS4KICogQG1ldGhvZCBjcmVhdGVUb2tlbkRhdGEKICogQHN0YXRpYwogKi8KVG9rZW5TdHJlYW1CYXNlLmNyZWF0ZVRva2VuRGF0YSA9IGZ1bmN0aW9uKHRva2Vucyl7CgogICAgdmFyIG5hbWVNYXAgCT0gW10sCiAgICAgICAgdHlwZU1hcCAJPSB7fSwKCQl0b2tlbkRhdGEgCT0gdG9rZW5zLmNvbmNhdChbXSksCgkJaQkJCT0gMCwKCQlsZW4JCQk9IHRva2VuRGF0YS5sZW5ndGgrMTsKICAgIAogICAgdG9rZW5EYXRhLlVOS05PV04gPSAtMTsKCXRva2VuRGF0YS51bnNoaWZ0KHtuYW1lOiJFT0YifSk7CgogICAgZm9yICg7IGkgPCBsZW47IGkrKyl7CiAgICAgICAgbmFtZU1hcC5wdXNoKHRva2VuRGF0YVtpXS5uYW1lKTsKICAgICAgICB0b2tlbkRhdGFbdG9rZW5EYXRhW2ldLm5hbWVdID0gaTsKICAgICAgICBpZiAodG9rZW5EYXRhW2ldLnRleHQpewogICAgICAgICAgICB0eXBlTWFwW3Rva2VuRGF0YVtpXS50ZXh0XSA9IGk7CiAgICAgICAgfQogICAgfQogICAgCiAgICB0b2tlbkRhdGEubmFtZSA9IGZ1bmN0aW9uKHR0KXsKICAgICAgICByZXR1cm4gbmFtZU1hcFt0dF07CiAgICB9OwogICAgCiAgICB0b2tlbkRhdGEudHlwZSA9IGZ1bmN0aW9uKGMpewogICAgICAgIHJldHVybiB0eXBlTWFwW2NdOwogICAgfTsKCQoJcmV0dXJuIHRva2VuRGF0YTsKfTsKClRva2VuU3RyZWFtQmFzZS5wcm90b3R5cGUgPSB7CgogICAgLy9yZXN0b3JlIGNvbnN0cnVjdG9yCiAgICBjb25zdHJ1Y3RvcjogVG9rZW5TdHJlYW1CYXNlLCAgICAKICAgIAogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBNYXRjaGluZyBtZXRob2RzCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgLyoqCiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBuZXh0IHRva2VuIG1hdGNoZXMgdGhlIGdpdmVuIHRva2VuIHR5cGUuCiAgICAgKiBJZiBzbywgdGhhdCB0b2tlbiBpcyBjb25zdW1lZDsgaWYgbm90LCB0aGUgdG9rZW4gaXMgcGxhY2VkCiAgICAgKiBiYWNrIG9udG8gdGhlIHRva2VuIHN0cmVhbS4gWW91IGNhbiBwYXNzIGluIGFueSBudW1iZXIgb2YKICAgICAqIHRva2VuIHR5cGVzIGFuZCB0aGlzIHdpbGwgcmV0dXJuIHRydWUgaWYgYW55IG9mIHRoZSB0b2tlbgogICAgICogdHlwZXMgaXMgZm91bmQuCiAgICAgKiBAcGFyYW0ge2ludHxpbnRbXX0gdG9rZW5UeXBlcyBFaXRoZXIgYSBzaW5nbGUgdG9rZW4gdHlwZSBvciBhbiBhcnJheSBvZgogICAgICogICAgICB0b2tlbiB0eXBlcyB0aGF0IHRoZSBuZXh0IHRva2VuIG1pZ2h0IGJlLiBJZiBhbiBhcnJheSBpcyBwYXNzZWQsCiAgICAgKiAgICAgIGl0J3MgYXNzdW1lZCB0aGF0IHRoZSB0b2tlbiBjYW4gYmUgYW55IG9mIHRoZXNlLgogICAgICogQHBhcmFtIHt2YXJpYW50fSBjaGFubmVsIChPcHRpb25hbCkgVGhlIGNoYW5uZWwgdG8gcmVhZCBmcm9tLiBJZiBub3QKICAgICAqICAgICAgcHJvdmlkZWQsIHJlYWRzIGZyb20gdGhlIGRlZmF1bHQgKHVubmFtZWQpIGNoYW5uZWwuCiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoZSB0b2tlbiB0eXBlIG1hdGNoZXMsIGZhbHNlIGlmIG5vdC4KICAgICAqIEBtZXRob2QgbWF0Y2gKICAgICAqLwogICAgbWF0Y2g6IGZ1bmN0aW9uKHRva2VuVHlwZXMsIGNoYW5uZWwpewogICAgCiAgICAgICAgLy9hbHdheXMgY29udmVydCB0byBhbiBhcnJheSwgbWFrZXMgdGhpbmdzIGVhc2llcgogICAgICAgIGlmICghKHRva2VuVHlwZXMgaW5zdGFuY2VvZiBBcnJheSkpewogICAgICAgICAgICB0b2tlblR5cGVzID0gW3Rva2VuVHlwZXNdOwogICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgIHZhciB0dCAgPSB0aGlzLmdldChjaGFubmVsKSwKICAgICAgICAgICAgaSAgID0gMCwKICAgICAgICAgICAgbGVuID0gdG9rZW5UeXBlcy5sZW5ndGg7CiAgICAgICAgICAgIAogICAgICAgIHdoaWxlKGkgPCBsZW4pewogICAgICAgICAgICBpZiAodHQgPT0gdG9rZW5UeXBlc1tpKytdKXsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vbm8gbWF0Y2ggZm91bmQsIHB1dCB0aGUgdG9rZW4gYmFjawogICAgICAgIHRoaXMudW5nZXQoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9LCAgICAKICAgIAogICAgLyoqCiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBuZXh0IHRva2VuIG1hdGNoZXMgdGhlIGdpdmVuIHRva2VuIHR5cGUuCiAgICAgKiBJZiBzbywgdGhhdCB0b2tlbiBpcyBjb25zdW1lZDsgaWYgbm90LCBhbiBlcnJvciBpcyB0aHJvd24uCiAgICAgKiBAcGFyYW0ge2ludHxpbnRbXX0gdG9rZW5UeXBlcyBFaXRoZXIgYSBzaW5nbGUgdG9rZW4gdHlwZSBvciBhbiBhcnJheSBvZgogICAgICogICAgICB0b2tlbiB0eXBlcyB0aGF0IHRoZSBuZXh0IHRva2VuIHNob3VsZCBiZS4gSWYgYW4gYXJyYXkgaXMgcGFzc2VkLAogICAgICogICAgICBpdCdzIGFzc3VtZWQgdGhhdCB0aGUgdG9rZW4gbXVzdCBiZSBvbmUgb2YgdGhlc2UuCiAgICAgKiBAcGFyYW0ge3ZhcmlhbnR9IGNoYW5uZWwgKE9wdGlvbmFsKSBUaGUgY2hhbm5lbCB0byByZWFkIGZyb20uIElmIG5vdAogICAgICogICAgICBwcm92aWRlZCwgcmVhZHMgZnJvbSB0aGUgZGVmYXVsdCAodW5uYW1lZCkgY2hhbm5lbC4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAbWV0aG9kIG11c3RNYXRjaAogICAgICovICAgIAogICAgbXVzdE1hdGNoOiBmdW5jdGlvbih0b2tlblR5cGVzLCBjaGFubmVsKXsKCiAgICAgICAgLy9hbHdheXMgY29udmVydCB0byBhbiBhcnJheSwgbWFrZXMgdGhpbmdzIGVhc2llcgogICAgICAgIGlmICghKHRva2VuVHlwZXMgaW5zdGFuY2VvZiBBcnJheSkpewogICAgICAgICAgICB0b2tlblR5cGVzID0gW3Rva2VuVHlwZXNdOwogICAgICAgIH0KCiAgICAgICAgaWYgKCF0aGlzLm1hdGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpeyAgICAKICAgICAgICAgICAgdG9rZW4gPSB0aGlzLkxUKDEpOwogICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkV4cGVjdGVkICIgKyB0aGlzLl90b2tlbkRhdGFbdG9rZW5UeXBlc1swXV0ubmFtZSArIAogICAgICAgICAgICAgICAgIiBhdCBsaW5lICIgKyB0b2tlbi5zdGFydExpbmUgKyAiLCBjb2wgIiArIHRva2VuLnN0YXJ0Q29sICsgIi4iLCB0b2tlbi5zdGFydExpbmUsIHRva2VuLnN0YXJ0Q29sKTsKICAgICAgICB9CiAgICB9LAogICAgCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIENvbnN1bWluZyBtZXRob2RzCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgLyoqCiAgICAgKiBLZWVwcyByZWFkaW5nIGZyb20gdGhlIHRva2VuIHN0cmVhbSB1bnRpbCBlaXRoZXIgb25lIG9mIHRoZSBzcGVjaWZpZWQKICAgICAqIHRva2VuIHR5cGVzIGlzIGZvdW5kIG9yIHVudGlsIHRoZSBlbmQgb2YgdGhlIGlucHV0IGlzIHJlYWNoZWQuCiAgICAgKiBAcGFyYW0ge2ludHxpbnRbXX0gdG9rZW5UeXBlcyBFaXRoZXIgYSBzaW5nbGUgdG9rZW4gdHlwZSBvciBhbiBhcnJheSBvZgogICAgICogICAgICB0b2tlbiB0eXBlcyB0aGF0IHRoZSBuZXh0IHRva2VuIHNob3VsZCBiZS4gSWYgYW4gYXJyYXkgaXMgcGFzc2VkLAogICAgICogICAgICBpdCdzIGFzc3VtZWQgdGhhdCB0aGUgdG9rZW4gbXVzdCBiZSBvbmUgb2YgdGhlc2UuCiAgICAgKiBAcGFyYW0ge3ZhcmlhbnR9IGNoYW5uZWwgKE9wdGlvbmFsKSBUaGUgY2hhbm5lbCB0byByZWFkIGZyb20uIElmIG5vdAogICAgICogICAgICBwcm92aWRlZCwgcmVhZHMgZnJvbSB0aGUgZGVmYXVsdCAodW5uYW1lZCkgY2hhbm5lbC4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAbWV0aG9kIGFkdmFuY2UKICAgICAqLwogICAgYWR2YW5jZTogZnVuY3Rpb24odG9rZW5UeXBlcywgY2hhbm5lbCl7CiAgICAgICAgCiAgICAgICAgd2hpbGUodGhpcy5MQSgwKSAhPSAwICYmICF0aGlzLm1hdGNoKHRva2VuVHlwZXMsIGNoYW5uZWwpKXsKICAgICAgICAgICAgdGhpcy5nZXQoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0aGlzLkxBKDApOyAgICAKICAgIH0sCiAgICAKICAgIC8qKgogICAgICogQ29uc3VtZXMgdGhlIG5leHQgdG9rZW4gZnJvbSB0aGUgdG9rZW4gc3RyZWFtLiAKICAgICAqIEByZXR1cm4ge2ludH0gVGhlIHRva2VuIHR5cGUgb2YgdGhlIHRva2VuIHRoYXQgd2FzIGp1c3QgY29uc3VtZWQuCiAgICAgKiBAbWV0aG9kIGdldAogICAgICovICAgICAgCiAgICBnZXQ6IGZ1bmN0aW9uKGNoYW5uZWwpewogICAgCiAgICAgICAgdmFyIHRva2VuSW5mbyAgID0gdGhpcy5fdG9rZW5EYXRhLAogICAgICAgICAgICByZWFkZXIgICAgICA9IHRoaXMuX3JlYWRlciwKICAgICAgICAgICAgdmFsdWUsCiAgICAgICAgICAgIGkgICAgICAgICAgID0wLAogICAgICAgICAgICBsZW4gICAgICAgICA9IHRva2VuSW5mby5sZW5ndGgsCiAgICAgICAgICAgIGZvdW5kICAgICAgID0gZmFsc2UsCiAgICAgICAgICAgIHRva2VuLAogICAgICAgICAgICBpbmZvOwogICAgICAgICAgICAKICAgICAgICAvL2NoZWNrIHRoZSBsb29rYWhlYWQgYnVmZmVyIGZpcnN0CiAgICAgICAgaWYgKHRoaXMuX2x0Lmxlbmd0aCAmJiB0aGlzLl9sdEluZGV4ID49IDAgJiYgdGhpcy5fbHRJbmRleCA8IHRoaXMuX2x0Lmxlbmd0aCl7ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgdGhpcy5fdG9rZW4gPSB0aGlzLl9sdFt0aGlzLl9sdEluZGV4KytdOwogICAgICAgICAgICBpbmZvID0gdG9rZW5JbmZvW3RoaXMuX3Rva2VuLnR5cGVdOwogICAgICAgICAgICAKICAgICAgICAgICAgLy9vYmV5IGNoYW5uZWxzIGxvZ2ljCiAgICAgICAgICAgIHdoaWxlKChpbmZvLmNoYW5uZWwgIT09IHVuZGVmaW5lZCAmJiBjaGFubmVsICE9PSBpbmZvLmNoYW5uZWwpICYmCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbHRJbmRleCA8IHRoaXMuX2x0Lmxlbmd0aCl7CiAgICAgICAgICAgICAgICB0aGlzLl90b2tlbiA9IHRoaXMuX2x0W3RoaXMuX2x0SW5kZXgrK107CiAgICAgICAgICAgICAgICBpbmZvID0gdG9rZW5JbmZvW3RoaXMuX3Rva2VuLnR5cGVdOwogICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAvL2hlcmUgYmUgZHJhZ29ucwogICAgICAgICAgICBpZiAoKGluZm8uY2hhbm5lbCA9PT0gdW5kZWZpbmVkIHx8IGNoYW5uZWwgPT09IGluZm8uY2hhbm5lbCkgJiYKICAgICAgICAgICAgICAgICAgICB0aGlzLl9sdEluZGV4IDw9IHRoaXMuX2x0Lmxlbmd0aCl7CiAgICAgICAgICAgICAgICB0aGlzLl9sdEluZGV4Q2FjaGUucHVzaChpKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl90b2tlbi50eXBlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vY2FsbCB0b2tlbiByZXRyaWV2ZXIgbWV0aG9kCgkJdG9rZW4gPSB0aGlzLl9nZXRUb2tlbigpOwoKICAgICAgICAvL2lmIGl0IHNob3VsZCBiZSBoaWRkZW4sIGRvbid0IHNhdmUgYSB0b2tlbgogICAgICAgIGlmICh0b2tlbi50eXBlID4gLTEgJiYgIXRva2VuSW5mb1t0b2tlbi50eXBlXS5oaWRlKXsKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIC8vYXBwbHkgdG9rZW4gY2hhbm5lbAogICAgICAgICAgICB0b2tlbi5jaGFubmVsID0gdG9rZW5JbmZvW3Rva2VuLnR5cGVdLmNoYW5uZWw7CiAgICAgICAgIAogICAgICAgICAgICAvL3NhdmUgZm9yIGxhdGVyCiAgICAgICAgICAgIHRoaXMuX3Rva2VuID0gdG9rZW47CiAgICAgICAgICAgIHRoaXMuX2x0LnB1c2godG9rZW4pOwoKICAgICAgICAgICAgLy9zYXZlIHNwYWNlIHRoYXQgd2lsbCBiZSBtb3ZlZCAobXVzdCBiZSBkb25lIGJlZm9yZSBhcnJheSBpcyB0cnVuY2F0ZWQpCiAgICAgICAgICAgIHRoaXMuX2x0SW5kZXhDYWNoZS5wdXNoKHRoaXMuX2x0Lmxlbmd0aCAtIHRoaXMuX2x0SW5kZXggKyBpKTsgIAogICAgICAgIAogICAgICAgICAgICAvL2tlZXAgdGhlIGJ1ZmZlciB1bmRlciA1IGl0ZW1zCiAgICAgICAgICAgIGlmICh0aGlzLl9sdC5sZW5ndGggPiA1KXsKICAgICAgICAgICAgICAgIHRoaXMuX2x0LnNoaWZ0KCk7ICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAvL2Fsc28ga2VlcCB0aGUgc2hpZnQgYnVmZmVyIHVuZGVyIDUgaXRlbXMKICAgICAgICAgICAgaWYgKHRoaXMuX2x0SW5kZXhDYWNoZS5sZW5ndGggPiA1KXsKICAgICAgICAgICAgICAgIHRoaXMuX2x0SW5kZXhDYWNoZS5zaGlmdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgLy91cGRhdGUgbG9va2FoZWFkIGluZGV4CiAgICAgICAgICAgIHRoaXMuX2x0SW5kZXggPSB0aGlzLl9sdC5sZW5ndGg7CiAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAvKgogICAgICAgICAqIFNraXAgdG8gdGhlIG5leHQgdG9rZW4gaWY6CiAgICAgICAgICogMS4gVGhlIHRva2VuIHR5cGUgaXMgbWFya2VkIGFzIGhpZGRlbi4KICAgICAgICAgKiAyLiBUaGUgdG9rZW4gdHlwZSBoYXMgYSBjaGFubmVsIHNwZWNpZmllZCBhbmQgaXQgaXNuJ3QgdGhlIGN1cnJlbnQgY2hhbm5lbC4KICAgICAgICAgKi8KICAgICAgICBpbmZvID0gdG9rZW5JbmZvW3Rva2VuLnR5cGVdOwogICAgICAgIGlmIChpbmZvICYmIAogICAgICAgICAgICAgICAgKGluZm8uaGlkZSB8fCAKICAgICAgICAgICAgICAgIChpbmZvLmNoYW5uZWwgIT09IHVuZGVmaW5lZCAmJiBjaGFubmVsICE9PSBpbmZvLmNoYW5uZWwpKSl7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChjaGFubmVsKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvL3JldHVybiBqdXN0IHRoZSB0eXBlCiAgICAgICAgICAgIHJldHVybiB0b2tlbi50eXBlOwogICAgICAgIH0KICAgIH0sCiAgICAKICAgIC8qKgogICAgICogTG9va3MgYWhlYWQgYSBjZXJ0YWluIG51bWJlciBvZiB0b2tlbnMgYW5kIHJldHVybnMgdGhlIHRva2VuIHR5cGUgYXQKICAgICAqIHRoYXQgcG9zaXRpb24uIFRoaXMgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiB5b3UgbG9va2FoZWFkIHBhc3QgdGhlCiAgICAgKiBlbmQgb2YgaW5wdXQsIHBhc3QgdGhlIHNpemUgb2YgdGhlIGxvb2thaGVhZCBidWZmZXIsIG9yIGJhY2sgcGFzdAogICAgICogdGhlIGZpcnN0IHRva2VuIGluIHRoZSBsb29rYWhlYWQgYnVmZmVyLgogICAgICogQHBhcmFtIHtpbnR9IFRoZSBpbmRleCBvZiB0aGUgdG9rZW4gdHlwZSB0byByZXRyaWV2ZS4gMCBmb3IgdGhlCiAgICAgKiAgICAgIGN1cnJlbnQgdG9rZW4sIDEgZm9yIHRoZSBuZXh0LCAtMSBmb3IgdGhlIHByZXZpb3VzLCBldGMuCiAgICAgKiBAcmV0dXJuIHtpbnR9IFRoZSB0b2tlbiB0eXBlIG9mIHRoZSB0b2tlbiBpbiB0aGUgZ2l2ZW4gcG9zaXRpb24uCiAgICAgKiBAbWV0aG9kIExBCiAgICAgKi8KICAgIExBOiBmdW5jdGlvbihpbmRleCl7CiAgICAgICAgdmFyIHRvdGFsID0gaW5kZXgsCiAgICAgICAgICAgIHR0OwogICAgICAgIGlmIChpbmRleCA+IDApewogICAgICAgICAgICAvL1RPRE86IFN0b3JlIDUgc29tZXdoZXJlCiAgICAgICAgICAgIGlmIChpbmRleCA+IDUpewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUb28gbXVjaCBsb29rYWhlYWQuIik7CiAgICAgICAgICAgIH0KICAgICAgICAKICAgICAgICAgICAgLy9nZXQgYWxsIHRob3NlIHRva2VucwogICAgICAgICAgICB3aGlsZSh0b3RhbCl7CiAgICAgICAgICAgICAgICB0dCA9IHRoaXMuZ2V0KCk7ICAgCiAgICAgICAgICAgICAgICB0b3RhbC0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgLy91bmdldCBhbGwgdGhvc2UgdG9rZW5zCiAgICAgICAgICAgIHdoaWxlKHRvdGFsIDwgaW5kZXgpewogICAgICAgICAgICAgICAgdGhpcy51bmdldCgpOwogICAgICAgICAgICAgICAgdG90YWwrKzsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPCAwKXsKICAgICAgICAKICAgICAgICAgICAgaWYodGhpcy5fbHRbdGhpcy5fbHRJbmRleCtpbmRleF0pewogICAgICAgICAgICAgICAgdHQgPSB0aGlzLl9sdFt0aGlzLl9sdEluZGV4K2luZGV4XS50eXBlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUb28gbXVjaCBsb29rYmVoaW5kLiIpOwogICAgICAgICAgICB9CiAgICAgICAgCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdHQgPSB0aGlzLl90b2tlbi50eXBlOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gdHQ7CiAgICAKICAgIH0sCiAgICAKICAgIC8qKgogICAgICogTG9va3MgYWhlYWQgYSBjZXJ0YWluIG51bWJlciBvZiB0b2tlbnMgYW5kIHJldHVybnMgdGhlIHRva2VuIGF0CiAgICAgKiB0aGF0IHBvc2l0aW9uLiBUaGlzIHdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgeW91IGxvb2thaGVhZCBwYXN0IHRoZQogICAgICogZW5kIG9mIGlucHV0LCBwYXN0IHRoZSBzaXplIG9mIHRoZSBsb29rYWhlYWQgYnVmZmVyLCBvciBiYWNrIHBhc3QKICAgICAqIHRoZSBmaXJzdCB0b2tlbiBpbiB0aGUgbG9va2FoZWFkIGJ1ZmZlci4KICAgICAqIEBwYXJhbSB7aW50fSBUaGUgaW5kZXggb2YgdGhlIHRva2VuIHR5cGUgdG8gcmV0cmlldmUuIDAgZm9yIHRoZQogICAgICogICAgICBjdXJyZW50IHRva2VuLCAxIGZvciB0aGUgbmV4dCwgLTEgZm9yIHRoZSBwcmV2aW91cywgZXRjLgogICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgdG9rZW4gb2YgdGhlIHRva2VuIGluIHRoZSBnaXZlbiBwb3NpdGlvbi4KICAgICAqIEBtZXRob2QgTEEKICAgICAqLyAgICAKICAgIExUOiBmdW5jdGlvbihpbmRleCl7CiAgICAKICAgICAgICAvL2xvb2thaGVhZCBmaXJzdCB0byBwcmltZSB0aGUgdG9rZW4gYnVmZmVyCiAgICAgICAgdGhpcy5MQShpbmRleCk7CiAgICAgICAgCiAgICAgICAgLy9ub3cgZmluZCB0aGUgdG9rZW4sIHN1YnRyYWN0IG9uZSBiZWNhdXNlIF9sdEluZGV4IGlzIGFscmVhZHkgYXQgdGhlIG5leHQgaW5kZXgKICAgICAgICByZXR1cm4gdGhpcy5fbHRbdGhpcy5fbHRJbmRleCtpbmRleC0xXTsgICAgCiAgICB9LAogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHRva2VuIHR5cGUgZm9yIHRoZSBuZXh0IHRva2VuIGluIHRoZSBzdHJlYW0gd2l0aG91dCAKICAgICAqIGNvbnN1bWluZyBpdC4KICAgICAqIEByZXR1cm4ge2ludH0gVGhlIHRva2VuIHR5cGUgb2YgdGhlIG5leHQgdG9rZW4gaW4gdGhlIHN0cmVhbS4KICAgICAqIEBtZXRob2QgcGVlawogICAgICovCiAgICBwZWVrOiBmdW5jdGlvbigpewogICAgICAgIHJldHVybiB0aGlzLkxBKDEpOwogICAgfSwKICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBhY3R1YWwgdG9rZW4gb2JqZWN0IGZvciB0aGUgbGFzdCBjb25zdW1lZCB0b2tlbi4KICAgICAqIEByZXR1cm4ge1Rva2VufSBUaGUgdG9rZW4gb2JqZWN0IGZvciB0aGUgbGFzdCBjb25zdW1lZCB0b2tlbi4KICAgICAqIEBtZXRob2QgdG9rZW4KICAgICAqLwogICAgdG9rZW46IGZ1bmN0aW9uKCl7CiAgICAgICAgcmV0dXJuIHRoaXMuX3Rva2VuOwogICAgfSwKICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSB0b2tlbiBmb3IgdGhlIGdpdmVuIHRva2VuIHR5cGUuCiAgICAgKiBAcGFyYW0ge2ludH0gdG9rZW5UeXBlIFRoZSB0eXBlIG9mIHRva2VuIHRvIGdldCB0aGUgbmFtZSBvZi4KICAgICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIG5hbWUgb2YgdGhlIHRva2VuIG9yICJVTktOT1dOX1RPS0VOIiBmb3IgYW55CiAgICAgKiAgICAgIGludmFsaWQgdG9rZW4gdHlwZS4KICAgICAqIEBtZXRob2QgdG9rZW5OYW1lCiAgICAgKi8KICAgIHRva2VuTmFtZTogZnVuY3Rpb24odG9rZW5UeXBlKXsKICAgICAgICBpZiAodG9rZW5UeXBlIDwgMCB8fCB0b2tlblR5cGUgPiB0aGlzLl90b2tlbkRhdGEubGVuZ3RoKXsKICAgICAgICAgICAgcmV0dXJuICJVTktOT1dOX1RPS0VOIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW5EYXRhW3Rva2VuVHlwZV0ubmFtZTsKICAgICAgICB9CiAgICB9LAogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHRva2VuIHR5cGUgdmFsdWUgZm9yIHRoZSBnaXZlbiB0b2tlbiBuYW1lLgogICAgICogQHBhcmFtIHtTdHJpbmd9IHRva2VuTmFtZSBUaGUgbmFtZSBvZiB0aGUgdG9rZW4gd2hvc2UgdmFsdWUgc2hvdWxkIGJlIHJldHVybmVkLgogICAgICogQHJldHVybiB7aW50fSBUaGUgdG9rZW4gdHlwZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHRva2VuIG5hbWUgb3IgLTEKICAgICAqICAgICAgZm9yIGFuIHVua25vd24gdG9rZW4uCiAgICAgKiBAbWV0aG9kIHRva2VuTmFtZQogICAgICovICAgIAogICAgdG9rZW5UeXBlOiBmdW5jdGlvbih0b2tlbk5hbWUpewogICAgICAgIHJldHVybiB0aGlzLl90b2tlbkRhdGFbdG9rZW5OYW1lXSB8fCAtMTsKICAgIH0sCiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbGFzdCBjb25zdW1lZCB0b2tlbiB0byB0aGUgdG9rZW4gc3RyZWFtLgogICAgICogQG1ldGhvZCB1bmdldAogICAgICovICAgICAgCiAgICB1bmdldDogZnVuY3Rpb24oKXsKICAgICAgICAvL2lmICh0aGlzLl9sdEluZGV4ID4gLTEpewogICAgICAgIGlmICh0aGlzLl9sdEluZGV4Q2FjaGUubGVuZ3RoKXsKICAgICAgICAgICAgdGhpcy5fbHRJbmRleCAtPSB0aGlzLl9sdEluZGV4Q2FjaGUucG9wKCk7Ly8tLTsKICAgICAgICAgICAgdGhpcy5fdG9rZW4gPSB0aGlzLl9sdFt0aGlzLl9sdEluZGV4IC0gMV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUb28gbXVjaCBsb29rYWhlYWQuIik7CiAgICAgICAgfQogICAgfQoKfTsKCgoKcGFyc2VybGliLnV0aWwgPSB7ClN0cmluZ1JlYWRlcjogU3RyaW5nUmVhZGVyLApTeW50YXhFcnJvciA6IFN5bnRheEVycm9yLApTeW50YXhVbml0ICA6IFN5bnRheFVuaXQsCkV2ZW50VGFyZ2V0IDogRXZlbnRUYXJnZXQsClRva2VuU3RyZWFtQmFzZSA6IFRva2VuU3RyZWFtQmFzZQp9Owp9KSgpOwoKLyogClBhcnNlci1MaWIKQ29weXJpZ2h0IChjKSAyMDA5LTIwMTEgTmljaG9sYXMgQy4gWmFrYXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKKi8KLyogQnVpbGQgdGltZTogMTMtSnVseS0yMDExIDA0OjM1OjI4ICovCihmdW5jdGlvbigpewp2YXIgRXZlbnRUYXJnZXQgPSBwYXJzZXJsaWIudXRpbC5FdmVudFRhcmdldCwKVG9rZW5TdHJlYW1CYXNlID0gcGFyc2VybGliLnV0aWwuVG9rZW5TdHJlYW1CYXNlLApTdHJpbmdSZWFkZXIgPSBwYXJzZXJsaWIudXRpbC5TdHJpbmdSZWFkZXIsClN5bnRheEVycm9yID0gcGFyc2VybGliLnV0aWwuU3ludGF4RXJyb3IsClN5bnRheFVuaXQgID0gcGFyc2VybGliLnV0aWwuU3ludGF4VW5pdDsKCnZhciBDb2xvcnMgPSB7CiAgICBhbGljZWJsdWUgICAgICAgOiIjZjBmOGZmIiwKICAgIGFudGlxdWV3aGl0ZSAgICA6IiNmYWViZDciLAogICAgYXF1YSAgICAgICAgICAgIDoiIzAwZmZmZiIsCiAgICBhcXVhbWFyaW5lICAgICAgOiIjN2ZmZmQ0IiwKICAgIGF6dXJlICAgICAgICAgICA6IiNmMGZmZmYiLAogICAgYmVpZ2UgICAgICAgICAgIDoiI2Y1ZjVkYyIsCiAgICBiaXNxdWUgICAgICAgICAgOiIjZmZlNGM0IiwKICAgIGJsYWNrICAgICAgICAgICA6IiMwMDAwMDAiLAogICAgYmxhbmNoZWRhbG1vbmQgIDoiI2ZmZWJjZCIsCiAgICBibHVlICAgICAgICAgICAgOiIjMDAwMGZmIiwKICAgIGJsdWV2aW9sZXQgICAgICA6IiM4YTJiZTIiLAogICAgYnJvd24gICAgICAgICAgIDoiI2E1MmEyYSIsCiAgICBidXJseXdvb2QgICAgICAgOiIjZGViODg3IiwKICAgIGNhZGV0Ymx1ZSAgICAgICA6IiM1ZjllYTAiLAogICAgY2hhcnRyZXVzZSAgICAgIDoiIzdmZmYwMCIsCiAgICBjaG9jb2xhdGUgICAgICAgOiIjZDI2OTFlIiwKICAgIGNvcmFsICAgICAgICAgICA6IiNmZjdmNTAiLAogICAgY29ybmZsb3dlcmJsdWUgIDoiIzY0OTVlZCIsCiAgICBjb3Juc2lsayAgICAgICAgOiIjZmZmOGRjIiwKICAgIGNyaW1zb24gICAgICAgICA6IiNkYzE0M2MiLAogICAgY3lhbiAgICAgICAgICAgIDoiIzAwZmZmZiIsCiAgICBkYXJrYmx1ZSAgICAgICAgOiIjMDAwMDhiIiwKICAgIGRhcmtjeWFuICAgICAgICA6IiMwMDhiOGIiLAogICAgZGFya2dvbGRlbnJvZCAgIDoiI2I4ODYwYiIsCiAgICBkYXJrZ3JheSAgICAgICAgOiIjYTlhOWE5IiwKICAgIGRhcmtncmVlbiAgICAgICA6IiMwMDY0MDAiLAogICAgZGFya2toYWtpICAgICAgIDoiI2JkYjc2YiIsCiAgICBkYXJrbWFnZW50YSAgICAgOiIjOGIwMDhiIiwKICAgIGRhcmtvbGl2ZWdyZWVuICA6IiM1NTZiMmYiLAogICAgZGFya29yYW5nZSAgICAgIDoiI2ZmOGMwMCIsCiAgICBkYXJrb3JjaGlkICAgICAgOiIjOTkzMmNjIiwKICAgIGRhcmtyZWQgICAgICAgICA6IiM4YjAwMDAiLAogICAgZGFya3NhbG1vbiAgICAgIDoiI2U5OTY3YSIsCiAgICBkYXJrc2VhZ3JlZW4gICAgOiIjOGZiYzhmIiwKICAgIGRhcmtzbGF0ZWJsdWUgICA6IiM0ODNkOGIiLAogICAgZGFya3NsYXRlZ3JheSAgIDoiIzJmNGY0ZiIsCiAgICBkYXJrdHVycXVvaXNlICAgOiIjMDBjZWQxIiwKICAgIGRhcmt2aW9sZXQgICAgICA6IiM5NDAwZDMiLAogICAgZGVlcHBpbmsgICAgICAgIDoiI2ZmMTQ5MyIsCiAgICBkZWVwc2t5Ymx1ZSAgICAgOiIjMDBiZmZmIiwKICAgIGRpbWdyYXkgICAgICAgICA6IiM2OTY5NjkiLAogICAgZG9kZ2VyYmx1ZSAgICAgIDoiIzFlOTBmZiIsCiAgICBmaXJlYnJpY2sgICAgICAgOiIjYjIyMjIyIiwKICAgIGZsb3JhbHdoaXRlICAgICA6IiNmZmZhZjAiLAogICAgZm9yZXN0Z3JlZW4gICAgIDoiIzIyOGIyMiIsCiAgICBmdWNoc2lhICAgICAgICAgOiIjZmYwMGZmIiwKICAgIGdhaW5zYm9ybyAgICAgICA6IiNkY2RjZGMiLAogICAgZ2hvc3R3aGl0ZSAgICAgIDoiI2Y4ZjhmZiIsCiAgICBnb2xkICAgICAgICAgICAgOiIjZmZkNzAwIiwKICAgIGdvbGRlbnJvZCAgICAgICA6IiNkYWE1MjAiLAogICAgZ3JheSAgICAgICAgICAgIDoiIzgwODA4MCIsCiAgICBncmVlbiAgICAgICAgICAgOiIjMDA4MDAwIiwKICAgIGdyZWVueWVsbG93ICAgICA6IiNhZGZmMmYiLAogICAgaG9uZXlkZXcgICAgICAgIDoiI2YwZmZmMCIsCiAgICBob3RwaW5rICAgICAgICAgOiIjZmY2OWI0IiwKICAgIGluZGlhbnJlZCAgICAgICA6IiNjZDVjNWMiLAogICAgaW5kaWdvICAgICAgICAgIDoiIzRiMDA4MiIsCiAgICBpdm9yeSAgICAgICAgICAgOiIjZmZmZmYwIiwKICAgIGtoYWtpICAgICAgICAgICA6IiNmMGU2OGMiLAogICAgbGF2ZW5kZXIgICAgICAgIDoiI2U2ZTZmYSIsCiAgICBsYXZlbmRlcmJsdXNoICAgOiIjZmZmMGY1IiwKICAgIGxhd25ncmVlbiAgICAgICA6IiM3Y2ZjMDAiLAogICAgbGVtb25jaGlmZm9uICAgIDoiI2ZmZmFjZCIsCiAgICBsaWdodGJsdWUgICAgICAgOiIjYWRkOGU2IiwKICAgIGxpZ2h0Y29yYWwgICAgICA6IiNmMDgwODAiLAogICAgbGlnaHRjeWFuICAgICAgIDoiI2UwZmZmZiIsCiAgICBsaWdodGdvbGRlbnJvZHllbGxvdyAgOiIjZmFmYWQyIiwKICAgIGxpZ2h0Z3JleSAgICAgICA6IiNkM2QzZDMiLAogICAgbGlnaHRncmVlbiAgICAgIDoiIzkwZWU5MCIsCiAgICBsaWdodHBpbmsgICAgICAgOiIjZmZiNmMxIiwKICAgIGxpZ2h0c2FsbW9uICAgICA6IiNmZmEwN2EiLAogICAgbGlnaHRzZWFncmVlbiAgIDoiIzIwYjJhYSIsCiAgICBsaWdodHNreWJsdWUgICAgOiIjODdjZWZhIiwKICAgIGxpZ2h0c2xhdGVncmF5ICA6IiM3Nzg4OTkiLAogICAgbGlnaHRzdGVlbGJsdWUgIDoiI2IwYzRkZSIsCiAgICBsaWdodHllbGxvdyAgICAgOiIjZmZmZmUwIiwKICAgIGxpbWUgICAgICAgICAgICA6IiMwMGZmMDAiLAogICAgbGltZWdyZWVuICAgICAgIDoiIzMyY2QzMiIsCiAgICBsaW5lbiAgICAgICAgICAgOiIjZmFmMGU2IiwKICAgIG1hZ2VudGEgICAgICAgICA6IiNmZjAwZmYiLAogICAgbWFyb29uICAgICAgICAgIDoiIzgwMDAwMCIsCiAgICBtZWRpdW1hcXVhbWFyaW5lOiIjNjZjZGFhIiwKICAgIG1lZGl1bWJsdWUgICAgICA6IiMwMDAwY2QiLAogICAgbWVkaXVtb3JjaGlkICAgIDoiI2JhNTVkMyIsCiAgICBtZWRpdW1wdXJwbGUgICAgOiIjOTM3MGQ4IiwKICAgIG1lZGl1bXNlYWdyZWVuICA6IiMzY2IzNzEiLAogICAgbWVkaXVtc2xhdGVibHVlIDoiIzdiNjhlZSIsCiAgICBtZWRpdW1zcHJpbmdncmVlbiAgIDoiIzAwZmE5YSIsCiAgICBtZWRpdW10dXJxdW9pc2UgOiIjNDhkMWNjIiwKICAgIG1lZGl1bXZpb2xldHJlZCA6IiNjNzE1ODUiLAogICAgbWlkbmlnaHRibHVlICAgIDoiIzE5MTk3MCIsCiAgICBtaW50Y3JlYW0gICAgICAgOiIjZjVmZmZhIiwKICAgIG1pc3R5cm9zZSAgICAgICA6IiNmZmU0ZTEiLAogICAgbW9jY2FzaW4gICAgICAgIDoiI2ZmZTRiNSIsCiAgICBuYXZham93aGl0ZSAgICAgOiIjZmZkZWFkIiwKICAgIG5hdnkgICAgICAgICAgICA6IiMwMDAwODAiLAogICAgb2xkbGFjZSAgICAgICAgIDoiI2ZkZjVlNiIsCiAgICBvbGl2ZSAgICAgICAgICAgOiIjODA4MDAwIiwKICAgIG9saXZlZHJhYiAgICAgICA6IiM2YjhlMjMiLAogICAgb3JhbmdlICAgICAgICAgIDoiI2ZmYTUwMCIsCiAgICBvcmFuZ2VyZWQgICAgICAgOiIjZmY0NTAwIiwKICAgIG9yY2hpZCAgICAgICAgICA6IiNkYTcwZDYiLAogICAgcGFsZWdvbGRlbnJvZCAgIDoiI2VlZThhYSIsCiAgICBwYWxlZ3JlZW4gICAgICAgOiIjOThmYjk4IiwKICAgIHBhbGV0dXJxdW9pc2UgICA6IiNhZmVlZWUiLAogICAgcGFsZXZpb2xldHJlZCAgIDoiI2Q4NzA5MyIsCiAgICBwYXBheWF3aGlwICAgICAgOiIjZmZlZmQ1IiwKICAgIHBlYWNocHVmZiAgICAgICA6IiNmZmRhYjkiLAogICAgcGVydSAgICAgICAgICAgIDoiI2NkODUzZiIsCiAgICBwaW5rICAgICAgICAgICAgOiIjZmZjMGNiIiwKICAgIHBsdW0gICAgICAgICAgICA6IiNkZGEwZGQiLAogICAgcG93ZGVyYmx1ZSAgICAgIDoiI2IwZTBlNiIsCiAgICBwdXJwbGUgICAgICAgICAgOiIjODAwMDgwIiwKICAgIHJlZCAgICAgICAgICAgICA6IiNmZjAwMDAiLAogICAgcm9zeWJyb3duICAgICAgIDoiI2JjOGY4ZiIsCiAgICByb3lhbGJsdWUgICAgICAgOiIjNDE2OWUxIiwKICAgIHNhZGRsZWJyb3duICAgICA6IiM4YjQ1MTMiLAogICAgc2FsbW9uICAgICAgICAgIDoiI2ZhODA3MiIsCiAgICBzYW5keWJyb3duICAgICAgOiIjZjRhNDYwIiwKICAgIHNlYWdyZWVuICAgICAgICA6IiMyZThiNTciLAogICAgc2Vhc2hlbGwgICAgICAgIDoiI2ZmZjVlZSIsCiAgICBzaWVubmEgICAgICAgICAgOiIjYTA1MjJkIiwKICAgIHNpbHZlciAgICAgICAgICA6IiNjMGMwYzAiLAogICAgc2t5Ymx1ZSAgICAgICAgIDoiIzg3Y2VlYiIsCiAgICBzbGF0ZWJsdWUgICAgICAgOiIjNmE1YWNkIiwKICAgIHNsYXRlZ3JheSAgICAgICA6IiM3MDgwOTAiLAogICAgc25vdyAgICAgICAgICAgIDoiI2ZmZmFmYSIsCiAgICBzcHJpbmdncmVlbiAgICAgOiIjMDBmZjdmIiwKICAgIHN0ZWVsYmx1ZSAgICAgICA6IiM0NjgyYjQiLAogICAgdGFuICAgICAgICAgICAgIDoiI2QyYjQ4YyIsCiAgICB0ZWFsICAgICAgICAgICAgOiIjMDA4MDgwIiwKICAgIHRoaXN0bGUgICAgICAgICA6IiNkOGJmZDgiLAogICAgdG9tYXRvICAgICAgICAgIDoiI2ZmNjM0NyIsCiAgICB0dXJxdW9pc2UgICAgICAgOiIjNDBlMGQwIiwKICAgIHZpb2xldCAgICAgICAgICA6IiNlZTgyZWUiLAogICAgd2hlYXQgICAgICAgICAgIDoiI2Y1ZGViMyIsCiAgICB3aGl0ZSAgICAgICAgICAgOiIjZmZmZmZmIiwKICAgIHdoaXRlc21va2UgICAgICA6IiNmNWY1ZjUiLAogICAgeWVsbG93ICAgICAgICAgIDoiI2ZmZmYwMCIsCiAgICB5ZWxsb3dncmVlbiAgICAgOiIjOWFjZDMyIgp9OwovKioKICogUmVwcmVzZW50cyBhIHNlbGVjdG9yIGNvbWJpbmF0b3IgKHdoaXRlc3BhY2UsICssID4pLgogKiBAbmFtZXNwYWNlIHBhcnNlcmxpYi5jc3MKICogQGNsYXNzIENvbWJpbmF0b3IKICogQGV4dGVuZHMgcGFyc2VybGliLnV0aWwuU3ludGF4VW5pdAogKiBAY29uc3RydWN0b3IKICogQHBhcmFtIHtTdHJpbmd9IHRleHQgVGhlIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHVuaXQuIAogKiBAcGFyYW0ge2ludH0gbGluZSBUaGUgbGluZSBvZiB0ZXh0IG9uIHdoaWNoIHRoZSB1bml0IHJlc2lkZXMuCiAqIEBwYXJhbSB7aW50fSBjb2wgVGhlIGNvbHVtbiBvZiB0ZXh0IG9uIHdoaWNoIHRoZSB1bml0IHJlc2lkZXMuCiAqLwpmdW5jdGlvbiBDb21iaW5hdG9yKHRleHQsIGxpbmUsIGNvbCl7CiAgICAKICAgIFN5bnRheFVuaXQuY2FsbCh0aGlzLCB0ZXh0LCBsaW5lLCBjb2wpOwoKICAgIC8qKgogICAgICogVGhlIHR5cGUgb2YgbW9kaWZpZXIuCiAgICAgKiBAdHlwZSBTdHJpbmcKICAgICAqIEBwcm9wZXJ0eSB0eXBlCiAgICAgKi8KICAgIHRoaXMudHlwZSA9ICJ1bmtub3duIjsKICAgIAogICAgLy9wcmV0dHkgc2ltcGxlCiAgICBpZiAoL15ccyskLy50ZXN0KHRleHQpKXsKICAgICAgICB0aGlzLnR5cGUgPSAiZGVzY2VuZGFudCI7CiAgICB9IGVsc2UgaWYgKHRleHQgPT0gIj4iKXsKICAgICAgICB0aGlzLnR5cGUgPSAiY2hpbGQiOwogICAgfSBlbHNlIGlmICh0ZXh0ID09ICIrIil7CiAgICAgICAgdGhpcy50eXBlID0gImFkamFjZW50LXNpYmxpbmciOwogICAgfSBlbHNlIGlmICh0ZXh0ID09ICJ+Iil7CiAgICAgICAgdGhpcy50eXBlID0gInNpYmxpbmciOwogICAgfQoKfQoKQ29tYmluYXRvci5wcm90b3R5cGUgPSBuZXcgU3ludGF4VW5pdCgpOwpDb21iaW5hdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvbWJpbmF0b3I7CgoKCnZhciBMZXZlbDFQcm9wZXJ0aWVzID0gewoKICAgICJiYWNrZ3JvdW5kIjogMSwKICAgICJiYWNrZ3JvdW5kLWF0dGFjaG1lbnQiOiAxLAogICAgImJhY2tncm91bmQtY29sb3IiOiAxLAogICAgImJhY2tncm91bmQtaW1hZ2UiOiAxLAogICAgImJhY2tncm91bmQtcG9zaXRpb24iOiAxLAogICAgImJhY2tncm91bmQtcmVwZWF0IjogMSwKIAogICAgImJvcmRlciI6IDEsCiAgICAiYm9yZGVyLWJvdHRvbSI6IDEsCiAgICAiYm9yZGVyLWJvdHRvbS13aWR0aCI6IDEsCiAgICAiYm9yZGVyLWNvbG9yIjogMSwKICAgICJib3JkZXItbGVmdCI6IDEsCiAgICAiYm9yZGVyLWxlZnQtd2lkdGgiOiAxLAogICAgImJvcmRlci1yaWdodCI6IDEsCiAgICAiYm9yZGVyLXJpZ2h0LXdpZHRoIjogMSwKICAgICJib3JkZXItc3R5bGUiOiAxLAogICAgImJvcmRlci10b3AiOiAxLAogICAgImJvcmRlci10b3Atd2lkdGgiOiAxLAogICAgImJvcmRlci13aWR0aCI6IDEsCiAKICAgICJjbGVhciI6IDEsCiAgICAiY29sb3IiOiAxLAogICAgImRpc3BsYXkiOiAxLAogICAgImZsb2F0IjogMSwKIAogICAgImZvbnQiOiAxLAogICAgImZvbnQtZmFtaWx5IjogMSwKICAgICJmb250LXNpemUiOiAxLAogICAgImZvbnQtc3R5bGUiOiAxLAogICAgImZvbnQtdmFyaWFudCI6IDEsCiAgICAiZm9udC13ZWlnaHQiOiAxLAogCiAgICAiaGVpZ2h0IjogMSwKICAgICJsZXR0ZXItc3BhY2luZyI6IDEsCiAgICAibGluZS1oZWlnaHQiOiAxLAogCiAgICAibGlzdC1zdHlsZSI6IDEsCiAgICAibGlzdC1zdHlsZS1pbWFnZSI6IDEsCiAgICAibGlzdC1zdHlsZS1wb3NpdGlvbiI6IDEsCiAgICAibGlzdC1zdHlsZS10eXBlIjogMSwKIAogICAgIm1hcmdpbiI6IDEsCiAgICAibWFyZ2luLWJvdHRvbSI6IDEsCiAgICAibWFyZ2luLWxlZnQiOiAxLAogICAgIm1hcmdpbi1yaWdodCI6IDEsCiAgICAibWFyZ2luLXRvcCI6IDEsCiAKICAgICJwYWRkaW5nIjogMSwKICAgICJwYWRkaW5nLWJvdHRvbSI6IDEsCiAgICAicGFkZGluZy1sZWZ0IjogMSwKICAgICJwYWRkaW5nLXJpZ2h0IjogMSwKICAgICJwYWRkaW5nLXRvcCI6IDEsCiAKICAgICJ0ZXh0LWFsaWduIjogMSwKICAgICJ0ZXh0LWRlY29yYXRpb24iOiAxLAogICAgInRleHQtaW5kZW50IjogMSwKICAgICJ0ZXh0LXRyYW5zZm9ybSI6IDEsCiAKICAgICJ2ZXJ0aWNhbC1hbGlnbiI6IDEsCiAgICAid2hpdGUtc3BhY2UiOiAxLAogICAgIndpZHRoIjogMSwKICAgICJ3b3JkLXNwYWNpbmciOiAxCiAgICAKfTsKCnZhciBMZXZlbDJQcm9wZXJ0aWVzID0gewoKICAgIC8vQXVyYWwKICAgICJhemltdXRoIjogMSwKICAgICJjdWUtYWZ0ZXIiOiAxLAogICAgImN1ZS1iZWZvcmUiOiAxLAogICAgImN1ZSI6IDEsCiAgICAiZWxldmF0aW9uIjogMSwKICAgICJwYXVzZS1hZnRlciI6IDEsCiAgICAicGF1c2UtYmVmb3JlIjogMSwKICAgICJwYXVzZSI6IDEsCiAgICAicGl0Y2gtcmFuZ2UiOiAxLAogICAgInBpdGNoIjogMSwKICAgICJwbGF5LWR1cmluZyI6IDEsCiAgICAicmljaG5lc3MiOiAxLAogICAgInNwZWFrLWhlYWRlciI6IDEsCiAgICAic3BlYWstbnVtZXJhbCI6IDEsCiAgICAic3BlYWstcHVuY3R1YXRpb24iOiAxLAogICAgInNwZWFrIjogMSwKICAgICJzcGVlY2gtcmF0ZSI6IDEsCiAgICAic3RyZXNzIjogMSwKICAgICJ2b2ljZS1mYW1pbHkiOiAxLAogICAgInZvbHVtZSI6IDEsCiAgICAKICAgIC8vUGFnZWQKICAgICJvcnBoYW5zIjogMSwKICAgICJwYWdlLWJyZWFrLWFmdGVyIjogMSwKICAgICJwYWdlLWJyZWFrLWJlZm9yZSI6IDEsCiAgICAicGFnZS1icmVhay1pbnNpZGUiOiAxLAogICAgIndpZG93cyI6IDEsCgogICAgLy9JbnRlcmFjdGl2ZQogICAgImN1cnNvciI6IDEsCiAgICAib3V0bGluZS1jb2xvciI6IDEsCiAgICAib3V0bGluZS1zdHlsZSI6IDEsCiAgICAib3V0bGluZS13aWR0aCI6IDEsCiAgICAib3V0bGluZSI6IDEsICAgIAogICAgCiAgICAvL1Zpc3VhbAogICAgImJhY2tncm91bmQtYXR0YWNobWVudCI6IDEsCiAgICAiYmFja2dyb3VuZC1jb2xvciI6IDEsCiAgICAiYmFja2dyb3VuZC1pbWFnZSI6IDEsCiAgICAiYmFja2dyb3VuZC1wb3NpdGlvbiI6IDEsCiAgICAiYmFja2dyb3VuZC1yZXBlYXQiOiAxLAogICAgImJhY2tncm91bmQiOiAxLCAgICAKICAgICJib3JkZXItY29sbGFwc2UiOiAxLAogICAgImJvcmRlci1jb2xvciI6IDEsCiAgICAiYm9yZGVyLXNwYWNpbmciOiAxLAogICAgImJvcmRlci1zdHlsZSI6IDEsCiAgICAiYm9yZGVyLXRvcCI6IDEsCiAgICAiYm9yZGVyLXRvcC1jb2xvciI6IDEsCiAgICAiYm9yZGVyLXRvcC1zdHlsZSI6IDEsCiAgICAiYm9yZGVyLXRvcC13aWR0aCI6IDEsCiAgICAiYm9yZGVyLXdpZHRoIjogMSwKICAgICJib3JkZXIiOiAxLAogICAgImJvdHRvbSI6IDEsICAgIAogICAgImNhcHRpb24tc2lkZSI6IDEsCiAgICAiY2xlYXIiOiAxLAogICAgImNsaXAiOiAxLAogICAgImNvbG9yIjogMSwKICAgICJjb250ZW50IjogMSwKICAgICJjb3VudGVyLWluY3JlbWVudCI6IDEsCiAgICAiY291bnRlci1yZXNldCI6IDEsCiAgICAiZGlyZWN0aW9uIjogMSwKICAgICJkaXNwbGF5IjogMSwKICAgICJlbXB0eS1jZWxscyI6IDEsCiAgICAiZmxvYXQiOiAxLAogICAgImZvbnQtZmFtaWx5IjogMSwKICAgICJmb250LXNpemUiOiAxLAogICAgImZvbnQtc3R5bGUiOiAxLAogICAgImZvbnQtdmFyaWFudCI6IDEsCiAgICAiZm9udC13ZWlnaHQiOiAxLAogICAgImZvbnQiOiAxLAogICAgImhlaWdodCI6IDEsCiAgICAibGVmdCI6IDEsCiAgICAibGV0dGVyLXNwYWNpbmciOiAxLAogICAgImxpbmUtaGVpZ2h0IjogMSwKICAgICJsaXN0LXN0eWxlLWltYWdlIjogMSwKICAgICJsaXN0LXN0eWxlLXBvc2l0aW9uIjogMSwKICAgICJsaXN0LXN0eWxlLXR5cGUiOiAxLAogICAgImxpc3Qtc3R5bGUiOiAxLAogICAgIm1hcmdpbi1yaWdodCI6IDEsCiAgICAibWFyZ2luLXRvcCI6IDEsCiAgICAibWFyZ2luIjogMSwKICAgICJtYXgtaGVpZ2h0IjogMSwKICAgICJtYXgtd2lkdGgiOiAxLAogICAgIm1pbi1oZWlnaHQiOiAxLAogICAgIm1pbi13aWR0aCI6IDEsCiAgICAib3ZlcmZsb3ciOiAxLAogICAgInBhZGRpbmctdG9wIjogMSwKICAgICJwYWRkaW5nIjogMSwKICAgICJwb3NpdGlvbiI6IDEsCiAgICAicXVvdGVzIjogMSwKICAgICJyaWdodCI6IDEsCiAgICAidGFibGUtbGF5b3V0IjogMSwKICAgICJ0ZXh0LWFsaWduIjogMSwKICAgICJ0ZXh0LWRlY29yYXRpb24iOiAxLAogICAgInRleHQtaW5kZW50IjogMSwKICAgICJ0ZXh0LXRyYW5zZm9ybSI6IDEsCiAgICAidG9wIjogMSwKICAgICJ1bmljb2RlLWJpZGkiOiAxLAogICAgInZlcnRpY2FsLWFsaWduIjogMSwKICAgICJ2aXNpYmlsaXR5IjogMSwKICAgICJ3aGl0ZS1zcGFjZSI6IDEsCiAgICAid2lkdGgiOiAxLAogICAgIndvcmQtc3BhY2luZyI6IDEsCiAgICAiei1pbmRleCI6IDEKfTsKLyoqCiAqIFJlcHJlc2VudHMgYSBtZWRpYSBmZWF0dXJlLCBzdWNoIGFzIG1heC13aWR0aDo1MDAuCiAqIEBuYW1lc3BhY2UgcGFyc2VybGliLmNzcwogKiBAY2xhc3MgTWVkaWFGZWF0dXJlCiAqIEBleHRlbmRzIHBhcnNlcmxpYi51dGlsLlN5bnRheFVuaXQKICogQGNvbnN0cnVjdG9yCiAqIEBwYXJhbSB7U3ludGF4VW5pdH0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZmVhdHVyZS4KICogQHBhcmFtIHtTeW50YXhVbml0fSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZlYXR1cmUgb3IgbnVsbCBpZiBub25lLgogKi8KZnVuY3Rpb24gTWVkaWFGZWF0dXJlKG5hbWUsIHZhbHVlKXsKICAgIAogICAgU3ludGF4VW5pdC5jYWxsKHRoaXMsICIoIiArIG5hbWUgKyAodmFsdWUgIT09IG51bGwgPyAiOiIgKyB2YWx1ZSA6ICIiKSArICIpIiwgbmFtZS5zdGFydExpbmUsIG5hbWUuc3RhcnRDb2wpOwoKICAgIC8qKgogICAgICogVGhlIG5hbWUgb2YgdGhlIG1lZGlhIGZlYXR1cmUKICAgICAqIEB0eXBlIFN0cmluZwogICAgICogQHByb3BlcnR5IG5hbWUKICAgICAqLwogICAgdGhpcy5uYW1lID0gbmFtZTsKCiAgICAvKioKICAgICAqIFRoZSB2YWx1ZSBmb3IgdGhlIGZlYXR1cmUgb3IgbnVsbCBpZiB0aGVyZSBpcyBub25lLgogICAgICogQHR5cGUgU3ludGF4VW5pdAogICAgICogQHByb3BlcnR5IHZhbHVlCiAgICAgKi8KICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKfQoKTWVkaWFGZWF0dXJlLnByb3RvdHlwZSA9IG5ldyBTeW50YXhVbml0KCk7Ck1lZGlhRmVhdHVyZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZWRpYUZlYXR1cmU7CgoKLyoqCiAqIFJlcHJlc2VudHMgYW4gaW5kaXZpZHVhbCBtZWRpYSBxdWVyeS4KICogQG5hbWVzcGFjZSBwYXJzZXJsaWIuY3NzCiAqIEBjbGFzcyBNZWRpYVF1ZXJ5CiAqIEBleHRlbmRzIHBhcnNlcmxpYi51dGlsLlN5bnRheFVuaXQKICogQGNvbnN0cnVjdG9yCiAqIEBwYXJhbSB7U3RyaW5nfSBtb2RpZmllciBUaGUgbW9kaWZpZXIgIm5vdCIgb3IgIm9ubHkiIChvciBudWxsKS4KICogQHBhcmFtIHtTdHJpbmd9IG1lZGlhVHlwZSBUaGUgdHlwZSBvZiBtZWRpYSAoaS5lLiwgInByaW50IikuCiAqIEBwYXJhbSB7QXJyYXl9IHBhcnRzIEFycmF5IG9mIHNlbGVjdG9ycyBwYXJ0cyBtYWtpbmcgdXAgdGhpcyBzZWxlY3Rvci4KICogQHBhcmFtIHtpbnR9IGxpbmUgVGhlIGxpbmUgb2YgdGV4dCBvbiB3aGljaCB0aGUgdW5pdCByZXNpZGVzLgogKiBAcGFyYW0ge2ludH0gY29sIFRoZSBjb2x1bW4gb2YgdGV4dCBvbiB3aGljaCB0aGUgdW5pdCByZXNpZGVzLgogKi8KZnVuY3Rpb24gTWVkaWFRdWVyeShtb2RpZmllciwgbWVkaWFUeXBlLCBmZWF0dXJlcywgbGluZSwgY29sKXsKICAgIAogICAgU3ludGF4VW5pdC5jYWxsKHRoaXMsIChtb2RpZmllciA/IG1vZGlmaWVyICsgIiAiOiAiIikgKyAobWVkaWFUeXBlID8gbWVkaWFUeXBlICsgIiAiIDogIiIpICsgZmVhdHVyZXMuam9pbigiIGFuZCAiKSwgbGluZSwgY29sKTsKCiAgICAvKioKICAgICAqIFRoZSBtZWRpYSBtb2RpZmllciAoIm5vdCIgb3IgIm9ubHkiKQogICAgICogQHR5cGUgU3RyaW5nCiAgICAgKiBAcHJvcGVydHkgbW9kaWZpZXIKICAgICAqLwogICAgdGhpcy5tb2RpZmllciA9IG1vZGlmaWVyOwoKICAgIC8qKgogICAgICogVGhlIG1lZGlhVHlwZSAoaS5lLiwgInByaW50IikKICAgICAqIEB0eXBlIFN0cmluZwogICAgICogQHByb3BlcnR5IG1lZGlhVHlwZQogICAgICovCiAgICB0aGlzLm1lZGlhVHlwZSA9IG1lZGlhVHlwZTsgICAgCiAgICAKICAgIC8qKgogICAgICogVGhlIHBhcnRzIHRoYXQgbWFrZSB1cCB0aGUgc2VsZWN0b3IuCiAgICAgKiBAdHlwZSBBcnJheQogICAgICogQHByb3BlcnR5IGZlYXR1cmVzCiAgICAgKi8KICAgIHRoaXMuZmVhdHVyZXMgPSBmZWF0dXJlczsKCn0KCk1lZGlhUXVlcnkucHJvdG90eXBlID0gbmV3IFN5bnRheFVuaXQoKTsKTWVkaWFRdWVyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZWRpYVF1ZXJ5OwoKCi8qKgogKiBBIENTUzMgcGFyc2VyLgogKiBAbmFtZXNwYWNlIHBhcnNlcmxpYi5jc3MKICogQGNsYXNzIFBhcnNlcgogKiBAY29uc3RydWN0b3IKICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgKE9wdGlvbmFsKSBWYXJpb3VzIG9wdGlvbnMgZm9yIHRoZSBwYXJzZXI6CiAqICAgICAgc3RhckhhY2sgKHRydWV8ZmFsc2UpIHRvIGFsbG93IElFNiBzdGFyIGhhY2sgYXMgdmFsaWQsCiAqICAgICAgdW5kZXJzY29yZUhhY2sgKHRydWV8ZmFsc2UpIHRvIGludGVycHJldCBsZWFkaW5nIHVuZGVyc2NvcmVzCiAqICAgICAgYXMgSUU2LTcgdGFyZ2V0aW5nIGZvciBrbm93biBwcm9wZXJ0aWVzLCBpZUZpbHRlcnMgKHRydWV8ZmFsc2UpCiAqICAgICAgdG8gaW5kaWNhdGUgdGhhdCBJRSA8IDggZmlsdGVycyBzaG91bGQgYmUgYWNjZXB0ZWQgYW5kIG5vdCB0aHJvdwogKiAgICAgIHN5bnRheCBlcnJvcnMuCiAqLwpmdW5jdGlvbiBQYXJzZXIob3B0aW9ucyl7CgogICAgLy9pbmhlcml0IGV2ZW50IGZ1bmN0aW9uYWxpdHkKICAgIEV2ZW50VGFyZ2V0LmNhbGwodGhpcyk7CgoKICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307CgogICAgdGhpcy5fdG9rZW5TdHJlYW0gPSBudWxsOwp9CgpQYXJzZXIucHJvdG90eXBlID0gZnVuY3Rpb24oKXsKCiAgICB2YXIgcHJvdG8gPSBuZXcgRXZlbnRUYXJnZXQoKSwgIC8vbmV3IHByb3RvdHlwZQogICAgICAgIHByb3AsCiAgICAgICAgYWRkaXRpb25zID0gIHsKICAgICAgICAKICAgICAgICAgICAgLy9yZXN0b3JlIGNvbnN0cnVjdG9yCiAgICAgICAgICAgIGNvbnN0cnVjdG9yOiBQYXJzZXIsCiAgICAgICAgCiAgICAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgLy8gR3JhbW1hcgogICAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgCiAgICAgICAgICAgIF9zdHlsZXNoZWV0OiBmdW5jdGlvbigpewogICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBzdHlsZXNoZWV0CiAgICAgICAgICAgICAgICAgKiAgOiBbIENIQVJTRVRfU1lNIFMqIFNUUklORyBTKiAnOycgXT8KICAgICAgICAgICAgICAgICAqICAgIFtTfENET3xDRENdKiBbIGltcG9ydCBbU3xDRE98Q0RDXSogXSoKICAgICAgICAgICAgICAgICAqICAgIFsgbmFtZXNwYWNlIFtTfENET3xDRENdKiBdKgogICAgICAgICAgICAgICAgICogICAgWyBbIHJ1bGVzZXQgfCBtZWRpYSB8IHBhZ2UgfCBmb250X2ZhY2UgfCBrZXlmcmFtZXMgXSBbU3xDRE98Q0RDXSogXSoKICAgICAgICAgICAgICAgICAqICA7CiAgICAgICAgICAgICAgICAgKi8gCiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgY2hhcnNldCAgICAgPSBudWxsLAogICAgICAgICAgICAgICAgICAgIHRva2VuLAogICAgICAgICAgICAgICAgICAgIHR0OwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGhpcy5maXJlKCJzdGFydHN0eWxlc2hlZXQiKTsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL3RyeSB0byByZWFkIGNoYXJhY3RlciBzZXQKICAgICAgICAgICAgICAgIHRoaXMuX2NoYXJzZXQoKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGhpcy5fc2tpcENydWZ0KCk7CgogICAgICAgICAgICAgICAgLy90cnkgdG8gcmVhZCBpbXBvcnRzIC0gbWF5IGJlIG1vcmUgdGhhbiBvbmUKICAgICAgICAgICAgICAgIHdoaWxlICh0b2tlblN0cmVhbS5wZWVrKCkgPT0gVG9rZW5zLklNUE9SVF9TWU0pewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2ltcG9ydCgpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NraXBDcnVmdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL3RyeSB0byByZWFkIG5hbWVzcGFjZXMgLSBtYXkgYmUgbW9yZSB0aGFuIG9uZQogICAgICAgICAgICAgICAgd2hpbGUgKHRva2VuU3RyZWFtLnBlZWsoKSA9PSBUb2tlbnMuTkFNRVNQQUNFX1NZTSl7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbmFtZXNwYWNlKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2tpcENydWZ0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vZ2V0IHRoZSBuZXh0IHRva2VuCiAgICAgICAgICAgICAgICB0dCA9IHRva2VuU3RyZWFtLnBlZWsoKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy90cnkgdG8gcmVhZCB0aGUgcmVzdAogICAgICAgICAgICAgICAgd2hpbGUodHQgPiBUb2tlbnMuRU9GKXsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHR0KXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5zLk1FRElBX1NZTToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tZWRpYSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NraXBDcnVmdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tlbnMuUEFHRV9TWU06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFnZSgpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9za2lwQ3J1ZnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRva2Vucy5GT05UX0ZBQ0VfU1lNOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZvbnRfZmFjZSgpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9za2lwQ3J1ZnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tlbnMuS0VZRlJBTUVTX1NZTToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlmcmFtZXMoKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2tpcENydWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5zLlM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF0aGlzLl9ydWxlc2V0KCkpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Vycm9yIGhhbmRsaW5nIGZvciBrbm93biBpc3N1ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHR0KXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5zLkNIQVJTRVRfU1lNOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5TdHJlYW0uTFQoMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhcnNldChmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCJAY2hhcnNldCBub3QgYWxsb3dlZCBoZXJlLiIsIHRva2VuLnN0YXJ0TGluZSwgdG9rZW4uc3RhcnRDb2wpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tlbnMuSU1QT1JUX1NZTToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuU3RyZWFtLkxUKDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ltcG9ydChmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCJAaW1wb3J0IG5vdCBhbGxvd2VkIGhlcmUuIiwgdG9rZW4uc3RhcnRMaW5lLCB0b2tlbi5zdGFydENvbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRva2Vucy5OQU1FU1BBQ0VfU1lNOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5TdHJlYW0uTFQoMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbmFtZXNwYWNlKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkBuYW1lc3BhY2Ugbm90IGFsbG93ZWQgaGVyZS4iLCB0b2tlbi5zdGFydExpbmUsIHRva2VuLnN0YXJ0Q29sKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0uZ2V0KCk7ICAvL2dldCB0aGUgbGFzdCB0b2tlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VuZXhwZWN0ZWRUb2tlbih0b2tlblN0cmVhbS50b2tlbigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgU3ludGF4RXJyb3IgJiYgIXRoaXMub3B0aW9ucy5zdHJpY3QpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAgICAgICAiZXJyb3IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAgICAgIGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICAgIGV4Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogICAgICAgZXgubGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2w6ICAgICAgICBleC5jb2wKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOyAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgdHQgPSB0b2tlblN0cmVhbS5wZWVrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICh0dCAhPSBUb2tlbnMuRU9GKXsKICAgICAgICAgICAgICAgICAgICB0aGlzLl91bmV4cGVjdGVkVG9rZW4odG9rZW5TdHJlYW0udG9rZW4oKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGhpcy5maXJlKCJlbmRzdHlsZXNoZWV0Iik7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIAogICAgICAgICAgICBfY2hhcnNldDogZnVuY3Rpb24oZW1pdCl7CiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwKICAgICAgICAgICAgICAgICAgICBjaGFyc2V0LAogICAgICAgICAgICAgICAgICAgIHRva2VuLAogICAgICAgICAgICAgICAgICAgIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgY29sOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5DSEFSU0VUX1NZTSkpewogICAgICAgICAgICAgICAgICAgIGxpbmUgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0TGluZTsKICAgICAgICAgICAgICAgICAgICBjb2wgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0Q29sOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsKICAgICAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tdXN0TWF0Y2goVG9rZW5zLlNUUklORyk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlblN0cmVhbS50b2tlbigpOwogICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSB0b2tlbi52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuU0VNSUNPTE9OKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBpZiAoZW1pdCAhPT0gZmFsc2UpewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmUoeyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICAgImNoYXJzZXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldDpjaGFyc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogICBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sOiAgICBjb2wKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSAgICAgICAgICAgIAogICAgICAgICAgICB9LAogICAgICAgICAgICAKICAgICAgICAgICAgX2ltcG9ydDogZnVuY3Rpb24oZW1pdCl7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogaW1wb3J0CiAgICAgICAgICAgICAgICAgKiAgIDogSU1QT1JUX1NZTSBTKgogICAgICAgICAgICAgICAgICogICAgW1NUUklOR3xVUkldIFMqIG1lZGlhX3F1ZXJ5X2xpc3Q/ICc7JyBTKgogICAgICAgICAgICAgICAgICovICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLAogICAgICAgICAgICAgICAgICAgIHR0LAogICAgICAgICAgICAgICAgICAgIHVyaSwKICAgICAgICAgICAgICAgICAgICBpbXBvcnRUb2tlbiwKICAgICAgICAgICAgICAgICAgICBtZWRpYUxpc3QgICA9IFtdOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL3JlYWQgaW1wb3J0IHN5bWJvbAogICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0ubXVzdE1hdGNoKFRva2Vucy5JTVBPUlRfU1lNKTsKICAgICAgICAgICAgICAgIGltcG9ydFRva2VuID0gdG9rZW5TdHJlYW0udG9rZW4oKTsKICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChbVG9rZW5zLlNUUklORywgVG9rZW5zLlVSSV0pOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL2dyYWIgdGhlIFVSSSB2YWx1ZQogICAgICAgICAgICAgICAgdXJpID0gdG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZS5yZXBsYWNlKC8oPzp1cmxcKCk/WyInXShbXiInXSspWyInXVwpPy8sICIkMSIpOyAgICAgICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBtZWRpYUxpc3QgPSB0aGlzLl9tZWRpYV9xdWVyeV9saXN0KCk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vbXVzdCBlbmQgd2l0aCBhIHNlbWljb2xvbgogICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0ubXVzdE1hdGNoKFRva2Vucy5TRU1JQ09MT04pOwogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKGVtaXQgIT09IGZhbHNlKXsKICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmUoewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAgICJpbXBvcnQiLAogICAgICAgICAgICAgICAgICAgICAgICB1cmk6ICAgIHVyaSwKICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6ICBtZWRpYUxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6ICAgaW1wb3J0VG9rZW4uc3RhcnRMaW5lLAogICAgICAgICAgICAgICAgICAgICAgICBjb2w6ICAgIGltcG9ydFRva2VuLnN0YXJ0Q29sCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIAogICAgICAgICAgICBfbmFtZXNwYWNlOiBmdW5jdGlvbihlbWl0KXsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBuYW1lc3BhY2UKICAgICAgICAgICAgICAgICAqICAgOiBOQU1FU1BBQ0VfU1lNIFMqIFtuYW1lc3BhY2VfcHJlZml4IFMqXT8gW1NUUklOR3xVUkldIFMqICc7JyBTKgogICAgICAgICAgICAgICAgICovICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLAogICAgICAgICAgICAgICAgICAgIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgY29sLAogICAgICAgICAgICAgICAgICAgIHByZWZpeCwKICAgICAgICAgICAgICAgICAgICB1cmk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vcmVhZCBpbXBvcnQgc3ltYm9sCiAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tdXN0TWF0Y2goVG9rZW5zLk5BTUVTUEFDRV9TWU0pOwogICAgICAgICAgICAgICAgbGluZSA9IHRva2VuU3RyZWFtLnRva2VuKCkuc3RhcnRMaW5lOwogICAgICAgICAgICAgICAgY29sID0gdG9rZW5TdHJlYW0udG9rZW4oKS5zdGFydENvbDsKICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vaXQncyBhIG5hbWVzcGFjZSBwcmVmaXggLSBubyBfbmFtZXNwYWNlX3ByZWZpeCgpIG1ldGhvZCBiZWNhdXNlIGl0J3MganVzdCBhbiBJREVOVAogICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5JREVOVCkpewogICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHRva2VuU3RyZWFtLnRva2VuKCkudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0ubXVzdE1hdGNoKFtUb2tlbnMuU1RSSU5HLCBUb2tlbnMuVVJJXSk7CiAgICAgICAgICAgICAgICAvKmlmICghdG9rZW5TdHJlYW0ubWF0Y2goVG9rZW5zLlNUUklORykpewogICAgICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuVVJJKTsKICAgICAgICAgICAgICAgIH0qLwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL2dyYWIgdGhlIFVSSSB2YWx1ZQogICAgICAgICAgICAgICAgdXJpID0gdG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZS5yZXBsYWNlKC8oPzp1cmxcKCk/WyInXShbXiInXSspWyInXVwpPy8sICIkMSIpOyAgICAgICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOwoKICAgICAgICAgICAgICAgIC8vbXVzdCBlbmQgd2l0aCBhIHNlbWljb2xvbgogICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0ubXVzdE1hdGNoKFRva2Vucy5TRU1JQ09MT04pOwogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKGVtaXQgIT09IGZhbHNlKXsKICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmUoewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAgICJuYW1lc3BhY2UiLAogICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg6IHByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgdXJpOiAgICB1cmksCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6ICAgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgY29sOiAgICBjb2wKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAKICAgICAgICAgICAgfSwgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgX21lZGlhOiBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIG1lZGlhCiAgICAgICAgICAgICAgICAgKiAgIDogTUVESUFfU1lNIFMqIG1lZGlhX3F1ZXJ5X2xpc3QgUyogJ3snIFMqIHJ1bGVzZXQqICd9JyBTKgogICAgICAgICAgICAgICAgICogICA7CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSAgICAgPSB0aGlzLl90b2tlblN0cmVhbSwKICAgICAgICAgICAgICAgICAgICBsaW5lLAogICAgICAgICAgICAgICAgICAgIGNvbCwKICAgICAgICAgICAgICAgICAgICBtZWRpYUxpc3Q7Ly8gICAgICAgPSBbXTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy9sb29rIGZvciBAbWVkaWEKICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuTUVESUFfU1lNKTsKICAgICAgICAgICAgICAgIGxpbmUgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0TGluZTsKICAgICAgICAgICAgICAgIGNvbCA9IHRva2VuU3RyZWFtLnRva2VuKCkuc3RhcnRDb2w7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7ICAgICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgbWVkaWFMaXN0ID0gdGhpcy5fbWVkaWFfcXVlcnlfbGlzdCgpOwoKICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuTEJSQUNFKTsKICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHRoaXMuZmlyZSh7CiAgICAgICAgICAgICAgICAgICAgdHlwZTogICAic3RhcnRtZWRpYSIsCiAgICAgICAgICAgICAgICAgICAgbWVkaWE6ICBtZWRpYUxpc3QsCiAgICAgICAgICAgICAgICAgICAgbGluZTogICBsaW5lLAogICAgICAgICAgICAgICAgICAgIGNvbDogICAgY29sCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgd2hpbGUodHJ1ZSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5wZWVrKCkgPT0gVG9rZW5zLlBBR0VfU1lNKXsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFnZSgpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX3J1bGVzZXQoKSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuUkJSQUNFKTsKICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7CiAgICAgICAgCiAgICAgICAgICAgICAgICB0aGlzLmZpcmUoewogICAgICAgICAgICAgICAgICAgIHR5cGU6ICAgImVuZG1lZGlhIiwKICAgICAgICAgICAgICAgICAgICBtZWRpYTogIG1lZGlhTGlzdCwKICAgICAgICAgICAgICAgICAgICBsaW5lOiAgIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgY29sOiAgICBjb2wKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgIAoKICAgICAgICAgICAgLy9DU1MzIE1lZGlhIFF1ZXJpZXMKICAgICAgICAgICAgX21lZGlhX3F1ZXJ5X2xpc3Q6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogbWVkaWFfcXVlcnlfbGlzdAogICAgICAgICAgICAgICAgICogICA6IFMqIFttZWRpYV9xdWVyeSBbICcsJyBTKiBtZWRpYV9xdWVyeSBdKiBdPwogICAgICAgICAgICAgICAgICogICA7CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLAogICAgICAgICAgICAgICAgICAgIG1lZGlhTGlzdCAgID0gW107CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLnBlZWsoKSA9PSBUb2tlbnMuSURFTlQgfHwgdG9rZW5TdHJlYW0ucGVlaygpID09IFRva2Vucy5MUEFSRU4pewogICAgICAgICAgICAgICAgICAgIG1lZGlhTGlzdC5wdXNoKHRoaXMuX21lZGlhX3F1ZXJ5KCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB3aGlsZSh0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuQ09NTUEpKXsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgICAgICAgIG1lZGlhTGlzdC5wdXNoKHRoaXMuX21lZGlhX3F1ZXJ5KCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZXR1cm4gbWVkaWFMaXN0OwogICAgICAgICAgICB9LAogICAgICAgICAgICAKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogTm90ZTogImV4cHJlc3Npb24iIGluIHRoZSBncmFtbWFyIG1hcHMgdG8gdGhlIF9tZWRpYV9leHByZXNzaW9uCiAgICAgICAgICAgICAqIG1ldGhvZC4KICAgICAgICAgICAgIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgX21lZGlhX3F1ZXJ5OiBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIG1lZGlhX3F1ZXJ5CiAgICAgICAgICAgICAgICAgKiAgIDogW09OTFkgfCBOT1RdPyBTKiBtZWRpYV90eXBlIFMqIFsgQU5EIFMqIGV4cHJlc3Npb24gXSoKICAgICAgICAgICAgICAgICAqICAgfCBleHByZXNzaW9uIFsgQU5EIFMqIGV4cHJlc3Npb24gXSoKICAgICAgICAgICAgICAgICAqICAgOwogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwKICAgICAgICAgICAgICAgICAgICB0eXBlICAgICAgICA9IG51bGwsCiAgICAgICAgICAgICAgICAgICAgaWRlbnQgICAgICAgPSBudWxsLAogICAgICAgICAgICAgICAgICAgIHRva2VuICAgICAgID0gbnVsbCwKICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9ucyA9IFtdOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5JREVOVCkpewogICAgICAgICAgICAgICAgICAgIGlkZW50ID0gdG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8vc2luY2UgdGhlcmUncyBubyBjdXN0b20gdG9rZW5zIGZvciB0aGVzZSwgbmVlZCB0byBtYW51YWxseSBjaGVjawogICAgICAgICAgICAgICAgICAgIGlmIChpZGVudCAhPSAib25seSIgJiYgaWRlbnQgIT0gIm5vdCIpewogICAgICAgICAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS51bmdldCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZGVudCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlblN0cmVhbS50b2tlbigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5wZWVrKCkgPT0gVG9rZW5zLklERU5UKXsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gdGhpcy5fbWVkaWFfdHlwZSgpOwogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gbnVsbCl7CiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5TdHJlYW0udG9rZW4oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuU3RyZWFtLnBlZWsoKSA9PSBUb2tlbnMuTFBBUkVOKXsKICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4gPT09IG51bGwpewogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuU3RyZWFtLkxUKDEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9ucy5wdXNoKHRoaXMuX21lZGlhX2V4cHJlc3Npb24oKSk7CiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gbnVsbCAmJiBleHByZXNzaW9ucy5sZW5ndGggPT09IDApewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAodG9rZW5TdHJlYW0ubWF0Y2goVG9rZW5zLklERU5UKSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS50b2tlbigpLnZhbHVlLnRvTG93ZXJDYXNlKCkgIT0gImFuZCIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdW5leHBlY3RlZFRva2VuKHRva2VuU3RyZWFtLnRva2VuKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9ucy5wdXNoKHRoaXMuX21lZGlhX2V4cHJlc3Npb24oKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFRdWVyeShpZGVudCwgdHlwZSwgZXhwcmVzc2lvbnMsIHRva2VuLnN0YXJ0TGluZSwgdG9rZW4uc3RhcnRDb2wpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy9DU1MzIE1lZGlhIFF1ZXJpZXMKICAgICAgICAgICAgX21lZGlhX3R5cGU6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogbWVkaWFfdHlwZQogICAgICAgICAgICAgICAgICogICA6IElERU5UCiAgICAgICAgICAgICAgICAgKiAgIDsKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21lZGlhX2ZlYXR1cmUoKTsgICAgICAgICAgIAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIE5vdGU6IGluIENTUzMgTWVkaWEgUXVlcmllcywgdGhpcyBpcyBjYWxsZWQgImV4cHJlc3Npb24iLgogICAgICAgICAgICAgKiBSZW5hbWVkIGhlcmUgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBDU1MzIFNlbGVjdG9ycwogICAgICAgICAgICAgKiBkZWZpbml0aW9uIG9mICJleHByZXNzaW9uIi4gQWxzbyBub3RlIHRoYXQgImV4cHIiIGluIHRoZQogICAgICAgICAgICAgKiBncmFtbWFyIG5vdyBtYXBzIHRvICJleHByZXNzaW9uIiBmcm9tIENTUzMgc2VsZWN0b3JzLgogICAgICAgICAgICAgKiBAbWV0aG9kIF9tZWRpYV9leHByZXNzaW9uCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBfbWVkaWFfZXhwcmVzc2lvbjogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBleHByZXNzaW9uCiAgICAgICAgICAgICAgICAgKiAgOiAnKCcgUyogbWVkaWFfZmVhdHVyZSBTKiBbICc6JyBTKiBleHByIF0/ICcpJyBTKgogICAgICAgICAgICAgICAgICogIDsKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgZmVhdHVyZSAgICAgPSBudWxsLAogICAgICAgICAgICAgICAgICAgIHRva2VuLAogICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gID0gbnVsbDsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0ubXVzdE1hdGNoKFRva2Vucy5MUEFSRU4pOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBmZWF0dXJlID0gdGhpcy5fbWVkaWFfZmVhdHVyZSgpOwogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5DT0xPTikpewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlblN0cmVhbS5MVCgxKTsKICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uID0gdGhpcy5fZXhwcmVzc2lvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tdXN0TWF0Y2goVG9rZW5zLlJQQVJFTik7CiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOwoKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFGZWF0dXJlKGZlYXR1cmUsIChleHByZXNzaW9uID8gbmV3IFN5bnRheFVuaXQoZXhwcmVzc2lvbiwgdG9rZW4uc3RhcnRMaW5lLCB0b2tlbi5zdGFydENvbCkgOiBudWxsKSk7ICAgICAgICAgICAgCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvL0NTUzMgTWVkaWEgUXVlcmllcwogICAgICAgICAgICBfbWVkaWFfZmVhdHVyZTogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBtZWRpYV9mZWF0dXJlCiAgICAgICAgICAgICAgICAgKiAgIDogSURFTlQKICAgICAgICAgICAgICAgICAqICAgOwogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuSURFTlQpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZXR1cm4gU3ludGF4VW5pdC5mcm9tVG9rZW4odG9rZW5TdHJlYW0udG9rZW4oKSk7ICAgICAgICAgICAgCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIAogICAgICAgICAgICAvL0NTUzMgUGFnZWQgTWVkaWEKICAgICAgICAgICAgX3BhZ2U6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogcGFnZToKICAgICAgICAgICAgICAgICAqICAgIFBBR0VfU1lNIFMqIElERU5UPyBwc2V1ZG9fcGFnZT8gUyogCiAgICAgICAgICAgICAgICAgKiAgICAneycgUyogWyBkZWNsYXJhdGlvbiB8IG1hcmdpbiBdPyBbICc7JyBTKiBbIGRlY2xhcmF0aW9uIHwgbWFyZ2luIF0/IF0qICd9JyBTKgogICAgICAgICAgICAgICAgICogICAgOwogICAgICAgICAgICAgICAgICovICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwKICAgICAgICAgICAgICAgICAgICBsaW5lLAogICAgICAgICAgICAgICAgICAgIGNvbCwKICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyICA9IG51bGwsCiAgICAgICAgICAgICAgICAgICAgcHNldWRvUGFnZSAgPSBudWxsOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL2xvb2sgZm9yIEBwYWdlCiAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tdXN0TWF0Y2goVG9rZW5zLlBBR0VfU1lNKTsKICAgICAgICAgICAgICAgIGxpbmUgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0TGluZTsKICAgICAgICAgICAgICAgIGNvbCA9IHRva2VuU3RyZWFtLnRva2VuKCkuc3RhcnRDb2w7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuSURFTlQpKXsKICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyID0gdG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgLy9UaGUgdmFsdWUgJ2F1dG8nIG1heSBub3QgYmUgdXNlZCBhcyBhIHBhZ2UgbmFtZSBhbmQgTVVTVCBiZSB0cmVhdGVkIGFzIGEgc3ludGF4IGVycm9yLgogICAgICAgICAgICAgICAgICAgIGlmIChpZGVudGlmaWVyLnRvTG93ZXJDYXNlKCkgPT09ICJhdXRvIil7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VuZXhwZWN0ZWRUb2tlbih0b2tlblN0cmVhbS50b2tlbigpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL3NlZSBpZiB0aGVyZSdzIGEgY29sb24gdXBjb21pbmcKICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5wZWVrKCkgPT0gVG9rZW5zLkNPTE9OKXsKICAgICAgICAgICAgICAgICAgICBwc2V1ZG9QYWdlID0gdGhpcy5fcHNldWRvX3BhZ2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB0aGlzLmZpcmUoewogICAgICAgICAgICAgICAgICAgIHR5cGU6ICAgInN0YXJ0cGFnZSIsCiAgICAgICAgICAgICAgICAgICAgaWQ6ICAgICBpZGVudGlmaWVyLAogICAgICAgICAgICAgICAgICAgIHBzZXVkbzogcHNldWRvUGFnZSwKICAgICAgICAgICAgICAgICAgICBsaW5lOiAgIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgY29sOiAgICBjb2wKICAgICAgICAgICAgICAgIH0pOyAgICAgICAgICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkRGVjbGFyYXRpb25zKHRydWUsIHRydWUpOyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGhpcy5maXJlKHsKICAgICAgICAgICAgICAgICAgICB0eXBlOiAgICJlbmRwYWdlIiwKICAgICAgICAgICAgICAgICAgICBpZDogICAgIGlkZW50aWZpZXIsCiAgICAgICAgICAgICAgICAgICAgcHNldWRvOiBwc2V1ZG9QYWdlLAogICAgICAgICAgICAgICAgICAgIGxpbmU6ICAgbGluZSwKICAgICAgICAgICAgICAgICAgICBjb2w6ICAgIGNvbAogICAgICAgICAgICAgICAgfSk7ICAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vQ1NTMyBQYWdlZCBNZWRpYQogICAgICAgICAgICBfbWFyZ2luOiBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIG1hcmdpbiA6CiAgICAgICAgICAgICAgICAgKiAgICBtYXJnaW5fc3ltIFMqICd7JyBkZWNsYXJhdGlvbiBbICc7JyBTKiBkZWNsYXJhdGlvbj8gXSogJ30nIFMqCiAgICAgICAgICAgICAgICAgKiAgICA7CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLAogICAgICAgICAgICAgICAgICAgIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgY29sLAogICAgICAgICAgICAgICAgICAgIG1hcmdpblN5bSAgID0gdGhpcy5fbWFyZ2luX3N5bSgpOwoKICAgICAgICAgICAgICAgIGlmIChtYXJnaW5TeW0pewogICAgICAgICAgICAgICAgICAgIGxpbmUgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0TGluZTsKICAgICAgICAgICAgICAgICAgICBjb2wgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0Q29sOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogInN0YXJ0cGFnZW1hcmdpbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjogbWFyZ2luU3ltLAogICAgICAgICAgICAgICAgICAgICAgICBsaW5lOiAgIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbDogICAgY29sCiAgICAgICAgICAgICAgICAgICAgfSk7ICAgIAogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWREZWNsYXJhdGlvbnModHJ1ZSk7CgogICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZSh7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJlbmRwYWdlbWFyZ2luIiwKICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiBtYXJnaW5TeW0sCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6ICAgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgY29sOiAgICBjb2wKICAgICAgICAgICAgICAgICAgICB9KTsgICAgCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8vQ1NTMyBQYWdlZCBNZWRpYQogICAgICAgICAgICBfbWFyZ2luX3N5bTogZnVuY3Rpb24oKXsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogbWFyZ2luX3N5bSA6CiAgICAgICAgICAgICAgICAgKiAgICBUT1BMRUZUQ09STkVSX1NZTSB8IAogICAgICAgICAgICAgICAgICogICAgVE9QTEVGVF9TWU0gfCAKICAgICAgICAgICAgICAgICAqICAgIFRPUENFTlRFUl9TWU0gfCAKICAgICAgICAgICAgICAgICAqICAgIFRPUFJJR0hUX1NZTSB8IAogICAgICAgICAgICAgICAgICogICAgVE9QUklHSFRDT1JORVJfU1lNIHwKICAgICAgICAgICAgICAgICAqICAgIEJPVFRPTUxFRlRDT1JORVJfU1lNIHwgCiAgICAgICAgICAgICAgICAgKiAgICBCT1RUT01MRUZUX1NZTSB8IAogICAgICAgICAgICAgICAgICogICAgQk9UVE9NQ0VOVEVSX1NZTSB8IAogICAgICAgICAgICAgICAgICogICAgQk9UVE9NUklHSFRfU1lNIHwKICAgICAgICAgICAgICAgICAqICAgIEJPVFRPTVJJR0hUQ09STkVSX1NZTSB8CiAgICAgICAgICAgICAgICAgKiAgICBMRUZUVE9QX1NZTSB8CiAgICAgICAgICAgICAgICAgKiAgICBMRUZUTUlERExFX1NZTSB8CiAgICAgICAgICAgICAgICAgKiAgICBMRUZUQk9UVE9NX1NZTSB8CiAgICAgICAgICAgICAgICAgKiAgICBSSUdIVFRPUF9TWU0gfAogICAgICAgICAgICAgICAgICogICAgUklHSFRNSURETEVfU1lNIHwKICAgICAgICAgICAgICAgICAqICAgIFJJR0hUQk9UVE9NX1NZTSAKICAgICAgICAgICAgICAgICAqICAgIDsKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtOwogICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmKHRva2VuU3RyZWFtLm1hdGNoKFtUb2tlbnMuVE9QTEVGVENPUk5FUl9TWU0sIFRva2Vucy5UT1BMRUZUX1NZTSwKICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW5zLlRPUENFTlRFUl9TWU0sIFRva2Vucy5UT1BSSUdIVF9TWU0sIFRva2Vucy5UT1BSSUdIVENPUk5FUl9TWU0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRva2Vucy5CT1RUT01MRUZUQ09STkVSX1NZTSwgVG9rZW5zLkJPVFRPTUxFRlRfU1lNLCAKICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW5zLkJPVFRPTUNFTlRFUl9TWU0sIFRva2Vucy5CT1RUT01SSUdIVF9TWU0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRva2Vucy5CT1RUT01SSUdIVENPUk5FUl9TWU0sIFRva2Vucy5MRUZUVE9QX1NZTSwgCiAgICAgICAgICAgICAgICAgICAgICAgIFRva2Vucy5MRUZUTUlERExFX1NZTSwgVG9rZW5zLkxFRlRCT1RUT01fU1lNLCBUb2tlbnMuUklHSFRUT1BfU1lNLAogICAgICAgICAgICAgICAgICAgICAgICBUb2tlbnMuUklHSFRNSURETEVfU1lNLCBUb2tlbnMuUklHSFRCT1RUT01fU1lNXSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN5bnRheFVuaXQuZnJvbVRva2VuKHRva2VuU3RyZWFtLnRva2VuKCkpOyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICB9LAogICAgICAgICAgICAKICAgICAgICAgICAgX3BzZXVkb19wYWdlOiBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIHBzZXVkb19wYWdlCiAgICAgICAgICAgICAgICAgKiAgIDogJzonIElERU5UCiAgICAgICAgICAgICAgICAgKiAgIDsgICAgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAKICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tdXN0TWF0Y2goVG9rZW5zLkNPTE9OKTsKICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuSURFTlQpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL1RPRE86IENTUzMgUGFnZWQgTWVkaWEgc2F5cyBvbmx5ICJsZWZ0IiwgImNlbnRlciIsIGFuZCAicmlnaHQiIGFyZSBhbGxvd2VkCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlblN0cmVhbS50b2tlbigpLnZhbHVlOwogICAgICAgICAgICB9LAogICAgICAgICAgICAKICAgICAgICAgICAgX2ZvbnRfZmFjZTogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBmb250X2ZhY2UKICAgICAgICAgICAgICAgICAqICAgOiBGT05UX0ZBQ0VfU1lNIFMqIAogICAgICAgICAgICAgICAgICogICAgICd7JyBTKiBkZWNsYXJhdGlvbiBbICc7JyBTKiBkZWNsYXJhdGlvbiBdKiAnfScgUyoKICAgICAgICAgICAgICAgICAqICAgOwogICAgICAgICAgICAgICAgICovICAgICAKICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLAogICAgICAgICAgICAgICAgICAgIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgY29sOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL2xvb2sgZm9yIEBwYWdlCiAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tdXN0TWF0Y2goVG9rZW5zLkZPTlRfRkFDRV9TWU0pOwogICAgICAgICAgICAgICAgbGluZSA9IHRva2VuU3RyZWFtLnRva2VuKCkuc3RhcnRMaW5lOwogICAgICAgICAgICAgICAgY29sID0gdG9rZW5TdHJlYW0udG9rZW4oKS5zdGFydENvbDsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsKCiAgICAgICAgICAgICAgICB0aGlzLmZpcmUoewogICAgICAgICAgICAgICAgICAgIHR5cGU6ICAgInN0YXJ0Zm9udGZhY2UiLAogICAgICAgICAgICAgICAgICAgIGxpbmU6ICAgbGluZSwKICAgICAgICAgICAgICAgICAgICBjb2w6ICAgIGNvbAogICAgICAgICAgICAgICAgfSk7ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGhpcy5fcmVhZERlY2xhcmF0aW9ucyh0cnVlKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGhpcy5maXJlKHsKICAgICAgICAgICAgICAgICAgICB0eXBlOiAgICJlbmRmb250ZmFjZSIsCiAgICAgICAgICAgICAgICAgICAgbGluZTogICBsaW5lLAogICAgICAgICAgICAgICAgICAgIGNvbDogICAgY29sCiAgICAgICAgICAgICAgICB9KTsgICAgICAgICAgICAgIAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgX29wZXJhdG9yOiBmdW5jdGlvbigpewogICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBvcGVyYXRvcgogICAgICAgICAgICAgICAgICogIDogJy8nIFMqIHwgJywnIFMqIHwgLyggZW1wdHkgKS8KICAgICAgICAgICAgICAgICAqICA7CiAgICAgICAgICAgICAgICAgKi8gICAgCiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwKICAgICAgICAgICAgICAgICAgICB0b2tlbiAgICAgICA9IG51bGw7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5tYXRjaChbVG9rZW5zLlNMQVNILCBUb2tlbnMuQ09NTUFdKSl7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSAgdG9rZW5TdHJlYW0udG9rZW4oKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbiA/IFByb3BlcnR5VmFsdWVQYXJ0LmZyb21Ub2tlbih0b2tlbikgOiBudWxsOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIAogICAgICAgICAgICBfY29tYmluYXRvcjogZnVuY3Rpb24oKXsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogY29tYmluYXRvcgogICAgICAgICAgICAgICAgICogIDogUExVUyBTKiB8IEdSRUFURVIgUyogfCBUSUxERSBTKiB8IFMrCiAgICAgICAgICAgICAgICAgKiAgOwogICAgICAgICAgICAgICAgICovICAgIAogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgICAgICAgPSBudWxsLAogICAgICAgICAgICAgICAgICAgIHRva2VuOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZih0b2tlblN0cmVhbS5tYXRjaChbVG9rZW5zLlBMVVMsIFRva2Vucy5HUkVBVEVSLCBUb2tlbnMuVElMREVdKSl7ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5TdHJlYW0udG9rZW4oKTsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ldyBDb21iaW5hdG9yKHRva2VuLnZhbHVlLCB0b2tlbi5zdGFydExpbmUsIHRva2VuLnN0YXJ0Q29sKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIAogICAgICAgICAgICBfdW5hcnlfb3BlcmF0b3I6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIHVuYXJ5X29wZXJhdG9yCiAgICAgICAgICAgICAgICAgKiAgOiAnLScgfCAnKycKICAgICAgICAgICAgICAgICAqICA7CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAodG9rZW5TdHJlYW0ubWF0Y2goW1Rva2Vucy5NSU5VUywgVG9rZW5zLlBMVVNdKSl7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuU3RyZWFtLnRva2VuKCkudmFsdWU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfSAgICAgICAgIAogICAgICAgICAgICB9LAogICAgICAgICAgICAKICAgICAgICAgICAgX3Byb3BlcnR5OiBmdW5jdGlvbigpewogICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBwcm9wZXJ0eQogICAgICAgICAgICAgICAgICogICA6IElERU5UIFMqCiAgICAgICAgICAgICAgICAgKiAgIDsgICAgICAgIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZSAgICAgICA9IG51bGwsCiAgICAgICAgICAgICAgICAgICAgaGFjayAgICAgICAgPSBudWxsLAogICAgICAgICAgICAgICAgICAgIHRva2VuVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgdG9rZW4sCiAgICAgICAgICAgICAgICAgICAgbGluZSwKICAgICAgICAgICAgICAgICAgICBjb2w7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL2NoZWNrIGZvciBzdGFyIGhhY2sgLSB0aHJvd3MgZXJyb3IgaWYgbm90IGFsbG93ZWQKICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5wZWVrKCkgPT0gVG9rZW5zLlNUQVIgJiYgdGhpcy5vcHRpb25zLnN0YXJIYWNrKXsKICAgICAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5nZXQoKTsKICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuU3RyZWFtLnRva2VuKCk7CiAgICAgICAgICAgICAgICAgICAgaGFjayA9IHRva2VuLnZhbHVlOwogICAgICAgICAgICAgICAgICAgIGxpbmUgPSB0b2tlbi5zdGFydExpbmU7CiAgICAgICAgICAgICAgICAgICAgY29sID0gdG9rZW4uc3RhcnRDb2w7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5JREVOVCkpewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5TdHJlYW0udG9rZW4oKTsKICAgICAgICAgICAgICAgICAgICB0b2tlblZhbHVlID0gdG9rZW4udmFsdWU7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgLy9jaGVjayBmb3IgdW5kZXJzY29yZSBoYWNrIC0gbm8gZXJyb3IgaWYgbm90IGFsbG93ZWQgYmVjYXVzZSBpdCdzIHZhbGlkIENTUyBzeW50YXgKICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5WYWx1ZS5jaGFyQXQoMCkgPT0gIl8iICYmIHRoaXMub3B0aW9ucy51bmRlcnNjb3JlSGFjayl7CiAgICAgICAgICAgICAgICAgICAgICAgIGhhY2sgPSAiXyI7CiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuVmFsdWUgPSB0b2tlblZhbHVlLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgUHJvcGVydHlOYW1lKHRva2VuVmFsdWUsIGhhY2ssIChsaW5lfHx0b2tlbi5zdGFydExpbmUpLCAoY29sfHx0b2tlbi5zdGFydENvbCkpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgfSwKICAgICAgICAKICAgICAgICAgICAgLy9BdWdtZW50ZWQgd2l0aCBDU1MzIFNlbGVjdG9ycwogICAgICAgICAgICBfcnVsZXNldDogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBydWxlc2V0CiAgICAgICAgICAgICAgICAgKiAgIDogc2VsZWN0b3JzX2dyb3VwCiAgICAgICAgICAgICAgICAgKiAgICAgJ3snIFMqIGRlY2xhcmF0aW9uPyBbICc7JyBTKiBkZWNsYXJhdGlvbj8gXSogJ30nIFMqCiAgICAgICAgICAgICAgICAgKiAgIDsgICAgCiAgICAgICAgICAgICAgICAgKi8gICAgCiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwKICAgICAgICAgICAgICAgICAgICB0dCwKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcnM7CgoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBFcnJvciBSZWNvdmVyeTogSWYgZXZlbiBhIHNpbmdsZSBzZWxlY3RvciBmYWlscyB0byBwYXJzZSwKICAgICAgICAgICAgICAgICAqIHRoZW4gdGhlIGVudGlyZSBydWxlc2V0IHNob3VsZCBiZSB0aHJvd24gYXdheS4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcnMgPSB0aGlzLl9zZWxlY3RvcnNfZ3JvdXAoKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGV4KXsKICAgICAgICAgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBTeW50YXhFcnJvciAmJiAhdGhpcy5vcHRpb25zLnN0cmljdCl7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIC8vZmlyZSBlcnJvciBldmVudAogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogICAgICAgImVycm9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAgICAgIGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogICAgZXgubWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6ICAgICAgIGV4LmxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2w6ICAgICAgICBleC5jb2wKICAgICAgICAgICAgICAgICAgICAgICAgfSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIC8vc2tpcCBvdmVyIGV2ZXJ5dGhpbmcgdW50aWwgY2xvc2luZyBicmFjZQogICAgICAgICAgICAgICAgICAgICAgICB0dCA9IHRva2VuU3RyZWFtLmFkdmFuY2UoW1Rva2Vucy5SQlJBQ0VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR0ID09IFRva2Vucy5SQlJBQ0UpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiB0aGVyZSdzIGEgcmlnaHQgYnJhY2UsIHRoZSBydWxlIGlzIGZpbmlzaGVkIHNvIGRvbid0IGRvIGFueXRoaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL290aGVyd2lzZSwgcmV0aHJvdyB0aGUgZXJyb3IgYmVjYXVzZSBpdCB3YXNuJ3QgaGFuZGxlZCBwcm9wZXJseQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9ub3QgYSBzeW50YXggZXJyb3IsIHJldGhyb3cgaXQKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8vdHJpZ2dlciBwYXJzZXIgdG8gY29udGludWUKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy9pZiBpdCBnb3QgaGVyZSwgYWxsIHNlbGVjdG9ycyBwYXJzZWQKICAgICAgICAgICAgICAgIGlmIChzZWxlY3RvcnMpeyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogICAgICAgInN0YXJ0cnVsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yczogIHNlbGVjdG9ycywKICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogICAgICAgc2VsZWN0b3JzWzBdLmxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbDogICAgICAgIHNlbGVjdG9yc1swXS5jb2wKICAgICAgICAgICAgICAgICAgICB9KTsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZERlY2xhcmF0aW9ucyh0cnVlKTsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogICAgICAgImVuZHJ1bGUiLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcnM6ICBzZWxlY3RvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6ICAgICAgIHNlbGVjdG9yc1swXS5saW5lLAogICAgICAgICAgICAgICAgICAgICAgICBjb2w6ICAgICAgICBzZWxlY3RvcnNbMF0uY29sCiAgICAgICAgICAgICAgICAgICAgfSk7ICAKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdG9yczsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy9DU1MzIFNlbGVjdG9ycwogICAgICAgICAgICBfc2VsZWN0b3JzX2dyb3VwOiBmdW5jdGlvbigpewogICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgKiBzZWxlY3RvcnNfZ3JvdXAKICAgICAgICAgICAgICAgICAqICAgOiBzZWxlY3RvciBbIENPTU1BIFMqIHNlbGVjdG9yIF0qCiAgICAgICAgICAgICAgICAgKiAgIDsKICAgICAgICAgICAgICAgICAqLyAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcnMgICA9IFtdLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgc2VsZWN0b3IgPSB0aGlzLl9zZWxlY3RvcigpOwogICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yICE9PSBudWxsKXsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9ycy5wdXNoKHNlbGVjdG9yKTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSh0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuQ09NTUEpKXsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IgPSB0aGlzLl9zZWxlY3RvcigpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3IgIT09IG51bGwpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JzLnB1c2goc2VsZWN0b3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdW5leHBlY3RlZFRva2VuKHRva2VuU3RyZWFtLkxUKDEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0b3JzLmxlbmd0aCA/IHNlbGVjdG9ycyA6IG51bGw7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgLy9DU1MzIFNlbGVjdG9ycwogICAgICAgICAgICBfc2VsZWN0b3I6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogc2VsZWN0b3IKICAgICAgICAgICAgICAgICAqICAgOiBzaW1wbGVfc2VsZWN0b3Jfc2VxdWVuY2UgWyBjb21iaW5hdG9yIHNpbXBsZV9zZWxlY3Rvcl9zZXF1ZW5jZSBdKgogICAgICAgICAgICAgICAgICogICA7ICAgIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciAgICA9IFtdLAogICAgICAgICAgICAgICAgICAgIG5leHRTZWxlY3RvciA9IG51bGwsCiAgICAgICAgICAgICAgICAgICAgY29tYmluYXRvciAgPSBudWxsLAogICAgICAgICAgICAgICAgICAgIHdzICAgICAgICAgID0gbnVsbDsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy9pZiB0aGVyZSdzIG5vIHNpbXBsZSBzZWxlY3RvciwgdGhlbiB0aGVyZSdzIG5vIHNlbGVjdG9yCiAgICAgICAgICAgICAgICBuZXh0U2VsZWN0b3IgPSB0aGlzLl9zaW1wbGVfc2VsZWN0b3Jfc2VxdWVuY2UoKTsKICAgICAgICAgICAgICAgIGlmIChuZXh0U2VsZWN0b3IgPT09IG51bGwpewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBzZWxlY3Rvci5wdXNoKG5leHRTZWxlY3Rvcik7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAvL2xvb2sgZm9yIGEgY29tYmluYXRvcgogICAgICAgICAgICAgICAgICAgIGNvbWJpbmF0b3IgPSB0aGlzLl9jb21iaW5hdG9yKCk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbWJpbmF0b3IgIT09IG51bGwpewogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5wdXNoKGNvbWJpbmF0b3IpOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2VsZWN0b3IgPSB0aGlzLl9zaW1wbGVfc2VsZWN0b3Jfc2VxdWVuY2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhlcmUgbXVzdCBiZSBhIG5leHQgc2VsZWN0b3IKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRTZWxlY3RvciA9PT0gbnVsbCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91bmV4cGVjdGVkVG9rZW4odGhpcy5MVCgxKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9uZXh0U2VsZWN0b3IgaXMgYW4gaW5zdGFuY2Ugb2YgU2VsZWN0b3JQYXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5wdXNoKG5leHRTZWxlY3Rvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiB0aGVyZSdzIG5vdCB3aGl0ZXNwYWNlLCB3ZSdyZSBkb25lCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9yZWFkV2hpdGVzcGFjZSgpKXsgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hZGQgd2hpdGVzcGFjZSBzZXBhcmF0b3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzID0gbmV3IENvbWJpbmF0b3IodG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZSwgdG9rZW5TdHJlYW0udG9rZW4oKS5zdGFydExpbmUsIHRva2VuU3RyZWFtLnRva2VuKCkuc3RhcnRDb2wpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbWJpbmF0b3IgaXMgbm90IHJlcXVpcmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5hdG9yID0gdGhpcy5fY29tYmluYXRvcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3NlbGVjdG9yIGlzIHJlcXVpcmVkIGlmIHRoZXJlJ3MgYSBjb21iaW5hdG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2VsZWN0b3IgPSB0aGlzLl9zaW1wbGVfc2VsZWN0b3Jfc2VxdWVuY2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0U2VsZWN0b3IgPT09IG51bGwpeyAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21iaW5hdG9yICE9PSBudWxsKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdW5leHBlY3RlZFRva2VuKHRva2VuU3RyZWFtLkxUKDEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21iaW5hdG9yICE9PSBudWxsKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IucHVzaChjb21iaW5hdG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5wdXNoKHdzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IucHVzaChuZXh0U2VsZWN0b3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gd2hpbGUodHJ1ZSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2VsZWN0b3Ioc2VsZWN0b3IsIHNlbGVjdG9yWzBdLmxpbmUsIHNlbGVjdG9yWzBdLmNvbCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIAogICAgICAgICAgICAvL0NTUzMgU2VsZWN0b3JzCiAgICAgICAgICAgIF9zaW1wbGVfc2VsZWN0b3Jfc2VxdWVuY2U6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogc2ltcGxlX3NlbGVjdG9yX3NlcXVlbmNlCiAgICAgICAgICAgICAgICAgKiAgIDogWyB0eXBlX3NlbGVjdG9yIHwgdW5pdmVyc2FsIF0KICAgICAgICAgICAgICAgICAqICAgICBbIEhBU0ggfCBjbGFzcyB8IGF0dHJpYiB8IHBzZXVkbyB8IG5lZ2F0aW9uIF0qCiAgICAgICAgICAgICAgICAgKiAgIHwgWyBIQVNIIHwgY2xhc3MgfCBhdHRyaWIgfCBwc2V1ZG8gfCBuZWdhdGlvbiBdKwogICAgICAgICAgICAgICAgICogICA7CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgLy9wYXJ0cyBvZiBhIHNpbXBsZSBzZWxlY3RvcgogICAgICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lID0gbnVsbCwKICAgICAgICAgICAgICAgICAgICBtb2RpZmllcnMgICA9IFtdLAogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8vY29tcGxldGUgc2VsZWN0b3IgdGV4dAogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yVGV4dD0gIiIsCgogICAgICAgICAgICAgICAgICAgIC8vdGhlIGRpZmZlcmVudCBwYXJ0cyBhZnRlciB0aGUgZWxlbWVudCBuYW1lIHRvIHNlYXJjaCBmb3IKICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzICA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgLy9IQVNICiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5TdHJlYW0ubWF0Y2goVG9rZW5zLkhBU0gpID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNlbGVjdG9yU3ViUGFydCh0b2tlblN0cmVhbS50b2tlbigpLnZhbHVlLCAiaWQiLCB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0TGluZSwgdG9rZW5TdHJlYW0udG9rZW4oKS5zdGFydENvbCkgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXR0cmliLAogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wc2V1ZG8sCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25lZ2F0aW9uCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBpICAgICAgICAgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgbGVuICAgICAgICAgPSBjb21wb25lbnRzLmxlbmd0aCwKICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgICA9IG51bGwsCiAgICAgICAgICAgICAgICAgICAgZm91bmQgICAgICAgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBsaW5lLAogICAgICAgICAgICAgICAgICAgIGNvbDsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vZ2V0IHN0YXJ0aW5nIGxpbmUgYW5kIGNvbHVtbiBmb3IgdGhlIHNlbGVjdG9yCiAgICAgICAgICAgICAgICBsaW5lID0gdG9rZW5TdHJlYW0uTFQoMSkuc3RhcnRMaW5lOwogICAgICAgICAgICAgICAgY29sID0gdG9rZW5TdHJlYW0uTFQoMSkuc3RhcnRDb2w7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lID0gdGhpcy5fdHlwZV9zZWxlY3RvcigpOwogICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50TmFtZSl7CiAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSB0aGlzLl91bml2ZXJzYWwoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKGVsZW1lbnROYW1lICE9PSBudWxsKXsKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvclRleHQgKz0gZWxlbWVudE5hbWU7CiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB3aGlsZSh0cnVlKXsKCiAgICAgICAgICAgICAgICAgICAgLy93aGl0ZXNwYWNlIG1lYW5zIHdlJ3JlIGRvbmUKICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5TdHJlYW0ucGVlaygpID09PSBUb2tlbnMuUyl7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgZm9yIGVhY2ggY29tcG9uZW50CiAgICAgICAgICAgICAgICAgICAgd2hpbGUoaSA8IGxlbiAmJiBjb21wb25lbnQgPT09IG51bGwpewogICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBjb21wb25lbnRzW2krK10uY2FsbCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCA9PT0gbnVsbCl7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIC8vd2UgZG9uJ3QgaGF2ZSBhIHNlbGVjdG9yCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RvclRleHQgPT09ICIiKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXJzLnB1c2goY29tcG9uZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JUZXh0ICs9IGNvbXBvbmVudC50b1N0cmluZygpOyAKICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdG9yVGV4dCAhPT0gIiIgPwogICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2VsZWN0b3JQYXJ0KGVsZW1lbnROYW1lLCBtb2RpZmllcnMsIHNlbGVjdG9yVGV4dCwgbGluZSwgY29sKSA6CiAgICAgICAgICAgICAgICAgICAgICAgIG51bGw7CiAgICAgICAgICAgIH0sICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICAvL0NTUzMgU2VsZWN0b3JzCiAgICAgICAgICAgIF90eXBlX3NlbGVjdG9yOiBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIHR5cGVfc2VsZWN0b3IKICAgICAgICAgICAgICAgICAqICAgOiBbIG5hbWVzcGFjZV9wcmVmaXggXT8gZWxlbWVudF9uYW1lCiAgICAgICAgICAgICAgICAgKiAgIDsKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgbnMgICAgICAgICAgPSB0aGlzLl9uYW1lc3BhY2VfcHJlZml4KCksCiAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSB0aGlzLl9lbGVtZW50X25hbWUoKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICghZWxlbWVudE5hbWUpeyAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgKiBOZWVkIHRvIGJhY2sgb3V0IHRoZSBuYW1lc3BhY2UgdGhhdCB3YXMgcmVhZCBkdWUgdG8gYm90aAogICAgICAgICAgICAgICAgICAgICAqIHR5cGVfc2VsZWN0b3IgYW5kIHVuaXZlcnNhbCByZWFkaW5nIG5hbWVzcGFjZV9wcmVmaXgKICAgICAgICAgICAgICAgICAgICAgKiBmaXJzdC4gS2luZCBvZiBoYWNreSwgYnV0IG9ubHkgd2F5IEkgY2FuIGZpZ3VyZSBvdXQKICAgICAgICAgICAgICAgICAgICAgKiByaWdodCBub3cgaG93IHRvIG5vdCBjaGFuZ2UgdGhlIGdyYW1tYXIuCiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgaWYgKG5zKXsKICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0udW5nZXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5zLmxlbmd0aCA+IDEpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0udW5nZXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgIAogICAgICAgICAgICAgICAgICAgIGlmIChucyl7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lLnRleHQgPSBucyArIGVsZW1lbnROYW1lLnRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lLmNvbCAtPSBucy5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50TmFtZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vQ1NTMyBTZWxlY3RvcnMKICAgICAgICAgICAgX2NsYXNzOiBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIGNsYXNzCiAgICAgICAgICAgICAgICAgKiAgIDogJy4nIElERU5UCiAgICAgICAgICAgICAgICAgKiAgIDsKICAgICAgICAgICAgICAgICAqLyAgICAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLAogICAgICAgICAgICAgICAgICAgIHRva2VuOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAodG9rZW5TdHJlYW0ubWF0Y2goVG9rZW5zLkRPVCkpewogICAgICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuSURFTlQpOyAgICAKICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuU3RyZWFtLnRva2VuKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RvclN1YlBhcnQoIi4iICsgdG9rZW4udmFsdWUsICJjbGFzcyIsIHRva2VuLnN0YXJ0TGluZSwgdG9rZW4uc3RhcnRDb2wgLSAxKTsgICAgICAgIAogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vQ1NTMyBTZWxlY3RvcnMKICAgICAgICAgICAgX2VsZW1lbnRfbmFtZTogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBlbGVtZW50X25hbWUKICAgICAgICAgICAgICAgICAqICAgOiBJREVOVAogICAgICAgICAgICAgICAgICogICA7CiAgICAgICAgICAgICAgICAgKi8gICAgCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLAogICAgICAgICAgICAgICAgICAgIHRva2VuOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAodG9rZW5TdHJlYW0ubWF0Y2goVG9rZW5zLklERU5UKSl7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlblN0cmVhbS50b2tlbigpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2VsZWN0b3JTdWJQYXJ0KHRva2VuLnZhbHVlLCAiZWxlbWVudE5hbWUiLCB0b2tlbi5zdGFydExpbmUsIHRva2VuLnN0YXJ0Q29sKTsgICAgICAgIAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAKICAgICAgICAgICAgLy9DU1MzIFNlbGVjdG9ycwogICAgICAgICAgICBfbmFtZXNwYWNlX3ByZWZpeDogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgKiBuYW1lc3BhY2VfcHJlZml4CiAgICAgICAgICAgICAgICAgKiAgIDogWyBJREVOVCB8ICcqJyBdPyAnfCcKICAgICAgICAgICAgICAgICAqICAgOwogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZSAgICAgICA9ICIiOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy92ZXJpZnkgdGhhdCB0aGlzIGlzIGEgbmFtZXNwYWNlIHByZWZpeAogICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLkxBKDEpID09PSBUb2tlbnMuUElQRSB8fCB0b2tlblN0cmVhbS5MQSgyKSA9PT0gVG9rZW5zLlBJUEUpewogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBpZih0b2tlblN0cmVhbS5tYXRjaChbVG9rZW5zLklERU5ULCBUb2tlbnMuU1RBUl0pKXsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gdG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0ubXVzdE1hdGNoKFRva2Vucy5QSVBFKTsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSAifCI7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPyB2YWx1ZSA6IG51bGw7ICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9LAogICAgICAgICAgICAKICAgICAgICAgICAgLy9DU1MzIFNlbGVjdG9ycwogICAgICAgICAgICBfdW5pdmVyc2FsOiBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIHVuaXZlcnNhbAogICAgICAgICAgICAgICAgICogICA6IFsgbmFtZXNwYWNlX3ByZWZpeCBdPyAnKicKICAgICAgICAgICAgICAgICAqICAgOyAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZSAgICAgICA9ICIiLAogICAgICAgICAgICAgICAgICAgIG5zOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgbnMgPSB0aGlzLl9uYW1lc3BhY2VfcHJlZml4KCk7CiAgICAgICAgICAgICAgICBpZihucyl7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gbnM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5TVEFSKSl7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gIioiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUubGVuZ3RoID8gdmFsdWUgOiBudWxsOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgfSwKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vQ1NTMyBTZWxlY3RvcnMKICAgICAgICAgICAgX2F0dHJpYjogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBhdHRyaWIKICAgICAgICAgICAgICAgICAqICAgOiAnWycgUyogWyBuYW1lc3BhY2VfcHJlZml4IF0/IElERU5UIFMqCiAgICAgICAgICAgICAgICAgKiAgICAgICAgIFsgWyBQUkVGSVhNQVRDSCB8CiAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBTVUZGSVhNQVRDSCB8CiAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBTVUJTVFJJTkdNQVRDSCB8CiAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAnPScgfAogICAgICAgICAgICAgICAgICogICAgICAgICAgICAgSU5DTFVERVMgfAogICAgICAgICAgICAgICAgICogICAgICAgICAgICAgREFTSE1BVENIIF0gUyogWyBJREVOVCB8IFNUUklORyBdIFMqCiAgICAgICAgICAgICAgICAgKiAgICAgICAgIF0/ICddJwogICAgICAgICAgICAgICAgICogICA7ICAgIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZSAgICAgICA9IG51bGwsCiAgICAgICAgICAgICAgICAgICAgbnMsCiAgICAgICAgICAgICAgICAgICAgdG9rZW47CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuTEJSQUNLRVQpKXsKICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuU3RyZWFtLnRva2VuKCk7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0b2tlbi52YWx1ZTsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIG5zID0gdGhpcy5fbmFtZXNwYWNlX3ByZWZpeCgpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGlmIChucyl7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IG5zOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuSURFTlQpOwogICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IHRva2VuU3RyZWFtLnRva2VuKCkudmFsdWU7ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGlmKHRva2VuU3RyZWFtLm1hdGNoKFtUb2tlbnMuUFJFRklYTUFUQ0gsIFRva2Vucy5TVUZGSVhNQVRDSCwgVG9rZW5zLlNVQlNUUklOR01BVENILAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW5zLkVRVUFMUywgVG9rZW5zLklOQ0xVREVTLCBUb2tlbnMuREFTSE1BVENIXSkpewogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSB0b2tlblN0cmVhbS50b2tlbigpLnZhbHVlOyAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tdXN0TWF0Y2goW1Rva2Vucy5JREVOVCwgVG9rZW5zLlNUUklOR10pOwogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSB0b2tlblN0cmVhbS50b2tlbigpLnZhbHVlOyAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuUkJSQUNLRVQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RvclN1YlBhcnQodmFsdWUgKyAiXSIsICJhdHRyaWJ1dGUiLCB0b2tlbi5zdGFydExpbmUsIHRva2VuLnN0YXJ0Q29sKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIAogICAgICAgICAgICAvL0NTUzMgU2VsZWN0b3JzCiAgICAgICAgICAgIF9wc2V1ZG86IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIHBzZXVkbwogICAgICAgICAgICAgICAgICogICA6ICc6JyAnOic/IFsgSURFTlQgfCBmdW5jdGlvbmFsX3BzZXVkbyBdCiAgICAgICAgICAgICAgICAgKiAgIDsgICAgCiAgICAgICAgICAgICAgICAgKi8gICAKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwKICAgICAgICAgICAgICAgICAgICBwc2V1ZG8gICAgICA9IG51bGwsCiAgICAgICAgICAgICAgICAgICAgY29sb25zICAgICAgPSAiOiIsCiAgICAgICAgICAgICAgICAgICAgbGluZSwKICAgICAgICAgICAgICAgICAgICBjb2w7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuQ09MT04pKXsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuQ09MT04pKXsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb25zICs9ICI6IjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5TdHJlYW0ubWF0Y2goVG9rZW5zLklERU5UKSl7CiAgICAgICAgICAgICAgICAgICAgICAgIHBzZXVkbyA9IHRva2VuU3RyZWFtLnRva2VuKCkudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0TGluZTsKICAgICAgICAgICAgICAgICAgICAgICAgY29sID0gdG9rZW5TdHJlYW0udG9rZW4oKS5zdGFydENvbCAtIGNvbG9ucy5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlblN0cmVhbS5wZWVrKCkgPT0gVG9rZW5zLkZVTkNUSU9OKXsKICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IHRva2VuU3RyZWFtLkxUKDEpLnN0YXJ0TGluZTsKICAgICAgICAgICAgICAgICAgICAgICAgY29sID0gdG9rZW5TdHJlYW0uTFQoMSkuc3RhcnRDb2wgLSBjb2xvbnMubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICBwc2V1ZG8gPSB0aGlzLl9mdW5jdGlvbmFsX3BzZXVkbygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBpZiAocHNldWRvKXsKICAgICAgICAgICAgICAgICAgICAgICAgcHNldWRvID0gbmV3IFNlbGVjdG9yU3ViUGFydChjb2xvbnMgKyBwc2V1ZG8sICJwc2V1ZG8iLCBsaW5lLCBjb2wpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAKICAgICAgICAgICAgICAgIHJldHVybiBwc2V1ZG87CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIAogICAgICAgICAgICAvL0NTUzMgU2VsZWN0b3JzCiAgICAgICAgICAgIF9mdW5jdGlvbmFsX3BzZXVkbzogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBmdW5jdGlvbmFsX3BzZXVkbwogICAgICAgICAgICAgICAgICogICA6IEZVTkNUSU9OIFMqIGV4cHJlc3Npb24gJyknCiAgICAgICAgICAgICAgICAgKiAgIDsKICAgICAgICAgICAgICAgICovICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLAogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbnVsbDsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYodG9rZW5TdHJlYW0ubWF0Y2goVG9rZW5zLkZVTkNUSU9OKSl7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0b2tlblN0cmVhbS50b2tlbigpLnZhbHVlOwogICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gdGhpcy5fZXhwcmVzc2lvbigpOwogICAgICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuUlBBUkVOKTsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSAiKSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vQ1NTMyBTZWxlY3RvcnMKICAgICAgICAgICAgX2V4cHJlc3Npb246IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogZXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICogICA6IFsgWyBQTFVTIHwgJy0nIHwgRElNRU5TSU9OIHwgTlVNQkVSIHwgU1RSSU5HIHwgSURFTlQgXSBTKiBdKwogICAgICAgICAgICAgICAgICogICA7CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLAogICAgICAgICAgICAgICAgICAgIHZhbHVlICAgICAgID0gIiI7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB3aGlsZSh0b2tlblN0cmVhbS5tYXRjaChbVG9rZW5zLlBMVVMsIFRva2Vucy5NSU5VUywgVG9rZW5zLkRJTUVOU0lPTiwKICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW5zLk5VTUJFUiwgVG9rZW5zLlNUUklORywgVG9rZW5zLklERU5ULCBUb2tlbnMuTEVOR1RILAogICAgICAgICAgICAgICAgICAgICAgICBUb2tlbnMuRlJFUSwgVG9rZW5zLkFOR0xFLCBUb2tlbnMuVElNRSwKICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW5zLlJFU09MVVRJT05dKSl7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gdG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOyAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUubGVuZ3RoID8gdmFsdWUgOiBudWxsOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvL0NTUzMgU2VsZWN0b3JzCiAgICAgICAgICAgIF9uZWdhdGlvbjogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgKiBuZWdhdGlvbgogICAgICAgICAgICAgICAgICogICA6IE5PVCBTKiBuZWdhdGlvbl9hcmcgUyogJyknCiAgICAgICAgICAgICAgICAgKiAgIDsKICAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLAogICAgICAgICAgICAgICAgICAgIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgY29sLAogICAgICAgICAgICAgICAgICAgIHZhbHVlICAgICAgID0gIiIsCiAgICAgICAgICAgICAgICAgICAgYXJnLAogICAgICAgICAgICAgICAgICAgIHN1YnBhcnQgICAgID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuTk9UKSl7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0b2tlblN0cmVhbS50b2tlbigpLnZhbHVlOwogICAgICAgICAgICAgICAgICAgIGxpbmUgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0TGluZTsKICAgICAgICAgICAgICAgICAgICBjb2wgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0Q29sOwogICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7CiAgICAgICAgICAgICAgICAgICAgYXJnID0gdGhpcy5fbmVnYXRpb25fYXJnKCk7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gYXJnOwogICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7CiAgICAgICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0ubWF0Y2goVG9rZW5zLlJQQVJFTik7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gdG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBzdWJwYXJ0ID0gbmV3IFNlbGVjdG9yU3ViUGFydCh2YWx1ZSwgIm5vdCIsIGxpbmUsIGNvbCk7CiAgICAgICAgICAgICAgICAgICAgc3VicGFydC5hcmdzLnB1c2goYXJnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgcmV0dXJuIHN1YnBhcnQ7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIAogICAgICAgICAgICAvL0NTUzMgU2VsZWN0b3JzCiAgICAgICAgICAgIF9uZWdhdGlvbl9hcmc6IGZ1bmN0aW9uKCl7ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogbmVnYXRpb25fYXJnCiAgICAgICAgICAgICAgICAgKiAgIDogdHlwZV9zZWxlY3RvciB8IHVuaXZlcnNhbCB8IEhBU0ggfCBjbGFzcyB8IGF0dHJpYiB8IHBzZXVkbwogICAgICAgICAgICAgICAgICogICA7ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgKi8gICAgICAgICAgIAogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgYXJncyAgICAgICAgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3R5cGVfc2VsZWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VuaXZlcnNhbCwKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuSEFTSCkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2VsZWN0b3JTdWJQYXJ0KHRva2VuU3RyZWFtLnRva2VuKCkudmFsdWUsICJpZCIsIHRva2VuU3RyZWFtLnRva2VuKCkuc3RhcnRMaW5lLCB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0Q29sKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hdHRyaWIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BzZXVkbyAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBhcmcgICAgICAgICA9IG51bGwsCiAgICAgICAgICAgICAgICAgICAgaSAgICAgICAgICAgPSAwLAogICAgICAgICAgICAgICAgICAgIGxlbiAgICAgICAgID0gYXJncy5sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUsCiAgICAgICAgICAgICAgICAgICAgbGluZSwKICAgICAgICAgICAgICAgICAgICBjb2wsCiAgICAgICAgICAgICAgICAgICAgcGFydDsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGxpbmUgPSB0b2tlblN0cmVhbS5MVCgxKS5zdGFydExpbmU7CiAgICAgICAgICAgICAgICBjb2wgPSB0b2tlblN0cmVhbS5MVCgxKS5zdGFydENvbDsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgd2hpbGUoaSA8IGxlbiAmJiBhcmcgPT09IG51bGwpewogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZ3NbaV0uY2FsbCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vbXVzdCBiZSBhIG5lZ2F0aW9uIGFyZwogICAgICAgICAgICAgICAgaWYgKGFyZyA9PT0gbnVsbCl7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdW5leHBlY3RlZFRva2VuKHRva2VuU3RyZWFtLkxUKDEpKTsKICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgLy9pdCdzIGFuIGVsZW1lbnQgbmFtZQogICAgICAgICAgICAgICAgaWYgKGFyZy50eXBlID09ICJlbGVtZW50TmFtZSIpewogICAgICAgICAgICAgICAgICAgIHBhcnQgPSBuZXcgU2VsZWN0b3JQYXJ0KGFyZywgW10sIGFyZy50b1N0cmluZygpLCBsaW5lLCBjb2wpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gbmV3IFNlbGVjdG9yUGFydChudWxsLCBbYXJnXSwgYXJnLnRvU3RyaW5nKCksIGxpbmUsIGNvbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0OyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgCiAgICAgICAgICAgIF9kZWNsYXJhdGlvbjogZnVuY3Rpb24oKXsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogZGVjbGFyYXRpb24KICAgICAgICAgICAgICAgICAqICAgOiBwcm9wZXJ0eSAnOicgUyogZXhwciBwcmlvPwogICAgICAgICAgICAgICAgICogICB8IC8oIGVtcHR5ICkvCiAgICAgICAgICAgICAgICAgKiAgIDsgICAgIAogICAgICAgICAgICAgICAgICovICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLAogICAgICAgICAgICAgICAgICAgIHByb3BlcnR5ICAgID0gbnVsbCwKICAgICAgICAgICAgICAgICAgICBleHByICAgICAgICA9IG51bGwsCiAgICAgICAgICAgICAgICAgICAgcHJpbyAgICAgICAgPSBudWxsOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBwcm9wZXJ0eSA9IHRoaXMuX3Byb3BlcnR5KCk7CiAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkgIT09IG51bGwpewoKICAgICAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tdXN0TWF0Y2goVG9rZW5zLkNPTE9OKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLl9leHByKCk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgLy9pZiB0aGVyZSdzIG5vIHBhcnRzIGZvciB0aGUgdmFsdWUsIGl0J3MgYW4gZXJyb3IKICAgICAgICAgICAgICAgICAgICBpZiAoIWV4cHIgfHwgZXhwci5sZW5ndGggPT09IDApewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91bmV4cGVjdGVkVG9rZW4odG9rZW5TdHJlYW0uTFQoMSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBwcmlvID0gdGhpcy5fcHJpbygpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZSh7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICAgICAgICJwcm9wZXJ0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiAgIHByb3BlcnR5LAogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogICAgICBleHByLAogICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRhbnQ6ICBwcmlvLAogICAgICAgICAgICAgICAgICAgICAgICBsaW5lOiAgICAgICBwcm9wZXJ0eS5saW5lLAogICAgICAgICAgICAgICAgICAgICAgICBjb2w6ICAgICAgICBwcm9wZXJ0eS5jb2wKICAgICAgICAgICAgICAgICAgICB9KTsgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgCiAgICAgICAgICAgIF9wcmlvOiBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIHByaW8KICAgICAgICAgICAgICAgICAqICAgOiBJTVBPUlRBTlRfU1lNIFMqCiAgICAgICAgICAgICAgICAgKiAgIDsgICAgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLAogICAgICAgICAgICAgICAgICAgIHJlc3VsdCAgICAgID0gdG9rZW5TdHJlYW0ubWF0Y2goVG9rZW5zLklNUE9SVEFOVF9TWU0pOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsKICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIAogICAgICAgICAgICBfZXhwcjogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBleHByCiAgICAgICAgICAgICAgICAgKiAgIDogdGVybSBbIG9wZXJhdG9yIHRlcm0gXSoKICAgICAgICAgICAgICAgICAqICAgOwogICAgICAgICAgICAgICAgICovCiAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgICAgICA9IFtdLAoJCQkJCS8vdmFsdWVQYXJ0cwk9IFtdLAogICAgICAgICAgICAgICAgICAgIHZhbHVlICAgICAgID0gbnVsbCwKICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciAgICA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuX3Rlcm0oKTsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCl7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciA9IHRoaXMuX29wZXJhdG9yKCk7CiAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgdGhlcmUncyBhbiBvcGVyYXRvciwga2VlcCBidWlsZGluZyB1cCB0aGUgdmFsdWUgcGFydHMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wZXJhdG9yKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKG9wZXJhdG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSAvKmVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiB0aGVyZSdzIG5vdCBhbiBvcGVyYXRvciwgeW91IGhhdmUgYSBmdWxsIHZhbHVlCgkJCQkJCQl2YWx1ZXMucHVzaChuZXcgUHJvcGVydHlWYWx1ZSh2YWx1ZVBhcnRzLCB2YWx1ZVBhcnRzWzBdLmxpbmUsIHZhbHVlUGFydHNbMF0uY29sKSk7CgkJCQkJCQl2YWx1ZVBhcnRzID0gW107CgkJCQkJCX0qLwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLl90ZXJtKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKHRydWUpOwogICAgICAgICAgICAgICAgfQoJCQkJCgkJCQkvL2NsZWFudXAKICAgICAgICAgICAgICAgIC8qaWYgKHZhbHVlUGFydHMubGVuZ3RoKXsKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaChuZXcgUHJvcGVydHlWYWx1ZSh2YWx1ZVBhcnRzLCB2YWx1ZVBhcnRzWzBdLmxpbmUsIHZhbHVlUGFydHNbMF0uY29sKSk7CiAgICAgICAgICAgICAgICB9Ki8KICAgICAgICAKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoID4gMCA/IG5ldyBQcm9wZXJ0eVZhbHVlKHZhbHVlcywgdmFsdWVzWzBdLnN0YXJ0TGluZSwgdmFsdWVzWzBdLnN0YXJ0Q29sKSA6IG51bGw7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIAogICAgICAgICAgICBfdGVybTogZnVuY3Rpb24oKXsgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiB0ZXJtCiAgICAgICAgICAgICAgICAgKiAgIDogdW5hcnlfb3BlcmF0b3I/CiAgICAgICAgICAgICAgICAgKiAgICAgWyBOVU1CRVIgUyogfCBQRVJDRU5UQUdFIFMqIHwgTEVOR1RIIFMqIHwgQU5HTEUgUyogfAogICAgICAgICAgICAgICAgICogICAgICAgVElNRSBTKiB8IEZSRVEgUyogfCBmdW5jdGlvbiB8IGllX2Z1bmN0aW9uIF0KICAgICAgICAgICAgICAgICAqICAgfCBTVFJJTkcgUyogfCBJREVOVCBTKiB8IFVSSSBTKiB8IFVOSUNPREVSQU5HRSBTKiB8IGhleGNvbG9yCiAgICAgICAgICAgICAgICAgKiAgIDsKICAgICAgICAgICAgICAgICAqLyAgICAKICAgICAgICAKICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLAogICAgICAgICAgICAgICAgICAgIHVuYXJ5ICAgICAgID0gbnVsbCwKICAgICAgICAgICAgICAgICAgICB2YWx1ZSAgICAgICA9IG51bGwsCiAgICAgICAgICAgICAgICAgICAgbGluZSwKICAgICAgICAgICAgICAgICAgICBjb2w7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL3JldHVybnMgdGhlIG9wZXJhdG9yIG9yIG51bGwKICAgICAgICAgICAgICAgIHVuYXJ5ID0gdGhpcy5fdW5hcnlfb3BlcmF0b3IoKTsKICAgICAgICAgICAgICAgIGlmICh1bmFyeSAhPT0gbnVsbCl7CiAgICAgICAgICAgICAgICAgICAgbGluZSA9IHRva2VuU3RyZWFtLnRva2VuKCkuc3RhcnRMaW5lOwogICAgICAgICAgICAgICAgICAgIGNvbCA9IHRva2VuU3RyZWFtLnRva2VuKCkuc3RhcnRDb2w7CiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vZXhjZXB0aW9uIGZvciBJRSBmaWx0ZXJzCiAgICAgICAgICAgICAgICBpZiAodG9rZW5TdHJlYW0ucGVlaygpID09IFRva2Vucy5JRV9GVU5DVElPTiAmJiB0aGlzLm9wdGlvbnMuaWVGaWx0ZXJzKXsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5faWVfZnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICBpZiAodW5hcnkgPT09IG51bGwpewogICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gdG9rZW5TdHJlYW0udG9rZW4oKS5zdGFydExpbmU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbCA9IHRva2VuU3RyZWFtLnRva2VuKCkuc3RhcnRDb2w7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL3NlZSBpZiB0aGVyZSdzIGEgc2ltcGxlIG1hdGNoCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuU3RyZWFtLm1hdGNoKFtUb2tlbnMuTlVNQkVSLCBUb2tlbnMuUEVSQ0VOVEFHRSwgVG9rZW5zLkxFTkdUSCwKICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW5zLkFOR0xFLCBUb2tlbnMuVElNRSwKICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW5zLkZSRVEsIFRva2Vucy5TVFJJTkcsIFRva2Vucy5JREVOVCwgVG9rZW5zLlVSSSwgVG9rZW5zLlVOSUNPREVfUkFOR0VdKSl7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0b2tlblN0cmVhbS50b2tlbigpLnZhbHVlOwogICAgICAgICAgICAgICAgICAgIGlmICh1bmFyeSA9PT0gbnVsbCl7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0TGluZTsKICAgICAgICAgICAgICAgICAgICAgICAgY29sID0gdG9rZW5TdHJlYW0udG9rZW4oKS5zdGFydENvbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAvL3NlZSBpZiBpdCdzIGEgY29sb3IKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuX2hleGNvbG9yKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKXsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiB0aGVyZSdzIG5vIHVuYXJ5LCBnZXQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IHRva2VuIGZvciBsaW5lL2NvbCBpbmZvCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmFyeSA9PT0gbnVsbCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gdG9rZW5TdHJlYW0uTFQoMSkuc3RhcnRMaW5lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sID0gdG9rZW5TdHJlYW0uTFQoMSkuc3RhcnRDb2w7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAvL2hhcyB0byBiZSBhIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGlzIGNoZWNrcyBmb3IgYWxwaGEob3BhY2l0eT0wKSBzdHlsZSBvZiBJRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZnVuY3Rpb25zLiBJRV9GVU5DVElPTiBvbmx5IHByZXNlbnRzIHByb2dpZDogc3R5bGUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5MQSgzKSA9PSBUb2tlbnMuRVFVQUxTICYmIHRoaXMub3B0aW9ucy5pZUZpbHRlcnMpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5faWVfZnVuY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLl9mdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvKmlmICh2YWx1ZSA9PT0gbnVsbCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBpZGVudGlmaWVyIGF0IGxpbmUgIiArIHRva2VuU3RyZWFtLnRva2VuKCkuc3RhcnRMaW5lICsgIiwgY2hhcmFjdGVyICIgKyAgdG9rZW5TdHJlYW0udG9rZW4oKS5zdGFydENvbCArICIuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0qLwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmFyeSA9PT0gbnVsbCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gdG9rZW5TdHJlYW0udG9rZW4oKS5zdGFydExpbmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wgPSB0b2tlblN0cmVhbS50b2tlbigpLnN0YXJ0Q29sOwogICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCA/CiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcm9wZXJ0eVZhbHVlUGFydCh1bmFyeSAhPT0gbnVsbCA/IHVuYXJ5ICsgdmFsdWUgOiB2YWx1ZSwgbGluZSwgY29sKSA6CiAgICAgICAgICAgICAgICAgICAgICAgIG51bGw7CiAgICAgICAgCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIAogICAgICAgICAgICBfZnVuY3Rpb246IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICAgKiAgIDogRlVOQ1RJT04gUyogZXhwciAnKScgUyoKICAgICAgICAgICAgICAgICAqICAgOwogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvblRleHQgPSBudWxsLAogICAgICAgICAgICAgICAgICAgIGV4cHIgICAgICAgID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICh0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuRlVOQ1RJT04pKXsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvblRleHQgPSB0b2tlblN0cmVhbS50b2tlbigpLnZhbHVlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7CiAgICAgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuX2V4cHIoKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuUlBBUkVOKTsgICAgCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25UZXh0ICs9IGV4cHIgKyAiKSI7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsKICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvblRleHQ7CiAgICAgICAgICAgIH0sIAogICAgICAgICAgICAKICAgICAgICAgICAgX2llX2Z1bmN0aW9uOiBmdW5jdGlvbigpewogICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8qIChNeSBvd24gZXh0ZW5zaW9uKQogICAgICAgICAgICAgICAgICogaWVfZnVuY3Rpb24KICAgICAgICAgICAgICAgICAqICAgOiBJRV9GVU5DVElPTiBTKiBJREVOVCAnPScgdGVybSBbUyogJywnPyBJREVOVCAnPScgdGVybV0rICcpJyBTKgogICAgICAgICAgICAgICAgICogICA7CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uVGV4dCA9IG51bGwsCiAgICAgICAgICAgICAgICAgICAgZXhwciAgICAgICAgPSBudWxsLAogICAgICAgICAgICAgICAgICAgIGx0OwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy9JRSBmdW5jdGlvbiBjYW4gYmVnaW4gbGlrZSBhIHJlZ3VsYXIgZnVuY3Rpb24sIHRvbwogICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLm1hdGNoKFtUb2tlbnMuSUVfRlVOQ1RJT04sIFRva2Vucy5GVU5DVElPTl0pKXsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvblRleHQgPSB0b2tlblN0cmVhbS50b2tlbigpLnZhbHVlOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCkpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25UZXh0ICs9IHRva2VuU3RyZWFtLnRva2VuKCkudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIC8vbWlnaHQgYmUgc2Vjb25kIHRpbWUgaW4gdGhlIGxvb3AKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuU3RyZWFtLkxBKDApID09IFRva2Vucy5DT01NQSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvblRleHQgKz0gdG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuSURFTlQpOwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvblRleHQgKz0gdG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5FUVVBTFMpOwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvblRleHQgKz0gdG9rZW5TdHJlYW0udG9rZW4oKS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIC8vZnVuY3Rpb25UZXh0ICs9IHRoaXMuX3Rlcm0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgbHQgPSB0b2tlblN0cmVhbS5wZWVrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKGx0ICE9IFRva2Vucy5DT01NQSAmJiBsdCAhPSBUb2tlbnMuUyAmJiBsdCAhPSBUb2tlbnMuUlBBUkVOKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLmdldCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25UZXh0ICs9IHRva2VuU3RyZWFtLnRva2VuKCkudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdCA9IHRva2VuU3RyZWFtLnBlZWsoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gd2hpbGUodG9rZW5TdHJlYW0ubWF0Y2goW1Rva2Vucy5DT01NQSwgVG9rZW5zLlNdKSk7ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuUlBBUkVOKTsgICAgCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25UZXh0ICs9ICIpIjsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uVGV4dDsKICAgICAgICAgICAgfSwgCiAgICAgICAgICAgIAogICAgICAgICAgICBfaGV4Y29sb3I6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogVGhlcmUgaXMgYSBjb25zdHJhaW50IG9uIHRoZSBjb2xvciB0aGF0IGl0IG11c3QKICAgICAgICAgICAgICAgICAqIGhhdmUgZWl0aGVyIDMgb3IgNiBoZXgtZGlnaXRzIChpLmUuLCBbMC05YS1mQS1GXSkKICAgICAgICAgICAgICAgICAqIGFmdGVyIHRoZSAiIyI7IGUuZy4sICIjMDAwIiBpcyBPSywgYnV0ICIjYWJjZCIgaXMgbm90LgogICAgICAgICAgICAgICAgICoKICAgICAgICAgICAgICAgICAqIGhleGNvbG9yCiAgICAgICAgICAgICAgICAgKiAgIDogSEFTSCBTKgogICAgICAgICAgICAgICAgICogICA7CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLAogICAgICAgICAgICAgICAgICAgIHRva2VuLAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gbnVsbDsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYodG9rZW5TdHJlYW0ubWF0Y2goVG9rZW5zLkhBU0gpKXsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8vbmVlZCB0byBkbyBzb21lIHZhbGlkYXRpb24gaGVyZQogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5TdHJlYW0udG9rZW4oKTsKICAgICAgICAgICAgICAgICAgICBjb2xvciA9IHRva2VuLnZhbHVlOwogICAgICAgICAgICAgICAgICAgIGlmICghLyNbYS1mMC05XXszLDZ9L2kudGVzdChjb2xvcikpewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkV4cGVjdGVkIGEgaGV4IGNvbG9yIGJ1dCBmb3VuZCAnIiArIGNvbG9yICsgIicgYXQgbGluZSAiICsgdG9rZW4uc3RhcnRMaW5lICsgIiwgY29sICIgKyB0b2tlbi5zdGFydENvbCArICIuIiwgdG9rZW4uc3RhcnRMaW5lLCB0b2tlbi5zdGFydENvbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHJldHVybiBjb2xvcjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgLy8gQW5pbWF0aW9ucyBtZXRob2RzCiAgICAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgCiAgICAgICAgICAgIF9rZXlmcmFtZXM6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIGtleWZyYW1lczoKICAgICAgICAgICAgICAgICAqICAgOiBLRVlGUkFNRVNfU1lNIFMqIGtleWZyYW1lX25hbWUgUyogJ3snIFMqIGtleWZyYW1lX3J1bGUqICd9JyB7CiAgICAgICAgICAgICAgICAgKiAgIDsKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgdG9rZW4sCiAgICAgICAgICAgICAgICAgICAgdHQsCiAgICAgICAgICAgICAgICAgICAgbmFtZTsgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuS0VZRlJBTUVTX1NZTSk7CiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgICAgbmFtZSA9IHRoaXMuX2tleWZyYW1lX25hbWUoKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsKICAgICAgICAgICAgICAgIHRva2VuU3RyZWFtLm11c3RNYXRjaChUb2tlbnMuTEJSQUNFKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHRoaXMuZmlyZSh7CiAgICAgICAgICAgICAgICAgICAgdHlwZTogICAic3RhcnRrZXlmcmFtZXMiLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICAgbmFtZSwKICAgICAgICAgICAgICAgICAgICBsaW5lOiAgIG5hbWUubGluZSwKICAgICAgICAgICAgICAgICAgICBjb2w6ICAgIG5hbWUuY29sCiAgICAgICAgICAgICAgICB9KTsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7CiAgICAgICAgICAgICAgICB0dCA9IHRva2VuU3RyZWFtLnBlZWsoKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy9jaGVjayBmb3Iga2V5CiAgICAgICAgICAgICAgICB3aGlsZSh0dCA9PSBUb2tlbnMuSURFTlQgfHwgdHQgPT0gVG9rZW5zLlBFUkNFTlRBR0UpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlmcmFtZV9ydWxlKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsKICAgICAgICAgICAgICAgICAgICB0dCA9IHRva2VuU3RyZWFtLnBlZWsoKTsKICAgICAgICAgICAgICAgIH0gICAgICAgICAgIAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB0aGlzLmZpcmUoewogICAgICAgICAgICAgICAgICAgIHR5cGU6ICAgImVuZGtleWZyYW1lcyIsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogICBuYW1lLAogICAgICAgICAgICAgICAgICAgIGxpbmU6ICAgbmFtZS5saW5lLAogICAgICAgICAgICAgICAgICAgIGNvbDogICAgbmFtZS5jb2wKICAgICAgICAgICAgICAgIH0pOyAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7CiAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tdXN0TWF0Y2goVG9rZW5zLlJCUkFDRSk7ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9LAogICAgICAgICAgICAKICAgICAgICAgICAgX2tleWZyYW1lX25hbWU6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIGtleWZyYW1lX25hbWU6CiAgICAgICAgICAgICAgICAgKiAgIDogSURFTlQKICAgICAgICAgICAgICAgICAqICAgfCBTVFJJTkcKICAgICAgICAgICAgICAgICAqICAgOwogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwKICAgICAgICAgICAgICAgICAgICB0b2tlbjsKCiAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tdXN0TWF0Y2goW1Rva2Vucy5JREVOVCwgVG9rZW5zLlNUUklOR10pOwogICAgICAgICAgICAgICAgcmV0dXJuIFN5bnRheFVuaXQuZnJvbVRva2VuKHRva2VuU3RyZWFtLnRva2VuKCkpOyAgICAgICAgICAgIAogICAgICAgICAgICB9LAogICAgICAgICAgICAKICAgICAgICAgICAgX2tleWZyYW1lX3J1bGU6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIGtleWZyYW1lX3J1bGU6CiAgICAgICAgICAgICAgICAgKiAgIDoga2V5X2xpc3QgUyogCiAgICAgICAgICAgICAgICAgKiAgICAgJ3snIFMqIGRlY2xhcmF0aW9uIFsgJzsnIFMqIGRlY2xhcmF0aW9uIF0qICd9JyBTKgogICAgICAgICAgICAgICAgICogICA7CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLAogICAgICAgICAgICAgICAgICAgIHRva2VuLAogICAgICAgICAgICAgICAgICAgIGtleUxpc3QgPSB0aGlzLl9rZXlfbGlzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHRoaXMuZmlyZSh7CiAgICAgICAgICAgICAgICAgICAgdHlwZTogICAic3RhcnRrZXlmcmFtZXJ1bGUiLAogICAgICAgICAgICAgICAgICAgIGtleXM6ICAga2V5TGlzdCwKICAgICAgICAgICAgICAgICAgICBsaW5lOiAgIGtleUxpc3RbMF0ubGluZSwKICAgICAgICAgICAgICAgICAgICBjb2w6ICAgIGtleUxpc3RbMF0uY29sCiAgICAgICAgICAgICAgICB9KTsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHRoaXMuX3JlYWREZWNsYXJhdGlvbnModHJ1ZSk7ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB0aGlzLmZpcmUoewogICAgICAgICAgICAgICAgICAgIHR5cGU6ICAgImVuZGtleWZyYW1lcnVsZSIsCiAgICAgICAgICAgICAgICAgICAga2V5czogICBrZXlMaXN0LAogICAgICAgICAgICAgICAgICAgIGxpbmU6ICAga2V5TGlzdFswXS5saW5lLAogICAgICAgICAgICAgICAgICAgIGNvbDogICAga2V5TGlzdFswXS5jb2wKICAgICAgICAgICAgICAgIH0pOyAgCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgCiAgICAgICAgICAgIF9rZXlfbGlzdDogZnVuY3Rpb24oKXsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICoga2V5X2xpc3Q6CiAgICAgICAgICAgICAgICAgKiAgIDoga2V5IFsgUyogJywnIFMqIGtleV0qCiAgICAgICAgICAgICAgICAgKiAgIDsKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgdG9rZW4sCiAgICAgICAgICAgICAgICAgICAga2V5LAogICAgICAgICAgICAgICAgICAgIGtleUxpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vbXVzdCBiZSBsZWFzdCBvbmUga2V5CiAgICAgICAgICAgICAgICBrZXlMaXN0LnB1c2godGhpcy5fa2V5KCkpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHdoaWxlKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5DT01NQSkpewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7CiAgICAgICAgICAgICAgICAgICAga2V5TGlzdC5wdXNoKHRoaXMuX2tleSgpKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBrZXlMaXN0OwogICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgX2tleTogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBUaGVyZSBpcyBhIHJlc3RyaWN0aW9uIHRoYXQgSURFTlQgY2FuIGJlIG9ubHkgImZyb20iIG9yICJ0byIuCiAgICAgICAgICAgICAgICAgKgogICAgICAgICAgICAgICAgICoga2V5CiAgICAgICAgICAgICAgICAgKiAgIDogUEVSQ0VOVEFHRQogICAgICAgICAgICAgICAgICogICB8IElERU5UCiAgICAgICAgICAgICAgICAgKiAgIDsKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIHRva2VuU3RyZWFtID0gdGhpcy5fdG9rZW5TdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgdG9rZW47CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAodG9rZW5TdHJlYW0ubWF0Y2goVG9rZW5zLlBFUkNFTlRBR0UpKXsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3ludGF4VW5pdC5mcm9tVG9rZW4odG9rZW5TdHJlYW0udG9rZW4oKSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5JREVOVCkpewogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5TdHJlYW0udG9rZW4oKTsgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGlmICgvZnJvbXx0by9pLnRlc3QodG9rZW4udmFsdWUpKXsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN5bnRheFVuaXQuZnJvbVRva2VuKHRva2VuKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0udW5nZXQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy9pZiBpdCBnZXRzIGhlcmUsIHRoZXJlIHdhc24ndCBhIHZhbGlkIHRva2VuLCBzbyB0aW1lIHRvIGV4cGxvZGUKICAgICAgICAgICAgICAgIHRoaXMuX3VuZXhwZWN0ZWRUb2tlbih0b2tlblN0cmVhbS5MVCgxKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIAogICAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIC8vIEhlbHBlciBtZXRob2RzCiAgICAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBOb3QgcGFydCBvZiBDU1MgZ3JhbW1hciwgYnV0IHVzZWZ1bCBmb3Igc2tpcHBpbmcgb3ZlcgogICAgICAgICAgICAgKiBjb21iaW5hdGlvbiBvZiB3aGl0ZSBzcGFjZSBhbmQgSFRNTC1zdHlsZSBjb21tZW50cy4KICAgICAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgICAgICogQG1ldGhvZCBfc2tpcENydWZ0CiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBfc2tpcENydWZ0OiBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgd2hpbGUodGhpcy5fdG9rZW5TdHJlYW0ubWF0Y2goW1Rva2Vucy5TLCBUb2tlbnMuQ0RPLCBUb2tlbnMuQ0RDXSkpewogICAgICAgICAgICAgICAgICAgIC8vbm9vcAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIE5vdCBwYXJ0IG9mIENTUyBncmFtbWFyLCBidXQgdGhpcyBwYXR0ZXJuIG9jY3VycyBmcmVxdWVudGx5CiAgICAgICAgICAgICAqIGluIHRoZSBvZmZpY2lhbCBDU1MgZ3JhbW1hci4gU3BsaXQgb3V0IGhlcmUgdG8gZWxpbWluYXRlCiAgICAgICAgICAgICAqIGR1cGxpY2F0ZSBjb2RlLgogICAgICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGNoZWNrU3RhcnQgSW5kaWNhdGVzIGlmIHRoZSBydWxlIHNob3VsZCBjaGVjawogICAgICAgICAgICAgKiAgICAgIGZvciB0aGUgbGVmdCBicmFjZSBhdCB0aGUgYmVnaW5uaW5nLgogICAgICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHJlYWRNYXJnaW5zIEluZGljYXRlcyBpZiB0aGUgcnVsZSBzaG91bGQgY2hlY2sKICAgICAgICAgICAgICogICAgICBmb3IgbWFyZ2luIHBhdHRlcm5zLgogICAgICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAgICAgKiBAbWV0aG9kIF9yZWFkRGVjbGFyYXRpb25zCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBfcmVhZERlY2xhcmF0aW9uczogZnVuY3Rpb24oY2hlY2tTdGFydCwgcmVhZE1hcmdpbnMpewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFJlYWRzIHRoZSBwYXR0ZXJuCiAgICAgICAgICAgICAgICAgKiBTKiAneycgUyogZGVjbGFyYXRpb24gWyAnOycgUyogZGVjbGFyYXRpb24gXSogJ30nIFMqCiAgICAgICAgICAgICAgICAgKiBvcgogICAgICAgICAgICAgICAgICogUyogJ3snIFMqIFsgZGVjbGFyYXRpb24gfCBtYXJnaW4gXT8gWyAnOycgUyogWyBkZWNsYXJhdGlvbiB8IG1hcmdpbiBdPyBdKiAnfScgUyoKICAgICAgICAgICAgICAgICAqIE5vdGUgdGhhdCB0aGlzIGlzIGhvdyBpdCBpcyBkZXNjcmliZWQgaW4gQ1NTMyBQYWdlZCBNZWRpYSwgYnV0IGlzIGFjdHVhbGx5IGluY29ycmVjdC4KICAgICAgICAgICAgICAgICAqIEEgc2VtaWNvbG9uIGlzIG9ubHkgbmVjZXNzYXJ5IGZvbGxvd2luZyBhIGRlbGNhcmF0aW9uIGlzIHRoZXJlJ3MgYW5vdGhlciBkZWNsYXJhdGlvbgogICAgICAgICAgICAgICAgICogb3IgbWFyZ2luIGFmdGVyd2FyZHMuIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5TdHJlYW0gPSB0aGlzLl90b2tlblN0cmVhbSwKICAgICAgICAgICAgICAgICAgICB0dDsKICAgICAgICAgICAgICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoY2hlY2tTdGFydCl7CiAgICAgICAgICAgICAgICAgICAgdG9rZW5TdHJlYW0ubXVzdE1hdGNoKFRva2Vucy5MQlJBQ0UpOyAgICAgICAgICAgIAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOwoKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgd2hpbGUodHJ1ZSl7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkTWFyZ2lucyAmJiB0aGlzLl9tYXJnaW4oKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL25vb3AKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9kZWNsYXJhdGlvbigpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9rZW5TdHJlYW0ubWF0Y2goVG9rZW5zLlNFTUlDT0xPTikpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAoKCF0aGlzLl9tYXJnaW4oKSAmJiAhdGhpcy5fZGVjbGFyYXRpb24oKSkgfHwgIXRva2VuU3RyZWFtLm1hdGNoKFRva2Vucy5TRU1JQ09MT04pKXsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vfQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICB0b2tlblN0cmVhbS5tdXN0TWF0Y2goVG9rZW5zLlJCUkFDRSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgU3ludGF4RXJyb3IgJiYgIXRoaXMub3B0aW9ucy5zdHJpY3QpewogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAvL2ZpcmUgZXJyb3IgZXZlbnQKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICAgICAgICJlcnJvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogICAgICBleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICAgIGV4Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lOiAgICAgICBleC5saW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sOiAgICAgICAgZXguY29sCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAvL3NlZSBpZiB0aGVyZSdzIGFub3RoZXIgZGVjbGFyYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgdHQgPSB0b2tlblN0cmVhbS5hZHZhbmNlKFtUb2tlbnMuU0VNSUNPTE9OLCBUb2tlbnMuUkJSQUNFXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0dCA9PSBUb2tlbnMuU0VNSUNPTE9OKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgdGhlcmUncyBhIHNlbWljb2xvbiwgdGhlbiB0aGVyZSBtaWdodCBiZSBhbm90aGVyIGRlY2xhcmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkRGVjbGFyYXRpb25zKGZhbHNlLCByZWFkTWFyZ2lucyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHQgPT0gVG9rZW5zLlJCUkFDRSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIHRoZXJlJ3MgYSByaWdodCBicmFjZSwgdGhlIHJ1bGUgaXMgZmluaXNoZWQgc28gZG9uJ3QgZG8gYW55dGhpbmcKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vb3RoZXJ3aXNlLCByZXRocm93IHRoZSBlcnJvciBiZWNhdXNlIGl0IHdhc24ndCBoYW5kbGVkIHByb3Blcmx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBleDsKICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvL25vdCBhIHN5bnRheCBlcnJvciwgcmV0aHJvdyBpdAogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBleDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9ICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgfSwgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBJbiBzb21lIGNhc2VzLCB5b3UgY2FuIGVuZCB1cCB3aXRoIHR3byB3aGl0ZSBzcGFjZSB0b2tlbnMgaW4gYQogICAgICAgICAgICAgKiByb3cuIEluc3RlYWQgb2YgbWFraW5nIGEgY2hhbmdlIGluIGV2ZXJ5IGZ1bmN0aW9uIHRoYXQgbG9va3MgZm9yCiAgICAgICAgICAgICAqIHdoaXRlIHNwYWNlLCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbWF0Y2ggYXMgbXVjaCB3aGl0ZSBzcGFjZQogICAgICAgICAgICAgKiBhcyBuZWNlc3NhcnkuCiAgICAgICAgICAgICAqIEBtZXRob2QgX3JlYWRXaGl0ZXNwYWNlCiAgICAgICAgICAgICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIHdoaXRlIHNwYWNlIGlmIGZvdW5kLCBlbXB0eSBzdHJpbmcgaWYgbm90LgogICAgICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgX3JlYWRXaGl0ZXNwYWNlOiBmdW5jdGlvbigpewogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciB0b2tlblN0cmVhbSA9IHRoaXMuX3Rva2VuU3RyZWFtLAogICAgICAgICAgICAgICAgICAgIHdzID0gIiI7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB3aGlsZSh0b2tlblN0cmVhbS5tYXRjaChUb2tlbnMuUykpewogICAgICAgICAgICAgICAgICAgIHdzICs9IHRva2VuU3RyZWFtLnRva2VuKCkudmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHJldHVybiB3czsKICAgICAgICAgICAgfSwKICAgICAgICAgIAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFRocm93cyBhbiBlcnJvciB3aGVuIGFuIHVuZXhwZWN0ZWQgdG9rZW4gaXMgZm91bmQuCiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0b2tlbiBUaGUgdG9rZW4gdGhhdCB3YXMgZm91bmQuCiAgICAgICAgICAgICAqIEBtZXRob2QgX3VuZXhwZWN0ZWRUb2tlbgogICAgICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgX3VuZXhwZWN0ZWRUb2tlbjogZnVuY3Rpb24odG9rZW4pewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCJVbmV4cGVjdGVkIHRva2VuICciICsgdG9rZW4udmFsdWUgKyAiJyBhdCBsaW5lICIgKyB0b2tlbi5zdGFydExpbmUgKyAiLCBjb2wgIiArIHRva2VuLnN0YXJ0Q29sICsgIi4iLCB0b2tlbi5zdGFydExpbmUsIHRva2VuLnN0YXJ0Q29sKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBIZWxwZXIgbWV0aG9kIHVzZWQgZm9yIHBhcnNpbmcgc3VicGFydHMgb2YgYSBzdHlsZSBzaGVldC4KICAgICAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgICAgICogQG1ldGhvZCBfdmVyaWZ5RW5kCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBfdmVyaWZ5RW5kOiBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Rva2VuU3RyZWFtLkxBKDEpICE9IFRva2Vucy5FT0YpewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3VuZXhwZWN0ZWRUb2tlbih0aGlzLl90b2tlblN0cmVhbS5MVCgxKSk7CiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIAogICAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIC8vIFBhcnNpbmcgbWV0aG9kcwogICAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIAogICAgICAgICAgICBwYXJzZTogZnVuY3Rpb24oaW5wdXQpeyAgICAKICAgICAgICAgICAgICAgIHRoaXMuX3Rva2VuU3RyZWFtID0gbmV3IFRva2VuU3RyZWFtKGlucHV0LCBUb2tlbnMpOwogICAgICAgICAgICAgICAgdGhpcy5fc3R5bGVzaGVldCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAKICAgICAgICAgICAgcGFyc2VTdHlsZVNoZWV0OiBmdW5jdGlvbihpbnB1dCl7CiAgICAgICAgICAgICAgICAvL2p1c3QgcGFzc3Rocm91Z2gKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlKGlucHV0KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgCiAgICAgICAgICAgIHBhcnNlTWVkaWFRdWVyeTogZnVuY3Rpb24oaW5wdXQpewogICAgICAgICAgICAgICAgdGhpcy5fdG9rZW5TdHJlYW0gPSBuZXcgVG9rZW5TdHJlYW0oaW5wdXQsIFRva2Vucyk7CiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fbWVkaWFfcXVlcnkoKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy9pZiB0aGVyZSdzIGFueXRoaW5nIG1vcmUsIHRoZW4gaXQncyBhbiBpbnZhbGlkIHNlbGVjdG9yCiAgICAgICAgICAgICAgICB0aGlzLl92ZXJpZnlFbmQoKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy9vdGhlcndpc2UgcmV0dXJuIHJlc3VsdAogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsgICAgICAgICAgICAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBQYXJzZXMgYSBwcm9wZXJ0eSB2YWx1ZSAoZXZlcnl0aGluZyBhZnRlciB0aGUgc2VtaWNvbG9uKS4KICAgICAgICAgICAgICogQHJldHVybiB7cGFyc2VybGliLmNzcy5Qcm9wZXJ0eVZhbHVlfSBUaGUgcHJvcGVydHkgdmFsdWUuCiAgICAgICAgICAgICAqIEB0aHJvd3MgcGFyc2VybGliLnV0aWwuU3ludGF4RXJyb3IgSWYgYW4gdW5leHBlY3RlZCB0b2tlbiBpcyBmb3VuZC4KICAgICAgICAgICAgICogQG1ldGhvZCBwYXJzZXJQcm9wZXJ0eVZhbHVlCiAgICAgICAgICAgICAqLyAgICAgICAgICAgICAKICAgICAgICAgICAgcGFyc2VQcm9wZXJ0eVZhbHVlOiBmdW5jdGlvbihpbnB1dCl7CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGhpcy5fdG9rZW5TdHJlYW0gPSBuZXcgVG9rZW5TdHJlYW0oaW5wdXQsIFRva2Vucyk7CiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fZXhwcigpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL29rYXkgdG8gaGF2ZSBhIHRyYWlsaW5nIHdoaXRlIHNwYWNlCiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkV2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL2lmIHRoZXJlJ3MgYW55dGhpbmcgbW9yZSwgdGhlbiBpdCdzIGFuIGludmFsaWQgc2VsZWN0b3IKICAgICAgICAgICAgICAgIHRoaXMuX3ZlcmlmeUVuZCgpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL290aGVyd2lzZSByZXR1cm4gcmVzdWx0CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9LAogICAgICAgICAgICAKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFBhcnNlcyBhIGNvbXBsZXRlIENTUyBydWxlLCBpbmNsdWRpbmcgc2VsZWN0b3JzIGFuZAogICAgICAgICAgICAgKiBwcm9wZXJ0aWVzLgogICAgICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIHRleHQgdG8gcGFyc2VyLgogICAgICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoZSBwYXJzZSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LCBmYWxzZSBpZiBub3QuCiAgICAgICAgICAgICAqIEBtZXRob2QgcGFyc2VSdWxlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBwYXJzZVJ1bGU6IGZ1bmN0aW9uKGlucHV0KXsKICAgICAgICAgICAgICAgIHRoaXMuX3Rva2VuU3RyZWFtID0gbmV3IFRva2VuU3RyZWFtKGlucHV0LCBUb2tlbnMpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL3NraXAgYW55IGxlYWRpbmcgd2hpdGUgc3BhY2UKICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9ydWxlc2V0KCk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vc2tpcCBhbnkgdHJhaWxpbmcgd2hpdGUgc3BhY2UKICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7CgogICAgICAgICAgICAgICAgLy9pZiB0aGVyZSdzIGFueXRoaW5nIG1vcmUsIHRoZW4gaXQncyBhbiBpbnZhbGlkIHNlbGVjdG9yCiAgICAgICAgICAgICAgICB0aGlzLl92ZXJpZnlFbmQoKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy9vdGhlcndpc2UgcmV0dXJuIHJlc3VsdAogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsgICAgICAgICAgICAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBQYXJzZXMgYSBzaW5nbGUgQ1NTIHNlbGVjdG9yIChubyBjb21tYSkKICAgICAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSB0ZXh0IHRvIHBhcnNlIGFzIGEgQ1NTIHNlbGVjdG9yLgogICAgICAgICAgICAgKiBAcmV0dXJuIHtTZWxlY3Rvcn0gQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VsZWN0b3IuCiAgICAgICAgICAgICAqIEB0aHJvd3MgcGFyc2VybGliLnV0aWwuU3ludGF4RXJyb3IgSWYgYW4gdW5leHBlY3RlZCB0b2tlbiBpcyBmb3VuZC4KICAgICAgICAgICAgICogQG1ldGhvZCBwYXJzZVNlbGVjdG9yCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBwYXJzZVNlbGVjdG9yOiBmdW5jdGlvbihpbnB1dCl7CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGhpcy5fdG9rZW5TdHJlYW0gPSBuZXcgVG9rZW5TdHJlYW0oaW5wdXQsIFRva2Vucyk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vc2tpcCBhbnkgbGVhZGluZyB3aGl0ZSBzcGFjZQogICAgICAgICAgICAgICAgdGhpcy5fcmVhZFdoaXRlc3BhY2UoKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX3NlbGVjdG9yKCk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vc2tpcCBhbnkgdHJhaWxpbmcgd2hpdGUgc3BhY2UKICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRXaGl0ZXNwYWNlKCk7CgogICAgICAgICAgICAgICAgLy9pZiB0aGVyZSdzIGFueXRoaW5nIG1vcmUsIHRoZW4gaXQncyBhbiBpbnZhbGlkIHNlbGVjdG9yCiAgICAgICAgICAgICAgICB0aGlzLl92ZXJpZnlFbmQoKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy9vdGhlcndpc2UgcmV0dXJuIHJlc3VsdAogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICB9OwogICAgICAgIAogICAgLy9jb3B5IG92ZXIgb250byBwcm90b3R5cGUKICAgIGZvciAocHJvcCBpbiBhZGRpdGlvbnMpewogICAgICAgIHByb3RvW3Byb3BdID0gYWRkaXRpb25zW3Byb3BdOwogICAgfSAgIAogICAgCiAgICByZXR1cm4gcHJvdG87Cn0oKTsKCgovKgpudGgKICA6IFMqIFsgWyctJ3wnKyddPyBJTlRFR0VSPyB7Tn0gWyBTKiBbJy0nfCcrJ10gUyogSU5URUdFUiBdPyB8CiAgICAgICAgIFsnLSd8JysnXT8gSU5URUdFUiB8IHtPfXtEfXtEfSB8IHtFfXtWfXtFfXtOfSBdIFMqCiAgOwoqLwovKioKICogUmVwcmVzZW50cyBhIHNlbGVjdG9yIGNvbWJpbmF0b3IgKHdoaXRlc3BhY2UsICssID4pLgogKiBAbmFtZXNwYWNlIHBhcnNlcmxpYi5jc3MKICogQGNsYXNzIFByb3BlcnR5TmFtZQogKiBAZXh0ZW5kcyBwYXJzZXJsaWIudXRpbC5TeW50YXhVbml0CiAqIEBjb25zdHJ1Y3RvcgogKiBAcGFyYW0ge1N0cmluZ30gdGV4dCBUaGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdW5pdC4gCiAqIEBwYXJhbSB7U3RyaW5nfSBoYWNrIFRoZSB0eXBlIG9mIElFIGhhY2sgYXBwbGllZCAoIioiLCAiXyIsIG9yIG51bGwpLgogKiBAcGFyYW0ge2ludH0gbGluZSBUaGUgbGluZSBvZiB0ZXh0IG9uIHdoaWNoIHRoZSB1bml0IHJlc2lkZXMuCiAqIEBwYXJhbSB7aW50fSBjb2wgVGhlIGNvbHVtbiBvZiB0ZXh0IG9uIHdoaWNoIHRoZSB1bml0IHJlc2lkZXMuCiAqLwpmdW5jdGlvbiBQcm9wZXJ0eU5hbWUodGV4dCwgaGFjaywgbGluZSwgY29sKXsKICAgIAogICAgU3ludGF4VW5pdC5jYWxsKHRoaXMsIChoYWNrfHwiIikgKyB0ZXh0LCBsaW5lLCBjb2wpOwoKICAgIC8qKgogICAgICogVGhlIHR5cGUgb2YgSUUgaGFjayBhcHBsaWVkICgiKiIsICJfIiwgb3IgbnVsbCkuCiAgICAgKiBAdHlwZSBTdHJpbmcKICAgICAqIEBwcm9wZXJ0eSBoYWNrCiAgICAgKi8KICAgIHRoaXMuaGFjayA9IGhhY2s7Cgp9CgpQcm9wZXJ0eU5hbWUucHJvdG90eXBlID0gbmV3IFN5bnRheFVuaXQoKTsKUHJvcGVydHlOYW1lLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFByb3BlcnR5TmFtZTsKCgovKioKICogUmVwcmVzZW50cyBhIHNpbmdsZSBwYXJ0IG9mIGEgQ1NTIHByb3BlcnR5IHZhbHVlLCBtZWFuaW5nIHRoYXQgaXQgcmVwcmVzZW50cwogKiBqdXN0IGV2ZXJ5dGhpbmcgc2luZ2xlIHBhcnQgYmV0d2VlbiAiOiIgYW5kICI7Ii4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIHZhbHVlcwogKiBzZXBhcmF0ZWQgYnkgY29tbWFzLCB0aGlzIHR5cGUgcmVwcmVzZW50cyBqdXN0IG9uZSBvZiB0aGUgdmFsdWVzLgogKiBAcGFyYW0ge1N0cmluZ1tdfSBwYXJ0cyBBbiBhcnJheSBvZiB2YWx1ZSBwYXJ0cyBtYWtpbmcgdXAgdGhpcyB2YWx1ZS4KICogQHBhcmFtIHtpbnR9IGxpbmUgVGhlIGxpbmUgb2YgdGV4dCBvbiB3aGljaCB0aGUgdW5pdCByZXNpZGVzLgogKiBAcGFyYW0ge2ludH0gY29sIFRoZSBjb2x1bW4gb2YgdGV4dCBvbiB3aGljaCB0aGUgdW5pdCByZXNpZGVzLgogKiBAbmFtZXNwYWNlIHBhcnNlcmxpYi5jc3MKICogQGNsYXNzIFByb3BlcnR5VmFsdWUKICogQGV4dGVuZHMgcGFyc2VybGliLnV0aWwuU3ludGF4VW5pdAogKiBAY29uc3RydWN0b3IKICovCmZ1bmN0aW9uIFByb3BlcnR5VmFsdWUocGFydHMsIGxpbmUsIGNvbCl7CgogICAgU3ludGF4VW5pdC5jYWxsKHRoaXMsIHBhcnRzLmpvaW4oIiAiKSwgbGluZSwgY29sKTsKICAgIAogICAgLyoqCiAgICAgKiBUaGUgcGFydHMgdGhhdCBtYWtlIHVwIHRoZSBzZWxlY3Rvci4KICAgICAqIEB0eXBlIEFycmF5CiAgICAgKiBAcHJvcGVydHkgcGFydHMKICAgICAqLwogICAgdGhpcy5wYXJ0cyA9IHBhcnRzOwogICAgCn0KClByb3BlcnR5VmFsdWUucHJvdG90eXBlID0gbmV3IFN5bnRheFVuaXQoKTsKUHJvcGVydHlWYWx1ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQcm9wZXJ0eVZhbHVlOwoKCi8qKgogKiBSZXByZXNlbnRzIGEgc2luZ2xlIHBhcnQgb2YgYSBDU1MgcHJvcGVydHkgdmFsdWUsIG1lYW5pbmcgdGhhdCBpdCByZXByZXNlbnRzCiAqIGp1c3Qgb25lIHBhcnQgb2YgdGhlIGRhdGEgYmV0d2VlbiAiOiIgYW5kICI7Ii4KICogQHBhcmFtIHtTdHJpbmd9IHRleHQgVGhlIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHVuaXQuCiAqIEBwYXJhbSB7aW50fSBsaW5lIFRoZSBsaW5lIG9mIHRleHQgb24gd2hpY2ggdGhlIHVuaXQgcmVzaWRlcy4KICogQHBhcmFtIHtpbnR9IGNvbCBUaGUgY29sdW1uIG9mIHRleHQgb24gd2hpY2ggdGhlIHVuaXQgcmVzaWRlcy4KICogQG5hbWVzcGFjZSBwYXJzZXJsaWIuY3NzCiAqIEBjbGFzcyBQcm9wZXJ0eVZhbHVlUGFydAogKiBAZXh0ZW5kcyBwYXJzZXJsaWIudXRpbC5TeW50YXhVbml0CiAqIEBjb25zdHJ1Y3RvcgogKi8KZnVuY3Rpb24gUHJvcGVydHlWYWx1ZVBhcnQodGV4dCwgbGluZSwgY29sKXsKCiAgICBTeW50YXhVbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKICAgIAogICAgLyoqCiAgICAgKiBJbmRpY2F0ZXMgdGhlIHR5cGUgb2YgdmFsdWUgdW5pdC4KICAgICAqIEB0eXBlIFN0cmluZwogICAgICogQHByb3BlcnR5IHR5cGUKICAgICAqLwogICAgdGhpcy50eXBlID0gInVua25vd24iOwoKICAgIC8vZmlndXJlIG91dCB3aGF0IHR5cGUgb2YgZGF0YSBpdCBpcwogICAgCiAgICB2YXIgdGVtcDsKICAgIAogICAgLy9pdCBpcyBhIG1lYXN1cmVtZW50PwogICAgaWYgKC9eKFsrXC1dP1tcZFwuXSspKFthLXpdKykkL2kudGVzdCh0ZXh0KSl7ICAvL2RpbWVuc2lvbgogICAgICAgIHRoaXMudHlwZSA9ICJkaW1lbnNpb24iOwogICAgICAgIHRoaXMudmFsdWUgPSArUmVnRXhwLiQxOwogICAgICAgIHRoaXMudW5pdHMgPSBSZWdFeHAuJDI7CiAgICAgICAgCiAgICAgICAgLy90cnkgdG8gbmFycm93IGRvd24KICAgICAgICBzd2l0Y2godGhpcy51bml0cy50b0xvd2VyQ2FzZSgpKXsKICAgICAgICAKICAgICAgICAgICAgY2FzZSAiZW0iOgogICAgICAgICAgICBjYXNlICJyZW0iOgogICAgICAgICAgICBjYXNlICJleCI6CiAgICAgICAgICAgIGNhc2UgInB4IjoKICAgICAgICAgICAgY2FzZSAiY20iOgogICAgICAgICAgICBjYXNlICJtbSI6CiAgICAgICAgICAgIGNhc2UgImluIjoKICAgICAgICAgICAgY2FzZSAicHQiOgogICAgICAgICAgICBjYXNlICJwYyI6CiAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSAibGVuZ3RoIjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGNhc2UgImRlZyI6CiAgICAgICAgICAgIGNhc2UgInJhZCI6CiAgICAgICAgICAgIGNhc2UgImdyYWQiOgogICAgICAgICAgICAgICAgdGhpcy50eXBlID0gImFuZ2xlIjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAKICAgICAgICAgICAgY2FzZSAibXMiOgogICAgICAgICAgICBjYXNlICJzIjoKICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9ICJ0aW1lIjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAKICAgICAgICAgICAgY2FzZSAiaHoiOgogICAgICAgICAgICBjYXNlICJraHoiOgogICAgICAgICAgICAgICAgdGhpcy50eXBlID0gImZyZXF1ZW5jeSI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgCiAgICAgICAgICAgIGNhc2UgImRwaSI6CiAgICAgICAgICAgIGNhc2UgImRwY20iOgogICAgICAgICAgICAgICAgdGhpcy50eXBlID0gInJlc29sdXRpb24iOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgLy9kZWZhdWx0CiAgICAgICAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgCiAgICB9IGVsc2UgaWYgKC9eKFsrXC1dP1tcZFwuXSspJSQvaS50ZXN0KHRleHQpKXsgIC8vcGVyY2VudGFnZQogICAgICAgIHRoaXMudHlwZSA9ICJwZXJjZW50YWdlIjsKICAgICAgICB0aGlzLnZhbHVlID0gK1JlZ0V4cC4kMTsKICAgIH0gZWxzZSBpZiAoL14oWytcLV0/W1xkXC5dKyklJC9pLnRlc3QodGV4dCkpeyAgLy9wZXJjZW50YWdlCiAgICAgICAgdGhpcy50eXBlID0gInBlcmNlbnRhZ2UiOwogICAgICAgIHRoaXMudmFsdWUgPSArUmVnRXhwLiQxOwogICAgfSBlbHNlIGlmICgvXihbK1wtXT9cZCspJC9pLnRlc3QodGV4dCkpeyAgLy9pbnRlZ2VyCiAgICAgICAgdGhpcy50eXBlID0gImludGVnZXIiOwogICAgICAgIHRoaXMudmFsdWUgPSArUmVnRXhwLiQxOwogICAgfSBlbHNlIGlmICgvXihbK1wtXT9bXGRcLl0rKSQvaS50ZXN0KHRleHQpKXsgIC8vbnVtYmVyCiAgICAgICAgdGhpcy50eXBlID0gIm51bWJlciI7CiAgICAgICAgdGhpcy52YWx1ZSA9ICtSZWdFeHAuJDE7CiAgICAKICAgIH0gZWxzZSBpZiAoL14jKFthLWYwLTldezMsNn0pL2kudGVzdCh0ZXh0KSl7ICAvL2hleGNvbG9yCiAgICAgICAgdGhpcy50eXBlID0gImNvbG9yIjsKICAgICAgICB0ZW1wID0gUmVnRXhwLiQxOwogICAgICAgIGlmICh0ZW1wLmxlbmd0aCA9PSAzKXsKICAgICAgICAgICAgdGhpcy5yZWQgICAgPSBwYXJzZUludCh0ZW1wLmNoYXJBdCgwKSt0ZW1wLmNoYXJBdCgwKSwxNik7CiAgICAgICAgICAgIHRoaXMuZ3JlZW4gID0gcGFyc2VJbnQodGVtcC5jaGFyQXQoMSkrdGVtcC5jaGFyQXQoMSksMTYpOwogICAgICAgICAgICB0aGlzLmJsdWUgICA9IHBhcnNlSW50KHRlbXAuY2hhckF0KDIpK3RlbXAuY2hhckF0KDIpLDE2KTsgICAgICAgICAgICAKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLnJlZCAgICA9IHBhcnNlSW50KHRlbXAuc3Vic3RyaW5nKDAsMiksMTYpOwogICAgICAgICAgICB0aGlzLmdyZWVuICA9IHBhcnNlSW50KHRlbXAuc3Vic3RyaW5nKDIsNCksMTYpOwogICAgICAgICAgICB0aGlzLmJsdWUgICA9IHBhcnNlSW50KHRlbXAuc3Vic3RyaW5nKDQsNiksMTYpOyAgICAgICAgICAgIAogICAgICAgIH0KICAgIH0gZWxzZSBpZiAoL15yZ2JcKFxzKihcZCspXHMqLFxzKihcZCspXHMqLFxzKihcZCspXHMqXCkvaS50ZXN0KHRleHQpKXsgLy9yZ2IoKSBjb2xvciB3aXRoIGFic29sdXRlIG51bWJlcnMKICAgICAgICB0aGlzLnR5cGUgICA9ICJjb2xvciI7CiAgICAgICAgdGhpcy5yZWQgICAgPSArUmVnRXhwLiQxOwogICAgICAgIHRoaXMuZ3JlZW4gID0gK1JlZ0V4cC4kMjsKICAgICAgICB0aGlzLmJsdWUgICA9ICtSZWdFeHAuJDM7CiAgICB9IGVsc2UgaWYgKC9ecmdiXChccyooXGQrKSVccyosXHMqKFxkKyklXHMqLFxzKihcZCspJVxzKlwpL2kudGVzdCh0ZXh0KSl7IC8vcmdiKCkgY29sb3Igd2l0aCBwZXJjZW50YWdlcwogICAgICAgIHRoaXMudHlwZSAgID0gImNvbG9yIjsKICAgICAgICB0aGlzLnJlZCAgICA9ICtSZWdFeHAuJDEgKiAyNTUgLyAxMDA7CiAgICAgICAgdGhpcy5ncmVlbiAgPSArUmVnRXhwLiQyICogMjU1IC8gMTAwOwogICAgICAgIHRoaXMuYmx1ZSAgID0gK1JlZ0V4cC4kMyAqIDI1NSAvIDEwMDsKICAgIH0gZWxzZSBpZiAoL151cmxcKFsiJ10/KFteXCkiJ10rKVsiJ10/XCkvaS50ZXN0KHRleHQpKXsgLy9VUkkKICAgICAgICB0aGlzLnR5cGUgICA9ICJ1cmkiOwogICAgICAgIHRoaXMudXJpICAgID0gUmVnRXhwLiQxOwogICAgfSBlbHNlIGlmICgvXlsiJ11bXiInXSpbIiddLy50ZXN0KHRleHQpKXsgICAgLy9zdHJpbmcKICAgICAgICB0aGlzLnR5cGUgICA9ICJzdHJpbmciOwogICAgICAgIHRoaXMudmFsdWUgID0gZXZhbCh0ZXh0KTsKICAgIH0gZWxzZSBpZiAoQ29sb3JzW3RleHQudG9Mb3dlckNhc2UoKV0peyAgLy9uYW1lZCBjb2xvcgogICAgICAgIHRoaXMudHlwZSAgID0gImNvbG9yIjsKICAgICAgICB0ZW1wICAgICAgICA9IENvbG9yc1t0ZXh0LnRvTG93ZXJDYXNlKCldLnN1YnN0cmluZygxKTsKICAgICAgICB0aGlzLnJlZCAgICA9IHBhcnNlSW50KHRlbXAuc3Vic3RyaW5nKDAsMiksMTYpOwogICAgICAgIHRoaXMuZ3JlZW4gID0gcGFyc2VJbnQodGVtcC5zdWJzdHJpbmcoMiw0KSwxNik7CiAgICAgICAgdGhpcy5ibHVlICAgPSBwYXJzZUludCh0ZW1wLnN1YnN0cmluZyg0LDYpLDE2KTsgICAgICAgICAKICAgIH0gZWxzZSBpZiAoL15bXCxcL10kLy50ZXN0KHRleHQpKXsKICAgICAgICB0aGlzLnR5cGUgICA9ICJvcGVyYXRvciI7CiAgICAgICAgdGhpcy52YWx1ZSAgPSB0ZXh0OwogICAgfSBlbHNlIGlmICgvXlthLXpcLVx1MDA4MC1cdUZGRkZdW2EtejAtOVwtXHUwMDgwLVx1RkZGRl0qJC9pLnRlc3QodGV4dCkpewogICAgICAgIHRoaXMudHlwZSAgID0gImlkZW50aWZpZXIiOwogICAgICAgIHRoaXMudmFsdWUgID0gdGV4dDsKICAgIH0KCn0KClByb3BlcnR5VmFsdWVQYXJ0LnByb3RvdHlwZSA9IG5ldyBTeW50YXhVbml0KCk7ClByb3BlcnR5VmFsdWVQYXJ0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFByb3BlcnR5VmFsdWU7CgovKioKICogQ3JlYXRlIGEgbmV3IHN5bnRheCB1bml0IGJhc2VkIHNvbGVseSBvbiB0aGUgZ2l2ZW4gdG9rZW4uCiAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgY3JlYXRpbmcgYSBuZXcgc3ludGF4IHVuaXQgd2hlbgogKiBpdCByZXByZXNlbnRzIGEgc2luZ2xlIHRva2VuIGluc3RlYWQgb2YgbXVsdGlwbGUuCiAqIEBwYXJhbSB7T2JqZWN0fSB0b2tlbiBUaGUgdG9rZW4gb2JqZWN0IHRvIHJlcHJlc2VudC4KICogQHJldHVybiB7cGFyc2VybGliLmNzcy5Qcm9wZXJ0eVZhbHVlUGFydH0gVGhlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHRva2VuLgogKiBAc3RhdGljCiAqIEBtZXRob2QgZnJvbVRva2VuCiAqLwpQcm9wZXJ0eVZhbHVlUGFydC5mcm9tVG9rZW4gPSBmdW5jdGlvbih0b2tlbil7CiAgICByZXR1cm4gbmV3IFByb3BlcnR5VmFsdWVQYXJ0KHRva2VuLnZhbHVlLCB0b2tlbi5zdGFydExpbmUsIHRva2VuLnN0YXJ0Q29sKTsKfTsKLyoqCiAqIFJlcHJlc2VudHMgYW4gZW50aXJlIHNpbmdsZSBzZWxlY3RvciwgaW5jbHVkaW5nIGFsbCBwYXJ0cyBidXQgbm90CiAqIGluY2x1ZGluZyBtdWx0aXBsZSBzZWxlY3RvcnMgKHRob3NlIHNlcGFyYXRlZCBieSBjb21tYXMpLgogKiBAbmFtZXNwYWNlIHBhcnNlcmxpYi5jc3MKICogQGNsYXNzIFNlbGVjdG9yCiAqIEBleHRlbmRzIHBhcnNlcmxpYi51dGlsLlN5bnRheFVuaXQKICogQGNvbnN0cnVjdG9yCiAqIEBwYXJhbSB7QXJyYXl9IHBhcnRzIEFycmF5IG9mIHNlbGVjdG9ycyBwYXJ0cyBtYWtpbmcgdXAgdGhpcyBzZWxlY3Rvci4KICogQHBhcmFtIHtpbnR9IGxpbmUgVGhlIGxpbmUgb2YgdGV4dCBvbiB3aGljaCB0aGUgdW5pdCByZXNpZGVzLgogKiBAcGFyYW0ge2ludH0gY29sIFRoZSBjb2x1bW4gb2YgdGV4dCBvbiB3aGljaCB0aGUgdW5pdCByZXNpZGVzLgogKi8KZnVuY3Rpb24gU2VsZWN0b3IocGFydHMsIGxpbmUsIGNvbCl7CiAgICAKICAgIFN5bnRheFVuaXQuY2FsbCh0aGlzLCBwYXJ0cy5qb2luKCIgIiksIGxpbmUsIGNvbCk7CiAgICAKICAgIC8qKgogICAgICogVGhlIHBhcnRzIHRoYXQgbWFrZSB1cCB0aGUgc2VsZWN0b3IuCiAgICAgKiBAdHlwZSBBcnJheQogICAgICogQHByb3BlcnR5IHBhcnRzCiAgICAgKi8KICAgIHRoaXMucGFydHMgPSBwYXJ0czsKCn0KClNlbGVjdG9yLnByb3RvdHlwZSA9IG5ldyBTeW50YXhVbml0KCk7ClNlbGVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNlbGVjdG9yOwoKCi8qKgogKiBSZXByZXNlbnRzIGEgc2luZ2xlIHBhcnQgb2YgYSBzZWxlY3RvciBzdHJpbmcsIG1lYW5pbmcgYSBzaW5nbGUgc2V0IG9mCiAqIGVsZW1lbnQgbmFtZSBhbmQgbW9kaWZpZXJzLiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgY29tYmluYXRvcnMgc3VjaCBhcwogKiBzcGFjZXMsICssID4sIGV0Yy4KICogQG5hbWVzcGFjZSBwYXJzZXJsaWIuY3NzCiAqIEBjbGFzcyBTZWxlY3RvclBhcnQKICogQGV4dGVuZHMgcGFyc2VybGliLnV0aWwuU3ludGF4VW5pdAogKiBAY29uc3RydWN0b3IKICogQHBhcmFtIHtTdHJpbmd9IGVsZW1lbnROYW1lIFRoZSBlbGVtZW50IG5hbWUgaW4gdGhlIHNlbGVjdG9yIG9yIG51bGwKICogICAgICBpZiB0aGVyZSBpcyBubyBlbGVtZW50IG5hbWUuCiAqIEBwYXJhbSB7QXJyYXl9IG1vZGlmaWVycyBBcnJheSBvZiBpbmRpdmlkdWFsIG1vZGlmaWVycyBmb3IgdGhlIGVsZW1lbnQuCiAqICAgICAgTWF5IGJlIGVtcHR5IGlmIHRoZXJlIGFyZSBub25lLgogKiBAcGFyYW0ge1N0cmluZ30gdGV4dCBUaGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdW5pdC4gCiAqIEBwYXJhbSB7aW50fSBsaW5lIFRoZSBsaW5lIG9mIHRleHQgb24gd2hpY2ggdGhlIHVuaXQgcmVzaWRlcy4KICogQHBhcmFtIHtpbnR9IGNvbCBUaGUgY29sdW1uIG9mIHRleHQgb24gd2hpY2ggdGhlIHVuaXQgcmVzaWRlcy4KICovCmZ1bmN0aW9uIFNlbGVjdG9yUGFydChlbGVtZW50TmFtZSwgbW9kaWZpZXJzLCB0ZXh0LCBsaW5lLCBjb2wpewogICAgCiAgICBTeW50YXhVbml0LmNhbGwodGhpcywgdGV4dCwgbGluZSwgY29sKTsKCiAgICAvKioKICAgICAqIFRoZSB0YWcgbmFtZSBvZiB0aGUgZWxlbWVudCB0byB3aGljaCB0aGlzIHBhcnQKICAgICAqIG9mIHRoZSBzZWxlY3RvciBhZmZlY3RzLgogICAgICogQHR5cGUgU3RyaW5nCiAgICAgKiBAcHJvcGVydHkgZWxlbWVudE5hbWUKICAgICAqLwogICAgdGhpcy5lbGVtZW50TmFtZSA9IGVsZW1lbnROYW1lOwogICAgCiAgICAvKioKICAgICAqIFRoZSBwYXJ0cyB0aGF0IGNvbWUgYWZ0ZXIgdGhlIGVsZW1lbnQgbmFtZSwgc3VjaCBhcyBjbGFzcyBuYW1lcywgSURzLAogICAgICogcHNldWRvIGNsYXNzZXMvZWxlbWVudHMsIGV0Yy4KICAgICAqIEB0eXBlIEFycmF5CiAgICAgKiBAcHJvcGVydHkgbW9kaWZpZXJzCiAgICAgKi8KICAgIHRoaXMubW9kaWZpZXJzID0gbW9kaWZpZXJzOwoKfQoKU2VsZWN0b3JQYXJ0LnByb3RvdHlwZSA9IG5ldyBTeW50YXhVbml0KCk7ClNlbGVjdG9yUGFydC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTZWxlY3RvclBhcnQ7CgoKLyoqCiAqIFJlcHJlc2VudHMgYSBzZWxlY3RvciBtb2RpZmllciBzdHJpbmcsIG1lYW5pbmcgYSBjbGFzcyBuYW1lLCBlbGVtZW50IG5hbWUsCiAqIGVsZW1lbnQgSUQsIHBzZXVkbyBydWxlLCBldGMuCiAqIEBuYW1lc3BhY2UgcGFyc2VybGliLmNzcwogKiBAY2xhc3MgU2VsZWN0b3JTdWJQYXJ0CiAqIEBleHRlbmRzIHBhcnNlcmxpYi51dGlsLlN5bnRheFVuaXQKICogQGNvbnN0cnVjdG9yCiAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB1bml0LiAKICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIHR5cGUgb2Ygc2VsZWN0b3IgbW9kaWZpZXIuCiAqIEBwYXJhbSB7aW50fSBsaW5lIFRoZSBsaW5lIG9mIHRleHQgb24gd2hpY2ggdGhlIHVuaXQgcmVzaWRlcy4KICogQHBhcmFtIHtpbnR9IGNvbCBUaGUgY29sdW1uIG9mIHRleHQgb24gd2hpY2ggdGhlIHVuaXQgcmVzaWRlcy4KICovCmZ1bmN0aW9uIFNlbGVjdG9yU3ViUGFydCh0ZXh0LCB0eXBlLCBsaW5lLCBjb2wpewogICAgCiAgICBTeW50YXhVbml0LmNhbGwodGhpcywgdGV4dCwgbGluZSwgY29sKTsKCiAgICAvKioKICAgICAqIFRoZSB0eXBlIG9mIG1vZGlmaWVyLgogICAgICogQHR5cGUgU3RyaW5nCiAgICAgKiBAcHJvcGVydHkgdHlwZQogICAgICovCiAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgCiAgICAvKioKICAgICAqIFNvbWUgc3VicGFydHMgaGF2ZSBhcmd1bWVudHMsIHRoaXMgcmVwcmVzZW50cyB0aGVtLgogICAgICogQHR5cGUgQXJyYXkKICAgICAqIEBwcm9wZXJ0eSBhcmdzCiAgICAgKi8KICAgIHRoaXMuYXJncyA9IFtdOwoKfQoKU2VsZWN0b3JTdWJQYXJ0LnByb3RvdHlwZSA9IG5ldyBTeW50YXhVbml0KCk7ClNlbGVjdG9yU3ViUGFydC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTZWxlY3RvclN1YlBhcnQ7CgoKCgp2YXIgaCA9IC9eWzAtOWEtZkEtRl0kLywKICAgIG5vbmFzY2lpID0gL15bXHUwMDgwLVx1RkZGRl0kLywKICAgIG5sID0gL1xufFxyXG58XHJ8XGYvOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBIZWxwZXIgZnVuY3Rpb25zCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgpmdW5jdGlvbiBpc0hleERpZ2l0KGMpewogICAgcmV0dXJuIGMgIT0gbnVsbCAmJiBoLnRlc3QoYyk7Cn0KCmZ1bmN0aW9uIGlzRGlnaXQoYyl7CiAgICByZXR1cm4gYyAhPSBudWxsICYmIC9cZC8udGVzdChjKTsKfQoKZnVuY3Rpb24gaXNXaGl0ZXNwYWNlKGMpewogICAgcmV0dXJuIGMgIT0gbnVsbCAmJiAvXHMvLnRlc3QoYyk7Cn0KCmZ1bmN0aW9uIGlzTmV3TGluZShjKXsKICAgIHJldHVybiBjICE9IG51bGwgJiYgbmwudGVzdChjKTsKfQoKZnVuY3Rpb24gaXNOYW1lU3RhcnQoYyl7CiAgICByZXR1cm4gYyAhPSBudWxsICYmICgvW2Etel9cdTAwODAtXHVGRkZGXFxdL2kudGVzdChjKSk7Cn0KCmZ1bmN0aW9uIGlzTmFtZUNoYXIoYyl7CiAgICByZXR1cm4gYyAhPSBudWxsICYmIChpc05hbWVTdGFydChjKSB8fCAvWzAtOVwtXFxdLy50ZXN0KGMpKTsKfQoKZnVuY3Rpb24gaXNJZGVudFN0YXJ0KGMpewogICAgcmV0dXJuIGMgIT0gbnVsbCAmJiAoaXNOYW1lU3RhcnQoYykgfHwgL1wtXFwvLnRlc3QoYykpOwp9CgpmdW5jdGlvbiBtaXgocmVjZWl2ZXIsIHN1cHBsaWVyKXsKCWZvciAodmFyIHByb3AgaW4gc3VwcGxpZXIpewoJCWlmIChzdXBwbGllci5oYXNPd25Qcm9wZXJ0eShwcm9wKSl7CgkJCXJlY2VpdmVyW3Byb3BdID0gc3VwcGxpZXJbcHJvcF07CgkJfQoJfQoJcmV0dXJuIHJlY2VpdmVyOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIENTUyBUb2tlbiBTdHJlYW0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCi8qKgogKiBBIHRva2VuIHN0cmVhbSB0aGF0IHByb2R1Y2VzIENTUyB0b2tlbnMuCiAqIEBwYXJhbSB7U3RyaW5nfFJlYWRlcn0gaW5wdXQgVGhlIHNvdXJjZSBvZiB0ZXh0IHRvIHRva2VuaXplLgogKiBAY29uc3RydWN0b3IKICogQGNsYXNzIFRva2VuU3RyZWFtCiAqIEBuYW1lc3BhY2UgcGFyc2VybGliLmNzcwogKi8KZnVuY3Rpb24gVG9rZW5TdHJlYW0oaW5wdXQpewoJVG9rZW5TdHJlYW1CYXNlLmNhbGwodGhpcywgaW5wdXQsIFRva2Vucyk7Cn0KClRva2VuU3RyZWFtLnByb3RvdHlwZSA9IG1peChuZXcgVG9rZW5TdHJlYW1CYXNlKCksIHsKCiAgICAvKioKICAgICAqIE92ZXJyaWRlcyB0aGUgVG9rZW5TdHJlYW1CYXNlIG1ldGhvZCBvZiB0aGUgc2FtZSBuYW1lCiAgICAgKiB0byBwcm9kdWNlIENTUyB0b2tlbnMuCiAgICAgKiBAcGFyYW0ge3ZhcmlhbnR9IGNoYW5uZWwgVGhlIG5hbWUgb2YgdGhlIGNoYW5uZWwgdG8gdXNlCiAgICAgKiAgICAgIGZvciB0aGUgbmV4dCB0b2tlbi4KICAgICAqIEByZXR1cm4ge09iamVjdH0gQSB0b2tlbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBuZXh0IHRva2VuLgogICAgICogQG1ldGhvZCBfZ2V0VG9rZW4KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIF9nZXRUb2tlbjogZnVuY3Rpb24oY2hhbm5lbCl7CgogICAgICAgIHZhciBjLAogICAgICAgICAgICByZWFkZXIgPSB0aGlzLl9yZWFkZXIsCiAgICAgICAgICAgIHRva2VuICAgPSBudWxsLAogICAgICAgICAgICBzdGFydExpbmUgICA9IHJlYWRlci5nZXRMaW5lKCksCiAgICAgICAgICAgIHN0YXJ0Q29sICAgID0gcmVhZGVyLmdldENvbCgpOwoKICAgICAgICBjID0gcmVhZGVyLnJlYWQoKTsKCgogICAgICAgIHdoaWxlKGMpewogICAgICAgICAgICBzd2l0Y2goYyl7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFBvdGVudGlhbCB0b2tlbnM6CiAgICAgICAgICAgICAgICAgKiAtIENPTU1FTlQKICAgICAgICAgICAgICAgICAqIC0gU0xBU0gKICAgICAgICAgICAgICAgICAqIC0gQ0hBUgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBjYXNlICIvIjoKCiAgICAgICAgICAgICAgICAgICAgaWYocmVhZGVyLnBlZWsoKSA9PSAiKiIpewogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMuY29tbWVudFRva2VuKGMsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5jaGFyVG9rZW4oYywgc3RhcnRMaW5lLCBzdGFydENvbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBQb3RlbnRpYWwgdG9rZW5zOgogICAgICAgICAgICAgICAgICogLSBEQVNITUFUQ0gKICAgICAgICAgICAgICAgICAqIC0gSU5DTFVERVMKICAgICAgICAgICAgICAgICAqIC0gUFJFRklYTUFUQ0gKICAgICAgICAgICAgICAgICAqIC0gU1VGRklYTUFUQ0gKICAgICAgICAgICAgICAgICAqIC0gU1VCU1RSSU5HTUFUQ0gKICAgICAgICAgICAgICAgICAqIC0gQ0hBUgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBjYXNlICJ8IjoKICAgICAgICAgICAgICAgIGNhc2UgIn4iOgogICAgICAgICAgICAgICAgY2FzZSAiXiI6CiAgICAgICAgICAgICAgICBjYXNlICIkIjoKICAgICAgICAgICAgICAgIGNhc2UgIioiOgogICAgICAgICAgICAgICAgICAgIGlmKHJlYWRlci5wZWVrKCkgPT0gIj0iKXsKICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmNvbXBhcmlzb25Ub2tlbihjLCBzdGFydExpbmUsIHN0YXJ0Q29sKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMuY2hhclRva2VuKGMsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogUG90ZW50aWFsIHRva2VuczoKICAgICAgICAgICAgICAgICAqIC0gU1RSSU5HCiAgICAgICAgICAgICAgICAgKiAtIElOVkFMSUQKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgY2FzZSAiXCIiOgogICAgICAgICAgICAgICAgY2FzZSAiJyI6CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLnN0cmluZ1Rva2VuKGMsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBQb3RlbnRpYWwgdG9rZW5zOgogICAgICAgICAgICAgICAgICogLSBIQVNICiAgICAgICAgICAgICAgICAgKiAtIENIQVIKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgY2FzZSAiIyI6CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFtZUNoYXIocmVhZGVyLnBlZWsoKSkpewogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMuaGFzaFRva2VuKGMsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5jaGFyVG9rZW4oYywgc3RhcnRMaW5lLCBzdGFydENvbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBQb3RlbnRpYWwgdG9rZW5zOgogICAgICAgICAgICAgICAgICogLSBET1QKICAgICAgICAgICAgICAgICAqIC0gTlVNQkVSCiAgICAgICAgICAgICAgICAgKiAtIERJTUVOU0lPTgogICAgICAgICAgICAgICAgICogLSBQRVJDRU5UQUdFCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGNhc2UgIi4iOgogICAgICAgICAgICAgICAgICAgIGlmIChpc0RpZ2l0KHJlYWRlci5wZWVrKCkpKXsKICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLm51bWJlclRva2VuKGMsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5jaGFyVG9rZW4oYywgc3RhcnRMaW5lLCBzdGFydENvbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBQb3RlbnRpYWwgdG9rZW5zOgogICAgICAgICAgICAgICAgICogLSBDREMKICAgICAgICAgICAgICAgICAqIC0gTUlOVVMKICAgICAgICAgICAgICAgICAqIC0gTlVNQkVSCiAgICAgICAgICAgICAgICAgKiAtIERJTUVOU0lPTgogICAgICAgICAgICAgICAgICogLSBQRVJDRU5UQUdFCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGNhc2UgIi0iOgogICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIucGVlaygpID09ICItIil7ICAvL2NvdWxkIGJlIGNsb3NpbmcgSFRNTC1zdHlsZSBjb21tZW50CiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5odG1sQ29tbWVudEVuZFRva2VuKGMsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNOYW1lU3RhcnQocmVhZGVyLnBlZWsoKSkpewogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMuaWRlbnRPckZ1bmN0aW9uVG9rZW4oYywgc3RhcnRMaW5lLCBzdGFydENvbCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmNoYXJUb2tlbihjLCBzdGFydExpbmUsIHN0YXJ0Q29sKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFBvdGVudGlhbCB0b2tlbnM6CiAgICAgICAgICAgICAgICAgKiAtIElNUE9SVEFOVF9TWU0KICAgICAgICAgICAgICAgICAqIC0gQ0hBUgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBjYXNlICIhIjoKICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMuaW1wb3J0YW50VG9rZW4oYywgc3RhcnRMaW5lLCBzdGFydENvbCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIEFueSBhdC1rZXl3b3JkIG9yIENIQVIKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgY2FzZSAiQCI6CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmF0UnVsZVRva2VuKGMsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBQb3RlbnRpYWwgdG9rZW5zOgogICAgICAgICAgICAgICAgICogLSBOT1QKICAgICAgICAgICAgICAgICAqIC0gQ0hBUgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBjYXNlICI6IjoKICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMubm90VG9rZW4oYywgc3RhcnRMaW5lLCBzdGFydENvbCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFBvdGVudGlhbCB0b2tlbnM6CiAgICAgICAgICAgICAgICAgKiAtIENETwogICAgICAgICAgICAgICAgICogLSBDSEFSCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGNhc2UgIjwiOgogICAgICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5odG1sQ29tbWVudFN0YXJ0VG9rZW4oYywgc3RhcnRMaW5lLCBzdGFydENvbCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFBvdGVudGlhbCB0b2tlbnM6CiAgICAgICAgICAgICAgICAgKiAtIFVOSUNPREVfUkFOR0UKICAgICAgICAgICAgICAgICAqIC0gVVJMCiAgICAgICAgICAgICAgICAgKiAtIENIQVIKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgY2FzZSAiVSI6CiAgICAgICAgICAgICAgICBjYXNlICJ1IjoKICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLnBlZWsoKSA9PSAiKyIpewogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMudW5pY29kZVJhbmdlVG9rZW4oYywgc3RhcnRMaW5lLCBzdGFydENvbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvKmZhbGxzIHRocm91Z2gqLwoKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CgogICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICogUG90ZW50aWFsIHRva2VuczoKICAgICAgICAgICAgICAgICAgICAgKiAtIE5VTUJFUgogICAgICAgICAgICAgICAgICAgICAqIC0gRElNRU5TSU9OCiAgICAgICAgICAgICAgICAgICAgICogLSBMRU5HVEgKICAgICAgICAgICAgICAgICAgICAgKiAtIEZSRVEKICAgICAgICAgICAgICAgICAgICAgKiAtIFRJTUUKICAgICAgICAgICAgICAgICAgICAgKiAtIEVNUwogICAgICAgICAgICAgICAgICAgICAqIC0gRVhTCiAgICAgICAgICAgICAgICAgICAgICogLSBBTkdMRQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIGlmIChpc0RpZ2l0KGMpKXsKICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLm51bWJlclRva2VuKGMsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZQoKICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAqIFBvdGVudGlhbCB0b2tlbnM6CiAgICAgICAgICAgICAgICAgICAgICogLSBTCiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgaWYgKGlzV2hpdGVzcGFjZShjKSl7CiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy53aGl0ZXNwYWNlVG9rZW4oYywgc3RhcnRMaW5lLCBzdGFydENvbCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlCgogICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICogUG90ZW50aWFsIHRva2VuczoKICAgICAgICAgICAgICAgICAgICAgKiAtIElERU5UCiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgaWYgKGlzSWRlbnRTdGFydChjKSl7CiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5pZGVudE9yRnVuY3Rpb25Ub2tlbihjLCBzdGFydExpbmUsIHN0YXJ0Q29sKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UKCiAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgKiBQb3RlbnRpYWwgdG9rZW5zOgogICAgICAgICAgICAgICAgICAgICAqIC0gQ0hBUgogICAgICAgICAgICAgICAgICAgICAqIC0gUExVUwogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmNoYXJUb2tlbihjLCBzdGFydExpbmUsIHN0YXJ0Q29sKTsKICAgICAgICAgICAgICAgICAgICB9CgoKCgoKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vbWFrZSBzdXJlIHRoaXMgdG9rZW4gaXMgd2FudGVkCiAgICAgICAgICAgIC8vVE9ETzogY2hlY2sgY2hhbm5lbAogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGMgPSByZWFkZXIucmVhZCgpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCF0b2tlbiAmJiBjID09IG51bGwpewogICAgICAgICAgICB0b2tlbiA9IHRoaXMuY3JlYXRlVG9rZW4oVG9rZW5zLkVPRixudWxsLHN0YXJ0TGluZSxzdGFydENvbCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdG9rZW47CiAgICB9LAoKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gTWV0aG9kcyB0byBjcmVhdGUgdG9rZW5zCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAvKioKICAgICAqIFByb2R1Y2VzIGEgdG9rZW4gYmFzZWQgb24gYXZhaWxhYmxlIGRhdGEgYW5kIHRoZSBjdXJyZW50CiAgICAgKiByZWFkZXIgcG9zaXRpb24gaW5mb3JtYXRpb24uIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBvdGhlcgogICAgICogcHJpdmF0ZSBtZXRob2RzIHRvIGNyZWF0ZSB0b2tlbnMgYW5kIGlzIG5ldmVyIGNhbGxlZCBkaXJlY3RseS4KICAgICAqIEBwYXJhbSB7aW50fSB0dCBUaGUgdG9rZW4gdHlwZS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZSBUaGUgdGV4dCB2YWx1ZSBvZiB0aGUgdG9rZW4uCiAgICAgKiBAcGFyYW0ge2ludH0gc3RhcnRMaW5lIFRoZSBiZWdpbm5pbmcgbGluZSBmb3IgdGhlIGNoYXJhY3Rlci4KICAgICAqIEBwYXJhbSB7aW50fSBzdGFydENvbCBUaGUgYmVnaW5uaW5nIGNvbHVtbiBmb3IgdGhlIGNoYXJhY3Rlci4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIChPcHRpb25hbCkgU3BlY2lmaWVzIGEgY2hhbm5lbCBwcm9wZXJ0eQogICAgICogICAgICB0byBpbmRpY2F0ZSB0aGF0IGEgZGlmZmVyZW50IGNoYW5uZWwgc2hvdWxkIGJlIHNjYW5uZWQKICAgICAqICAgICAgYW5kL29yIGEgaGlkZSBwcm9wZXJ0eSBpbmRpY2F0aW5nIHRoYXQgdGhlIHRva2VuIHNob3VsZAogICAgICogICAgICBiZSBoaWRkZW4uCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEEgdG9rZW4gb2JqZWN0LgogICAgICogQG1ldGhvZCBjcmVhdGVUb2tlbgogICAgICovCiAgICBjcmVhdGVUb2tlbjogZnVuY3Rpb24odHQsIHZhbHVlLCBzdGFydExpbmUsIHN0YXJ0Q29sLCBvcHRpb25zKXsKICAgICAgICB2YXIgcmVhZGVyID0gdGhpcy5fcmVhZGVyOwogICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB2YWx1ZTogICAgICB2YWx1ZSwKICAgICAgICAgICAgdHlwZTogICAgICAgdHQsCiAgICAgICAgICAgIGNoYW5uZWw6ICAgIG9wdGlvbnMuY2hhbm5lbCwKICAgICAgICAgICAgaGlkZTogICAgICAgb3B0aW9ucy5oaWRlIHx8IGZhbHNlLAogICAgICAgICAgICBzdGFydExpbmU6ICBzdGFydExpbmUsCiAgICAgICAgICAgIHN0YXJ0Q29sOiAgIHN0YXJ0Q29sLAogICAgICAgICAgICBlbmRMaW5lOiAgICByZWFkZXIuZ2V0TGluZSgpLAogICAgICAgICAgICBlbmRDb2w6ICAgICByZWFkZXIuZ2V0Q29sKCkKICAgICAgICB9OwogICAgfSwKCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIE1ldGhvZHMgdG8gY3JlYXRlIHNwZWNpZmljIHRva2VucwogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgLyoqCiAgICAgKiBQcm9kdWNlcyBhIHRva2VuIGZvciBhbnkgYXQtcnVsZS4gSWYgdGhlIGF0LXJ1bGUgaXMgdW5rbm93biwgdGhlbgogICAgICogdGhlIHRva2VuIGlzIGZvciBhIHNpbmdsZSAiQCIgY2hhcmFjdGVyLgogICAgICogQHBhcmFtIHtTdHJpbmd9IGZpcnN0IFRoZSBmaXJzdCBjaGFyYWN0ZXIgZm9yIHRoZSB0b2tlbi4KICAgICAqIEBwYXJhbSB7aW50fSBzdGFydExpbmUgVGhlIGJlZ2lubmluZyBsaW5lIGZvciB0aGUgY2hhcmFjdGVyLgogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0Q29sIFRoZSBiZWdpbm5pbmcgY29sdW1uIGZvciB0aGUgY2hhcmFjdGVyLgogICAgICogQHJldHVybiB7T2JqZWN0fSBBIHRva2VuIG9iamVjdC4KICAgICAqIEBtZXRob2QgYXRSdWxlVG9rZW4KICAgICAqLwogICAgYXRSdWxlVG9rZW46IGZ1bmN0aW9uKGZpcnN0LCBzdGFydExpbmUsIHN0YXJ0Q29sKXsKICAgICAgICB2YXIgcnVsZSAgICA9IGZpcnN0LAogICAgICAgICAgICByZWFkZXIgID0gdGhpcy5fcmVhZGVyLAogICAgICAgICAgICB0dCAgICAgID0gVG9rZW5zLkNIQVIsCiAgICAgICAgICAgIHZhbGlkICAgPSBmYWxzZSwKICAgICAgICAgICAgaWRlbnQsCiAgICAgICAgICAgIGM7CgogICAgICAgIC8qCiAgICAgICAgICogRmlyc3QsIG1hcmsgd2hlcmUgd2UgYXJlLiBUaGVyZSBhcmUgb25seSBmb3VyIEAgcnVsZXMsCiAgICAgICAgICogc28gYW55dGhpbmcgZWxzZSBpcyByZWFsbHkganVzdCBhbiBpbnZhbGlkIHRva2VuLgogICAgICAgICAqIEJhc2ljYWxseSwgaWYgdGhpcyBkb2Vzbid0IG1hdGNoIG9uZSBvZiB0aGUga25vd24gQAogICAgICAgICAqIHJ1bGVzLCBqdXN0IHJldHVybiAnQCcgYXMgYW4gdW5rbm93biB0b2tlbiBhbmQgYWxsb3cKICAgICAgICAgKiBwYXJzaW5nIHRvIGNvbnRpbnVlIGFmdGVyIHRoYXQgcG9pbnQuCiAgICAgICAgICovCiAgICAgICAgcmVhZGVyLm1hcmsoKTsKCiAgICAgICAgLy90cnkgdG8gZmluZCB0aGUgYXQta2V5d29yZAogICAgICAgIGlkZW50ID0gdGhpcy5yZWFkTmFtZSgpOwogICAgICAgIHJ1bGUgPSBmaXJzdCArIGlkZW50OwogICAgICAgIHR0ID0gVG9rZW5zLnR5cGUocnVsZS50b0xvd2VyQ2FzZSgpKTsKCiAgICAgICAgLy9pZiBpdCdzIG5vdCB2YWxpZCwgdXNlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb25seSBhbmQgcmVzZXQgdGhlIHJlYWRlcgogICAgICAgIGlmICh0dCA9PSBUb2tlbnMuQ0hBUiB8fCB0dCA9PSBUb2tlbnMuVU5LTk9XTil7CiAgICAgICAgICAgIHR0ID0gVG9rZW5zLkNIQVI7CiAgICAgICAgICAgIHJ1bGUgPSBmaXJzdDsKICAgICAgICAgICAgcmVhZGVyLnJlc2V0KCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVUb2tlbih0dCwgcnVsZSwgc3RhcnRMaW5lLCBzdGFydENvbCk7CiAgICB9LAoKICAgIC8qKgogICAgICogUHJvZHVjZXMgYSBjaGFyYWN0ZXIgdG9rZW4gYmFzZWQgb24gdGhlIGdpdmVuIGNoYXJhY3RlcgogICAgICogYW5kIGxvY2F0aW9uIGluIHRoZSBzdHJlYW0uIElmIHRoZXJlJ3MgYSBzcGVjaWFsIChub24tc3RhbmRhcmQpCiAgICAgKiB0b2tlbiBuYW1lLCB0aGlzIGlzIHVzZWQ7IG90aGVyd2lzZSBDSEFSIGlzIHVzZWQuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYyBUaGUgY2hhcmFjdGVyIGZvciB0aGUgdG9rZW4uCiAgICAgKiBAcGFyYW0ge2ludH0gc3RhcnRMaW5lIFRoZSBiZWdpbm5pbmcgbGluZSBmb3IgdGhlIGNoYXJhY3Rlci4KICAgICAqIEBwYXJhbSB7aW50fSBzdGFydENvbCBUaGUgYmVnaW5uaW5nIGNvbHVtbiBmb3IgdGhlIGNoYXJhY3Rlci4KICAgICAqIEByZXR1cm4ge09iamVjdH0gQSB0b2tlbiBvYmplY3QuCiAgICAgKiBAbWV0aG9kIGNoYXJUb2tlbgogICAgICovCiAgICBjaGFyVG9rZW46IGZ1bmN0aW9uKGMsIHN0YXJ0TGluZSwgc3RhcnRDb2wpewogICAgICAgIHZhciB0dCA9IFRva2Vucy50eXBlKGMpOwoKICAgICAgICBpZiAodHQgPT0gLTEpewogICAgICAgICAgICB0dCA9IFRva2Vucy5DSEFSOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVG9rZW4odHQsIGMsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOwogICAgfSwKCiAgICAvKioKICAgICAqIFByb2R1Y2VzIGEgY2hhcmFjdGVyIHRva2VuIGJhc2VkIG9uIHRoZSBnaXZlbiBjaGFyYWN0ZXIKICAgICAqIGFuZCBsb2NhdGlvbiBpbiB0aGUgc3RyZWFtLiBJZiB0aGVyZSdzIGEgc3BlY2lhbCAobm9uLXN0YW5kYXJkKQogICAgICogdG9rZW4gbmFtZSwgdGhpcyBpcyB1c2VkOyBvdGhlcndpc2UgQ0hBUiBpcyB1c2VkLgogICAgICogQHBhcmFtIHtTdHJpbmd9IGZpcnN0IFRoZSBmaXJzdCBjaGFyYWN0ZXIgZm9yIHRoZSB0b2tlbi4KICAgICAqIEBwYXJhbSB7aW50fSBzdGFydExpbmUgVGhlIGJlZ2lubmluZyBsaW5lIGZvciB0aGUgY2hhcmFjdGVyLgogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0Q29sIFRoZSBiZWdpbm5pbmcgY29sdW1uIGZvciB0aGUgY2hhcmFjdGVyLgogICAgICogQHJldHVybiB7T2JqZWN0fSBBIHRva2VuIG9iamVjdC4KICAgICAqIEBtZXRob2QgY29tbWVudFRva2VuCiAgICAgKi8KICAgIGNvbW1lbnRUb2tlbjogZnVuY3Rpb24oZmlyc3QsIHN0YXJ0TGluZSwgc3RhcnRDb2wpewogICAgICAgIHZhciByZWFkZXIgID0gdGhpcy5fcmVhZGVyLAogICAgICAgICAgICBjb21tZW50ID0gdGhpcy5yZWFkQ29tbWVudChmaXJzdCk7CgogICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRva2VuKFRva2Vucy5DT01NRU5ULCBjb21tZW50LCBzdGFydExpbmUsIHN0YXJ0Q29sKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBQcm9kdWNlcyBhIGNvbXBhcmlzb24gdG9rZW4gYmFzZWQgb24gdGhlIGdpdmVuIGNoYXJhY3RlcgogICAgICogYW5kIGxvY2F0aW9uIGluIHRoZSBzdHJlYW0uIFRoZSBuZXh0IGNoYXJhY3RlciBtdXN0IGJlCiAgICAgKiByZWFkIGFuZCBpcyBhbHJlYWR5IGtub3duIHRvIGJlIGFuIGVxdWFscyBzaWduLgogICAgICogQHBhcmFtIHtTdHJpbmd9IGMgVGhlIGNoYXJhY3RlciBmb3IgdGhlIHRva2VuLgogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0TGluZSBUaGUgYmVnaW5uaW5nIGxpbmUgZm9yIHRoZSBjaGFyYWN0ZXIuCiAgICAgKiBAcGFyYW0ge2ludH0gc3RhcnRDb2wgVGhlIGJlZ2lubmluZyBjb2x1bW4gZm9yIHRoZSBjaGFyYWN0ZXIuCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEEgdG9rZW4gb2JqZWN0LgogICAgICogQG1ldGhvZCBjb21wYXJpc29uVG9rZW4KICAgICAqLwogICAgY29tcGFyaXNvblRva2VuOiBmdW5jdGlvbihjLCBzdGFydExpbmUsIHN0YXJ0Q29sKXsKICAgICAgICB2YXIgcmVhZGVyICA9IHRoaXMuX3JlYWRlciwKICAgICAgICAgICAgY29tcGFyaXNvbiAgPSBjICsgcmVhZGVyLnJlYWQoKSwKICAgICAgICAgICAgdHQgICAgICA9IFRva2Vucy50eXBlKGNvbXBhcmlzb24pIHx8IFRva2Vucy5DSEFSOwoKICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVUb2tlbih0dCwgY29tcGFyaXNvbiwgc3RhcnRMaW5lLCBzdGFydENvbCk7CiAgICB9LAoKICAgIC8qKgogICAgICogUHJvZHVjZXMgYSBoYXNoIHRva2VuIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgaW5mb3JtYXRpb24uIFRoZQogICAgICogZmlyc3QgY2hhcmFjdGVyIHByb3ZpZGVkIGlzIHRoZSBwb3VuZCBzaWduICgjKSBhbmQgdGhlbiB0aGlzCiAgICAgKiBtZXRob2QgcmVhZHMgYSBuYW1lIGFmdGVyd2FyZC4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaXJzdCBUaGUgZmlyc3QgY2hhcmFjdGVyICgjKSBpbiB0aGUgaGFzaCBuYW1lLgogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0TGluZSBUaGUgYmVnaW5uaW5nIGxpbmUgZm9yIHRoZSBjaGFyYWN0ZXIuCiAgICAgKiBAcGFyYW0ge2ludH0gc3RhcnRDb2wgVGhlIGJlZ2lubmluZyBjb2x1bW4gZm9yIHRoZSBjaGFyYWN0ZXIuCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEEgdG9rZW4gb2JqZWN0LgogICAgICogQG1ldGhvZCBoYXNoVG9rZW4KICAgICAqLwogICAgaGFzaFRva2VuOiBmdW5jdGlvbihmaXJzdCwgc3RhcnRMaW5lLCBzdGFydENvbCl7CiAgICAgICAgdmFyIHJlYWRlciAgPSB0aGlzLl9yZWFkZXIsCiAgICAgICAgICAgIG5hbWUgICAgPSB0aGlzLnJlYWROYW1lKGZpcnN0KTsKCiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVG9rZW4oVG9rZW5zLkhBU0gsIG5hbWUsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOwogICAgfSwKCiAgICAvKioKICAgICAqIFByb2R1Y2VzIGEgQ0RPIG9yIENIQVIgdG9rZW4gYmFzZWQgb24gdGhlIHNwZWNpZmllZCBpbmZvcm1hdGlvbi4gVGhlCiAgICAgKiBmaXJzdCBjaGFyYWN0ZXIgaXMgcHJvdmlkZWQgYW5kIHRoZSByZXN0IGlzIHJlYWQgYnkgdGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZQogICAgICogdGhlIGNvcnJlY3QgdG9rZW4gdG8gY3JlYXRlLgogICAgICogQHBhcmFtIHtTdHJpbmd9IGZpcnN0IFRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHRva2VuLgogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0TGluZSBUaGUgYmVnaW5uaW5nIGxpbmUgZm9yIHRoZSBjaGFyYWN0ZXIuCiAgICAgKiBAcGFyYW0ge2ludH0gc3RhcnRDb2wgVGhlIGJlZ2lubmluZyBjb2x1bW4gZm9yIHRoZSBjaGFyYWN0ZXIuCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEEgdG9rZW4gb2JqZWN0LgogICAgICogQG1ldGhvZCBodG1sQ29tbWVudFN0YXJ0VG9rZW4KICAgICAqLwogICAgaHRtbENvbW1lbnRTdGFydFRva2VuOiBmdW5jdGlvbihmaXJzdCwgc3RhcnRMaW5lLCBzdGFydENvbCl7CiAgICAgICAgdmFyIHJlYWRlciAgICAgID0gdGhpcy5fcmVhZGVyLAogICAgICAgICAgICB0ZXh0ICAgICAgICA9IGZpcnN0OwoKICAgICAgICByZWFkZXIubWFyaygpOwogICAgICAgIHRleHQgKz0gcmVhZGVyLnJlYWRDb3VudCgzKTsKCiAgICAgICAgaWYgKHRleHQgPT0gIjwhLS0iKXsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVG9rZW4oVG9rZW5zLkNETywgdGV4dCwgc3RhcnRMaW5lLCBzdGFydENvbCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVhZGVyLnJlc2V0KCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYXJUb2tlbihmaXJzdCwgc3RhcnRMaW5lLCBzdGFydENvbCk7CiAgICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIFByb2R1Y2VzIGEgQ0RDIG9yIENIQVIgdG9rZW4gYmFzZWQgb24gdGhlIHNwZWNpZmllZCBpbmZvcm1hdGlvbi4gVGhlCiAgICAgKiBmaXJzdCBjaGFyYWN0ZXIgaXMgcHJvdmlkZWQgYW5kIHRoZSByZXN0IGlzIHJlYWQgYnkgdGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZQogICAgICogdGhlIGNvcnJlY3QgdG9rZW4gdG8gY3JlYXRlLgogICAgICogQHBhcmFtIHtTdHJpbmd9IGZpcnN0IFRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHRva2VuLgogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0TGluZSBUaGUgYmVnaW5uaW5nIGxpbmUgZm9yIHRoZSBjaGFyYWN0ZXIuCiAgICAgKiBAcGFyYW0ge2ludH0gc3RhcnRDb2wgVGhlIGJlZ2lubmluZyBjb2x1bW4gZm9yIHRoZSBjaGFyYWN0ZXIuCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEEgdG9rZW4gb2JqZWN0LgogICAgICogQG1ldGhvZCBodG1sQ29tbWVudEVuZFRva2VuCiAgICAgKi8KICAgIGh0bWxDb21tZW50RW5kVG9rZW46IGZ1bmN0aW9uKGZpcnN0LCBzdGFydExpbmUsIHN0YXJ0Q29sKXsKICAgICAgICB2YXIgcmVhZGVyICAgICAgPSB0aGlzLl9yZWFkZXIsCiAgICAgICAgICAgIHRleHQgICAgICAgID0gZmlyc3Q7CgogICAgICAgIHJlYWRlci5tYXJrKCk7CiAgICAgICAgdGV4dCArPSByZWFkZXIucmVhZENvdW50KDIpOwoKICAgICAgICBpZiAodGV4dCA9PSAiLS0+Iil7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRva2VuKFRva2Vucy5DREMsIHRleHQsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlYWRlci5yZXNldCgpOwogICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFyVG9rZW4oZmlyc3QsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOwogICAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBQcm9kdWNlcyBhbiBJREVOVCBvciBGVU5DVElPTiB0b2tlbiBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIGluZm9ybWF0aW9uLiBUaGUKICAgICAqIGZpcnN0IGNoYXJhY3RlciBpcyBwcm92aWRlZCBhbmQgdGhlIHJlc3QgaXMgcmVhZCBieSB0aGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lCiAgICAgKiB0aGUgY29ycmVjdCB0b2tlbiB0byBjcmVhdGUuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmlyc3QgVGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgaWRlbnRpZmllci4KICAgICAqIEBwYXJhbSB7aW50fSBzdGFydExpbmUgVGhlIGJlZ2lubmluZyBsaW5lIGZvciB0aGUgY2hhcmFjdGVyLgogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0Q29sIFRoZSBiZWdpbm5pbmcgY29sdW1uIGZvciB0aGUgY2hhcmFjdGVyLgogICAgICogQHJldHVybiB7T2JqZWN0fSBBIHRva2VuIG9iamVjdC4KICAgICAqIEBtZXRob2QgaWRlbnRPckZ1bmN0aW9uVG9rZW4KICAgICAqLwogICAgaWRlbnRPckZ1bmN0aW9uVG9rZW46IGZ1bmN0aW9uKGZpcnN0LCBzdGFydExpbmUsIHN0YXJ0Q29sKXsKICAgICAgICB2YXIgcmVhZGVyICA9IHRoaXMuX3JlYWRlciwKICAgICAgICAgICAgaWRlbnQgICA9IHRoaXMucmVhZE5hbWUoZmlyc3QpLAogICAgICAgICAgICB0dCAgICAgID0gVG9rZW5zLklERU5UOwoKICAgICAgICAvL2lmIHRoZXJlJ3MgYSBsZWZ0IHBhcmVuIGltbWVkaWF0ZWx5IGFmdGVyLCBpdCdzIGEgVVJJIG9yIGZ1bmN0aW9uCiAgICAgICAgaWYgKHJlYWRlci5wZWVrKCkgPT0gIigiKXsKICAgICAgICAgICAgaWRlbnQgKz0gcmVhZGVyLnJlYWQoKTsKICAgICAgICAgICAgaWYgKGlkZW50LnRvTG93ZXJDYXNlKCkgPT0gInVybCgiKXsKICAgICAgICAgICAgICAgIHR0ID0gVG9rZW5zLlVSSTsKICAgICAgICAgICAgICAgIGlkZW50ID0gdGhpcy5yZWFkVVJJKGlkZW50KTsKCiAgICAgICAgICAgICAgICAvL2RpZG4ndCBmaW5kIGEgdmFsaWQgVVJMIG9yIHRoZXJlJ3Mgbm8gY2xvc2luZyBwYXJlbgogICAgICAgICAgICAgICAgaWYgKGlkZW50LnRvTG93ZXJDYXNlKCkgPT0gInVybCgiKXsKICAgICAgICAgICAgICAgICAgICB0dCA9IFRva2Vucy5GVU5DVElPTjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHR0ID0gVG9rZW5zLkZVTkNUSU9OOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChyZWFkZXIucGVlaygpID09ICI6Iil7ICAvL21pZ2h0IGJlIGFuIElFIGZ1bmN0aW9uCgogICAgICAgICAgICAvL0lFLXNwZWNpZmljIGZ1bmN0aW9ucyBhbHdheXMgYmVpbmcgd2l0aCBwcm9naWQ6CiAgICAgICAgICAgIGlmIChpZGVudC50b0xvd2VyQ2FzZSgpID09ICJwcm9naWQiKXsKICAgICAgICAgICAgICAgIGlkZW50ICs9IHJlYWRlci5yZWFkVG8oIigiKTsKICAgICAgICAgICAgICAgIHR0ID0gVG9rZW5zLklFX0ZVTkNUSU9OOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVUb2tlbih0dCwgaWRlbnQsIHN0YXJ0TGluZSwgc3RhcnRDb2wpOwogICAgfSwKCiAgICAvKioKICAgICAqIFByb2R1Y2VzIGFuIElNUE9SVEFOVF9TWU0gb3IgQ0hBUiB0b2tlbiBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIGluZm9ybWF0aW9uLiBUaGUKICAgICAqIGZpcnN0IGNoYXJhY3RlciBpcyBwcm92aWRlZCBhbmQgdGhlIHJlc3QgaXMgcmVhZCBieSB0aGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lCiAgICAgKiB0aGUgY29ycmVjdCB0b2tlbiB0byBjcmVhdGUuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmlyc3QgVGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgdG9rZW4uCiAgICAgKiBAcGFyYW0ge2ludH0gc3RhcnRMaW5lIFRoZSBiZWdpbm5pbmcgbGluZSBmb3IgdGhlIGNoYXJhY3Rlci4KICAgICAqIEBwYXJhbSB7aW50fSBzdGFydENvbCBUaGUgYmVnaW5uaW5nIGNvbHVtbiBmb3IgdGhlIGNoYXJhY3Rlci4KICAgICAqIEByZXR1cm4ge09iamVjdH0gQSB0b2tlbiBvYmplY3QuCiAgICAgKiBAbWV0aG9kIGltcG9ydGFudFRva2VuCiAgICAgKi8KICAgIGltcG9ydGFudFRva2VuOiBmdW5jdGlvbihmaXJzdCwgc3RhcnRMaW5lLCBzdGFydENvbCl7CiAgICAgICAgdmFyIHJlYWRlciAgICAgID0gdGhpcy5fcmVhZGVyLAogICAgICAgICAgICBpbXBvcnRhbnQgICA9IGZpcnN0LAogICAgICAgICAgICB0dCAgICAgICAgICA9IFRva2Vucy5DSEFSLAogICAgICAgICAgICB0ZW1wLAogICAgICAgICAgICBjOwoKICAgICAgICByZWFkZXIubWFyaygpOwogICAgICAgIGMgPSByZWFkZXIucmVhZCgpOwoKICAgICAgICB3aGlsZShjKXsKCiAgICAgICAgICAgIC8vdGhlcmUgY2FuIGJlIGEgY29tbWVudCBpbiBoZXJlCiAgICAgICAgICAgIGlmIChjID09ICIvIil7CgogICAgICAgICAgICAgICAgLy9pZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaXNuJ3QgYSBzdGFyLCB0aGVuIHRoaXMgaXNuJ3QgYSB2YWxpZCAhaW1wb3J0YW50IHRva2VuCiAgICAgICAgICAgICAgICBpZiAocmVhZGVyLnBlZWsoKSAhPSAiKiIpewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wID0gdGhpcy5yZWFkQ29tbWVudChjKTsKICAgICAgICAgICAgICAgICAgICBpZiAodGVtcCA9PSAiIil7ICAgIC8vYnJva2VuIQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNXaGl0ZXNwYWNlKGMpKXsKICAgICAgICAgICAgICAgIGltcG9ydGFudCArPSBjICsgdGhpcy5yZWFkV2hpdGVzcGFjZSgpOwogICAgICAgICAgICB9IGVsc2UgaWYgKC9pL2kudGVzdChjKSl7CiAgICAgICAgICAgICAgICB0ZW1wID0gcmVhZGVyLnJlYWRDb3VudCg4KTsKICAgICAgICAgICAgICAgIGlmICgvbXBvcnRhbnQvaS50ZXN0KHRlbXApKXsKICAgICAgICAgICAgICAgICAgICBpbXBvcnRhbnQgKz0gYyArIHRlbXA7CiAgICAgICAgICAgICAgICAgICAgdHQgPSBUb2tlbnMuSU1QT1JUQU5UX1NZTTsKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsgIC8vd2UncmUgZG9uZQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGMgPSByZWFkZXIucmVhZCgpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHR0ID09IFRva2Vucy5DSEFSKXsKICAgICAgICAgICAgcmVhZGVyLnJlc2V0KCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYXJUb2tlbihmaXJzdCwgc3RhcnRMaW5lLCBzdGFydENvbCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVG9rZW4odHQsIGltcG9ydGFudCwgc3RhcnRMaW5lLCBzdGFydENvbCk7CiAgICAgICAgfQoKCiAgICB9LAoKICAgIC8qKgogICAgICogUHJvZHVjZXMgYSBOT1Qgb3IgQ0hBUiB0b2tlbiBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIGluZm9ybWF0aW9uLiBUaGUKICAgICAqIGZpcnN0IGNoYXJhY3RlciBpcyBwcm92aWRlZCBhbmQgdGhlIHJlc3QgaXMgcmVhZCBieSB0aGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lCiAgICAgKiB0aGUgY29ycmVjdCB0b2tlbiB0byBjcmVhdGUuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmlyc3QgVGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgdG9rZW4uCiAgICAgKiBAcGFyYW0ge2ludH0gc3RhcnRMaW5lIFRoZSBiZWdpbm5pbmcgbGluZSBmb3IgdGhlIGNoYXJhY3Rlci4KICAgICAqIEBwYXJhbSB7aW50fSBzdGFydENvbCBUaGUgYmVnaW5uaW5nIGNvbHVtbiBmb3IgdGhlIGNoYXJhY3Rlci4KICAgICAqIEByZXR1cm4ge09iamVjdH0gQSB0b2tlbiBvYmplY3QuCiAgICAgKiBAbWV0aG9kIG5vdFRva2VuCiAgICAgKi8KICAgIG5vdFRva2VuOiBmdW5jdGlvbihmaXJzdCwgc3RhcnRMaW5lLCBzdGFydENvbCl7CiAgICAgICAgdmFyIHJlYWRlciAgICAgID0gdGhpcy5fcmVhZGVyLAogICAgICAgICAgICB0ZXh0ICAgICAgICA9IGZpcnN0OwoKICAgICAgICByZWFkZXIubWFyaygpOwogICAgICAgIHRleHQgKz0gcmVhZGVyLnJlYWRDb3VudCg0KTsKCiAgICAgICAgaWYgKHRleHQudG9Mb3dlckNhc2UoKSA9PSAiOm5vdCgiKXsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVG9rZW4oVG9rZW5zLk5PVCwgdGV4dCwgc3RhcnRMaW5lLCBzdGFydENvbCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVhZGVyLnJlc2V0KCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYXJUb2tlbihmaXJzdCwgc3RhcnRMaW5lLCBzdGFydENvbCk7CiAgICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIFByb2R1Y2VzIGEgbnVtYmVyIHRva2VuIGJhc2VkIG9uIHRoZSBnaXZlbiBjaGFyYWN0ZXIKICAgICAqIGFuZCBsb2NhdGlvbiBpbiB0aGUgc3RyZWFtLiBUaGlzIG1heSByZXR1cm4gYSB0b2tlbiBvZgogICAgICogTlVNQkVSLCBFTVMsIEVYUywgTEVOR1RILCBBTkdMRSwgVElNRSwgRlJFUSwgRElNRU5TSU9OLAogICAgICogb3IgUEVSQ0VOVEFHRS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaXJzdCBUaGUgZmlyc3QgY2hhcmFjdGVyIGZvciB0aGUgdG9rZW4uCiAgICAgKiBAcGFyYW0ge2ludH0gc3RhcnRMaW5lIFRoZSBiZWdpbm5pbmcgbGluZSBmb3IgdGhlIGNoYXJhY3Rlci4KICAgICAqIEBwYXJhbSB7aW50fSBzdGFydENvbCBUaGUgYmVnaW5uaW5nIGNvbHVtbiBmb3IgdGhlIGNoYXJhY3Rlci4KICAgICAqIEByZXR1cm4ge09iamVjdH0gQSB0b2tlbiBvYmplY3QuCiAgICAgKiBAbWV0aG9kIG51bWJlclRva2VuCiAgICAgKi8KICAgIG51bWJlclRva2VuOiBmdW5jdGlvbihmaXJzdCwgc3RhcnRMaW5lLCBzdGFydENvbCl7CiAgICAgICAgdmFyIHJlYWRlciAgPSB0aGlzLl9yZWFkZXIsCiAgICAgICAgICAgIHZhbHVlICAgPSB0aGlzLnJlYWROdW1iZXIoZmlyc3QpLAogICAgICAgICAgICBpZGVudCwKICAgICAgICAgICAgdHQgICAgICA9IFRva2Vucy5OVU1CRVIsCiAgICAgICAgICAgIGMgICAgICAgPSByZWFkZXIucGVlaygpOwoKICAgICAgICBpZiAoaXNJZGVudFN0YXJ0KGMpKXsKICAgICAgICAgICAgaWRlbnQgPSB0aGlzLnJlYWROYW1lKHJlYWRlci5yZWFkKCkpOwogICAgICAgICAgICB2YWx1ZSArPSBpZGVudDsKCiAgICAgICAgICAgIGlmICgvXmVtJHxeZXgkfF5weCR8XmdkJHxecmVtJHxednckfF52aCR8XnZtJHxeY2gkfF5jbSR8Xm1tJHxeaW4kfF5wdCR8XnBjJC9pLnRlc3QoaWRlbnQpKXsKICAgICAgICAgICAgICAgIHR0ID0gVG9rZW5zLkxFTkdUSDsKICAgICAgICAgICAgfSBlbHNlIGlmICgvXmRlZ3xecmFkJHxeZ3JhZCQvaS50ZXN0KGlkZW50KSl7CiAgICAgICAgICAgICAgICB0dCA9IFRva2Vucy5BTkdMRTsKICAgICAgICAgICAgfSBlbHNlIGlmICgvXm1zJHxecyQvaS50ZXN0KGlkZW50KSl7CiAgICAgICAgICAgICAgICB0dCA9IFRva2Vucy5USU1FOwogICAgICAgICAgICB9IGVsc2UgaWYgKC9eaHokfF5raHokL2kudGVzdChpZGVudCkpewogICAgICAgICAgICAgICAgdHQgPSBUb2tlbnMuRlJFUTsKICAgICAgICAgICAgfSBlbHNlIGlmICgvXmRwaSR8XmRwY20kL2kudGVzdChpZGVudCkpewogICAgICAgICAgICAgICAgdHQgPSBUb2tlbnMuUkVTT0xVVElPTjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHR0ID0gVG9rZW5zLkRJTUVOU0lPTjsKICAgICAgICAgICAgfQoKICAgICAgICB9IGVsc2UgaWYgKGMgPT0gIiUiKXsKICAgICAgICAgICAgdmFsdWUgKz0gcmVhZGVyLnJlYWQoKTsKICAgICAgICAgICAgdHQgPSBUb2tlbnMuUEVSQ0VOVEFHRTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRva2VuKHR0LCB2YWx1ZSwgc3RhcnRMaW5lLCBzdGFydENvbCk7CiAgICB9LAoKICAgIC8qKgogICAgICogUHJvZHVjZXMgYSBzdHJpbmcgdG9rZW4gYmFzZWQgb24gdGhlIGdpdmVuIGNoYXJhY3RlcgogICAgICogYW5kIGxvY2F0aW9uIGluIHRoZSBzdHJlYW0uIFNpbmNlIHN0cmluZ3MgbWF5IGJlIGluZGljYXRlZAogICAgICogYnkgc2luZ2xlIG9yIGRvdWJsZSBxdW90ZXMsIGEgZmFpbHVyZSB0byBtYXRjaCBzdGFydGluZwogICAgICogYW5kIGVuZGluZyBxdW90ZXMgcmVzdWx0cyBpbiBhbiBJTlZBTElEIHRva2VuIGJlaW5nIGdlbmVyYXRlZC4KICAgICAqIFRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyBpcyBwYXNzZWQgaW4gYW5kIHRoZW4KICAgICAqIHRoZSByZXN0IGFyZSByZWFkIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGZpbmFsIHF1b3RhdGlvbiBtYXJrLgogICAgICogQHBhcmFtIHtTdHJpbmd9IGZpcnN0IFRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4KICAgICAqIEBwYXJhbSB7aW50fSBzdGFydExpbmUgVGhlIGJlZ2lubmluZyBsaW5lIGZvciB0aGUgY2hhcmFjdGVyLgogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0Q29sIFRoZSBiZWdpbm5pbmcgY29sdW1uIGZvciB0aGUgY2hhcmFjdGVyLgogICAgICogQHJldHVybiB7T2JqZWN0fSBBIHRva2VuIG9iamVjdC4KICAgICAqIEBtZXRob2Qgc3RyaW5nVG9rZW4KICAgICAqLwogICAgc3RyaW5nVG9rZW46IGZ1bmN0aW9uKGZpcnN0LCBzdGFydExpbmUsIHN0YXJ0Q29sKXsKICAgICAgICB2YXIgZGVsaW0gICA9IGZpcnN0LAogICAgICAgICAgICBzdHJpbmcgID0gZmlyc3QsCiAgICAgICAgICAgIHJlYWRlciAgPSB0aGlzLl9yZWFkZXIsCiAgICAgICAgICAgIHByZXYgICAgPSBmaXJzdCwKICAgICAgICAgICAgdHQgICAgICA9IFRva2Vucy5TVFJJTkcsCiAgICAgICAgICAgIGMgICAgICAgPSByZWFkZXIucmVhZCgpOwoKICAgICAgICB3aGlsZShjKXsKICAgICAgICAgICAgc3RyaW5nICs9IGM7CgogICAgICAgICAgICAvL2lmIHRoZSBkZWxpbWl0ZXIgaXMgZm91bmQgd2l0aCBhbiBlc2NhcGVtZW50LCB3ZSdyZSBkb25lLgogICAgICAgICAgICBpZiAoYyA9PSBkZWxpbSAmJiBwcmV2ICE9ICJcXCIpewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vaWYgdGhlcmUncyBhIG5ld2xpbmUgd2l0aG91dCBhbiBlc2NhcGVtZW50LCBpdCdzIGFuIGludmFsaWQgc3RyaW5nCiAgICAgICAgICAgIGlmIChpc05ld0xpbmUocmVhZGVyLnBlZWsoKSkgJiYgYyAhPSAiXFwiKXsKICAgICAgICAgICAgICAgIHR0ID0gVG9rZW5zLklOVkFMSUQ7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9zYXZlIHByZXZpb3VzIGFuZCBnZXQgbmV4dAogICAgICAgICAgICBwcmV2ID0gYzsKICAgICAgICAgICAgYyA9IHJlYWRlci5yZWFkKCk7CiAgICAgICAgfQoKICAgICAgICAvL2lmIGMgaXMgbnVsbCwgdGhhdCBtZWFucyB3ZSdyZSBvdXQgb2YgaW5wdXQgYW5kIHRoZSBzdHJpbmcgd2FzIG5ldmVyIGNsb3NlZAogICAgICAgIGlmIChjID09IG51bGwpewogICAgICAgICAgICB0dCA9IFRva2Vucy5JTlZBTElEOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVG9rZW4odHQsIHN0cmluZywgc3RhcnRMaW5lLCBzdGFydENvbCk7CiAgICB9LAoKICAgIHVuaWNvZGVSYW5nZVRva2VuOiBmdW5jdGlvbihmaXJzdCwgc3RhcnRMaW5lLCBzdGFydENvbCl7CiAgICAgICAgdmFyIHJlYWRlciAgPSB0aGlzLl9yZWFkZXIsCiAgICAgICAgICAgIHZhbHVlICAgPSBmaXJzdCwKICAgICAgICAgICAgdGVtcCwKICAgICAgICAgICAgdHQgICAgICA9IFRva2Vucy5DSEFSOwoKICAgICAgICAvL3RoZW4gaXQgc2hvdWxkIGJlIGEgdW5pY29kZSByYW5nZQogICAgICAgIGlmIChyZWFkZXIucGVlaygpID09ICIrIil7CiAgICAgICAgICAgIHJlYWRlci5tYXJrKCk7CiAgICAgICAgICAgIHZhbHVlICs9IHJlYWRlci5yZWFkKCk7CiAgICAgICAgICAgIHZhbHVlICs9IHRoaXMucmVhZFVuaWNvZGVSYW5nZVBhcnQodHJ1ZSk7CgogICAgICAgICAgICAvL2Vuc3VyZSB0aGVyZSdzIGFuIGFjdHVhbCB1bmljb2RlIHJhbmdlIGhlcmUKICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PSAyKXsKICAgICAgICAgICAgICAgIHJlYWRlci5yZXNldCgpOwogICAgICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgICAgIHR0ID0gVG9rZW5zLlVOSUNPREVfUkFOR0U7CgogICAgICAgICAgICAgICAgLy9pZiB0aGVyZSdzIGEgPyBpbiB0aGUgZmlyc3QgcGFydCwgdGhlcmUgY2FuJ3QgYmUgYSBzZWNvbmQgcGFydAogICAgICAgICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoIj8iKSA9PSAtMSl7CgogICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIucGVlaygpID09ICItIil7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5tYXJrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSByZWFkZXIucmVhZCgpOwogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wICs9IHRoaXMucmVhZFVuaWNvZGVSYW5nZVBhcnQoZmFsc2UpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiB0aGVyZSdzIG5vdCBhbm90aGVyIHZhbHVlLCBiYWNrIHVwIGFuZCBqdXN0IHRha2UgdGhlIGZpcnN0CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wLmxlbmd0aCA9PSAxKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5yZXNldCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gdGVtcDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRva2VuKHR0LCB2YWx1ZSwgc3RhcnRMaW5lLCBzdGFydENvbCk7CiAgICB9LAoKICAgIC8qKgogICAgICogUHJvZHVjZXMgYSBTIHRva2VuIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgaW5mb3JtYXRpb24uIFNpbmNlIHdoaXRlc3BhY2UKICAgICAqIG1heSBoYXZlIG11bHRpcGxlIGNoYXJhY3RlcnMsIHRoaXMgY29uc3VtZXMgYWxsIHdoaXRlc3BhY2UgY2hhcmFjdGVycwogICAgICogaW50byBhIHNpbmdsZSB0b2tlbi4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaXJzdCBUaGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSB0b2tlbi4KICAgICAqIEBwYXJhbSB7aW50fSBzdGFydExpbmUgVGhlIGJlZ2lubmluZyBsaW5lIGZvciB0aGUgY2hhcmFjdGVyLgogICAgICogQHBhcmFtIHtpbnR9IHN0YXJ0Q29sIFRoZSBiZWdpbm5pbmcgY29sdW1uIGZvciB0aGUgY2hhcmFjdGVyLgogICAgICogQHJldHVybiB7T2JqZWN0fSBBIHRva2VuIG9iamVjdC4KICAgICAqIEBtZXRob2Qgd2hpdGVzcGFjZVRva2VuCiAgICAgKi8KICAgIHdoaXRlc3BhY2VUb2tlbjogZnVuY3Rpb24oZmlyc3QsIHN0YXJ0TGluZSwgc3RhcnRDb2wpewogICAgICAgIHZhciByZWFkZXIgID0gdGhpcy5fcmVhZGVyLAogICAgICAgICAgICB2YWx1ZSAgID0gZmlyc3QgKyB0aGlzLnJlYWRXaGl0ZXNwYWNlKCk7CiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVG9rZW4oVG9rZW5zLlMsIHZhbHVlLCBzdGFydExpbmUsIHN0YXJ0Q29sKTsKICAgIH0sCgoKCgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBNZXRob2RzIHRvIHJlYWQgdmFsdWVzIGZyb20gdGhlIHN0cmluZyBzdHJlYW0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIHJlYWRVbmljb2RlUmFuZ2VQYXJ0OiBmdW5jdGlvbihhbGxvd1F1ZXN0aW9uTWFyayl7CiAgICAgICAgdmFyIHJlYWRlciAgPSB0aGlzLl9yZWFkZXIsCiAgICAgICAgICAgIHBhcnQgPSAiIiwKICAgICAgICAgICAgYyAgICAgICA9IHJlYWRlci5wZWVrKCk7CgogICAgICAgIC8vZmlyc3QgcmVhZCBoZXggZGlnaXRzCiAgICAgICAgd2hpbGUoaXNIZXhEaWdpdChjKSAmJiBwYXJ0Lmxlbmd0aCA8IDYpewogICAgICAgICAgICByZWFkZXIucmVhZCgpOwogICAgICAgICAgICBwYXJ0ICs9IGM7CiAgICAgICAgICAgIGMgPSByZWFkZXIucGVlaygpOwogICAgICAgIH0KCiAgICAgICAgLy90aGVuIHJlYWQgcXVlc3Rpb24gbWFya3MgaWYgYWxsb3dlZAogICAgICAgIGlmIChhbGxvd1F1ZXN0aW9uTWFyayl7CiAgICAgICAgICAgIHdoaWxlKGMgPT0gIj8iICYmIHBhcnQubGVuZ3RoIDwgNil7CiAgICAgICAgICAgICAgICByZWFkZXIucmVhZCgpOwogICAgICAgICAgICAgICAgcGFydCArPSBjOwogICAgICAgICAgICAgICAgYyA9IHJlYWRlci5wZWVrKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vdGhlcmUgY2FuJ3QgYmUgYW55IG90aGVyIGNoYXJhY3RlcnMgYWZ0ZXIgdGhpcyBwb2ludAoKICAgICAgICByZXR1cm4gcGFydDsKICAgIH0sCgogICAgcmVhZFdoaXRlc3BhY2U6IGZ1bmN0aW9uKCl7CiAgICAgICAgdmFyIHJlYWRlciAgPSB0aGlzLl9yZWFkZXIsCiAgICAgICAgICAgIHdoaXRlc3BhY2UgPSAiIiwKICAgICAgICAgICAgYyAgICAgICA9IHJlYWRlci5wZWVrKCk7CgogICAgICAgIHdoaWxlKGlzV2hpdGVzcGFjZShjKSl7CiAgICAgICAgICAgIHJlYWRlci5yZWFkKCk7CiAgICAgICAgICAgIHdoaXRlc3BhY2UgKz0gYzsKICAgICAgICAgICAgYyA9IHJlYWRlci5wZWVrKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gd2hpdGVzcGFjZTsKICAgIH0sCiAgICByZWFkTnVtYmVyOiBmdW5jdGlvbihmaXJzdCl7CiAgICAgICAgdmFyIHJlYWRlciAgPSB0aGlzLl9yZWFkZXIsCiAgICAgICAgICAgIG51bWJlciAgPSBmaXJzdCwKICAgICAgICAgICAgaGFzRG90ICA9IChmaXJzdCA9PSAiLiIpLAogICAgICAgICAgICBjICAgICAgID0gcmVhZGVyLnBlZWsoKTsKCgogICAgICAgIHdoaWxlKGMpewogICAgICAgICAgICBpZiAoaXNEaWdpdChjKSl7CiAgICAgICAgICAgICAgICBudW1iZXIgKz0gcmVhZGVyLnJlYWQoKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICIuIil7CiAgICAgICAgICAgICAgICBpZiAoaGFzRG90KXsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaGFzRG90ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBudW1iZXIgKz0gcmVhZGVyLnJlYWQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjID0gcmVhZGVyLnBlZWsoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBudW1iZXI7CiAgICB9LAogICAgcmVhZFN0cmluZzogZnVuY3Rpb24oKXsKICAgICAgICB2YXIgcmVhZGVyICA9IHRoaXMuX3JlYWRlciwKICAgICAgICAgICAgZGVsaW0gICA9IHJlYWRlci5yZWFkKCksCiAgICAgICAgICAgIHN0cmluZyAgPSBkZWxpbSwKICAgICAgICAgICAgcHJldiAgICA9IGRlbGltLAogICAgICAgICAgICBjICAgICAgID0gcmVhZGVyLnBlZWsoKTsKCiAgICAgICAgd2hpbGUoYyl7CiAgICAgICAgICAgIGMgPSByZWFkZXIucmVhZCgpOwogICAgICAgICAgICBzdHJpbmcgKz0gYzsKCiAgICAgICAgICAgIC8vaWYgdGhlIGRlbGltaXRlciBpcyBmb3VuZCB3aXRoIGFuIGVzY2FwZW1lbnQsIHdlJ3JlIGRvbmUuCiAgICAgICAgICAgIGlmIChjID09IGRlbGltICYmIHByZXYgIT0gIlxcIil7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9pZiB0aGVyZSdzIGEgbmV3bGluZSB3aXRob3V0IGFuIGVzY2FwZW1lbnQsIGl0J3MgYW4gaW52YWxpZCBzdHJpbmcKICAgICAgICAgICAgaWYgKGlzTmV3TGluZShyZWFkZXIucGVlaygpKSAmJiBjICE9ICJcXCIpewogICAgICAgICAgICAgICAgc3RyaW5nID0gIiI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9zYXZlIHByZXZpb3VzIGFuZCBnZXQgbmV4dAogICAgICAgICAgICBwcmV2ID0gYzsKICAgICAgICAgICAgYyA9IHJlYWRlci5wZWVrKCk7CiAgICAgICAgfQoKICAgICAgICAvL2lmIGMgaXMgbnVsbCwgdGhhdCBtZWFucyB3ZSdyZSBvdXQgb2YgaW5wdXQgYW5kIHRoZSBzdHJpbmcgd2FzIG5ldmVyIGNsb3NlZAogICAgICAgIGlmIChjID09IG51bGwpewogICAgICAgICAgICBzdHJpbmcgPSAiIjsKICAgICAgICB9CgogICAgICAgIHJldHVybiBzdHJpbmc7CiAgICB9LAogICAgcmVhZFVSSTogZnVuY3Rpb24oZmlyc3QpewogICAgICAgIHZhciByZWFkZXIgID0gdGhpcy5fcmVhZGVyLAogICAgICAgICAgICB1cmkgICAgID0gZmlyc3QsCiAgICAgICAgICAgIGlubmVyICAgPSAiIiwKICAgICAgICAgICAgYyAgICAgICA9IHJlYWRlci5wZWVrKCk7CgogICAgICAgIHJlYWRlci5tYXJrKCk7CgogICAgICAgIC8vc2tpcCB3aGl0ZXNwYWNlIGJlZm9yZQogICAgICAgIHdoaWxlKGMgJiYgaXNXaGl0ZXNwYWNlKGMpKXsKICAgICAgICAgICAgcmVhZGVyLnJlYWQoKTsKICAgICAgICAgICAgYyA9IHJlYWRlci5wZWVrKCk7CiAgICAgICAgfQoKICAgICAgICAvL2l0J3MgYSBzdHJpbmcKICAgICAgICBpZiAoYyA9PSAiJyIgfHwgYyA9PSAiXCIiKXsKICAgICAgICAgICAgaW5uZXIgPSB0aGlzLnJlYWRTdHJpbmcoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpbm5lciA9IHRoaXMucmVhZFVSTCgpOwogICAgICAgIH0KCiAgICAgICAgYyA9IHJlYWRlci5wZWVrKCk7CgogICAgICAgIC8vc2tpcCB3aGl0ZXNwYWNlIGFmdGVyCiAgICAgICAgd2hpbGUoYyAmJiBpc1doaXRlc3BhY2UoYykpewogICAgICAgICAgICByZWFkZXIucmVhZCgpOwogICAgICAgICAgICBjID0gcmVhZGVyLnBlZWsoKTsKICAgICAgICB9CgogICAgICAgIC8vaWYgdGhlcmUgd2FzIG5vIGlubmVyIHZhbHVlIG9yIHRoZSBuZXh0IGNoYXJhY3RlciBpc24ndCBjbG9zaW5nIHBhcmVuLCBpdCdzIG5vdCBhIFVSSQogICAgICAgIGlmIChpbm5lciA9PSAiIiB8fCBjICE9ICIpIil7CiAgICAgICAgICAgIHVyaSA9IGZpcnN0OwogICAgICAgICAgICByZWFkZXIucmVzZXQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1cmkgKz0gaW5uZXIgKyByZWFkZXIucmVhZCgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHVyaTsKICAgIH0sCiAgICByZWFkVVJMOiBmdW5jdGlvbigpewogICAgICAgIHZhciByZWFkZXIgID0gdGhpcy5fcmVhZGVyLAogICAgICAgICAgICB1cmwgICAgID0gIiIsCiAgICAgICAgICAgIGMgICAgICAgPSByZWFkZXIucGVlaygpOwoKICAgICAgICAvL1RPRE86IENoZWNrIGZvciBlc2NhcGUgYW5kIG5vbmFzY2lpCiAgICAgICAgd2hpbGUgKC9eWyEjJCUmXFwqLX5dJC8udGVzdChjKSl7CiAgICAgICAgICAgIHVybCArPSByZWFkZXIucmVhZCgpOwogICAgICAgICAgICBjID0gcmVhZGVyLnBlZWsoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB1cmw7CgogICAgfSwKICAgIHJlYWROYW1lOiBmdW5jdGlvbihmaXJzdCl7CiAgICAgICAgdmFyIHJlYWRlciAgPSB0aGlzLl9yZWFkZXIsCiAgICAgICAgICAgIGlkZW50ICAgPSBmaXJzdCB8fCAiIiwKICAgICAgICAgICAgYyAgICAgICA9IHJlYWRlci5wZWVrKCk7CgogICAgICAgIHdoaWxlKHRydWUpewogICAgICAgICAgICBpZiAoYyA9PSAiXFwiKXsKICAgICAgICAgICAgICAgIGlkZW50ICs9IHRoaXMucmVhZEVzY2FwZShyZWFkZXIucmVhZCgpKTsKICAgICAgICAgICAgICAgIGMgPSByZWFkZXIucGVlaygpOwogICAgICAgICAgICB9IGVsc2UgaWYoYyAmJiBpc05hbWVDaGFyKGMpKXsKICAgICAgICAgICAgICAgIGlkZW50ICs9IHJlYWRlci5yZWFkKCk7CiAgICAgICAgICAgICAgICBjID0gcmVhZGVyLnBlZWsoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaWRlbnQ7CiAgICB9LAogICAgCiAgICByZWFkRXNjYXBlOiBmdW5jdGlvbihmaXJzdCl7CiAgICAgICAgdmFyIHJlYWRlciAgPSB0aGlzLl9yZWFkZXIsCiAgICAgICAgICAgIGNzc0VzY2FwZSA9IGZpcnN0IHx8ICIiLAogICAgICAgICAgICBpICAgICAgID0gMCwKICAgICAgICAgICAgYyAgICAgICA9IHJlYWRlci5wZWVrKCk7ICAgIAogICAgCiAgICAgICAgaWYgKGlzSGV4RGlnaXQoYykpewogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBjc3NFc2NhcGUgKz0gcmVhZGVyLnJlYWQoKTsKICAgICAgICAgICAgICAgIGMgPSByZWFkZXIucGVlaygpOwogICAgICAgICAgICB9IHdoaWxlKGMgJiYgaXNIZXhEaWdpdChjKSAmJiArK2kgPCA2KTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKGNzc0VzY2FwZS5sZW5ndGggPT0gMyAmJiAvXHMvLnRlc3QoYykgfHwKICAgICAgICAgICAgY3NzRXNjYXBlLmxlbmd0aCA9PSA3IHx8IGNzc0VzY2FwZS5sZW5ndGggPT0gMSl7CiAgICAgICAgICAgICAgICByZWFkZXIucmVhZCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGMgPSAiIjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIGNzc0VzY2FwZSArIGM7CiAgICB9LAogICAgCiAgICByZWFkQ29tbWVudDogZnVuY3Rpb24oZmlyc3QpewogICAgICAgIHZhciByZWFkZXIgID0gdGhpcy5fcmVhZGVyLAogICAgICAgICAgICBjb21tZW50ID0gZmlyc3QgfHwgIiIsCiAgICAgICAgICAgIGMgICAgICAgPSByZWFkZXIucmVhZCgpOwoKICAgICAgICBpZiAoYyA9PSAiKiIpewogICAgICAgICAgICB3aGlsZShjKXsKICAgICAgICAgICAgICAgIGNvbW1lbnQgKz0gYzsKCiAgICAgICAgICAgICAgICAvL2xvb2sgZm9yIGVuZCBvZiBjb21tZW50CiAgICAgICAgICAgICAgICBpZiAoYyA9PSAiKiIgJiYgcmVhZGVyLnBlZWsoKSA9PSAiLyIpewogICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgKz0gcmVhZGVyLnJlYWQoKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjID0gcmVhZGVyLnJlYWQoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNvbW1lbnQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIH0KCiAgICB9Cn0pOwoKCnZhciBUb2tlbnMgID0gWwoKICAgIC8qCiAgICAgKiBUaGUgZm9sbG93aW5nIHRva2VuIG5hbWVzIGFyZSBkZWZpbmVkIGluIENTUzMgR3JhbW1hcjogaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1zeW50YXgvI2xleGljYWwKICAgICAqLwogICAgIAogICAgLy9IVE1MLXN0eWxlIGNvbW1lbnRzCiAgICB7IG5hbWU6ICJDRE8ifSwKICAgIHsgbmFtZTogIkNEQyJ9LAoKICAgIC8vaWdub3JhYmxlcwogICAgeyBuYW1lOiAiUyIsIHdoaXRlc3BhY2U6IHRydWUvKiwgY2hhbm5lbDogIndzIiovfSwKICAgIHsgbmFtZTogIkNPTU1FTlQiLCBjb21tZW50OiB0cnVlLCBoaWRlOiB0cnVlLCBjaGFubmVsOiAiY29tbWVudCIgfSwKICAgICAgICAKICAgIC8vYXR0cmlidXRlIGVxdWFsaXR5CiAgICB7IG5hbWU6ICJJTkNMVURFUyIsIHRleHQ6ICJ+PSJ9LAogICAgeyBuYW1lOiAiREFTSE1BVENIIiwgdGV4dDogInw9In0sCiAgICB7IG5hbWU6ICJQUkVGSVhNQVRDSCIsIHRleHQ6ICJePSJ9LAogICAgeyBuYW1lOiAiU1VGRklYTUFUQ0giLCB0ZXh0OiAiJD0ifSwKICAgIHsgbmFtZTogIlNVQlNUUklOR01BVENIIiwgdGV4dDogIio9In0sCiAgICAgICAgCiAgICAvL2lkZW50aWZpZXIgdHlwZXMKICAgIHsgbmFtZTogIlNUUklORyJ9LCAgICAgCiAgICB7IG5hbWU6ICJJREVOVCJ9LAogICAgeyBuYW1lOiAiSEFTSCJ9LAoKICAgIC8vYXQta2V5d29yZHMKICAgIHsgbmFtZTogIklNUE9SVF9TWU0iLCB0ZXh0OiAiQGltcG9ydCJ9LAogICAgeyBuYW1lOiAiUEFHRV9TWU0iLCB0ZXh0OiAiQHBhZ2UifSwKICAgIHsgbmFtZTogIk1FRElBX1NZTSIsIHRleHQ6ICJAbWVkaWEifSwKICAgIHsgbmFtZTogIkZPTlRfRkFDRV9TWU0iLCB0ZXh0OiAiQGZvbnQtZmFjZSJ9LAogICAgeyBuYW1lOiAiQ0hBUlNFVF9TWU0iLCB0ZXh0OiAiQGNoYXJzZXQifSwKICAgIHsgbmFtZTogIk5BTUVTUEFDRV9TWU0iLCB0ZXh0OiAiQG5hbWVzcGFjZSJ9LAogICAgLy97IG5hbWU6ICJBVEtFWVdPUkQifSwKICAgIAogICAgLy9DU1MzIGFuaW1hdGlvbnMKICAgIHsgbmFtZTogIktFWUZSQU1FU19TWU0iLCB0ZXh0OiBbICJAa2V5ZnJhbWVzIiwgIkAtd2Via2l0LWtleWZyYW1lcyIsICJALW1vei1rZXlmcmFtZXMiIF0gfSwKCiAgICAvL2ltcG9ydGFudCBzeW1ib2wKICAgIHsgbmFtZTogIklNUE9SVEFOVF9TWU0ifSwKCiAgICAvL21lYXN1cmVtZW50cwogICAgeyBuYW1lOiAiTEVOR1RIIn0sCiAgICB7IG5hbWU6ICJBTkdMRSJ9LAogICAgeyBuYW1lOiAiVElNRSJ9LAogICAgeyBuYW1lOiAiRlJFUSJ9LAogICAgeyBuYW1lOiAiRElNRU5TSU9OIn0sCiAgICB7IG5hbWU6ICJQRVJDRU5UQUdFIn0sCiAgICB7IG5hbWU6ICJOVU1CRVIifSwKICAgIAogICAgLy9mdW5jdGlvbnMKICAgIHsgbmFtZTogIlVSSSJ9LAogICAgeyBuYW1lOiAiRlVOQ1RJT04ifSwKICAgIAogICAgLy9Vbmljb2RlIHJhbmdlcwogICAgeyBuYW1lOiAiVU5JQ09ERV9SQU5HRSJ9LAogICAgCiAgICAvKgogICAgICogVGhlIGZvbGxvd2luZyB0b2tlbiBuYW1lcyBhcmUgZGVmaW5lZCBpbiBDU1MzIFNlbGVjdG9yczogaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1zZWxlY3RvcnMvI3NlbGVjdG9yLXN5bnRheAogICAgICovICAgIAogICAgCiAgICAvL2ludmFsaWQgc3RyaW5nCiAgICB7IG5hbWU6ICJJTlZBTElEIn0sCiAgICAKICAgIC8vY29tYmluYXRvcnMKICAgIHsgbmFtZTogIlBMVVMiLCB0ZXh0OiAiKyIgfSwKICAgIHsgbmFtZTogIkdSRUFURVIiLCB0ZXh0OiAiPiJ9LAogICAgeyBuYW1lOiAiQ09NTUEiLCB0ZXh0OiAiLCJ9LAogICAgeyBuYW1lOiAiVElMREUiLCB0ZXh0OiAifiJ9LAogICAgCiAgICAvL21vZGlmaWVyCiAgICB7IG5hbWU6ICJOT1QifSwgICAgICAgIAogICAgCiAgICAvKgogICAgICogRGVmaW5lZCBpbiBDU1MzIFBhZ2VkIE1lZGlhCiAgICAgKi8KICAgIHsgbmFtZTogIlRPUExFRlRDT1JORVJfU1lNIiwgdGV4dDogIkB0b3AtbGVmdC1jb3JuZXIifSwKICAgIHsgbmFtZTogIlRPUExFRlRfU1lNIiwgdGV4dDogIkB0b3AtbGVmdCJ9LAogICAgeyBuYW1lOiAiVE9QQ0VOVEVSX1NZTSIsIHRleHQ6ICJAdG9wLWNlbnRlciJ9LAogICAgeyBuYW1lOiAiVE9QUklHSFRfU1lNIiwgdGV4dDogIkB0b3AtcmlnaHQifSwKICAgIHsgbmFtZTogIlRPUFJJR0hUQ09STkVSX1NZTSIsIHRleHQ6ICJAdG9wLXJpZ2h0LWNvcm5lciJ9LAogICAgeyBuYW1lOiAiQk9UVE9NTEVGVENPUk5FUl9TWU0iLCB0ZXh0OiAiQGJvdHRvbS1sZWZ0LWNvcm5lciJ9LAogICAgeyBuYW1lOiAiQk9UVE9NTEVGVF9TWU0iLCB0ZXh0OiAiQGJvdHRvbS1sZWZ0In0sCiAgICB7IG5hbWU6ICJCT1RUT01DRU5URVJfU1lNIiwgdGV4dDogIkBib3R0b20tY2VudGVyIn0sCiAgICB7IG5hbWU6ICJCT1RUT01SSUdIVF9TWU0iLCB0ZXh0OiAiQGJvdHRvbS1yaWdodCJ9LAogICAgeyBuYW1lOiAiQk9UVE9NUklHSFRDT1JORVJfU1lNIiwgdGV4dDogIkBib3R0b20tcmlnaHQtY29ybmVyIn0sCiAgICB7IG5hbWU6ICJMRUZUVE9QX1NZTSIsIHRleHQ6ICJAbGVmdC10b3AifSwKICAgIHsgbmFtZTogIkxFRlRNSURETEVfU1lNIiwgdGV4dDogIkBsZWZ0LW1pZGRsZSJ9LAogICAgeyBuYW1lOiAiTEVGVEJPVFRPTV9TWU0iLCB0ZXh0OiAiQGxlZnQtYm90dG9tIn0sCiAgICB7IG5hbWU6ICJSSUdIVFRPUF9TWU0iLCB0ZXh0OiAiQHJpZ2h0LXRvcCJ9LAogICAgeyBuYW1lOiAiUklHSFRNSURETEVfU1lNIiwgdGV4dDogIkByaWdodC1taWRkbGUifSwKICAgIHsgbmFtZTogIlJJR0hUQk9UVE9NX1NZTSIsIHRleHQ6ICJAcmlnaHQtYm90dG9tIn0sCgogICAgLyoKICAgICAqIFRoZSBmb2xsb3dpbmcgdG9rZW4gbmFtZXMgYXJlIGRlZmluZWQgaW4gQ1NTMyBNZWRpYSBRdWVyaWVzOiBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLW1lZGlhcXVlcmllcy8jc3ludGF4CiAgICAgKi8KICAgIC8qeyBuYW1lOiAiTUVESUFfT05MWSIsIHN0YXRlOiAibWVkaWEifSwKICAgIHsgbmFtZTogIk1FRElBX05PVCIsIHN0YXRlOiAibWVkaWEifSwKICAgIHsgbmFtZTogIk1FRElBX0FORCIsIHN0YXRlOiAibWVkaWEifSwqLwogICAgeyBuYW1lOiAiUkVTT0xVVElPTiIsIHN0YXRlOiAibWVkaWEifSwKCiAgICAvKgogICAgICogVGhlIGZvbGxvd2luZyB0b2tlbiBuYW1lcyBhcmUgbm90IGRlZmluZWQgaW4gYW55IENTUyBzcGVjaWZpY2F0aW9uIGJ1dCBhcmUgdXNlZCBieSB0aGUgbGV4ZXIuCiAgICAgKi8KICAgIAogICAgLy9ub3QgYSByZWFsIHRva2VuLCBidXQgdXNlZnVsIGZvciBzdHVwaWQgSUUgZmlsdGVycwogICAgeyBuYW1lOiAiSUVfRlVOQ1RJT04iIH0sCgogICAgLy9wYXJ0IG9mIENTUzMgZ3JhbW1hciBidXQgbm90IHRoZSBGbGV4IGNvZGUKICAgIHsgbmFtZTogIkNIQVIiIH0sCiAgICAKICAgIC8vVE9ETzogTmVlZGVkPwogICAgLy9Ob3QgZGVmaW5lZCBhcyB0b2tlbnMsIGJ1dCBtaWdodCBhcyB3ZWxsIGJlCiAgICB7CiAgICAgICAgbmFtZTogIlBJUEUiLAogICAgICAgIHRleHQ6ICJ8IgogICAgfSwKICAgIHsKICAgICAgICBuYW1lOiAiU0xBU0giLAogICAgICAgIHRleHQ6ICIvIgogICAgfSwKICAgIHsKICAgICAgICBuYW1lOiAiTUlOVVMiLAogICAgICAgIHRleHQ6ICItIgogICAgfSwKICAgIHsKICAgICAgICBuYW1lOiAiU1RBUiIsCiAgICAgICAgdGV4dDogIioiCiAgICB9LAoKICAgIHsKICAgICAgICBuYW1lOiAiTEJSQUNFIiwKICAgICAgICB0ZXh0OiAieyIKICAgIH0sICAgCiAgICB7CiAgICAgICAgbmFtZTogIlJCUkFDRSIsCiAgICAgICAgdGV4dDogIn0iCiAgICB9LCAgICAgIAogICAgewogICAgICAgIG5hbWU6ICJMQlJBQ0tFVCIsCiAgICAgICAgdGV4dDogIlsiCiAgICB9LCAgIAogICAgewogICAgICAgIG5hbWU6ICJSQlJBQ0tFVCIsCiAgICAgICAgdGV4dDogIl0iCiAgICB9LCAgICAKICAgIHsKICAgICAgICBuYW1lOiAiRVFVQUxTIiwKICAgICAgICB0ZXh0OiAiPSIKICAgIH0sCiAgICB7CiAgICAgICAgbmFtZTogIkNPTE9OIiwKICAgICAgICB0ZXh0OiAiOiIKICAgIH0sICAgIAogICAgewogICAgICAgIG5hbWU6ICJTRU1JQ09MT04iLAogICAgICAgIHRleHQ6ICI7IgogICAgfSwgICAgCiAKICAgIHsKICAgICAgICBuYW1lOiAiTFBBUkVOIiwKICAgICAgICB0ZXh0OiAiKCIKICAgIH0sICAgCiAgICB7CiAgICAgICAgbmFtZTogIlJQQVJFTiIsCiAgICAgICAgdGV4dDogIikiCiAgICB9LCAgICAgCiAgICB7CiAgICAgICAgbmFtZTogIkRPVCIsCiAgICAgICAgdGV4dDogIi4iCiAgICB9Cl07CgooZnVuY3Rpb24oKXsKCiAgICB2YXIgbmFtZU1hcCA9IFtdLAogICAgICAgIHR5cGVNYXAgPSB7fTsKICAgIAogICAgVG9rZW5zLlVOS05PV04gPSAtMTsKICAgIFRva2Vucy51bnNoaWZ0KHtuYW1lOiJFT0YifSk7CiAgICBmb3IgKHZhciBpPTAsIGxlbiA9IFRva2Vucy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7CiAgICAgICAgbmFtZU1hcC5wdXNoKFRva2Vuc1tpXS5uYW1lKTsKICAgICAgICBUb2tlbnNbVG9rZW5zW2ldLm5hbWVdID0gaTsKICAgICAgICBpZiAoVG9rZW5zW2ldLnRleHQpewogICAgICAgICAgICBpZiAoVG9rZW5zW2ldLnRleHQgaW5zdGFuY2VvZiBBcnJheSl7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBqPTA7IGogPCBUb2tlbnNbaV0udGV4dC5sZW5ndGg7IGorKyl7CiAgICAgICAgICAgICAgICAgICAgdHlwZU1hcFtUb2tlbnNbaV0udGV4dFtqXV0gPSBpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdHlwZU1hcFtUb2tlbnNbaV0udGV4dF0gPSBpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICBUb2tlbnMubmFtZSA9IGZ1bmN0aW9uKHR0KXsKICAgICAgICByZXR1cm4gbmFtZU1hcFt0dF07CiAgICB9OwogICAgCiAgICBUb2tlbnMudHlwZSA9IGZ1bmN0aW9uKGMpewogICAgICAgIHJldHVybiB0eXBlTWFwW2NdIHx8IC0xOwogICAgfTsKCn0pKCk7CgoKCgoKcGFyc2VybGliLmNzcyA9IHsKQ29sb3JzICAgICAgICAgICAgICA6Q29sb3JzLCAgICAKQ29tYmluYXRvciAgICAgICAgICA6Q29tYmluYXRvciwgICAgICAgICAgICAgICAgClBhcnNlciAgICAgICAgICAgICAgOlBhcnNlciwKUHJvcGVydHlOYW1lICAgICAgICA6UHJvcGVydHlOYW1lLApQcm9wZXJ0eVZhbHVlICAgICAgIDpQcm9wZXJ0eVZhbHVlLApQcm9wZXJ0eVZhbHVlUGFydCAgIDpQcm9wZXJ0eVZhbHVlUGFydCwKTWVkaWFGZWF0dXJlICAgICAgICA6TWVkaWFGZWF0dXJlLApNZWRpYVF1ZXJ5ICAgICAgICAgIDpNZWRpYVF1ZXJ5LApTZWxlY3RvciAgICAgICAgICAgIDpTZWxlY3RvciwKU2VsZWN0b3JQYXJ0ICAgICAgICA6U2VsZWN0b3JQYXJ0LApTZWxlY3RvclN1YlBhcnQgICAgIDpTZWxlY3RvclN1YlBhcnQsClRva2VuU3RyZWFtICAgICAgICAgOlRva2VuU3RyZWFtLApUb2tlbnMgICAgICAgICAgICAgIDpUb2tlbnMKfTsKfSkoKTsKCi8qKgogKiBNYWluIENTU0xpbnQgb2JqZWN0LgogKiBAY2xhc3MgQ1NTTGludAogKiBAc3RhdGljCiAqIEBleHRlbmRzIHBhcnNlcmxpYi51dGlsLkV2ZW50VGFyZ2V0CiAqLwp2YXIgQ1NTTGludCA9IChmdW5jdGlvbigpewoKICAgIHZhciBydWxlcyAgICAgID0gW10sCiAgICAgICAgZm9ybWF0dGVycyA9IFtdLAogICAgICAgIGFwaSAgICAgICAgPSBuZXcgcGFyc2VybGliLnV0aWwuRXZlbnRUYXJnZXQoKTsKICAgICAgICAKICAgIGFwaS52ZXJzaW9uID0gIkBWRVJTSU9OQCI7CgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBSdWxlIE1hbmFnZW1lbnQKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIC8qKgogICAgICogQWRkcyBhIG5ldyBydWxlIHRvIHRoZSBlbmdpbmUuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gcnVsZSBUaGUgcnVsZSB0byBhZGQuCiAgICAgKiBAbWV0aG9kIGFkZFJ1bGUKICAgICAqLwogICAgYXBpLmFkZFJ1bGUgPSBmdW5jdGlvbihydWxlKXsKICAgICAgICBydWxlcy5wdXNoKHJ1bGUpOwogICAgICAgIHJ1bGVzW3J1bGUuaWRdID0gcnVsZTsKICAgIH07CgogICAgLyoqCiAgICAgKiBDbGVhcnMgYWxsIHJ1bGUgZnJvbSB0aGUgZW5naW5lLgogICAgICogQG1ldGhvZCBjbGVhclJ1bGVzCiAgICAgKi8KICAgIGFwaS5jbGVhclJ1bGVzID0gZnVuY3Rpb24oKXsKICAgICAgICBydWxlcyA9IFtdOwogICAgfTsKCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIEZvcm1hdHRlcnMKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIC8qKgogICAgICogQWRkcyBhIG5ldyBmb3JtYXR0ZXIgdG8gdGhlIGVuZ2luZS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmb3JtYXR0ZXIgVGhlIGZvcm1hdHRlciB0byBhZGQuCiAgICAgKiBAbWV0aG9kIGFkZEZvcm1hdHRlcgogICAgICovCiAgICBhcGkuYWRkRm9ybWF0dGVyID0gZnVuY3Rpb24oZm9ybWF0dGVyKSB7CiAgICAgICAgLy8gZm9ybWF0dGVycy5wdXNoKGZvcm1hdHRlcik7CiAgICAgICAgZm9ybWF0dGVyc1tmb3JtYXR0ZXIuaWRdID0gZm9ybWF0dGVyOwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgYSBmb3JtYXR0ZXIgZm9yIHVzZS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmb3JtYXRJZCBUaGUgbmFtZSBvZiB0aGUgZm9ybWF0IHRvIHJldHJpZXZlLgogICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgZm9ybWF0dGVyIG9yIHVuZGVmaW5lZC4KICAgICAqIEBtZXRob2QgZ2V0Rm9ybWF0dGVyCiAgICAgKi8KICAgIGFwaS5nZXRGb3JtYXR0ZXIgPSBmdW5jdGlvbihmb3JtYXRJZCl7CiAgICAgICAgcmV0dXJuIGZvcm1hdHRlcnNbZm9ybWF0SWRdOwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBGb3JtYXRzIHRoZSByZXN1bHRzIGluIGEgcGFydGljdWxhciBmb3JtYXQgZm9yIGEgc2luZ2xlIGZpbGUuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzdWx0IFRoZSByZXN1bHRzIHJldHVybmVkIGZyb20gQ1NTTGludC52ZXJpZnkoKS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWxlbmFtZSBUaGUgZmlsZW5hbWUgZm9yIHdoaWNoIHRoZSByZXN1bHRzIGFwcGx5LgogICAgICogQHBhcmFtIHtTdHJpbmd9IGZvcm1hdElkIFRoZSBuYW1lIG9mIHRoZSBmb3JtYXR0ZXIgdG8gdXNlLgogICAgICogQHJldHVybiB7U3RyaW5nfSBBIGZvcm1hdHRlZCBzdHJpbmcgZm9yIHRoZSByZXN1bHRzLgogICAgICogQG1ldGhvZCBmb3JtYXQKICAgICAqLwogICAgYXBpLmZvcm1hdCA9IGZ1bmN0aW9uKHJlc3VsdHMsIGZpbGVuYW1lLCBmb3JtYXRJZCkgewogICAgICAgIHZhciBmb3JtYXR0ZXIgPSB0aGlzLmdldEZvcm1hdHRlcihmb3JtYXRJZCksCiAgICAgICAgICAgIHJlc3VsdCA9IG51bGw7CiAgICAgICAgICAgIAogICAgICAgIGlmIChmb3JtYXR0ZXIpewogICAgICAgICAgICByZXN1bHQgPSBmb3JtYXR0ZXIuc3RhcnRGb3JtYXQoKTsKICAgICAgICAgICAgcmVzdWx0ICs9IGZvcm1hdHRlci5mb3JtYXRSZXN1bHRzKHJlc3VsdHMsIGZpbGVuYW1lKTsKICAgICAgICAgICAgcmVzdWx0ICs9IGZvcm1hdHRlci5lbmRGb3JtYXQoKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0gICAgCiAgICAKICAgIC8qKgogICAgICogSW5kaWNhdGVzIGlmIHRoZSBnaXZlbiBmb3JtYXQgaXMgc3VwcG9ydGVkLgogICAgICogQHBhcmFtIHtTdHJpbmd9IGZvcm1hdElkIFRoZSBJRCBvZiB0aGUgZm9ybWF0IHRvIGNoZWNrLgogICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZm9ybWF0IGV4aXN0cywgZmFsc2UgaWYgbm90LgogICAgICogQG1ldGhvZCBoYXNGb3JtYXQKICAgICAqLwogICAgYXBpLmhhc0Zvcm1hdCA9IGZ1bmN0aW9uKGZvcm1hdElkKXsKICAgICAgICByZXR1cm4gZm9ybWF0dGVycy5oYXNPd25Qcm9wZXJ0eShmb3JtYXRJZCk7CiAgICB9OwoKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gVmVyaWZpY2F0aW9uCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAvKioKICAgICAqIFN0YXJ0cyB0aGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgZm9yIHRoZSBnaXZlbiBDU1MgdGV4dC4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSBDU1MgdGV4dCB0byB2ZXJpZnkuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gcnVsZXNldCAoT3B0aW9uYWwpIExpc3Qgb2YgcnVsZXMgdG8gYXBwbHkuIElmIG51bGwsIHRoZW4KICAgICAqICAgICAgYWxsIHJ1bGVzIGFyZSB1c2VkLgogICAgICogQHJldHVybiB7T2JqZWN0fSBSZXN1bHRzIG9mIHRoZSB2ZXJpZmljYXRpb24uCiAgICAgKiBAbWV0aG9kIHZlcmlmeQogICAgICovCiAgICBhcGkudmVyaWZ5ID0gZnVuY3Rpb24odGV4dCwgcnVsZXNldCl7CgogICAgICAgIHZhciBpICAgICAgID0gMCwKICAgICAgICAgICAgbGVuICAgICA9IHJ1bGVzLmxlbmd0aCwKICAgICAgICAgICAgcmVwb3J0ZXIsCiAgICAgICAgICAgIGxpbmVzLAogICAgICAgICAgICBwYXJzZXIgPSBuZXcgcGFyc2VybGliLmNzcy5QYXJzZXIoeyBzdGFySGFjazogdHJ1ZSwgaWVGaWx0ZXJzOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcnNjb3JlSGFjazogdHJ1ZSwgc3RyaWN0OiBmYWxzZSB9KTsKCiAgICAgICAgbGluZXMgPSB0ZXh0LnNwbGl0KC9cblxyPy9nKTsKICAgICAgICByZXBvcnRlciA9IG5ldyBSZXBvcnRlcihsaW5lcyk7CgogICAgICAgIGlmICghcnVsZXNldCl7CiAgICAgICAgICAgIHdoaWxlIChpIDwgbGVuKXsKICAgICAgICAgICAgICAgIHJ1bGVzW2krK10uaW5pdChwYXJzZXIsIHJlcG9ydGVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJ1bGVzZXQuZXJyb3JzID0gMTsgICAgICAgLy9hbHdheXMgcmVwb3J0IHBhcnNpbmcgZXJyb3JzCiAgICAgICAgICAgIGZvciAoaSBpbiBydWxlc2V0KXsKICAgICAgICAgICAgICAgIGlmKHJ1bGVzZXQuaGFzT3duUHJvcGVydHkoaSkpewogICAgICAgICAgICAgICAgICAgIGlmIChydWxlc1tpXSl7CiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzW2ldLmluaXQocGFyc2VyLCByZXBvcnRlcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvL2NhcHR1cmUgbW9zdCBob3JyaWJsZSBlcnJvciB0eXBlCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcGFyc2VyLnBhcnNlKHRleHQpOwogICAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgICAgIHJlcG9ydGVyLmVycm9yKCJGYXRhbCBlcnJvciwgY2Fubm90IGNvbnRpbnVlOiAiICsgZXgubWVzc2FnZSwgZXgubGluZSwgZXguY29sKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG1lc3NhZ2VzICAgIDogcmVwb3J0ZXIubWVzc2FnZXMsCiAgICAgICAgICAgIHN0YXRzICAgICAgIDogcmVwb3J0ZXIuc3RhdHMKICAgICAgICB9OwogICAgfTsKCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIFB1Ymxpc2ggdGhlIEFQSQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgcmV0dXJuIGFwaTsKCn0pKCk7Ci8qKgogKiBBbiBpbnN0YW5jZSBvZiBSZXBvcnQgaXMgdXNlZCB0byByZXBvcnQgcmVzdWx0cyBvZiB0aGUKICogdmVyaWZpY2F0aW9uIGJhY2sgdG8gdGhlIG1haW4gQVBJLgogKiBAY2xhc3MgUmVwb3J0ZXIKICogQGNvbnN0cnVjdG9yCiAqIEBwYXJhbSB7U3RyaW5nW119IGxpbmVzIFRoZSB0ZXh0IGxpbmVzIG9mIHRoZSBzb3VyY2UuCiAqLwpmdW5jdGlvbiBSZXBvcnRlcihsaW5lcyl7CgogICAgLyoqCiAgICAgKiBMaXN0IG9mIG1lc3NhZ2VzIGJlaW5nIHJlcG9ydGVkLgogICAgICogQHByb3BlcnR5IG1lc3NhZ2VzCiAgICAgKiBAdHlwZSBTdHJpbmdbXQogICAgICovCiAgICB0aGlzLm1lc3NhZ2VzID0gW107CgogICAgLyoqCiAgICAgKiBMaXN0IG9mIHN0YXRpc3RpY3MgYmVpbmcgcmVwb3J0ZWQuCiAgICAgKiBAcHJvcGVydHkgc3RhdHMKICAgICAqIEB0eXBlIFN0cmluZ1tdCiAgICAgKi8KICAgIHRoaXMuc3RhdHMgPSBbXTsKCiAgICAvKioKICAgICAqIExpbmVzIG9mIGNvZGUgYmVpbmcgcmVwb3J0ZWQgb24uIFVzZWQgdG8gcHJvdmlkZSBjb250ZXh0dWFsIGluZm9ybWF0aW9uCiAgICAgKiBmb3IgbWVzc2FnZXMuCiAgICAgKiBAcHJvcGVydHkgbGluZXMKICAgICAqIEB0eXBlIFN0cmluZ1tdCiAgICAgKi8KICAgIHRoaXMubGluZXMgPSBsaW5lczsKfQoKUmVwb3J0ZXIucHJvdG90eXBlID0gewoKICAgIC8vcmVzdG9yZSBjb25zdHJ1Y3RvcgogICAgY29uc3RydWN0b3I6IFJlcG9ydGVyLAoKICAgIC8qKgogICAgICogUmVwb3J0IGFuIGVycm9yLgogICAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gc3RvcmUuCiAgICAgKiBAcGFyYW0ge2ludH0gbGluZSBUaGUgbGluZSBudW1iZXIuCiAgICAgKiBAcGFyYW0ge2ludH0gY29sIFRoZSBjb2x1bW4gbnVtYmVyLgogICAgICogQHBhcmFtIHtPYmplY3R9IHJ1bGUgVGhlIHJ1bGUgdGhpcyBtZXNzYWdlIHJlbGF0ZXMgdG8uCiAgICAgKiBAbWV0aG9kIGVycm9yCiAgICAgKi8KICAgIGVycm9yOiBmdW5jdGlvbihtZXNzYWdlLCBsaW5lLCBjb2wsIHJ1bGUpewogICAgICAgIHRoaXMubWVzc2FnZXMucHVzaCh7CiAgICAgICAgICAgIHR5cGUgICAgOiAiZXJyb3IiLAogICAgICAgICAgICBsaW5lICAgIDogbGluZSwKICAgICAgICAgICAgY29sICAgICA6IGNvbCwKICAgICAgICAgICAgbWVzc2FnZSA6IG1lc3NhZ2UsCiAgICAgICAgICAgIGV2aWRlbmNlOiB0aGlzLmxpbmVzW2xpbmUtMV0sCiAgICAgICAgICAgIHJ1bGUgICAgOiBydWxlCiAgICAgICAgfSk7CiAgICB9LAoKICAgIC8qKgogICAgICogUmVwb3J0IGFuIHdhcm5pbmcuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBzdG9yZS4KICAgICAqIEBwYXJhbSB7aW50fSBsaW5lIFRoZSBsaW5lIG51bWJlci4KICAgICAqIEBwYXJhbSB7aW50fSBjb2wgVGhlIGNvbHVtbiBudW1iZXIuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gcnVsZSBUaGUgcnVsZSB0aGlzIG1lc3NhZ2UgcmVsYXRlcyB0by4KICAgICAqIEBtZXRob2Qgd2FybgogICAgICovCiAgICB3YXJuOiBmdW5jdGlvbihtZXNzYWdlLCBsaW5lLCBjb2wsIHJ1bGUpewogICAgICAgIHRoaXMubWVzc2FnZXMucHVzaCh7CiAgICAgICAgICAgIHR5cGUgICAgOiAid2FybmluZyIsCiAgICAgICAgICAgIGxpbmUgICAgOiBsaW5lLAogICAgICAgICAgICBjb2wgICAgIDogY29sLAogICAgICAgICAgICBtZXNzYWdlIDogbWVzc2FnZSwKICAgICAgICAgICAgZXZpZGVuY2U6IHRoaXMubGluZXNbbGluZS0xXSwKICAgICAgICAgICAgcnVsZSAgICA6IHJ1bGUKICAgICAgICB9KTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXBvcnQgc29tZSBpbmZvcm1hdGlvbmFsIHRleHQuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBzdG9yZS4KICAgICAqIEBwYXJhbSB7aW50fSBsaW5lIFRoZSBsaW5lIG51bWJlci4KICAgICAqIEBwYXJhbSB7aW50fSBjb2wgVGhlIGNvbHVtbiBudW1iZXIuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gcnVsZSBUaGUgcnVsZSB0aGlzIG1lc3NhZ2UgcmVsYXRlcyB0by4KICAgICAqIEBtZXRob2QgaW5mbwogICAgICovCiAgICBpbmZvOiBmdW5jdGlvbihtZXNzYWdlLCBsaW5lLCBjb2wsIHJ1bGUpewogICAgICAgIHRoaXMubWVzc2FnZXMucHVzaCh7CiAgICAgICAgICAgIHR5cGUgICAgOiAiaW5mbyIsCiAgICAgICAgICAgIGxpbmUgICAgOiBsaW5lLAogICAgICAgICAgICBjb2wgICAgIDogY29sLAogICAgICAgICAgICBtZXNzYWdlIDogbWVzc2FnZSwKICAgICAgICAgICAgZXZpZGVuY2U6IHRoaXMubGluZXNbbGluZS0xXSwKICAgICAgICAgICAgcnVsZSAgICA6IHJ1bGUKICAgICAgICB9KTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXBvcnQgc29tZSByb2xsdXAgZXJyb3IgaW5mb3JtYXRpb24uCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBzdG9yZS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBydWxlIFRoZSBydWxlIHRoaXMgbWVzc2FnZSByZWxhdGVzIHRvLgogICAgICogQG1ldGhvZCByb2xsdXBFcnJvcgogICAgICovCiAgICByb2xsdXBFcnJvcjogZnVuY3Rpb24obWVzc2FnZSwgcnVsZSl7CiAgICAgICAgdGhpcy5tZXNzYWdlcy5wdXNoKHsKICAgICAgICAgICAgdHlwZSAgICA6ICJlcnJvciIsCiAgICAgICAgICAgIHJvbGx1cCAgOiB0cnVlLAogICAgICAgICAgICBtZXNzYWdlIDogbWVzc2FnZSwKICAgICAgICAgICAgcnVsZSAgICA6IHJ1bGUKICAgICAgICB9KTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXBvcnQgc29tZSByb2xsdXAgd2FybmluZyBpbmZvcm1hdGlvbi4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHN0b3JlLgogICAgICogQHBhcmFtIHtPYmplY3R9IHJ1bGUgVGhlIHJ1bGUgdGhpcyBtZXNzYWdlIHJlbGF0ZXMgdG8uCiAgICAgKiBAbWV0aG9kIHJvbGx1cFdhcm4KICAgICAqLwogICAgcm9sbHVwV2FybjogZnVuY3Rpb24obWVzc2FnZSwgcnVsZSl7CiAgICAgICAgdGhpcy5tZXNzYWdlcy5wdXNoKHsKICAgICAgICAgICAgdHlwZSAgICA6ICJ3YXJuaW5nIiwKICAgICAgICAgICAgcm9sbHVwICA6IHRydWUsCiAgICAgICAgICAgIG1lc3NhZ2UgOiBtZXNzYWdlLAogICAgICAgICAgICBydWxlICAgIDogcnVsZQogICAgICAgIH0pOwogICAgfSwKCiAgICAvKioKICAgICAqIFJlcG9ydCBhIHN0YXRpc3RpYy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzdGF0IHRvIHN0b3JlLgogICAgICogQHBhcmFtIHtWYXJpYW50fSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHN0YXQuCiAgICAgKiBAbWV0aG9kIHN0YXQKICAgICAqLwogICAgc3RhdDogZnVuY3Rpb24obmFtZSwgdmFsdWUpewogICAgICAgIHRoaXMuc3RhdHNbbmFtZV0gPSB2YWx1ZTsKICAgIH0KfTsKLyoKICogVXRpbGl0eSBmdW5jdGlvbnMgdGhhdCBtYWtlIGxpZmUgZWFzaWVyLgogKi8KCi8qCiAqIEFkZHMgYWxsIHByb3BlcnRpZXMgZnJvbSBzdXBwbGllciBvbnRvIHJlY2VpdmVyLAogKiBvdmVyd3JpdGluZyBpZiB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIG9uCiAqIHJlY2lldmVyLgogKiBAcGFyYW0ge09iamVjdH0gVGhlIG9iamVjdCB0byByZWNlaXZlIHRoZSBwcm9wZXJ0aWVzLgogKiBAcGFyYW0ge09iamVjdH0gVGhlIG9iamVjdCB0byBwcm92aWRlIHRoZSBwcm9wZXJ0aWVzLgogKiBAcmV0dXJuIHtPYmplY3R9IFRoZSByZWNlaXZlcgogKi8KZnVuY3Rpb24gbWl4KHJlY2lldmVyLCBzdXBwbGllcil7CiAgICB2YXIgcHJvcDsKCiAgICBmb3IgKHByb3AgaW4gc3VwcGxpZXIpewogICAgICAgIGlmIChzdXBwbGllci5oYXNPd25Qcm9wZXJ0eShwcm9wKSl7CiAgICAgICAgICAgIHJlY2VpdmVyW3Byb3BdID0gc3VwcGxpZXJbcHJvcF07CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBwcm9wOwp9CgovKgogKiBQb2x5ZmlsbCBmb3IgYXJyYXkgaW5kZXhPZigpIG1ldGhvZC4KICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSBhcnJheSB0byBzZWFyY2guCiAqIEBwYXJhbSB7VmFyaWFudH0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuCiAqIEByZXR1cm4ge2ludH0gVGhlIGluZGV4IG9mIHRoZSB2YWx1ZSBpZiBmb3VuZCwgLTEgaWYgbm90LgogKi8KZnVuY3Rpb24gaW5kZXhPZih2YWx1ZXMsIHZhbHVlKXsKICAgIGlmICh2YWx1ZXMuaW5kZXhPZil7CiAgICAgICAgcmV0dXJuIHZhbHVlcy5pbmRleE9mKHZhbHVlKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZm9yICh2YXIgaT0wLCBsZW49dmFsdWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsKICAgICAgICAgICAgaWYgKHZhbHVlc1tpXSA9PT0gdmFsdWUpewogICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQp9Ci8qCiAqIFJ1bGU6IERvbid0IHVzZSBhZGpvaW5pbmcgY2xhc3NlcyAoLmZvby5iYXIpLgogKi8KQ1NTTGludC5hZGRSdWxlKHsKCiAgICAvL3J1bGUgaW5mb3JtYXRpb24KICAgIGlkOiAiYWRqb2luaW5nLWNsYXNzZXMiLAogICAgbmFtZTogIkFkam9pbmluZyBDbGFzc2VzIiwKICAgIGRlc2M6ICJEb24ndCB1c2UgYWRqb2luaW5nIGNsYXNzZXMuIiwKICAgIGJyb3dzZXJzOiAiSUU2IiwKCiAgICAvL2luaXRpYWxpemF0aW9uCiAgICBpbml0OiBmdW5jdGlvbihwYXJzZXIsIHJlcG9ydGVyKXsKICAgICAgICB2YXIgcnVsZSA9IHRoaXM7CiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJzdGFydHJ1bGUiLCBmdW5jdGlvbihldmVudCl7CiAgICAgICAgICAgIHZhciBzZWxlY3RvcnMgPSBldmVudC5zZWxlY3RvcnMsCiAgICAgICAgICAgICAgICBzZWxlY3RvciwKICAgICAgICAgICAgICAgIHBhcnQsCiAgICAgICAgICAgICAgICBtb2RpZmllciwKICAgICAgICAgICAgICAgIGNsYXNzQ291bnQsCiAgICAgICAgICAgICAgICBpLCBqLCBrOwoKICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBzZWxlY3RvcnMubGVuZ3RoOyBpKyspewogICAgICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWxlY3RvcnNbaV07CiAgICAgICAgICAgICAgICBmb3IgKGo9MDsgaiA8IHNlbGVjdG9yLnBhcnRzLmxlbmd0aDsgaisrKXsKICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gc2VsZWN0b3IucGFydHNbal07CiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBwYXJzZXJsaWIuY3NzLlNlbGVjdG9yUGFydCl7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzQ291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGs9MDsgayA8IHBhcnQubW9kaWZpZXJzLmxlbmd0aDsgaysrKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVyID0gcGFydC5tb2RpZmllcnNba107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kaWZpZXIudHlwZSA9PSAiY2xhc3MiKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0NvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NDb3VudCA+IDEpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVyLndhcm4oIkRvbid0IHVzZSBhZGpvaW5pbmcgY2xhc3Nlcy4iLCBwYXJ0LmxpbmUsIHBhcnQuY29sLCBydWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKfSk7Ci8qCiAqIFJ1bGU6IERvbid0IHVzZSB3aWR0aCBvciBoZWlnaHQgd2hlbiB1c2luZyBwYWRkaW5nIG9yIGJvcmRlci4gCiAqLwpDU1NMaW50LmFkZFJ1bGUoewoKICAgIC8vcnVsZSBpbmZvcm1hdGlvbgogICAgaWQ6ICJib3gtbW9kZWwiLAogICAgbmFtZTogIkJveCBNb2RlbCIsCiAgICBkZXNjOiAiRG9uJ3QgdXNlIHdpZHRoIG9yIGhlaWdodCB3aGVuIHVzaW5nIHBhZGRpbmcgb3IgYm9yZGVyLiIsCiAgICBicm93c2VyczogIkFsbCIsCgogICAgLy9pbml0aWFsaXphdGlvbgogICAgaW5pdDogZnVuY3Rpb24ocGFyc2VyLCByZXBvcnRlcil7CiAgICAgICAgdmFyIHJ1bGUgPSB0aGlzLAogICAgICAgICAgICB3aWR0aFByb3BlcnRpZXMgPSB7CiAgICAgICAgICAgICAgICBib3JkZXI6IDEsCiAgICAgICAgICAgICAgICAiYm9yZGVyLWxlZnQiOiAxLAogICAgICAgICAgICAgICAgImJvcmRlci1yaWdodCI6IDEsCiAgICAgICAgICAgICAgICBwYWRkaW5nOiAxLAogICAgICAgICAgICAgICAgInBhZGRpbmctbGVmdCI6IDEsCiAgICAgICAgICAgICAgICAicGFkZGluZy1yaWdodCI6IDEKICAgICAgICAgICAgfSwKICAgICAgICAgICAgaGVpZ2h0UHJvcGVydGllcyA9IHsKICAgICAgICAgICAgICAgIGJvcmRlcjogMSwKICAgICAgICAgICAgICAgICJib3JkZXItYm90dG9tIjogMSwKICAgICAgICAgICAgICAgICJib3JkZXItdG9wIjogMSwKICAgICAgICAgICAgICAgIHBhZGRpbmc6IDEsCiAgICAgICAgICAgICAgICAicGFkZGluZy1ib3R0b20iOiAxLAogICAgICAgICAgICAgICAgInBhZGRpbmctdG9wIjogMQogICAgICAgICAgICB9LAogICAgICAgICAgICBwcm9wZXJ0aWVzOwoKICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInN0YXJ0cnVsZSIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIHByb3BlcnRpZXMgPSB7CiAgICAgICAgICAgIH07CiAgICAgICAgfSk7CgogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigicHJvcGVydHkiLCBmdW5jdGlvbihldmVudCl7CiAgICAgICAgICAgIHZhciBuYW1lID0gZXZlbnQucHJvcGVydHkudGV4dC50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKGhlaWdodFByb3BlcnRpZXNbbmFtZV0gfHwgd2lkdGhQcm9wZXJ0aWVzW25hbWVdKXsKICAgICAgICAgICAgICAgIGlmICghL14wXFMqJC8udGVzdChldmVudC52YWx1ZSkgJiYgIShuYW1lID09ICJib3JkZXIiICYmIGV2ZW50LnZhbHVlID09ICJub25lIikpewogICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNbbmFtZV0gPSB7IGxpbmU6IGV2ZW50LnByb3BlcnR5LmxpbmUsIGNvbDogZXZlbnQucHJvcGVydHkuY29sLCB2YWx1ZTogZXZlbnQudmFsdWUgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChuYW1lID09ICJ3aWR0aCIgfHwgbmFtZSA9PSAiaGVpZ2h0Iil7CiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllc1tuYW1lXSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgfSk7CgogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigiZW5kcnVsZSIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIHZhciBwcm9wOwogICAgICAgICAgICBpZiAocHJvcGVydGllc1siaGVpZ2h0Il0pewogICAgICAgICAgICAgICAgZm9yIChwcm9wIGluIGhlaWdodFByb3BlcnRpZXMpewogICAgICAgICAgICAgICAgICAgIGlmIChoZWlnaHRQcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHByb3ApICYmIHByb3BlcnRpZXNbcHJvcF0pewogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAvL3NwZWNpYWwgY2FzZSBmb3IgcGFkZGluZwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCA9PSAicGFkZGluZyIgJiYgcHJvcGVydGllc1twcm9wXS52YWx1ZS5wYXJ0cy5sZW5ndGggPT0gMiAmJiBwcm9wZXJ0aWVzW3Byb3BdLnZhbHVlLnBhcnRzWzBdLnZhbHVlID09IDApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9ub29wCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlci53YXJuKCJCcm9rZW4gYm94IG1vZGVsOiB1c2luZyBoZWlnaHQgd2l0aCAiICsgcHJvcCArICIuIiwgcHJvcGVydGllc1twcm9wXS5saW5lLCBwcm9wZXJ0aWVzW3Byb3BdLmNvbCwgcnVsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzWyJ3aWR0aCJdKXsKICAgICAgICAgICAgICAgIGZvciAocHJvcCBpbiB3aWR0aFByb3BlcnRpZXMpewogICAgICAgICAgICAgICAgICAgIGlmICh3aWR0aFByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkocHJvcCkgJiYgcHJvcGVydGllc1twcm9wXSl7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCA9PSAicGFkZGluZyIgJiYgcHJvcGVydGllc1twcm9wXS52YWx1ZS5wYXJ0cy5sZW5ndGggPT0gMiAmJiBwcm9wZXJ0aWVzW3Byb3BdLnZhbHVlLnBhcnRzWzFdLnZhbHVlID09IDApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9ub29wCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlci53YXJuKCJCcm9rZW4gYm94IG1vZGVsOiB1c2luZyB3aWR0aCB3aXRoICIgKyBwcm9wICsgIi4iLCBwcm9wZXJ0aWVzW3Byb3BdLmxpbmUsIHByb3BlcnRpZXNbcHJvcF0uY29sLCBydWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9KTsKICAgIH0KCn0pOwovKgogKiBSdWxlOiBJbmNsdWRlIGFsbCBjb21wYXRpYmxlIHZlbmRvciBwcmVmaXhlcyB0byByZWFjaCBhIHdpZGVyCiAqIHJhbmdlIG9mIHVzZXJzLgogKi8KLypnbG9iYWwgQ1NTTGludCovIApDU1NMaW50LmFkZFJ1bGUoewoKICAgIC8vcnVsZSBpbmZvcm1hdGlvbgogICAgaWQ6ICJjb21wYXRpYmxlLXZlbmRvci1wcmVmaXhlcyIsCiAgICBuYW1lOiAiQ29tcGF0aWJsZSBWZW5kb3IgUHJlZml4ZXMiLAogICAgZGVzYzogIkluY2x1ZGUgYWxsIGNvbXBhdGlibGUgdmVuZG9yIHByZWZpeGVzIHRvIHJlYWNoIGEgd2lkZXIgcmFuZ2Ugb2YgdXNlcnMuIiwKICAgIGJyb3dzZXJzOiAiQWxsIiwKCiAgICAvL2luaXRpYWxpemF0aW9uCiAgICBpbml0OiBmdW5jdGlvbiAocGFyc2VyLCByZXBvcnRlcikgewogICAgICAgIHZhciBydWxlID0gdGhpcywKICAgICAgICAgICAgY29tcGF0aWJsZVByZWZpeGVzLAogICAgICAgICAgICBwcm9wZXJ0aWVzLAogICAgICAgICAgICBwcm9wLAogICAgICAgICAgICB2YXJpYXRpb25zLAogICAgICAgICAgICBwcmVmaXhlZCwKICAgICAgICAgICAgaSwKICAgICAgICAgICAgbGVuLAogICAgICAgICAgICBhcnJheVB1c2ggPSBBcnJheS5wcm90b3R5cGUucHVzaCwKICAgICAgICAgICAgYXBwbHlUbyA9IFtdOwoKICAgICAgICAvLyBTZWUgaHR0cDovL3BldGVyLnNoL2V4cGVyaW1lbnRzL3ZlbmRvci1wcmVmaXhlZC1jc3MtcHJvcGVydHktb3ZlcnZpZXcvIGZvciBkZXRhaWxzCiAgICAgICAgY29tcGF0aWJsZVByZWZpeGVzID0gewogICAgICAgICAgICAiYW5pbWF0aW9uIiAgICAgICAgICAgICAgICAgIDogIndlYmtpdCBtb3oiLAogICAgICAgICAgICAiYW5pbWF0aW9uLWRlbGF5IiAgICAgICAgICAgIDogIndlYmtpdCBtb3oiLAogICAgICAgICAgICAiYW5pbWF0aW9uLWRpcmVjdGlvbiIgICAgICAgIDogIndlYmtpdCBtb3oiLAogICAgICAgICAgICAiYW5pbWF0aW9uLWR1cmF0aW9uIiAgICAgICAgIDogIndlYmtpdCBtb3oiLAogICAgICAgICAgICAiYW5pbWF0aW9uLWZpbGwtbW9kZSIgICAgICAgIDogIndlYmtpdCBtb3oiLAogICAgICAgICAgICAiYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCIgIDogIndlYmtpdCBtb3oiLAogICAgICAgICAgICAiYW5pbWF0aW9uLW5hbWUiICAgICAgICAgICAgIDogIndlYmtpdCBtb3oiLAogICAgICAgICAgICAiYW5pbWF0aW9uLXBsYXktc3RhdGUiICAgICAgIDogIndlYmtpdCBtb3oiLAogICAgICAgICAgICAiYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbiIgIDogIndlYmtpdCBtb3oiLAogICAgICAgICAgICAiYXBwZWFyYW5jZSIgICAgICAgICAgICAgICAgIDogIndlYmtpdCBtb3oiLAogICAgICAgICAgICAiYm9yZGVyLWVuZCIgICAgICAgICAgICAgICAgIDogIndlYmtpdCBtb3oiLAogICAgICAgICAgICAiYm9yZGVyLWVuZC1jb2xvciIgICAgICAgICAgIDogIndlYmtpdCBtb3oiLAogICAgICAgICAgICAiYm9yZGVyLWVuZC1zdHlsZSIgICAgICAgICAgIDogIndlYmtpdCBtb3oiLAogICAgICAgICAgICAiYm9yZGVyLWVuZC13aWR0aCIgICAgICAgICAgIDogIndlYmtpdCBtb3oiLAogICAgICAgICAgICAiYm9yZGVyLWltYWdlIiAgICAgICAgICAgICAgIDogIndlYmtpdCBtb3ogbyIsCiAgICAgICAgICAgICJib3JkZXItcmFkaXVzIiAgICAgICAgICAgICAgOiAid2Via2l0IG1veiIsCiAgICAgICAgICAgICJib3JkZXItc3RhcnQiICAgICAgICAgICAgICAgOiAid2Via2l0IG1veiIsCiAgICAgICAgICAgICJib3JkZXItc3RhcnQtY29sb3IiICAgICAgICAgOiAid2Via2l0IG1veiIsCiAgICAgICAgICAgICJib3JkZXItc3RhcnQtc3R5bGUiICAgICAgICAgOiAid2Via2l0IG1veiIsCiAgICAgICAgICAgICJib3JkZXItc3RhcnQtd2lkdGgiICAgICAgICAgOiAid2Via2l0IG1veiIsCiAgICAgICAgICAgICJib3gtYWxpZ24iICAgICAgICAgICAgICAgICAgOiAid2Via2l0IG1veiBtcyIsCiAgICAgICAgICAgICJib3gtZGlyZWN0aW9uIiAgICAgICAgICAgICAgOiAid2Via2l0IG1veiBtcyIsCiAgICAgICAgICAgICJib3gtZmxleCIgICAgICAgICAgICAgICAgICAgOiAid2Via2l0IG1veiBtcyIsCiAgICAgICAgICAgICJib3gtbGluZXMiICAgICAgICAgICAgICAgICAgOiAid2Via2l0IG1zIiwKICAgICAgICAgICAgImJveC1vcmRpbmFsLWdyb3VwIiAgICAgICAgICA6ICJ3ZWJraXQgbW96IG1zIiwKICAgICAgICAgICAgImJveC1vcmllbnQiICAgICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IG1zIiwKICAgICAgICAgICAgImJveC1wYWNrIiAgICAgICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IG1zIiwKICAgICAgICAgICAgImJveC1zaXppbmciICAgICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IiwKICAgICAgICAgICAgImJveC1zaGFkb3ciICAgICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IiwKICAgICAgICAgICAgImNvbHVtbi1jb3VudCIgICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IiwKICAgICAgICAgICAgImNvbHVtbi1nYXAiICAgICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IiwKICAgICAgICAgICAgImNvbHVtbi1ydWxlIiAgICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IiwKICAgICAgICAgICAgImNvbHVtbi1ydWxlLWNvbG9yIiAgICAgICAgICA6ICJ3ZWJraXQgbW96IiwKICAgICAgICAgICAgImNvbHVtbi1ydWxlLXN0eWxlIiAgICAgICAgICA6ICJ3ZWJraXQgbW96IiwKICAgICAgICAgICAgImNvbHVtbi1ydWxlLXdpZHRoIiAgICAgICAgICA6ICJ3ZWJraXQgbW96IiwKICAgICAgICAgICAgImNvbHVtbi13aWR0aCIgICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IiwKICAgICAgICAgICAgImh5cGhlbnMiICAgICAgICAgICAgICAgICAgICA6ICJlcHViIG1veiIsCiAgICAgICAgICAgICJsaW5lLWJyZWFrIiAgICAgICAgICAgICAgICAgOiAid2Via2l0IG1zIiwKICAgICAgICAgICAgIm1hcmdpbi1lbmQiICAgICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IiwKICAgICAgICAgICAgIm1hcmdpbi1zdGFydCIgICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IiwKICAgICAgICAgICAgIm1hcnF1ZWUtc3BlZWQiICAgICAgICAgICAgICA6ICJ3ZWJraXQgd2FwIiwKICAgICAgICAgICAgIm1hcnF1ZWUtc3R5bGUiICAgICAgICAgICAgICA6ICJ3ZWJraXQgd2FwIiwKICAgICAgICAgICAgInBhZGRpbmctZW5kIiAgICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IiwKICAgICAgICAgICAgInBhZGRpbmctc3RhcnQiICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IiwKICAgICAgICAgICAgInRhYi1zaXplIiAgICAgICAgICAgICAgICAgICA6ICJtb3ogbyIsCiAgICAgICAgICAgICJ0ZXh0LXNpemUtYWRqdXN0IiAgICAgICAgICAgOiAid2Via2l0IG1zIiwKICAgICAgICAgICAgInRyYW5zZm9ybSIgICAgICAgICAgICAgICAgICA6ICJ3ZWJraXQgbW96IG1zIG8iLAogICAgICAgICAgICAidHJhbnNmb3JtLW9yaWdpbiIgICAgICAgICAgIDogIndlYmtpdCBtb3ogbXMgbyIsCiAgICAgICAgICAgICJ0cmFuc2l0aW9uIiAgICAgICAgICAgICAgICAgOiAid2Via2l0IG1veiBvIiwKICAgICAgICAgICAgInRyYW5zaXRpb24tZGVsYXkiICAgICAgICAgICA6ICJ3ZWJraXQgbW96IG8iLAogICAgICAgICAgICAidHJhbnNpdGlvbi1kdXJhdGlvbiIgICAgICAgIDogIndlYmtpdCBtb3ogbyIsCiAgICAgICAgICAgICJ0cmFuc2l0aW9uLXByb3BlcnR5IiAgICAgICAgOiAid2Via2l0IG1veiBvIiwKICAgICAgICAgICAgInRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uIiA6ICJ3ZWJraXQgbW96IG8iLAogICAgICAgICAgICAidXNlci1tb2RpZnkiICAgICAgICAgICAgICAgIDogIndlYmtpdCBtb3oiLAogICAgICAgICAgICAidXNlci1zZWxlY3QiICAgICAgICAgICAgICAgIDogIndlYmtpdCBtb3oiLAogICAgICAgICAgICAid29yZC1icmVhayIgICAgICAgICAgICAgICAgIDogImVwdWIgbXMiLAogICAgICAgICAgICAid3JpdGluZy1tb2RlIiAgICAgICAgICAgICAgIDogImVwdWIgbXMiCiAgICAgICAgfTsKCiAgICAgICAgZm9yIChwcm9wIGluIGNvbXBhdGlibGVQcmVmaXhlcykgewogICAgICAgICAgICBpZiAoY29tcGF0aWJsZVByZWZpeGVzLmhhc093blByb3BlcnR5KHByb3ApKSB7CiAgICAgICAgICAgICAgICB2YXJpYXRpb25zID0gW107CiAgICAgICAgICAgICAgICBwcmVmaXhlZCA9IGNvbXBhdGlibGVQcmVmaXhlc1twcm9wXS5zcGxpdCgnICcpOwogICAgICAgICAgICAgICAgZm9yIChpID0gMCwgbGVuID0gcHJlZml4ZWQubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXJpYXRpb25zLnB1c2goJy0nICsgcHJlZml4ZWRbaV0gKyAnLScgKyBwcm9wKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbXBhdGlibGVQcmVmaXhlc1twcm9wXSA9IHZhcmlhdGlvbnM7CiAgICAgICAgICAgICAgICBhcnJheVB1c2guYXBwbHkoYXBwbHlUbywgdmFyaWF0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJzdGFydHJ1bGUiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHByb3BlcnRpZXMgPSBbXTsKICAgICAgICB9KTsKCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJwcm9wZXJ0eSIsIGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICB2YXIgbmFtZSA9IGV2ZW50LnByb3BlcnR5LnRleHQ7CiAgICAgICAgICAgIGlmIChhcHBseVRvLmluZGV4T2YobmFtZSkgPiAtMSkgewogICAgICAgICAgICAgICAgcHJvcGVydGllcy5wdXNoKG5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigiZW5kcnVsZSIsIGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICBpZiAoIXByb3BlcnRpZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBwcm9wZXJ0eUdyb3VwcyA9IHt9LAogICAgICAgICAgICAgICAgaSwKICAgICAgICAgICAgICAgIGxlbiwKICAgICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgICBwcm9wLAogICAgICAgICAgICAgICAgdmFyaWF0aW9ucywKICAgICAgICAgICAgICAgIHZhbHVlLAogICAgICAgICAgICAgICAgZnVsbCwKICAgICAgICAgICAgICAgIGFjdHVhbCwKICAgICAgICAgICAgICAgIGl0ZW0sCiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzU3BlY2lmaWVkOwoKICAgICAgICAgICAgZm9yIChpID0gMCwgbGVuID0gcHJvcGVydGllcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgbmFtZSA9IHByb3BlcnRpZXNbaV07CgogICAgICAgICAgICAgICAgZm9yIChwcm9wIGluIGNvbXBhdGlibGVQcmVmaXhlcykgewogICAgICAgICAgICAgICAgICAgIGlmIChjb21wYXRpYmxlUHJlZml4ZXMuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWF0aW9ucyA9IGNvbXBhdGlibGVQcmVmaXhlc1twcm9wXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhcmlhdGlvbnMuaW5kZXhPZihuYW1lKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlHcm91cHNbcHJvcF0gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5R3JvdXBzW3Byb3BdID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsIDogdmFyaWF0aW9ucy5zbGljZSgwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsIDogW10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5R3JvdXBzW3Byb3BdLmFjdHVhbC5pbmRleE9mKG5hbWUpID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5R3JvdXBzW3Byb3BdLmFjdHVhbC5wdXNoKG5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKHByb3AgaW4gcHJvcGVydHlHcm91cHMpIHsKICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eUdyb3Vwcy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcGVydHlHcm91cHNbcHJvcF07CiAgICAgICAgICAgICAgICAgICAgZnVsbCA9IHZhbHVlLmZ1bGw7CiAgICAgICAgICAgICAgICAgICAgYWN0dWFsID0gdmFsdWUuYWN0dWFsOwoKICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbC5sZW5ndGggPiBhY3R1YWwubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IGZ1bGwubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBmdWxsW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdHVhbC5pbmRleE9mKGl0ZW0pID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNTcGVjaWZpZWQgPSAoYWN0dWFsLmxlbmd0aCA9PT0gMSkgPyBhY3R1YWxbMF0gOiAoYWN0dWFsLmxlbmd0aCA9PSAyKSA/IGFjdHVhbC5qb2luKCIgYW5kICIpIDogYWN0dWFsLmpvaW4oIiwgIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZXIud2FybigiVGhlIHByb3BlcnR5ICIgKyBpdGVtICsgIiBpcyBjb21wYXRpYmxlIHdpdGggIiArIHByb3BlcnRpZXNTcGVjaWZpZWQgKyAiIGFuZCBzaG91bGQgYmUgaW5jbHVkZWQgYXMgd2VsbC4iLCBldmVudC5zZWxlY3RvcnNbMF0ubGluZSwgZXZlbnQuc2VsZWN0b3JzWzBdLmNvbCwgcnVsZSk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQp9KTsKLyoKICogUnVsZTogQ2VydGFpbiBwcm9wZXJ0aWVzIGRvbid0IHBsYXkgd2VsbCB3aXRoIGNlcnRhaW4gZGlzcGxheSB2YWx1ZXMuIAogKiAtIGZsb2F0IHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIGlubGluZS1ibG9jawogKiAtIGhlaWdodCwgd2lkdGgsIG1hcmdpbi10b3AsIG1hcmdpbi1ib3R0b20sIGZsb2F0IHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIGlubGluZQogKiAtIHZlcnRpY2FsLWFsaWduIHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIGJsb2NrCiAqIC0gbWFyZ2luLCBmbG9hdCBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCB0YWJsZS0qCiAqLwpDU1NMaW50LmFkZFJ1bGUoewoKICAgIC8vcnVsZSBpbmZvcm1hdGlvbgogICAgaWQ6ICJkaXNwbGF5LXByb3BlcnR5LWdyb3VwaW5nIiwKICAgIG5hbWU6ICJEaXNwbGF5IFByb3BlcnR5IEdyb3VwaW5nIiwKICAgIGRlc2M6ICJDZXJ0YWluIHByb3BlcnRpZXMgc2hvdWxkbid0IGJlIHVzZWQgd2l0aCBjZXJ0YWluIGRpc3BsYXkgcHJvcGVydHkgdmFsdWVzLiIsCiAgICBicm93c2VyczogIkFsbCIsCgogICAgLy9pbml0aWFsaXphdGlvbgogICAgaW5pdDogZnVuY3Rpb24ocGFyc2VyLCByZXBvcnRlcil7CiAgICAgICAgdmFyIHJ1bGUgPSB0aGlzOwoKICAgICAgICB2YXIgcHJvcGVydGllc1RvQ2hlY2sgPSB7CiAgICAgICAgICAgICAgICBkaXNwbGF5OiAxLAogICAgICAgICAgICAgICAgImZsb2F0IjogIm5vbmUiLAogICAgICAgICAgICAgICAgaGVpZ2h0OiAxLAogICAgICAgICAgICAgICAgd2lkdGg6IDEsCiAgICAgICAgICAgICAgICBtYXJnaW46IDEsCiAgICAgICAgICAgICAgICAibWFyZ2luLWxlZnQiOiAxLAogICAgICAgICAgICAgICAgIm1hcmdpbi1yaWdodCI6IDEsCiAgICAgICAgICAgICAgICAibWFyZ2luLWJvdHRvbSI6IDEsCiAgICAgICAgICAgICAgICAibWFyZ2luLXRvcCI6IDEsCiAgICAgICAgICAgICAgICBwYWRkaW5nOiAxLAogICAgICAgICAgICAgICAgInBhZGRpbmctbGVmdCI6IDEsCiAgICAgICAgICAgICAgICAicGFkZGluZy1yaWdodCI6IDEsCiAgICAgICAgICAgICAgICAicGFkZGluZy1ib3R0b20iOiAxLAogICAgICAgICAgICAgICAgInBhZGRpbmctdG9wIjogMSwKICAgICAgICAgICAgICAgICJ2ZXJ0aWNhbC1hbGlnbiI6IDEKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJvcGVydGllczsKCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJzdGFydHJ1bGUiLCBmdW5jdGlvbigpewogICAgICAgICAgICBwcm9wZXJ0aWVzID0ge307CiAgICAgICAgfSk7CgogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigicHJvcGVydHkiLCBmdW5jdGlvbihldmVudCl7CiAgICAgICAgICAgIHZhciBuYW1lID0gZXZlbnQucHJvcGVydHkudGV4dC50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAgICAgaWYgKHByb3BlcnRpZXNUb0NoZWNrW25hbWVdKXsKICAgICAgICAgICAgICAgIHByb3BlcnRpZXNbbmFtZV0gPSB7IHZhbHVlOiBldmVudC52YWx1ZS50ZXh0LCBsaW5lOiBldmVudC5wcm9wZXJ0eS5saW5lLCBjb2w6IGV2ZW50LnByb3BlcnR5LmNvbCB9OyAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJlbmRydWxlIiwgZnVuY3Rpb24oKXsKCiAgICAgICAgICAgIHZhciBkaXNwbGF5ID0gcHJvcGVydGllcy5kaXNwbGF5ID8gcHJvcGVydGllcy5kaXNwbGF5LnZhbHVlIDogbnVsbDsKICAgICAgICAgICAgaWYgKGRpc3BsYXkpewogICAgICAgICAgICAgICAgc3dpdGNoKGRpc3BsYXkpewoKICAgICAgICAgICAgICAgICAgICBjYXNlICJpbmxpbmUiOgogICAgICAgICAgICAgICAgICAgICAgICAvL2hlaWdodCwgd2lkdGgsIG1hcmdpbi10b3AsIG1hcmdpbi1ib3R0b20sIGZsb2F0IHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIGlubGluZQogICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRQcm9wZXJ0eSgiaGVpZ2h0IiwgZGlzcGxheSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFByb3BlcnR5KCJ3aWR0aCIsIGRpc3BsYXkpOwogICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRQcm9wZXJ0eSgibWFyZ2luIiwgZGlzcGxheSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFByb3BlcnR5KCJtYXJnaW4tdG9wIiwgZGlzcGxheSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFByb3BlcnR5KCJtYXJnaW4tYm90dG9tIiwgZGlzcGxheSk7ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0UHJvcGVydHkoImZsb2F0IiwgZGlzcGxheSwgImRpc3BsYXk6aW5saW5lIGhhcyBubyBlZmZlY3Qgb24gZmxvYXRlZCBlbGVtZW50cyAoYnV0IG1heSBiZSB1c2VkIHRvIGZpeCB0aGUgSUU2IGRvdWJsZS1tYXJnaW4gYnVnKS4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgIGNhc2UgImJsb2NrIjoKICAgICAgICAgICAgICAgICAgICAgICAgLy92ZXJ0aWNhbC1hbGlnbiBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCBibG9jawogICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRQcm9wZXJ0eSgidmVydGljYWwtYWxpZ24iLCBkaXNwbGF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgIGNhc2UgImlubGluZS1ibG9jayI6CiAgICAgICAgICAgICAgICAgICAgICAgIC8vZmxvYXQgc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGggaW5saW5lLWJsb2NrCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFByb3BlcnR5KCJmbG9hdCIsIGRpc3BsYXkpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgLy9tYXJnaW4sIGZsb2F0IHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIHRhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5LmluZGV4T2YoInRhYmxlLSIpID09IDApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0UHJvcGVydHkoIm1hcmdpbiIsIGRpc3BsYXkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0UHJvcGVydHkoIm1hcmdpbi1sZWZ0IiwgZGlzcGxheSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRQcm9wZXJ0eSgibWFyZ2luLXJpZ2h0IiwgZGlzcGxheSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRQcm9wZXJ0eSgibWFyZ2luLXRvcCIsIGRpc3BsYXkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0UHJvcGVydHkoIm1hcmdpbi1ib3R0b20iLCBkaXNwbGF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFByb3BlcnR5KCJmbG9hdCIsIGRpc3BsYXkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvL290aGVyd2lzZSBkbyBub3RoaW5nCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgIH0pOwoKCiAgICAgICAgZnVuY3Rpb24gcmVwb3J0UHJvcGVydHkobmFtZSwgZGlzcGxheSwgbXNnKXsKICAgICAgICAgICAgaWYgKHByb3BlcnRpZXNbbmFtZV0pewogICAgICAgICAgICAgICAgaWYgKCEodHlwZW9mIHByb3BlcnRpZXNUb0NoZWNrW25hbWVdID09ICJzdHJpbmciKSB8fCBwcm9wZXJ0aWVzW25hbWVdLnZhbHVlLnRvTG93ZXJDYXNlKCkgIT0gcHJvcGVydGllc1RvQ2hlY2tbbmFtZV0pewogICAgICAgICAgICAgICAgICAgIHJlcG9ydGVyLndhcm4obXNnIHx8IG5hbWUgKyAiIGNhbid0IGJlIHVzZWQgd2l0aCBkaXNwbGF5OiAiICsgZGlzcGxheSArICIuIiwgcHJvcGVydGllc1tuYW1lXS5saW5lLCBwcm9wZXJ0aWVzW25hbWVdLmNvbCwgcnVsZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cgp9KTsKLyoKICogUnVsZTogRHVwbGljYXRlIHByb3BlcnRpZXMgbXVzdCBhcHBlYXIgb25lIGFmdGVyIHRoZSBvdGhlci4gSWYgYW4gYWxyZWFkeS1kZWZpbmVkCiAqIHByb3BlcnR5IGFwcGVhcnMgc29tZXdoZXJlIGVsc2UgaW4gdGhlIHJ1bGUsIHRoZW4gaXQncyBsaWtlbHkgYW4gZXJyb3IuCiAqLwpDU1NMaW50LmFkZFJ1bGUoewoKICAgIC8vcnVsZSBpbmZvcm1hdGlvbgogICAgaWQ6ICJkdXBsaWNhdGUtcHJvcGVydGllcyIsCiAgICBuYW1lOiAiRHVwbGljYXRlIFByb3BlcnRpZXMiLAogICAgZGVzYzogIkR1cGxpY2F0ZSBwcm9wZXJ0aWVzIG11c3QgYXBwZWFyIG9uZSBhZnRlciB0aGUgb3RoZXIuIiwKICAgIGJyb3dzZXJzOiAiQWxsIiwKCiAgICAvL2luaXRpYWxpemF0aW9uCiAgICBpbml0OiBmdW5jdGlvbihwYXJzZXIsIHJlcG9ydGVyKXsKICAgICAgICB2YXIgcnVsZSA9IHRoaXMsCiAgICAgICAgICAgIHByb3BlcnRpZXMsCiAgICAgICAgICAgIGxhc3RQcm9wZXJ0eTsgICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgZnVuY3Rpb24gc3RhcnRSdWxlKGV2ZW50KXsKICAgICAgICAgICAgcHJvcGVydGllcyA9IHt9OyAgICAgICAgCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigic3RhcnRydWxlIiwgc3RhcnRSdWxlKTsKICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInN0YXJ0Zm9udGZhY2UiLCBzdGFydFJ1bGUpOwogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigic3RhcnRwYWdlIiwgc3RhcnRSdWxlKTsKICAgICAgICAKICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInByb3BlcnR5IiwgZnVuY3Rpb24oZXZlbnQpewogICAgICAgICAgICB2YXIgcHJvcGVydHkgPSBldmVudC5wcm9wZXJ0eSwKICAgICAgICAgICAgICAgIG5hbWUgPSBwcm9wZXJ0eS50ZXh0LnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAocHJvcGVydGllc1tuYW1lXSAmJiAobGFzdFByb3BlcnR5ICE9IG5hbWUgfHwgcHJvcGVydGllc1tuYW1lXSA9PSBldmVudC52YWx1ZS50ZXh0KSl7CiAgICAgICAgICAgICAgICByZXBvcnRlci53YXJuKCJEdXBsaWNhdGUgcHJvcGVydHkgJyIgKyBldmVudC5wcm9wZXJ0eSArICInIGZvdW5kLiIsIGV2ZW50LmxpbmUsIGV2ZW50LmNvbCwgcnVsZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIHByb3BlcnRpZXNbbmFtZV0gPSBldmVudC52YWx1ZS50ZXh0OwogICAgICAgICAgICBsYXN0UHJvcGVydHkgPSBuYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICB9Cgp9KTsKLyoKICogUnVsZTogU3R5bGUgcnVsZXMgd2l0aG91dCBhbnkgcHJvcGVydGllcyBkZWZpbmVkIHNob3VsZCBiZSByZW1vdmVkLgogKi8KQ1NTTGludC5hZGRSdWxlKHsKCiAgICAvL3J1bGUgaW5mb3JtYXRpb24KICAgIGlkOiAiZW1wdHktcnVsZXMiLAogICAgbmFtZTogIkVtcHR5IFJ1bGVzIiwKICAgIGRlc2M6ICJSdWxlcyB3aXRob3V0IGFueSBwcm9wZXJ0aWVzIHNwZWNpZmllZCBzaG91bGQgYmUgcmVtb3ZlZC4iLAogICAgYnJvd3NlcnM6ICJBbGwiLAoKICAgIC8vaW5pdGlhbGl6YXRpb24KICAgIGluaXQ6IGZ1bmN0aW9uKHBhcnNlciwgcmVwb3J0ZXIpewogICAgICAgIHZhciBydWxlID0gdGhpcywKICAgICAgICAgICAgY291bnQgPSAwOwoKICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInN0YXJ0cnVsZSIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIGNvdW50PTA7CiAgICAgICAgfSk7CgogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigicHJvcGVydHkiLCBmdW5jdGlvbigpewogICAgICAgICAgICBjb3VudCsrOwogICAgICAgIH0pOwoKICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoImVuZHJ1bGUiLCBmdW5jdGlvbihldmVudCl7CiAgICAgICAgICAgIHZhciBzZWxlY3RvcnMgPSBldmVudC5zZWxlY3RvcnM7CiAgICAgICAgICAgIGlmIChjb3VudCA9PSAwKXsKICAgICAgICAgICAgICAgIHJlcG9ydGVyLndhcm4oIlJ1bGUgaXMgZW1wdHkuIiwgc2VsZWN0b3JzWzBdLmxpbmUsIHNlbGVjdG9yc1swXS5jb2wsIHJ1bGUpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9Cgp9KTsKLyoKICogUnVsZTogVGhlcmUgc2hvdWxkIGJlIG5vIHN5bnRheCBlcnJvcnMuIChEdWguKQogKi8KQ1NTTGludC5hZGRSdWxlKHsKCiAgICAvL3J1bGUgaW5mb3JtYXRpb24KICAgIGlkOiAiZXJyb3JzIiwKICAgIG5hbWU6ICJQYXJzaW5nIEVycm9ycyIsCiAgICBkZXNjOiAiVGhpcyBydWxlIGxvb2tzIGZvciByZWNvdmVyYWJsZSBzeW50YXggZXJyb3JzLiIsCiAgICBicm93c2VyczogIkFsbCIsCgogICAgLy9pbml0aWFsaXphdGlvbgogICAgaW5pdDogZnVuY3Rpb24ocGFyc2VyLCByZXBvcnRlcil7CiAgICAgICAgdmFyIHJ1bGUgPSB0aGlzOwoKICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoImVycm9yIiwgZnVuY3Rpb24oZXZlbnQpewogICAgICAgICAgICByZXBvcnRlci5lcnJvcihldmVudC5tZXNzYWdlLCBldmVudC5saW5lLCBldmVudC5jb2wsIHJ1bGUpOwogICAgICAgIH0pOwoKICAgIH0KCn0pOwovKgogKiBSdWxlOiBZb3Ugc2hvdWxkbid0IHVzZSBtb3JlIHRoYW4gMTAgZmxvYXRzLiBJZiB5b3UgZG8sIHRoZXJlJ3MgcHJvYmFibHkKICogcm9vbSBmb3Igc29tZSBhYnN0cmFjdGlvbi4KICovCkNTU0xpbnQuYWRkUnVsZSh7CgogICAgLy9ydWxlIGluZm9ybWF0aW9uCiAgICBpZDogImZsb2F0cyIsCiAgICBuYW1lOiAiRmxvYXRzIiwKICAgIGRlc2M6ICJUaGlzIHJ1bGUgdGVzdHMgaWYgdGhlIGZsb2F0IHByb3BlcnR5IGlzIHVzZWQgdG9vIG1hbnkgdGltZXMiLAogICAgYnJvd3NlcnM6ICJBbGwiLAoKICAgIC8vaW5pdGlhbGl6YXRpb24KICAgIGluaXQ6IGZ1bmN0aW9uKHBhcnNlciwgcmVwb3J0ZXIpewogICAgICAgIHZhciBydWxlID0gdGhpczsKICAgICAgICB2YXIgY291bnQgPSAwOwoKICAgICAgICAvL2NvdW50IGhvdyBtYW55IHRpbWVzICJmbG9hdCIgaXMgdXNlZAogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigicHJvcGVydHkiLCBmdW5jdGlvbihldmVudCl7CiAgICAgICAgICAgIGlmIChldmVudC5wcm9wZXJ0eS50ZXh0LnRvTG93ZXJDYXNlKCkgPT0gImZsb2F0IiAmJgogICAgICAgICAgICAgICAgICAgIGV2ZW50LnZhbHVlLnRleHQudG9Mb3dlckNhc2UoKSAhPSAibm9uZSIpewogICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvL3JlcG9ydCB0aGUgcmVzdWx0cwogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigiZW5kc3R5bGVzaGVldCIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIHJlcG9ydGVyLnN0YXQoImZsb2F0cyIsIGNvdW50KTsKICAgICAgICAgICAgaWYgKGNvdW50ID49IDEwKXsKICAgICAgICAgICAgICAgIHJlcG9ydGVyLnJvbGx1cFdhcm4oIlRvbyBtYW55IGZsb2F0cyAoIiArIGNvdW50ICsgIiksIHlvdSdyZSBwcm9iYWJseSB1c2luZyB0aGVtIGZvciBsYXlvdXQuIENvbnNpZGVyIHVzaW5nIGEgZ3JpZCBzeXN0ZW0gaW5zdGVhZC4iLCBydWxlKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKfSk7Ci8qCiAqIFJ1bGU6IEF2b2lkIHRvbyBtYW55IEBmb250LWZhY2UgZGVjbGFyYXRpb25zIGluIHRoZSBzYW1lIHN0eWxlc2hlZXQuCiAqLwpDU1NMaW50LmFkZFJ1bGUoewoKICAgIC8vcnVsZSBpbmZvcm1hdGlvbgogICAgaWQ6ICJmb250LWZhY2VzIiwKICAgIG5hbWU6ICJGb250IEZhY2VzIiwKICAgIGRlc2M6ICJUb28gbWFueSBkaWZmZXJlbnQgd2ViIGZvbnRzIGluIHRoZSBzYW1lIHN0eWxlc2hlZXQuIiwKICAgIGJyb3dzZXJzOiAiQWxsIiwKCiAgICAvL2luaXRpYWxpemF0aW9uCiAgICBpbml0OiBmdW5jdGlvbihwYXJzZXIsIHJlcG9ydGVyKXsKICAgICAgICB2YXIgcnVsZSA9IHRoaXMsCiAgICAgICAgICAgIGNvdW50ID0gMDsKCgogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigic3RhcnRmb250ZmFjZSIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgfSk7CgogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigiZW5kc3R5bGVzaGVldCIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIGlmIChjb3VudCA+IDUpewogICAgICAgICAgICAgICAgcmVwb3J0ZXIucm9sbHVwV2FybigiVG9vIG1hbnkgQGZvbnQtZmFjZSBkZWNsYXJhdGlvbnMgKCIgKyBjb3VudCArICIpLiIsIHJ1bGUpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9Cgp9KTsKLyoKICogUnVsZTogWW91IHNob3VsZG4ndCBuZWVkIG1vcmUgdGhhbiA5IGZvbnQtc2l6ZSBkZWNsYXJhdGlvbnMuCiAqLwoKQ1NTTGludC5hZGRSdWxlKHsKCiAgICAvL3J1bGUgaW5mb3JtYXRpb24KICAgIGlkOiAiZm9udC1zaXplcyIsCiAgICBuYW1lOiAiRm9udCBTaXplcyIsCiAgICBkZXNjOiAiQ2hlY2tzIHRoZSBudW1iZXIgb2YgZm9udC1zaXplIGRlY2xhcmF0aW9ucy4iLAogICAgYnJvd3NlcnM6ICJBbGwiLAoKICAgIC8vaW5pdGlhbGl6YXRpb24KICAgIGluaXQ6IGZ1bmN0aW9uKHBhcnNlciwgcmVwb3J0ZXIpewogICAgICAgIHZhciBydWxlID0gdGhpcywKICAgICAgICAgICAgY291bnQgPSAwOwoKICAgICAgICAvL2NoZWNrIGZvciB1c2Ugb2YgImZvbnQtc2l6ZSIKICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInByb3BlcnR5IiwgZnVuY3Rpb24oZXZlbnQpewogICAgICAgICAgICBpZiAoZXZlbnQucHJvcGVydHkgPT0gImZvbnQtc2l6ZSIpewogICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvL3JlcG9ydCB0aGUgcmVzdWx0cwogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigiZW5kc3R5bGVzaGVldCIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIHJlcG9ydGVyLnN0YXQoImZvbnQtc2l6ZXMiLCBjb3VudCk7CiAgICAgICAgICAgIGlmIChjb3VudCA+PSAxMCl7CiAgICAgICAgICAgICAgICByZXBvcnRlci5yb2xsdXBXYXJuKCJUb28gbWFueSBmb250LXNpemUgZGVjbGFyYXRpb25zICgiICsgY291bnQgKyAiKSwgYWJzdHJhY3Rpb24gbmVlZGVkLiIsIHJ1bGUpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9Cgp9KTsKLyoKICogUnVsZTogV2hlbiB1c2luZyBhIHZlbmRvci1wcmVmaXhlZCBncmFkaWVudCwgbWFrZSBzdXJlIHRvIHVzZSB0aGVtIGFsbC4KICovCkNTU0xpbnQuYWRkUnVsZSh7CgogICAgLy9ydWxlIGluZm9ybWF0aW9uCiAgICBpZDogImdyYWRpZW50cyIsCiAgICBuYW1lOiAiR3JhZGllbnRzIiwKICAgIGRlc2M6ICJXaGVuIHVzaW5nIGEgdmVuZG9yLXByZWZpeGVkIGdyYWRpZW50LCBtYWtlIHN1cmUgdG8gdXNlIHRoZW0gYWxsLiIsCiAgICBicm93c2VyczogIkFsbCIsCgogICAgLy9pbml0aWFsaXphdGlvbgogICAgaW5pdDogZnVuY3Rpb24ocGFyc2VyLCByZXBvcnRlcil7CiAgICAgICAgdmFyIHJ1bGUgPSB0aGlzLAogICAgICAgICAgICBncmFkaWVudHM7CgogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigic3RhcnRydWxlIiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgZ3JhZGllbnRzID0gewogICAgICAgICAgICAgICAgbW96OiAwLAogICAgICAgICAgICAgICAgd2Via2l0OiAwLAogICAgICAgICAgICAgICAgbXM6IDAsCiAgICAgICAgICAgICAgICBvOiAwCiAgICAgICAgICAgIH07CiAgICAgICAgfSk7CgogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigicHJvcGVydHkiLCBmdW5jdGlvbihldmVudCl7CgogICAgICAgICAgICBpZiAoL1wtKG1venxtc3xvfHdlYmtpdCkoPzpcLSg/OmxpbmVhcnxyYWRpYWwpKVwtZ3JhZGllbnQvLnRlc3QoZXZlbnQudmFsdWUpKXsKICAgICAgICAgICAgICAgIGdyYWRpZW50c1tSZWdFeHAuJDFdID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICB9KTsKCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJlbmRydWxlIiwgZnVuY3Rpb24oZXZlbnQpewogICAgICAgICAgICB2YXIgbWlzc2luZyA9IFtdOwoKICAgICAgICAgICAgaWYgKCFncmFkaWVudHMubW96KXsKICAgICAgICAgICAgICAgIG1pc3NpbmcucHVzaCgiRmlyZWZveCAzLjYrIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghZ3JhZGllbnRzLndlYmtpdCl7CiAgICAgICAgICAgICAgICBtaXNzaW5nLnB1c2goIldlYmtpdCAoU2FmYXJpLCBDaHJvbWUpIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghZ3JhZGllbnRzLm1zKXsKICAgICAgICAgICAgICAgIG1pc3NpbmcucHVzaCgiSW50ZXJuZXQgRXhwbG9yZXIgMTArIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghZ3JhZGllbnRzLm8pewogICAgICAgICAgICAgICAgbWlzc2luZy5wdXNoKCJPcGVyYSAxMS4xKyIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAobWlzc2luZy5sZW5ndGggJiYgbWlzc2luZy5sZW5ndGggPCA0KXsgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHJlcG9ydGVyLndhcm4oIk1pc3NpbmcgdmVuZG9yLXByZWZpeGVkIENTUyBncmFkaWVudHMgZm9yICIgKyBtaXNzaW5nLmpvaW4oIiwgIikgKyAiLiIsIGV2ZW50LnNlbGVjdG9yc1swXS5saW5lLCBldmVudC5zZWxlY3RvcnNbMF0uY29sLCBydWxlKTsgCiAgICAgICAgICAgIH0KCiAgICAgICAgfSk7CgogICAgfQoKfSk7Ci8qCiAqIFJ1bGU6IERvbid0IHVzZSBJRHMgZm9yIHNlbGVjdG9ycy4KICovCkNTU0xpbnQuYWRkUnVsZSh7CgogICAgLy9ydWxlIGluZm9ybWF0aW9uCiAgICBpZDogImlkcyIsCiAgICBuYW1lOiAiSURzIiwKICAgIGRlc2M6ICJTZWxlY3RvcnMgc2hvdWxkIG5vdCBjb250YWluIElEcy4iLAogICAgYnJvd3NlcnM6ICJBbGwiLAoKICAgIC8vaW5pdGlhbGl6YXRpb24KICAgIGluaXQ6IGZ1bmN0aW9uKHBhcnNlciwgcmVwb3J0ZXIpewogICAgICAgIHZhciBydWxlID0gdGhpczsKICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInN0YXJ0cnVsZSIsIGZ1bmN0aW9uKGV2ZW50KXsKICAgICAgICAgICAgdmFyIHNlbGVjdG9ycyA9IGV2ZW50LnNlbGVjdG9ycywKICAgICAgICAgICAgICAgIHNlbGVjdG9yLAogICAgICAgICAgICAgICAgcGFydCwKICAgICAgICAgICAgICAgIG1vZGlmaWVyLAogICAgICAgICAgICAgICAgaWRDb3VudCwKICAgICAgICAgICAgICAgIGksIGosIGs7CgogICAgICAgICAgICBmb3IgKGk9MDsgaSA8IHNlbGVjdG9ycy5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgICAgICBzZWxlY3RvciA9IHNlbGVjdG9yc1tpXTsKICAgICAgICAgICAgICAgIGlkQ291bnQgPSAwOwoKICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqIDwgc2VsZWN0b3IucGFydHMubGVuZ3RoOyBqKyspewogICAgICAgICAgICAgICAgICAgIHBhcnQgPSBzZWxlY3Rvci5wYXJ0c1tqXTsKICAgICAgICAgICAgICAgICAgICBpZiAocGFydCBpbnN0YW5jZW9mIHBhcnNlcmxpYi5jc3MuU2VsZWN0b3JQYXJ0KXsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrPTA7IGsgPCBwYXJ0Lm1vZGlmaWVycy5sZW5ndGg7IGsrKyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllciA9IHBhcnQubW9kaWZpZXJzW2tdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGlmaWVyLnR5cGUgPT0gImlkIil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRDb3VudCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChpZENvdW50ID09IDEpewogICAgICAgICAgICAgICAgICAgIHJlcG9ydGVyLndhcm4oIkRvbid0IHVzZSBJRHMgaW4gc2VsZWN0b3JzLiIsIHNlbGVjdG9yLmxpbmUsIHNlbGVjdG9yLmNvbCwgcnVsZSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlkQ291bnQgPiAxKXsKICAgICAgICAgICAgICAgICAgICByZXBvcnRlci53YXJuKGlkQ291bnQgKyAiIElEcyBpbiB0aGUgc2VsZWN0b3IsIHJlYWxseT8iLCBzZWxlY3Rvci5saW5lLCBzZWxlY3Rvci5jb2wsIHJ1bGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0pOwogICAgfQoKfSk7Ci8qCiAqIFJ1bGU6IERvbid0IHVzZSBAaW1wb3J0LCB1c2UgPGxpbms+IGluc3RlYWQuCiAqLwpDU1NMaW50LmFkZFJ1bGUoewoKICAgIC8vcnVsZSBpbmZvcm1hdGlvbgogICAgaWQ6ICJpbXBvcnQiLAogICAgbmFtZTogIkBpbXBvcnQiLAogICAgZGVzYzogIkRvbid0IHVzZSBAaW1wb3J0LCB1c2UgPGxpbms+IGluc3RlYWQuIiwKICAgIGJyb3dzZXJzOiAiQWxsIiwKCiAgICAvL2luaXRpYWxpemF0aW9uCiAgICBpbml0OiBmdW5jdGlvbihwYXJzZXIsIHJlcG9ydGVyKXsKICAgICAgICB2YXIgcnVsZSA9IHRoaXM7CiAgICAgICAgCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJpbXBvcnQiLCBmdW5jdGlvbihldmVudCl7ICAgICAgICAKICAgICAgICAgICAgcmVwb3J0ZXIud2FybigiQGltcG9ydCBwcmV2ZW50cyBwYXJhbGxlbCBkb3dubG9hZHMsIHVzZSA8bGluaz4gaW5zdGVhZC4iLCBldmVudC5saW5lLCBldmVudC5jb2wsIHJ1bGUpOwogICAgICAgIH0pOwoKICAgIH0KCn0pOwovKgogKiBSdWxlOiBNYWtlIHN1cmUgIWltcG9ydGFudCBpcyBub3Qgb3ZlcnVzZWQsIHRoaXMgY291bGQgbGVhZCB0byBzcGVjaWZpY2l0eQogKiB3YXIuIERpc3BsYXkgYSB3YXJuaW5nIG9uICFpbXBvcnRhbnQgZGVjbGFyYXRpb25zLCBhbiBlcnJvciBpZiBpdCdzCiAqIHVzZWQgbW9yZSBhdCBsZWFzdCAxMCB0aW1lcy4KICovCkNTU0xpbnQuYWRkUnVsZSh7CgogICAgLy9ydWxlIGluZm9ybWF0aW9uCiAgICBpZDogImltcG9ydGFudCIsCiAgICBuYW1lOiAiSW1wb3J0YW50IiwKICAgIGRlc2M6ICJCZSBjYXJlZnVsIHdoZW4gdXNpbmcgIWltcG9ydGFudCBkZWNsYXJhdGlvbiIsCiAgICBicm93c2VyczogIkFsbCIsCgogICAgLy9pbml0aWFsaXphdGlvbgogICAgaW5pdDogZnVuY3Rpb24ocGFyc2VyLCByZXBvcnRlcil7CiAgICAgICAgdmFyIHJ1bGUgPSB0aGlzLAogICAgICAgICAgICBjb3VudCA9IDA7CgogICAgICAgIC8vd2FybiB0aGF0IGltcG9ydGFudCBpcyB1c2VkIGFuZCBpbmNyZW1lbnQgdGhlIGRlY2xhcmF0aW9uIGNvdW50ZXIKICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInByb3BlcnR5IiwgZnVuY3Rpb24oZXZlbnQpewogICAgICAgICAgICBpZiAoZXZlbnQuaW1wb3J0YW50ID09PSB0cnVlKXsKICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICAgICByZXBvcnRlci53YXJuKCJVc2Ugb2YgIWltcG9ydGFudCIsIGV2ZW50LmxpbmUsIGV2ZW50LmNvbCwgcnVsZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy9pZiB0aGVyZSBhcmUgbW9yZSB0aGFuIDEwLCBzaG93IGFuIGVycm9yCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJlbmRzdHlsZXNoZWV0IiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgcmVwb3J0ZXIuc3RhdCgiaW1wb3J0YW50IiwgY291bnQpOwogICAgICAgICAgICBpZiAoY291bnQgPj0gMTApewogICAgICAgICAgICAgICAgcmVwb3J0ZXIucm9sbHVwV2FybigiVG9vIG1hbnkgIWltcG9ydGFudCBkZWNsYXJhdGlvbnMgKCIgKyBjb3VudCArICIpLCB0cnkgdG8gdXNlIGxlc3MgdGhhbiAxMCB0byBhdm9pZCBzcGVjaWZpdHkgaXNzdWVzLiIsIHJ1bGUpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9Cgp9KTsKLyoKICogUnVsZTogUHJvcGVydGllcyBzaG91bGQgYmUga25vd24gKGxpc3RlZCBpbiBDU1MzIHNwZWNpZmljYXRpb24pIG9yCiAqIGJlIGEgdmVuZG9yLXByZWZpeGVkIHByb3BlcnR5LgogKi8KQ1NTTGludC5hZGRSdWxlKHsKCiAgICAvL3J1bGUgaW5mb3JtYXRpb24KICAgIGlkOiAia25vd24tcHJvcGVydGllcyIsCiAgICBuYW1lOiAiS25vd24gUHJvcGVydGllcyIsCiAgICBkZXNjOiAiUHJvcGVydGllcyBzaG91bGQgYmUga25vd24gKGxpc3RlZCBpbiBDU1Mgc3BlY2lmaWNhdGlvbikgb3IgYmUgYSB2ZW5kb3ItcHJlZml4ZWQgcHJvcGVydHkuIiwKICAgIGJyb3dzZXJzOiAiQWxsIiwKCiAgICAvL2luaXRpYWxpemF0aW9uCiAgICBpbml0OiBmdW5jdGlvbihwYXJzZXIsIHJlcG9ydGVyKXsKICAgICAgICB2YXIgcnVsZSA9IHRoaXMsCiAgICAgICAgICAgIHByb3BlcnRpZXMgPSB7CgogICAgICAgICAgICAgICAgImFsaWdubWVudC1hZGp1c3QiOiAxLAogICAgICAgICAgICAgICAgImFsaWdubWVudC1iYXNlbGluZSI6IDEsCiAgICAgICAgICAgICAgICAiYW5pbWF0aW9uIjogMSwKICAgICAgICAgICAgICAgICJhbmltYXRpb24tZGVsYXkiOiAxLAogICAgICAgICAgICAgICAgImFuaW1hdGlvbi1kaXJlY3Rpb24iOiAxLAogICAgICAgICAgICAgICAgImFuaW1hdGlvbi1kdXJhdGlvbiI6IDEsCiAgICAgICAgICAgICAgICAiYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCI6IDEsCiAgICAgICAgICAgICAgICAiYW5pbWF0aW9uLW5hbWUiOiAxLAogICAgICAgICAgICAgICAgImFuaW1hdGlvbi1wbGF5LXN0YXRlIjogMSwKICAgICAgICAgICAgICAgICJhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uIjogMSwKICAgICAgICAgICAgICAgICJhcHBlYXJhbmNlIjogMSwKICAgICAgICAgICAgICAgICJhemltdXRoIjogMSwKICAgICAgICAgICAgICAgICJiYWNrZmFjZS12aXNpYmlsaXR5IjogMSwKICAgICAgICAgICAgICAgICJiYWNrZ3JvdW5kIjogMSwKICAgICAgICAgICAgICAgICJiYWNrZ3JvdW5kLWF0dGFjaG1lbnQiOiAxLAogICAgICAgICAgICAgICAgImJhY2tncm91bmQtYnJlYWsiOiAxLAogICAgICAgICAgICAgICAgImJhY2tncm91bmQtY2xpcCI6IDEsCiAgICAgICAgICAgICAgICAiYmFja2dyb3VuZC1jb2xvciI6IDEsCiAgICAgICAgICAgICAgICAiYmFja2dyb3VuZC1pbWFnZSI6IDEsCiAgICAgICAgICAgICAgICAiYmFja2dyb3VuZC1vcmlnaW4iOiAxLAogICAgICAgICAgICAgICAgImJhY2tncm91bmQtcG9zaXRpb24iOiAxLAogICAgICAgICAgICAgICAgImJhY2tncm91bmQtcmVwZWF0IjogMSwKICAgICAgICAgICAgICAgICJiYWNrZ3JvdW5kLXNpemUiOiAxLAogICAgICAgICAgICAgICAgImJhc2VsaW5lLXNoaWZ0IjogMSwKICAgICAgICAgICAgICAgICJiaW5kaW5nIjogMSwKICAgICAgICAgICAgICAgICJibGVlZCI6IDEsCiAgICAgICAgICAgICAgICAiYm9va21hcmstbGFiZWwiOiAxLAogICAgICAgICAgICAgICAgImJvb2ttYXJrLWxldmVsIjogMSwKICAgICAgICAgICAgICAgICJib29rbWFyay1zdGF0ZSI6IDEsCiAgICAgICAgICAgICAgICAiYm9va21hcmstdGFyZ2V0IjogMSwKICAgICAgICAgICAgICAgICJib3JkZXIiOiAxLAogICAgICAgICAgICAgICAgImJvcmRlci1ib3R0b20iOiAxLAogICAgICAgICAgICAgICAgImJvcmRlci1ib3R0b20tY29sb3IiOiAxLAogICAgICAgICAgICAgICAgImJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXMiOiAxLAogICAgICAgICAgICAgICAgImJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzIjogMSwKICAgICAgICAgICAgICAgICJib3JkZXItYm90dG9tLXN0eWxlIjogMSwKICAgICAgICAgICAgICAgICJib3JkZXItYm90dG9tLXdpZHRoIjogMSwKICAgICAgICAgICAgICAgICJib3JkZXItY29sbGFwc2UiOiAxLAogICAgICAgICAgICAgICAgImJvcmRlci1jb2xvciI6IDEsCiAgICAgICAgICAgICAgICAiYm9yZGVyLWltYWdlIjogMSwKICAgICAgICAgICAgICAgICJib3JkZXItaW1hZ2Utb3V0c2V0IjogMSwKICAgICAgICAgICAgICAgICJib3JkZXItaW1hZ2UtcmVwZWF0IjogMSwKICAgICAgICAgICAgICAgICJib3JkZXItaW1hZ2Utc2xpY2UiOiAxLAogICAgICAgICAgICAgICAgImJvcmRlci1pbWFnZS1zb3VyY2UiOiAxLAogICAgICAgICAgICAgICAgImJvcmRlci1pbWFnZS13aWR0aCI6IDEsCiAgICAgICAgICAgICAgICAiYm9yZGVyLWxlZnQiOiAxLAogICAgICAgICAgICAgICAgImJvcmRlci1sZWZ0LWNvbG9yIjogMSwKICAgICAgICAgICAgICAgICJib3JkZXItbGVmdC1zdHlsZSI6IDEsCiAgICAgICAgICAgICAgICAiYm9yZGVyLWxlZnQtd2lkdGgiOiAxLAogICAgICAgICAgICAgICAgImJvcmRlci1yYWRpdXMiOiAxLAogICAgICAgICAgICAgICAgImJvcmRlci1yaWdodCI6IDEsCiAgICAgICAgICAgICAgICAiYm9yZGVyLXJpZ2h0LWNvbG9yIjogMSwKICAgICAgICAgICAgICAgICJib3JkZXItcmlnaHQtc3R5bGUiOiAxLAogICAgICAgICAgICAgICAgImJvcmRlci1yaWdodC13aWR0aCI6IDEsCiAgICAgICAgICAgICAgICAiYm9yZGVyLXNwYWNpbmciOiAxLAogICAgICAgICAgICAgICAgImJvcmRlci1zdHlsZSI6IDEsCiAgICAgICAgICAgICAgICAiYm9yZGVyLXRvcCI6IDEsCiAgICAgICAgICAgICAgICAiYm9yZGVyLXRvcC1jb2xvciI6IDEsCiAgICAgICAgICAgICAgICAiYm9yZGVyLXRvcC1sZWZ0LXJhZGl1cyI6IDEsCiAgICAgICAgICAgICAgICAiYm9yZGVyLXRvcC1yaWdodC1yYWRpdXMiOiAxLAogICAgICAgICAgICAgICAgImJvcmRlci10b3Atc3R5bGUiOiAxLAogICAgICAgICAgICAgICAgImJvcmRlci10b3Atd2lkdGgiOiAxLAogICAgICAgICAgICAgICAgImJvcmRlci13aWR0aCI6IDEsCiAgICAgICAgICAgICAgICAiYm90dG9tIjogMSwgCiAgICAgICAgICAgICAgICAiYm94LWFsaWduIjogMSwKICAgICAgICAgICAgICAgICJib3gtZGVjb3JhdGlvbi1icmVhayI6IDEsCiAgICAgICAgICAgICAgICAiYm94LWRpcmVjdGlvbiI6IDEsCiAgICAgICAgICAgICAgICAiYm94LWZsZXgiOiAxLAogICAgICAgICAgICAgICAgImJveC1mbGV4LWdyb3VwIjogMSwKICAgICAgICAgICAgICAgICJib3gtbGluZXMiOiAxLAogICAgICAgICAgICAgICAgImJveC1vcmRpbmFsLWdyb3VwIjogMSwKICAgICAgICAgICAgICAgICJib3gtb3JpZW50IjogMSwKICAgICAgICAgICAgICAgICJib3gtcGFjayI6IDEsCiAgICAgICAgICAgICAgICAiYm94LXNoYWRvdyI6IDEsCiAgICAgICAgICAgICAgICAiYm94LXNpemluZyI6IDEsCiAgICAgICAgICAgICAgICAiYnJlYWstYWZ0ZXIiOiAxLAogICAgICAgICAgICAgICAgImJyZWFrLWJlZm9yZSI6IDEsCiAgICAgICAgICAgICAgICAiYnJlYWstaW5zaWRlIjogMSwKICAgICAgICAgICAgICAgICJjYXB0aW9uLXNpZGUiOiAxLAogICAgICAgICAgICAgICAgImNsZWFyIjogMSwKICAgICAgICAgICAgICAgICJjbGlwIjogMSwKICAgICAgICAgICAgICAgICJjb2xvciI6IDEsCiAgICAgICAgICAgICAgICAiY29sb3ItcHJvZmlsZSI6IDEsCiAgICAgICAgICAgICAgICAiY29sdW1uLWNvdW50IjogMSwKICAgICAgICAgICAgICAgICJjb2x1bW4tZmlsbCI6IDEsCiAgICAgICAgICAgICAgICAiY29sdW1uLWdhcCI6IDEsCiAgICAgICAgICAgICAgICAiY29sdW1uLXJ1bGUiOiAxLAogICAgICAgICAgICAgICAgImNvbHVtbi1ydWxlLWNvbG9yIjogMSwKICAgICAgICAgICAgICAgICJjb2x1bW4tcnVsZS1zdHlsZSI6IDEsCiAgICAgICAgICAgICAgICAiY29sdW1uLXJ1bGUtd2lkdGgiOiAxLAogICAgICAgICAgICAgICAgImNvbHVtbi1zcGFuIjogMSwKICAgICAgICAgICAgICAgICJjb2x1bW4td2lkdGgiOiAxLAogICAgICAgICAgICAgICAgImNvbHVtbnMiOiAxLAogICAgICAgICAgICAgICAgImNvbnRlbnQiOiAxLAogICAgICAgICAgICAgICAgImNvdW50ZXItaW5jcmVtZW50IjogMSwKICAgICAgICAgICAgICAgICJjb3VudGVyLXJlc2V0IjogMSwKICAgICAgICAgICAgICAgICJjcm9wIjogMSwKICAgICAgICAgICAgICAgICJjdWUiOiAxLAogICAgICAgICAgICAgICAgImN1ZS1hZnRlciI6IDEsCiAgICAgICAgICAgICAgICAiY3VlLWJlZm9yZSI6IDEsCiAgICAgICAgICAgICAgICAiY3Vyc29yIjogMSwKICAgICAgICAgICAgICAgICJkaXJlY3Rpb24iOiAxLAogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAxLAogICAgICAgICAgICAgICAgImRvbWluYW50LWJhc2VsaW5lIjogMSwKICAgICAgICAgICAgICAgICJkcm9wLWluaXRpYWwtYWZ0ZXItYWRqdXN0IjogMSwKICAgICAgICAgICAgICAgICJkcm9wLWluaXRpYWwtYWZ0ZXItYWxpZ24iOiAxLAogICAgICAgICAgICAgICAgImRyb3AtaW5pdGlhbC1iZWZvcmUtYWRqdXN0IjogMSwKICAgICAgICAgICAgICAgICJkcm9wLWluaXRpYWwtYmVmb3JlLWFsaWduIjogMSwKICAgICAgICAgICAgICAgICJkcm9wLWluaXRpYWwtc2l6ZSI6IDEsCiAgICAgICAgICAgICAgICAiZHJvcC1pbml0aWFsLXZhbHVlIjogMSwKICAgICAgICAgICAgICAgICJlbGV2YXRpb24iOiAxLAogICAgICAgICAgICAgICAgImVtcHR5LWNlbGxzIjogMSwKICAgICAgICAgICAgICAgICJmaXQiOiAxLAogICAgICAgICAgICAgICAgImZpdC1wb3NpdGlvbiI6IDEsCiAgICAgICAgICAgICAgICAiZmxvYXQiOiAxLCAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICJmbG9hdC1vZmZzZXQiOiAxLAogICAgICAgICAgICAgICAgImZvbnQiOiAxLAogICAgICAgICAgICAgICAgImZvbnQtZmFtaWx5IjogMSwKICAgICAgICAgICAgICAgICJmb250LXNpemUiOiAxLAogICAgICAgICAgICAgICAgImZvbnQtc2l6ZS1hZGp1c3QiOiAxLAogICAgICAgICAgICAgICAgImZvbnQtc3RyZXRjaCI6IDEsCiAgICAgICAgICAgICAgICAiZm9udC1zdHlsZSI6IDEsCiAgICAgICAgICAgICAgICAiZm9udC12YXJpYW50IjogMSwKICAgICAgICAgICAgICAgICJmb250LXdlaWdodCI6IDEsCiAgICAgICAgICAgICAgICAiZ3JpZC1jb2x1bW5zIjogMSwKICAgICAgICAgICAgICAgICJncmlkLXJvd3MiOiAxLAogICAgICAgICAgICAgICAgImhhbmdpbmctcHVuY3R1YXRpb24iOiAxLAogICAgICAgICAgICAgICAgImhlaWdodCI6IDEsCiAgICAgICAgICAgICAgICAiaHlwaGVuYXRlLWFmdGVyIjogMSwKICAgICAgICAgICAgICAgICJoeXBoZW5hdGUtYmVmb3JlIjogMSwKICAgICAgICAgICAgICAgICJoeXBoZW5hdGUtY2hhcmFjdGVyIjogMSwKICAgICAgICAgICAgICAgICJoeXBoZW5hdGUtbGluZXMiOiAxLAogICAgICAgICAgICAgICAgImh5cGhlbmF0ZS1yZXNvdXJjZSI6IDEsCiAgICAgICAgICAgICAgICAiaHlwaGVucyI6IDEsCiAgICAgICAgICAgICAgICAiaWNvbiI6IDEsCiAgICAgICAgICAgICAgICAiaW1hZ2Utb3JpZW50YXRpb24iOiAxLAogICAgICAgICAgICAgICAgImltYWdlLXJlbmRlcmluZyI6IDEsCiAgICAgICAgICAgICAgICAiaW1hZ2UtcmVzb2x1dGlvbiI6IDEsCiAgICAgICAgICAgICAgICAiaW5saW5lLWJveC1hbGlnbiI6IDEsCiAgICAgICAgICAgICAgICAibGVmdCI6IDEsCiAgICAgICAgICAgICAgICAibGV0dGVyLXNwYWNpbmciOiAxLAogICAgICAgICAgICAgICAgImxpbmUtaGVpZ2h0IjogMSwKICAgICAgICAgICAgICAgICJsaW5lLXN0YWNraW5nIjogMSwKICAgICAgICAgICAgICAgICJsaW5lLXN0YWNraW5nLXJ1YnkiOiAxLAogICAgICAgICAgICAgICAgImxpbmUtc3RhY2tpbmctc2hpZnQiOiAxLAogICAgICAgICAgICAgICAgImxpbmUtc3RhY2tpbmctc3RyYXRlZ3kiOiAxLAogICAgICAgICAgICAgICAgImxpc3Qtc3R5bGUiOiAxLAogICAgICAgICAgICAgICAgImxpc3Qtc3R5bGUtaW1hZ2UiOiAxLAogICAgICAgICAgICAgICAgImxpc3Qtc3R5bGUtcG9zaXRpb24iOiAxLAogICAgICAgICAgICAgICAgImxpc3Qtc3R5bGUtdHlwZSI6IDEsCiAgICAgICAgICAgICAgICAibWFyZ2luIjogMSwKICAgICAgICAgICAgICAgICJtYXJnaW4tYm90dG9tIjogMSwKICAgICAgICAgICAgICAgICJtYXJnaW4tbGVmdCI6IDEsCiAgICAgICAgICAgICAgICAibWFyZ2luLXJpZ2h0IjogMSwKICAgICAgICAgICAgICAgICJtYXJnaW4tdG9wIjogMSwKICAgICAgICAgICAgICAgICJtYXJrIjogMSwKICAgICAgICAgICAgICAgICJtYXJrLWFmdGVyIjogMSwKICAgICAgICAgICAgICAgICJtYXJrLWJlZm9yZSI6IDEsCiAgICAgICAgICAgICAgICAibWFya3MiOiAxLAogICAgICAgICAgICAgICAgIm1hcnF1ZWUtZGlyZWN0aW9uIjogMSwKICAgICAgICAgICAgICAgICJtYXJxdWVlLXBsYXktY291bnQiOiAxLAogICAgICAgICAgICAgICAgIm1hcnF1ZWUtc3BlZWQiOiAxLAogICAgICAgICAgICAgICAgIm1hcnF1ZWUtc3R5bGUiOiAxLAogICAgICAgICAgICAgICAgIm1heC1oZWlnaHQiOiAxLAogICAgICAgICAgICAgICAgIm1heC13aWR0aCI6IDEsCiAgICAgICAgICAgICAgICAibWluLWhlaWdodCI6IDEsCiAgICAgICAgICAgICAgICAibWluLXdpZHRoIjogMSwKICAgICAgICAgICAgICAgICJtb3ZlLXRvIjogMSwKICAgICAgICAgICAgICAgICJuYXYtZG93biI6IDEsCiAgICAgICAgICAgICAgICAibmF2LWluZGV4IjogMSwKICAgICAgICAgICAgICAgICJuYXYtbGVmdCI6IDEsCiAgICAgICAgICAgICAgICAibmF2LXJpZ2h0IjogMSwKICAgICAgICAgICAgICAgICJuYXYtdXAiOiAxLAogICAgICAgICAgICAgICAgIm9wYWNpdHkiOiAxLAogICAgICAgICAgICAgICAgIm9ycGhhbnMiOiAxLAogICAgICAgICAgICAgICAgIm91dGxpbmUiOiAxLAogICAgICAgICAgICAgICAgIm91dGxpbmUtY29sb3IiOiAxLAogICAgICAgICAgICAgICAgIm91dGxpbmUtb2Zmc2V0IjogMSwKICAgICAgICAgICAgICAgICJvdXRsaW5lLXN0eWxlIjogMSwKICAgICAgICAgICAgICAgICJvdXRsaW5lLXdpZHRoIjogMSwKICAgICAgICAgICAgICAgICJvdmVyZmxvdyI6IDEsCiAgICAgICAgICAgICAgICAib3ZlcmZsb3ctc3R5bGUiOiAxLAogICAgICAgICAgICAgICAgIm92ZXJmbG93LXgiOiAxLAogICAgICAgICAgICAgICAgIm92ZXJmbG93LXkiOiAxLAogICAgICAgICAgICAgICAgInBhZGRpbmciOiAxLAogICAgICAgICAgICAgICAgInBhZGRpbmctYm90dG9tIjogMSwKICAgICAgICAgICAgICAgICJwYWRkaW5nLWxlZnQiOiAxLAogICAgICAgICAgICAgICAgInBhZGRpbmctcmlnaHQiOiAxLAogICAgICAgICAgICAgICAgInBhZGRpbmctdG9wIjogMSwKICAgICAgICAgICAgICAgICJwYWdlIjogMSwKICAgICAgICAgICAgICAgICJwYWdlLWJyZWFrLWFmdGVyIjogMSwKICAgICAgICAgICAgICAgICJwYWdlLWJyZWFrLWJlZm9yZSI6IDEsCiAgICAgICAgICAgICAgICAicGFnZS1icmVhay1pbnNpZGUiOiAxLAogICAgICAgICAgICAgICAgInBhZ2UtcG9saWN5IjogMSwKICAgICAgICAgICAgICAgICJwYXVzZSI6IDEsCiAgICAgICAgICAgICAgICAicGF1c2UtYWZ0ZXIiOiAxLAogICAgICAgICAgICAgICAgInBhdXNlLWJlZm9yZSI6IDEsCiAgICAgICAgICAgICAgICAicGVyc3BlY3RpdmUiOiAxLAogICAgICAgICAgICAgICAgInBlcnNwZWN0aXZlLW9yaWdpbiI6IDEsCiAgICAgICAgICAgICAgICAicGhvbmVtZXMiOiAxLAogICAgICAgICAgICAgICAgInBpdGNoIjogMSwKICAgICAgICAgICAgICAgICJwaXRjaC1yYW5nZSI6IDEsCiAgICAgICAgICAgICAgICAicGxheS1kdXJpbmciOiAxLAogICAgICAgICAgICAgICAgInBvc2l0aW9uIjogMSwKICAgICAgICAgICAgICAgICJwcmVzZW50YXRpb24tbGV2ZWwiOiAxLAogICAgICAgICAgICAgICAgInB1bmN0dWF0aW9uLXRyaW0iOiAxLAogICAgICAgICAgICAgICAgInF1b3RlcyI6IDEsCiAgICAgICAgICAgICAgICAicmVuZGVyaW5nLWludGVudCI6IDEsCiAgICAgICAgICAgICAgICAicmVzaXplIjogMSwKICAgICAgICAgICAgICAgICJyZXN0IjogMSwKICAgICAgICAgICAgICAgICJyZXN0LWFmdGVyIjogMSwKICAgICAgICAgICAgICAgICJyZXN0LWJlZm9yZSI6IDEsCiAgICAgICAgICAgICAgICAicmljaG5lc3MiOiAxLAogICAgICAgICAgICAgICAgInJpZ2h0IjogMSwKICAgICAgICAgICAgICAgICJyb3RhdGlvbiI6IDEsCiAgICAgICAgICAgICAgICAicm90YXRpb24tcG9pbnQiOiAxLAogICAgICAgICAgICAgICAgInJ1YnktYWxpZ24iOiAxLAogICAgICAgICAgICAgICAgInJ1Ynktb3ZlcmhhbmciOiAxLAogICAgICAgICAgICAgICAgInJ1YnktcG9zaXRpb24iOiAxLAogICAgICAgICAgICAgICAgInJ1Ynktc3BhbiI6IDEsCiAgICAgICAgICAgICAgICAic2l6ZSI6IDEsCiAgICAgICAgICAgICAgICAic3BlYWsiOiAxLAogICAgICAgICAgICAgICAgInNwZWFrLWhlYWRlciI6IDEsCiAgICAgICAgICAgICAgICAic3BlYWstbnVtZXJhbCI6IDEsCiAgICAgICAgICAgICAgICAic3BlYWstcHVuY3R1YXRpb24iOiAxLAogICAgICAgICAgICAgICAgInNwZWVjaC1yYXRlIjogMSwKICAgICAgICAgICAgICAgICJzdHJlc3MiOiAxLAogICAgICAgICAgICAgICAgInN0cmluZy1zZXQiOiAxLAogICAgICAgICAgICAgICAgInRhYmxlLWxheW91dCI6IDEsCiAgICAgICAgICAgICAgICAidGFyZ2V0IjogMSwKICAgICAgICAgICAgICAgICJ0YXJnZXQtbmFtZSI6IDEsCiAgICAgICAgICAgICAgICAidGFyZ2V0LW5ldyI6IDEsCiAgICAgICAgICAgICAgICAidGFyZ2V0LXBvc2l0aW9uIjogMSwKICAgICAgICAgICAgICAgICJ0ZXh0LWFsaWduIjogMSwKICAgICAgICAgICAgICAgICJ0ZXh0LWFsaWduLWxhc3QiOiAxLAogICAgICAgICAgICAgICAgInRleHQtZGVjb3JhdGlvbiI6IDEsCiAgICAgICAgICAgICAgICAidGV4dC1lbXBoYXNpcyI6IDEsCiAgICAgICAgICAgICAgICAidGV4dC1oZWlnaHQiOiAxLAogICAgICAgICAgICAgICAgInRleHQtaW5kZW50IjogMSwKICAgICAgICAgICAgICAgICJ0ZXh0LWp1c3RpZnkiOiAxLAogICAgICAgICAgICAgICAgInRleHQtb3V0bGluZSI6IDEsCiAgICAgICAgICAgICAgICAidGV4dC1zaGFkb3ciOiAxLAogICAgICAgICAgICAgICAgInRleHQtdHJhbnNmb3JtIjogMSwKICAgICAgICAgICAgICAgICJ0ZXh0LXdyYXAiOiAxLAogICAgICAgICAgICAgICAgInRvcCI6IDEsCiAgICAgICAgICAgICAgICAidHJhbnNmb3JtIjogMSwKICAgICAgICAgICAgICAgICJ0cmFuc2Zvcm0tb3JpZ2luIjogMSwKICAgICAgICAgICAgICAgICJ0cmFuc2Zvcm0tc3R5bGUiOiAxLAogICAgICAgICAgICAgICAgInRyYW5zaXRpb24iOiAxLAogICAgICAgICAgICAgICAgInRyYW5zaXRpb24tZGVsYXkiOiAxLAogICAgICAgICAgICAgICAgInRyYW5zaXRpb24tZHVyYXRpb24iOiAxLAogICAgICAgICAgICAgICAgInRyYW5zaXRpb24tcHJvcGVydHkiOiAxLAogICAgICAgICAgICAgICAgInRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uIjogMSwKICAgICAgICAgICAgICAgICJ1bmljb2RlLWJpZGkiOiAxLAogICAgICAgICAgICAgICAgInZlcnRpY2FsLWFsaWduIjogMSwKICAgICAgICAgICAgICAgICJ2aXNpYmlsaXR5IjogMSwKICAgICAgICAgICAgICAgICJ2b2ljZS1iYWxhbmNlIjogMSwKICAgICAgICAgICAgICAgICJ2b2ljZS1kdXJhdGlvbiI6IDEsCiAgICAgICAgICAgICAgICAidm9pY2UtZmFtaWx5IjogMSwKICAgICAgICAgICAgICAgICJ2b2ljZS1waXRjaCI6IDEsCiAgICAgICAgICAgICAgICAidm9pY2UtcGl0Y2gtcmFuZ2UiOiAxLAogICAgICAgICAgICAgICAgInZvaWNlLXJhdGUiOiAxLAogICAgICAgICAgICAgICAgInZvaWNlLXN0cmVzcyI6IDEsCiAgICAgICAgICAgICAgICAidm9pY2Utdm9sdW1lIjogMSwKICAgICAgICAgICAgICAgICJ2b2x1bWUiOiAxLAogICAgICAgICAgICAgICAgIndoaXRlLXNwYWNlIjogMSwKICAgICAgICAgICAgICAgICJ3aGl0ZS1zcGFjZS1jb2xsYXBzZSI6IDEsCiAgICAgICAgICAgICAgICAid2lkb3dzIjogMSwKICAgICAgICAgICAgICAgICJ3aWR0aCI6IDEsCiAgICAgICAgICAgICAgICAid29yZC1icmVhayI6IDEsCiAgICAgICAgICAgICAgICAid29yZC1zcGFjaW5nIjogMSwKICAgICAgICAgICAgICAgICJ3b3JkLXdyYXAiOiAxLAogICAgICAgICAgICAgICAgInotaW5kZXgiOiAxLAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL0lFCiAgICAgICAgICAgICAgICAiZmlsdGVyIjogMSwKICAgICAgICAgICAgICAgICJ6b29tIjogMQogICAgICAgICAgICB9OwoKICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInByb3BlcnR5IiwgZnVuY3Rpb24oZXZlbnQpewogICAgICAgICAgICB2YXIgbmFtZSA9IGV2ZW50LnByb3BlcnR5LnRleHQudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgIGlmICghcHJvcGVydGllc1tuYW1lXSAmJiBuYW1lLmNoYXJBdCgwKSAhPSAiLSIpewogICAgICAgICAgICAgICAgcmVwb3J0ZXIuZXJyb3IoIlVua25vd24gcHJvcGVydHkgJyIgKyBldmVudC5wcm9wZXJ0eSArICInLiIsIGV2ZW50LmxpbmUsIGV2ZW50LmNvbCwgcnVsZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSk7CiAgICB9Cgp9KTsKLyoKICogUnVsZTogRG9uJ3QgdXNlIGNsYXNzZXMgb3IgSURzIHdpdGggZWxlbWVudHMgKGEuZm9vIG9yIGEjZm9vKS4KICovCkNTU0xpbnQuYWRkUnVsZSh7CgogICAgLy9ydWxlIGluZm9ybWF0aW9uCiAgICBpZDogIm92ZXJxdWFsaWZpZWQtZWxlbWVudHMiLAogICAgbmFtZTogIk92ZXJxdWFsaWZpZWQgRWxlbWVudHMiLAogICAgZGVzYzogIkRvbid0IHVzZSBjbGFzc2VzIG9yIElEcyB3aXRoIGVsZW1lbnRzIChhLmZvbyBvciBhI2ZvbykuIiwKICAgIGJyb3dzZXJzOiAiQWxsIiwKCiAgICAvL2luaXRpYWxpemF0aW9uCiAgICBpbml0OiBmdW5jdGlvbihwYXJzZXIsIHJlcG9ydGVyKXsKICAgICAgICB2YXIgcnVsZSA9IHRoaXMsCiAgICAgICAgICAgIGNsYXNzZXMgPSB7fTsKICAgICAgICAgICAgCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJzdGFydHJ1bGUiLCBmdW5jdGlvbihldmVudCl7CiAgICAgICAgICAgIHZhciBzZWxlY3RvcnMgPSBldmVudC5zZWxlY3RvcnMsCiAgICAgICAgICAgICAgICBzZWxlY3RvciwKICAgICAgICAgICAgICAgIHBhcnQsCiAgICAgICAgICAgICAgICBtb2RpZmllciwKICAgICAgICAgICAgICAgIGksIGosIGs7CgogICAgICAgICAgICBmb3IgKGk9MDsgaSA8IHNlbGVjdG9ycy5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgICAgICBzZWxlY3RvciA9IHNlbGVjdG9yc1tpXTsKCiAgICAgICAgICAgICAgICBmb3IgKGo9MDsgaiA8IHNlbGVjdG9yLnBhcnRzLmxlbmd0aDsgaisrKXsKICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gc2VsZWN0b3IucGFydHNbal07CiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBwYXJzZXJsaWIuY3NzLlNlbGVjdG9yUGFydCl7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaz0wOyBrIDwgcGFydC5tb2RpZmllcnMubGVuZ3RoOyBrKyspewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXIgPSBwYXJ0Lm1vZGlmaWVyc1trXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0LmVsZW1lbnROYW1lICYmIG1vZGlmaWVyLnR5cGUgPT0gImlkIil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZXIud2FybigiRWxlbWVudCAoIiArIHBhcnQgKyAiKSBpcyBvdmVycXVhbGlmaWVkLCBqdXN0IHVzZSAiICsgbW9kaWZpZXIgKyAiIHdpdGhvdXQgZWxlbWVudCBuYW1lLiIsIHBhcnQubGluZSwgcGFydC5jb2wsIHJ1bGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtb2RpZmllci50eXBlID09ICJjbGFzcyIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2xhc3Nlc1ttb2RpZmllcl0pewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2VzW21vZGlmaWVyXSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2VzW21vZGlmaWVyXS5wdXNoKHsgbW9kaWZpZXI6IG1vZGlmaWVyLCBwYXJ0OiBwYXJ0IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJlbmRzdHlsZXNoZWV0IiwgZnVuY3Rpb24oKXsKICAgICAgICAKICAgICAgICAgICAgdmFyIHByb3A7CiAgICAgICAgICAgIGZvciAocHJvcCBpbiBjbGFzc2VzKXsKICAgICAgICAgICAgICAgIGlmIChjbGFzc2VzLmhhc093blByb3BlcnR5KHByb3ApKXsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8vb25lIHVzZSBtZWFucyB0aGF0IHRoaXMgaXMgb3ZlcnF1YWxpZmllZAogICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc2VzW3Byb3BdLmxlbmd0aCA9PSAxICYmIGNsYXNzZXNbcHJvcF1bMF0ucGFydC5lbGVtZW50TmFtZSl7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVyLndhcm4oIkVsZW1lbnQgKCIgKyBjbGFzc2VzW3Byb3BdWzBdLnBhcnQgKyAiKSBpcyBvdmVycXVhbGlmaWVkLCBqdXN0IHVzZSAiICsgY2xhc3Nlc1twcm9wXVswXS5tb2RpZmllciArICIgd2l0aG91dCBlbGVtZW50IG5hbWUuIiwgY2xhc3Nlc1twcm9wXVswXS5wYXJ0LmxpbmUsIGNsYXNzZXNbcHJvcF1bMF0ucGFydC5jb2wsIHJ1bGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSAgICAgICAgCiAgICAgICAgfSk7CiAgICB9Cgp9KTsKLyoKICogUnVsZTogSGVhZGluZ3MgKGgxLWg2KSBzaG91bGQgbm90IGJlIHF1YWxpZmllZCAobmFtZXNwYWNlZCkuCiAqLwpDU1NMaW50LmFkZFJ1bGUoewoKICAgIC8vcnVsZSBpbmZvcm1hdGlvbgogICAgaWQ6ICJxdWFsaWZpZWQtaGVhZGluZ3MiLAogICAgbmFtZTogIlF1YWxpZmllZCBIZWFkaW5ncyIsCiAgICBkZXNjOiAiSGVhZGluZ3Mgc2hvdWxkIG5vdCBiZSBxdWFsaWZpZWQgKG5hbWVzcGFjZWQpLiIsCiAgICBicm93c2VyczogIkFsbCIsCgogICAgLy9pbml0aWFsaXphdGlvbgogICAgaW5pdDogZnVuY3Rpb24ocGFyc2VyLCByZXBvcnRlcil7CiAgICAgICAgdmFyIHJ1bGUgPSB0aGlzOwoKICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInN0YXJ0cnVsZSIsIGZ1bmN0aW9uKGV2ZW50KXsKICAgICAgICAgICAgdmFyIHNlbGVjdG9ycyA9IGV2ZW50LnNlbGVjdG9ycywKICAgICAgICAgICAgICAgIHNlbGVjdG9yLAogICAgICAgICAgICAgICAgcGFydCwKICAgICAgICAgICAgICAgIGksIGo7CgogICAgICAgICAgICBmb3IgKGk9MDsgaSA8IHNlbGVjdG9ycy5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgICAgICBzZWxlY3RvciA9IHNlbGVjdG9yc1tpXTsKCiAgICAgICAgICAgICAgICBmb3IgKGo9MDsgaiA8IHNlbGVjdG9yLnBhcnRzLmxlbmd0aDsgaisrKXsKICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gc2VsZWN0b3IucGFydHNbal07CiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBwYXJzZXJsaWIuY3NzLlNlbGVjdG9yUGFydCl7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0LmVsZW1lbnROYW1lICYmIC9oWzEtNl0vLnRlc3QocGFydC5lbGVtZW50TmFtZS50b1N0cmluZygpKSAmJiBqID4gMCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlci53YXJuKCJIZWFkaW5nICgiICsgcGFydC5lbGVtZW50TmFtZSArICIpIHNob3VsZCBub3QgYmUgcXVhbGlmaWVkLiIsIHBhcnQubGluZSwgcGFydC5jb2wsIHJ1bGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9Cgp9KTsKLyoKICogUnVsZTogU2VsZWN0b3JzIHRoYXQgbG9vayBsaWtlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIHNsb3cgYW5kIHNob3VsZCBiZSBhdm9pZGVkLgogKi8KQ1NTTGludC5hZGRSdWxlKHsKCiAgICAvL3J1bGUgaW5mb3JtYXRpb24KICAgIGlkOiAicmVnZXgtc2VsZWN0b3JzIiwKICAgIG5hbWU6ICJSZWdleCBTZWxlY3RvcnMiLAogICAgZGVzYzogIlNlbGVjdG9ycyB0aGF0IGxvb2sgbGlrZSByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBzbG93IGFuZCBzaG91bGQgYmUgYXZvaWRlZC4iLAogICAgYnJvd3NlcnM6ICJBbGwiLAoKICAgIC8vaW5pdGlhbGl6YXRpb24KICAgIGluaXQ6IGZ1bmN0aW9uKHBhcnNlciwgcmVwb3J0ZXIpewogICAgICAgIHZhciBydWxlID0gdGhpczsKCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJzdGFydHJ1bGUiLCBmdW5jdGlvbihldmVudCl7CiAgICAgICAgICAgIHZhciBzZWxlY3RvcnMgPSBldmVudC5zZWxlY3RvcnMsCiAgICAgICAgICAgICAgICBzZWxlY3RvciwKICAgICAgICAgICAgICAgIHBhcnQsCiAgICAgICAgICAgICAgICBtb2RpZmllciwKICAgICAgICAgICAgICAgIGksIGosIGs7CgogICAgICAgICAgICBmb3IgKGk9MDsgaSA8IHNlbGVjdG9ycy5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgICAgICBzZWxlY3RvciA9IHNlbGVjdG9yc1tpXTsKICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqIDwgc2VsZWN0b3IucGFydHMubGVuZ3RoOyBqKyspewogICAgICAgICAgICAgICAgICAgIHBhcnQgPSBzZWxlY3Rvci5wYXJ0c1tqXTsKICAgICAgICAgICAgICAgICAgICBpZiAocGFydCBpbnN0YW5jZW9mIHBhcnNlcmxpYi5jc3MuU2VsZWN0b3JQYXJ0KXsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrPTA7IGsgPCBwYXJ0Lm1vZGlmaWVycy5sZW5ndGg7IGsrKyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllciA9IHBhcnQubW9kaWZpZXJzW2tdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGlmaWVyLnR5cGUgPT0gImF0dHJpYnV0ZSIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgvKFtcflx8XF5cJFwqXT0pLy50ZXN0KG1vZGlmaWVyKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVyLndhcm4oIkF0dHJpYnV0ZSBzZWxlY3RvcnMgd2l0aCAiICsgUmVnRXhwLiQxICsgIiBhcmUgc2xvdyEiLCBtb2RpZmllci5saW5lLCBtb2RpZmllci5jb2wsIHJ1bGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCn0pOwovKgogKiBSdWxlOiBUb3RhbCBudW1iZXIgb2YgcnVsZXMgc2hvdWxkIG5vdCBleGNlZWQgeC4KICovCkNTU0xpbnQuYWRkUnVsZSh7CgogICAgLy9ydWxlIGluZm9ybWF0aW9uCiAgICBpZDogInJ1bGVzLWNvdW50IiwKICAgIG5hbWU6ICJSdWxlcyBDb3VudCIsCiAgICBkZXNjOiAiVHJhY2sgaG93IG1hbnkgcnVsZXMgdGhlcmUgYXJlLiIsCiAgICBicm93c2VyczogIkFsbCIsCgogICAgLy9pbml0aWFsaXphdGlvbgogICAgaW5pdDogZnVuY3Rpb24ocGFyc2VyLCByZXBvcnRlcil7CiAgICAgICAgdmFyIHJ1bGUgPSB0aGlzLAogICAgICAgICAgICBjb3VudCA9IDA7CgogICAgICAgIC8vY291bnQgZWFjaCBydWxlCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJzdGFydHJ1bGUiLCBmdW5jdGlvbigpewogICAgICAgICAgICBjb3VudCsrOwogICAgICAgIH0pOwoKICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoImVuZHN0eWxlc2hlZXQiLCBmdW5jdGlvbigpewogICAgICAgICAgICByZXBvcnRlci5zdGF0KCJydWxlLWNvdW50IiwgY291bnQpOwogICAgICAgIH0pOwogICAgfQoKfSk7Ci8qCiAqIFJ1bGU6IERvbid0IHVzZSB0ZXh0LWluZGVudCBmb3IgaW1hZ2UgcmVwbGFjZW1lbnQgaWYgeW91IG5lZWQgdG8gc3VwcG9ydCBydGwuIAogKiAKICovCi8qCiAqIFNob3VsZCB3ZSBiZSBjaGVja2luZyBmb3IgcnRsL2x0cj8KICovCi8vQ29tbWVudGVkIG91dCBkdWUgdG8gbGFjayBvZiB0ZXN0cwpDU1NMaW50LmFkZFJ1bGUoewoKICAgIC8vcnVsZSBpbmZvcm1hdGlvbgogICAgaWQ6ICJ0ZXh0LWluZGVudCIsCiAgICBuYW1lOiAiVGV4dCBJbmRlbnQiLAogICAgZGVzYzogIkNoZWNrcyBmb3IgdGV4dCBpbmRlbnQgbGVzcyB0aGFuIC05OXB4IiwKICAgIGJyb3dzZXJzOiAiQWxsIiwKICAgIAogICAgLy9pbml0aWFsaXphdGlvbgogICAgaW5pdDogZnVuY3Rpb24ocGFyc2VyLCByZXBvcnRlcil7CiAgICAgICAgdmFyIHJ1bGUgPSB0aGlzOwogICAgCiAgICAgICAgLy9jaGVjayBmb3IgdXNlIG9mICJmb250LXNpemUiCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJwcm9wZXJ0eSIsIGZ1bmN0aW9uKGV2ZW50KXsKICAgICAgICAgICAgdmFyIG5hbWUgPSBldmVudC5wcm9wZXJ0eSwKICAgICAgICAgICAgICAgIHZhbHVlID0gZXZlbnQudmFsdWUucGFydHNbMF0udmFsdWU7CgogICAgICAgICAgICBpZiAobmFtZSA9PSAidGV4dC1pbmRlbnQiICYmIHZhbHVlIDwgLTk5KXsKICAgICAgICAgICAgICAgIHJlcG9ydGVyLndhcm4oIk5lZ2F0aXZlIHRleHQtaW5kZW50IGRvZXNuJ3Qgd29yayB3ZWxsIHdpdGggUlRMLiBJZiB5b3UgdXNlIHRleHQtaW5kZW50IGZvciBpbWFnZSByZXBsYWNlbWVudCBleHBsaWNpdGx5IHNldCB0ZXh0LWRpcmVjdGlvbiBmb3IgdGhhdCBpdGVtIHRvIGx0ci4iLCBuYW1lLmxpbmUsIG5hbWUuY29sLCBydWxlKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKfSk7Ci8qCiAqIFJ1bGU6IEhlYWRpbmdzIChoMS1oNikgc2hvdWxkIGJlIGRlZmluZWQgb25seSBvbmNlLgogKi8KQ1NTTGludC5hZGRSdWxlKHsKCiAgICAvL3J1bGUgaW5mb3JtYXRpb24KICAgIGlkOiAidW5pcXVlLWhlYWRpbmdzIiwKICAgIG5hbWU6ICJVbmlxdWUgSGVhZGluZ3MiLAogICAgZGVzYzogIkhlYWRpbmdzIHNob3VsZCBiZSBkZWZpbmVkIG9ubHkgb25jZS4iLAogICAgYnJvd3NlcnM6ICJBbGwiLAoKICAgIC8vaW5pdGlhbGl6YXRpb24KICAgIGluaXQ6IGZ1bmN0aW9uKHBhcnNlciwgcmVwb3J0ZXIpewogICAgICAgIHZhciBydWxlID0gdGhpczsKCiAgICAgICAgdmFyIGhlYWRpbmdzID0gIHsKICAgICAgICAgICAgICAgIGgxOiAwLAogICAgICAgICAgICAgICAgaDI6IDAsCiAgICAgICAgICAgICAgICBoMzogMCwKICAgICAgICAgICAgICAgIGg0OiAwLAogICAgICAgICAgICAgICAgaDU6IDAsCiAgICAgICAgICAgICAgICBoNjogMAogICAgICAgICAgICB9OwoKICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInN0YXJ0cnVsZSIsIGZ1bmN0aW9uKGV2ZW50KXsKICAgICAgICAgICAgdmFyIHNlbGVjdG9ycyA9IGV2ZW50LnNlbGVjdG9ycywKICAgICAgICAgICAgICAgIHNlbGVjdG9yLAogICAgICAgICAgICAgICAgcGFydCwKICAgICAgICAgICAgICAgIGk7CgogICAgICAgICAgICBmb3IgKGk9MDsgaSA8IHNlbGVjdG9ycy5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgICAgICBzZWxlY3RvciA9IHNlbGVjdG9yc1tpXTsKICAgICAgICAgICAgICAgIHBhcnQgPSBzZWxlY3Rvci5wYXJ0c1tzZWxlY3Rvci5wYXJ0cy5sZW5ndGgtMV07CgogICAgICAgICAgICAgICAgaWYgKHBhcnQuZWxlbWVudE5hbWUgJiYgLyhoWzEtNl0pLy50ZXN0KHBhcnQuZWxlbWVudE5hbWUudG9TdHJpbmcoKSkpewogICAgICAgICAgICAgICAgICAgIGhlYWRpbmdzW1JlZ0V4cC4kMV0rKzsKICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGluZ3NbUmVnRXhwLiQxXSA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZXIud2FybigiSGVhZGluZyAoIiArIHBhcnQuZWxlbWVudE5hbWUgKyAiKSBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuIiwgcGFydC5saW5lLCBwYXJ0LmNvbCwgcnVsZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9Cgp9KTsKLyoKICogUnVsZTogRG9uJ3QgdXNlIHVuaXZlcnNhbCBzZWxlY3RvciBiZWNhdXNlIGl0J3Mgc2xvdy4KICovCkNTU0xpbnQuYWRkUnVsZSh7CgogICAgLy9ydWxlIGluZm9ybWF0aW9uCiAgICBpZDogInVuaXZlcnNhbC1zZWxlY3RvciIsCiAgICBuYW1lOiAiVW5pdmVyc2FsIFNlbGVjdG9yIiwKICAgIGRlc2M6ICJUaGUgdW5pdmVyc2FsIHNlbGVjdG9yICgqKSBpcyBrbm93biB0byBiZSBzbG93LiIsCiAgICBicm93c2VyczogIkFsbCIsCgogICAgLy9pbml0aWFsaXphdGlvbgogICAgaW5pdDogZnVuY3Rpb24ocGFyc2VyLCByZXBvcnRlcil7CiAgICAgICAgdmFyIHJ1bGUgPSB0aGlzOwoKICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInN0YXJ0cnVsZSIsIGZ1bmN0aW9uKGV2ZW50KXsKICAgICAgICAgICAgdmFyIHNlbGVjdG9ycyA9IGV2ZW50LnNlbGVjdG9ycywKICAgICAgICAgICAgICAgIHNlbGVjdG9yLAogICAgICAgICAgICAgICAgcGFydCwKICAgICAgICAgICAgICAgIG1vZGlmaWVyLAogICAgICAgICAgICAgICAgaSwgaiwgazsKCiAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgc2VsZWN0b3JzLmxlbmd0aDsgaSsrKXsKICAgICAgICAgICAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3JzW2ldOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBwYXJ0ID0gc2VsZWN0b3IucGFydHNbc2VsZWN0b3IucGFydHMubGVuZ3RoLTFdOwogICAgICAgICAgICAgICAgaWYgKHBhcnQuZWxlbWVudE5hbWUgPT0gIioiKXsKICAgICAgICAgICAgICAgICAgICByZXBvcnRlci53YXJuKHJ1bGUuZGVzYywgcGFydC5saW5lLCBwYXJ0LmNvbCwgcnVsZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCn0pOwovKgogKiBSdWxlOiBXaGVuIHVzaW5nIGEgdmVuZG9yLXByZWZpeGVkIHByb3BlcnR5LCBtYWtlIHN1cmUgdG8KICogaW5jbHVkZSB0aGUgc3RhbmRhcmQgb25lLgogKi8KQ1NTTGludC5hZGRSdWxlKHsKCiAgICAvL3J1bGUgaW5mb3JtYXRpb24KICAgIGlkOiAidmVuZG9yLXByZWZpeCIsCiAgICBuYW1lOiAiVmVuZG9yIFByZWZpeCIsCiAgICBkZXNjOiAiV2hlbiB1c2luZyBhIHZlbmRvci1wcmVmaXhlZCBwcm9wZXJ0eSwgbWFrZSBzdXJlIHRvIGluY2x1ZGUgdGhlIHN0YW5kYXJkIG9uZS4iLAogICAgYnJvd3NlcnM6ICJBbGwiLAoKICAgIC8vaW5pdGlhbGl6YXRpb24KICAgIGluaXQ6IGZ1bmN0aW9uKHBhcnNlciwgcmVwb3J0ZXIpewogICAgICAgIHZhciBydWxlID0gdGhpcywKICAgICAgICAgICAgcHJvcGVydGllcywKICAgICAgICAgICAgbnVtLAogICAgICAgICAgICBwcm9wZXJ0aWVzVG9DaGVjayA9IHsKICAgICAgICAgICAgICAgICItbW96LWJvcmRlci1yYWRpdXMiOiAiYm9yZGVyLXJhZGl1cyIsCiAgICAgICAgICAgICAgICAiLXdlYmtpdC1ib3JkZXItcmFkaXVzIjogImJvcmRlci1yYWRpdXMiLAogICAgICAgICAgICAgICAgIi13ZWJraXQtYm9yZGVyLXRvcC1sZWZ0LXJhZGl1cyI6ICJib3JkZXItdG9wLWxlZnQtcmFkaXVzIiwKICAgICAgICAgICAgICAgICItd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzIjogImJvcmRlci10b3AtcmlnaHQtcmFkaXVzIiwKICAgICAgICAgICAgICAgICItd2Via2l0LWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXMiOiAiYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1cyIsCiAgICAgICAgICAgICAgICAiLXdlYmtpdC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1cyI6ICJib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1cyIsCiAgICAgICAgICAgICAgICAiLW1vei1ib3JkZXItcmFkaXVzLXRvcGxlZnQiOiAiYm9yZGVyLXRvcC1sZWZ0LXJhZGl1cyIsCiAgICAgICAgICAgICAgICAiLW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0IjogImJvcmRlci10b3AtcmlnaHQtcmFkaXVzIiwKICAgICAgICAgICAgICAgICItbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdCI6ICJib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzIiwKICAgICAgICAgICAgICAgICItbW96LWJvcmRlci1yYWRpdXMtYm90dG9tcmlnaHQiOiAiYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXMiLAogICAgICAgICAgICAgICAgIi1tb3otYm94LXNoYWRvdyI6ICJib3gtc2hhZG93IiwKICAgICAgICAgICAgICAgICItd2Via2l0LWJveC1zaGFkb3ciOiAiYm94LXNoYWRvdyIsCiAgICAgICAgICAgICAgICAiLW1vei10cmFuc2Zvcm0iIDogInRyYW5zZm9ybSIsCiAgICAgICAgICAgICAgICAiLXdlYmtpdC10cmFuc2Zvcm0iIDogInRyYW5zZm9ybSIsCiAgICAgICAgICAgICAgICAiLW8tdHJhbnNmb3JtIiA6ICJ0cmFuc2Zvcm0iLAogICAgICAgICAgICAgICAgIi1tcy10cmFuc2Zvcm0iIDogInRyYW5zZm9ybSIsCiAgICAgICAgICAgICAgICAiLW1vei1ib3gtc2l6aW5nIiA6ICJib3gtc2l6aW5nIiwKICAgICAgICAgICAgICAgICItd2Via2l0LWJveC1zaXppbmciIDogImJveC1zaXppbmciLAogICAgICAgICAgICAgICAgIi1tb3otdXNlci1zZWxlY3QiIDogInVzZXItc2VsZWN0IiwKICAgICAgICAgICAgICAgICIta2h0bWwtdXNlci1zZWxlY3QiIDogInVzZXItc2VsZWN0IiwKICAgICAgICAgICAgICAgICItd2Via2l0LXVzZXItc2VsZWN0IiA6ICJ1c2VyLXNlbGVjdCIgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH07CgogICAgICAgIC8vZXZlbnQgaGFuZGxlciBmb3IgYmVnaW5uaW5nIG9mIHJ1bGVzCiAgICAgICAgZnVuY3Rpb24gc3RhcnRSdWxlKCl7CiAgICAgICAgICAgIHByb3BlcnRpZXMgPSB7fTsKICAgICAgICAgICAgbnVtPTE7ICAgICAgICAKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy9ldmVudCBoYW5kbGVyIGZvciBlbmQgb2YgcnVsZXMKICAgICAgICBmdW5jdGlvbiBlbmRSdWxlKGV2ZW50KXsKICAgICAgICAgICAgdmFyIHByb3AsCiAgICAgICAgICAgICAgICBpLCBsZW4sCiAgICAgICAgICAgICAgICBzdGFuZGFyZCwKICAgICAgICAgICAgICAgIG5lZWRlZCwKICAgICAgICAgICAgICAgIGFjdHVhbCwKICAgICAgICAgICAgICAgIG5lZWRzU3RhbmRhcmQgPSBbXTsKCiAgICAgICAgICAgIGZvciAocHJvcCBpbiBwcm9wZXJ0aWVzKXsKICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzVG9DaGVja1twcm9wXSl7CiAgICAgICAgICAgICAgICAgICAgbmVlZHNTdGFuZGFyZC5wdXNoKHsgYWN0dWFsOiBwcm9wLCBuZWVkZWQ6IHByb3BlcnRpZXNUb0NoZWNrW3Byb3BdfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAoaT0wLCBsZW49bmVlZHNTdGFuZGFyZC5sZW5ndGg7IGkgPCBsZW47IGkrKyl7CiAgICAgICAgICAgICAgICBuZWVkZWQgPSBuZWVkc1N0YW5kYXJkW2ldLm5lZWRlZDsKICAgICAgICAgICAgICAgIGFjdHVhbCA9IG5lZWRzU3RhbmRhcmRbaV0uYWN0dWFsOwoKICAgICAgICAgICAgICAgIGlmICghcHJvcGVydGllc1tuZWVkZWRdKXsgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICByZXBvcnRlci53YXJuKCJNaXNzaW5nIHN0YW5kYXJkIHByb3BlcnR5ICciICsgbmVlZGVkICsgIicgdG8gZ28gYWxvbmcgd2l0aCAnIiArIGFjdHVhbCArICInLiIsIGV2ZW50LmxpbmUsIGV2ZW50LmNvbCwgcnVsZSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vbWFrZSBzdXJlIHN0YW5kYXJkIHByb3BlcnR5IGlzIGxhc3QKICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydGllc1tuZWVkZWRdWzBdLnBvcyA8IHByb3BlcnRpZXNbYWN0dWFsXVswXS5wb3MpewogICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlci53YXJuKCJTdGFuZGFyZCBwcm9wZXJ0eSAnIiArIG5lZWRlZCArICInIHNob3VsZCBjb21lIGFmdGVyIHZlbmRvci1wcmVmaXhlZCBwcm9wZXJ0eSAnIiArIGFjdHVhbCArICInLiIsIGV2ZW50LmxpbmUsIGV2ZW50LmNvbCwgcnVsZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0gICAgICAgIAogICAgICAgIAogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigic3RhcnRydWxlIiwgc3RhcnRSdWxlKTsKICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInN0YXJ0Zm9udGZhY2UiLCBzdGFydFJ1bGUpOwoKICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInByb3BlcnR5IiwgZnVuY3Rpb24oZXZlbnQpewogICAgICAgICAgICB2YXIgbmFtZSA9IGV2ZW50LnByb3BlcnR5LnRleHQudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgIGlmICghcHJvcGVydGllc1tuYW1lXSl7CiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzW25hbWVdID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHByb3BlcnRpZXNbbmFtZV0ucHVzaCh7IG5hbWU6IGV2ZW50LnByb3BlcnR5LCB2YWx1ZSA6IGV2ZW50LnZhbHVlLCBwb3M6bnVtKysgfSk7CiAgICAgICAgfSk7CgogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigiZW5kcnVsZSIsIGVuZFJ1bGUpOwogICAgICAgIHBhcnNlci5hZGRMaXN0ZW5lcigiZW5kZm9udGZhY2UiLCBlbmRSdWxlKTsKICAgIH0KCn0pOwovKgogKiBSdWxlOiBJZiBhbiBlbGVtZW50IGhhcyBhIHdpZHRoIG9mIDEwMCUsIGJlIGNhcmVmdWwgd2hlbiBwbGFjaW5nIHdpdGhpbgogKiBhbiBlbGVtZW50IHRoYXQgaGFzIHBhZGRpbmcuIEl0IG1heSBsb29rIHN0cmFuZ2UuCiAqLwovL0NvbW1lbnRlZCBvdXQgcGVuZGluZyBmdXJ0aGVyIHJldmlldy4KLypDU1NMaW50LmFkZFJ1bGUoewoKICAgIC8vcnVsZSBpbmZvcm1hdGlvbgogICAgaWQ6ICJ3aWR0aC0xMDAiLAogICAgbmFtZTogIldpZHRoIDEwMCUiLAogICAgZGVzYzogIkJlIGNhcmVmdWwgd2hlbiB1c2luZyB3aWR0aDogMTAwJSBvbiBlbGVtZW50cy4iLAogICAgYnJvd3NlcnM6ICJBbGwiLAoKICAgIC8vaW5pdGlhbGl6YXRpb24KICAgIGluaXQ6IGZ1bmN0aW9uKHBhcnNlciwgcmVwb3J0ZXIpewogICAgICAgIHZhciBydWxlID0gdGhpcywKICAgICAgICAgICAgd2lkdGgxMDAsCiAgICAgICAgICAgIGJveHNpemluZzsKCiAgICAgICAgcGFyc2VyLmFkZExpc3RlbmVyKCJzdGFydHJ1bGUiLCBmdW5jdGlvbigpewogICAgICAgICAgICB3aWR0aDEwMCA9IG51bGw7CiAgICAgICAgICAgIGJveHNpemluZyA9IGZhbHNlOwogICAgICAgIH0pOwoKICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInByb3BlcnR5IiwgZnVuY3Rpb24oZXZlbnQpewogICAgICAgICAgICB2YXIgbmFtZSA9IGV2ZW50LnByb3BlcnR5LnRleHQudG9Mb3dlckNhc2UoKSwKICAgICAgICAgICAgICAgIHZhbHVlID0gZXZlbnQudmFsdWU7CgogICAgICAgICAgICBpZiAobmFtZSA9PSAid2lkdGgiICYmIHZhbHVlID09ICIxMDAlIil7CiAgICAgICAgICAgICAgICB3aWR0aDEwMCA9IGV2ZW50LnByb3BlcnR5OwogICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUgPT0gImJveC1zaXppbmciIHx8IC9cLSg/OndlYmtpdHxtc3xtb3opXC1ib3gtc2l6aW5nLy50ZXN0KG5hbWUpKXsgIC8vbWVhbnMgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcKICAgICAgICAgICAgICAgIGJveHNpemluZyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICAKICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoImVuZHJ1bGUiLCBmdW5jdGlvbigpewogICAgICAgICAgICBpZiAod2lkdGgxMDAgJiYgIWJveHNpemluZyl7CiAgICAgICAgICAgICAgICByZXBvcnRlci53YXJuKCJFbGVtZW50cyB3aXRoIGEgd2lkdGggb2YgMTAwJSBtYXkgbm90IGFwcGVhciBhcyB5b3UgZXhwZWN0IGluc2lkZSBvZiBvdGhlciBlbGVtZW50cy4iLCB3aWR0aDEwMC5saW5lLCB3aWR0aDEwMC5jb2wsIHJ1bGUpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9Cgp9KTsqLwovKgogKiBSdWxlOiBZb3UgZG9uJ3QgbmVlZCB0byBzcGVjaWZ5IHVuaXRzIHdoZW4gYSB2YWx1ZSBpcyAwLgogKi8KQ1NTTGludC5hZGRSdWxlKHsKCiAgICAvL3J1bGUgaW5mb3JtYXRpb24KICAgIGlkOiAiemVyby11bml0cyIsCiAgICBuYW1lOiAiWmVybyBVbml0cyIsCiAgICBkZXNjOiAiWW91IGRvbid0IG5lZWQgdG8gc3BlY2lmeSB1bml0cyB3aGVuIGEgdmFsdWUgaXMgMC4iLAogICAgYnJvd3NlcnM6ICJBbGwiLAoKICAgIC8vaW5pdGlhbGl6YXRpb24KICAgIGluaXQ6IGZ1bmN0aW9uKHBhcnNlciwgcmVwb3J0ZXIpewogICAgICAgIHZhciBydWxlID0gdGhpczsKCiAgICAgICAgLy9jb3VudCBob3cgbWFueSB0aW1lcyAiZmxvYXQiIGlzIHVzZWQKICAgICAgICBwYXJzZXIuYWRkTGlzdGVuZXIoInByb3BlcnR5IiwgZnVuY3Rpb24oZXZlbnQpewogICAgICAgICAgICB2YXIgcGFydHMgPSBldmVudC52YWx1ZS5wYXJ0cywKICAgICAgICAgICAgICAgIGkgPSAwLCAKICAgICAgICAgICAgICAgIGxlbiA9IHBhcnRzLmxlbmd0aDsKCiAgICAgICAgICAgIHdoaWxlKGkgPCBsZW4pewogICAgICAgICAgICAgICAgaWYgKChwYXJ0c1tpXS51bml0cyB8fCBwYXJ0c1tpXS50eXBlID09ICJwZXJjZW50YWdlIikgJiYgcGFydHNbaV0udmFsdWUgPT09IDApewogICAgICAgICAgICAgICAgICAgIHJlcG9ydGVyLndhcm4oIlZhbHVlcyBvZiAwIHNob3VsZG4ndCBoYXZlIHVuaXRzIHNwZWNpZmllZC4iLCBwYXJ0c1tpXS5saW5lLCBwYXJ0c1tpXS5jb2wsIHJ1bGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICB9CgogICAgICAgIH0pOwoKICAgIH0KCn0pOwoKZXhwb3J0cy5DU1NMaW50ID0gQ1NTTGludDsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/ace/src/worker-javascript.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Im5vIHVzZSBzdHJpY3QiOwoKdmFyIGNvbnNvbGUgPSB7CiAgICBsb2c6IGZ1bmN0aW9uKG1zZykgewogICAgICAgIHBvc3RNZXNzYWdlKHt0eXBlOiAibG9nIiwgZGF0YTogbXNnfSk7CiAgICB9Cn07CnZhciB3aW5kb3cgPSB7CiAgICBjb25zb2xlOiBjb25zb2xlCn07Cgp2YXIgbm9ybWFsaXplTW9kdWxlID0gZnVuY3Rpb24ocGFyZW50SWQsIG1vZHVsZU5hbWUpIHsKICAgIC8vIG5vcm1hbGl6ZSBwbHVnaW4gcmVxdWlyZXMKICAgIGlmIChtb2R1bGVOYW1lLmluZGV4T2YoIiEiKSAhPT0gLTEpIHsKICAgICAgICB2YXIgY2h1bmtzID0gbW9kdWxlTmFtZS5zcGxpdCgiISIpOwogICAgICAgIHJldHVybiBub3JtYWxpemVNb2R1bGUocGFyZW50SWQsIGNodW5rc1swXSkgKyAiISIgKyBub3JtYWxpemVNb2R1bGUocGFyZW50SWQsIGNodW5rc1sxXSk7CiAgICB9CiAgICAvLyBub3JtYWxpemUgcmVsYXRpdmUgcmVxdWlyZXMKICAgIGlmIChtb2R1bGVOYW1lLmNoYXJBdCgwKSA9PSAiLiIpIHsKICAgICAgICB2YXIgYmFzZSA9IHBhcmVudElkLnNwbGl0KCIvIikuc2xpY2UoMCwgLTEpLmpvaW4oIi8iKTsKICAgICAgICB2YXIgbW9kdWxlTmFtZSA9IGJhc2UgKyAiLyIgKyBtb2R1bGVOYW1lOwogICAgICAgIAogICAgICAgIHdoaWxlKG1vZHVsZU5hbWUuaW5kZXhPZigiLiIpICE9PSAtMSAmJiBwcmV2aW91cyAhPSBtb2R1bGVOYW1lKSB7CiAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IG1vZHVsZU5hbWU7CiAgICAgICAgICAgIHZhciBtb2R1bGVOYW1lID0gbW9kdWxlTmFtZS5yZXBsYWNlKC9cL1wuXC8vLCAiLyIpLnJlcGxhY2UoL1teXC9dK1wvXC5cLlwvLywgIiIpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgcmV0dXJuIG1vZHVsZU5hbWU7Cn07Cgp2YXIgcmVxdWlyZSA9IGZ1bmN0aW9uKHBhcmVudElkLCBpZCkgewogICAgdmFyIGlkID0gbm9ybWFsaXplTW9kdWxlKHBhcmVudElkLCBpZCk7CiAgICAKICAgIHZhciBtb2R1bGUgPSByZXF1aXJlLm1vZHVsZXNbaWRdOwogICAgaWYgKG1vZHVsZSkgewogICAgICAgIGlmICghbW9kdWxlLmluaXRpYWxpemVkKSB7CiAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gbW9kdWxlLmZhY3RvcnkoKS5leHBvcnRzOwogICAgICAgICAgICBtb2R1bGUuaW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbW9kdWxlLmV4cG9ydHM7CiAgICB9CiAgICAKICAgIHZhciBjaHVua3MgPSBpZC5zcGxpdCgiLyIpOwogICAgY2h1bmtzWzBdID0gcmVxdWlyZS50bG5zW2NodW5rc1swXV0gfHwgY2h1bmtzWzBdOwogICAgdmFyIHBhdGggPSBjaHVua3Muam9pbigiLyIpICsgIi5qcyI7CiAgICAKICAgIHJlcXVpcmUuaWQgPSBpZDsKICAgIGltcG9ydFNjcmlwdHMocGF0aCk7CiAgICByZXR1cm4gcmVxdWlyZShwYXJlbnRJZCwgaWQpOyAgICAKfTsKCnJlcXVpcmUubW9kdWxlcyA9IHt9OwpyZXF1aXJlLnRsbnMgPSB7fTsKCnZhciBkZWZpbmUgPSBmdW5jdGlvbihpZCwgZGVwcywgZmFjdG9yeSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICAgIGZhY3RvcnkgPSBkZXBzOwogICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgICBmYWN0b3J5ID0gaWQ7CiAgICAgICAgaWQgPSByZXF1aXJlLmlkOwogICAgfQoKICAgIGlmIChpZC5pbmRleE9mKCJ0ZXh0ISIpID09PSAwKSAKICAgICAgICByZXR1cm47CiAgICAKICAgIHZhciByZXEgPSBmdW5jdGlvbihkZXBzLCBmYWN0b3J5KSB7CiAgICAgICAgcmV0dXJuIHJlcXVpcmUoaWQsIGRlcHMsIGZhY3RvcnkpOwogICAgfTsKCiAgICByZXF1aXJlLm1vZHVsZXNbaWRdID0gewogICAgICAgIGZhY3Rvcnk6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgbW9kdWxlID0gewogICAgICAgICAgICAgICAgZXhwb3J0czoge30KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHJldHVybkV4cG9ydHMgPSBmYWN0b3J5KHJlcSwgbW9kdWxlLmV4cG9ydHMsIG1vZHVsZSk7CiAgICAgICAgICAgIGlmIChyZXR1cm5FeHBvcnRzKQogICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSByZXR1cm5FeHBvcnRzOwogICAgICAgICAgICByZXR1cm4gbW9kdWxlOwogICAgICAgIH0KICAgIH07Cn07CgpmdW5jdGlvbiBpbml0QmFzZVVybHModG9wTGV2ZWxOYW1lc3BhY2VzKSB7CiAgICByZXF1aXJlLnRsbnMgPSB0b3BMZXZlbE5hbWVzcGFjZXM7Cn0KCmZ1bmN0aW9uIGluaXRTZW5kZXIoKSB7CgogICAgdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUobnVsbCwgImFjZS9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsKICAgIHZhciBvb3AgPSByZXF1aXJlKG51bGwsICJhY2UvbGliL29vcCIpOwogICAgCiAgICB2YXIgU2VuZGVyID0gZnVuY3Rpb24oKSB7fTsKICAgIAogICAgKGZ1bmN0aW9uKCkgewogICAgICAgIAogICAgICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsKICAgICAgICAgICAgICAgIAogICAgICAgIHRoaXMuY2FsbGJhY2sgPSBmdW5jdGlvbihkYXRhLCBjYWxsYmFja0lkKSB7CiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgIHR5cGU6ICJjYWxsIiwKICAgICAgICAgICAgICAgIGlkOiBjYWxsYmFja0lkLAogICAgICAgICAgICAgICAgZGF0YTogZGF0YQogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgCiAgICAgICAgdGhpcy5lbWl0ID0gZnVuY3Rpb24obmFtZSwgZGF0YSkgewogICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICB0eXBlOiAiZXZlbnQiLAogICAgICAgICAgICAgICAgbmFtZTogbmFtZSwKICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAKICAgIH0pLmNhbGwoU2VuZGVyLnByb3RvdHlwZSk7CiAgICAKICAgIHJldHVybiBuZXcgU2VuZGVyKCk7Cn0KCnZhciBtYWluOwp2YXIgc2VuZGVyOwoKb25tZXNzYWdlID0gZnVuY3Rpb24oZSkgewogICAgdmFyIG1zZyA9IGUuZGF0YTsKICAgIGlmIChtc2cuY29tbWFuZCkgewogICAgICAgIG1haW5bbXNnLmNvbW1hbmRdLmFwcGx5KG1haW4sIG1zZy5hcmdzKTsKICAgIH0KICAgIGVsc2UgaWYgKG1zZy5pbml0KSB7ICAgICAgICAKICAgICAgICBpbml0QmFzZVVybHMobXNnLnRsbnMpOwogICAgICAgIHJlcXVpcmUobnVsbCwgImFjZS9saWIvZml4b2xkYnJvd3NlcnMiKTsKICAgICAgICBzZW5kZXIgPSBpbml0U2VuZGVyKCk7CiAgICAgICAgdmFyIGNsYXp6ID0gcmVxdWlyZShudWxsLCBtc2cubW9kdWxlKVttc2cuY2xhc3NuYW1lXTsKICAgICAgICBtYWluID0gbmV3IGNsYXp6KHNlbmRlcik7CiAgICB9IAogICAgZWxzZSBpZiAobXNnLmV2ZW50ICYmIHNlbmRlcikgewogICAgICAgIHNlbmRlci5fZW1pdChtc2cuZXZlbnQsIG1zZy5kYXRhKTsKICAgIH0KfTsKLy8gdmltOnNldCB0cz00IHN0cz00IHN3PTQgc3Q6Ci8vIC0tIGtyaXNrb3dhbCBLcmlzIEtvd2FsIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1JVCBMaWNlbnNlCi8vIC0tIHRscm9iaW5zb24gVG9tIFJvYmluc29uIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1JVCBMaWNlbnNlIChOYXJ3aGFsIFByb2plY3QpCi8vIC0tIGRhbnRtYW4gRGFuaWVsIEZyaWVzZW4gQ29weXJpZ2h0KEMpIDIwMTAgWFhYIE5vIExpY2Vuc2UgU3BlY2lmaWVkCi8vIC0tIGZzY2hhZWZlciBGbG9yaWFuIFNjaMOkZmVyIENvcHlyaWdodCAoQykgMjAxMCBNSVQgTGljZW5zZQovLyAtLSBJcmFrbGkgR296YWxpc2h2aWxpIENvcHlyaWdodCAoQykgMjAxMCBNSVQgTGljZW5zZQoKLyohCiAgICBDb3B5cmlnaHQgKGMpIDIwMDksIDI4MCBOb3J0aCBJbmMuIGh0dHA6Ly8yODBub3J0aC5jb20vCiAgICBNSVQgTGljZW5zZS4gaHR0cDovL2dpdGh1Yi5jb20vMjgwbm9ydGgvbmFyd2hhbC9ibG9iL21hc3Rlci9SRUFETUUubWQKKi8KCmRlZmluZSgnYWNlL2xpYi9maXhvbGRicm93c2VycycsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9yZWdleHAnLCAnYWNlL2xpYi9lczUtc2hpbSddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKcmVxdWlyZSgiLi9yZWdleHAiKTsKcmVxdWlyZSgiLi9lczUtc2hpbSIpOwoKfSk7LyoqCiAqICBCYXNlZCBvbiBjb2RlIGZyb206CiAqCiAqIFhSZWdFeHAgMS41LjAKICogKGMpIDIwMDctMjAxMCBTdGV2ZW4gTGV2aXRoYW4KICogTUlUIExpY2Vuc2UKICogPGh0dHA6Ly94cmVnZXhwLmNvbT4KICogUHJvdmlkZXMgYW4gYXVnbWVudGVkLCBleHRlbnNpYmxlLCBjcm9zcy1icm93c2VyIGltcGxlbWVudGF0aW9uIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMsCiAqIGluY2x1ZGluZyBzdXBwb3J0IGZvciBhZGRpdGlvbmFsIHN5bnRheCwgZmxhZ3MsIGFuZCBtZXRob2RzCiAqLwogCmRlZmluZSgnYWNlL2xpYi9yZWdleHAnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7CgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vICBQcml2YXRlIHZhcmlhYmxlcwogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICB2YXIgcmVhbCA9IHsKICAgICAgICAgICAgZXhlYzogUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICAgICB0ZXN0OiBSZWdFeHAucHJvdG90eXBlLnRlc3QsCiAgICAgICAgICAgIG1hdGNoOiBTdHJpbmcucHJvdG90eXBlLm1hdGNoLAogICAgICAgICAgICByZXBsYWNlOiBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2UsCiAgICAgICAgICAgIHNwbGl0OiBTdHJpbmcucHJvdG90eXBlLnNwbGl0CiAgICAgICAgfSwKICAgICAgICBjb21wbGlhbnRFeGVjTnBjZyA9IHJlYWwuZXhlYy5jYWxsKC8oKT8/LywgIiIpWzFdID09PSB1bmRlZmluZWQsIC8vIGNoZWNrIGBleGVjYCBoYW5kbGluZyBvZiBub25wYXJ0aWNpcGF0aW5nIGNhcHR1cmluZyBncm91cHMKICAgICAgICBjb21wbGlhbnRMYXN0SW5kZXhJbmNyZW1lbnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciB4ID0gL14vZzsKICAgICAgICAgICAgcmVhbC50ZXN0LmNhbGwoeCwgIiIpOwogICAgICAgICAgICByZXR1cm4gIXgubGFzdEluZGV4OwogICAgICAgIH0oKTsKCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gIE92ZXJyaWRlbiBuYXRpdmUgbWV0aG9kcwogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAvLyBBZGRzIG5hbWVkIGNhcHR1cmUgc3VwcG9ydCAod2l0aCBiYWNrcmVmZXJlbmNlcyByZXR1cm5lZCBhcyBgcmVzdWx0Lm5hbWVgKSwgYW5kIGZpeGVzIHR3bwogICAgLy8gY3Jvc3MtYnJvd3NlciBpc3N1ZXMgcGVyIEVTMzoKICAgIC8vIC0gQ2FwdHVyZWQgdmFsdWVzIGZvciBub25wYXJ0aWNpcGF0aW5nIGNhcHR1cmluZyBncm91cHMgc2hvdWxkIGJlIHJldHVybmVkIGFzIGB1bmRlZmluZWRgLAogICAgLy8gICByYXRoZXIgdGhhbiB0aGUgZW1wdHkgc3RyaW5nLgogICAgLy8gLSBgbGFzdEluZGV4YCBzaG91bGQgbm90IGJlIGluY3JlbWVudGVkIGFmdGVyIHplcm8tbGVuZ3RoIG1hdGNoZXMuCiAgICBSZWdFeHAucHJvdG90eXBlLmV4ZWMgPSBmdW5jdGlvbiAoc3RyKSB7CiAgICAgICAgdmFyIG1hdGNoID0gcmVhbC5leGVjLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksCiAgICAgICAgICAgIG5hbWUsIHIyOwogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICAvLyBGaXggYnJvd3NlcnMgd2hvc2UgYGV4ZWNgIG1ldGhvZHMgZG9uJ3QgY29uc2lzdGVudGx5IHJldHVybiBgdW5kZWZpbmVkYCBmb3IKICAgICAgICAgICAgLy8gbm9ucGFydGljaXBhdGluZyBjYXB0dXJpbmcgZ3JvdXBzCiAgICAgICAgICAgIGlmICghY29tcGxpYW50RXhlY05wY2cgJiYgbWF0Y2gubGVuZ3RoID4gMSAmJiBpbmRleE9mKG1hdGNoLCAiIikgPiAtMSkgewogICAgICAgICAgICAgICAgcjIgPSBSZWdFeHAodGhpcy5zb3VyY2UsIHJlYWwucmVwbGFjZS5jYWxsKGdldE5hdGl2ZUZsYWdzKHRoaXMpLCAiZyIsICIiKSk7CiAgICAgICAgICAgICAgICAvLyBVc2luZyBgc3RyLnNsaWNlKG1hdGNoLmluZGV4KWAgcmF0aGVyIHRoYW4gYG1hdGNoWzBdYCBpbiBjYXNlIGxvb2thaGVhZCBhbGxvd2VkCiAgICAgICAgICAgICAgICAvLyBtYXRjaGluZyBkdWUgdG8gY2hhcmFjdGVycyBvdXRzaWRlIHRoZSBtYXRjaAogICAgICAgICAgICAgICAgcmVhbC5yZXBsYWNlLmNhbGwoc3RyLnNsaWNlKG1hdGNoLmluZGV4KSwgcjIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAyOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50c1tpXSA9PT0gdW5kZWZpbmVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbaV0gPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQXR0YWNoIG5hbWVkIGNhcHR1cmUgcHJvcGVydGllcwogICAgICAgICAgICBpZiAodGhpcy5feHJlZ2V4cCAmJiB0aGlzLl94cmVnZXhwLmNhcHR1cmVOYW1lcykgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBtYXRjaC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIG5hbWUgPSB0aGlzLl94cmVnZXhwLmNhcHR1cmVOYW1lc1tpIC0gMV07CiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbbmFtZV0gPSBtYXRjaFtpXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBGaXggYnJvd3NlcnMgdGhhdCBpbmNyZW1lbnQgYGxhc3RJbmRleGAgYWZ0ZXIgemVyby1sZW5ndGggbWF0Y2hlcwogICAgICAgICAgICBpZiAoIWNvbXBsaWFudExhc3RJbmRleEluY3JlbWVudCAmJiB0aGlzLmdsb2JhbCAmJiAhbWF0Y2hbMF0ubGVuZ3RoICYmICh0aGlzLmxhc3RJbmRleCA+IG1hdGNoLmluZGV4KSkKICAgICAgICAgICAgICAgIHRoaXMubGFzdEluZGV4LS07CiAgICAgICAgfQogICAgICAgIHJldHVybiBtYXRjaDsKICAgIH07CgogICAgLy8gRG9uJ3Qgb3ZlcnJpZGUgYHRlc3RgIGlmIGl0IHdvbid0IGNoYW5nZSBhbnl0aGluZwogICAgaWYgKCFjb21wbGlhbnRMYXN0SW5kZXhJbmNyZW1lbnQpIHsKICAgICAgICAvLyBGaXggYnJvd3NlciBidWcgaW4gbmF0aXZlIG1ldGhvZAogICAgICAgIFJlZ0V4cC5wcm90b3R5cGUudGVzdCA9IGZ1bmN0aW9uIChzdHIpIHsKICAgICAgICAgICAgLy8gVXNlIHRoZSBuYXRpdmUgYGV4ZWNgIHRvIHNraXAgc29tZSBwcm9jZXNzaW5nIG92ZXJoZWFkLCBldmVuIHRob3VnaCB0aGUgb3ZlcnJpZGVuCiAgICAgICAgICAgIC8vIGBleGVjYCB3b3VsZCB0YWtlIGNhcmUgb2YgdGhlIGBsYXN0SW5kZXhgIGZpeAogICAgICAgICAgICB2YXIgbWF0Y2ggPSByZWFsLmV4ZWMuY2FsbCh0aGlzLCBzdHIpOwogICAgICAgICAgICAvLyBGaXggYnJvd3NlcnMgdGhhdCBpbmNyZW1lbnQgYGxhc3RJbmRleGAgYWZ0ZXIgemVyby1sZW5ndGggbWF0Y2hlcwogICAgICAgICAgICBpZiAobWF0Y2ggJiYgdGhpcy5nbG9iYWwgJiYgIW1hdGNoWzBdLmxlbmd0aCAmJiAodGhpcy5sYXN0SW5kZXggPiBtYXRjaC5pbmRleCkpCiAgICAgICAgICAgICAgICB0aGlzLmxhc3RJbmRleC0tOwogICAgICAgICAgICByZXR1cm4gISFtYXRjaDsKICAgICAgICB9OwogICAgfQoKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyAgUHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb25zCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIGZ1bmN0aW9uIGdldE5hdGl2ZUZsYWdzIChyZWdleCkgewogICAgICAgIHJldHVybiAocmVnZXguZ2xvYmFsICAgICA/ICJnIiA6ICIiKSArCiAgICAgICAgICAgICAgIChyZWdleC5pZ25vcmVDYXNlID8gImkiIDogIiIpICsKICAgICAgICAgICAgICAgKHJlZ2V4Lm11bHRpbGluZSAgPyAibSIgOiAiIikgKwogICAgICAgICAgICAgICAocmVnZXguZXh0ZW5kZWQgICA/ICJ4IiA6ICIiKSArIC8vIFByb3Bvc2VkIGZvciBFUzQ7IGluY2x1ZGVkIGluIEFTMwogICAgICAgICAgICAgICAocmVnZXguc3RpY2t5ICAgICA/ICJ5IiA6ICIiKTsKICAgIH07CgogICAgZnVuY3Rpb24gaW5kZXhPZiAoYXJyYXksIGl0ZW0sIGZyb20pIHsKICAgICAgICBpZiAoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpIC8vIFVzZSB0aGUgbmF0aXZlIGFycmF5IG1ldGhvZCBpZiBhdmFpbGFibGUKICAgICAgICAgICAgcmV0dXJuIGFycmF5LmluZGV4T2YoaXRlbSwgZnJvbSk7CiAgICAgICAgZm9yICh2YXIgaSA9IGZyb20gfHwgMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChhcnJheVtpXSA9PT0gaXRlbSkKICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gLTE7CiAgICB9OwoKfSk7Ly8gdmltOiB0cz00IHN0cz00IHN3PTQgZXhwYW5kdGFiCi8vIC0tIGtyaXNrb3dhbCBLcmlzIEtvd2FsIENvcHlyaWdodCAoQykgMjAwOS0yMDExIE1JVCBMaWNlbnNlCi8vIC0tIHRscm9iaW5zb24gVG9tIFJvYmluc29uIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1JVCBMaWNlbnNlIChOYXJ3aGFsIFByb2plY3QpCi8vIC0tIGRhbnRtYW4gRGFuaWVsIEZyaWVzZW4gQ29weXJpZ2h0IChDKSAyMDEwIFhYWCBUT0RPIExpY2Vuc2Ugb3IgQ0xBCi8vIC0tIGZzY2hhZWZlciBGbG9yaWFuIFNjaMOkZmVyIENvcHlyaWdodCAoQykgMjAxMCBNSVQgTGljZW5zZQovLyAtLSBHb3phbGEgSXJha2xpIEdvemFsaXNodmlsaSBDb3B5cmlnaHQgKEMpIDIwMTAgTUlUIExpY2Vuc2UKLy8gLS0ga2l0Y2FtYnJpZGdlIEtpdCBDYW1icmlkZ2UgQ29weXJpZ2h0IChDKSAyMDExIE1JVCBMaWNlbnNlCi8vIC0tIGtvc3Nub2NvcnAgU2FzaGEgS29zcyBYWFggVE9ETyBMaWNlbnNlIG9yIENMQQovLyAtLSBicnlhbmZvcmJlcyBCcnlhbiBGb3JiZXMgWFhYIFRPRE8gTGljZW5zZSBvciBDTEEKLy8gLS0ga2lsbGRyZWFtIFF1aWxkcmVlbiBNb3R0YSBDb3B5cmlnaHQgKEMpIDIwMTEgTUlUIExpY2VuY2UKLy8gLS0gbWljaGFlbGZpY2FycmEgTWljaGFlbCBGaWNhcnJhIENvcHlyaWdodCAoQykgMjAxMSAzLWNsYXVzZSBCU0QgTGljZW5zZQovLyAtLSBzaGFya2JyYWluZ3V5IEdlcmFyZCBQYWFwdSBDb3B5cmlnaHQgKEMpIDIwMTEgTUlUIExpY2Vuc2UKLy8gLS0gYmJxc3JjIEJyZW5kYW4gTW9sbG95IChDKSAyMDExIENyZWF0aXZlIENvbW1vbnMgWmVybyAocHVibGljIGRvbWFpbikKLy8gLS0gaXd5ZyBYWFggVE9ETyBMaWNlbnNlIG9yIENMQQovLyAtLSBEb21lbmljRGVuaWNvbGEgRG9tZW5pYyBEZW5pY29sYSBDb3B5cmlnaHQgKEMpIDIwMTEgTUlUIExpY2Vuc2UKLy8gLS0geGF2aWVybTAyIE1vbnRpbGxldCBYYXZpZXIgWFhYIFRPRE8gTGljZW5zZSBvciBDTEEKLy8gLS0gUmF5bm9zIFJheW5vcyBYWFggVE9ETyBMaWNlbnNlIG9yIENMQQovLyAtLSBzYW1zb25qcyBTYW1pIFNhbWh1cmkgQ29weXJpZ2h0IChDKSAyMDEwIE1JVCBMaWNlbnNlCi8vIC0tIHJ3bGRybiBSaWNrIFdhbGRyb24gQ29weXJpZ2h0IChDKSAyMDExIE1JVCBMaWNlbnNlCi8vIC0tIGxleGVyIEFsZXhleSBaYWtoYXJvdiBYWFggVE9ETyBMaWNlbnNlIG9yIENMQQoKLyohCiAgICBDb3B5cmlnaHQgKGMpIDIwMDksIDI4MCBOb3J0aCBJbmMuIGh0dHA6Ly8yODBub3J0aC5jb20vCiAgICBNSVQgTGljZW5zZS4gaHR0cDovL2dpdGh1Yi5jb20vMjgwbm9ydGgvbmFyd2hhbC9ibG9iL21hc3Rlci9SRUFETUUubWQKKi8KCmRlZmluZSgnYWNlL2xpYi9lczUtc2hpbScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CgovKioKICogQnJpbmdzIGFuIGVudmlyb25tZW50IGFzIGNsb3NlIHRvIEVDTUFTY3JpcHQgNSBjb21wbGlhbmNlCiAqIGFzIGlzIHBvc3NpYmxlIHdpdGggdGhlIGZhY2lsaXRpZXMgb2YgZXJzdHdoaWxlIGVuZ2luZXMuCiAqCiAqIEFubm90YXRlZCBFUzU6IGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8gKHNwZWNpZmljIGxpbmtzIGJlbG93KQogKiBFUzUgU3BlYzogaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL3B1YmxpY2F0aW9ucy9maWxlcy9FQ01BLVNUL0VjbWEtMjYyLnBkZgogKgogKiBAbW9kdWxlCiAqLwoKLyp3aGF0c3VwZG9jKi8KCi8vCi8vIEZ1bmN0aW9uCi8vID09PT09PT09Ci8vCgovLyBFUy01IDE1LjMuNC41Ci8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjMuNC41CgppZiAoIUZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kKSB7CiAgICBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uIGJpbmQodGhhdCkgeyAvLyAubGVuZ3RoIGlzIDEKICAgICAgICAvLyAxLiBMZXQgVGFyZ2V0IGJlIHRoZSB0aGlzIHZhbHVlLgogICAgICAgIHZhciB0YXJnZXQgPSB0aGlzOwogICAgICAgIC8vIDIuIElmIElzQ2FsbGFibGUoVGFyZ2V0KSBpcyBmYWxzZSwgdGhyb3cgYSBUeXBlRXJyb3IgZXhjZXB0aW9uLgogICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9ICJmdW5jdGlvbiIpCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlCiAgICAgICAgLy8gMy4gTGV0IEEgYmUgYSBuZXcgKHBvc3NpYmx5IGVtcHR5KSBpbnRlcm5hbCBsaXN0IG9mIGFsbCBvZiB0aGUKICAgICAgICAvLyAgIGFyZ3VtZW50IHZhbHVlcyBwcm92aWRlZCBhZnRlciB0aGlzQXJnIChhcmcxLCBhcmcyIGV0YyksIGluIG9yZGVyLgogICAgICAgIC8vIFhYWCBzbGljZWRBcmdzIHdpbGwgc3RhbmQgaW4gZm9yICJBIiBpZiB1c2VkCiAgICAgICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7IC8vIGZvciBub3JtYWwgY2FsbAogICAgICAgIC8vIDQuIExldCBGIGJlIGEgbmV3IG5hdGl2ZSBFQ01BU2NyaXB0IG9iamVjdC4KICAgICAgICAvLyAxMS4gU2V0IHRoZSBbW1Byb3RvdHlwZV1dIGludGVybmFsIHByb3BlcnR5IG9mIEYgdG8gdGhlIHN0YW5kYXJkCiAgICAgICAgLy8gICBidWlsdC1pbiBGdW5jdGlvbiBwcm90b3R5cGUgb2JqZWN0IGFzIHNwZWNpZmllZCBpbiAxNS4zLjMuMS4KICAgICAgICAvLyAxMi4gU2V0IHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIGFzIGRlc2NyaWJlZCBpbgogICAgICAgIC8vICAgMTUuMy40LjUuMS4KICAgICAgICAvLyAxMy4gU2V0IHRoZSBbW0NvbnN0cnVjdF1dIGludGVybmFsIHByb3BlcnR5IG9mIEYgYXMgZGVzY3JpYmVkIGluCiAgICAgICAgLy8gICAxNS4zLjQuNS4yLgogICAgICAgIC8vIDE0LiBTZXQgdGhlIFtbSGFzSW5zdGFuY2VdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIGFzIGRlc2NyaWJlZCBpbgogICAgICAgIC8vICAgMTUuMy40LjUuMy4KICAgICAgICB2YXIgYm91bmQgPSBmdW5jdGlvbiAoKSB7CgogICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIGJvdW5kKSB7CiAgICAgICAgICAgICAgICAvLyAxNS4zLjQuNS4yIFtbQ29uc3RydWN0XV0KICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgbWV0aG9kIG9mIGEgZnVuY3Rpb24gb2JqZWN0LAogICAgICAgICAgICAgICAgLy8gRiB0aGF0IHdhcyBjcmVhdGVkIHVzaW5nIHRoZSBiaW5kIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGEKICAgICAgICAgICAgICAgIC8vIGxpc3Qgb2YgYXJndW1lbnRzIEV4dHJhQXJncywgdGhlIGZvbGxvd2luZyBzdGVwcyBhcmUgdGFrZW46CiAgICAgICAgICAgICAgICAvLyAxLiBMZXQgdGFyZ2V0IGJlIHRoZSB2YWx1ZSBvZiBGJ3MgW1tUYXJnZXRGdW5jdGlvbl1dCiAgICAgICAgICAgICAgICAvLyAgIGludGVybmFsIHByb3BlcnR5LgogICAgICAgICAgICAgICAgLy8gMi4gSWYgdGFyZ2V0IGhhcyBubyBbW0NvbnN0cnVjdF1dIGludGVybmFsIG1ldGhvZCwgYQogICAgICAgICAgICAgICAgLy8gICBUeXBlRXJyb3IgZXhjZXB0aW9uIGlzIHRocm93bi4KICAgICAgICAgICAgICAgIC8vIDMuIExldCBib3VuZEFyZ3MgYmUgdGhlIHZhbHVlIG9mIEYncyBbW0JvdW5kQXJnc11dIGludGVybmFsCiAgICAgICAgICAgICAgICAvLyAgIHByb3BlcnR5LgogICAgICAgICAgICAgICAgLy8gNC4gTGV0IGFyZ3MgYmUgYSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGUKICAgICAgICAgICAgICAgIC8vICAgbGlzdCBib3VuZEFyZ3MgaW4gdGhlIHNhbWUgb3JkZXIgZm9sbG93ZWQgYnkgdGhlIHNhbWUKICAgICAgICAgICAgICAgIC8vICAgdmFsdWVzIGFzIHRoZSBsaXN0IEV4dHJhQXJncyBpbiB0aGUgc2FtZSBvcmRlci4KICAgICAgICAgICAgICAgIC8vIDUuIFJldHVybiB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgCiAgICAgICAgICAgICAgICAvLyAgIG1ldGhvZCBvZiB0YXJnZXQgcHJvdmlkaW5nIGFyZ3MgYXMgdGhlIGFyZ3VtZW50cy4KCiAgICAgICAgICAgICAgICB2YXIgRiA9IGZ1bmN0aW9uKCl7fTsKICAgICAgICAgICAgICAgIEYucHJvdG90eXBlID0gdGFyZ2V0LnByb3RvdHlwZTsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gbmV3IEY7CgogICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRhcmdldC5hcHBseSgKICAgICAgICAgICAgICAgICAgICBzZWxmLAogICAgICAgICAgICAgICAgICAgIGFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIE9iamVjdChyZXN1bHQpID09PSByZXN1bHQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOwoKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIDE1LjMuNC41LjEgW1tDYWxsXV0KICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZCBvZiBhIGZ1bmN0aW9uIG9iamVjdCwgRiwKICAgICAgICAgICAgICAgIC8vIHdoaWNoIHdhcyBjcmVhdGVkIHVzaW5nIHRoZSBiaW5kIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGEKICAgICAgICAgICAgICAgIC8vIHRoaXMgdmFsdWUgYW5kIGEgbGlzdCBvZiBhcmd1bWVudHMgRXh0cmFBcmdzLCB0aGUgZm9sbG93aW5nCiAgICAgICAgICAgICAgICAvLyBzdGVwcyBhcmUgdGFrZW46CiAgICAgICAgICAgICAgICAvLyAxLiBMZXQgYm91bmRBcmdzIGJlIHRoZSB2YWx1ZSBvZiBGJ3MgW1tCb3VuZEFyZ3NdXSBpbnRlcm5hbAogICAgICAgICAgICAgICAgLy8gICBwcm9wZXJ0eS4KICAgICAgICAgICAgICAgIC8vIDIuIExldCBib3VuZFRoaXMgYmUgdGhlIHZhbHVlIG9mIEYncyBbW0JvdW5kVGhpc11dIGludGVybmFsCiAgICAgICAgICAgICAgICAvLyAgIHByb3BlcnR5LgogICAgICAgICAgICAgICAgLy8gMy4gTGV0IHRhcmdldCBiZSB0aGUgdmFsdWUgb2YgRidzIFtbVGFyZ2V0RnVuY3Rpb25dXSBpbnRlcm5hbAogICAgICAgICAgICAgICAgLy8gICBwcm9wZXJ0eS4KICAgICAgICAgICAgICAgIC8vIDQuIExldCBhcmdzIGJlIGEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgc2FtZSB2YWx1ZXMgYXMgdGhlIAogICAgICAgICAgICAgICAgLy8gICBsaXN0IGJvdW5kQXJncyBpbiB0aGUgc2FtZSBvcmRlciBmb2xsb3dlZCBieSB0aGUgc2FtZSAKICAgICAgICAgICAgICAgIC8vICAgdmFsdWVzIGFzIHRoZSBsaXN0IEV4dHJhQXJncyBpbiB0aGUgc2FtZSBvcmRlci4KICAgICAgICAgICAgICAgIC8vIDUuIFJldHVybiB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZCAKICAgICAgICAgICAgICAgIC8vICAgb2YgdGFyZ2V0IHByb3ZpZGluZyBib3VuZFRoaXMgYXMgdGhlIHRoaXMgdmFsdWUgYW5kIAogICAgICAgICAgICAgICAgLy8gICBwcm92aWRpbmcgYXJncyBhcyB0aGUgYXJndW1lbnRzLgoKICAgICAgICAgICAgICAgIC8vIGVxdWl2OiB0YXJnZXQuY2FsbCh0aGlzLCAuLi5ib3VuZEFyZ3MsIC4uLmFyZ3MpCiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmFwcGx5KAogICAgICAgICAgICAgICAgICAgIHRoYXQsCiAgICAgICAgICAgICAgICAgICAgYXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgfTsKICAgICAgICAvLyBYWFggYm91bmQubGVuZ3RoIGlzIG5ldmVyIHdyaXRhYmxlLCBzbyBkb24ndCBldmVuIHRyeQogICAgICAgIC8vCiAgICAgICAgLy8gMTUuIElmIHRoZSBbW0NsYXNzXV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgVGFyZ2V0IGlzICJGdW5jdGlvbiIsIHRoZW4KICAgICAgICAvLyAgICAgYS4gTGV0IEwgYmUgdGhlIGxlbmd0aCBwcm9wZXJ0eSBvZiBUYXJnZXQgbWludXMgdGhlIGxlbmd0aCBvZiBBLgogICAgICAgIC8vICAgICBiLiBTZXQgdGhlIGxlbmd0aCBvd24gcHJvcGVydHkgb2YgRiB0byBlaXRoZXIgMCBvciBMLCB3aGljaGV2ZXIgaXMgCiAgICAgICAgLy8gICAgICAgbGFyZ2VyLgogICAgICAgIC8vIDE2LiBFbHNlIHNldCB0aGUgbGVuZ3RoIG93biBwcm9wZXJ0eSBvZiBGIHRvIDAuCiAgICAgICAgLy8gMTcuIFNldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbGVuZ3RoIG93biBwcm9wZXJ0eSBvZiBGIHRvIHRoZSB2YWx1ZXMKICAgICAgICAvLyAgIHNwZWNpZmllZCBpbiAxNS4zLjUuMS4KCiAgICAgICAgLy8gVE9ETwogICAgICAgIC8vIDE4LiBTZXQgdGhlIFtbRXh0ZW5zaWJsZV1dIGludGVybmFsIHByb3BlcnR5IG9mIEYgdG8gdHJ1ZS4KICAgICAgICAKICAgICAgICAvLyBUT0RPCiAgICAgICAgLy8gMTkuIExldCB0aHJvd2VyIGJlIHRoZSBbW1Rocm93VHlwZUVycm9yXV0gZnVuY3Rpb24gT2JqZWN0ICgxMy4yLjMpLgogICAgICAgIC8vIDIwLiBDYWxsIHRoZSBbW0RlZmluZU93blByb3BlcnR5XV0gaW50ZXJuYWwgbWV0aG9kIG9mIEYgd2l0aCAKICAgICAgICAvLyAgIGFyZ3VtZW50cyAiY2FsbGVyIiwgUHJvcGVydHlEZXNjcmlwdG9yIHtbW0dldF1dOiB0aHJvd2VyLCBbW1NldF1dOgogICAgICAgIC8vICAgdGhyb3dlciwgW1tFbnVtZXJhYmxlXV06IGZhbHNlLCBbW0NvbmZpZ3VyYWJsZV1dOiBmYWxzZX0sIGFuZCAKICAgICAgICAvLyAgIGZhbHNlLgogICAgICAgIC8vIDIxLiBDYWxsIHRoZSBbW0RlZmluZU93blByb3BlcnR5XV0gaW50ZXJuYWwgbWV0aG9kIG9mIEYgd2l0aCAKICAgICAgICAvLyAgIGFyZ3VtZW50cyAiYXJndW1lbnRzIiwgUHJvcGVydHlEZXNjcmlwdG9yIHtbW0dldF1dOiB0aHJvd2VyLCAKICAgICAgICAvLyAgIFtbU2V0XV06IHRocm93ZXIsIFtbRW51bWVyYWJsZV1dOiBmYWxzZSwgW1tDb25maWd1cmFibGVdXTogZmFsc2V9LAogICAgICAgIC8vICAgYW5kIGZhbHNlLgoKICAgICAgICAvLyBUT0RPCiAgICAgICAgLy8gTk9URSBGdW5jdGlvbiBvYmplY3RzIGNyZWF0ZWQgdXNpbmcgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgZG8gbm90IAogICAgICAgIC8vIGhhdmUgYSBwcm90b3R5cGUgcHJvcGVydHkgb3IgdGhlIFtbQ29kZV1dLCBbW0Zvcm1hbFBhcmFtZXRlcnNdXSwgYW5kCiAgICAgICAgLy8gW1tTY29wZV1dIGludGVybmFsIHByb3BlcnRpZXMuCiAgICAgICAgLy8gWFhYIGNhbid0IGRlbGV0ZSBwcm90b3R5cGUgaW4gcHVyZS1qcy4KCiAgICAgICAgLy8gMjIuIFJldHVybiBGLgogICAgICAgIHJldHVybiBib3VuZDsKICAgIH07Cn0KCi8vIFNob3J0Y3V0IHRvIGFuIG9mdGVuIGFjY2Vzc2VkIHByb3BlcnRpZXMsIGluIG9yZGVyIHRvIGF2b2lkIG11bHRpcGxlCi8vIGRlcmVmZXJlbmNlIHRoYXQgY29zdHMgdW5pdmVyc2FsbHkuCi8vIF9QbGVhc2Ugbm90ZTogU2hvcnRjdXRzIGFyZSBkZWZpbmVkIGFmdGVyIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAgYXMgd2UKLy8gdXMgaXQgaW4gZGVmaW5pbmcgc2hvcnRjdXRzLgp2YXIgY2FsbCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsOwp2YXIgcHJvdG90eXBlT2ZBcnJheSA9IEFycmF5LnByb3RvdHlwZTsKdmFyIHByb3RvdHlwZU9mT2JqZWN0ID0gT2JqZWN0LnByb3RvdHlwZTsKdmFyIHNsaWNlID0gcHJvdG90eXBlT2ZBcnJheS5zbGljZTsKdmFyIHRvU3RyaW5nID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0LnRvU3RyaW5nKTsKdmFyIG93bnMgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuaGFzT3duUHJvcGVydHkpOwoKLy8gSWYgSlMgZW5naW5lIHN1cHBvcnRzIGFjY2Vzc29ycyBjcmVhdGluZyBzaG9ydGN1dHMuCnZhciBkZWZpbmVHZXR0ZXI7CnZhciBkZWZpbmVTZXR0ZXI7CnZhciBsb29rdXBHZXR0ZXI7CnZhciBsb29rdXBTZXR0ZXI7CnZhciBzdXBwb3J0c0FjY2Vzc29yczsKaWYgKChzdXBwb3J0c0FjY2Vzc29ycyA9IG93bnMocHJvdG90eXBlT2ZPYmplY3QsICJfX2RlZmluZUdldHRlcl9fIikpKSB7CiAgICBkZWZpbmVHZXR0ZXIgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuX19kZWZpbmVHZXR0ZXJfXyk7CiAgICBkZWZpbmVTZXR0ZXIgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuX19kZWZpbmVTZXR0ZXJfXyk7CiAgICBsb29rdXBHZXR0ZXIgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuX19sb29rdXBHZXR0ZXJfXyk7CiAgICBsb29rdXBTZXR0ZXIgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuX19sb29rdXBTZXR0ZXJfXyk7Cn0KCi8vCi8vIEFycmF5Ci8vID09PT09Ci8vCgovLyBFUzUgMTUuNC4zLjIKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC4zLjIKLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvaXNBcnJheQppZiAoIUFycmF5LmlzQXJyYXkpIHsKICAgIEFycmF5LmlzQXJyYXkgPSBmdW5jdGlvbiBpc0FycmF5KG9iaikgewogICAgICAgIHJldHVybiB0b1N0cmluZyhvYmopID09ICJbb2JqZWN0IEFycmF5XSI7CiAgICB9Owp9CgovLyBUaGUgSXNDYWxsYWJsZSgpIGNoZWNrIGluIHRoZSBBcnJheSBmdW5jdGlvbnMKLy8gaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCBhIHN0cmljdCBjaGVjayBvbiB0aGUKLy8gaW50ZXJuYWwgY2xhc3Mgb2YgdGhlIG9iamVjdCB0byB0cmFwIGNhc2VzIHdoZXJlCi8vIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB3YXMgYWN0dWFsbHkgYSByZWd1bGFyCi8vIGV4cHJlc3Npb24gbGl0ZXJhbCwgd2hpY2ggaW4gVjggYW5kCi8vIEphdmFTY3JpcHRDb3JlIGlzIGEgdHlwZW9mICJmdW5jdGlvbiIuICBPbmx5IGluCi8vIFY4IGFyZSByZWd1bGFyIGV4cHJlc3Npb24gbGl0ZXJhbHMgcGVybWl0dGVkIGFzCi8vIHJlZHVjZSBwYXJhbWV0ZXJzLCBzbyBpdCBpcyBkZXNpcmFibGUgaW4gdGhlCi8vIGdlbmVyYWwgY2FzZSBmb3IgdGhlIHNoaW0gdG8gbWF0Y2ggdGhlIG1vcmUKLy8gc3RyaWN0IGFuZCBjb21tb24gYmVoYXZpb3Igb2YgcmVqZWN0aW5nIHJlZ3VsYXIKLy8gZXhwcmVzc2lvbnMuCgovLyBFUzUgMTUuNC40LjE4Ci8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuNC4xOAovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9hcnJheS9mb3JFYWNoCmlmICghQXJyYXkucHJvdG90eXBlLmZvckVhY2gpIHsKICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gZm9yRWFjaChmdW4gLyosIHRoaXNwKi8pIHsKICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLAogICAgICAgICAgICB0aGlzcCA9IGFyZ3VtZW50c1sxXSwKICAgICAgICAgICAgaSA9IDAsCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwOwoKICAgICAgICAvLyBJZiBubyBjYWxsYmFjayBmdW5jdGlvbiBvciBpZiBjYWxsYmFjayBpcyBub3QgYSBjYWxsYWJsZSBmdW5jdGlvbgogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UKICAgICAgICB9CgogICAgICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7CiAgICAgICAgICAgIGlmIChpIGluIHNlbGYpIHsKICAgICAgICAgICAgICAgIC8vIEludm9rZSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBjYWxsLCBwYXNzaW5nIGFyZ3VtZW50czoKICAgICAgICAgICAgICAgIC8vIGNvbnRleHQsIHByb3BlcnR5IHZhbHVlLCBwcm9wZXJ0eSBrZXksIHRoaXNBcmcgb2JqZWN0IGNvbnRleHQKICAgICAgICAgICAgICAgIGZ1bi5jYWxsKHRoaXNwLCBzZWxmW2ldLCBpLCBzZWxmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpKys7CiAgICAgICAgfQogICAgfTsKfQoKLy8gRVM1IDE1LjQuNC4xOQovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTkKLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vQ29yZV9KYXZhU2NyaXB0XzEuNV9SZWZlcmVuY2UvT2JqZWN0cy9BcnJheS9tYXAKaWYgKCFBcnJheS5wcm90b3R5cGUubWFwKSB7CiAgICBBcnJheS5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24gbWFwKGZ1biAvKiwgdGhpc3AqLykgewogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwLAogICAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpLAogICAgICAgICAgICB0aGlzcCA9IGFyZ3VtZW50c1sxXTsKCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24KICAgICAgICBpZiAodG9TdHJpbmcoZnVuKSAhPSAiW29iamVjdCBGdW5jdGlvbl0iKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlCiAgICAgICAgfQoKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChpIGluIHNlbGYpCiAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBmdW4uY2FsbCh0aGlzcCwgc2VsZltpXSwgaSwgc2VsZik7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9Owp9CgovLyBFUzUgMTUuNC40LjIwCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuNC4yMAovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9PYmplY3RzL0FycmF5L2ZpbHRlcgppZiAoIUFycmF5LnByb3RvdHlwZS5maWx0ZXIpIHsKICAgIEFycmF5LnByb3RvdHlwZS5maWx0ZXIgPSBmdW5jdGlvbiBmaWx0ZXIoZnVuIC8qLCB0aGlzcCAqLykgewogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwLAogICAgICAgICAgICByZXN1bHQgPSBbXSwKICAgICAgICAgICAgdGhpc3AgPSBhcmd1bWVudHNbMV07CgogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQogICAgICAgIH0KCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmIGZ1bi5jYWxsKHRoaXNwLCBzZWxmW2ldLCBpLCBzZWxmKSkKICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNlbGZbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfTsKfQoKLy8gRVM1IDE1LjQuNC4xNgovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTYKLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZXZlcnkKaWYgKCFBcnJheS5wcm90b3R5cGUuZXZlcnkpIHsKICAgIEFycmF5LnByb3RvdHlwZS5ldmVyeSA9IGZ1bmN0aW9uIGV2ZXJ5KGZ1biAvKiwgdGhpc3AgKi8pIHsKICAgICAgICB2YXIgc2VsZiA9IHRvT2JqZWN0KHRoaXMpLAogICAgICAgICAgICBsZW5ndGggPSBzZWxmLmxlbmd0aCA+Pj4gMCwKICAgICAgICAgICAgdGhpc3AgPSBhcmd1bWVudHNbMV07CgogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uCiAgICAgICAgaWYgKHRvU3RyaW5nKGZ1bikgIT0gIltvYmplY3QgRnVuY3Rpb25dIikgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQogICAgICAgIH0KCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmICFmdW4uY2FsbCh0aGlzcCwgc2VsZltpXSwgaSwgc2VsZikpCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfTsKfQoKLy8gRVM1IDE1LjQuNC4xNwovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTcKLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvc29tZQppZiAoIUFycmF5LnByb3RvdHlwZS5zb21lKSB7CiAgICBBcnJheS5wcm90b3R5cGUuc29tZSA9IGZ1bmN0aW9uIHNvbWUoZnVuIC8qLCB0aGlzcCAqLykgewogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwLAogICAgICAgICAgICB0aGlzcCA9IGFyZ3VtZW50c1sxXTsKCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb24KICAgICAgICBpZiAodG9TdHJpbmcoZnVuKSAhPSAiW29iamVjdCBGdW5jdGlvbl0iKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlCiAgICAgICAgfQoKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChpIGluIHNlbGYgJiYgZnVuLmNhbGwodGhpc3AsIHNlbGZbaV0sIGksIHNlbGYpKQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH07Cn0KCi8vIEVTNSAxNS40LjQuMjEKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjIxCi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlL09iamVjdHMvQXJyYXkvcmVkdWNlCmlmICghQXJyYXkucHJvdG90eXBlLnJlZHVjZSkgewogICAgQXJyYXkucHJvdG90eXBlLnJlZHVjZSA9IGZ1bmN0aW9uIHJlZHVjZShmdW4gLyosIGluaXRpYWwqLykgewogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwOwoKICAgICAgICAvLyBJZiBubyBjYWxsYmFjayBmdW5jdGlvbiBvciBpZiBjYWxsYmFjayBpcyBub3QgYSBjYWxsYWJsZSBmdW5jdGlvbgogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UKICAgICAgICB9CgogICAgICAgIC8vIG5vIHZhbHVlIHRvIHJldHVybiBpZiBubyBpbml0aWFsIHZhbHVlIGFuZCBhbiBlbXB0eSBhcnJheQogICAgICAgIGlmICghbGVuZ3RoICYmIGFyZ3VtZW50cy5sZW5ndGggPT0gMSkKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UKCiAgICAgICAgdmFyIGkgPSAwOwogICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikgewogICAgICAgICAgICByZXN1bHQgPSBhcmd1bWVudHNbMV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgaWYgKGkgaW4gc2VsZikgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGZbaSsrXTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiBhcnJheSBjb250YWlucyBubyB2YWx1ZXMsIG5vIGluaXRpYWwgdmFsdWUgdG8gcmV0dXJuCiAgICAgICAgICAgICAgICBpZiAoKytpID49IGxlbmd0aCkKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQogICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKICAgICAgICB9CgogICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKGkgaW4gc2VsZikKICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZ1bi5jYWxsKHZvaWQgMCwgcmVzdWx0LCBzZWxmW2ldLCBpLCBzZWxmKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9Owp9CgovLyBFUzUgMTUuNC40LjIyCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuNC4yMgovLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9PYmplY3RzL0FycmF5L3JlZHVjZVJpZ2h0CmlmICghQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0KSB7CiAgICBBcnJheS5wcm90b3R5cGUucmVkdWNlUmlnaHQgPSBmdW5jdGlvbiByZWR1Y2VSaWdodChmdW4gLyosIGluaXRpYWwqLykgewogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwOwoKICAgICAgICAvLyBJZiBubyBjYWxsYmFjayBmdW5jdGlvbiBvciBpZiBjYWxsYmFjayBpcyBub3QgYSBjYWxsYWJsZSBmdW5jdGlvbgogICAgICAgIGlmICh0b1N0cmluZyhmdW4pICE9ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UKICAgICAgICB9CgogICAgICAgIC8vIG5vIHZhbHVlIHRvIHJldHVybiBpZiBubyBpbml0aWFsIHZhbHVlLCBlbXB0eSBhcnJheQogICAgICAgIGlmICghbGVuZ3RoICYmIGFyZ3VtZW50cy5sZW5ndGggPT0gMSkKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UKCiAgICAgICAgdmFyIHJlc3VsdCwgaSA9IGxlbmd0aCAtIDE7CiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikgewogICAgICAgICAgICByZXN1bHQgPSBhcmd1bWVudHNbMV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgaWYgKGkgaW4gc2VsZikgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGZbaS0tXTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiBhcnJheSBjb250YWlucyBubyB2YWx1ZXMsIG5vIGluaXRpYWwgdmFsdWUgdG8gcmV0dXJuCiAgICAgICAgICAgICAgICBpZiAoLS1pIDwgMCkKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIFRPRE8gbWVzc2FnZQogICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKICAgICAgICB9CgogICAgICAgIGRvIHsKICAgICAgICAgICAgaWYgKGkgaW4gdGhpcykKICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZ1bi5jYWxsKHZvaWQgMCwgcmVzdWx0LCBzZWxmW2ldLCBpLCBzZWxmKTsKICAgICAgICB9IHdoaWxlIChpLS0pOwoKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfTsKfQoKLy8gRVM1IDE1LjQuNC4xNAovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTQKLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvaW5kZXhPZgppZiAoIUFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7CiAgICBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2Yoc291Z2h0IC8qLCBmcm9tSW5kZXggKi8gKSB7CiAgICAgICAgdmFyIHNlbGYgPSB0b09iamVjdCh0aGlzKSwKICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5sZW5ndGggPj4+IDA7CgogICAgICAgIGlmICghbGVuZ3RoKQogICAgICAgICAgICByZXR1cm4gLTE7CgogICAgICAgIHZhciBpID0gMDsKICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpCiAgICAgICAgICAgIGkgPSB0b0ludGVnZXIoYXJndW1lbnRzWzFdKTsKCiAgICAgICAgLy8gaGFuZGxlIG5lZ2F0aXZlIGluZGljZXMKICAgICAgICBpID0gaSA+PSAwID8gaSA6IE1hdGgubWF4KDAsIGxlbmd0aCArIGkpOwogICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKGkgaW4gc2VsZiAmJiBzZWxmW2ldID09PSBzb3VnaHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAtMTsKICAgIH07Cn0KCi8vIEVTNSAxNS40LjQuMTUKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE1Ci8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2xhc3RJbmRleE9mCmlmICghQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mKSB7CiAgICBBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZihzb3VnaHQgLyosIGZyb21JbmRleCAqLykgewogICAgICAgIHZhciBzZWxmID0gdG9PYmplY3QodGhpcyksCiAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYubGVuZ3RoID4+PiAwOwoKICAgICAgICBpZiAoIWxlbmd0aCkKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIHZhciBpID0gbGVuZ3RoIC0gMTsKICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpCiAgICAgICAgICAgIGkgPSBNYXRoLm1pbihpLCB0b0ludGVnZXIoYXJndW1lbnRzWzFdKSk7CiAgICAgICAgLy8gaGFuZGxlIG5lZ2F0aXZlIGluZGljZXMKICAgICAgICBpID0gaSA+PSAwID8gaSA6IGxlbmd0aCAtIE1hdGguYWJzKGkpOwogICAgICAgIGZvciAoOyBpID49IDA7IGktLSkgewogICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmIHNvdWdodCA9PT0gc2VsZltpXSkKICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gLTE7CiAgICB9Owp9CgovLwovLyBPYmplY3QKLy8gPT09PT09Ci8vCgovLyBFUzUgMTUuMi4zLjIKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjIKaWYgKCFPYmplY3QuZ2V0UHJvdG90eXBlT2YpIHsKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9rcmlza293YWwvZXM1LXNoaW0vaXNzdWVzI2lzc3VlLzIKICAgIC8vIGh0dHA6Ly9lam9obi5vcmcvYmxvZy9vYmplY3RnZXRwcm90b3R5cGVvZi8KICAgIC8vIHJlY29tbWVuZGVkIGJ5IGZzY2hhZWZlciBvbiBnaXRodWIKICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZiA9IGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKG9iamVjdCkgewogICAgICAgIHJldHVybiBvYmplY3QuX19wcm90b19fIHx8ICgKICAgICAgICAgICAgb2JqZWN0LmNvbnN0cnVjdG9yID8KICAgICAgICAgICAgb2JqZWN0LmNvbnN0cnVjdG9yLnByb3RvdHlwZSA6CiAgICAgICAgICAgIHByb3RvdHlwZU9mT2JqZWN0CiAgICAgICAgKTsKICAgIH07Cn0KCi8vIEVTNSAxNS4yLjMuMwovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuMwppZiAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IpIHsKICAgIHZhciBFUlJfTk9OX09CSkVDVCA9ICJPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIGNhbGxlZCBvbiBhICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgIm5vbi1vYmplY3Q6ICI7CiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpIHsKICAgICAgICBpZiAoKHR5cGVvZiBvYmplY3QgIT0gIm9iamVjdCIgJiYgdHlwZW9mIG9iamVjdCAhPSAiZnVuY3Rpb24iKSB8fCBvYmplY3QgPT09IG51bGwpCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJSX05PTl9PQkpFQ1QgKyBvYmplY3QpOwogICAgICAgIC8vIElmIG9iamVjdCBkb2VzIG5vdCBvd25zIHByb3BlcnR5IHJldHVybiB1bmRlZmluZWQgaW1tZWRpYXRlbHkuCiAgICAgICAgaWYgKCFvd25zKG9iamVjdCwgcHJvcGVydHkpKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIHZhciBkZXNjcmlwdG9yLCBnZXR0ZXIsIHNldHRlcjsKCiAgICAgICAgLy8gSWYgb2JqZWN0IGhhcyBhIHByb3BlcnR5IHRoZW4gaXQncyBmb3Igc3VyZSBib3RoIGBlbnVtZXJhYmxlYCBhbmQKICAgICAgICAvLyBgY29uZmlndXJhYmxlYC4KICAgICAgICBkZXNjcmlwdG9yID0gIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH07CgogICAgICAgIC8vIElmIEpTIGVuZ2luZSBzdXBwb3J0cyBhY2Nlc3NvciBwcm9wZXJ0aWVzIHRoZW4gcHJvcGVydHkgbWF5IGJlIGEKICAgICAgICAvLyBnZXR0ZXIgb3Igc2V0dGVyLgogICAgICAgIGlmIChzdXBwb3J0c0FjY2Vzc29ycykgewogICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5IGBfX2xvb2t1cEdldHRlcl9fYCB3aWxsIHJldHVybiBhIGdldHRlciBldmVuCiAgICAgICAgICAgIC8vIGlmIG9iamVjdCBoYXMgb3duIG5vbiBnZXR0ZXIgcHJvcGVydHkgYWxvbmcgd2l0aCBhIHNhbWUgbmFtZWQKICAgICAgICAgICAgLy8gaW5oZXJpdGVkIGdldHRlci4gVG8gYXZvaWQgbWlzYmVoYXZpb3Igd2UgdGVtcG9yYXJ5IHJlbW92ZQogICAgICAgICAgICAvLyBgX19wcm90b19fYCBzbyB0aGF0IGBfX2xvb2t1cEdldHRlcl9fYCB3aWxsIHJldHVybiBnZXR0ZXIgb25seQogICAgICAgICAgICAvLyBpZiBpdCdzIG93bmVkIGJ5IGFuIG9iamVjdC4KICAgICAgICAgICAgdmFyIHByb3RvdHlwZSA9IG9iamVjdC5fX3Byb3RvX187CiAgICAgICAgICAgIG9iamVjdC5fX3Byb3RvX18gPSBwcm90b3R5cGVPZk9iamVjdDsKCiAgICAgICAgICAgIHZhciBnZXR0ZXIgPSBsb29rdXBHZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSk7CiAgICAgICAgICAgIHZhciBzZXR0ZXIgPSBsb29rdXBTZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSk7CgogICAgICAgICAgICAvLyBPbmNlIHdlIGhhdmUgZ2V0dGVyIGFuZCBzZXR0ZXIgd2UgY2FuIHB1dCB2YWx1ZXMgYmFjay4KICAgICAgICAgICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZTsKCiAgICAgICAgICAgIGlmIChnZXR0ZXIgfHwgc2V0dGVyKSB7CiAgICAgICAgICAgICAgICBpZiAoZ2V0dGVyKSBkZXNjcmlwdG9yLmdldCA9IGdldHRlcjsKICAgICAgICAgICAgICAgIGlmIChzZXR0ZXIpIGRlc2NyaXB0b3Iuc2V0ID0gc2V0dGVyOwoKICAgICAgICAgICAgICAgIC8vIElmIGl0IHdhcyBhY2Nlc3NvciBwcm9wZXJ0eSB3ZSdyZSBkb25lIGFuZCByZXR1cm4gaGVyZQogICAgICAgICAgICAgICAgLy8gaW4gb3JkZXIgdG8gYXZvaWQgYWRkaW5nIGB2YWx1ZWAgdG8gdGhlIGRlc2NyaXB0b3IuCiAgICAgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gSWYgd2UgZ290IHRoaXMgZmFyIHdlIGtub3cgdGhhdCBvYmplY3QgaGFzIGFuIG93biBwcm9wZXJ0eSB0aGF0IGlzCiAgICAgICAgLy8gbm90IGFuIGFjY2Vzc29yIHNvIHdlIHNldCBpdCBhcyBhIHZhbHVlIGFuZCByZXR1cm4gZGVzY3JpcHRvci4KICAgICAgICBkZXNjcmlwdG9yLnZhbHVlID0gb2JqZWN0W3Byb3BlcnR5XTsKICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsKICAgIH07Cn0KCi8vIEVTNSAxNS4yLjMuNAovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuNAppZiAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKSB7CiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMob2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdCk7CiAgICB9Owp9CgovLyBFUzUgMTUuMi4zLjUKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjUKaWYgKCFPYmplY3QuY3JlYXRlKSB7CiAgICBPYmplY3QuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKHByb3RvdHlwZSwgcHJvcGVydGllcykgewogICAgICAgIHZhciBvYmplY3Q7CiAgICAgICAgaWYgKHByb3RvdHlwZSA9PT0gbnVsbCkgewogICAgICAgICAgICBvYmplY3QgPSB7ICJfX3Byb3RvX18iOiBudWxsIH07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm90b3R5cGUgIT0gIm9iamVjdCIpCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJ0eXBlb2YgcHJvdG90eXBlWyIrKHR5cGVvZiBwcm90b3R5cGUpKyJdICE9ICdvYmplY3QnIik7CiAgICAgICAgICAgIHZhciBUeXBlID0gZnVuY3Rpb24gKCkge307CiAgICAgICAgICAgIFR5cGUucHJvdG90eXBlID0gcHJvdG90eXBlOwogICAgICAgICAgICBvYmplY3QgPSBuZXcgVHlwZSgpOwogICAgICAgICAgICAvLyBJRSBoYXMgbm8gYnVpbHQtaW4gaW1wbGVtZW50YXRpb24gb2YgYE9iamVjdC5nZXRQcm90b3R5cGVPZmAKICAgICAgICAgICAgLy8gbmVpdGhlciBgX19wcm90b19fYCwgYnV0IHRoaXMgbWFudWFsbHkgc2V0dGluZyBgX19wcm90b19fYCB3aWxsCiAgICAgICAgICAgIC8vIGd1YXJhbnRlZSB0aGF0IGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgIHdpbGwgd29yayBhcyBleHBlY3RlZCB3aXRoCiAgICAgICAgICAgIC8vIG9iamVjdHMgY3JlYXRlZCB1c2luZyBgT2JqZWN0LmNyZWF0ZWAKICAgICAgICAgICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZTsKICAgICAgICB9CiAgICAgICAgaWYgKHByb3BlcnRpZXMgIT09IHZvaWQgMCkKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMob2JqZWN0LCBwcm9wZXJ0aWVzKTsKICAgICAgICByZXR1cm4gb2JqZWN0OwogICAgfTsKfQoKLy8gRVM1IDE1LjIuMy42Ci8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy42CgovLyBQYXRjaCBmb3IgV2ViS2l0IGFuZCBJRTggc3RhbmRhcmQgbW9kZQovLyBEZXNpZ25lZCBieSBoYXggPGhheC5naXRodWIuY29tPgovLyByZWxhdGVkIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20va3Jpc2tvd2FsL2VzNS1zaGltL2lzc3VlcyNpc3N1ZS81Ci8vIElFOCBSZWZlcmVuY2U6Ci8vICAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZGQyODI5MDAuYXNweAovLyAgICAgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2RkMjI5OTE2LmFzcHgKLy8gV2ViS2l0IEJ1Z3M6Ci8vICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzY0MjMKCmZ1bmN0aW9uIGRvZXNEZWZpbmVQcm9wZXJ0eVdvcmsob2JqZWN0KSB7CiAgICB0cnkgewogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsICJzZW50aW5lbCIsIHt9KTsKICAgICAgICByZXR1cm4gInNlbnRpbmVsIiBpbiBvYmplY3Q7CiAgICB9IGNhdGNoIChleGNlcHRpb24pIHsKICAgICAgICAvLyByZXR1cm5zIGZhbHN5CiAgICB9Cn0KCi8vIGNoZWNrIHdoZXRoZXIgZGVmaW5lUHJvcGVydHkgd29ya3MgaWYgaXQncyBnaXZlbi4gT3RoZXJ3aXNlLAovLyBzaGltIHBhcnRpYWxseS4KaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgewogICAgdmFyIGRlZmluZVByb3BlcnR5V29ya3NPbk9iamVjdCA9IGRvZXNEZWZpbmVQcm9wZXJ0eVdvcmsoe30pOwogICAgdmFyIGRlZmluZVByb3BlcnR5V29ya3NPbkRvbSA9IHR5cGVvZiBkb2N1bWVudCA9PSAidW5kZWZpbmVkIiB8fAogICAgICAgIGRvZXNEZWZpbmVQcm9wZXJ0eVdvcmsoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpOwogICAgaWYgKCFkZWZpbmVQcm9wZXJ0eVdvcmtzT25PYmplY3QgfHwgIWRlZmluZVByb3BlcnR5V29ya3NPbkRvbSkgewogICAgICAgIHZhciBkZWZpbmVQcm9wZXJ0eUZhbGxiYWNrID0gT2JqZWN0LmRlZmluZVByb3BlcnR5OwogICAgfQp9CgppZiAoIU9iamVjdC5kZWZpbmVQcm9wZXJ0eSB8fCBkZWZpbmVQcm9wZXJ0eUZhbGxiYWNrKSB7CiAgICB2YXIgRVJSX05PTl9PQkpFQ1RfREVTQ1JJUFRPUiA9ICJQcm9wZXJ0eSBkZXNjcmlwdGlvbiBtdXN0IGJlIGFuIG9iamVjdDogIjsKICAgIHZhciBFUlJfTk9OX09CSkVDVF9UQVJHRVQgPSAiT2JqZWN0LmRlZmluZVByb3BlcnR5IGNhbGxlZCBvbiBub24tb2JqZWN0OiAiCiAgICB2YXIgRVJSX0FDQ0VTU09SU19OT1RfU1VQUE9SVEVEID0gImdldHRlcnMgJiBzZXR0ZXJzIGNhbiBub3QgYmUgZGVmaW5lZCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib24gdGhpcyBqYXZhc2NyaXB0IGVuZ2luZSI7CgogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvcikgewogICAgICAgIGlmICgodHlwZW9mIG9iamVjdCAhPSAib2JqZWN0IiAmJiB0eXBlb2Ygb2JqZWN0ICE9ICJmdW5jdGlvbiIpIHx8IG9iamVjdCA9PT0gbnVsbCkKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihFUlJfTk9OX09CSkVDVF9UQVJHRVQgKyBvYmplY3QpOwogICAgICAgIGlmICgodHlwZW9mIGRlc2NyaXB0b3IgIT0gIm9iamVjdCIgJiYgdHlwZW9mIGRlc2NyaXB0b3IgIT0gImZ1bmN0aW9uIikgfHwgZGVzY3JpcHRvciA9PT0gbnVsbCkKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihFUlJfTk9OX09CSkVDVF9ERVNDUklQVE9SICsgZGVzY3JpcHRvcik7CgogICAgICAgIC8vIG1ha2UgYSB2YWxpYW50IGF0dGVtcHQgdG8gdXNlIHRoZSByZWFsIGRlZmluZVByb3BlcnR5CiAgICAgICAgLy8gZm9yIEk4J3MgRE9NIGVsZW1lbnRzLgogICAgICAgIGlmIChkZWZpbmVQcm9wZXJ0eUZhbGxiYWNrKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lUHJvcGVydHlGYWxsYmFjay5jYWxsKE9iamVjdCwgb2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvcik7CiAgICAgICAgICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgLy8gdHJ5IHRoZSBzaGltIGlmIHRoZSByZWFsIG9uZSBkb2Vzbid0IHdvcmsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gSWYgaXQncyBhIGRhdGEgcHJvcGVydHkuCiAgICAgICAgaWYgKG93bnMoZGVzY3JpcHRvciwgInZhbHVlIikpIHsKICAgICAgICAgICAgLy8gZmFpbCBzaWxlbnRseSBpZiAid3JpdGFibGUiLCAiZW51bWVyYWJsZSIsIG9yICJjb25maWd1cmFibGUiCiAgICAgICAgICAgIC8vIGFyZSByZXF1ZXN0ZWQgYnV0IG5vdCBzdXBwb3J0ZWQKICAgICAgICAgICAgLyoKICAgICAgICAgICAgLy8gYWx0ZXJuYXRlIGFwcHJvYWNoOgogICAgICAgICAgICBpZiAoIC8vIGNhbid0IGltcGxlbWVudCB0aGVzZSBmZWF0dXJlczsgYWxsb3cgZmFsc2UgYnV0IG5vdCB0cnVlCiAgICAgICAgICAgICAgICAhKG93bnMoZGVzY3JpcHRvciwgIndyaXRhYmxlIikgPyBkZXNjcmlwdG9yLndyaXRhYmxlIDogdHJ1ZSkgfHwKICAgICAgICAgICAgICAgICEob3ducyhkZXNjcmlwdG9yLCAiZW51bWVyYWJsZSIpID8gZGVzY3JpcHRvci5lbnVtZXJhYmxlIDogdHJ1ZSkgfHwKICAgICAgICAgICAgICAgICEob3ducyhkZXNjcmlwdG9yLCAiY29uZmlndXJhYmxlIikgPyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA6IHRydWUpCiAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKAogICAgICAgICAgICAgICAgICAgICJUaGlzIGltcGxlbWVudGF0aW9uIG9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBkb2VzIG5vdCAiICsKICAgICAgICAgICAgICAgICAgICAic3VwcG9ydCBjb25maWd1cmFibGUsIGVudW1lcmFibGUsIG9yIHdyaXRhYmxlLiIKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICovCgogICAgICAgICAgICBpZiAoc3VwcG9ydHNBY2Nlc3NvcnMgJiYgKGxvb2t1cEdldHRlcihvYmplY3QsIHByb3BlcnR5KSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cFNldHRlcihvYmplY3QsIHByb3BlcnR5KSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIEFzIGFjY2Vzc29ycyBhcmUgc3VwcG9ydGVkIG9ubHkgb24gZW5naW5lcyBpbXBsZW1lbnRpbmcKICAgICAgICAgICAgICAgIC8vIGBfX3Byb3RvX19gIHdlIGNhbiBzYWZlbHkgb3ZlcnJpZGUgYF9fcHJvdG9fX2Agd2hpbGUgZGVmaW5pbmcKICAgICAgICAgICAgICAgIC8vIGEgcHJvcGVydHkgdG8gbWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3QgaGl0IGFuIGluaGVyaXRlZAogICAgICAgICAgICAgICAgLy8gYWNjZXNzb3IuCiAgICAgICAgICAgICAgICB2YXIgcHJvdG90eXBlID0gb2JqZWN0Ll9fcHJvdG9fXzsKICAgICAgICAgICAgICAgIG9iamVjdC5fX3Byb3RvX18gPSBwcm90b3R5cGVPZk9iamVjdDsKICAgICAgICAgICAgICAgIC8vIERlbGV0aW5nIGEgcHJvcGVydHkgYW55d2F5IHNpbmNlIGdldHRlciAvIHNldHRlciBtYXkgYmUKICAgICAgICAgICAgICAgIC8vIGRlZmluZWQgb24gb2JqZWN0IGl0c2VsZi4KICAgICAgICAgICAgICAgIGRlbGV0ZSBvYmplY3RbcHJvcGVydHldOwogICAgICAgICAgICAgICAgb2JqZWN0W3Byb3BlcnR5XSA9IGRlc2NyaXB0b3IudmFsdWU7CiAgICAgICAgICAgICAgICAvLyBTZXR0aW5nIG9yaWdpbmFsIGBfX3Byb3RvX19gIGJhY2sgbm93LgogICAgICAgICAgICAgICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG9iamVjdFtwcm9wZXJ0eV0gPSBkZXNjcmlwdG9yLnZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCFzdXBwb3J0c0FjY2Vzc29ycykKICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJSX0FDQ0VTU09SU19OT1RfU1VQUE9SVEVEKTsKICAgICAgICAgICAgLy8gSWYgd2UgZ290IHRoYXQgZmFyIHRoZW4gZ2V0dGVycyBhbmQgc2V0dGVycyBjYW4gYmUgZGVmaW5lZCAhIQogICAgICAgICAgICBpZiAob3ducyhkZXNjcmlwdG9yLCAiZ2V0IikpCiAgICAgICAgICAgICAgICBkZWZpbmVHZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvci5nZXQpOwogICAgICAgICAgICBpZiAob3ducyhkZXNjcmlwdG9yLCAic2V0IikpCiAgICAgICAgICAgICAgICBkZWZpbmVTZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvci5zZXQpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG9iamVjdDsKICAgIH07Cn0KCi8vIEVTNSAxNS4yLjMuNwovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuNwppZiAoIU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKSB7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMob2JqZWN0LCBwcm9wZXJ0aWVzKSB7CiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gcHJvcGVydGllcykgewogICAgICAgICAgICBpZiAob3ducyhwcm9wZXJ0aWVzLCBwcm9wZXJ0eSkpCiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgcHJvcGVydGllc1twcm9wZXJ0eV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gb2JqZWN0OwogICAgfTsKfQoKLy8gRVM1IDE1LjIuMy44Ci8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy44CmlmICghT2JqZWN0LnNlYWwpIHsKICAgIE9iamVjdC5zZWFsID0gZnVuY3Rpb24gc2VhbChvYmplY3QpIHsKICAgICAgICAvLyB0aGlzIGlzIG1pc2xlYWRpbmcgYW5kIGJyZWFrcyBmZWF0dXJlLWRldGVjdGlvbiwgYnV0CiAgICAgICAgLy8gYWxsb3dzICJzZWN1cmFibGUiIGNvZGUgdG8gImdyYWNlZnVsbHkiIGRlZ3JhZGUgdG8gd29ya2luZwogICAgICAgIC8vIGJ1dCBpbnNlY3VyZSBjb2RlLgogICAgICAgIHJldHVybiBvYmplY3Q7CiAgICB9Owp9CgovLyBFUzUgMTUuMi4zLjkKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjkKaWYgKCFPYmplY3QuZnJlZXplKSB7CiAgICBPYmplY3QuZnJlZXplID0gZnVuY3Rpb24gZnJlZXplKG9iamVjdCkgewogICAgICAgIC8vIHRoaXMgaXMgbWlzbGVhZGluZyBhbmQgYnJlYWtzIGZlYXR1cmUtZGV0ZWN0aW9uLCBidXQKICAgICAgICAvLyBhbGxvd3MgInNlY3VyYWJsZSIgY29kZSB0byAiZ3JhY2VmdWxseSIgZGVncmFkZSB0byB3b3JraW5nCiAgICAgICAgLy8gYnV0IGluc2VjdXJlIGNvZGUuCiAgICAgICAgcmV0dXJuIG9iamVjdDsKICAgIH07Cn0KCi8vIGRldGVjdCBhIFJoaW5vIGJ1ZyBhbmQgcGF0Y2ggaXQKdHJ5IHsKICAgIE9iamVjdC5mcmVlemUoZnVuY3Rpb24gKCkge30pOwp9IGNhdGNoIChleGNlcHRpb24pIHsKICAgIE9iamVjdC5mcmVlemUgPSAoZnVuY3Rpb24gZnJlZXplKGZyZWV6ZU9iamVjdCkgewogICAgICAgIHJldHVybiBmdW5jdGlvbiBmcmVlemUob2JqZWN0KSB7CiAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0ID09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3Q7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnJlZXplT2JqZWN0KG9iamVjdCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfSkoT2JqZWN0LmZyZWV6ZSk7Cn0KCi8vIEVTNSAxNS4yLjMuMTAKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjEwCmlmICghT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKSB7CiAgICBPYmplY3QucHJldmVudEV4dGVuc2lvbnMgPSBmdW5jdGlvbiBwcmV2ZW50RXh0ZW5zaW9ucyhvYmplY3QpIHsKICAgICAgICAvLyB0aGlzIGlzIG1pc2xlYWRpbmcgYW5kIGJyZWFrcyBmZWF0dXJlLWRldGVjdGlvbiwgYnV0CiAgICAgICAgLy8gYWxsb3dzICJzZWN1cmFibGUiIGNvZGUgdG8gImdyYWNlZnVsbHkiIGRlZ3JhZGUgdG8gd29ya2luZwogICAgICAgIC8vIGJ1dCBpbnNlY3VyZSBjb2RlLgogICAgICAgIHJldHVybiBvYmplY3Q7CiAgICB9Owp9CgovLyBFUzUgMTUuMi4zLjExCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMQppZiAoIU9iamVjdC5pc1NlYWxlZCkgewogICAgT2JqZWN0LmlzU2VhbGVkID0gZnVuY3Rpb24gaXNTZWFsZWQob2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfTsKfQoKLy8gRVM1IDE1LjIuMy4xMgovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuMTIKaWYgKCFPYmplY3QuaXNGcm96ZW4pIHsKICAgIE9iamVjdC5pc0Zyb3plbiA9IGZ1bmN0aW9uIGlzRnJvemVuKG9iamVjdCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH07Cn0KCi8vIEVTNSAxNS4yLjMuMTMKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjEzCmlmICghT2JqZWN0LmlzRXh0ZW5zaWJsZSkgewogICAgT2JqZWN0LmlzRXh0ZW5zaWJsZSA9IGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZShvYmplY3QpIHsKICAgICAgICAvLyAxLiBJZiBUeXBlKE8pIGlzIG5vdCBPYmplY3QgdGhyb3cgYSBUeXBlRXJyb3IgZXhjZXB0aW9uLgogICAgICAgIGlmIChPYmplY3Qob2JqZWN0KSA9PT0gb2JqZWN0KSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlCiAgICAgICAgfQogICAgICAgIC8vIDIuIFJldHVybiB0aGUgQm9vbGVhbiB2YWx1ZSBvZiB0aGUgW1tFeHRlbnNpYmxlXV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgTy4KICAgICAgICB2YXIgbmFtZSA9ICcnOwogICAgICAgIHdoaWxlIChvd25zKG9iamVjdCwgbmFtZSkpIHsKICAgICAgICAgICAgbmFtZSArPSAnPyc7CiAgICAgICAgfQogICAgICAgIG9iamVjdFtuYW1lXSA9IHRydWU7CiAgICAgICAgdmFyIHJldHVyblZhbHVlID0gb3ducyhvYmplY3QsIG5hbWUpOwogICAgICAgIGRlbGV0ZSBvYmplY3RbbmFtZV07CiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwogICAgfTsKfQoKLy8gRVM1IDE1LjIuMy4xNAovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuMTQKaWYgKCFPYmplY3Qua2V5cykgewogICAgLy8gaHR0cDovL3doYXR0aGVoZWFkc2FpZC5jb20vMjAxMC8xMC9hLXNhZmVyLW9iamVjdC1rZXlzLWNvbXBhdGliaWxpdHktaW1wbGVtZW50YXRpb24KICAgIHZhciBoYXNEb250RW51bUJ1ZyA9IHRydWUsCiAgICAgICAgZG9udEVudW1zID0gWwogICAgICAgICAgICAidG9TdHJpbmciLAogICAgICAgICAgICAidG9Mb2NhbGVTdHJpbmciLAogICAgICAgICAgICAidmFsdWVPZiIsCiAgICAgICAgICAgICJoYXNPd25Qcm9wZXJ0eSIsCiAgICAgICAgICAgICJpc1Byb3RvdHlwZU9mIiwKICAgICAgICAgICAgInByb3BlcnR5SXNFbnVtZXJhYmxlIiwKICAgICAgICAgICAgImNvbnN0cnVjdG9yIgogICAgICAgIF0sCiAgICAgICAgZG9udEVudW1zTGVuZ3RoID0gZG9udEVudW1zLmxlbmd0aDsKCiAgICBmb3IgKHZhciBrZXkgaW4geyJ0b1N0cmluZyI6IG51bGx9KQogICAgICAgIGhhc0RvbnRFbnVtQnVnID0gZmFsc2U7CgogICAgT2JqZWN0LmtleXMgPSBmdW5jdGlvbiBrZXlzKG9iamVjdCkgewoKICAgICAgICBpZiAoKHR5cGVvZiBvYmplY3QgIT0gIm9iamVjdCIgJiYgdHlwZW9mIG9iamVjdCAhPSAiZnVuY3Rpb24iKSB8fCBvYmplY3QgPT09IG51bGwpCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdC5rZXlzIGNhbGxlZCBvbiBhIG5vbi1vYmplY3QiKTsKCiAgICAgICAgdmFyIGtleXMgPSBbXTsKICAgICAgICBmb3IgKHZhciBuYW1lIGluIG9iamVjdCkgewogICAgICAgICAgICBpZiAob3ducyhvYmplY3QsIG5hbWUpKSB7CiAgICAgICAgICAgICAgICBrZXlzLnB1c2gobmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChoYXNEb250RW51bUJ1ZykgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBkb250RW51bXNMZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgZG9udEVudW0gPSBkb250RW51bXNbaV07CiAgICAgICAgICAgICAgICBpZiAob3ducyhvYmplY3QsIGRvbnRFbnVtKSkgewogICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChkb250RW51bSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBrZXlzOwogICAgfTsKCn0KCi8vCi8vIERhdGUKLy8gPT09PQovLwoKLy8gRVM1IDE1LjkuNS40MwovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS45LjUuNDMKLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgU3RyaW5nIHZhbHVlIHJlcHJlc2VudCB0aGUgaW5zdGFuY2UgaW4gdGltZSAKLy8gcmVwcmVzZW50ZWQgYnkgdGhpcyBEYXRlIG9iamVjdC4gVGhlIGZvcm1hdCBvZiB0aGUgU3RyaW5nIGlzIHRoZSBEYXRlIFRpbWUgCi8vIHN0cmluZyBmb3JtYXQgZGVmaW5lZCBpbiAxNS45LjEuMTUuIEFsbCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIFN0cmluZy4gCi8vIFRoZSB0aW1lIHpvbmUgaXMgYWx3YXlzIFVUQywgZGVub3RlZCBieSB0aGUgc3VmZml4IFouIElmIHRoZSB0aW1lIHZhbHVlIG9mIAovLyB0aGlzIG9iamVjdCBpcyBub3QgYSBmaW5pdGUgTnVtYmVyIGEgUmFuZ2VFcnJvciBleGNlcHRpb24gaXMgdGhyb3duLgppZiAoIURhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nIHx8IChuZXcgRGF0ZSgtNjIxOTg3NTUyMDAwMDApLnRvSVNPU3RyaW5nKCkuaW5kZXhPZignLTAwMDAwMScpID09PSAtMSkpIHsKICAgIERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nID0gZnVuY3Rpb24gdG9JU09TdHJpbmcoKSB7CiAgICAgICAgdmFyIHJlc3VsdCwgbGVuZ3RoLCB2YWx1ZSwgeWVhcjsKICAgICAgICBpZiAoIWlzRmluaXRlKHRoaXMpKQogICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcjsKCiAgICAgICAgLy8gdGhlIGRhdGUgdGltZSBzdHJpbmcgZm9ybWF0IGlzIHNwZWNpZmllZCBpbiAxNS45LjEuMTUuCiAgICAgICAgcmVzdWx0ID0gW3RoaXMuZ2V0VVRDTW9udGgoKSArIDEsIHRoaXMuZ2V0VVRDRGF0ZSgpLAogICAgICAgICAgICB0aGlzLmdldFVUQ0hvdXJzKCksIHRoaXMuZ2V0VVRDTWludXRlcygpLCB0aGlzLmdldFVUQ1NlY29uZHMoKV07CiAgICAgICAgeWVhciA9IHRoaXMuZ2V0VVRDRnVsbFllYXIoKTsKICAgICAgICB5ZWFyID0gKHllYXIgPCAwID8gJy0nIDogKHllYXIgPiA5OTk5ID8gJysnIDogJycpKSArICgnMDAwMDAnICsgTWF0aC5hYnMoeWVhcikpLnNsaWNlKDAgPD0geWVhciAmJiB5ZWFyIDw9IDk5OTkgPyAtNCA6IC02KTsKCiAgICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDsKICAgICAgICB3aGlsZSAobGVuZ3RoLS0pIHsKICAgICAgICAgICAgdmFsdWUgPSByZXN1bHRbbGVuZ3RoXTsKICAgICAgICAgICAgLy8gcGFkIG1vbnRocywgZGF5cywgaG91cnMsIG1pbnV0ZXMsIGFuZCBzZWNvbmRzIHRvIGhhdmUgdHdvIGRpZ2l0cy4KICAgICAgICAgICAgaWYgKHZhbHVlIDwgMTApCiAgICAgICAgICAgICAgICByZXN1bHRbbGVuZ3RoXSA9ICIwIiArIHZhbHVlOwogICAgICAgIH0KICAgICAgICAvLyBwYWQgbWlsbGlzZWNvbmRzIHRvIGhhdmUgdGhyZWUgZGlnaXRzLgogICAgICAgIHJldHVybiB5ZWFyICsgIi0iICsgcmVzdWx0LnNsaWNlKDAsIDIpLmpvaW4oIi0iKSArICJUIiArIHJlc3VsdC5zbGljZSgyKS5qb2luKCI6IikgKyAiLiIgKwogICAgICAgICAgICAoIjAwMCIgKyB0aGlzLmdldFVUQ01pbGxpc2Vjb25kcygpKS5zbGljZSgtMykgKyAiWiI7CiAgICB9Cn0KCi8vIEVTNSAxNS45LjQuNAovLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS45LjQuNAppZiAoIURhdGUubm93KSB7CiAgICBEYXRlLm5vdyA9IGZ1bmN0aW9uIG5vdygpIHsKICAgICAgICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICB9Owp9CgovLyBFUzUgMTUuOS41LjQ0Ci8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjkuNS40NAovLyBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgRGF0ZSBvYmplY3QgZm9yIHVzZSBieSAKLy8gSlNPTi5zdHJpbmdpZnkgKDE1LjEyLjMpLgppZiAoIURhdGUucHJvdG90eXBlLnRvSlNPTikgewogICAgRGF0ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OKGtleSkgewogICAgICAgIC8vIFdoZW4gdGhlIHRvSlNPTiBtZXRob2QgaXMgY2FsbGVkIHdpdGggYXJndW1lbnQga2V5LCB0aGUgZm9sbG93aW5nIAogICAgICAgIC8vIHN0ZXBzIGFyZSB0YWtlbjoKCiAgICAgICAgLy8gMS4gIExldCBPIGJlIHRoZSByZXN1bHQgb2YgY2FsbGluZyBUb09iamVjdCwgZ2l2aW5nIGl0IHRoZSB0aGlzCiAgICAgICAgLy8gdmFsdWUgYXMgaXRzIGFyZ3VtZW50LgogICAgICAgIC8vIDIuIExldCB0diBiZSBUb1ByaW1pdGl2ZShPLCBoaW50IE51bWJlcikuCiAgICAgICAgLy8gMy4gSWYgdHYgaXMgYSBOdW1iZXIgYW5kIGlzIG5vdCBmaW5pdGUsIHJldHVybiBudWxsLgogICAgICAgIC8vIFhYWAogICAgICAgIC8vIDQuIExldCB0b0lTTyBiZSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIFtbR2V0XV0gaW50ZXJuYWwgbWV0aG9kIG9mCiAgICAgICAgLy8gTyB3aXRoIGFyZ3VtZW50ICJ0b0lTT1N0cmluZyIuCiAgICAgICAgLy8gNS4gSWYgSXNDYWxsYWJsZSh0b0lTTykgaXMgZmFsc2UsIHRocm93IGEgVHlwZUVycm9yIGV4Y2VwdGlvbi4KICAgICAgICBpZiAodHlwZW9mIHRoaXMudG9JU09TdHJpbmcgIT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBUT0RPIG1lc3NhZ2UKICAgICAgICAvLyA2LiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBtZXRob2Qgb2YKICAgICAgICAvLyAgdG9JU08gd2l0aCBPIGFzIHRoZSB0aGlzIHZhbHVlIGFuZCBhbiBlbXB0eSBhcmd1bWVudCBsaXN0LgogICAgICAgIHJldHVybiB0aGlzLnRvSVNPU3RyaW5nKCk7CgogICAgICAgIC8vIE5PVEUgMSBUaGUgYXJndW1lbnQgaXMgaWdub3JlZC4KCiAgICAgICAgLy8gTk9URSAyIFRoZSB0b0pTT04gZnVuY3Rpb24gaXMgaW50ZW50aW9uYWxseSBnZW5lcmljOyBpdCBkb2VzIG5vdAogICAgICAgIC8vIHJlcXVpcmUgdGhhdCBpdHMgdGhpcyB2YWx1ZSBiZSBhIERhdGUgb2JqZWN0LiBUaGVyZWZvcmUsIGl0IGNhbiBiZQogICAgICAgIC8vIHRyYW5zZmVycmVkIHRvIG90aGVyIGtpbmRzIG9mIG9iamVjdHMgZm9yIHVzZSBhcyBhIG1ldGhvZC4gSG93ZXZlciwKICAgICAgICAvLyBpdCBkb2VzIHJlcXVpcmUgdGhhdCBhbnkgc3VjaCBvYmplY3QgaGF2ZSBhIHRvSVNPU3RyaW5nIG1ldGhvZC4gQW4KICAgICAgICAvLyBvYmplY3QgaXMgZnJlZSB0byB1c2UgdGhlIGFyZ3VtZW50IGtleSB0byBmaWx0ZXIgaXRzCiAgICAgICAgLy8gc3RyaW5naWZpY2F0aW9uLgogICAgfTsKfQoKLy8gRVM1IDE1LjkuNC4yCi8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjkuNC4yCi8vIGJhc2VkIG9uIHdvcmsgc2hhcmVkIGJ5IERhbmllbCBGcmllc2VuIChkYW50bWFuKQovLyBodHRwOi8vZ2lzdC5naXRodWIuY29tLzMwMzI0OQppZiAoRGF0ZS5wYXJzZSgiKzI3NTc2MC0wOS0xM1QwMDowMDowMC4wMDBaIikgIT09IDguNjRlMTUpIHsKICAgIC8vIFhYWCBnbG9iYWwgYXNzaWdubWVudCB3b24ndCB3b3JrIGluIGVtYmVkZGluZ3MgdGhhdCB1c2UKICAgIC8vIGFuIGFsdGVybmF0ZSBvYmplY3QgZm9yIHRoZSBjb250ZXh0LgogICAgRGF0ZSA9IChmdW5jdGlvbihOYXRpdmVEYXRlKSB7CgogICAgICAgIC8vIERhdGUubGVuZ3RoID09PSA3CiAgICAgICAgdmFyIERhdGUgPSBmdW5jdGlvbiBEYXRlKFksIE0sIEQsIGgsIG0sIHMsIG1zKSB7CiAgICAgICAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOwogICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIE5hdGl2ZURhdGUpIHsKICAgICAgICAgICAgICAgIHZhciBkYXRlID0gbGVuZ3RoID09IDEgJiYgU3RyaW5nKFkpID09PSBZID8gLy8gaXNTdHJpbmcoWSkKICAgICAgICAgICAgICAgICAgICAvLyBXZSBleHBsaWNpdGx5IHBhc3MgaXQgdGhyb3VnaCBwYXJzZToKICAgICAgICAgICAgICAgICAgICBuZXcgTmF0aXZlRGF0ZShEYXRlLnBhcnNlKFkpKSA6CiAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byBtYW51YWxseSBtYWtlIGNhbGxzIGRlcGVuZGluZyBvbiBhcmd1bWVudAogICAgICAgICAgICAgICAgICAgIC8vIGxlbmd0aCBoZXJlCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDcgPyBuZXcgTmF0aXZlRGF0ZShZLCBNLCBELCBoLCBtLCBzLCBtcykgOgogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSA2ID8gbmV3IE5hdGl2ZURhdGUoWSwgTSwgRCwgaCwgbSwgcykgOgogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSA1ID8gbmV3IE5hdGl2ZURhdGUoWSwgTSwgRCwgaCwgbSkgOgogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSA0ID8gbmV3IE5hdGl2ZURhdGUoWSwgTSwgRCwgaCkgOgogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSAzID8gbmV3IE5hdGl2ZURhdGUoWSwgTSwgRCkgOgogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSAyID8gbmV3IE5hdGl2ZURhdGUoWSwgTSkgOgogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSAxID8gbmV3IE5hdGl2ZURhdGUoWSkgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5hdGl2ZURhdGUoKTsKICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgbWl4dXBzIHdpdGggdW5maXhlZCBEYXRlIG9iamVjdAogICAgICAgICAgICAgICAgZGF0ZS5jb25zdHJ1Y3RvciA9IERhdGU7CiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH07CgogICAgICAgIC8vIDE1LjkuMS4xNSBEYXRlIFRpbWUgU3RyaW5nIEZvcm1hdC4KICAgICAgICB2YXIgaXNvRGF0ZUV4cHJlc3Npb24gPSBuZXcgUmVnRXhwKCJeIiArCiAgICAgICAgICAgICIoXFxkezR9fFtcK1wtXVxcZHs2fSkiICsgLy8gZm91ci1kaWdpdCB5ZWFyIGNhcHR1cmUgb3Igc2lnbiArIDYtZGlnaXQgZXh0ZW5kZWQgeWVhcgogICAgICAgICAgICAiKD86LShcXGR7Mn0pIiArIC8vIG9wdGlvbmFsIG1vbnRoIGNhcHR1cmUKICAgICAgICAgICAgIig/Oi0oXFxkezJ9KSIgKyAvLyBvcHRpb25hbCBkYXkgY2FwdHVyZQogICAgICAgICAgICAiKD86IiArIC8vIGNhcHR1cmUgaG91cnM6bWludXRlczpzZWNvbmRzLm1pbGxpc2Vjb25kcwogICAgICAgICAgICAgICAgIlQoXFxkezJ9KSIgKyAvLyBob3VycyBjYXB0dXJlCiAgICAgICAgICAgICAgICAiOihcXGR7Mn0pIiArIC8vIG1pbnV0ZXMgY2FwdHVyZQogICAgICAgICAgICAgICAgIig/OiIgKyAvLyBvcHRpb25hbCA6c2Vjb25kcy5taWxsaXNlY29uZHMKICAgICAgICAgICAgICAgICAgICAiOihcXGR7Mn0pIiArIC8vIHNlY29uZHMgY2FwdHVyZQogICAgICAgICAgICAgICAgICAgICIoPzpcXC4oXFxkezN9KSk/IiArIC8vIG1pbGxpc2Vjb25kcyBjYXB0dXJlCiAgICAgICAgICAgICAgICAiKT8iICsKICAgICAgICAgICAgIig/OiIgKyAvLyBjYXB0dXJlIFVUQyBvZmZzZXQgY29tcG9uZW50CiAgICAgICAgICAgICAgICAiWnwiICsgLy8gVVRDIGNhcHR1cmUKICAgICAgICAgICAgICAgICIoPzoiICsgLy8gb2Zmc2V0IHNwZWNpZmllciArLy1ob3VyczptaW51dGVzCiAgICAgICAgICAgICAgICAgICAgIihbLStdKSIgKyAvLyBzaWduIGNhcHR1cmUKICAgICAgICAgICAgICAgICAgICAiKFxcZHsyfSkiICsgLy8gaG91cnMgb2Zmc2V0IGNhcHR1cmUKICAgICAgICAgICAgICAgICAgICAiOihcXGR7Mn0pIiArIC8vIG1pbnV0ZXMgb2Zmc2V0IGNhcHR1cmUKICAgICAgICAgICAgICAgICIpIiArCiAgICAgICAgICAgICIpPyk/KT8pPyIgKwogICAgICAgICIkIik7CgogICAgICAgIC8vIENvcHkgYW55IGN1c3RvbSBtZXRob2RzIGEgM3JkIHBhcnR5IGxpYnJhcnkgbWF5IGhhdmUgYWRkZWQKICAgICAgICBmb3IgKHZhciBrZXkgaW4gTmF0aXZlRGF0ZSkKICAgICAgICAgICAgRGF0ZVtrZXldID0gTmF0aXZlRGF0ZVtrZXldOwoKICAgICAgICAvLyBDb3B5ICJuYXRpdmUiIG1ldGhvZHMgZXhwbGljaXRseTsgdGhleSBtYXkgYmUgbm9uLWVudW1lcmFibGUKICAgICAgICBEYXRlLm5vdyA9IE5hdGl2ZURhdGUubm93OwogICAgICAgIERhdGUuVVRDID0gTmF0aXZlRGF0ZS5VVEM7CiAgICAgICAgRGF0ZS5wcm90b3R5cGUgPSBOYXRpdmVEYXRlLnByb3RvdHlwZTsKICAgICAgICBEYXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERhdGU7CgogICAgICAgIC8vIFVwZ3JhZGUgRGF0ZS5wYXJzZSB0byBoYW5kbGUgc2ltcGxpZmllZCBJU08gODYwMSBzdHJpbmdzCiAgICAgICAgRGF0ZS5wYXJzZSA9IGZ1bmN0aW9uIHBhcnNlKHN0cmluZykgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBpc29EYXRlRXhwcmVzc2lvbi5leGVjKHN0cmluZyk7CiAgICAgICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICAgICAgbWF0Y2guc2hpZnQoKTsgLy8ga2lsbCBtYXRjaFswXSwgdGhlIGZ1bGwgbWF0Y2gKICAgICAgICAgICAgICAgIC8vIHBhcnNlIG1vbnRocywgZGF5cywgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGFuZCBtaWxsaXNlY29uZHMKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgNzsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gcHJvdmlkZSBkZWZhdWx0IHZhbHVlcyBpZiBuZWNlc3NhcnkKICAgICAgICAgICAgICAgICAgICBtYXRjaFtpXSA9ICsobWF0Y2hbaV0gfHwgKGkgPCAzID8gMSA6IDApKTsKICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaFsxXSBpcyB0aGUgbW9udGguIE1vbnRocyBhcmUgMC0xMSBpbiBKYXZhU2NyaXB0CiAgICAgICAgICAgICAgICAgICAgLy8gYERhdGVgIG9iamVjdHMsIGJ1dCAxLTEyIGluIElTTyBub3RhdGlvbiwgc28gd2UKICAgICAgICAgICAgICAgICAgICAvLyBkZWNyZW1lbnQuCiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbaV0tLTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBwYXJzZSB0aGUgVVRDIG9mZnNldCBjb21wb25lbnQKICAgICAgICAgICAgICAgIHZhciBtaW51dGVPZmZzZXQgPSArbWF0Y2gucG9wKCksIGhvdXJPZmZzZXQgPSArbWF0Y2gucG9wKCksIHNpZ24gPSBtYXRjaC5wb3AoKTsKCiAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHRoZSBleHBsaWNpdCB0aW1lIHpvbmUgb2Zmc2V0IGlmIHNwZWNpZmllZAogICAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IDA7CiAgICAgICAgICAgICAgICBpZiAoc2lnbikgewogICAgICAgICAgICAgICAgICAgIC8vIGRldGVjdCBpbnZhbGlkIG9mZnNldHMgYW5kIHJldHVybiBlYXJseQogICAgICAgICAgICAgICAgICAgIGlmIChob3VyT2Zmc2V0ID4gMjMgfHwgbWludXRlT2Zmc2V0ID4gNTkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOYU47CgogICAgICAgICAgICAgICAgICAgIC8vIGV4cHJlc3MgdGhlIHByb3ZpZGVkIHRpbWUgem9uZSBvZmZzZXQgaW4gbWludXRlcy4gVGhlIG9mZnNldCBpcwogICAgICAgICAgICAgICAgICAgIC8vIG5lZ2F0aXZlIGZvciB0aW1lIHpvbmVzIHdlc3Qgb2YgVVRDOyBwb3NpdGl2ZSBvdGhlcndpc2UuCiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKGhvdXJPZmZzZXQgKiA2MCArIG1pbnV0ZU9mZnNldCkgKiA2ZTQgKiAoc2lnbiA9PSAiKyIgPyAtMSA6IDEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIERhdGUuVVRDIGZvciB5ZWFycyBiZXR3ZWVuIDAgYW5kIDk5IGNvbnZlcnRzIHllYXIgdG8gMTkwMCArIHllYXIKICAgICAgICAgICAgICAgIC8vIFRoZSBHcmVnb3JpYW4gY2FsZW5kYXIgaGFzIGEgNDAwLXllYXIgY3ljbGUsIHNvIAogICAgICAgICAgICAgICAgLy8gdG8gRGF0ZS5VVEMoeWVhciArIDQwMCwgLi4uLiApIC0gMTI2MjI3ODA4MDAwMDAgPT0gRGF0ZS5VVEMoeWVhciwgLi4uKSwKICAgICAgICAgICAgICAgIC8vIHdoZXJlIDEyNjIyNzgwODAwMDAwIC0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBHcmVnb3JpYW4gY2FsZW5kYXIgNDAwIHllYXJzCiAgICAgICAgICAgICAgICB2YXIgeWVhciA9ICttYXRjaFswXTsKICAgICAgICAgICAgICAgIGlmICgwIDw9IHllYXIgJiYgeWVhciA8PSA5OSkgewogICAgICAgICAgICAgICAgICAgIG1hdGNoWzBdID0geWVhciArIDQwMDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5VVEMuYXBwbHkodGhpcywgbWF0Y2gpICsgb2Zmc2V0IC0gMTI2MjI3ODA4MDAwMDA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gY29tcHV0ZSBhIG5ldyBVVEMgZGF0ZSB2YWx1ZSwgYWNjb3VudGluZyBmb3IgdGhlIG9wdGlvbmFsIG9mZnNldAogICAgICAgICAgICAgICAgcmV0dXJuIE5hdGl2ZURhdGUuVVRDLmFwcGx5KHRoaXMsIG1hdGNoKSArIG9mZnNldDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5wYXJzZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH07CgogICAgICAgIHJldHVybiBEYXRlOwogICAgfSkoRGF0ZSk7Cn0KCi8vCi8vIFN0cmluZwovLyA9PT09PT0KLy8KCi8vIEVTNSAxNS41LjQuMjAKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNS40LjIwCnZhciB3cyA9ICJceDA5XHgwQVx4MEJceDBDXHgwRFx4MjBceEEwXHUxNjgwXHUxODBFXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzIiArCiAgICAiXHUyMDA0XHUyMDA1XHUyMDA2XHUyMDA3XHUyMDA4XHUyMDA5XHUyMDBBXHUyMDJGXHUyMDVGXHUzMDAwXHUyMDI4IiArCiAgICAiXHUyMDI5XHVGRUZGIjsKaWYgKCFTdHJpbmcucHJvdG90eXBlLnRyaW0gfHwgd3MudHJpbSgpKSB7CiAgICAvLyBodHRwOi8vYmxvZy5zdGV2ZW5sZXZpdGhhbi5jb20vYXJjaGl2ZXMvZmFzdGVyLXRyaW0tamF2YXNjcmlwdAogICAgLy8gaHR0cDovL3BlcmZlY3Rpb25raWxscy5jb20vd2hpdGVzcGFjZS1kZXZpYXRpb25zLwogICAgd3MgPSAiWyIgKyB3cyArICJdIjsKICAgIHZhciB0cmltQmVnaW5SZWdleHAgPSBuZXcgUmVnRXhwKCJeIiArIHdzICsgd3MgKyAiKiIpLAogICAgICAgIHRyaW1FbmRSZWdleHAgPSBuZXcgUmVnRXhwKHdzICsgd3MgKyAiKiQiKTsKICAgIFN0cmluZy5wcm90b3R5cGUudHJpbSA9IGZ1bmN0aW9uIHRyaW0oKSB7CiAgICAgICAgcmV0dXJuIFN0cmluZyh0aGlzKS5yZXBsYWNlKHRyaW1CZWdpblJlZ2V4cCwgIiIpLnJlcGxhY2UodHJpbUVuZFJlZ2V4cCwgIiIpOwogICAgfTsKfQoKLy8KLy8gVXRpbAovLyA9PT09PT0KLy8KCi8vIEVTNSA5LjQKLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4OS40Ci8vIGh0dHA6Ly9qc3BlcmYuY29tL3RvLWludGVnZXIKdmFyIHRvSW50ZWdlciA9IGZ1bmN0aW9uIChuKSB7CiAgICBuID0gK247CiAgICBpZiAobiAhPT0gbikgLy8gaXNOYU4KICAgICAgICBuID0gMDsKICAgIGVsc2UgaWYgKG4gIT09IDAgJiYgbiAhPT0gKDEvMCkgJiYgbiAhPT0gLSgxLzApKQogICAgICAgIG4gPSAobiA+IDAgfHwgLTEpICogTWF0aC5mbG9vcihNYXRoLmFicyhuKSk7CiAgICByZXR1cm4gbjsKfTsKCnZhciBwcmVwYXJlU3RyaW5nID0gImEiWzBdICE9ICJhIiwKICAgIC8vIEVTNSA5LjkKICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDkuOQogICAgdG9PYmplY3QgPSBmdW5jdGlvbiAobykgewogICAgICAgIGlmIChvID09IG51bGwpIHsgLy8gdGhpcyBtYXRjaGVzIGJvdGggbnVsbCBhbmQgdW5kZWZpbmVkCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gVE9ETyBtZXNzYWdlCiAgICAgICAgfQogICAgICAgIC8vIElmIHRoZSBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHN1cHBvcnQgYnktaW5kZXggYWNjZXNzIG9mCiAgICAgICAgLy8gc3RyaW5nIGNoYXJhY3RlcnMgKGV4LiBJRSA8IDcpLCBzcGxpdCB0aGUgc3RyaW5nCiAgICAgICAgaWYgKHByZXBhcmVTdHJpbmcgJiYgdHlwZW9mIG8gPT0gInN0cmluZyIgJiYgbykgewogICAgICAgICAgICByZXR1cm4gby5zcGxpdCgiIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBPYmplY3Qobyk7CiAgICB9Owp9KTsvKiB2aW06dHM9NDpzdHM9NDpzdz00OgogKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqICAgICAgSXJha2xpIEdvemFsaXNodmlsaSA8cmZvYmljQGdtYWlsLmNvbT4gKGh0dHA6Ly9qZWRpdG9vbGtpdC5jb20pCiAqICAgICAgTWlrZSBkZSBCb2VyIDxtaWtlIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL2xpYi9ldmVudF9lbWl0dGVyJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIEV2ZW50RW1pdHRlciA9IHt9OwoKRXZlbnRFbWl0dGVyLl9lbWl0ID0KRXZlbnRFbWl0dGVyLl9kaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24oZXZlbnROYW1lLCBlKSB7CiAgICB0aGlzLl9ldmVudFJlZ2lzdHJ5ID0gdGhpcy5fZXZlbnRSZWdpc3RyeSB8fCB7fTsKICAgIHRoaXMuX2RlZmF1bHRIYW5kbGVycyA9IHRoaXMuX2RlZmF1bHRIYW5kbGVycyB8fCB7fTsKCiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdIHx8IFtdOwogICAgdmFyIGRlZmF1bHRIYW5kbGVyID0gdGhpcy5fZGVmYXVsdEhhbmRsZXJzW2V2ZW50TmFtZV07CiAgICBpZiAoIWxpc3RlbmVycy5sZW5ndGggJiYgIWRlZmF1bHRIYW5kbGVyKQogICAgICAgIHJldHVybjsKCiAgICBlID0gZSB8fCB7fTsKICAgIGUudHlwZSA9IGV2ZW50TmFtZTsKICAgIAogICAgaWYgKCFlLnN0b3BQcm9wYWdhdGlvbikgewogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZTsKICAgICAgICB9OwogICAgfQogICAgCiAgICBpZiAoIWUucHJldmVudERlZmF1bHQpIHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7CiAgICAgICAgfTsKICAgIH0KCiAgICBmb3IgKHZhciBpPTA7IGk8bGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbGlzdGVuZXJzW2ldKGUpOwogICAgICAgIGlmIChlLnByb3BhZ2F0aW9uU3RvcHBlZCkKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICAKICAgIGlmIChkZWZhdWx0SGFuZGxlciAmJiAhZS5kZWZhdWx0UHJldmVudGVkKQogICAgICAgIGRlZmF1bHRIYW5kbGVyKGUpOwp9OwoKRXZlbnRFbWl0dGVyLnNldERlZmF1bHRIYW5kbGVyID0gZnVuY3Rpb24oZXZlbnROYW1lLCBjYWxsYmFjaykgewogICAgdGhpcy5fZGVmYXVsdEhhbmRsZXJzID0gdGhpcy5fZGVmYXVsdEhhbmRsZXJzIHx8IHt9OwogICAgCiAgICBpZiAodGhpcy5fZGVmYXVsdEhhbmRsZXJzW2V2ZW50TmFtZV0pCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgZGVmYXVsdCBoYW5kbGVyIGZvciAnIiArIGV2ZW50TmFtZSArICInIGlzIGFscmVhZHkgc2V0Iik7CiAgICAgICAgCiAgICB0aGlzLl9kZWZhdWx0SGFuZGxlcnNbZXZlbnROYW1lXSA9IGNhbGxiYWNrOwp9OwoKRXZlbnRFbWl0dGVyLm9uID0KRXZlbnRFbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7CiAgICB0aGlzLl9ldmVudFJlZ2lzdHJ5ID0gdGhpcy5fZXZlbnRSZWdpc3RyeSB8fCB7fTsKCiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdOwogICAgaWYgKCFsaXN0ZW5lcnMpCiAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50UmVnaXN0cnlbZXZlbnROYW1lXSA9IFtdOwoKICAgIGlmIChsaXN0ZW5lcnMuaW5kZXhPZihjYWxsYmFjaykgPT0gLTEpCiAgICAgICAgbGlzdGVuZXJzLnB1c2goY2FsbGJhY2spOwp9OwoKRXZlbnRFbWl0dGVyLnJlbW92ZUxpc3RlbmVyID0KRXZlbnRFbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7CiAgICB0aGlzLl9ldmVudFJlZ2lzdHJ5ID0gdGhpcy5fZXZlbnRSZWdpc3RyeSB8fCB7fTsKCiAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdOwogICAgaWYgKCFsaXN0ZW5lcnMpCiAgICAgICAgcmV0dXJuOwoKICAgIHZhciBpbmRleCA9IGxpc3RlbmVycy5pbmRleE9mKGNhbGxiYWNrKTsKICAgIGlmIChpbmRleCAhPT0gLTEpCiAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7Cn07CgpFdmVudEVtaXR0ZXIucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnROYW1lKSB7CiAgICBpZiAodGhpcy5fZXZlbnRSZWdpc3RyeSkgdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdID0gW107Cn07CgpleHBvcnRzLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjsKCn0pOy8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL2xpYi9vb3AnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7CgpleHBvcnRzLmluaGVyaXRzID0gKGZ1bmN0aW9uKCkgewogICAgdmFyIHRlbXBDdG9yID0gZnVuY3Rpb24oKSB7fTsKICAgIHJldHVybiBmdW5jdGlvbihjdG9yLCBzdXBlckN0b3IpIHsKICAgICAgICB0ZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlOwogICAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yLnByb3RvdHlwZTsKICAgICAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyB0ZW1wQ3RvcigpOwogICAgICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvcjsKICAgIH07Cn0oKSk7CgpleHBvcnRzLm1peGluID0gZnVuY3Rpb24ob2JqLCBtaXhpbikgewogICAgZm9yICh2YXIga2V5IGluIG1peGluKSB7CiAgICAgICAgb2JqW2tleV0gPSBtaXhpbltrZXldOwogICAgfQp9OwoKZXhwb3J0cy5pbXBsZW1lbnQgPSBmdW5jdGlvbihwcm90bywgbWl4aW4pIHsKICAgIGV4cG9ydHMubWl4aW4ocHJvdG8sIG1peGluKTsKfTsKCn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCiAKZGVmaW5lKCdhY2UvbW9kZS9qYXZhc2NyaXB0X3dvcmtlcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2xpYi9vb3AnLCAnYWNlL3dvcmtlci9taXJyb3InLCAnYWNlL3dvcmtlci9qc2hpbnQnLCAnYWNlL25hcmNpc3N1cy9qc3BhcnNlJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7CiAgICAKdmFyIG9vcCA9IHJlcXVpcmUoIi4uL2xpYi9vb3AiKTsKdmFyIE1pcnJvciA9IHJlcXVpcmUoIi4uL3dvcmtlci9taXJyb3IiKS5NaXJyb3I7CnZhciBsaW50ID0gcmVxdWlyZSgiLi4vd29ya2VyL2pzaGludCIpLkpTSElOVDsKICAgIAp2YXIgSmF2YVNjcmlwdFdvcmtlciA9IGV4cG9ydHMuSmF2YVNjcmlwdFdvcmtlciA9IGZ1bmN0aW9uKHNlbmRlcikgewogICAgTWlycm9yLmNhbGwodGhpcywgc2VuZGVyKTsKICAgIHRoaXMuc2V0VGltZW91dCg1MDApOwp9OwoKb29wLmluaGVyaXRzKEphdmFTY3JpcHRXb3JrZXIsIE1pcnJvcik7CgooZnVuY3Rpb24oKSB7CiAgICAKICAgIHRoaXMub25VcGRhdGUgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmRvYy5nZXRWYWx1ZSgpOwogICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXiMhLipcbi8sICJcbiIpOwogICAgICAgIAovLyAgICAgICAgdmFyIHN0YXJ0ID0gbmV3IERhdGUoKTsKICAgICAgICB2YXIgcGFyc2VyID0gcmVxdWlyZSgiLi4vbmFyY2lzc3VzL2pzcGFyc2UiKTsKICAgICAgICB0cnkgewogICAgICAgICAgICBwYXJzZXIucGFyc2UodmFsdWUpOwogICAgICAgIH0gY2F0Y2goZSkgewovLyAgICAgICAgICAgIGNvbnNvbGUubG9nKCJuYXJjaXNzdXMiKQovLyAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpOwogICAgICAgICAgICB2YXIgY2h1bmtzID0gZS5tZXNzYWdlLnNwbGl0KCI6IikKICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBjaHVua3MucG9wKCkudHJpbSgpOwogICAgICAgICAgICB2YXIgbGluZU51bWJlciA9IHBhcnNlSW50KGNodW5rcy5wb3AoKS50cmltKCkpIC0gMTsKICAgICAgICAgICAgdGhpcy5zZW5kZXIuZW1pdCgibmFyY2lzc3VzIiwgewogICAgICAgICAgICAgICAgcm93OiBsaW5lTnVtYmVyLAogICAgICAgICAgICAgICAgY29sdW1uOiBudWxsLCAvLyBUT0RPIGNvbnZlcnQgZS5jdXJzb3IKICAgICAgICAgICAgICAgIHRleHQ6IG1lc3NhZ2UsCiAgICAgICAgICAgICAgICB0eXBlOiAiZXJyb3IiCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfSBmaW5hbGx5IHsKLy8gICAgICAgICAgICBjb25zb2xlLmxvZygicGFyc2UgdGltZTogIiArIChuZXcgRGF0ZSgpIC0gc3RhcnQpKTsKICAgICAgICB9CiAgICAgICAgCi8vICAgICAgICB2YXIgc3RhcnQgPSBuZXcgRGF0ZSgpOwovLyAgICAgICAgY29uc29sZS5sb2coImpzbGludCIpCiAgICAgICAgbGludCh2YWx1ZSwge3VuZGVmOiBmYWxzZSwgb25ldmFyOiBmYWxzZSwgcGFzc2ZhaWw6IGZhbHNlfSk7CiAgICAgICAgdGhpcy5zZW5kZXIuZW1pdCgianNsaW50IiwgbGludC5lcnJvcnMpOyAgICAgICAgCi8vICAgICAgICBjb25zb2xlLmxvZygibGludCB0aW1lOiAiICsgKG5ldyBEYXRlKCkgLSBzdGFydCkpOwogICAgfQogICAgCn0pLmNhbGwoSmF2YVNjcmlwdFdvcmtlci5wcm90b3R5cGUpOwoKfSk7ZGVmaW5lKCdhY2Uvd29ya2VyL21pcnJvcicsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL2RvY3VtZW50JywgJ2FjZS9saWIvbGFuZyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIERvY3VtZW50ID0gcmVxdWlyZSgiLi4vZG9jdW1lbnQiKS5Eb2N1bWVudDsKdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOwogICAgCnZhciBNaXJyb3IgPSBleHBvcnRzLk1pcnJvciA9IGZ1bmN0aW9uKHNlbmRlcikgewogICAgdGhpcy5zZW5kZXIgPSBzZW5kZXI7CiAgICB2YXIgZG9jID0gdGhpcy5kb2MgPSBuZXcgRG9jdW1lbnQoIiIpOwogICAgCiAgICB2YXIgZGVmZXJyZWRVcGRhdGUgPSB0aGlzLmRlZmVycmVkVXBkYXRlID0gbGFuZy5kZWZlcnJlZENhbGwodGhpcy5vblVwZGF0ZS5iaW5kKHRoaXMpKTsKICAgIAogICAgdmFyIF9zZWxmID0gdGhpczsKICAgIHNlbmRlci5vbigiY2hhbmdlIiwgZnVuY3Rpb24oZSkgewogICAgICAgIGRvYy5hcHBseURlbHRhcyhbZS5kYXRhXSk7ICAgICAgICAKICAgICAgICBkZWZlcnJlZFVwZGF0ZS5zY2hlZHVsZShfc2VsZi4kdGltZW91dCk7CiAgICB9KTsKfTsKCihmdW5jdGlvbigpIHsKICAgIAogICAgdGhpcy4kdGltZW91dCA9IDUwMDsKICAgIAogICAgdGhpcy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24odGltZW91dCkgewogICAgICAgIHRoaXMuJHRpbWVvdXQgPSB0aW1lb3V0OwogICAgfTsKICAgIAogICAgdGhpcy5zZXRWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgdGhpcy5kb2Muc2V0VmFsdWUodmFsdWUpOwogICAgICAgIHRoaXMuZGVmZXJyZWRVcGRhdGUuc2NoZWR1bGUodGhpcy4kdGltZW91dCk7CiAgICB9OwogICAgCiAgICB0aGlzLmdldFZhbHVlID0gZnVuY3Rpb24oY2FsbGJhY2tJZCkgewogICAgICAgIHRoaXMuc2VuZGVyLmNhbGxiYWNrKHRoaXMuZG9jLmdldFZhbHVlKCksIGNhbGxiYWNrSWQpOwogICAgfTsKICAgIAogICAgdGhpcy5vblVwZGF0ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIGFic3RyYWN0IG1ldGhvZAogICAgfTsKICAgIAp9KS5jYWxsKE1pcnJvci5wcm90b3R5cGUpOwoKfSk7LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvZG9jdW1lbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvZXZlbnRfZW1pdHRlcicsICdhY2UvcmFuZ2UnLCAnYWNlL2FuY2hvciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4vbGliL29vcCIpOwp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi9yYW5nZSIpLlJhbmdlOwp2YXIgQW5jaG9yID0gcmVxdWlyZSgiLi9hbmNob3IiKS5BbmNob3I7Cgp2YXIgRG9jdW1lbnQgPSBmdW5jdGlvbih0ZXh0KSB7CiAgICB0aGlzLiRsaW5lcyA9IFtdOwoKICAgIGlmIChBcnJheS5pc0FycmF5KHRleHQpKSB7CiAgICAgICAgdGhpcy5pbnNlcnRMaW5lcygwLCB0ZXh0KTsKICAgIH0KICAgIC8vIFRoZXJlIGhhcyB0byBiZSBvbmUgbGluZSBhdCBsZWFzdCBpbiB0aGUgZG9jdW1lbnQuIElmIHlvdSBwYXNzIGFuIGVtcHR5CiAgICAvLyBzdHJpbmcgdG8gdGhlIGluc2VydCBmdW5jdGlvbiwgbm90aGluZyB3aWxsIGhhcHBlbi4gV29ya2Fyb3VuZC4KICAgIGVsc2UgaWYgKHRleHQubGVuZ3RoID09IDApIHsKICAgICAgICB0aGlzLiRsaW5lcyA9IFsiIl07CiAgICB9IGVsc2UgewogICAgICAgIHRoaXMuaW5zZXJ0KHtyb3c6IDAsIGNvbHVtbjowfSwgdGV4dCk7CiAgICB9Cn07CgooZnVuY3Rpb24oKSB7CgogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOwoKICAgIHRoaXMuc2V0VmFsdWUgPSBmdW5jdGlvbih0ZXh0KSB7CiAgICAgICAgdmFyIGxlbiA9IHRoaXMuZ2V0TGVuZ3RoKCk7CiAgICAgICAgdGhpcy5yZW1vdmUobmV3IFJhbmdlKDAsIDAsIGxlbiwgdGhpcy5nZXRMaW5lKGxlbi0xKS5sZW5ndGgpKTsKICAgICAgICB0aGlzLmluc2VydCh7cm93OiAwLCBjb2x1bW46MH0sIHRleHQpOwogICAgfTsKCiAgICB0aGlzLmdldFZhbHVlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWxsTGluZXMoKS5qb2luKHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpKTsKICAgIH07CgogICAgdGhpcy5jcmVhdGVBbmNob3IgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIHJldHVybiBuZXcgQW5jaG9yKHRoaXMsIHJvdywgY29sdW1uKTsKICAgIH07CgogICAgLy8gY2hlY2sgZm9yIElFIHNwbGl0IGJ1ZwogICAgaWYgKCJhYWEiLnNwbGl0KC9hLykubGVuZ3RoID09IDApCiAgICAgICAgdGhpcy4kc3BsaXQgPSBmdW5jdGlvbih0ZXh0KSB7CiAgICAgICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL1xyXG58XHIvZywgIlxuIikuc3BsaXQoIlxuIik7CiAgICAgICAgfQogICAgZWxzZQogICAgICAgIHRoaXMuJHNwbGl0ID0gZnVuY3Rpb24odGV4dCkgewogICAgICAgICAgICByZXR1cm4gdGV4dC5zcGxpdCgvXHJcbnxccnxcbi8pOwogICAgICAgIH07CgoKICAgIHRoaXMuJGRldGVjdE5ld0xpbmUgPSBmdW5jdGlvbih0ZXh0KSB7CiAgICAgICAgdmFyIG1hdGNoID0gdGV4dC5tYXRjaCgvXi4qPyhcclxufFxyfFxuKS9tKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgdGhpcy4kYXV0b05ld0xpbmUgPSBtYXRjaFsxXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLiRhdXRvTmV3TGluZSA9ICJcbiI7CiAgICAgICAgfQogICAgfTsKCiAgICB0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIgPSBmdW5jdGlvbigpIHsKICAgICAgc3dpdGNoICh0aGlzLiRuZXdMaW5lTW9kZSkgewogICAgICAgICAgY2FzZSAid2luZG93cyI6CiAgICAgICAgICAgICAgcmV0dXJuICJcclxuIjsKCiAgICAgICAgICBjYXNlICJ1bml4IjoKICAgICAgICAgICAgICByZXR1cm4gIlxuIjsKCiAgICAgICAgICBjYXNlICJhdXRvIjoKICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kYXV0b05ld0xpbmU7CiAgICAgIH0KICAgIH07CgogICAgdGhpcy4kYXV0b05ld0xpbmUgPSAiXG4iOwogICAgdGhpcy4kbmV3TGluZU1vZGUgPSAiYXV0byI7CiAgICB0aGlzLnNldE5ld0xpbmVNb2RlID0gZnVuY3Rpb24obmV3TGluZU1vZGUpIHsKICAgICAgICBpZiAodGhpcy4kbmV3TGluZU1vZGUgPT09IG5ld0xpbmVNb2RlKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIHRoaXMuJG5ld0xpbmVNb2RlID0gbmV3TGluZU1vZGU7CiAgICB9OwoKICAgIHRoaXMuZ2V0TmV3TGluZU1vZGUgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy4kbmV3TGluZU1vZGU7CiAgICB9OwoKICAgIHRoaXMuaXNOZXdMaW5lID0gZnVuY3Rpb24odGV4dCkgewogICAgICAgIHJldHVybiAodGV4dCA9PSAiXHJcbiIgfHwgdGV4dCA9PSAiXHIiIHx8IHRleHQgPT0gIlxuIik7CiAgICB9OwoKICAgIC8qKgogICAgICogR2V0IGEgdmVyYmF0aW0gY29weSBvZiB0aGUgZ2l2ZW4gbGluZSBhcyBpdCBpcyBpbiB0aGUgZG9jdW1lbnQKICAgICAqLwogICAgdGhpcy5nZXRMaW5lID0gZnVuY3Rpb24ocm93KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJGxpbmVzW3Jvd10gfHwgIiI7CiAgICB9OwoKICAgIHRoaXMuZ2V0TGluZXMgPSBmdW5jdGlvbihmaXJzdFJvdywgbGFzdFJvdykgewogICAgICAgIHJldHVybiB0aGlzLiRsaW5lcy5zbGljZShmaXJzdFJvdywgbGFzdFJvdyArIDEpOwogICAgfTsKCiAgICAvKioKICAgICAqIFJldHVybnMgYWxsIGxpbmVzIGluIHRoZSBkb2N1bWVudCBhcyBzdHJpbmcgYXJyYXkuIFdhcm5pbmc6IFRoZSBjYWxsZXIKICAgICAqIHNob3VsZCBub3QgbW9kaWZ5IHRoaXMgYXJyYXkhCiAgICAgKi8KICAgIHRoaXMuZ2V0QWxsTGluZXMgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRMaW5lcygwLCB0aGlzLmdldExlbmd0aCgpKTsKICAgIH07CgogICAgdGhpcy5nZXRMZW5ndGggPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy4kbGluZXMubGVuZ3RoOwogICAgfTsKCiAgICB0aGlzLmdldFRleHRSYW5nZSA9IGZ1bmN0aW9uKHJhbmdlKSB7CiAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA9PSByYW5nZS5lbmQucm93KSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLiRsaW5lc1tyYW5nZS5zdGFydC5yb3ddLnN1YnN0cmluZyhyYW5nZS5zdGFydC5jb2x1bW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmVuZC5jb2x1bW4pOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdmFyIGxpbmVzID0gW107CiAgICAgICAgICAgIGxpbmVzLnB1c2godGhpcy4kbGluZXNbcmFuZ2Uuc3RhcnQucm93XS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uKSk7CiAgICAgICAgICAgIGxpbmVzLnB1c2guYXBwbHkobGluZXMsIHRoaXMuZ2V0TGluZXMocmFuZ2Uuc3RhcnQucm93KzEsIHJhbmdlLmVuZC5yb3ctMSkpOwogICAgICAgICAgICBsaW5lcy5wdXNoKHRoaXMuJGxpbmVzW3JhbmdlLmVuZC5yb3ddLnN1YnN0cmluZygwLCByYW5nZS5lbmQuY29sdW1uKSk7CiAgICAgICAgICAgIHJldHVybiBsaW5lcy5qb2luKHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpKTsKICAgICAgICB9CiAgICB9OwoKICAgIHRoaXMuJGNsaXBQb3NpdGlvbiA9IGZ1bmN0aW9uKHBvc2l0aW9uKSB7CiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMuZ2V0TGVuZ3RoKCk7CiAgICAgICAgaWYgKHBvc2l0aW9uLnJvdyA+PSBsZW5ndGgpIHsKICAgICAgICAgICAgcG9zaXRpb24ucm93ID0gTWF0aC5tYXgoMCwgbGVuZ3RoIC0gMSk7CiAgICAgICAgICAgIHBvc2l0aW9uLmNvbHVtbiA9IHRoaXMuZ2V0TGluZShsZW5ndGgtMSkubGVuZ3RoOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcG9zaXRpb247CiAgICB9OwoKICAgIHRoaXMuaW5zZXJ0ID0gZnVuY3Rpb24ocG9zaXRpb24sIHRleHQpIHsKICAgICAgICBpZiAodGV4dC5sZW5ndGggPT0gMCkKICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uOwoKICAgICAgICBwb3NpdGlvbiA9IHRoaXMuJGNsaXBQb3NpdGlvbihwb3NpdGlvbik7CgogICAgICAgIGlmICh0aGlzLmdldExlbmd0aCgpIDw9IDEpCiAgICAgICAgICAgIHRoaXMuJGRldGVjdE5ld0xpbmUodGV4dCk7CgogICAgICAgIHZhciBsaW5lcyA9IHRoaXMuJHNwbGl0KHRleHQpOwogICAgICAgIHZhciBmaXJzdExpbmUgPSBsaW5lcy5zcGxpY2UoMCwgMSlbMF07CiAgICAgICAgdmFyIGxhc3RMaW5lID0gbGluZXMubGVuZ3RoID09IDAgPyBudWxsIDogbGluZXMuc3BsaWNlKGxpbmVzLmxlbmd0aCAtIDEsIDEpWzBdOwoKICAgICAgICBwb3NpdGlvbiA9IHRoaXMuaW5zZXJ0SW5MaW5lKHBvc2l0aW9uLCBmaXJzdExpbmUpOwogICAgICAgIGlmIChsYXN0TGluZSAhPT0gbnVsbCkgewogICAgICAgICAgICBwb3NpdGlvbiA9IHRoaXMuaW5zZXJ0TmV3TGluZShwb3NpdGlvbik7IC8vIHRlcm1pbmF0ZSBmaXJzdCBsaW5lCiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5pbnNlcnRMaW5lcyhwb3NpdGlvbi5yb3csIGxpbmVzKTsKICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLmluc2VydEluTGluZShwb3NpdGlvbiwgbGFzdExpbmUgfHwgIiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcG9zaXRpb247CiAgICB9OwoKICAgIHRoaXMuaW5zZXJ0TGluZXMgPSBmdW5jdGlvbihyb3csIGxpbmVzKSB7CiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA9PSAwKQogICAgICAgICAgICByZXR1cm4ge3Jvdzogcm93LCBjb2x1bW46IDB9OwoKICAgICAgICB2YXIgYXJncyA9IFtyb3csIDBdOwogICAgICAgIGFyZ3MucHVzaC5hcHBseShhcmdzLCBsaW5lcyk7CiAgICAgICAgdGhpcy4kbGluZXMuc3BsaWNlLmFwcGx5KHRoaXMuJGxpbmVzLCBhcmdzKTsKCiAgICAgICAgdmFyIHJhbmdlID0gbmV3IFJhbmdlKHJvdywgMCwgcm93ICsgbGluZXMubGVuZ3RoLCAwKTsKICAgICAgICB2YXIgZGVsdGEgPSB7CiAgICAgICAgICAgIGFjdGlvbjogImluc2VydExpbmVzIiwKICAgICAgICAgICAgcmFuZ2U6IHJhbmdlLAogICAgICAgICAgICBsaW5lczogbGluZXMKICAgICAgICB9OwogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7CiAgICAgICAgcmV0dXJuIHJhbmdlLmVuZDsKICAgIH07CgogICAgdGhpcy5pbnNlcnROZXdMaW5lID0gZnVuY3Rpb24ocG9zaXRpb24pIHsKICAgICAgICBwb3NpdGlvbiA9IHRoaXMuJGNsaXBQb3NpdGlvbihwb3NpdGlvbik7CiAgICAgICAgdmFyIGxpbmUgPSB0aGlzLiRsaW5lc1twb3NpdGlvbi5yb3ddIHx8ICIiOwoKICAgICAgICB0aGlzLiRsaW5lc1twb3NpdGlvbi5yb3ddID0gbGluZS5zdWJzdHJpbmcoMCwgcG9zaXRpb24uY29sdW1uKTsKICAgICAgICB0aGlzLiRsaW5lcy5zcGxpY2UocG9zaXRpb24ucm93ICsgMSwgMCwgbGluZS5zdWJzdHJpbmcocG9zaXRpb24uY29sdW1uLCBsaW5lLmxlbmd0aCkpOwoKICAgICAgICB2YXIgZW5kID0gewogICAgICAgICAgICByb3cgOiBwb3NpdGlvbi5yb3cgKyAxLAogICAgICAgICAgICBjb2x1bW4gOiAwCiAgICAgICAgfTsKCiAgICAgICAgdmFyIGRlbHRhID0gewogICAgICAgICAgICBhY3Rpb246ICJpbnNlcnRUZXh0IiwKICAgICAgICAgICAgcmFuZ2U6IFJhbmdlLmZyb21Qb2ludHMocG9zaXRpb24sIGVuZCksCiAgICAgICAgICAgIHRleHQ6IHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpCiAgICAgICAgfTsKICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2UiLCB7IGRhdGE6IGRlbHRhIH0pOwoKICAgICAgICByZXR1cm4gZW5kOwogICAgfTsKCiAgICB0aGlzLmluc2VydEluTGluZSA9IGZ1bmN0aW9uKHBvc2l0aW9uLCB0ZXh0KSB7CiAgICAgICAgaWYgKHRleHQubGVuZ3RoID09IDApCiAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsKCiAgICAgICAgdmFyIGxpbmUgPSB0aGlzLiRsaW5lc1twb3NpdGlvbi5yb3ddIHx8ICIiOwoKICAgICAgICB0aGlzLiRsaW5lc1twb3NpdGlvbi5yb3ddID0gbGluZS5zdWJzdHJpbmcoMCwgcG9zaXRpb24uY29sdW1uKSArIHRleHQKICAgICAgICAgICAgICAgICsgbGluZS5zdWJzdHJpbmcocG9zaXRpb24uY29sdW1uKTsKCiAgICAgICAgdmFyIGVuZCA9IHsKICAgICAgICAgICAgcm93IDogcG9zaXRpb24ucm93LAogICAgICAgICAgICBjb2x1bW4gOiBwb3NpdGlvbi5jb2x1bW4gKyB0ZXh0Lmxlbmd0aAogICAgICAgIH07CgogICAgICAgIHZhciBkZWx0YSA9IHsKICAgICAgICAgICAgYWN0aW9uOiAiaW5zZXJ0VGV4dCIsCiAgICAgICAgICAgIHJhbmdlOiBSYW5nZS5mcm9tUG9pbnRzKHBvc2l0aW9uLCBlbmQpLAogICAgICAgICAgICB0ZXh0OiB0ZXh0CiAgICAgICAgfTsKICAgICAgICB0aGlzLl9lbWl0KCJjaGFuZ2UiLCB7IGRhdGE6IGRlbHRhIH0pOwoKICAgICAgICByZXR1cm4gZW5kOwogICAgfTsKCiAgICB0aGlzLnJlbW92ZSA9IGZ1bmN0aW9uKHJhbmdlKSB7CiAgICAgICAgLy8gY2xpcCB0byBkb2N1bWVudAogICAgICAgIHJhbmdlLnN0YXJ0ID0gdGhpcy4kY2xpcFBvc2l0aW9uKHJhbmdlLnN0YXJ0KTsKICAgICAgICByYW5nZS5lbmQgPSB0aGlzLiRjbGlwUG9zaXRpb24ocmFuZ2UuZW5kKTsKCiAgICAgICAgaWYgKHJhbmdlLmlzRW1wdHkoKSkKICAgICAgICAgICAgcmV0dXJuIHJhbmdlLnN0YXJ0OwoKICAgICAgICB2YXIgZmlyc3RSb3cgPSByYW5nZS5zdGFydC5yb3c7CiAgICAgICAgdmFyIGxhc3RSb3cgPSByYW5nZS5lbmQucm93OwoKICAgICAgICBpZiAocmFuZ2UuaXNNdWx0aUxpbmUoKSkgewogICAgICAgICAgICB2YXIgZmlyc3RGdWxsUm93ID0gcmFuZ2Uuc3RhcnQuY29sdW1uID09IDAgPyBmaXJzdFJvdyA6IGZpcnN0Um93ICsgMTsKICAgICAgICAgICAgdmFyIGxhc3RGdWxsUm93ID0gbGFzdFJvdyAtIDE7CgogICAgICAgICAgICBpZiAocmFuZ2UuZW5kLmNvbHVtbiA+IDApCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUluTGluZShsYXN0Um93LCAwLCByYW5nZS5lbmQuY29sdW1uKTsKCiAgICAgICAgICAgIGlmIChsYXN0RnVsbFJvdyA+PSBmaXJzdEZ1bGxSb3cpCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxpbmVzKGZpcnN0RnVsbFJvdywgbGFzdEZ1bGxSb3cpOwoKICAgICAgICAgICAgaWYgKGZpcnN0RnVsbFJvdyAhPSBmaXJzdFJvdykgewogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVJbkxpbmUoZmlyc3RSb3csIHJhbmdlLnN0YXJ0LmNvbHVtbiwgdGhpcy5nZXRMaW5lKGZpcnN0Um93KS5sZW5ndGgpOwogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVOZXdMaW5lKHJhbmdlLnN0YXJ0LnJvdyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMucmVtb3ZlSW5MaW5lKGZpcnN0Um93LCByYW5nZS5zdGFydC5jb2x1bW4sIHJhbmdlLmVuZC5jb2x1bW4pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmFuZ2Uuc3RhcnQ7CiAgICB9OwoKICAgIHRoaXMucmVtb3ZlSW5MaW5lID0gZnVuY3Rpb24ocm93LCBzdGFydENvbHVtbiwgZW5kQ29sdW1uKSB7CiAgICAgICAgaWYgKHN0YXJ0Q29sdW1uID09IGVuZENvbHVtbikKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICB2YXIgcmFuZ2UgPSBuZXcgUmFuZ2Uocm93LCBzdGFydENvbHVtbiwgcm93LCBlbmRDb2x1bW4pOwogICAgICAgIHZhciBsaW5lID0gdGhpcy5nZXRMaW5lKHJvdyk7CiAgICAgICAgdmFyIHJlbW92ZWQgPSBsaW5lLnN1YnN0cmluZyhzdGFydENvbHVtbiwgZW5kQ29sdW1uKTsKICAgICAgICB2YXIgbmV3TGluZSA9IGxpbmUuc3Vic3RyaW5nKDAsIHN0YXJ0Q29sdW1uKSArIGxpbmUuc3Vic3RyaW5nKGVuZENvbHVtbiwgbGluZS5sZW5ndGgpOwogICAgICAgIHRoaXMuJGxpbmVzLnNwbGljZShyb3csIDEsIG5ld0xpbmUpOwoKICAgICAgICB2YXIgZGVsdGEgPSB7CiAgICAgICAgICAgIGFjdGlvbjogInJlbW92ZVRleHQiLAogICAgICAgICAgICByYW5nZTogcmFuZ2UsCiAgICAgICAgICAgIHRleHQ6IHJlbW92ZWQKICAgICAgICB9OwogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7CiAgICAgICAgcmV0dXJuIHJhbmdlLnN0YXJ0OwogICAgfTsKCiAgICAvKioKICAgICAqIFJlbW92ZXMgYSByYW5nZSBvZiBmdWxsIGxpbmVzCiAgICAgKgogICAgICogQHBhcmFtIGZpcnN0Um93IHtJbnRlZ2VyfSBUaGUgZmlyc3Qgcm93IHRvIGJlIHJlbW92ZWQKICAgICAqIEBwYXJhbSBsYXN0Um93IHtJbnRlZ2VyfSBUaGUgbGFzdCByb3cgdG8gYmUgcmVtb3ZlZAogICAgICogQHJldHVybiB7U3RyaW5nW119IFRoZSByZW1vdmVkIGxpbmVzCiAgICAgKi8KICAgIHRoaXMucmVtb3ZlTGluZXMgPSBmdW5jdGlvbihmaXJzdFJvdywgbGFzdFJvdykgewogICAgICAgIHZhciByYW5nZSA9IG5ldyBSYW5nZShmaXJzdFJvdywgMCwgbGFzdFJvdyArIDEsIDApOwogICAgICAgIHZhciByZW1vdmVkID0gdGhpcy4kbGluZXMuc3BsaWNlKGZpcnN0Um93LCBsYXN0Um93IC0gZmlyc3RSb3cgKyAxKTsKCiAgICAgICAgdmFyIGRlbHRhID0gewogICAgICAgICAgICBhY3Rpb246ICJyZW1vdmVMaW5lcyIsCiAgICAgICAgICAgIHJhbmdlOiByYW5nZSwKICAgICAgICAgICAgbmw6IHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpLAogICAgICAgICAgICBsaW5lczogcmVtb3ZlZAogICAgICAgIH07CiAgICAgICAgdGhpcy5fZW1pdCgiY2hhbmdlIiwgeyBkYXRhOiBkZWx0YSB9KTsKICAgICAgICByZXR1cm4gcmVtb3ZlZDsKICAgIH07CgogICAgdGhpcy5yZW1vdmVOZXdMaW5lID0gZnVuY3Rpb24ocm93KSB7CiAgICAgICAgdmFyIGZpcnN0TGluZSA9IHRoaXMuZ2V0TGluZShyb3cpOwogICAgICAgIHZhciBzZWNvbmRMaW5lID0gdGhpcy5nZXRMaW5lKHJvdysxKTsKCiAgICAgICAgdmFyIHJhbmdlID0gbmV3IFJhbmdlKHJvdywgZmlyc3RMaW5lLmxlbmd0aCwgcm93KzEsIDApOwogICAgICAgIHZhciBsaW5lID0gZmlyc3RMaW5lICsgc2Vjb25kTGluZTsKCiAgICAgICAgdGhpcy4kbGluZXMuc3BsaWNlKHJvdywgMiwgbGluZSk7CgogICAgICAgIHZhciBkZWx0YSA9IHsKICAgICAgICAgICAgYWN0aW9uOiAicmVtb3ZlVGV4dCIsCiAgICAgICAgICAgIHJhbmdlOiByYW5nZSwKICAgICAgICAgICAgdGV4dDogdGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkKICAgICAgICB9OwogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsgZGF0YTogZGVsdGEgfSk7CiAgICB9OwoKICAgIHRoaXMucmVwbGFjZSA9IGZ1bmN0aW9uKHJhbmdlLCB0ZXh0KSB7CiAgICAgICAgaWYgKHRleHQubGVuZ3RoID09IDAgJiYgcmFuZ2UuaXNFbXB0eSgpKQogICAgICAgICAgICByZXR1cm4gcmFuZ2Uuc3RhcnQ7CgogICAgICAgIC8vIFNob3J0Y3V0OiBJZiB0aGUgdGV4dCB3ZSB3YW50IHRvIGluc2VydCBpcyB0aGUgc2FtZSBhcyBpdCBpcyBhbHJlYWR5CiAgICAgICAgLy8gaW4gdGhlIGRvY3VtZW50LCB3ZSBkb24ndCBoYXZlIHRvIHJlcGxhY2UgYW55dGhpbmcuCiAgICAgICAgaWYgKHRleHQgPT0gdGhpcy5nZXRUZXh0UmFuZ2UocmFuZ2UpKQogICAgICAgICAgICByZXR1cm4gcmFuZ2UuZW5kOwoKICAgICAgICB0aGlzLnJlbW92ZShyYW5nZSk7CiAgICAgICAgaWYgKHRleHQpIHsKICAgICAgICAgICAgdmFyIGVuZCA9IHRoaXMuaW5zZXJ0KHJhbmdlLnN0YXJ0LCB0ZXh0KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGVuZCA9IHJhbmdlLnN0YXJ0OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGVuZDsKICAgIH07CgogICAgdGhpcy5hcHBseURlbHRhcyA9IGZ1bmN0aW9uKGRlbHRhcykgewogICAgICAgIGZvciAodmFyIGk9MDsgaTxkZWx0YXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGRlbHRhID0gZGVsdGFzW2ldOwogICAgICAgICAgICB2YXIgcmFuZ2UgPSBSYW5nZS5mcm9tUG9pbnRzKGRlbHRhLnJhbmdlLnN0YXJ0LCBkZWx0YS5yYW5nZS5lbmQpOwoKICAgICAgICAgICAgaWYgKGRlbHRhLmFjdGlvbiA9PSAiaW5zZXJ0TGluZXMiKQogICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRMaW5lcyhyYW5nZS5zdGFydC5yb3csIGRlbHRhLmxpbmVzKTsKICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJpbnNlcnRUZXh0IikKICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0KHJhbmdlLnN0YXJ0LCBkZWx0YS50ZXh0KTsKICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09ICJyZW1vdmVMaW5lcyIpCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxpbmVzKHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2UuZW5kLnJvdyAtIDEpOwogICAgICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZVRleHQiKQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUocmFuZ2UpOwogICAgICAgIH0KICAgIH07CgogICAgdGhpcy5yZXZlcnREZWx0YXMgPSBmdW5jdGlvbihkZWx0YXMpIHsKICAgICAgICBmb3IgKHZhciBpPWRlbHRhcy5sZW5ndGgtMTsgaT49MDsgaS0tKSB7CiAgICAgICAgICAgIHZhciBkZWx0YSA9IGRlbHRhc1tpXTsKCiAgICAgICAgICAgIHZhciByYW5nZSA9IFJhbmdlLmZyb21Qb2ludHMoZGVsdGEucmFuZ2Uuc3RhcnQsIGRlbHRhLnJhbmdlLmVuZCk7CgogICAgICAgICAgICBpZiAoZGVsdGEuYWN0aW9uID09ICJpbnNlcnRMaW5lcyIpCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxpbmVzKHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2UuZW5kLnJvdyAtIDEpOwogICAgICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gImluc2VydFRleHQiKQogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUocmFuZ2UpOwogICAgICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZUxpbmVzIikKICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0TGluZXMocmFuZ2Uuc3RhcnQucm93LCBkZWx0YS5saW5lcyk7CiAgICAgICAgICAgIGVsc2UgaWYgKGRlbHRhLmFjdGlvbiA9PSAicmVtb3ZlVGV4dCIpCiAgICAgICAgICAgICAgICB0aGlzLmluc2VydChyYW5nZS5zdGFydCwgZGVsdGEudGV4dCk7CiAgICAgICAgfQogICAgfTsKCn0pLmNhbGwoRG9jdW1lbnQucHJvdG90eXBlKTsKCmV4cG9ydHMuRG9jdW1lbnQgPSBEb2N1bWVudDsKfSk7Ci8qICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIEFqYXgub3JnIENvZGUgRWRpdG9yIChBQ0UpLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQWpheC5vcmcgQi5WLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDEwCiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgICAgRmFiaWFuIEpha29icyA8ZmFiaWFuIEFUIGFqYXggRE9UIG9yZz4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCmRlZmluZSgnYWNlL3JhbmdlJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIFJhbmdlID0gZnVuY3Rpb24oc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBlbmRSb3csIGVuZENvbHVtbikgewogICAgdGhpcy5zdGFydCA9IHsKICAgICAgICByb3c6IHN0YXJ0Um93LAogICAgICAgIGNvbHVtbjogc3RhcnRDb2x1bW4KICAgIH07CgogICAgdGhpcy5lbmQgPSB7CiAgICAgICAgcm93OiBlbmRSb3csCiAgICAgICAgY29sdW1uOiBlbmRDb2x1bW4KICAgIH07Cn07CgooZnVuY3Rpb24oKSB7CiAgICB0aGlzLmlzRWVxdWFsID0gZnVuY3Rpb24ocmFuZ2UpIHsKICAgICAgICByZXR1cm4gdGhpcy5zdGFydC5yb3cgPT0gcmFuZ2Uuc3RhcnQucm93ICYmCiAgICAgICAgICAgIHRoaXMuZW5kLnJvdyA9PSByYW5nZS5lbmQucm93ICYmCiAgICAgICAgICAgIHRoaXMuc3RhcnQuY29sdW1uID09IHJhbmdlLnN0YXJ0LmNvbHVtbiAmJgogICAgICAgICAgICB0aGlzLmVuZC5jb2x1bW4gPT0gcmFuZ2UuZW5kLmNvbHVtbgogICAgfTsKCiAgICB0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuICgiUmFuZ2U6IFsiICsgdGhpcy5zdGFydC5yb3cgKyAiLyIgKyB0aGlzLnN0YXJ0LmNvbHVtbiArCiAgICAgICAgICAgICJdIC0+IFsiICsgdGhpcy5lbmQucm93ICsgIi8iICsgdGhpcy5lbmQuY29sdW1uICsgIl0iKTsKICAgIH07CgogICAgdGhpcy5jb250YWlucyA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbikgPT0gMDsKICAgIH07CgogICAgLyoqCiAgICAgKiBDb21wYXJlcyB0aGlzIHJhbmdlIChBKSB3aXRoIGFub3RoZXIgcmFuZ2UgKEIpLCB3aGVyZSBCIGlzIHRoZSBwYXNzZWQgaW4KICAgICAqIHJhbmdlLgogICAgICoKICAgICAqIFJldHVybiB2YWx1ZXM6CiAgICAgKiAgLTI6IChCKSBpcyBpbmZyb250IG9mIChBKSBhbmQgZG9lc24ndCBpbnRlcnNlY3Qgd2l0aCAoQSkKICAgICAqICAtMTogKEIpIGJlZ2lucyBiZWZvcmUgKEEpIGJ1dCBlbmRzIGluc2lkZSBvZiAoQSkKICAgICAqICAgMDogKEIpIGlzIGNvbXBsZXRseSBpbnNpZGUgb2YgKEEpIE9SIChBKSBpcyBjb21wbGV0eSBpbnNpZGUgb2YgKEIpCiAgICAgKiAgKzE6IChCKSBiZWdpbnMgaW5zaWRlIG9mIChBKSBidXQgZW5kcyBvdXRzaWRlIG9mIChBKQogICAgICogICsyOiAoQikgaXMgYWZ0ZXIgKEEpIGFuZCBkb2Vzbid0IGludGVyc2VjdCB3aXRoIChBKQogICAgICoKICAgICAqICA0MjogRlRXIHN0YXRlOiAoQikgZW5kcyBpbiAoQSkgYnV0IHN0YXJ0cyBvdXRzaWRlIG9mIChBKQogICAgICovCiAgICB0aGlzLmNvbXBhcmVSYW5nZSA9IGZ1bmN0aW9uKHJhbmdlKSB7CiAgICAgICAgdmFyIGNtcCwKICAgICAgICAgICAgZW5kID0gcmFuZ2UuZW5kLAogICAgICAgICAgICBzdGFydCA9IHJhbmdlLnN0YXJ0OwoKICAgICAgICBjbXAgPSB0aGlzLmNvbXBhcmUoZW5kLnJvdywgZW5kLmNvbHVtbik7CiAgICAgICAgaWYgKGNtcCA9PSAxKSB7CiAgICAgICAgICAgIGNtcCA9IHRoaXMuY29tcGFyZShzdGFydC5yb3csIHN0YXJ0LmNvbHVtbik7CiAgICAgICAgICAgIGlmIChjbXAgPT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoY21wID09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGNtcCA9PSAtMSkgewogICAgICAgICAgICByZXR1cm4gLTI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY21wID0gdGhpcy5jb21wYXJlKHN0YXJ0LnJvdywgc3RhcnQuY29sdW1uKTsKICAgICAgICAgICAgaWYgKGNtcCA9PSAtMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9IGVsc2UgaWYgKGNtcCA9PSAxKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gNDI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICB0aGlzLmNvbXBhcmVQb2ludCA9IGZ1bmN0aW9uKHApIHsKICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlKHAucm93LCBwLmNvbHVtbik7CiAgICB9CgogICAgdGhpcy5jb250YWluc1JhbmdlID0gZnVuY3Rpb24ocmFuZ2UpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlUG9pbnQocmFuZ2Uuc3RhcnQpID09IDAgJiYgdGhpcy5jb21wYXJlUG9pbnQocmFuZ2UuZW5kKSA9PSAwOwogICAgfQoKICAgIHRoaXMuaXNFbmQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIHJldHVybiB0aGlzLmVuZC5yb3cgPT0gcm93ICYmIHRoaXMuZW5kLmNvbHVtbiA9PSBjb2x1bW47CiAgICB9CgogICAgdGhpcy5pc1N0YXJ0ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsKICAgICAgICByZXR1cm4gdGhpcy5zdGFydC5yb3cgPT0gcm93ICYmIHRoaXMuc3RhcnQuY29sdW1uID09IGNvbHVtbjsKICAgIH0KCiAgICB0aGlzLnNldFN0YXJ0ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsKICAgICAgICBpZiAodHlwZW9mIHJvdyA9PSAib2JqZWN0IikgewogICAgICAgICAgICB0aGlzLnN0YXJ0LmNvbHVtbiA9IHJvdy5jb2x1bW47CiAgICAgICAgICAgIHRoaXMuc3RhcnQucm93ID0gcm93LnJvdzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLnN0YXJ0LnJvdyA9IHJvdzsKICAgICAgICAgICAgdGhpcy5zdGFydC5jb2x1bW4gPSBjb2x1bW47CiAgICAgICAgfQogICAgfQoKICAgIHRoaXMuc2V0RW5kID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsKICAgICAgICBpZiAodHlwZW9mIHJvdyA9PSAib2JqZWN0IikgewogICAgICAgICAgICB0aGlzLmVuZC5jb2x1bW4gPSByb3cuY29sdW1uOwogICAgICAgICAgICB0aGlzLmVuZC5yb3cgPSByb3cucm93OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMuZW5kLnJvdyA9IHJvdzsKICAgICAgICAgICAgdGhpcy5lbmQuY29sdW1uID0gY29sdW1uOwogICAgICAgIH0KICAgIH0KCiAgICB0aGlzLmluc2lkZSA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7CiAgICAgICAgaWYgKHRoaXMuY29tcGFyZShyb3csIGNvbHVtbikgPT0gMCkgewogICAgICAgICAgICBpZiAodGhpcy5pc0VuZChyb3csIGNvbHVtbikgfHwgdGhpcy5pc1N0YXJ0KHJvdywgY29sdW1uKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHRoaXMuaW5zaWRlU3RhcnQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIGlmICh0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pID09IDApIHsKICAgICAgICAgICAgaWYgKHRoaXMuaXNFbmQocm93LCBjb2x1bW4pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgdGhpcy5pbnNpZGVFbmQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIGlmICh0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pID09IDApIHsKICAgICAgICAgICAgaWYgKHRoaXMuaXNTdGFydChyb3csIGNvbHVtbikpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICB0aGlzLmNvbXBhcmUgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIGlmICghdGhpcy5pc011bHRpTGluZSgpKSB7CiAgICAgICAgICAgIGlmIChyb3cgPT09IHRoaXMuc3RhcnQucm93KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uIDwgdGhpcy5zdGFydC5jb2x1bW4gPyAtMSA6IChjb2x1bW4gPiB0aGlzLmVuZC5jb2x1bW4gPyAxIDogMCk7CiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBpZiAocm93IDwgdGhpcy5zdGFydC5yb3cpCiAgICAgICAgICAgIHJldHVybiAtMTsKCiAgICAgICAgaWYgKHJvdyA+IHRoaXMuZW5kLnJvdykKICAgICAgICAgICAgcmV0dXJuIDE7CgogICAgICAgIGlmICh0aGlzLnN0YXJ0LnJvdyA9PT0gcm93KQogICAgICAgICAgICByZXR1cm4gY29sdW1uID49IHRoaXMuc3RhcnQuY29sdW1uID8gMCA6IC0xOwoKICAgICAgICBpZiAodGhpcy5lbmQucm93ID09PSByb3cpCiAgICAgICAgICAgIHJldHVybiBjb2x1bW4gPD0gdGhpcy5lbmQuY29sdW1uID8gMCA6IDE7CgogICAgICAgIHJldHVybiAwOwogICAgfTsKCiAgICAvKioKICAgICAqIExpa2UgLmNvbXBhcmUoKSwgYnV0IGlmIGlzU3RhcnQgaXMgdHJ1ZSwgcmV0dXJuIC0xOwogICAgICovCiAgICB0aGlzLmNvbXBhcmVTdGFydCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7CiAgICAgICAgaWYgKHRoaXMuc3RhcnQucm93ID09IHJvdyAmJiB0aGlzLnN0YXJ0LmNvbHVtbiA9PSBjb2x1bW4pIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIExpa2UgLmNvbXBhcmUoKSwgYnV0IGlmIGlzRW5kIGlzIHRydWUsIHJldHVybiAxOwogICAgICovCiAgICB0aGlzLmNvbXBhcmVFbmQgPSBmdW5jdGlvbihyb3csIGNvbHVtbikgewogICAgICAgIGlmICh0aGlzLmVuZC5yb3cgPT0gcm93ICYmIHRoaXMuZW5kLmNvbHVtbiA9PSBjb2x1bW4pIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbik7CiAgICAgICAgfQogICAgfQoKICAgIHRoaXMuY29tcGFyZUluc2lkZSA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7CiAgICAgICAgaWYgKHRoaXMuZW5kLnJvdyA9PSByb3cgJiYgdGhpcy5lbmQuY29sdW1uID09IGNvbHVtbikgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhcnQucm93ID09IHJvdyAmJiB0aGlzLnN0YXJ0LmNvbHVtbiA9PSBjb2x1bW4pIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pOwogICAgICAgIH0KICAgIH0KCiAgICB0aGlzLmNsaXBSb3dzID0gZnVuY3Rpb24oZmlyc3RSb3csIGxhc3RSb3cpIHsKICAgICAgICBpZiAodGhpcy5lbmQucm93ID4gbGFzdFJvdykgewogICAgICAgICAgICB2YXIgZW5kID0gewogICAgICAgICAgICAgICAgcm93OiBsYXN0Um93KzEsCiAgICAgICAgICAgICAgICBjb2x1bW46IDAKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIGlmICh0aGlzLnN0YXJ0LnJvdyA+IGxhc3RSb3cpIHsKICAgICAgICAgICAgdmFyIHN0YXJ0ID0gewogICAgICAgICAgICAgICAgcm93OiBsYXN0Um93KzEsCiAgICAgICAgICAgICAgICBjb2x1bW46IDAKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIGlmICh0aGlzLnN0YXJ0LnJvdyA8IGZpcnN0Um93KSB7CiAgICAgICAgICAgIHZhciBzdGFydCA9IHsKICAgICAgICAgICAgICAgIHJvdzogZmlyc3RSb3csCiAgICAgICAgICAgICAgICBjb2x1bW46IDAKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIGlmICh0aGlzLmVuZC5yb3cgPCBmaXJzdFJvdykgewogICAgICAgICAgICB2YXIgZW5kID0gewogICAgICAgICAgICAgICAgcm93OiBmaXJzdFJvdywKICAgICAgICAgICAgICAgIGNvbHVtbjogMAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyhzdGFydCB8fCB0aGlzLnN0YXJ0LCBlbmQgfHwgdGhpcy5lbmQpOwogICAgfTsKCiAgICB0aGlzLmV4dGVuZCA9IGZ1bmN0aW9uKHJvdywgY29sdW1uKSB7CiAgICAgICAgdmFyIGNtcCA9IHRoaXMuY29tcGFyZShyb3csIGNvbHVtbik7CgogICAgICAgIGlmIChjbXAgPT0gMCkKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgZWxzZSBpZiAoY21wID09IC0xKQogICAgICAgICAgICB2YXIgc3RhcnQgPSB7cm93OiByb3csIGNvbHVtbjogY29sdW1ufTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHZhciBlbmQgPSB7cm93OiByb3csIGNvbHVtbjogY29sdW1ufTsKCiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQgfHwgdGhpcy5zdGFydCwgZW5kIHx8IHRoaXMuZW5kKTsKICAgIH07CgogICAgdGhpcy5pc0VtcHR5ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuICh0aGlzLnN0YXJ0LnJvdyA9PSB0aGlzLmVuZC5yb3cgJiYgdGhpcy5zdGFydC5jb2x1bW4gPT0gdGhpcy5lbmQuY29sdW1uKTsKICAgIH07CgogICAgdGhpcy5pc011bHRpTGluZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAodGhpcy5zdGFydC5yb3cgIT09IHRoaXMuZW5kLnJvdyk7CiAgICB9OwoKICAgIHRoaXMuY2xvbmUgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gUmFuZ2UuZnJvbVBvaW50cyh0aGlzLnN0YXJ0LCB0aGlzLmVuZCk7CiAgICB9OwoKICAgIHRoaXMuY29sbGFwc2VSb3dzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuZW5kLmNvbHVtbiA9PSAwKQogICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHRoaXMuc3RhcnQucm93LCAwLCBNYXRoLm1heCh0aGlzLnN0YXJ0LnJvdywgdGhpcy5lbmQucm93LTEpLCAwKQogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZSh0aGlzLnN0YXJ0LnJvdywgMCwgdGhpcy5lbmQucm93LCAwKQogICAgfTsKCiAgICB0aGlzLnRvU2NyZWVuUmFuZ2UgPSBmdW5jdGlvbihzZXNzaW9uKSB7CiAgICAgICAgdmFyIHNjcmVlblBvc1N0YXJ0ID0KICAgICAgICAgICAgc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24odGhpcy5zdGFydCk7CiAgICAgICAgdmFyIHNjcmVlblBvc0VuZCA9CiAgICAgICAgICAgIHNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHRoaXMuZW5kKTsKCiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZSgKICAgICAgICAgICAgc2NyZWVuUG9zU3RhcnQucm93LCBzY3JlZW5Qb3NTdGFydC5jb2x1bW4sCiAgICAgICAgICAgIHNjcmVlblBvc0VuZC5yb3csIHNjcmVlblBvc0VuZC5jb2x1bW4KICAgICAgICApOwogICAgfTsKCn0pLmNhbGwoUmFuZ2UucHJvdG90eXBlKTsKCgpSYW5nZS5mcm9tUG9pbnRzID0gZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgcmV0dXJuIG5ldyBSYW5nZShzdGFydC5yb3csIHN0YXJ0LmNvbHVtbiwgZW5kLnJvdywgZW5kLmNvbHVtbik7Cn07CgpleHBvcnRzLlJhbmdlID0gUmFuZ2U7Cn0pOwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBBamF4Lm9yZyBDb2RlIEVkaXRvciAoQUNFKS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEFqYXgub3JnIEIuVi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAxMAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEZhYmlhbiBKYWtvYnMgPGZhYmlhbiBBVCBhamF4IERPVCBvcmc+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgpkZWZpbmUoJ2FjZS9hbmNob3InLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9saWIvb29wJywgJ2FjZS9saWIvZXZlbnRfZW1pdHRlciddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIG9vcCA9IHJlcXVpcmUoIi4vbGliL29vcCIpOwp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsKCi8qKgogKiBBbiBBbmNob3IgaXMgYSBmbG9hdGluZyBwb2ludGVyIGluIHRoZSBkb2N1bWVudC4gV2hlbmV2ZXIgdGV4dCBpcyBpbnNlcnRlZCBvcgogKiBkZWxldGVkIGJlZm9yZSB0aGUgY3Vyc29yLCB0aGUgcG9zaXRpb24gb2YgdGhlIGN1cnNvciBpcyB1cGRhdGVkCiAqLwp2YXIgQW5jaG9yID0gZXhwb3J0cy5BbmNob3IgPSBmdW5jdGlvbihkb2MsIHJvdywgY29sdW1uKSB7CiAgICB0aGlzLmRvY3VtZW50ID0gZG9jOwogICAgCiAgICBpZiAodHlwZW9mIGNvbHVtbiA9PSAidW5kZWZpbmVkIikKICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHJvdy5yb3csIHJvdy5jb2x1bW4pOwogICAgZWxzZQogICAgICAgIHRoaXMuc2V0UG9zaXRpb24ocm93LCBjb2x1bW4pOwoKICAgIHRoaXMuJG9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpOwogICAgZG9jLm9uKCJjaGFuZ2UiLCB0aGlzLiRvbkNoYW5nZSk7Cn07CgooZnVuY3Rpb24oKSB7CgogICAgb29wLmltcGxlbWVudCh0aGlzLCBFdmVudEVtaXR0ZXIpOwogICAgCiAgICB0aGlzLmdldFBvc2l0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQodGhpcy5yb3csIHRoaXMuY29sdW1uKTsKICAgIH07CiAgICAKICAgIHRoaXMuZ2V0RG9jdW1lbnQgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudDsKICAgIH07CiAgICAKICAgIHRoaXMub25DaGFuZ2UgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgdmFyIGRlbHRhID0gZS5kYXRhOwogICAgICAgIHZhciByYW5nZSA9IGRlbHRhLnJhbmdlOwogICAgICAgICAgICAKICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09IHJhbmdlLmVuZC5yb3cgJiYgcmFuZ2Uuc3RhcnQucm93ICE9IHRoaXMucm93KQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIAogICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPiB0aGlzLnJvdykKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAKICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09IHRoaXMucm93ICYmIHJhbmdlLnN0YXJ0LmNvbHVtbiA+IHRoaXMuY29sdW1uKQogICAgICAgICAgICByZXR1cm47CiAgICAKICAgICAgICB2YXIgcm93ID0gdGhpcy5yb3c7CiAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMuY29sdW1uOwogICAgICAgIAogICAgICAgIGlmIChkZWx0YS5hY3Rpb24gPT09ICJpbnNlcnRUZXh0IikgewogICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93ID09PSByb3cgJiYgcmFuZ2Uuc3RhcnQuY29sdW1uIDw9IGNvbHVtbikgewogICAgICAgICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0LnJvdyA9PT0gcmFuZ2UuZW5kLnJvdykgewogICAgICAgICAgICAgICAgICAgIGNvbHVtbiArPSByYW5nZS5lbmQuY29sdW1uIC0gcmFuZ2Uuc3RhcnQuY29sdW1uOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY29sdW1uIC09IHJhbmdlLnN0YXJ0LmNvbHVtbjsKICAgICAgICAgICAgICAgICAgICByb3cgKz0gcmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChyYW5nZS5zdGFydC5yb3cgIT09IHJhbmdlLmVuZC5yb3cgJiYgcmFuZ2Uuc3RhcnQucm93IDwgcm93KSB7CiAgICAgICAgICAgICAgICByb3cgKz0gcmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdzsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoZGVsdGEuYWN0aW9uID09PSAiaW5zZXJ0TGluZXMiKSB7CiAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPD0gcm93KSB7CiAgICAgICAgICAgICAgICByb3cgKz0gcmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZVRleHQiKSB7CiAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT0gcm93ICYmIHJhbmdlLnN0YXJ0LmNvbHVtbiA8IGNvbHVtbikgewogICAgICAgICAgICAgICAgaWYgKHJhbmdlLmVuZC5jb2x1bW4gPj0gY29sdW1uKQogICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IHJhbmdlLnN0YXJ0LmNvbHVtbjsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSBNYXRoLm1heCgwLCBjb2x1bW4gLSAocmFuZ2UuZW5kLmNvbHVtbiAtIHJhbmdlLnN0YXJ0LmNvbHVtbikpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0gZWxzZSBpZiAocmFuZ2Uuc3RhcnQucm93ICE9PSByYW5nZS5lbmQucm93ICYmIHJhbmdlLnN0YXJ0LnJvdyA8IHJvdykgewogICAgICAgICAgICAgICAgaWYgKHJhbmdlLmVuZC5yb3cgPT0gcm93KSB7CiAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gTWF0aC5tYXgoMCwgY29sdW1uIC0gcmFuZ2UuZW5kLmNvbHVtbikgKyByYW5nZS5zdGFydC5jb2x1bW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByb3cgLT0gKHJhbmdlLmVuZC5yb3cgLSByYW5nZS5zdGFydC5yb3cpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHJhbmdlLmVuZC5yb3cgPT0gcm93KSB7CiAgICAgICAgICAgICAgICByb3cgLT0gcmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdzsKICAgICAgICAgICAgICAgIGNvbHVtbiA9IE1hdGgubWF4KDAsIGNvbHVtbiAtIHJhbmdlLmVuZC5jb2x1bW4pICsgcmFuZ2Uuc3RhcnQuY29sdW1uOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZUxpbmVzIikgewogICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnQucm93IDw9IHJvdykgewogICAgICAgICAgICAgICAgaWYgKHJhbmdlLmVuZC5yb3cgPD0gcm93KQogICAgICAgICAgICAgICAgICAgIHJvdyAtPSByYW5nZS5lbmQucm93IC0gcmFuZ2Uuc3RhcnQucm93OwogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcm93ID0gcmFuZ2Uuc3RhcnQucm93OwogICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRoaXMuc2V0UG9zaXRpb24ocm93LCBjb2x1bW4sIHRydWUpOwogICAgfTsKCiAgICB0aGlzLnNldFBvc2l0aW9uID0gZnVuY3Rpb24ocm93LCBjb2x1bW4sIG5vQ2xpcCkgewogICAgICAgIHZhciBwb3M7CiAgICAgICAgaWYgKG5vQ2xpcCkgewogICAgICAgICAgICBwb3MgPSB7CiAgICAgICAgICAgICAgICByb3c6IHJvdywKICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwb3MgPSB0aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50KHJvdywgY29sdW1uKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKHRoaXMucm93ID09IHBvcy5yb3cgJiYgdGhpcy5jb2x1bW4gPT0gcG9zLmNvbHVtbikKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAKICAgICAgICB2YXIgb2xkID0gewogICAgICAgICAgICByb3c6IHRoaXMucm93LAogICAgICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uCiAgICAgICAgfTsKICAgICAgICAKICAgICAgICB0aGlzLnJvdyA9IHBvcy5yb3c7CiAgICAgICAgdGhpcy5jb2x1bW4gPSBwb3MuY29sdW1uOwogICAgICAgIHRoaXMuX2VtaXQoImNoYW5nZSIsIHsKICAgICAgICAgICAgb2xkOiBvbGQsCiAgICAgICAgICAgIHZhbHVlOiBwb3MKICAgICAgICB9KTsKICAgIH07CiAgICAKICAgIHRoaXMuZGV0YWNoID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCB0aGlzLiRvbkNoYW5nZSk7CiAgICB9OwogICAgCiAgICB0aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50ID0gZnVuY3Rpb24ocm93LCBjb2x1bW4pIHsKICAgICAgICB2YXIgcG9zID0ge307CiAgICAKICAgICAgICBpZiAocm93ID49IHRoaXMuZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsKICAgICAgICAgICAgcG9zLnJvdyA9IE1hdGgubWF4KDAsIHRoaXMuZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgLSAxKTsKICAgICAgICAgICAgcG9zLmNvbHVtbiA9IHRoaXMuZG9jdW1lbnQuZ2V0TGluZShwb3Mucm93KS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHJvdyA8IDApIHsKICAgICAgICAgICAgcG9zLnJvdyA9IDA7CiAgICAgICAgICAgIHBvcy5jb2x1bW4gPSAwOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcG9zLnJvdyA9IHJvdzsKICAgICAgICAgICAgcG9zLmNvbHVtbiA9IE1hdGgubWluKHRoaXMuZG9jdW1lbnQuZ2V0TGluZShwb3Mucm93KS5sZW5ndGgsIE1hdGgubWF4KDAsIGNvbHVtbikpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoY29sdW1uIDwgMCkKICAgICAgICAgICAgcG9zLmNvbHVtbiA9IDA7CiAgICAgICAgICAgIAogICAgICAgIHJldHVybiBwb3M7CiAgICB9OwogICAgCn0pLmNhbGwoQW5jaG9yLnByb3RvdHlwZSk7Cgp9KTsKLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgQWpheC5vcmcgQ29kZSBFZGl0b3IgKEFDRSkuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBBamF4Lm9yZyBCLlYuCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMTAKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICAgICBGYWJpYW4gSmFrb2JzIDxmYWJpYW4gQVQgYWpheCBET1Qgb3JnPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKZGVmaW5lKCdhY2UvbGliL2xhbmcnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoidXNlIHN0cmljdCI7CgpleHBvcnRzLnN0cmluZ1JldmVyc2UgPSBmdW5jdGlvbihzdHJpbmcpIHsKICAgIHJldHVybiBzdHJpbmcuc3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKTsKfTsKCmV4cG9ydHMuc3RyaW5nUmVwZWF0ID0gZnVuY3Rpb24gKHN0cmluZywgY291bnQpIHsKICAgICByZXR1cm4gbmV3IEFycmF5KGNvdW50ICsgMSkuam9pbihzdHJpbmcpOwp9OwoKdmFyIHRyaW1CZWdpblJlZ2V4cCA9IC9eXHNccyovOwp2YXIgdHJpbUVuZFJlZ2V4cCA9IC9cc1xzKiQvOwoKZXhwb3J0cy5zdHJpbmdUcmltTGVmdCA9IGZ1bmN0aW9uIChzdHJpbmcpIHsKICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSh0cmltQmVnaW5SZWdleHAsICcnKTsKfTsKCmV4cG9ydHMuc3RyaW5nVHJpbVJpZ2h0ID0gZnVuY3Rpb24gKHN0cmluZykgewogICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHRyaW1FbmRSZWdleHAsICcnKTsKfTsKCmV4cG9ydHMuY29weU9iamVjdCA9IGZ1bmN0aW9uKG9iaikgewogICAgdmFyIGNvcHkgPSB7fTsKICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKICAgICAgICBjb3B5W2tleV0gPSBvYmpba2V5XTsKICAgIH0KICAgIHJldHVybiBjb3B5Owp9OwoKZXhwb3J0cy5jb3B5QXJyYXkgPSBmdW5jdGlvbihhcnJheSl7CiAgICB2YXIgY29weSA9IFtdOwogICAgZm9yICh2YXIgaT0wLCBsPWFycmF5Lmxlbmd0aDsgaTxsOyBpKyspIHsKICAgICAgICBpZiAoYXJyYXlbaV0gJiYgdHlwZW9mIGFycmF5W2ldID09ICJvYmplY3QiKQogICAgICAgICAgICBjb3B5W2ldID0gdGhpcy5jb3B5T2JqZWN0KCBhcnJheVtpXSApOwogICAgICAgIGVsc2UgCiAgICAgICAgICAgIGNvcHlbaV0gPSBhcnJheVtpXTsKICAgIH0KICAgIHJldHVybiBjb3B5Owp9OwoKZXhwb3J0cy5kZWVwQ29weSA9IGZ1bmN0aW9uIChvYmopIHsKICAgIGlmICh0eXBlb2Ygb2JqICE9ICJvYmplY3QiKSB7CiAgICAgICAgcmV0dXJuIG9iajsKICAgIH0KICAgIAogICAgdmFyIGNvcHkgPSBvYmouY29uc3RydWN0b3IoKTsKICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKICAgICAgICBpZiAodHlwZW9mIG9ialtrZXldID09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIGNvcHlba2V5XSA9IHRoaXMuZGVlcENvcHkob2JqW2tleV0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvcHlba2V5XSA9IG9ialtrZXldOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBjb3B5Owp9OwoKZXhwb3J0cy5hcnJheVRvTWFwID0gZnVuY3Rpb24oYXJyKSB7CiAgICB2YXIgbWFwID0ge307CiAgICBmb3IgKHZhciBpPTA7IGk8YXJyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbWFwW2FycltpXV0gPSAxOwogICAgfQogICAgcmV0dXJuIG1hcDsKCn07CgovKioKICogc3BsaWNlIG91dCBvZiAnYXJyYXknIGFueXRoaW5nIHRoYXQgPT09ICd2YWx1ZScKICovCmV4cG9ydHMuYXJyYXlSZW1vdmUgPSBmdW5jdGlvbihhcnJheSwgdmFsdWUpIHsKICBmb3IgKHZhciBpID0gMDsgaSA8PSBhcnJheS5sZW5ndGg7IGkrKykgewogICAgaWYgKHZhbHVlID09PSBhcnJheVtpXSkgewogICAgICBhcnJheS5zcGxpY2UoaSwgMSk7CiAgICB9CiAgfQp9OwoKZXhwb3J0cy5lc2NhcGVSZWdFeHAgPSBmdW5jdGlvbihzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvKFsuKis/XiR7fSgpfFtcXVwvXFxdKS9nLCAnXFwkMScpOwp9OwoKZXhwb3J0cy5kZWZlcnJlZENhbGwgPSBmdW5jdGlvbihmY24pIHsKCiAgICB2YXIgdGltZXIgPSBudWxsOwogICAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGltZXIgPSBudWxsOwogICAgICAgIGZjbigpOwogICAgfTsKCiAgICB2YXIgZGVmZXJyZWQgPSBmdW5jdGlvbih0aW1lb3V0KSB7CiAgICAgICAgZGVmZXJyZWQuY2FuY2VsKCk7CiAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGNhbGxiYWNrLCB0aW1lb3V0IHx8IDApOwogICAgICAgIHJldHVybiBkZWZlcnJlZDsKICAgIH07CgogICAgZGVmZXJyZWQuc2NoZWR1bGUgPSBkZWZlcnJlZDsKCiAgICBkZWZlcnJlZC5jYWxsID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5jYW5jZWwoKTsKICAgICAgICBmY24oKTsKICAgICAgICByZXR1cm4gZGVmZXJyZWQ7CiAgICB9OwoKICAgIGRlZmVycmVkLmNhbmNlbCA9IGZ1bmN0aW9uKCkgewogICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7CiAgICAgICAgdGltZXIgPSBudWxsOwogICAgICAgIHJldHVybiBkZWZlcnJlZDsKICAgIH07CgogICAgcmV0dXJuIGRlZmVycmVkOwp9OwoKfSk7CmRlZmluZSgnYWNlL3dvcmtlci9qc2hpbnQnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnIF0sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewovKiEKICogSlNIaW50LCBieSBKU0hpbnQgQ29tbXVuaXR5LgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgc2FtZSBzbGlnaHRseSBtb2RpZmllZCBNSVQgbGljZW5zZSB0aGF0IEpTTGludCBpcy4KICogSXQgc3RvcHMgZXZpbC1kb2VycyBldmVyeXdoZXJlLgogKgogKiBKU0hpbnQgaXMgYSBkZXJpdmF0aXZlIHdvcmsgb2YgSlNMaW50OgogKgogKiAgIENvcHlyaWdodCAoYykgMjAwMiBEb3VnbGFzIENyb2NrZm9yZCAgKHd3dy5KU0xpbnQuY29tKQogKgogKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwogKiAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKICogICB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCiAqICAgdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCiAqICAgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAogKiAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgogKgogKiAgIFRoZSBTb2Z0d2FyZSBzaGFsbCBiZSB1c2VkIGZvciBHb29kLCBub3QgRXZpbC4KICoKICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiAgIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAogKiAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQogKiAgIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKICogICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORwogKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKICogICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAqCiAqIEpTSGludCB3YXMgZm9ya2VkIGZyb20gMjAxMC0xMi0xNiBlZGl0aW9uIG9mIEpTTGludC4KICoKICovCgovKgogSlNISU5UIGlzIGEgZ2xvYmFsIGZ1bmN0aW9uLiBJdCB0YWtlcyB0d28gcGFyYW1ldGVycy4KCiAgICAgdmFyIG15UmVzdWx0ID0gSlNISU5UKHNvdXJjZSwgb3B0aW9uKTsKCiBUaGUgZmlyc3QgcGFyYW1ldGVyIGlzIGVpdGhlciBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLiBJZiBpdCBpcyBhCiBzdHJpbmcsIGl0IHdpbGwgYmUgc3BsaXQgb24gJ1xuJyBvciAnXHInLiBJZiBpdCBpcyBhbiBhcnJheSBvZiBzdHJpbmdzLCBpdAogaXMgYXNzdW1lZCB0aGF0IGVhY2ggc3RyaW5nIHJlcHJlc2VudHMgb25lIGxpbmUuIFRoZSBzb3VyY2UgY2FuIGJlIGEKIEphdmFTY3JpcHQgdGV4dCBvciBhIEpTT04gdGV4dC4KCiBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyBhbiBvcHRpb25hbCBvYmplY3Qgb2Ygb3B0aW9ucyB3aGljaCBjb250cm9sIHRoZQogb3BlcmF0aW9uIG9mIEpTSElOVC4gTW9zdCBvZiB0aGUgb3B0aW9ucyBhcmUgYm9vbGVhbnM6IFRoZXkgYXJlIGFsbAogb3B0aW9uYWwgYW5kIGhhdmUgYSBkZWZhdWx0IHZhbHVlIG9mIGZhbHNlLiBPbmUgb2YgdGhlIG9wdGlvbnMsIHByZWRlZiwKIGNhbiBiZSBhbiBhcnJheSBvZiBuYW1lcywgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGRlY2xhcmUgZ2xvYmFsIHZhcmlhYmxlcywKIG9yIGFuIG9iamVjdCB3aG9zZSBrZXlzIGFyZSB1c2VkIGFzIGdsb2JhbCBuYW1lcywgd2l0aCBhIGJvb2xlYW4gdmFsdWUKIHRoYXQgZGV0ZXJtaW5lcyBpZiB0aGV5IGFyZSBhc3NpZ25hYmxlLgoKIElmIGl0IGNoZWNrcyBvdXQsIEpTSElOVCByZXR1cm5zIHRydWUuIE90aGVyd2lzZSwgaXQgcmV0dXJucyBmYWxzZS4KCiBJZiBmYWxzZSwgeW91IGNhbiBpbnNwZWN0IEpTSElOVC5lcnJvcnMgdG8gZmluZCBvdXQgdGhlIHByb2JsZW1zLgogSlNISU5ULmVycm9ycyBpcyBhbiBhcnJheSBvZiBvYmplY3RzIGNvbnRhaW5pbmcgdGhlc2UgbWVtYmVyczoKCiB7CiAgICAgbGluZSAgICAgIDogVGhlIGxpbmUgKHJlbGF0aXZlIHRvIDApIGF0IHdoaWNoIHRoZSBsaW50IHdhcyBmb3VuZAogICAgIGNoYXJhY3RlciA6IFRoZSBjaGFyYWN0ZXIgKHJlbGF0aXZlIHRvIDApIGF0IHdoaWNoIHRoZSBsaW50IHdhcyBmb3VuZAogICAgIHJlYXNvbiAgICA6IFRoZSBwcm9ibGVtCiAgICAgZXZpZGVuY2UgIDogVGhlIHRleHQgbGluZSBpbiB3aGljaCB0aGUgcHJvYmxlbSBvY2N1cnJlZAogICAgIHJhdyAgICAgICA6IFRoZSByYXcgbWVzc2FnZSBiZWZvcmUgdGhlIGRldGFpbHMgd2VyZSBpbnNlcnRlZAogICAgIGEgICAgICAgICA6IFRoZSBmaXJzdCBkZXRhaWwKICAgICBiICAgICAgICAgOiBUaGUgc2Vjb25kIGRldGFpbAogICAgIGMgICAgICAgICA6IFRoZSB0aGlyZCBkZXRhaWwKICAgICBkICAgICAgICAgOiBUaGUgZm91cnRoIGRldGFpbAogfQoKIElmIGEgZmF0YWwgZXJyb3Igd2FzIGZvdW5kLCBhIG51bGwgd2lsbCBiZSB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZQogSlNISU5ULmVycm9ycyBhcnJheS4KCiBZb3UgY2FuIHJlcXVlc3QgYSBGdW5jdGlvbiBSZXBvcnQsIHdoaWNoIHNob3dzIGFsbCBvZiB0aGUgZnVuY3Rpb25zCiBhbmQgdGhlIHBhcmFtZXRlcnMgYW5kIHZhcnMgdGhhdCB0aGV5IHVzZS4gVGhpcyBjYW4gYmUgdXNlZCB0byBmaW5kCiBpbXBsaWVkIGdsb2JhbCB2YXJpYWJsZXMgYW5kIG90aGVyIHByb2JsZW1zLiBUaGUgcmVwb3J0IGlzIGluIEhUTUwgYW5kCiBjYW4gYmUgaW5zZXJ0ZWQgaW4gYW4gSFRNTCA8Ym9keT4uCgogICAgIHZhciBteVJlcG9ydCA9IEpTSElOVC5yZXBvcnQobGltaXRlZCk7CgogSWYgbGltaXRlZCBpcyB0cnVlLCB0aGVuIHRoZSByZXBvcnQgd2lsbCBiZSBsaW1pdGVkIHRvIG9ubHkgZXJyb3JzLgoKIFlvdSBjYW4gcmVxdWVzdCBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIGNvbnRhaW5zIEpTSGludCdzIHJlc3VsdHMuCgogICAgIHZhciBteURhdGEgPSBKU0hJTlQuZGF0YSgpOwoKIEl0IHJldHVybnMgYSBzdHJ1Y3R1cmUgd2l0aCB0aGlzIGZvcm06CgogewogICAgIGVycm9yczogWwogICAgICAgICB7CiAgICAgICAgICAgICBsaW5lOiBOVU1CRVIsCiAgICAgICAgICAgICBjaGFyYWN0ZXI6IE5VTUJFUiwKICAgICAgICAgICAgIHJlYXNvbjogU1RSSU5HLAogICAgICAgICAgICAgZXZpZGVuY2U6IFNUUklORwogICAgICAgICB9CiAgICAgXSwKICAgICBmdW5jdGlvbnM6IFsKICAgICAgICAgbmFtZTogU1RSSU5HLAogICAgICAgICBsaW5lOiBOVU1CRVIsCiAgICAgICAgIGxhc3Q6IE5VTUJFUiwKICAgICAgICAgcGFyYW06IFsKICAgICAgICAgICAgIFNUUklORwogICAgICAgICBdLAogICAgICAgICBjbG9zdXJlOiBbCiAgICAgICAgICAgICBTVFJJTkcKICAgICAgICAgXSwKICAgICAgICAgdmFyOiBbCiAgICAgICAgICAgICBTVFJJTkcKICAgICAgICAgXSwKICAgICAgICAgZXhjZXB0aW9uOiBbCiAgICAgICAgICAgICBTVFJJTkcKICAgICAgICAgXSwKICAgICAgICAgb3V0ZXI6IFsKICAgICAgICAgICAgIFNUUklORwogICAgICAgICBdLAogICAgICAgICB1bnVzZWQ6IFsKICAgICAgICAgICAgIFNUUklORwogICAgICAgICBdLAogICAgICAgICBnbG9iYWw6IFsKICAgICAgICAgICAgIFNUUklORwogICAgICAgICBdLAogICAgICAgICBsYWJlbDogWwogICAgICAgICAgICAgU1RSSU5HCiAgICAgICAgIF0KICAgICBdLAogICAgIGdsb2JhbHM6IFsKICAgICAgICAgU1RSSU5HCiAgICAgXSwKICAgICBtZW1iZXI6IHsKICAgICAgICAgU1RSSU5HOiBOVU1CRVIKICAgICB9LAogICAgIHVudXNlZHM6IFsKICAgICAgICAgewogICAgICAgICAgICAgbmFtZTogU1RSSU5HLAogICAgICAgICAgICAgbGluZTogTlVNQkVSCiAgICAgICAgIH0KICAgICBdLAogICAgIGltcGxpZWRzOiBbCiAgICAgICAgIHsKICAgICAgICAgICAgIG5hbWU6IFNUUklORywKICAgICAgICAgICAgIGxpbmU6IE5VTUJFUgogICAgICAgICB9CiAgICAgXSwKICAgICB1cmxzOiBbCiAgICAgICAgIFNUUklORwogICAgIF0sCiAgICAganNvbjogQk9PTEVBTgogfQoKIEVtcHR5IGFycmF5cyB3aWxsIG5vdCBiZSBpbmNsdWRlZC4KCiovCgovKmpzaGludAogZXZpbDogdHJ1ZSwgbm9tZW46IGZhbHNlLCBvbmV2YXI6IGZhbHNlLCByZWdleHA6IGZhbHNlLCBzdHJpY3Q6IHRydWUsIGJvc3M6IHRydWUsCiB1bmRlZjogdHJ1ZSwgbWF4bGVuOiAxMDAKKi8KCi8qbWVtYmVycyAiXGIiLCAiXHQiLCAiXG4iLCAiXGYiLCAiXHIiLCAiIT0iLCAiIT09IiwgIlwiIiwgIiUiLCAiKGJlZ2luKSIsCiAiKGJyZWFrYWdlKSIsICIoY29udGV4dCkiLCAiKGVycm9yKSIsICIoZ2xvYmFsKSIsICIoaWRlbnRpZmllcikiLCAiKGxhc3QpIiwKICIobGluZSkiLCAiKGxvb3BhZ2UpIiwgIihuYW1lKSIsICIob25ldmFyKSIsICIocGFyYW1zKSIsICIoc2NvcGUpIiwKICIoc3RhdGVtZW50KSIsICIodmVyYikiLCAiKiIsICIrIiwgIisrIiwgIi0iLCAiLS0iLCAiXC8iLCAiPCIsICI8PSIsICI9PSIsCiAiPT09IiwgIj4iLCAiPj0iLCAkLCAkJCwgJEEsICRGLCAkSCwgJFIsICRicmVhaywgJGNvbnRpbnVlLCAkdywgQWJzdHJhY3QsIEFqYXgsCiBfX2ZpbGVuYW1lLCBfX2Rpcm5hbWUsIEFjdGl2ZVhPYmplY3QsIEFycmF5LCBBcnJheUJ1ZmZlciwgQXJyYXlCdWZmZXJWaWV3LAogQXV0b2NvbXBsZXRlciwgQXNzZXRzLCBCb29sZWFuLCBCdWlsZGVyLCBCdWZmZXIsIEJyb3dzZXIsIENPTSwgQ1NjcmlwdCwgQ2FudmFzLAogQ3VzdG9tQW5pbWF0aW9uLCBDbGFzcywgQ29udHJvbCwgQ2hhaW4sIENvbG9yLCBDb29raWUsIENvcmUsIERhdGFWaWV3LCBEYXRlLAogRGVidWcsIERyYWdnYWJsZSwgRHJhZ2dhYmxlcywgRHJvcHBhYmxlcywgRG9jdW1lbnQsIERvbVJlYWR5LCBET01SZWFkeSwgRHJhZywKIEUsIEVudW1lcmF0b3IsIEVudW1lcmFibGUsIEVsZW1lbnQsIEVsZW1lbnRzLCBFcnJvciwgRWZmZWN0LCBFdmFsRXJyb3IsIEV2ZW50LAogRXZlbnRzLCBGYWRlQW5pbWF0aW9uLCBGaWVsZCwgRmxhc2gsIEZsb2F0MzJBcnJheSwgRmxvYXQ2NEFycmF5LCBGb3JtLAogRm9ybUZpZWxkLCBGcmFtZSwgRnVuY3Rpb24sIEZ4LCBHZXRPYmplY3QsIEdyb3VwLCBIYXNoLCBIb3RLZXksIEhUTUxFbGVtZW50LAogSHRtbFRhYmxlLCBJZnJhbWUsIElmcmFtZVNoaW0sIEltYWdlLCBJbnQxNkFycmF5LCBJbnQzMkFycmF5LCBJbnQ4QXJyYXksCiBJbnNlcnRpb24sIElucHV0VmFsaWRhdG9yLCBKU09OLCBLZXlib2FyZCwgTG9jYWxlLCBMTjEwLCBMTjIsIExPRzEwRSwgTE9HMkUsCiBNQVhfVkFMVUUsIE1JTl9WQUxVRSwgTWFzaywgTWF0aCwgTWVudUl0ZW0sIE1vdmVBbmltYXRpb24sIE1vb1Rvb2xzLCBOYXRpdmUsCiBORUdBVElWRV9JTkZJTklUWSwgTnVtYmVyLCBPYmplY3QsIE9iamVjdFJhbmdlLCBPcHRpb24sIE9wdGlvbnMsIE92ZXJUZXh0LCBQSSwKIFBPU0lUSVZFX0lORklOSVRZLCBQZXJpb2RpY2FsRXhlY3V0ZXIsIFBvaW50LCBQb3NpdGlvbiwgUHJvdG90eXBlLCBSYW5nZUVycm9yLAogUmVjdGFuZ2xlLCBSZWZlcmVuY2VFcnJvciwgUmVnRXhwLCBSZXNpemVBbmltYXRpb24sIFJlcXVlc3QsIFJvdGF0ZUFuaW1hdGlvbiwKIFNRUlQxXzIsIFNRUlQyLCBTY3JvbGxCYXIsIFNjcmlwdEVuZ2luZSwgU2NyaXB0RW5naW5lQnVpbGRWZXJzaW9uLAogU2NyaXB0RW5naW5lTWFqb3JWZXJzaW9uLCBTY3JpcHRFbmdpbmVNaW5vclZlcnNpb24sIFNjcmlwdGFjdWxvdXMsIFNjcm9sbGVyLAogU2xpY2ssIFNsaWRlciwgU2VsZWN0b3IsIFN0cmluZywgU3R5bGUsIFN5bnRheEVycm9yLCBTb3J0YWJsZSwgU29ydGFibGVzLAogU29ydGFibGVPYnNlcnZlciwgU291bmQsIFNwaW5uZXIsIFN5c3RlbSwgU3dpZmYsIFRleHQsIFRleHRBcmVhLCBUZW1wbGF0ZSwKIFRpbWVyLCBUaXBzLCBUeXBlLCBUeXBlRXJyb3IsIFRvZ2dsZSwgVHJ5LCBVUkksIFVSSUVycm9yLCBVUkwsIFZCQXJyYXksIFdTSCwKIFdTY3JpcHQsIFdlYiwgV2luZG93LCBYTUxET00sIFhNTEh0dHBSZXF1ZXN0LCBYUGF0aEV2YWx1YXRvciwgWFBhdGhFeGNlcHRpb24sCiBYUGF0aEV4cHJlc3Npb24sIFhQYXRoTmFtZXNwYWNlLCBYUGF0aE5TUmVzb2x2ZXIsIFhQYXRoUmVzdWx0LCAiXFwiLCBhLAogYWRkRXZlbnRMaXN0ZW5lciwgYWRkcmVzcywgYWxlcnQsIGFwcGx5LCBhcHBsaWNhdGlvbkNhY2hlLCBhcmd1bWVudHMsIGFyaXR5LAogYXNpLCBiLCBiaXR3aXNlLCBibG9jaywgYmx1ciwgYm9vbE9wdGlvbnMsIGJvc3MsIGJyb3dzZXIsIGMsIGNhbGwsIGNhbGxlZSwKIGNhbGxlciwgY2FzZXMsIGNoYXJBdCwgY2hhckNvZGVBdCwgY2hhcmFjdGVyLCBjbGVhckludGVydmFsLCBjbGVhclRpbWVvdXQsCiBjbG9zZSwgY2xvc2VkLCBjbG9zdXJlLCBjb21tZW50LCBjb25kaXRpb24sIGNvbmZpcm0sIGNvbnNvbGUsIGNvbnN0cnVjdG9yLAogY29udGVudCwgY291Y2gsIGNyZWF0ZSwgY3NzLCBjdXJseSwgZCwgZGF0YSwgZGF0YWxpc3QsIGRkLCBkZWJ1ZywgZGVjb2RlVVJJLAogZGVjb2RlVVJJQ29tcG9uZW50LCBkZWZhdWx0U3RhdHVzLCBkZWZpbmVDbGFzcywgZGVzZXJpYWxpemUsIGRldmVsLCBkb2N1bWVudCwKIGRvam8sIGRpaml0LCBkb2pveCwgZGVmaW5lLCBlZGl0aW9uLCBlbHNlLCBlbWl0LCBlbmNvZGVVUkksIGVuY29kZVVSSUNvbXBvbmVudCwKIGVudGl0eWlmeSwgZXFlcWVxLCBlcW51bGwsIGVycm9ycywgZXM1LCBlc2NhcGUsIGV2YWwsIGV2ZW50LCBldmlkZW5jZSwgZXZpbCwKIGV4LCBleGNlcHRpb24sIGV4ZWMsIGV4cHMsIGV4cHIsIGV4cG9ydHMsIEZpbGVSZWFkZXIsIGZpcnN0LCBmbG9vciwgZm9jdXMsCiBmb3JpbiwgZnJhZ21lbnQsIGZyYW1lcywgZnJvbSwgZnJvbUNoYXJDb2RlLCBmdWQsIGZ1bmN0LCBmdW5jdGlvbiwgZnVuY3Rpb25zLAogZywgZ2MsIGdldENvbXB1dGVkU3R5bGUsIGdldFJvdywgR0xPQkFMLCBnbG9iYWwsIGdsb2JhbHMsIGdsb2JhbHN0cmljdCwKIGhhc093blByb3BlcnR5LCBoZWxwLCBoaXN0b3J5LCBpLCBpZCwgaWRlbnRpZmllciwgaW1tZWQsIGltcGxpZWRzLCBpbmNsdWRlLAogaW5kZW50LCBpbmRleE9mLCBpbml0LCBpbnMsIGluc3RhbmNlT2YsIGlzQWxwaGEsIGlzQXBwbGljYXRpb25SdW5uaW5nLCBpc0FycmF5LAogaXNEaWdpdCwgaXNGaW5pdGUsIGlzTmFOLCBpdGVyYXRvciwgam9pbiwganNoaW50LAogSlNISU5ULCBqc29uLCBqcXVlcnksIGpRdWVyeSwga2V5cywgbGFiZWwsIGxhYmVsbGVkLCBsYXN0LCBsYXN0c2VtaWMsIGxheGJyZWFrLAogbGF0ZWRlZiwgbGJwLCBsZWQsIGxlZnQsIGxlbmd0aCwgbGluZSwgbG9hZCwgbG9hZENsYXNzLCBsb2NhbFN0b3JhZ2UsIGxvY2F0aW9uLAogbG9nLCBsb29wZnVuYywgbSwgbWF0Y2gsIG1heGVyciwgbWF4bGVuLCBtZW1iZXIsbWVzc2FnZSwgbWV0YSwgbW9kdWxlLCBtb3ZlQnksCiBtb3ZlVG8sIG1vb3Rvb2xzLCBuYW1lLCBuYXZpZ2F0b3IsIG5ldywgbmV3Y2FwLCBub2FyZywgbm9kZSwgbm9lbXB0eSwgbm9tZW4sCiBub25ldywgbnVkLCBvbmJlZm9yZXVubG9hZCwgb25ibHVyLCBvbmVycm9yLCBvbmV2YXIsIG9uZm9jdXMsIG9ubG9hZCwgb25yZXNpemUsCiBvbnVubG9hZCwgb3Blbiwgb3BlbkRhdGFiYXNlLCBvcGVuVVJMLCBvcGVuZXIsIG9wZXJhLCBvdXRlciwgcGFyYW0sIHBhcmVudCwKIHBhcnNlRmxvYXQsIHBhcnNlSW50LCBwYXNzZmFpbCwgcGx1c3BsdXMsIHByZWRlZiwgcHJpbnQsIHByb2Nlc3MsIHByb21wdCwKIHByb3RvLCBwcm90b3R5cGUsIHByb3RvdHlwZWpzLCBwdXNoLCBxdWl0LCByYW5nZSwgcmF3LCByZWFjaCwgcmVhc29uLCByZWdleHAsCiByZWFkRmlsZSwgcmVhZFVybCwgcmVnZXhkYXNoLCByZW1vdmVFdmVudExpc3RlbmVyLCByZXBsYWNlLCByZXBvcnQsIHJlcXVpcmUsCiByZXNlcnZlZCwgcmVzaXplQnksIHJlc2l6ZVRvLCByZXNvbHZlUGF0aCwgcmVzdW1lVXBkYXRlcywgcmVzcG9uZCwgcmhpbm8sIHJpZ2h0LAogcnVuQ29tbWFuZCwgc2Nyb2xsLCBzY3JlZW4sIHNjcmlwdHVybCwgc2Nyb2xsQnksIHNjcm9sbFRvLCBzY3JvbGxiYXIsIHNlYXJjaCwgc2VhbCwgc2VuZCwKIHNlcmlhbGl6ZSwgc2V0SW50ZXJ2YWwsIHNldFRpbWVvdXQsIHNoaWZ0LCBzbGljZSwgc29ydCxzcGF3biwgc3BsaXQsIHN0YWNrLAogc3RhdHVzLCBzdGFydCwgc3RyaWN0LCBzdWIsIHN1YnN0ciwgc3VwZXJuZXcsIHNoYWRvdywgc3VwcGxhbnQsIHN1bSwgc3luYywKIHRlc3QsIHRvTG93ZXJDYXNlLCB0b1N0cmluZywgdG9VcHBlckNhc2UsIHRvaW50MzIsIHRva2VuLCB0b3AsIHRyYWlsaW5nLCB0eXBlLAogdHlwZU9mLCBVaW50MTZBcnJheSwgVWludDMyQXJyYXksIFVpbnQ4QXJyYXksIHVuZGVmLCB1bnVzZWQsIHVybHMsIHZhbHVlLCB2YWx1ZU9mLAogdmFyLCB2ZXJzaW9uLCBXZWJTb2NrZXQsIHdoaXRlLCB3aW5kb3csIFdvcmtlciwgd3NoKi8KCi8qZ2xvYmFsIGV4cG9ydHM6IGZhbHNlICovCgovLyBXZSBidWlsZCB0aGUgYXBwbGljYXRpb24gaW5zaWRlIGEgZnVuY3Rpb24gc28gdGhhdCB3ZSBwcm9kdWNlIG9ubHkgYSBzaW5nbGUKLy8gZ2xvYmFsIHZhcmlhYmxlLiBUaGF0IGZ1bmN0aW9uIHdpbGwgYmUgaW52b2tlZCBpbW1lZGlhdGVseSwgYW5kIGl0cyByZXR1cm4KLy8gdmFsdWUgaXMgdGhlIEpTSElOVCBmdW5jdGlvbiBpdHNlbGYuCgp2YXIgSlNISU5UID0gKGZ1bmN0aW9uICgpIHsKICAgICJ1c2Ugc3RyaWN0IjsKCiAgICB2YXIgYW5vbm5hbWUsICAgICAgIC8vIFRoZSBndWVzc2VkIG5hbWUgZm9yIGFub255bW91cyBmdW5jdGlvbnMuCgovLyBUaGVzZSBhcmUgb3BlcmF0b3JzIHRoYXQgc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGggdGhlICEgb3BlcmF0b3IuCgogICAgICAgIGJhbmcgPSB7CiAgICAgICAgICAgICc8JyAgOiB0cnVlLAogICAgICAgICAgICAnPD0nIDogdHJ1ZSwKICAgICAgICAgICAgJz09JyA6IHRydWUsCiAgICAgICAgICAgICc9PT0nOiB0cnVlLAogICAgICAgICAgICAnIT09JzogdHJ1ZSwKICAgICAgICAgICAgJyE9JyA6IHRydWUsCiAgICAgICAgICAgICc+JyAgOiB0cnVlLAogICAgICAgICAgICAnPj0nIDogdHJ1ZSwKICAgICAgICAgICAgJysnICA6IHRydWUsCiAgICAgICAgICAgICctJyAgOiB0cnVlLAogICAgICAgICAgICAnKicgIDogdHJ1ZSwKICAgICAgICAgICAgJy8nICA6IHRydWUsCiAgICAgICAgICAgICclJyAgOiB0cnVlCiAgICAgICAgfSwKCi8vIFRoZXNlIGFyZSB0aGUgSlNIaW50IGJvb2xlYW4gb3B0aW9ucy4KCiAgICAgICAgYm9vbE9wdGlvbnMgPSB7CiAgICAgICAgICAgIGFzaSAgICAgICAgIDogdHJ1ZSwgLy8gaWYgYXV0b21hdGljIHNlbWljb2xvbiBpbnNlcnRpb24gc2hvdWxkIGJlIHRvbGVyYXRlZAogICAgICAgICAgICBiaXR3aXNlICAgICA6IHRydWUsIC8vIGlmIGJpdHdpc2Ugb3BlcmF0b3JzIHNob3VsZCBub3QgYmUgYWxsb3dlZAogICAgICAgICAgICBib3NzICAgICAgICA6IHRydWUsIC8vIGlmIGFkdmFuY2VkIHVzYWdlIG9mIGFzc2lnbm1lbnRzIHNob3VsZCBiZSBhbGxvd2VkCiAgICAgICAgICAgIGJyb3dzZXIgICAgIDogdHJ1ZSwgLy8gaWYgdGhlIHN0YW5kYXJkIGJyb3dzZXIgZ2xvYmFscyBzaG91bGQgYmUgcHJlZGVmaW5lZAogICAgICAgICAgICBjb3VjaCAgICAgICA6IHRydWUsIC8vIGlmIENvdWNoREIgZ2xvYmFscyBzaG91bGQgYmUgcHJlZGVmaW5lZAogICAgICAgICAgICBjdXJseSAgICAgICA6IHRydWUsIC8vIGlmIGN1cmx5IGJyYWNlcyBhcm91bmQgYWxsIGJsb2NrcyBzaG91bGQgYmUgcmVxdWlyZWQKICAgICAgICAgICAgZGVidWcgICAgICAgOiB0cnVlLCAvLyBpZiBkZWJ1Z2dlciBzdGF0ZW1lbnRzIHNob3VsZCBiZSBhbGxvd2VkCiAgICAgICAgICAgIGRldmVsICAgICAgIDogdHJ1ZSwgLy8gaWYgbG9nZ2luZyBnbG9iYWxzIHNob3VsZCBiZSBwcmVkZWZpbmVkIChjb25zb2xlLCBhbGVydCwgZXRjLikKICAgICAgICAgICAgZG9qbyAgICAgICAgOiB0cnVlLCAvLyBpZiBEb2pvIFRvb2xraXQgZ2xvYmFscyBzaG91bGQgYmUgcHJlZGVmaW5lZAogICAgICAgICAgICBlcWVxZXEgICAgICA6IHRydWUsIC8vIGlmID09PSBzaG91bGQgYmUgcmVxdWlyZWQKICAgICAgICAgICAgZXFudWxsICAgICAgOiB0cnVlLCAvLyBpZiA9PSBudWxsIGNvbXBhcmlzb25zIHNob3VsZCBiZSB0b2xlcmF0ZWQKICAgICAgICAgICAgZXM1ICAgICAgICAgOiB0cnVlLCAvLyBpZiBFUzUgc3ludGF4IHNob3VsZCBiZSBhbGxvd2VkCiAgICAgICAgICAgIGV2aWwgICAgICAgIDogdHJ1ZSwgLy8gaWYgZXZhbCBzaG91bGQgYmUgYWxsb3dlZAogICAgICAgICAgICBleHByICAgICAgICA6IHRydWUsIC8vIGlmIEV4cHJlc3Npb25TdGF0ZW1lbnQgc2hvdWxkIGJlIGFsbG93ZWQgYXMgUHJvZ3JhbXMKICAgICAgICAgICAgZm9yaW4gICAgICAgOiB0cnVlLCAvLyBpZiBmb3IgaW4gc3RhdGVtZW50cyBtdXN0IGZpbHRlcgogICAgICAgICAgICBnbG9iYWxzdHJpY3Q6IHRydWUsIC8vIGlmIGdsb2JhbCAidXNlIHN0cmljdCI7IHNob3VsZCBiZSBhbGxvd2VkIChhbHNvIGVuYWJsZXMgJ3N0cmljdCcpCiAgICAgICAgICAgIGltbWVkICAgICAgIDogdHJ1ZSwgLy8gaWYgaW1tZWRpYXRlIGludm9jYXRpb25zIG11c3QgYmUgd3JhcHBlZCBpbiBwYXJlbnMKICAgICAgICAgICAgaXRlcmF0b3IgICAgOiB0cnVlLCAvLyBpZiB0aGUgYF9faXRlcmF0b3JfX2AgcHJvcGVydHkgc2hvdWxkIGJlIGRpc2FsbG93ZWQKICAgICAgICAgICAganF1ZXJ5ICAgICAgOiB0cnVlLCAvLyBpZiBqUXVlcnkgZ2xvYmFscyBzaG91bGQgYmUgcHJlZGVmaW5lZAogICAgICAgICAgICBsYXRlZGVmICAgICA6IHRydWUsIC8vIGlmIHRoZSB1c2UgYmVmb3JlIGRlZmluaXRpb24gc2hvdWxkIG5vdCBiZSB0b2xlcmF0ZWQKICAgICAgICAgICAgbGF4YnJlYWsgICAgOiB0cnVlLCAvLyBpZiBsaW5lIGJyZWFrcyBzaG91bGQgbm90IGJlIGNoZWNrZWQKICAgICAgICAgICAgbG9vcGZ1bmMgICAgOiB0cnVlLCAvLyBpZiBmdW5jdGlvbnMgc2hvdWxkIGJlIGFsbG93ZWQgdG8gYmUgZGVmaW5lZCB3aXRoaW4gbG9vcHMKICAgICAgICAgICAgbW9vdG9vbHMgICAgOiB0cnVlLCAvLyBpZiBNb29Ub29scyBnbG9iYWxzIHNob3VsZCBiZSBwcmVkZWZpbmVkCiAgICAgICAgICAgIG5ld2NhcCAgICAgIDogdHJ1ZSwgLy8gaWYgY29uc3RydWN0b3IgbmFtZXMgbXVzdCBiZSBjYXBpdGFsaXplZAogICAgICAgICAgICBub2FyZyAgICAgICA6IHRydWUsIC8vIGlmIGFyZ3VtZW50cy5jYWxsZXIgYW5kIGFyZ3VtZW50cy5jYWxsZWUgc2hvdWxkIGJlIGRpc2FsbG93ZWQKICAgICAgICAgICAgbm9kZSAgICAgICAgOiB0cnVlLCAvLyBpZiB0aGUgTm9kZS5qcyBlbnZpcm9ubWVudCBnbG9iYWxzIHNob3VsZCBiZSBwcmVkZWZpbmVkCiAgICAgICAgICAgIG5vZW1wdHkgICAgIDogdHJ1ZSwgLy8gaWYgZW1wdHkgYmxvY2tzIHNob3VsZCBiZSBkaXNhbGxvd2VkCiAgICAgICAgICAgIG5vbmV3ICAgICAgIDogdHJ1ZSwgLy8gaWYgdXNpbmcgYG5ld2AgZm9yIHNpZGUtZWZmZWN0cyBzaG91bGQgYmUgZGlzYWxsb3dlZAogICAgICAgICAgICBub21lbiAgICAgICA6IHRydWUsIC8vIGlmIG5hbWVzIHNob3VsZCBiZSBjaGVja2VkCiAgICAgICAgICAgIG9uZXZhciAgICAgIDogdHJ1ZSwgLy8gaWYgb25seSBvbmUgdmFyIHN0YXRlbWVudCBwZXIgZnVuY3Rpb24gc2hvdWxkIGJlIGFsbG93ZWQKICAgICAgICAgICAgcGFzc2ZhaWwgICAgOiB0cnVlLCAvLyBpZiB0aGUgc2NhbiBzaG91bGQgc3RvcCBvbiBmaXJzdCBlcnJvcgogICAgICAgICAgICBwbHVzcGx1cyAgICA6IHRydWUsIC8vIGlmIGluY3JlbWVudC9kZWNyZW1lbnQgc2hvdWxkIG5vdCBiZSBhbGxvd2VkCiAgICAgICAgICAgIHByb3RvICAgICAgIDogdHJ1ZSwgLy8gaWYgdGhlIGBfX3Byb3RvX19gIHByb3BlcnR5IHNob3VsZCBiZSBkaXNhbGxvd2VkCiAgICAgICAgICAgIHByb3RvdHlwZWpzIDogdHJ1ZSwgLy8gaWYgUHJvdG90eXBlIGFuZCBTY3JpcHRhY3Vsb3VzIGdsb2JhbHMgc2hvdWxkIGJlIHByZWRlZmluZWQKICAgICAgICAgICAgcmVnZXhkYXNoICAgOiB0cnVlLCAvLyBpZiB1bmVzY2FwZWQgbGFzdCBkYXNoICgtKSBpbnNpZGUgYnJhY2tldHMgc2hvdWxkIGJlIHRvbGVyYXRlZAogICAgICAgICAgICByZWdleHAgICAgICA6IHRydWUsIC8vIGlmIHRoZSAuIHNob3VsZCBub3QgYmUgYWxsb3dlZCBpbiByZWdleHAgbGl0ZXJhbHMKICAgICAgICAgICAgcmhpbm8gICAgICAgOiB0cnVlLCAvLyBpZiB0aGUgUmhpbm8gZW52aXJvbm1lbnQgZ2xvYmFscyBzaG91bGQgYmUgcHJlZGVmaW5lZAogICAgICAgICAgICB1bmRlZiAgICAgICA6IHRydWUsIC8vIGlmIHZhcmlhYmxlcyBzaG91bGQgYmUgZGVjbGFyZWQgYmVmb3JlIHVzZWQKICAgICAgICAgICAgc2NyaXB0dXJsICAgOiB0cnVlLCAvLyBpZiBzY3JpcHQtdGFyZ2V0ZWQgVVJMcyBzaG91bGQgYmUgdG9sZXJhdGVkCiAgICAgICAgICAgIHNoYWRvdyAgICAgIDogdHJ1ZSwgLy8gaWYgdmFyaWFibGUgc2hhZG93aW5nIHNob3VsZCBiZSB0b2xlcmF0ZWQKICAgICAgICAgICAgc3RyaWN0ICAgICAgOiB0cnVlLCAvLyByZXF1aXJlIHRoZSAidXNlIHN0cmljdCI7IHByYWdtYQogICAgICAgICAgICBzdWIgICAgICAgICA6IHRydWUsIC8vIGlmIGFsbCBmb3JtcyBvZiBzdWJzY3JpcHQgbm90YXRpb24gYXJlIHRvbGVyYXRlZAogICAgICAgICAgICBzdXBlcm5ldyAgICA6IHRydWUsIC8vIGlmIGBuZXcgZnVuY3Rpb24gKCkgeyAuLi4gfTtgIGFuZCBgbmV3IE9iamVjdDtgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIHRvbGVyYXRlZAogICAgICAgICAgICB0cmFpbGluZyAgICA6IHRydWUsIC8vIGlmIHRyYWlsaW5nIHdoaXRlc3BhY2UgcnVsZXMgYXBwbHkKICAgICAgICAgICAgd2hpdGUgICAgICAgOiB0cnVlLCAvLyBpZiBzdHJpY3Qgd2hpdGVzcGFjZSBydWxlcyBhcHBseQogICAgICAgICAgICB3c2ggICAgICAgICA6IHRydWUgIC8vIGlmIHRoZSBXaW5kb3dzIFNjcmlwdGluZyBIb3N0IGVudmlyb25tZW50IGdsb2JhbHMgc2hvdWxkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmUgcHJlZGVmaW5lZAogICAgICAgIH0sCgovLyBicm93c2VyIGNvbnRhaW5zIGEgc2V0IG9mIGdsb2JhbCBuYW1lcyB3aGljaCBhcmUgY29tbW9ubHkgcHJvdmlkZWQgYnkgYQovLyB3ZWIgYnJvd3NlciBlbnZpcm9ubWVudC4KCiAgICAgICAgYnJvd3NlciA9IHsKICAgICAgICAgICAgQXJyYXlCdWZmZXIgICAgIDogZmFsc2UsCiAgICAgICAgICAgIEFycmF5QnVmZmVyVmlldyA6IGZhbHNlLAogICAgICAgICAgICBhZGRFdmVudExpc3RlbmVyOiBmYWxzZSwKICAgICAgICAgICAgYXBwbGljYXRpb25DYWNoZTogZmFsc2UsCiAgICAgICAgICAgIGJsdXIgICAgICAgICAgICA6IGZhbHNlLAogICAgICAgICAgICBjbGVhckludGVydmFsICAgOiBmYWxzZSwKICAgICAgICAgICAgY2xlYXJUaW1lb3V0ICAgIDogZmFsc2UsCiAgICAgICAgICAgIGNsb3NlICAgICAgICAgICA6IGZhbHNlLAogICAgICAgICAgICBjbG9zZWQgICAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgRGF0YVZpZXcgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIGRlZmF1bHRTdGF0dXMgICA6IGZhbHNlLAogICAgICAgICAgICBkb2N1bWVudCAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgZXZlbnQgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIEZpbGVSZWFkZXIgICAgICA6IGZhbHNlLAogICAgICAgICAgICBGbG9hdDMyQXJyYXkgICAgOiBmYWxzZSwKICAgICAgICAgICAgRmxvYXQ2NEFycmF5ICAgIDogZmFsc2UsCiAgICAgICAgICAgIGZvY3VzICAgICAgICAgICA6IGZhbHNlLAogICAgICAgICAgICBmcmFtZXMgICAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgZ2V0Q29tcHV0ZWRTdHlsZTogZmFsc2UsCiAgICAgICAgICAgIEhUTUxFbGVtZW50ICAgICA6IGZhbHNlLAogICAgICAgICAgICBoaXN0b3J5ICAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgSW50MTZBcnJheSAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIEludDMyQXJyYXkgICAgICA6IGZhbHNlLAogICAgICAgICAgICBJbnQ4QXJyYXkgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgSW1hZ2UgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIGxlbmd0aCAgICAgICAgICA6IGZhbHNlLAogICAgICAgICAgICBsb2NhbFN0b3JhZ2UgICAgOiBmYWxzZSwKICAgICAgICAgICAgbG9jYXRpb24gICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIG1vdmVCeSAgICAgICAgICA6IGZhbHNlLAogICAgICAgICAgICBtb3ZlVG8gICAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgbmFtZSAgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIG5hdmlnYXRvciAgICAgICA6IGZhbHNlLAogICAgICAgICAgICBvbmJlZm9yZXVubG9hZCAgOiB0cnVlLAogICAgICAgICAgICBvbmJsdXIgICAgICAgICAgOiB0cnVlLAogICAgICAgICAgICBvbmVycm9yICAgICAgICAgOiB0cnVlLAogICAgICAgICAgICBvbmZvY3VzICAgICAgICAgOiB0cnVlLAogICAgICAgICAgICBvbmxvYWQgICAgICAgICAgOiB0cnVlLAogICAgICAgICAgICBvbnJlc2l6ZSAgICAgICAgOiB0cnVlLAogICAgICAgICAgICBvbnVubG9hZCAgICAgICAgOiB0cnVlLAogICAgICAgICAgICBvcGVuICAgICAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgb3BlbkRhdGFiYXNlICAgIDogZmFsc2UsCiAgICAgICAgICAgIG9wZW5lciAgICAgICAgICA6IGZhbHNlLAogICAgICAgICAgICBPcHRpb24gICAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgcGFyZW50ICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIHByaW50ICAgICAgICAgICA6IGZhbHNlLAogICAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyOiBmYWxzZSwKICAgICAgICAgICAgcmVzaXplQnkgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIHJlc2l6ZVRvICAgICAgICA6IGZhbHNlLAogICAgICAgICAgICBzY3JlZW4gICAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgc2Nyb2xsICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIHNjcm9sbEJ5ICAgICAgICA6IGZhbHNlLAogICAgICAgICAgICBzY3JvbGxUbyAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgc2V0SW50ZXJ2YWwgICAgIDogZmFsc2UsCiAgICAgICAgICAgIHNldFRpbWVvdXQgICAgICA6IGZhbHNlLAogICAgICAgICAgICBzdGF0dXMgICAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgdG9wICAgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIFVpbnQxNkFycmF5ICAgICA6IGZhbHNlLAogICAgICAgICAgICBVaW50MzJBcnJheSAgICAgOiBmYWxzZSwKICAgICAgICAgICAgVWludDhBcnJheSAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIFdlYlNvY2tldCAgICAgICA6IGZhbHNlLAogICAgICAgICAgICB3aW5kb3cgICAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgV29ya2VyICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIFhNTEh0dHBSZXF1ZXN0ICA6IGZhbHNlLAogICAgICAgICAgICBYUGF0aEV2YWx1YXRvciAgOiBmYWxzZSwKICAgICAgICAgICAgWFBhdGhFeGNlcHRpb24gIDogZmFsc2UsCiAgICAgICAgICAgIFhQYXRoRXhwcmVzc2lvbiA6IGZhbHNlLAogICAgICAgICAgICBYUGF0aE5hbWVzcGFjZSAgOiBmYWxzZSwKICAgICAgICAgICAgWFBhdGhOU1Jlc29sdmVyIDogZmFsc2UsCiAgICAgICAgICAgIFhQYXRoUmVzdWx0ICAgICA6IGZhbHNlCiAgICAgICAgfSwKCiAgICAgICAgY291Y2ggPSB7CiAgICAgICAgICAgICJyZXF1aXJlIiA6IGZhbHNlLAogICAgICAgICAgICByZXNwb25kICAgOiBmYWxzZSwKICAgICAgICAgICAgZ2V0Um93ICAgIDogZmFsc2UsCiAgICAgICAgICAgIGVtaXQgICAgICA6IGZhbHNlLAogICAgICAgICAgICBzZW5kICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgc3RhcnQgICAgIDogZmFsc2UsCiAgICAgICAgICAgIHN1bSAgICAgICA6IGZhbHNlLAogICAgICAgICAgICBsb2cgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgZXhwb3J0cyAgIDogZmFsc2UsCiAgICAgICAgICAgIG1vZHVsZSAgICA6IGZhbHNlCiAgICAgICAgfSwKCiAgICAgICAgZGV2ZWwgPSB7CiAgICAgICAgICAgIGFsZXJ0ICAgOiBmYWxzZSwKICAgICAgICAgICAgY29uZmlybSA6IGZhbHNlLAogICAgICAgICAgICBjb25zb2xlIDogZmFsc2UsCiAgICAgICAgICAgIERlYnVnICAgOiBmYWxzZSwKICAgICAgICAgICAgb3BlcmEgICA6IGZhbHNlLAogICAgICAgICAgICBwcm9tcHQgIDogZmFsc2UKICAgICAgICB9LAoKICAgICAgICBkb2pvID0gewogICAgICAgICAgICBkb2pvICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgZGlqaXQgICAgIDogZmFsc2UsCiAgICAgICAgICAgIGRvam94ICAgICA6IGZhbHNlLAogICAgICAgICAgICBkZWZpbmUgICAgOiBmYWxzZSwKICAgICAgICAgICAgInJlcXVpcmUiIDogZmFsc2UKICAgICAgICB9LAoKICAgICAgICBlc2NhcGVzID0gewogICAgICAgICAgICAnXGInOiAnXFxiJywKICAgICAgICAgICAgJ1x0JzogJ1xcdCcsCiAgICAgICAgICAgICdcbic6ICdcXG4nLAogICAgICAgICAgICAnXGYnOiAnXFxmJywKICAgICAgICAgICAgJ1xyJzogJ1xccicsCiAgICAgICAgICAgICciJyA6ICdcXCInLAogICAgICAgICAgICAnLycgOiAnXFwvJywKICAgICAgICAgICAgJ1xcJzogJ1xcXFwnCiAgICAgICAgfSwKCiAgICAgICAgZnVuY3QsICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGZ1bmN0aW9uCgogICAgICAgIGZ1bmN0aW9uaWNpdHkgPSBbCiAgICAgICAgICAgICdjbG9zdXJlJywgJ2V4Y2VwdGlvbicsICdnbG9iYWwnLCAnbGFiZWwnLAogICAgICAgICAgICAnb3V0ZXInLCAndW51c2VkJywgJ3ZhcicKICAgICAgICBdLAoKICAgICAgICBmdW5jdGlvbnMsICAgICAgLy8gQWxsIG9mIHRoZSBmdW5jdGlvbnMKCiAgICAgICAgZ2xvYmFsLCAgICAgICAgIC8vIFRoZSBnbG9iYWwgc2NvcGUKICAgICAgICBpbXBsaWVkLCAgICAgICAgLy8gSW1wbGllZCBnbG9iYWxzCiAgICAgICAgaW5ibG9jaywKICAgICAgICBpbmRlbnQsCiAgICAgICAganNvbm1vZGUsCgogICAgICAgIGpxdWVyeSA9IHsKICAgICAgICAgICAgJyQnICAgIDogZmFsc2UsCiAgICAgICAgICAgIGpRdWVyeSA6IGZhbHNlCiAgICAgICAgfSwKCiAgICAgICAgbGluZXMsCiAgICAgICAgbG9va2FoZWFkLAogICAgICAgIG1lbWJlciwKICAgICAgICBtZW1iZXJzT25seSwKCiAgICAgICAgbW9vdG9vbHMgPSB7CiAgICAgICAgICAgICckJyAgICAgICAgICAgICA6IGZhbHNlLAogICAgICAgICAgICAnJCQnICAgICAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgQXNzZXRzICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIEJyb3dzZXIgICAgICAgICA6IGZhbHNlLAogICAgICAgICAgICBDaGFpbiAgICAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIENvbG9yICAgICAgICAgICA6IGZhbHNlLAogICAgICAgICAgICBDb29raWUgICAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgQ29yZSAgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIERvY3VtZW50ICAgICAgICA6IGZhbHNlLAogICAgICAgICAgICBEb21SZWFkeSAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgRE9NUmVhZHkgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIERyYWcgICAgICAgICAgICA6IGZhbHNlLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgRWxlbWVudHMgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIEV2ZW50ICAgICAgICAgICA6IGZhbHNlLAogICAgICAgICAgICBFdmVudHMgICAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgRnggICAgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIEdyb3VwICAgICAgICAgICA6IGZhbHNlLAogICAgICAgICAgICBIYXNoICAgICAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgSHRtbFRhYmxlICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIElmcmFtZSAgICAgICAgICA6IGZhbHNlLAogICAgICAgICAgICBJZnJhbWVTaGltICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgSW5wdXRWYWxpZGF0b3IgIDogZmFsc2UsCiAgICAgICAgICAgIGluc3RhbmNlT2YgICAgICA6IGZhbHNlLAogICAgICAgICAgICBLZXlib2FyZCAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgTG9jYWxlICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIE1hc2sgICAgICAgICAgICA6IGZhbHNlLAogICAgICAgICAgICBNb29Ub29scyAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgTmF0aXZlICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIE9wdGlvbnMgICAgICAgICA6IGZhbHNlLAogICAgICAgICAgICBPdmVyVGV4dCAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgUmVxdWVzdCAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIFNjcm9sbGVyICAgICAgICA6IGZhbHNlLAogICAgICAgICAgICBTbGljayAgICAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgU2xpZGVyICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIFNvcnRhYmxlcyAgICAgICA6IGZhbHNlLAogICAgICAgICAgICBTcGlubmVyICAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgU3dpZmYgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIFRpcHMgICAgICAgICAgICA6IGZhbHNlLAogICAgICAgICAgICBUeXBlICAgICAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgdHlwZU9mICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIFVSSSAgICAgICAgICAgICA6IGZhbHNlLAogICAgICAgICAgICBXaW5kb3cgICAgICAgICAgOiBmYWxzZQogICAgICAgIH0sCgogICAgICAgIG5leHR0b2tlbiwKCiAgICAgICAgbm9kZSA9IHsKICAgICAgICAgICAgX19maWxlbmFtZSAgOiBmYWxzZSwKICAgICAgICAgICAgX19kaXJuYW1lICAgOiBmYWxzZSwKICAgICAgICAgICAgZXhwb3J0cyAgICAgOiBmYWxzZSwKICAgICAgICAgICAgQnVmZmVyICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgR0xPQkFMICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgZ2xvYmFsICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgbW9kdWxlICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgcHJvY2VzcyAgICAgOiBmYWxzZSwKICAgICAgICAgICAgcmVxdWlyZSAgICAgOiBmYWxzZQogICAgICAgIH0sCgogICAgICAgIG5vcmVhY2gsCiAgICAgICAgb3B0aW9uLAogICAgICAgIHByZWRlZmluZWQsICAgICAvLyBHbG9iYWwgdmFyaWFibGVzIGRlZmluZWQgYnkgb3B0aW9uCiAgICAgICAgcHJlcmVnLAogICAgICAgIHByZXZ0b2tlbiwKCiAgICAgICAgcHJvdG90eXBlanMgPSB7CiAgICAgICAgICAgICckJyAgICAgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgICckJCcgICAgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgICckQScgICAgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgICckRicgICAgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgICckSCcgICAgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgICckUicgICAgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgICckYnJlYWsnICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgICckY29udGludWUnICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgICckdycgICAgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIEFic3RyYWN0ICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIEFqYXggICAgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIEVudW1lcmFibGUgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIEV2ZW50ICAgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIEZpZWxkICAgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIEZvcm0gICAgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIEhhc2ggICAgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIEluc2VydGlvbiAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIE9iamVjdFJhbmdlICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIFBlcmlvZGljYWxFeGVjdXRlcjogZmFsc2UsCiAgICAgICAgICAgIFBvc2l0aW9uICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIFByb3RvdHlwZSAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIFNlbGVjdG9yICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIFRlbXBsYXRlICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIFRvZ2dsZSAgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIFRyeSAgICAgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIEF1dG9jb21wbGV0ZXIgICAgIDogZmFsc2UsCiAgICAgICAgICAgIEJ1aWxkZXIgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIENvbnRyb2wgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIERyYWdnYWJsZSAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIERyYWdnYWJsZXMgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIERyb3BwYWJsZXMgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIEVmZmVjdCAgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIFNvcnRhYmxlICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIFNvcnRhYmxlT2JzZXJ2ZXIgIDogZmFsc2UsCiAgICAgICAgICAgIFNvdW5kICAgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIFNjcmlwdGFjdWxvdXMgICAgIDogZmFsc2UKICAgICAgICB9LAoKICAgICAgICByaGlubyA9IHsKICAgICAgICAgICAgZGVmaW5lQ2xhc3MgOiBmYWxzZSwKICAgICAgICAgICAgZGVzZXJpYWxpemUgOiBmYWxzZSwKICAgICAgICAgICAgZ2MgICAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgaGVscCAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgbG9hZCAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgbG9hZENsYXNzICAgOiBmYWxzZSwKICAgICAgICAgICAgcHJpbnQgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgcXVpdCAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgcmVhZEZpbGUgICAgOiBmYWxzZSwKICAgICAgICAgICAgcmVhZFVybCAgICAgOiBmYWxzZSwKICAgICAgICAgICAgcnVuQ29tbWFuZCAgOiBmYWxzZSwKICAgICAgICAgICAgc2VhbCAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgc2VyaWFsaXplICAgOiBmYWxzZSwKICAgICAgICAgICAgc3Bhd24gICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgc3luYyAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgdG9pbnQzMiAgICAgOiBmYWxzZSwKICAgICAgICAgICAgdmVyc2lvbiAgICAgOiBmYWxzZQogICAgICAgIH0sCgogICAgICAgIHNjb3BlLCAgICAgIC8vIFRoZSBjdXJyZW50IHNjb3BlCiAgICAgICAgc3JjLAogICAgICAgIHN0YWNrLAoKLy8gc3RhbmRhcmQgY29udGFpbnMgdGhlIGdsb2JhbCBuYW1lcyB0aGF0IGFyZSBwcm92aWRlZCBieSB0aGUKLy8gRUNNQVNjcmlwdCBzdGFuZGFyZC4KCiAgICAgICAgc3RhbmRhcmQgPSB7CiAgICAgICAgICAgIEFycmF5ICAgICAgICAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgQm9vbGVhbiAgICAgICAgICAgICA6IGZhbHNlLAogICAgICAgICAgICBEYXRlICAgICAgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIGRlY29kZVVSSSAgICAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgZGVjb2RlVVJJQ29tcG9uZW50ICA6IGZhbHNlLAogICAgICAgICAgICBlbmNvZGVVUkkgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudCAgOiBmYWxzZSwKICAgICAgICAgICAgRXJyb3IgICAgICAgICAgICAgICA6IGZhbHNlLAogICAgICAgICAgICAnZXZhbCcgICAgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIEV2YWxFcnJvciAgICAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgRnVuY3Rpb24gICAgICAgICAgICA6IGZhbHNlLAogICAgICAgICAgICBoYXNPd25Qcm9wZXJ0eSAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIGlzRmluaXRlICAgICAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgaXNOYU4gICAgICAgICAgICAgICA6IGZhbHNlLAogICAgICAgICAgICBKU09OICAgICAgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIE1hdGggICAgICAgICAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgTnVtYmVyICAgICAgICAgICAgICA6IGZhbHNlLAogICAgICAgICAgICBPYmplY3QgICAgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIHBhcnNlSW50ICAgICAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgcGFyc2VGbG9hdCAgICAgICAgICA6IGZhbHNlLAogICAgICAgICAgICBSYW5nZUVycm9yICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIFJlZmVyZW5jZUVycm9yICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgUmVnRXhwICAgICAgICAgICAgICA6IGZhbHNlLAogICAgICAgICAgICBTdHJpbmcgICAgICAgICAgICAgIDogZmFsc2UsCiAgICAgICAgICAgIFN5bnRheEVycm9yICAgICAgICAgOiBmYWxzZSwKICAgICAgICAgICAgVHlwZUVycm9yICAgICAgICAgICA6IGZhbHNlLAogICAgICAgICAgICBVUklFcnJvciAgICAgICAgICAgIDogZmFsc2UKICAgICAgICB9LAoKICAgICAgICBzdGFuZGFyZF9tZW1iZXIgPSB7CiAgICAgICAgICAgIEUgICAgICAgICAgICAgICAgICAgOiB0cnVlLAogICAgICAgICAgICBMTjIgICAgICAgICAgICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgTE4xMCAgICAgICAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgIExPRzJFICAgICAgICAgICAgICAgOiB0cnVlLAogICAgICAgICAgICBMT0cxMEUgICAgICAgICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgTUFYX1ZBTFVFICAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgIE1JTl9WQUxVRSAgICAgICAgICAgOiB0cnVlLAogICAgICAgICAgICBORUdBVElWRV9JTkZJTklUWSAgIDogdHJ1ZSwKICAgICAgICAgICAgUEkgICAgICAgICAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgIFBPU0lUSVZFX0lORklOSVRZICAgOiB0cnVlLAogICAgICAgICAgICBTUVJUMV8yICAgICAgICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgU1FSVDIgICAgICAgICAgICAgICA6IHRydWUKICAgICAgICB9LAoKICAgICAgICBzdHJpY3RfbW9kZSwKICAgICAgICBzeW50YXggPSB7fSwKICAgICAgICB0YWIsCiAgICAgICAgdG9rZW4sCiAgICAgICAgdXJscywKICAgICAgICB3YXJuaW5ncywKCiAgICAgICAgd3NoID0gewogICAgICAgICAgICBBY3RpdmVYT2JqZWN0ICAgICAgICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgRW51bWVyYXRvciAgICAgICAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgIEdldE9iamVjdCAgICAgICAgICAgICAgICAgOiB0cnVlLAogICAgICAgICAgICBTY3JpcHRFbmdpbmUgICAgICAgICAgICAgIDogdHJ1ZSwKICAgICAgICAgICAgU2NyaXB0RW5naW5lQnVpbGRWZXJzaW9uICA6IHRydWUsCiAgICAgICAgICAgIFNjcmlwdEVuZ2luZU1ham9yVmVyc2lvbiAgOiB0cnVlLAogICAgICAgICAgICBTY3JpcHRFbmdpbmVNaW5vclZlcnNpb24gIDogdHJ1ZSwKICAgICAgICAgICAgVkJBcnJheSAgICAgICAgICAgICAgICAgICA6IHRydWUsCiAgICAgICAgICAgIFdTSCAgICAgICAgICAgICAgICAgICAgICAgOiB0cnVlLAogICAgICAgICAgICBXU2NyaXB0ICAgICAgICAgICAgICAgICAgIDogdHJ1ZQogICAgICAgIH07CgogICAgICAgIC8vIFJlZ3VsYXIgZXhwcmVzc2lvbnMuIFNvbWUgb2YgdGhlc2UgYXJlIHN0dXBpZGx5IGxvbmcuCiAgICAgICAgdmFyIGF4LCBjeCwgdHgsIG54LCBueGcsIGx4LCBpeCwgangsIGZ0OwogICAgICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIC8qanNoaW50IG1heGxlbjozMDAgKi8KCiAgICAgICAgICAgIC8vIHVuc2FmZSBjb21tZW50IG9yIHN0cmluZwogICAgICAgICAgICBheCA9IC9AY2N8PFwvP3xzY3JpcHR8XF1ccypcXXw8XHMqIXwmbHQvaTsKCiAgICAgICAgICAgIC8vIHVuc2FmZSBjaGFyYWN0ZXJzIHRoYXQgYXJlIHNpbGVudGx5IGRlbGV0ZWQgYnkgb25lIG9yIG1vcmUgYnJvd3NlcnMKICAgICAgICAgICAgY3ggPSAvW1x1MDAwMC1cdTAwMWZcdTAwN2YtXHUwMDlmXHUwMGFkXHUwNjAwLVx1MDYwNFx1MDcwZlx1MTdiNFx1MTdiNVx1MjAwYy1cdTIwMGZcdTIwMjgtXHUyMDJmXHUyMDYwLVx1MjA2Zlx1ZmVmZlx1ZmZmMC1cdWZmZmZdLzsKCiAgICAgICAgICAgIC8vIHRva2VuCiAgICAgICAgICAgIHR4ID0gL15ccyooWygpe31cWy4sOjsnIn5cP1xdI0BdfD09Pz0/fFwvKFwqKGpzaGludHxqc2xpbnR8bWVtYmVycz98Z2xvYmFsKT98PXxcLyk/fFwqW1wvPV0/fFwrKD86PXxcKyspP3wtKD86PXwtKyk/fCU9P3wmWyY9XT98XHxbfD1dP3w+Pj8+Pz0/fDwoW1wvPSFdfFwhKFxbfC0tKT98PD0/KT98XF49P3xcIT0/PT98W2EtekEtWl8kXVthLXpBLVowLTlfJF0qfFswLTldKyhbeFhdWzAtOWEtZkEtRl0rfFwuWzAtOV0qKT8oW2VFXVsrXC1dP1swLTldKyk/KS87CgogICAgICAgICAgICAvLyBjaGFyYWN0ZXJzIGluIHN0cmluZ3MgdGhhdCBuZWVkIGVzY2FwZW1lbnQKICAgICAgICAgICAgbnggPSAvW1x1MDAwMC1cdTAwMWYmPCJcL1xcXHUwMDdmLVx1MDA5Zlx1MDBhZFx1MDYwMC1cdTA2MDRcdTA3MGZcdTE3YjRcdTE3YjVcdTIwMGMtXHUyMDBmXHUyMDI4LVx1MjAyZlx1MjA2MC1cdTIwNmZcdWZlZmZcdWZmZjAtXHVmZmZmXS87CiAgICAgICAgICAgIG54ZyA9IC9bXHUwMDAwLVx1MDAxZiY8IlwvXFxcdTAwN2YtXHUwMDlmXHUwMGFkXHUwNjAwLVx1MDYwNFx1MDcwZlx1MTdiNFx1MTdiNVx1MjAwYy1cdTIwMGZcdTIwMjgtXHUyMDJmXHUyMDYwLVx1MjA2Zlx1ZmVmZlx1ZmZmMC1cdWZmZmZdL2c7CgogICAgICAgICAgICAvLyBzdGFyIHNsYXNoCiAgICAgICAgICAgIGx4ID0gL1wqXC98XC9cKi87CgogICAgICAgICAgICAvLyBpZGVudGlmaWVyCiAgICAgICAgICAgIGl4ID0gL14oW2EtekEtWl8kXVthLXpBLVowLTlfJF0qKSQvOwoKICAgICAgICAgICAgLy8gamF2YXNjcmlwdCB1cmwKICAgICAgICAgICAganggPSAvXig/OmphdmFzY3JpcHR8anNjcmlwdHxlY21hc2NyaXB0fHZic2NyaXB0fG1vY2hhfGxpdmVzY3JpcHQpXHMqOi9pOwoKICAgICAgICAgICAgLy8gY2F0Y2hlcyAvKiBmYWxscyB0aHJvdWdoICovIGNvbW1lbnRzCiAgICAgICAgICAgIGZ0ID0gL15ccypcL1wqXHMqZmFsbHNcc3Rocm91Z2hccypcKlwvXHMqJC87CiAgICAgICAgfSgpKTsKCiAgICBmdW5jdGlvbiBGKCkge30gICAgIC8vIFVzZWQgYnkgT2JqZWN0LmNyZWF0ZQoKICAgIGZ1bmN0aW9uIGlzX293bihvYmplY3QsIG5hbWUpIHsKCi8vIFRoZSBvYmplY3QuaGFzT3duUHJvcGVydHkgbWV0aG9kIGZhaWxzIHdoZW4gdGhlIHByb3BlcnR5IHVuZGVyIGNvbnNpZGVyYXRpb24KLy8gaXMgbmFtZWQgJ2hhc093blByb3BlcnR5Jy4gU28gd2UgaGF2ZSB0byB1c2UgdGhpcyBtb3JlIGNvbnZvbHV0ZWQgZm9ybS4KCiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIG5hbWUpOwogICAgfQoKLy8gUHJvdmlkZSBjcml0aWNhbCBFUzUgZnVuY3Rpb25zIHRvIEVTMy4KCiAgICBpZiAodHlwZW9mIEFycmF5LmlzQXJyYXkgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICBBcnJheS5pc0FycmF5ID0gZnVuY3Rpb24gKG8pIHsKICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkobykgPT09ICdbb2JqZWN0IEFycmF5XSc7CiAgICAgICAgfTsKICAgIH0KCiAgICBpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICBPYmplY3QuY3JlYXRlID0gZnVuY3Rpb24gKG8pIHsKICAgICAgICAgICAgRi5wcm90b3R5cGUgPSBvOwogICAgICAgICAgICByZXR1cm4gbmV3IEYoKTsKICAgICAgICB9OwogICAgfQoKICAgIGlmICh0eXBlb2YgT2JqZWN0LmtleXMgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICBPYmplY3Qua2V5cyA9IGZ1bmN0aW9uIChvKSB7CiAgICAgICAgICAgIHZhciBhID0gW10sIGs7CiAgICAgICAgICAgIGZvciAoayBpbiBvKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNfb3duKG8sIGspKSB7CiAgICAgICAgICAgICAgICAgICAgYS5wdXNoKGspOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgIH07CiAgICB9CgovLyBOb24gc3RhbmRhcmQgbWV0aG9kcwoKICAgIGlmICh0eXBlb2YgU3RyaW5nLnByb3RvdHlwZS5lbnRpdHlpZnkgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICBTdHJpbmcucHJvdG90eXBlLmVudGl0eWlmeSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMKICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8mL2csICcmYW1wOycpCiAgICAgICAgICAgICAgICAucmVwbGFjZSgvPC9nLCAnJmx0OycpCiAgICAgICAgICAgICAgICAucmVwbGFjZSgvPi9nLCAnJmd0OycpOwogICAgICAgIH07CiAgICB9CgogICAgaWYgKHR5cGVvZiBTdHJpbmcucHJvdG90eXBlLmlzQWxwaGEgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICBTdHJpbmcucHJvdG90eXBlLmlzQWxwaGEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiAodGhpcyA+PSAnYScgJiYgdGhpcyA8PSAnelx1ZmZmZicpIHx8CiAgICAgICAgICAgICAgICAodGhpcyA+PSAnQScgJiYgdGhpcyA8PSAnWlx1ZmZmZicpOwogICAgICAgIH07CiAgICB9CgogICAgaWYgKHR5cGVvZiBTdHJpbmcucHJvdG90eXBlLmlzRGlnaXQgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICBTdHJpbmcucHJvdG90eXBlLmlzRGlnaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiAodGhpcyA+PSAnMCcgJiYgdGhpcyA8PSAnOScpOwogICAgICAgIH07CiAgICB9CgogICAgaWYgKHR5cGVvZiBTdHJpbmcucHJvdG90eXBlLnN1cHBsYW50ICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgU3RyaW5nLnByb3RvdHlwZS5zdXBwbGFudCA9IGZ1bmN0aW9uIChvKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2UoL1x7KFtee31dKilcfS9nLCBmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgdmFyIHIgPSBvW2JdOwogICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiByID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgciA9PT0gJ251bWJlcicgPyByIDogYTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgIH0KCiAgICBpZiAodHlwZW9mIFN0cmluZy5wcm90b3R5cGUubmFtZSAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgIFN0cmluZy5wcm90b3R5cGUubmFtZSA9IGZ1bmN0aW9uICgpIHsKCi8vIElmIHRoZSBzdHJpbmcgbG9va3MgbGlrZSBhbiBpZGVudGlmaWVyLCB0aGVuIHdlIGNhbiByZXR1cm4gaXQgYXMgaXMuCi8vIElmIHRoZSBzdHJpbmcgY29udGFpbnMgbm8gY29udHJvbCBjaGFyYWN0ZXJzLCBubyBxdW90ZSBjaGFyYWN0ZXJzLCBhbmQgbm8KLy8gYmFja3NsYXNoIGNoYXJhY3RlcnMsIHRoZW4gd2UgY2FuIHNpbXBseSBzbGFwIHNvbWUgcXVvdGVzIGFyb3VuZCBpdC4KLy8gT3RoZXJ3aXNlIHdlIG11c3QgYWxzbyByZXBsYWNlIHRoZSBvZmZlbmRpbmcgY2hhcmFjdGVycyB3aXRoIHNhZmUKLy8gc2VxdWVuY2VzLgoKICAgICAgICAgICAgaWYgKGl4LnRlc3QodGhpcykpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChueC50ZXN0KHRoaXMpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyInICsgdGhpcy5yZXBsYWNlKG54ZywgZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGVzY2FwZXNbYV07CiAgICAgICAgICAgICAgICAgICAgaWYgKGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnXFx1JyArICgnMDAwMCcgKyBhLmNoYXJDb2RlQXQoKS50b1N0cmluZygxNikpLnNsaWNlKC00KTsKICAgICAgICAgICAgICAgIH0pICsgJyInOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAnIicgKyB0aGlzICsgJyInOwogICAgICAgIH07CiAgICB9CgoKICAgIGZ1bmN0aW9uIGNvbWJpbmUodCwgbykgewogICAgICAgIHZhciBuOwogICAgICAgIGZvciAobiBpbiBvKSB7CiAgICAgICAgICAgIGlmIChpc19vd24obywgbikpIHsKICAgICAgICAgICAgICAgIHRbbl0gPSBvW25dOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGFzc3VtZSgpIHsKICAgICAgICBpZiAob3B0aW9uLmNvdWNoKQogICAgICAgICAgICBjb21iaW5lKHByZWRlZmluZWQsIGNvdWNoKTsKCiAgICAgICAgaWYgKG9wdGlvbi5yaGlubykKICAgICAgICAgICAgY29tYmluZShwcmVkZWZpbmVkLCByaGlubyk7CgogICAgICAgIGlmIChvcHRpb24ucHJvdG90eXBlanMpCiAgICAgICAgICAgIGNvbWJpbmUocHJlZGVmaW5lZCwgcHJvdG90eXBlanMpOwoKICAgICAgICBpZiAob3B0aW9uLm5vZGUpCiAgICAgICAgICAgIGNvbWJpbmUocHJlZGVmaW5lZCwgbm9kZSk7CgogICAgICAgIGlmIChvcHRpb24uZGV2ZWwpCiAgICAgICAgICAgIGNvbWJpbmUocHJlZGVmaW5lZCwgZGV2ZWwpOwoKICAgICAgICBpZiAob3B0aW9uLmRvam8pCiAgICAgICAgICAgIGNvbWJpbmUocHJlZGVmaW5lZCwgZG9qbyk7CgogICAgICAgIGlmIChvcHRpb24uYnJvd3NlcikKICAgICAgICAgICAgY29tYmluZShwcmVkZWZpbmVkLCBicm93c2VyKTsKCiAgICAgICAgaWYgKG9wdGlvbi5qcXVlcnkpCiAgICAgICAgICAgIGNvbWJpbmUocHJlZGVmaW5lZCwganF1ZXJ5KTsKCiAgICAgICAgaWYgKG9wdGlvbi5tb290b29scykKICAgICAgICAgICAgY29tYmluZShwcmVkZWZpbmVkLCBtb290b29scyk7CgogICAgICAgIGlmIChvcHRpb24ud3NoKQogICAgICAgICAgICBjb21iaW5lKHByZWRlZmluZWQsIHdzaCk7CgogICAgICAgIGlmIChvcHRpb24uZ2xvYmFsc3RyaWN0ICYmIG9wdGlvbi5zdHJpY3QgIT09IGZhbHNlKQogICAgICAgICAgICBvcHRpb24uc3RyaWN0ID0gdHJ1ZTsKICAgIH0KCgovLyBQcm9kdWNlIGFuIGVycm9yIHdhcm5pbmcuCgogICAgZnVuY3Rpb24gcXVpdChtZXNzYWdlLCBsaW5lLCBjaHIpIHsKICAgICAgICB2YXIgcGVyY2VudGFnZSA9IE1hdGguZmxvb3IoKGxpbmUgLyBsaW5lcy5sZW5ndGgpICogMTAwKTsKCiAgICAgICAgdGhyb3cgewogICAgICAgICAgICBuYW1lOiAnSlNIaW50RXJyb3InLAogICAgICAgICAgICBsaW5lOiBsaW5lLAogICAgICAgICAgICBjaGFyYWN0ZXI6IGNociwKICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZSArICIgKCIgKyBwZXJjZW50YWdlICsgIiUgc2Nhbm5lZCkuIgogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gd2FybmluZyhtLCB0LCBhLCBiLCBjLCBkKSB7CiAgICAgICAgdmFyIGNoLCBsLCB3OwogICAgICAgIHQgPSB0IHx8IG5leHR0b2tlbjsKICAgICAgICBpZiAodC5pZCA9PT0gJyhlbmQpJykgeyAgLy8gYH4KICAgICAgICAgICAgdCA9IHRva2VuOwogICAgICAgIH0KICAgICAgICBsID0gdC5saW5lIHx8IDA7CiAgICAgICAgY2ggPSB0LmZyb20gfHwgMDsKICAgICAgICB3ID0gewogICAgICAgICAgICBpZDogJyhlcnJvciknLAogICAgICAgICAgICByYXc6IG0sCiAgICAgICAgICAgIGV2aWRlbmNlOiBsaW5lc1tsIC0gMV0gfHwgJycsCiAgICAgICAgICAgIGxpbmU6IGwsCiAgICAgICAgICAgIGNoYXJhY3RlcjogY2gsCiAgICAgICAgICAgIGE6IGEsCiAgICAgICAgICAgIGI6IGIsCiAgICAgICAgICAgIGM6IGMsCiAgICAgICAgICAgIGQ6IGQKICAgICAgICB9OwogICAgICAgIHcucmVhc29uID0gbS5zdXBwbGFudCh3KTsKICAgICAgICBKU0hJTlQuZXJyb3JzLnB1c2godyk7CiAgICAgICAgaWYgKG9wdGlvbi5wYXNzZmFpbCkgewogICAgICAgICAgICBxdWl0KCdTdG9wcGluZy4gJywgbCwgY2gpOwogICAgICAgIH0KICAgICAgICB3YXJuaW5ncyArPSAxOwogICAgICAgIGlmICh3YXJuaW5ncyA+PSBvcHRpb24ubWF4ZXJyKSB7CiAgICAgICAgICAgIHF1aXQoIlRvbyBtYW55IGVycm9ycy4iLCBsLCBjaCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB3OwogICAgfQoKICAgIGZ1bmN0aW9uIHdhcm5pbmdBdChtLCBsLCBjaCwgYSwgYiwgYywgZCkgewogICAgICAgIHJldHVybiB3YXJuaW5nKG0sIHsKICAgICAgICAgICAgbGluZTogbCwKICAgICAgICAgICAgZnJvbTogY2gKICAgICAgICB9LCBhLCBiLCBjLCBkKTsKICAgIH0KCiAgICBmdW5jdGlvbiBlcnJvcihtLCB0LCBhLCBiLCBjLCBkKSB7CiAgICAgICAgdmFyIHcgPSB3YXJuaW5nKG0sIHQsIGEsIGIsIGMsIGQpOwogICAgICAgIHF1aXQoIlN0b3BwaW5nLCB1bmFibGUgdG8gY29udGludWUuIiwgdy5saW5lLCB3LmNoYXJhY3Rlcik7CiAgICB9CgogICAgZnVuY3Rpb24gZXJyb3JBdChtLCBsLCBjaCwgYSwgYiwgYywgZCkgewogICAgICAgIHJldHVybiBlcnJvcihtLCB7CiAgICAgICAgICAgIGxpbmU6IGwsCiAgICAgICAgICAgIGZyb206IGNoCiAgICAgICAgfSwgYSwgYiwgYywgZCk7CiAgICB9CgoKCi8vIGxleGljYWwgYW5hbHlzaXMgYW5kIHRva2VuIGNvbnN0cnVjdGlvbgoKICAgIHZhciBsZXggPSAoZnVuY3Rpb24gbGV4KCkgewogICAgICAgIHZhciBjaGFyYWN0ZXIsIGZyb20sIGxpbmUsIHM7CgovLyBQcml2YXRlIGxleCBtZXRob2RzCgogICAgICAgIGZ1bmN0aW9uIG5leHRMaW5lKCkgewogICAgICAgICAgICB2YXIgYXQsCiAgICAgICAgICAgICAgICB0dzsgLy8gdHJhaWxpbmcgd2hpdGVzcGFjZSBjaGVjawoKICAgICAgICAgICAgaWYgKGxpbmUgPj0gbGluZXMubGVuZ3RoKQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgICAgICAgY2hhcmFjdGVyID0gMTsKICAgICAgICAgICAgcyA9IGxpbmVzW2xpbmVdOwogICAgICAgICAgICBsaW5lICs9IDE7CiAgICAgICAgICAgIGF0ID0gcy5zZWFyY2goLyBcdC8pOwoKICAgICAgICAgICAgaWYgKGF0ID49IDApCiAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIk1peGVkIHNwYWNlcyBhbmQgdGFicy4iLCBsaW5lLCBhdCArIDEpOwoKICAgICAgICAgICAgcyA9IHMucmVwbGFjZSgvXHQvZywgdGFiKTsKICAgICAgICAgICAgYXQgPSBzLnNlYXJjaChjeCk7CgogICAgICAgICAgICBpZiAoYXQgPj0gMCkKICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgiVW5zYWZlIGNoYXJhY3Rlci4iLCBsaW5lLCBhdCk7CgogICAgICAgICAgICBpZiAob3B0aW9uLm1heGxlbiAmJiBvcHRpb24ubWF4bGVuIDwgcy5sZW5ndGgpCiAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIkxpbmUgdG9vIGxvbmcuIiwgbGluZSwgcy5sZW5ndGgpOwoKICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHRyYWlsaW5nIHdoaXRlc3BhY2VzCiAgICAgICAgICAgIHR3ID0gcy5zZWFyY2goL1xzKyQvKTsKICAgICAgICAgICAgaWYgKG9wdGlvbi50cmFpbGluZyAmJiB+dHcgJiYgIX5zLnNlYXJjaCgvXlxzKyQvKSkKICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgiVHJhaWxpbmcgd2hpdGVzcGFjZS4iLCBsaW5lLCB0dyk7CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgovLyBQcm9kdWNlIGEgdG9rZW4gb2JqZWN0LiAgVGhlIHRva2VuIGluaGVyaXRzIGZyb20gYSBzeW50YXggc3ltYm9sLgoKICAgICAgICBmdW5jdGlvbiBpdCh0eXBlLCB2YWx1ZSkgewogICAgICAgICAgICB2YXIgaSwgdDsKICAgICAgICAgICAgaWYgKHR5cGUgPT09ICcoY29sb3IpJyB8fCB0eXBlID09PSAnKHJhbmdlKScpIHsKICAgICAgICAgICAgICAgIHQgPSB7dHlwZTogdHlwZX07CiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJyhwdW5jdHVhdG9yKScgfHwKICAgICAgICAgICAgICAgICAgICAodHlwZSA9PT0gJyhpZGVudGlmaWVyKScgJiYgaXNfb3duKHN5bnRheCwgdmFsdWUpKSkgewogICAgICAgICAgICAgICAgdCA9IHN5bnRheFt2YWx1ZV0gfHwgc3ludGF4WycoZXJyb3IpJ107CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0ID0gc3ludGF4W3R5cGVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHQgPSBPYmplY3QuY3JlYXRlKHQpOwogICAgICAgICAgICBpZiAodHlwZSA9PT0gJyhzdHJpbmcpJyB8fCB0eXBlID09PSAnKHJhbmdlKScpIHsKICAgICAgICAgICAgICAgIGlmICghb3B0aW9uLnNjcmlwdHVybCAmJiBqeC50ZXN0KHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgiU2NyaXB0IFVSTC4iLCBsaW5lLCBmcm9tKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHlwZSA9PT0gJyhpZGVudGlmaWVyKScpIHsKICAgICAgICAgICAgICAgIHQuaWRlbnRpZmllciA9IHRydWU7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09ICdfX3Byb3RvX18nICYmICFvcHRpb24ucHJvdG8pIHsKICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIlRoZSAne2F9JyBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsIGZyb20sIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09ICdfX2l0ZXJhdG9yX18nICYmICFvcHRpb24uaXRlcmF0b3IpIHsKICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIid7YX0nIGlzIG9ubHkgYXZhaWxhYmxlIGluIEphdmFTY3JpcHQgMS43LiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsIGZyb20sIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9uLm5vbWVuICYmICh2YWx1ZS5jaGFyQXQoMCkgPT09ICdfJyB8fAogICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuY2hhckF0KHZhbHVlLmxlbmd0aCAtIDEpID09PSAnXycpKSB7CiAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KCJVbmV4cGVjdGVkIHthfSBpbiAne2J9Jy4iLCBsaW5lLCBmcm9tLAogICAgICAgICAgICAgICAgICAgICAgICAiZGFuZ2xpbmcgJ18nIiwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHQudmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgdC5saW5lID0gbGluZTsKICAgICAgICAgICAgdC5jaGFyYWN0ZXIgPSBjaGFyYWN0ZXI7CiAgICAgICAgICAgIHQuZnJvbSA9IGZyb207CiAgICAgICAgICAgIGkgPSB0LmlkOwogICAgICAgICAgICBpZiAoaSAhPT0gJyhlbmRsaW5lKScpIHsKICAgICAgICAgICAgICAgIHByZXJlZyA9IGkgJiYKICAgICAgICAgICAgICAgICAgICAoKCcoLD06WyEmfD97fTsnLmluZGV4T2YoaS5jaGFyQXQoaS5sZW5ndGggLSAxKSkgPj0gMCkgfHwKICAgICAgICAgICAgICAgICAgICBpID09PSAncmV0dXJuJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgfQoKLy8gUHVibGljIGxleCBtZXRob2RzCgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChzb3VyY2UpIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc291cmNlID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgIGxpbmVzID0gc291cmNlCiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cclxuL2csICdcbicpCiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cci9nLCAnXG4nKQogICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJ1xuJyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGxpbmVzID0gc291cmNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmaXJzdCBsaW5lIGlzIGEgc2hlYmFuZyAoIyEpLCBtYWtlIGl0IGEgYmxhbmsgYW5kIG1vdmUgb24uCiAgICAgICAgICAgICAgICAvLyBTaGViYW5ncyBhcmUgdXNlZCBieSBOb2RlIHNjcmlwdHMuCiAgICAgICAgICAgICAgICBpZiAobGluZXNbMF0gJiYgbGluZXNbMF0uc3Vic3RyKDAsIDIpID09ICcjIScpCiAgICAgICAgICAgICAgICAgICAgbGluZXNbMF0gPSAnJzsKCiAgICAgICAgICAgICAgICBsaW5lID0gMDsKICAgICAgICAgICAgICAgIG5leHRMaW5lKCk7CiAgICAgICAgICAgICAgICBmcm9tID0gMTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIHJhbmdlOiBmdW5jdGlvbiAoYmVnaW4sIGVuZCkgewogICAgICAgICAgICAgICAgdmFyIGMsIHZhbHVlID0gJyc7CiAgICAgICAgICAgICAgICBmcm9tID0gY2hhcmFjdGVyOwogICAgICAgICAgICAgICAgaWYgKHMuY2hhckF0KDApICE9PSBiZWdpbikgewogICAgICAgICAgICAgICAgICAgIGVycm9yQXQoIkV4cGVjdGVkICd7YX0nIGFuZCBpbnN0ZWFkIHNhdyAne2J9Jy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSwgY2hhcmFjdGVyLCBiZWdpbiwgcy5jaGFyQXQoMCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICAgICAgICAgIHMgPSBzLnNsaWNlKDEpOwogICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciArPSAxOwogICAgICAgICAgICAgICAgICAgIGMgPSBzLmNoYXJBdCgwKTsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICcnOgogICAgICAgICAgICAgICAgICAgICAgICBlcnJvckF0KCJNaXNzaW5nICd7YX0nLiIsIGxpbmUsIGNoYXJhY3RlciwgYyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgZW5kOgogICAgICAgICAgICAgICAgICAgICAgICBzID0gcy5zbGljZSgxKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdCgnKHJhbmdlKScsIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBjYXNlICdcXCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgiVW5leHBlY3RlZCAne2F9Jy4iLCBsaW5lLCBjaGFyYWN0ZXIsIGMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSBjOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSwKCi8vIHRva2VuIC0tIHRoaXMgaXMgY2FsbGVkIGJ5IGFkdmFuY2UgdG8gZ2V0IHRoZSBuZXh0IHRva2VuLgoKICAgICAgICAgICAgdG9rZW46IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBiLCBjLCBjYXB0dXJlcywgZCwgZGVwdGgsIGhpZ2gsIGksIGwsIGxvdywgcSwgdDsKCiAgICAgICAgICAgICAgICBmdW5jdGlvbiBtYXRjaCh4KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB4LmV4ZWMocyksIHIxOwogICAgICAgICAgICAgICAgICAgIGlmIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGwgPSByWzBdLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgcjEgPSByWzFdOwogICAgICAgICAgICAgICAgICAgICAgICBjID0gcjEuY2hhckF0KDApOwogICAgICAgICAgICAgICAgICAgICAgICBzID0gcy5zdWJzdHIobCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPSBjaGFyYWN0ZXIgKyBsIC0gcjEubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgKz0gbDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBmdW5jdGlvbiBzdHJpbmcoeCkgewogICAgICAgICAgICAgICAgICAgIHZhciBjLCBqLCByID0gJyc7CgogICAgICAgICAgICAgICAgICAgIGlmIChqc29ubW9kZSAmJiB4ICE9PSAnIicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KCJTdHJpbmdzIG11c3QgdXNlIGRvdWJsZXF1b3RlLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSwgY2hhcmFjdGVyKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGVzYyhuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gcGFyc2VJbnQocy5zdWJzdHIoaiArIDEsIG4pLCAxNik7CiAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gbjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gMzIgJiYgaSA8PSAxMjYgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICE9PSAzNCAmJiBpICE9PSA5MiAmJiBpICE9PSAzOSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KCJVbm5lY2Vzc2FyeSBlc2NhcGVtZW50LiIsIGxpbmUsIGNoYXJhY3Rlcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyICs9IG47CiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBqID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChqID49IHMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbmV4dExpbmUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQXQoIlVuY2xvc2VkIHN0cmluZy4iLCBsaW5lLCBmcm9tKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjID0gcy5jaGFyQXQoaik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09PSB4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzLnN1YnN0cihqICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQoJyhzdHJpbmcpJywgciwgeCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPCAnICcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09PSAnXG4nIHx8IGMgPT09ICdccicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgiQ29udHJvbCBjaGFyYWN0ZXIgaW4gc3RyaW5nOiB7YX0uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSwgY2hhcmFjdGVyICsgaiwgcy5zbGljZSgwLCBqKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gJ1xcJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gcy5jaGFyQXQoaik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyInOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdcJyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzb25tb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgiQXZvaWQgXFwnLiIsIGxpbmUsIGNoYXJhY3Rlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYic6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9ICdcYic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gJ1xmJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ24nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAnXG4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncic6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9ICdccic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gJ1x0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3UnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzYyg0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3YnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqc29ubW9kZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIkF2b2lkIFxcdi4iLCBsaW5lLCBjaGFyYWN0ZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gJ1x2JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3gnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqc29ubW9kZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIkF2b2lkIFxceC0uIiwgbGluZSwgY2hhcmFjdGVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjKDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIkJhZCBlc2NhcGVtZW50LiIsIGxpbmUsIGNoYXJhY3Rlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgciArPSBjOwogICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgaiArPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdChuZXh0TGluZSgpID8gJyhlbmRsaW5lKScgOiAnKGVuZCknLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHQgPSBtYXRjaCh0eCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgYyA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocyAmJiBzIDwgJyEnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gcy5zdWJzdHIoMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQXQoIlVuZXhwZWN0ZWQgJ3thfScuIiwgbGluZSwgY2hhcmFjdGVyLCBzLnN1YnN0cigwLCAxKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewoKICAgIC8vICAgICAgaWRlbnRpZmllcgoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMuaXNBbHBoYSgpIHx8IGMgPT09ICdfJyB8fCBjID09PSAnJCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdCgnKGlkZW50aWZpZXIpJywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAvLyAgICAgIG51bWJlcgoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMuaXNEaWdpdCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRmluaXRlKE51bWJlcih0KSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIkJhZCBudW1iZXIgJ3thfScuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSwgY2hhcmFjdGVyLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLnN1YnN0cigwLCAxKS5pc0FscGhhKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIk1pc3Npbmcgc3BhY2UgYWZ0ZXIgJ3thfScuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsIGNoYXJhY3RlciwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gJzAnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IHQuc3Vic3RyKDEsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLmlzRGlnaXQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4uaWQgIT09ICcuJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KCJEb24ndCB1c2UgZXh0cmEgbGVhZGluZyB6ZXJvcyAne2F9Jy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsIGNoYXJhY3RlciwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGpzb25tb2RlICYmIChkID09PSAneCcgfHwgZCA9PT0gJ1gnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIkF2b2lkIDB4LS4gJ3thfScuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLCBjaGFyYWN0ZXIsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LnN1YnN0cih0Lmxlbmd0aCAtIDEpID09PSAnLicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoCiJBIHRyYWlsaW5nIGRlY2ltYWwgcG9pbnQgY2FuIGJlIGNvbmZ1c2VkIHdpdGggYSBkb3QgJ3thfScuIiwgbGluZSwgY2hhcmFjdGVyLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdCgnKG51bWJlciknLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQpIHsKCiAgICAvLyAgICAgIHN0cmluZwoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnIic6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIiciOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZyh0KTsKCiAgICAvLyAgICAgIC8vIGNvbW1lbnQKCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy8vJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIlVuZXhwZWN0ZWQgY29tbWVudC4iLCBsaW5lLCBjaGFyYWN0ZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4uY29tbWVudCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAvLyAgICAgIC8qIGNvbW1lbnQKCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy8qJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIlVuZXhwZWN0ZWQgY29tbWVudC4iLCBsaW5lLCBjaGFyYWN0ZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBzLnNlYXJjaChseCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0TGluZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQXQoIlVuY2xvc2VkIGNvbW1lbnQuIiwgbGluZSwgY2hhcmFjdGVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgKz0gaSArIDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5zdWJzdHIoaSwgMSkgPT09ICcvJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQXQoIk5lc3RlZCBjb21tZW50LiIsIGxpbmUsIGNoYXJhY3Rlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gcy5zdWJzdHIoaSArIDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4uY29tbWVudCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAvLyAgICAgIC8qbWVtYmVycyAvKmpzaGludCAvKmdsb2JhbAoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLyptZW1iZXJzJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLyptZW1iZXInOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcvKmpzaGludCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy8qanNsaW50JzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLypnbG9iYWwnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcqLyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzcGVjaWFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lOiBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcjogY2hhcmFjdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb206IGZyb20KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAvLyAgICAgIC8KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4uaWQgPT09ICcvPScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckF0KAoiQSByZWd1bGFyIGV4cHJlc3Npb24gbGl0ZXJhbCBjYW4gYmUgY29uZnVzZWQgd2l0aCAnLz0nLiIsIGxpbmUsIGZyb20pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXJlZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IHMuY2hhckF0KGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JBdCgiVW5jbG9zZWQgcmVndWxhciBleHByZXNzaW9uLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsIGZyb20pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcvJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXB0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIlVuZXNjYXBlZCAne2F9Jy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSwgZnJvbSArIGwsICcvJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gcy5zdWJzdHIoMCwgbCAtIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbTogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChxW3MuY2hhckF0KGwpXSA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFbcy5jaGFyQXQobCldID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyICs9IGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gcy5zdWJzdHIobCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxID0gcy5jaGFyQXQoMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocSA9PT0gJy8nIHx8IHEgPT09ICcqJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQXQoIkNvbmZ1c2luZyByZWd1bGFyIGV4cHJlc3Npb24uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsIGZyb20pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0KCcocmVnZXhwKScsIGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdcXCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gcy5jaGFyQXQobCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA8ICcgJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgKIlVuZXhwZWN0ZWQgY29udHJvbCBjaGFyYWN0ZXIgaW4gcmVndWxhciBleHByZXNzaW9uLiIsIGxpbmUsIGZyb20gKyBsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gJzwnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KAoiVW5leHBlY3RlZCBlc2NhcGVkIGNoYXJhY3RlciAne2F9JyBpbiByZWd1bGFyIGV4cHJlc3Npb24uIiwgbGluZSwgZnJvbSArIGwsIGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJygnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmNoYXJBdChsKSA9PT0gJz8nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocy5jaGFyQXQobCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc6JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc9JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICchJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoCiJFeHBlY3RlZCAne2F9JyBhbmQgaW5zdGVhZCBzYXcgJ3tifScuIiwgbGluZSwgZnJvbSArIGwsICc6Jywgcy5jaGFyQXQobCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZXMgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd8JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcpJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXB0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgiVW5lc2NhcGVkICd7YX0nLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLCBmcm9tICsgbCwgJyknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggLT0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcgJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHMuY2hhckF0KGwpID09PSAnICcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcSArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHEgPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KAoiU3BhY2VzIGFyZSBoYXJkIHRvIGNvdW50LiBVc2Uge3thfX0uIiwgbGluZSwgZnJvbSArIGwsIHEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1snOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IHMuY2hhckF0KGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT09ICdeJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uLnJlZ2V4cCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIkluc2VjdXJlICd7YX0nLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSwgZnJvbSArIGwsIGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocy5jaGFyQXQobCkgPT09ICddJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckF0KCJVbmVzY2FwZWQgJ3thfScuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsIGZyb20gKyBsLCAnXicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09PSAnXScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIkVtcHR5IGNsYXNzLiIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICsgbCAtIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQprbGFzczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBzLmNoYXJBdChsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnWyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnXic6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgiVW5lc2NhcGVkICd7YX0nLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSwgZnJvbSArIGwsIGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIlVuZXNjYXBlZCAne2F9Jy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLCBmcm9tICsgbCwgJy0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ10nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXEgJiYgIW9wdGlvbi5yZWdleGRhc2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgiVW5lc2NhcGVkICd7YX0nLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsIGZyb20gKyBsIC0gMSwgJy0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBrbGFzczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdcXCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBzLmNoYXJBdChsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPCAnICcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgKIlVuZXhwZWN0ZWQgY29udHJvbCBjaGFyYWN0ZXIgaW4gcmVndWxhciBleHByZXNzaW9uLiIsIGxpbmUsIGZyb20gKyBsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID09PSAnPCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgKIlVuZXhwZWN0ZWQgZXNjYXBlZCBjaGFyYWN0ZXIgJ3thfScgaW4gcmVndWxhciBleHByZXNzaW9uLiIsIGxpbmUsIGZyb20gKyBsLCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcvJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KCJVbmVzY2FwZWQgJ3thfScuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLCBmcm9tICsgbCAtIDEsICcvJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc8JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy4nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbi5yZWdleHApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nQXQoIkluc2VjdXJlICd7YX0nLiIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICsgbCwgYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnXSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJz8nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd7JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnfSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJysnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcqJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgiVW5lc2NhcGVkICd7YX0nLiIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gKyBsLCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzLmNoYXJBdChsKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnPyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcrJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyonOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5jaGFyQXQobCkgPT09ICc/JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAneyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBzLmNoYXJBdChsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA8ICcwJyB8fCBjID4gJzknKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgKIkV4cGVjdGVkIGEgbnVtYmVyIGFuZCBpbnN0ZWFkIHNhdyAne2F9Jy4iLCBsaW5lLCBmcm9tICsgbCwgYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3cgPSArYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBzLmNoYXJBdChsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPCAnMCcgfHwgYyA+ICc5JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3cgPSArYyArIChsb3cgKiAxMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2ggPSBsb3c7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT09ICcsJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2ggPSBJbmZpbml0eTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IHMuY2hhckF0KGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2ggPSArYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gcy5jaGFyQXQobCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPCAnMCcgfHwgYyA+ICc5JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2ggPSArYyArIChoaWdoICogMTApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmNoYXJBdChsKSAhPT0gJ30nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdBdCgKIkV4cGVjdGVkICd7YX0nIGFuZCBpbnN0ZWFkIHNhdyAne2J9Jy4iLCBsaW5lLCBmcm9tICsgbCwgJ30nLCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmNoYXJBdChsKSA9PT0gJz8nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvdyA+IGhpZ2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KAoiJ3thfScgc2hvdWxkIG5vdCBiZSBncmVhdGVyIHRoYW4gJ3tifScuIiwgbGluZSwgZnJvbSArIGwsIGxvdywgaGlnaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBzLnN1YnN0cigwLCBsIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyICs9IGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHMuc3Vic3RyKGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdCgnKHJlZ2V4cCknLCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdCgnKHB1bmN0dWF0b3IpJywgdCk7CgogICAgLy8gICAgICBwdW5jdHVhdG9yCgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcjJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdCgnKHB1bmN0dWF0b3IpJywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQoJyhwdW5jdHVhdG9yKScsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0oKSk7CgoKICAgIGZ1bmN0aW9uIGFkZGxhYmVsKHQsIHR5cGUpIHsKCiAgICAgICAgaWYgKHQgPT09ICdoYXNPd25Qcm9wZXJ0eScpIHsKICAgICAgICAgICAgd2FybmluZygiJ2hhc093blByb3BlcnR5JyBpcyBhIHJlYWxseSBiYWQgbmFtZS4iKTsKICAgICAgICB9CgovLyBEZWZpbmUgdCBpbiB0aGUgY3VycmVudCBmdW5jdGlvbiBpbiB0aGUgY3VycmVudCBzY29wZS4KCiAgICAgICAgaWYgKGlzX293bihmdW5jdCwgdCkgJiYgIWZ1bmN0WycoZ2xvYmFsKSddKSB7CiAgICAgICAgICAgIGlmIChmdW5jdFt0XSA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgaWYgKG9wdGlvbi5sYXRlZGVmKQogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIid7YX0nIHdhcyB1c2VkIGJlZm9yZSBpdCB3YXMgZGVmaW5lZC4iLCBuZXh0dG9rZW4sIHQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCFvcHRpb24uc2hhZG93KQogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIid7YX0nIGlzIGFscmVhZHkgZGVmaW5lZC4iLCBuZXh0dG9rZW4sIHQpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdFt0XSA9IHR5cGU7CiAgICAgICAgaWYgKGZ1bmN0WycoZ2xvYmFsKSddKSB7CiAgICAgICAgICAgIGdsb2JhbFt0XSA9IGZ1bmN0OwogICAgICAgICAgICBpZiAoaXNfb3duKGltcGxpZWQsIHQpKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uLmxhdGVkZWYpCiAgICAgICAgICAgICAgICAgICAgd2FybmluZygiJ3thfScgd2FzIHVzZWQgYmVmb3JlIGl0IHdhcyBkZWZpbmVkLiIsIG5leHR0b2tlbiwgdCk7CiAgICAgICAgICAgICAgICBkZWxldGUgaW1wbGllZFt0XTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNjb3BlW3RdID0gZnVuY3Q7CiAgICAgICAgfQogICAgfQoKCiAgICBmdW5jdGlvbiBkb09wdGlvbigpIHsKICAgICAgICB2YXIgYiwgb2JqLCBmaWx0ZXIsIG8gPSBuZXh0dG9rZW4udmFsdWUsIHQsIHY7CiAgICAgICAgc3dpdGNoIChvKSB7CiAgICAgICAgY2FzZSAnKi8nOgogICAgICAgICAgICBlcnJvcigiVW5iZWd1biBjb21tZW50LiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICcvKm1lbWJlcnMnOgogICAgICAgIGNhc2UgJy8qbWVtYmVyJzoKICAgICAgICAgICAgbyA9ICcvKm1lbWJlcnMnOwogICAgICAgICAgICBpZiAoIW1lbWJlcnNPbmx5KSB7CiAgICAgICAgICAgICAgICBtZW1iZXJzT25seSA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9iaiA9IG1lbWJlcnNPbmx5OwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICcvKmpzaGludCc6CiAgICAgICAgY2FzZSAnLypqc2xpbnQnOgogICAgICAgICAgICBvYmogPSBvcHRpb247CiAgICAgICAgICAgIGZpbHRlciA9IGJvb2xPcHRpb25zOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICcvKmdsb2JhbCc6CiAgICAgICAgICAgIG9iaiA9IHByZWRlZmluZWQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGVycm9yKCJXaGF0PyIpOwogICAgICAgIH0KICAgICAgICB0ID0gbGV4LnRva2VuKCk7Cmxvb3A6ICAgZm9yICg7OykgewogICAgICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgICAgICBpZiAodC50eXBlID09PSAnc3BlY2lhbCcgJiYgdC52YWx1ZSA9PT0gJyovJykgewogICAgICAgICAgICAgICAgICAgIGJyZWFrIGxvb3A7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodC5pZCAhPT0gJyhlbmRsaW5lKScgJiYgdC5pZCAhPT0gJywnKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0ID0gbGV4LnRva2VuKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHQudHlwZSAhPT0gJyhzdHJpbmcpJyAmJiB0LnR5cGUgIT09ICcoaWRlbnRpZmllciknICYmCiAgICAgICAgICAgICAgICAgICAgbyAhPT0gJy8qbWVtYmVycycpIHsKICAgICAgICAgICAgICAgIGVycm9yKCJCYWQgb3B0aW9uLiIsIHQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHYgPSBsZXgudG9rZW4oKTsKICAgICAgICAgICAgaWYgKHYuaWQgPT09ICc6JykgewogICAgICAgICAgICAgICAgdiA9IGxleC50b2tlbigpOwogICAgICAgICAgICAgICAgaWYgKG9iaiA9PT0gbWVtYmVyc09ubHkpIHsKICAgICAgICAgICAgICAgICAgICBlcnJvcigiRXhwZWN0ZWQgJ3thfScgYW5kIGluc3RlYWQgc2F3ICd7Yn0nLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LCAnKi8nLCAnOicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHQudmFsdWUgPT09ICdpbmRlbnQnICYmIChvID09PSAnLypqc2hpbnQnIHx8IG8gPT09ICcvKmpzbGludCcpKSB7CiAgICAgICAgICAgICAgICAgICAgYiA9ICt2LnZhbHVlOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYiAhPT0gJ251bWJlcicgfHwgIWlzRmluaXRlKGIpIHx8IGIgPD0gMCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihiKSAhPT0gYikgewogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiRXhwZWN0ZWQgYSBzbWFsbCBpbnRlZ2VyIGFuZCBpbnN0ZWFkIHNhdyAne2F9Jy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYsIHYudmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvYmoud2hpdGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIG9iai5pbmRlbnQgPSBiOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0LnZhbHVlID09PSAnbWF4ZXJyJyAmJiAobyA9PT0gJy8qanNoaW50JyB8fCBvID09PSAnLypqc2xpbnQnKSkgewogICAgICAgICAgICAgICAgICAgIGIgPSArdi52YWx1ZTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGIgIT09ICdudW1iZXInIHx8ICFpc0Zpbml0ZShiKSB8fCBiIDw9IDAgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoYikgIT09IGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIkV4cGVjdGVkIGEgc21hbGwgaW50ZWdlciBhbmQgaW5zdGVhZCBzYXcgJ3thfScuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LCB2LnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb2JqLm1heGVyciA9IGI7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHQudmFsdWUgPT09ICdtYXhsZW4nICYmIChvID09PSAnLypqc2hpbnQnIHx8IG8gPT09ICcvKmpzbGludCcpKSB7CiAgICAgICAgICAgICAgICAgICAgYiA9ICt2LnZhbHVlOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYiAhPT0gJ251bWJlcicgfHwgIWlzRmluaXRlKGIpIHx8IGIgPD0gMCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihiKSAhPT0gYikgewogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiRXhwZWN0ZWQgYSBzbWFsbCBpbnRlZ2VyIGFuZCBpbnN0ZWFkIHNhdyAne2F9Jy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYsIHYudmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvYmoubWF4bGVuID0gYjsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodi52YWx1ZSA9PT0gJ3RydWUnKSB7CiAgICAgICAgICAgICAgICAgICAgb2JqW3QudmFsdWVdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodi52YWx1ZSA9PT0gJ2ZhbHNlJykgewogICAgICAgICAgICAgICAgICAgIG9ialt0LnZhbHVlXSA9IGZhbHNlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBlcnJvcigiQmFkIG9wdGlvbiB2YWx1ZS4iLCB2KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHQgPSBsZXgudG9rZW4oKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChvID09PSAnLypqc2hpbnQnIHx8IG8gPT09ICcvKmpzbGludCcpIHsKICAgICAgICAgICAgICAgICAgICBlcnJvcigiTWlzc2luZyBvcHRpb24gdmFsdWUuIiwgdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBvYmpbdC52YWx1ZV0gPSBmYWxzZTsKICAgICAgICAgICAgICAgIHQgPSB2OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChmaWx0ZXIpIHsKICAgICAgICAgICAgYXNzdW1lKCk7CiAgICAgICAgfQogICAgfQoKCi8vIFdlIG5lZWQgYSBwZWVrIGZ1bmN0aW9uLiBJZiBpdCBoYXMgYW4gYXJndW1lbnQsIGl0IHBlZWtzIHRoYXQgbXVjaCBmYXJ0aGVyCi8vIGFoZWFkLiBJdCBpcyB1c2VkIHRvIGRpc3Rpbmd1aXNoCi8vICAgICBmb3IgKCB2YXIgaSBpbiAuLi4KLy8gZnJvbQovLyAgICAgZm9yICggdmFyIGkgPSAuLi4KCiAgICBmdW5jdGlvbiBwZWVrKHApIHsKICAgICAgICB2YXIgaSA9IHAgfHwgMCwgaiA9IDAsIHQ7CgogICAgICAgIHdoaWxlIChqIDw9IGkpIHsKICAgICAgICAgICAgdCA9IGxvb2thaGVhZFtqXTsKICAgICAgICAgICAgaWYgKCF0KSB7CiAgICAgICAgICAgICAgICB0ID0gbG9va2FoZWFkW2pdID0gbGV4LnRva2VuKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaiArPSAxOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdDsKICAgIH0KCgoKLy8gUHJvZHVjZSB0aGUgbmV4dCB0b2tlbi4gSXQgbG9va3MgZm9yIHByb2dyYW1taW5nIGVycm9ycy4KCiAgICBmdW5jdGlvbiBhZHZhbmNlKGlkLCB0KSB7CiAgICAgICAgc3dpdGNoICh0b2tlbi5pZCkgewogICAgICAgIGNhc2UgJyhudW1iZXIpJzoKICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJy4nKSB7CiAgICAgICAgICAgICAgICB3YXJuaW5nKCJBIGRvdCBmb2xsb3dpbmcgYSBudW1iZXIgY2FuIGJlIGNvbmZ1c2VkIHdpdGggYSBkZWNpbWFsIHBvaW50LiIsIHRva2VuKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICctJzoKICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJy0nIHx8IG5leHR0b2tlbi5pZCA9PT0gJy0tJykgewogICAgICAgICAgICAgICAgd2FybmluZygiQ29uZnVzaW5nIG1pbnVzc2VzLiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJysnOgogICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkID09PSAnKycgfHwgbmV4dHRva2VuLmlkID09PSAnKysnKSB7CiAgICAgICAgICAgICAgICB3YXJuaW5nKCJDb25mdXNpbmcgcGx1c3Nlcy4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICcoc3RyaW5nKScgfHwgdG9rZW4uaWRlbnRpZmllcikgewogICAgICAgICAgICBhbm9ubmFtZSA9IHRva2VuLnZhbHVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlkICYmIG5leHR0b2tlbi5pZCAhPT0gaWQpIHsKICAgICAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICcoZW5kKScpIHsKICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJVbm1hdGNoZWQgJ3thfScuIiwgdCwgdC5pZCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIkV4cGVjdGVkICd7YX0nIHRvIG1hdGNoICd7Yn0nIGZyb20gbGluZSB7Y30gYW5kIGluc3RlYWQgc2F3ICd7ZH0nLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0dG9rZW4sIGlkLCB0LmlkLCB0LmxpbmUsIG5leHR0b2tlbi52YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dHRva2VuLnR5cGUgIT09ICcoaWRlbnRpZmllciknIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0dG9rZW4udmFsdWUgIT09IGlkKSB7CiAgICAgICAgICAgICAgICB3YXJuaW5nKCJFeHBlY3RlZCAne2F9JyBhbmQgaW5zdGVhZCBzYXcgJ3tifScuIiwKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dHRva2VuLCBpZCwgbmV4dHRva2VuLnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBwcmV2dG9rZW4gPSB0b2tlbjsKICAgICAgICB0b2tlbiA9IG5leHR0b2tlbjsKICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgIG5leHR0b2tlbiA9IGxvb2thaGVhZC5zaGlmdCgpIHx8IGxleC50b2tlbigpOwogICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkID09PSAnKGVuZCknIHx8IG5leHR0b2tlbi5pZCA9PT0gJyhlcnJvciknKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5leHR0b2tlbi50eXBlID09PSAnc3BlY2lhbCcpIHsKICAgICAgICAgICAgICAgIGRvT3B0aW9uKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkICE9PSAnKGVuZGxpbmUpJykgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKCi8vIFRoaXMgaXMgdGhlIGhlYXJ0IG9mIEpTSElOVCwgdGhlIFByYXR0IHBhcnNlci4gSW4gYWRkaXRpb24gdG8gcGFyc2luZywgaXQKLy8gaXMgbG9va2luZyBmb3IgYWQgaG9jIGxpbnQgcGF0dGVybnMuIFdlIGFkZCAuZnVkIHRvIFByYXR0J3MgbW9kZWwsIHdoaWNoIGlzCi8vIGxpa2UgLm51ZCBleGNlcHQgdGhhdCBpdCBpcyBvbmx5IHVzZWQgb24gdGhlIGZpcnN0IHRva2VuIG9mIGEgc3RhdGVtZW50LgovLyBIYXZpbmcgLmZ1ZCBtYWtlcyBpdCBtdWNoIGVhc2llciB0byBkZWZpbmUgc3RhdGVtZW50LW9yaWVudGVkIGxhbmd1YWdlcyBsaWtlCi8vIEphdmFTY3JpcHQuIEkgcmV0YWluZWQgUHJhdHQncyBub21lbmNsYXR1cmUuCgovLyAubnVkICAgICBOdWxsIGRlbm90YXRpb24KLy8gLmZ1ZCAgICAgRmlyc3QgbnVsbCBkZW5vdGF0aW9uCi8vIC5sZWQgICAgIExlZnQgZGVub3RhdGlvbgovLyAgbGJwICAgICBMZWZ0IGJpbmRpbmcgcG93ZXIKLy8gIHJicCAgICAgUmlnaHQgYmluZGluZyBwb3dlcgoKLy8gVGhleSBhcmUgZWxlbWVudHMgb2YgdGhlIHBhcnNpbmcgbWV0aG9kIGNhbGxlZCBUb3AgRG93biBPcGVyYXRvciBQcmVjZWRlbmNlLgoKICAgIGZ1bmN0aW9uIGV4cHJlc3Npb24ocmJwLCBpbml0aWFsKSB7CiAgICAgICAgdmFyIGxlZnQsIGlzQXJyYXkgPSBmYWxzZTsKCiAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJyhlbmQpJykKICAgICAgICAgICAgZXJyb3IoIlVuZXhwZWN0ZWQgZWFybHkgZW5kIG9mIHByb2dyYW0uIiwgdG9rZW4pOwoKICAgICAgICBhZHZhbmNlKCk7CiAgICAgICAgaWYgKGluaXRpYWwpIHsKICAgICAgICAgICAgYW5vbm5hbWUgPSAnYW5vbnltb3VzJzsKICAgICAgICAgICAgZnVuY3RbJyh2ZXJiKSddID0gdG9rZW4udmFsdWU7CiAgICAgICAgfQogICAgICAgIGlmIChpbml0aWFsID09PSB0cnVlICYmIHRva2VuLmZ1ZCkgewogICAgICAgICAgICBsZWZ0ID0gdG9rZW4uZnVkKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKHRva2VuLm51ZCkgewogICAgICAgICAgICAgICAgbGVmdCA9IHRva2VuLm51ZCgpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKG5leHR0b2tlbi50eXBlID09PSAnKG51bWJlciknICYmIHRva2VuLmlkID09PSAnLicpIHsKICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJBIGxlYWRpbmcgZGVjaW1hbCBwb2ludCBjYW4gYmUgY29uZnVzZWQgd2l0aCBhIGRvdDogJy57YX0nLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiwgbmV4dHRva2VuLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBhZHZhbmNlKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBlcnJvcigiRXhwZWN0ZWQgYW4gaWRlbnRpZmllciBhbmQgaW5zdGVhZCBzYXcgJ3thfScuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLCB0b2tlbi5pZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKHJicCA8IG5leHR0b2tlbi5sYnApIHsKICAgICAgICAgICAgICAgIGlzQXJyYXkgPSB0b2tlbi52YWx1ZSA9PSAnQXJyYXknOwogICAgICAgICAgICAgICAgYWR2YW5jZSgpOwogICAgICAgICAgICAgICAgaWYgKGlzQXJyYXkgJiYgdG9rZW4uaWQgPT0gJygnICYmIG5leHR0b2tlbi5pZCA9PSAnKScpCiAgICAgICAgICAgICAgICAgICAgd2FybmluZygiVXNlIHRoZSBhcnJheSBsaXRlcmFsIG5vdGF0aW9uIFtdLiIsIHRva2VuKTsKICAgICAgICAgICAgICAgIGlmICh0b2tlbi5sZWQpIHsKICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gdG9rZW4ubGVkKGxlZnQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBlcnJvcigiRXhwZWN0ZWQgYW4gb3BlcmF0b3IgYW5kIGluc3RlYWQgc2F3ICd7YX0nLiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLCB0b2tlbi5pZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxlZnQ7CiAgICB9CgoKLy8gRnVuY3Rpb25zIGZvciBjb25mb3JtYW5jZSBvZiBzdHlsZS4KCiAgICBmdW5jdGlvbiBhZGphY2VudChsZWZ0LCByaWdodCkgewogICAgICAgIGxlZnQgPSBsZWZ0IHx8IHRva2VuOwogICAgICAgIHJpZ2h0ID0gcmlnaHQgfHwgbmV4dHRva2VuOwogICAgICAgIGlmIChvcHRpb24ud2hpdGUpIHsKICAgICAgICAgICAgaWYgKGxlZnQuY2hhcmFjdGVyICE9PSByaWdodC5mcm9tICYmIGxlZnQubGluZSA9PT0gcmlnaHQubGluZSkgewogICAgICAgICAgICAgICAgd2FybmluZygiVW5leHBlY3RlZCBzcGFjZSBhZnRlciAne2F9Jy4iLCByaWdodCwgbGVmdC52YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gbm9icmVhayhsZWZ0LCByaWdodCkgewogICAgICAgIGxlZnQgPSBsZWZ0IHx8IHRva2VuOwogICAgICAgIHJpZ2h0ID0gcmlnaHQgfHwgbmV4dHRva2VuOwogICAgICAgIGlmIChvcHRpb24ud2hpdGUgJiYgKGxlZnQuY2hhcmFjdGVyICE9PSByaWdodC5mcm9tIHx8IGxlZnQubGluZSAhPT0gcmlnaHQubGluZSkpIHsKICAgICAgICAgICAgd2FybmluZygiVW5leHBlY3RlZCBzcGFjZSBiZWZvcmUgJ3thfScuIiwgcmlnaHQsIHJpZ2h0LnZhbHVlKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gbm9zcGFjZShsZWZ0LCByaWdodCkgewogICAgICAgIGxlZnQgPSBsZWZ0IHx8IHRva2VuOwogICAgICAgIHJpZ2h0ID0gcmlnaHQgfHwgbmV4dHRva2VuOwogICAgICAgIGlmIChvcHRpb24ud2hpdGUgJiYgIWxlZnQuY29tbWVudCkgewogICAgICAgICAgICBpZiAobGVmdC5saW5lID09PSByaWdodC5saW5lKSB7CiAgICAgICAgICAgICAgICBhZGphY2VudChsZWZ0LCByaWdodCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gbm9uYWRqYWNlbnQobGVmdCwgcmlnaHQpIHsKICAgICAgICBpZiAob3B0aW9uLndoaXRlKSB7CiAgICAgICAgICAgIGxlZnQgPSBsZWZ0IHx8IHRva2VuOwogICAgICAgICAgICByaWdodCA9IHJpZ2h0IHx8IG5leHR0b2tlbjsKICAgICAgICAgICAgaWYgKGxlZnQubGluZSA9PT0gcmlnaHQubGluZSAmJiBsZWZ0LmNoYXJhY3RlciA9PT0gcmlnaHQuZnJvbSkgewogICAgICAgICAgICAgICAgd2FybmluZygiTWlzc2luZyBzcGFjZSBhZnRlciAne2F9Jy4iLAogICAgICAgICAgICAgICAgICAgICAgICBuZXh0dG9rZW4sIGxlZnQudmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIG5vYnJlYWtub25hZGphY2VudChsZWZ0LCByaWdodCkgewogICAgICAgIGxlZnQgPSBsZWZ0IHx8IHRva2VuOwogICAgICAgIHJpZ2h0ID0gcmlnaHQgfHwgbmV4dHRva2VuOwogICAgICAgIGlmICghb3B0aW9uLmxheGJyZWFrICYmIGxlZnQubGluZSAhPT0gcmlnaHQubGluZSkgewogICAgICAgICAgICB3YXJuaW5nKCJCYWQgbGluZSBicmVha2luZyBiZWZvcmUgJ3thfScuIiwgcmlnaHQsIHJpZ2h0LmlkKTsKICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbi53aGl0ZSkgewogICAgICAgICAgICBsZWZ0ID0gbGVmdCB8fCB0b2tlbjsKICAgICAgICAgICAgcmlnaHQgPSByaWdodCB8fCBuZXh0dG9rZW47CiAgICAgICAgICAgIGlmIChsZWZ0LmNoYXJhY3RlciA9PT0gcmlnaHQuZnJvbSkgewogICAgICAgICAgICAgICAgd2FybmluZygiTWlzc2luZyBzcGFjZSBhZnRlciAne2F9Jy4iLAogICAgICAgICAgICAgICAgICAgICAgICBuZXh0dG9rZW4sIGxlZnQudmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGluZGVudGF0aW9uKGJpYXMpIHsKICAgICAgICB2YXIgaTsKICAgICAgICBpZiAob3B0aW9uLndoaXRlICYmIG5leHR0b2tlbi5pZCAhPT0gJyhlbmQpJykgewogICAgICAgICAgICBpID0gaW5kZW50ICsgKGJpYXMgfHwgMCk7CiAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uZnJvbSAhPT0gaSkgewogICAgICAgICAgICAgICAgd2FybmluZygKIkV4cGVjdGVkICd7YX0nIHRvIGhhdmUgYW4gaW5kZW50YXRpb24gYXQge2J9IGluc3RlYWQgYXQge2N9LiIsCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHR0b2tlbiwgbmV4dHRva2VuLnZhbHVlLCBpLCBuZXh0dG9rZW4uZnJvbSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gbm9saW5lYnJlYWsodCkgewogICAgICAgIHQgPSB0IHx8IHRva2VuOwogICAgICAgIGlmICh0LmxpbmUgIT09IG5leHR0b2tlbi5saW5lKSB7CiAgICAgICAgICAgIHdhcm5pbmcoIkxpbmUgYnJlYWtpbmcgZXJyb3IgJ3thfScuIiwgdCwgdC52YWx1ZSk7CiAgICAgICAgfQogICAgfQoKCiAgICBmdW5jdGlvbiBjb21tYSgpIHsKICAgICAgICBpZiAodG9rZW4ubGluZSAhPT0gbmV4dHRva2VuLmxpbmUpIHsKICAgICAgICAgICAgaWYgKCFvcHRpb24ubGF4YnJlYWspIHsKICAgICAgICAgICAgICAgIHdhcm5pbmcoIkJhZCBsaW5lIGJyZWFraW5nIGJlZm9yZSAne2F9Jy4iLCB0b2tlbiwgbmV4dHRva2VuLmlkKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodG9rZW4uY2hhcmFjdGVyICE9PSBuZXh0dG9rZW4uZnJvbSAmJiBvcHRpb24ud2hpdGUpIHsKICAgICAgICAgICAgd2FybmluZygiVW5leHBlY3RlZCBzcGFjZSBhZnRlciAne2F9Jy4iLCBuZXh0dG9rZW4sIHRva2VuLnZhbHVlKTsKICAgICAgICB9CiAgICAgICAgYWR2YW5jZSgnLCcpOwogICAgICAgIG5vbmFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOwogICAgfQoKCi8vIEZ1bmN0aW9uYWwgY29uc3RydWN0b3JzIGZvciBtYWtpbmcgdGhlIHN5bWJvbHMgdGhhdCB3aWxsIGJlIGluaGVyaXRlZCBieQovLyB0b2tlbnMuCgogICAgZnVuY3Rpb24gc3ltYm9sKHMsIHApIHsKICAgICAgICB2YXIgeCA9IHN5bnRheFtzXTsKICAgICAgICBpZiAoIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgIHN5bnRheFtzXSA9IHggPSB7CiAgICAgICAgICAgICAgICBpZDogcywKICAgICAgICAgICAgICAgIGxicDogcCwKICAgICAgICAgICAgICAgIHZhbHVlOiBzCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiB4OwogICAgfQoKCiAgICBmdW5jdGlvbiBkZWxpbShzKSB7CiAgICAgICAgcmV0dXJuIHN5bWJvbChzLCAwKTsKICAgIH0KCgogICAgZnVuY3Rpb24gc3RtdChzLCBmKSB7CiAgICAgICAgdmFyIHggPSBkZWxpbShzKTsKICAgICAgICB4LmlkZW50aWZpZXIgPSB4LnJlc2VydmVkID0gdHJ1ZTsKICAgICAgICB4LmZ1ZCA9IGY7CiAgICAgICAgcmV0dXJuIHg7CiAgICB9CgoKICAgIGZ1bmN0aW9uIGJsb2Nrc3RtdChzLCBmKSB7CiAgICAgICAgdmFyIHggPSBzdG10KHMsIGYpOwogICAgICAgIHguYmxvY2sgPSB0cnVlOwogICAgICAgIHJldHVybiB4OwogICAgfQoKCiAgICBmdW5jdGlvbiByZXNlcnZlTmFtZSh4KSB7CiAgICAgICAgdmFyIGMgPSB4LmlkLmNoYXJBdCgwKTsKICAgICAgICBpZiAoKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnWicpKSB7CiAgICAgICAgICAgIHguaWRlbnRpZmllciA9IHgucmVzZXJ2ZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4geDsKICAgIH0KCgogICAgZnVuY3Rpb24gcHJlZml4KHMsIGYpIHsKICAgICAgICB2YXIgeCA9IHN5bWJvbChzLCAxNTApOwogICAgICAgIHJlc2VydmVOYW1lKHgpOwogICAgICAgIHgubnVkID0gKHR5cGVvZiBmID09PSAnZnVuY3Rpb24nKSA/IGYgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMucmlnaHQgPSBleHByZXNzaW9uKDE1MCk7CiAgICAgICAgICAgIHRoaXMuYXJpdHkgPSAndW5hcnknOwogICAgICAgICAgICBpZiAodGhpcy5pZCA9PT0gJysrJyB8fCB0aGlzLmlkID09PSAnLS0nKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uLnBsdXNwbHVzKSB7CiAgICAgICAgICAgICAgICAgICAgd2FybmluZygiVW5leHBlY3RlZCB1c2Ugb2YgJ3thfScuIiwgdGhpcywgdGhpcy5pZCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCghdGhpcy5yaWdodC5pZGVudGlmaWVyIHx8IHRoaXMucmlnaHQucmVzZXJ2ZWQpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmlnaHQuaWQgIT09ICcuJyAmJiB0aGlzLnJpZ2h0LmlkICE9PSAnWycpIHsKICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJCYWQgb3BlcmFuZC4iLCB0aGlzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIHJldHVybiB4OwogICAgfQoKCiAgICBmdW5jdGlvbiB0eXBlKHMsIGYpIHsKICAgICAgICB2YXIgeCA9IGRlbGltKHMpOwogICAgICAgIHgudHlwZSA9IHM7CiAgICAgICAgeC5udWQgPSBmOwogICAgICAgIHJldHVybiB4OwogICAgfQoKCiAgICBmdW5jdGlvbiByZXNlcnZlKHMsIGYpIHsKICAgICAgICB2YXIgeCA9IHR5cGUocywgZik7CiAgICAgICAgeC5pZGVudGlmaWVyID0geC5yZXNlcnZlZCA9IHRydWU7CiAgICAgICAgcmV0dXJuIHg7CiAgICB9CgoKICAgIGZ1bmN0aW9uIHJlc2VydmV2YXIocywgdikgewogICAgICAgIHJldHVybiByZXNlcnZlKHMsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiB2ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICB2KHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0pOwogICAgfQoKCiAgICBmdW5jdGlvbiBpbmZpeChzLCBmLCBwLCB3KSB7CiAgICAgICAgdmFyIHggPSBzeW1ib2wocywgcCk7CiAgICAgICAgcmVzZXJ2ZU5hbWUoeCk7CiAgICAgICAgeC5sZWQgPSBmdW5jdGlvbiAobGVmdCkgewogICAgICAgICAgICBpZiAoIXcpIHsKICAgICAgICAgICAgICAgIG5vYnJlYWtub25hZGphY2VudChwcmV2dG9rZW4sIHRva2VuKTsKICAgICAgICAgICAgICAgIG5vbmFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgcmV0dXJuIGYobGVmdCwgdGhpcyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0OwogICAgICAgICAgICAgICAgdGhpcy5yaWdodCA9IGV4cHJlc3Npb24ocCk7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHg7CiAgICB9CgoKICAgIGZ1bmN0aW9uIHJlbGF0aW9uKHMsIGYpIHsKICAgICAgICB2YXIgeCA9IHN5bWJvbChzLCAxMDApOwogICAgICAgIHgubGVkID0gZnVuY3Rpb24gKGxlZnQpIHsKICAgICAgICAgICAgbm9icmVha25vbmFkamFjZW50KHByZXZ0b2tlbiwgdG9rZW4pOwogICAgICAgICAgICBub25hZGphY2VudCh0b2tlbiwgbmV4dHRva2VuKTsKICAgICAgICAgICAgdmFyIHJpZ2h0ID0gZXhwcmVzc2lvbigxMDApOwogICAgICAgICAgICBpZiAoKGxlZnQgJiYgbGVmdC5pZCA9PT0gJ05hTicpIHx8IChyaWdodCAmJiByaWdodC5pZCA9PT0gJ05hTicpKSB7CiAgICAgICAgICAgICAgICB3YXJuaW5nKCJVc2UgdGhlIGlzTmFOIGZ1bmN0aW9uIHRvIGNvbXBhcmUgd2l0aCBOYU4uIiwgdGhpcyk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZikgewogICAgICAgICAgICAgICAgZi5hcHBseSh0aGlzLCBbbGVmdCwgcmlnaHRdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobGVmdC5pZCA9PT0gJyEnKSB7CiAgICAgICAgICAgICAgICB3YXJuaW5nKCJDb25mdXNpbmcgdXNlIG9mICd7YX0nLiIsIGxlZnQsICchJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJpZ2h0LmlkID09PSAnIScpIHsKICAgICAgICAgICAgICAgIHdhcm5pbmcoIkNvbmZ1c2luZyB1c2Ugb2YgJ3thfScuIiwgbGVmdCwgJyEnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0OwogICAgICAgICAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHg7CiAgICB9CgoKICAgIGZ1bmN0aW9uIGlzUG9vclJlbGF0aW9uKG5vZGUpIHsKICAgICAgICByZXR1cm4gbm9kZSAmJgogICAgICAgICAgICAgICgobm9kZS50eXBlID09PSAnKG51bWJlciknICYmICtub2RlLnZhbHVlID09PSAwKSB8fAogICAgICAgICAgICAgICAobm9kZS50eXBlID09PSAnKHN0cmluZyknICYmIG5vZGUudmFsdWUgPT09ICcnKSB8fAogICAgICAgICAgICAgICAobm9kZS50eXBlID09PSAnbnVsbCcgJiYgIW9wdGlvbi5lcW51bGwpIHx8CiAgICAgICAgICAgICAgICBub2RlLnR5cGUgPT09ICd0cnVlJyB8fAogICAgICAgICAgICAgICAgbm9kZS50eXBlID09PSAnZmFsc2UnIHx8CiAgICAgICAgICAgICAgICBub2RlLnR5cGUgPT09ICd1bmRlZmluZWQnKTsKICAgIH0KCgogICAgZnVuY3Rpb24gYXNzaWdub3AocywgZikgewogICAgICAgIHN5bWJvbChzLCAyMCkuZXhwcyA9IHRydWU7CiAgICAgICAgcmV0dXJuIGluZml4KHMsIGZ1bmN0aW9uIChsZWZ0LCB0aGF0KSB7CiAgICAgICAgICAgIHZhciBsOwogICAgICAgICAgICB0aGF0LmxlZnQgPSBsZWZ0OwogICAgICAgICAgICBpZiAocHJlZGVmaW5lZFtsZWZ0LnZhbHVlXSA9PT0gZmFsc2UgJiYKICAgICAgICAgICAgICAgICAgICBzY29wZVtsZWZ0LnZhbHVlXVsnKGdsb2JhbCknXSA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgd2FybmluZygiUmVhZCBvbmx5LiIsIGxlZnQpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGxlZnRbJ2Z1bmN0aW9uJ10pIHsKICAgICAgICAgICAgICAgIHdhcm5pbmcoIid7YX0nIGlzIGEgZnVuY3Rpb24uIiwgbGVmdCwgbGVmdC52YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGxlZnQpIHsKICAgICAgICAgICAgICAgIGlmIChsZWZ0LmlkID09PSAnLicgfHwgbGVmdC5pZCA9PT0gJ1snKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFsZWZ0LmxlZnQgfHwgbGVmdC5sZWZ0LnZhbHVlID09PSAnYXJndW1lbnRzJykgewogICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCdCYWQgYXNzaWdubWVudC4nLCB0aGF0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhhdC5yaWdodCA9IGV4cHJlc3Npb24oMTkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGF0OwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsZWZ0LmlkZW50aWZpZXIgJiYgIWxlZnQucmVzZXJ2ZWQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZnVuY3RbbGVmdC52YWx1ZV0gPT09ICdleGNlcHRpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIkRvIG5vdCBhc3NpZ24gdG8gdGhlIGV4Y2VwdGlvbiBwYXJhbWV0ZXIuIiwgbGVmdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoYXQucmlnaHQgPSBleHByZXNzaW9uKDE5KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChsZWZ0ID09PSBzeW50YXhbJ2Z1bmN0aW9uJ10pIHsKICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKAoiRXhwZWN0ZWQgYW4gaWRlbnRpZmllciBpbiBhbiBhc3NpZ25tZW50IGFuZCBpbnN0ZWFkIHNhdyBhIGZ1bmN0aW9uIGludm9jYXRpb24uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJyb3IoIkJhZCBhc3NpZ25tZW50LiIsIHRoYXQpOwogICAgICAgIH0sIDIwKTsKICAgIH0KCgogICAgZnVuY3Rpb24gYml0d2lzZShzLCBmLCBwKSB7CiAgICAgICAgdmFyIHggPSBzeW1ib2wocywgcCk7CiAgICAgICAgcmVzZXJ2ZU5hbWUoeCk7CiAgICAgICAgeC5sZWQgPSAodHlwZW9mIGYgPT09ICdmdW5jdGlvbicpID8gZiA6IGZ1bmN0aW9uIChsZWZ0KSB7CiAgICAgICAgICAgIGlmIChvcHRpb24uYml0d2lzZSkgewogICAgICAgICAgICAgICAgd2FybmluZygiVW5leHBlY3RlZCB1c2Ugb2YgJ3thfScuIiwgdGhpcywgdGhpcy5pZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdDsKICAgICAgICAgICAgdGhpcy5yaWdodCA9IGV4cHJlc3Npb24ocCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHg7CiAgICB9CgoKICAgIGZ1bmN0aW9uIGJpdHdpc2Vhc3NpZ25vcChzKSB7CiAgICAgICAgc3ltYm9sKHMsIDIwKS5leHBzID0gdHJ1ZTsKICAgICAgICByZXR1cm4gaW5maXgocywgZnVuY3Rpb24gKGxlZnQsIHRoYXQpIHsKICAgICAgICAgICAgaWYgKG9wdGlvbi5iaXR3aXNlKSB7CiAgICAgICAgICAgICAgICB3YXJuaW5nKCJVbmV4cGVjdGVkIHVzZSBvZiAne2F9Jy4iLCB0aGF0LCB0aGF0LmlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBub25hZGphY2VudChwcmV2dG9rZW4sIHRva2VuKTsKICAgICAgICAgICAgbm9uYWRqYWNlbnQodG9rZW4sIG5leHR0b2tlbik7CiAgICAgICAgICAgIGlmIChsZWZ0KSB7CiAgICAgICAgICAgICAgICBpZiAobGVmdC5pZCA9PT0gJy4nIHx8IGxlZnQuaWQgPT09ICdbJyB8fAogICAgICAgICAgICAgICAgICAgICAgICAobGVmdC5pZGVudGlmaWVyICYmICFsZWZ0LnJlc2VydmVkKSkgewogICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24oMTkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGF0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGxlZnQgPT09IHN5bnRheFsnZnVuY3Rpb24nXSkgewogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoCiJFeHBlY3RlZCBhbiBpZGVudGlmaWVyIGluIGFuIGFzc2lnbm1lbnQsIGFuZCBpbnN0ZWFkIHNhdyBhIGZ1bmN0aW9uIGludm9jYXRpb24uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhhdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvcigiQmFkIGFzc2lnbm1lbnQuIiwgdGhhdCk7CiAgICAgICAgfSwgMjApOwogICAgfQoKCiAgICBmdW5jdGlvbiBzdWZmaXgocywgZikgewogICAgICAgIHZhciB4ID0gc3ltYm9sKHMsIDE1MCk7CiAgICAgICAgeC5sZWQgPSBmdW5jdGlvbiAobGVmdCkgewogICAgICAgICAgICBpZiAob3B0aW9uLnBsdXNwbHVzKSB7CiAgICAgICAgICAgICAgICB3YXJuaW5nKCJVbmV4cGVjdGVkIHVzZSBvZiAne2F9Jy4iLCB0aGlzLCB0aGlzLmlkKTsKICAgICAgICAgICAgfSBlbHNlIGlmICgoIWxlZnQuaWRlbnRpZmllciB8fCBsZWZ0LnJlc2VydmVkKSAmJgogICAgICAgICAgICAgICAgICAgIGxlZnQuaWQgIT09ICcuJyAmJiBsZWZ0LmlkICE9PSAnWycpIHsKICAgICAgICAgICAgICAgIHdhcm5pbmcoIkJhZCBvcGVyYW5kLiIsIHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMubGVmdCA9IGxlZnQ7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHg7CiAgICB9CgoKICAgIC8vIGZucGFyYW0gbWVhbnMgdGhhdCB0aGlzIGlkZW50aWZpZXIgaXMgYmVpbmcgZGVmaW5lZCBhcyBhIGZ1bmN0aW9uCiAgICAvLyBhcmd1bWVudCAoc2VlIGlkZW50aWZpZXIoKSkKICAgIGZ1bmN0aW9uIG9wdGlvbmFsaWRlbnRpZmllcihmbnBhcmFtKSB7CiAgICAgICAgaWYgKG5leHR0b2tlbi5pZGVudGlmaWVyKSB7CiAgICAgICAgICAgIGFkdmFuY2UoKTsKICAgICAgICAgICAgaWYgKHRva2VuLnJlc2VydmVkICYmICFvcHRpb24uZXM1KSB7CiAgICAgICAgICAgICAgICAvLyBgdW5kZWZpbmVkYCBhcyBhIGZ1bmN0aW9uIHBhcmFtIGlzIGEgY29tbW9uIHBhdHRlcm4gdG8gcHJvdGVjdAogICAgICAgICAgICAgICAgLy8gYWdhaW5zdCB0aGUgY2FzZSB3aGVuIHNvbWVib2R5IGRvZXMgYHVuZGVmaW5lZCA9IHRydWVgIGFuZAogICAgICAgICAgICAgICAgLy8gaGVscCB3aXRoIG1pbmlmaWNhdGlvbi4gTW9yZSBpbmZvOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS8zMTU5MTYKICAgICAgICAgICAgICAgIGlmICghZm5wYXJhbSB8fCB0b2tlbi52YWx1ZSAhPSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIkV4cGVjdGVkIGFuIGlkZW50aWZpZXIgYW5kIGluc3RlYWQgc2F3ICd7YX0nIChhIHJlc2VydmVkIHdvcmQpLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiwgdG9rZW4uaWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0b2tlbi52YWx1ZTsKICAgICAgICB9CiAgICB9CgogICAgLy8gZm5wYXJhbSBtZWFucyB0aGF0IHRoaXMgaWRlbnRpZmllciBpcyBiZWluZyBkZWZpbmVkIGFzIGEgZnVuY3Rpb24KICAgIC8vIGFyZ3VtZW50CiAgICBmdW5jdGlvbiBpZGVudGlmaWVyKGZucGFyYW0pIHsKICAgICAgICB2YXIgaSA9IG9wdGlvbmFsaWRlbnRpZmllcihmbnBhcmFtKTsKICAgICAgICBpZiAoaSkgewogICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICB9CiAgICAgICAgaWYgKHRva2VuLmlkID09PSAnZnVuY3Rpb24nICYmIG5leHR0b2tlbi5pZCA9PT0gJygnKSB7CiAgICAgICAgICAgIHdhcm5pbmcoIk1pc3NpbmcgbmFtZSBpbiBmdW5jdGlvbiBkZWNsYXJhdGlvbi4iKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBlcnJvcigiRXhwZWN0ZWQgYW4gaWRlbnRpZmllciBhbmQgaW5zdGVhZCBzYXcgJ3thfScuIiwKICAgICAgICAgICAgICAgICAgICBuZXh0dG9rZW4sIG5leHR0b2tlbi52YWx1ZSk7CiAgICAgICAgfQogICAgfQoKCiAgICBmdW5jdGlvbiByZWFjaGFibGUocykgewogICAgICAgIHZhciBpID0gMCwgdDsKICAgICAgICBpZiAobmV4dHRva2VuLmlkICE9PSAnOycgfHwgbm9yZWFjaCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgdCA9IHBlZWsoaSk7CiAgICAgICAgICAgIGlmICh0LnJlYWNoKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHQuaWQgIT09ICcoZW5kbGluZSknKSB7CiAgICAgICAgICAgICAgICBpZiAodC5pZCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoCiJJbm5lciBmdW5jdGlvbnMgc2hvdWxkIGJlIGxpc3RlZCBhdCB0aGUgdG9wIG9mIHRoZSBvdXRlciBmdW5jdGlvbi4iLCB0KTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdhcm5pbmcoIlVucmVhY2hhYmxlICd7YX0nIGFmdGVyICd7Yn0nLiIsIHQsIHQudmFsdWUsIHMpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaSArPSAxOwogICAgICAgIH0KICAgIH0KCgogICAgZnVuY3Rpb24gc3RhdGVtZW50KG5vaW5kZW50KSB7CiAgICAgICAgdmFyIGkgPSBpbmRlbnQsIHIsIHMgPSBzY29wZSwgdCA9IG5leHR0b2tlbjsKCi8vIFdlIGRvbid0IGxpa2UgdGhlIGVtcHR5IHN0YXRlbWVudC4KCiAgICAgICAgaWYgKHQuaWQgPT09ICc7JykgewogICAgICAgICAgICB3YXJuaW5nKCJVbm5lY2Vzc2FyeSBzZW1pY29sb24uIiwgdCk7CiAgICAgICAgICAgIGFkdmFuY2UoJzsnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCi8vIElzIHRoaXMgYSBsYWJlbGxlZCBzdGF0ZW1lbnQ/CgogICAgICAgIGlmICh0LmlkZW50aWZpZXIgJiYgIXQucmVzZXJ2ZWQgJiYgcGVlaygpLmlkID09PSAnOicpIHsKICAgICAgICAgICAgYWR2YW5jZSgpOwogICAgICAgICAgICBhZHZhbmNlKCc6Jyk7CiAgICAgICAgICAgIHNjb3BlID0gT2JqZWN0LmNyZWF0ZShzKTsKICAgICAgICAgICAgYWRkbGFiZWwodC52YWx1ZSwgJ2xhYmVsJyk7CiAgICAgICAgICAgIGlmICghbmV4dHRva2VuLmxhYmVsbGVkKSB7CiAgICAgICAgICAgICAgICB3YXJuaW5nKCJMYWJlbCAne2F9JyBvbiB7Yn0gc3RhdGVtZW50LiIsCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHR0b2tlbiwgdC52YWx1ZSwgbmV4dHRva2VuLnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoangudGVzdCh0LnZhbHVlICsgJzonKSkgewogICAgICAgICAgICAgICAgd2FybmluZygiTGFiZWwgJ3thfScgbG9va3MgbGlrZSBhIGphdmFzY3JpcHQgdXJsLiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHQsIHQudmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5leHR0b2tlbi5sYWJlbCA9IHQudmFsdWU7CiAgICAgICAgICAgIHQgPSBuZXh0dG9rZW47CiAgICAgICAgfQoKLy8gUGFyc2UgdGhlIHN0YXRlbWVudC4KCiAgICAgICAgaWYgKCFub2luZGVudCkgewogICAgICAgICAgICBpbmRlbnRhdGlvbigpOwogICAgICAgIH0KICAgICAgICByID0gZXhwcmVzc2lvbigwLCB0cnVlKTsKCi8vIExvb2sgZm9yIHRoZSBmaW5hbCBzZW1pY29sb24uCgogICAgICAgIGlmICghdC5ibG9jaykgewogICAgICAgICAgICBpZiAoIW9wdGlvbi5leHByICYmICghciB8fCAhci5leHBzKSkgewogICAgICAgICAgICAgICAgd2FybmluZygiRXhwZWN0ZWQgYW4gYXNzaWdubWVudCBvciBmdW5jdGlvbiBjYWxsIGFuZCBpbnN0ZWFkIHNhdyBhbiBleHByZXNzaW9uLiIsCiAgICAgICAgICAgICAgICAgICAgdG9rZW4pOwogICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbi5ub25ldyAmJiByLmlkID09PSAnKCcgJiYgci5sZWZ0LmlkID09PSAnbmV3JykgewogICAgICAgICAgICAgICAgd2FybmluZygiRG8gbm90IHVzZSAnbmV3JyBmb3Igc2lkZSBlZmZlY3RzLiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgIT09ICc7JykgewogICAgICAgICAgICAgICAgaWYgKCFvcHRpb24uYXNpICYmICEob3B0aW9uLmxhc3RzZW1pYyAmJiBuZXh0dG9rZW4uaWQgPT0gJ30nICYmCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHR0b2tlbi5saW5lID09IHRva2VuLmxpbmUpKSB7CiAgICAgICAgICAgICAgICAgICAgd2FybmluZ0F0KCJNaXNzaW5nIHNlbWljb2xvbi4iLCB0b2tlbi5saW5lLCB0b2tlbi5mcm9tICsgdG9rZW4udmFsdWUubGVuZ3RoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOwogICAgICAgICAgICAgICAgYWR2YW5jZSgnOycpOwogICAgICAgICAgICAgICAgbm9uYWRqYWNlbnQodG9rZW4sIG5leHR0b2tlbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgovLyBSZXN0b3JlIHRoZSBpbmRlbnRhdGlvbi4KCiAgICAgICAgaW5kZW50ID0gaTsKICAgICAgICBzY29wZSA9IHM7CiAgICAgICAgcmV0dXJuIHI7CiAgICB9CgoKICAgIGZ1bmN0aW9uIHVzZV9zdHJpY3QoKSB7CiAgICAgICAgaWYgKG5leHR0b2tlbi52YWx1ZSA9PT0gJ3VzZSBzdHJpY3QnKSB7CiAgICAgICAgICAgIGlmIChzdHJpY3RfbW9kZSkgewogICAgICAgICAgICAgICAgd2FybmluZygiVW5uZWNlc3NhcnkgXCJ1c2Ugc3RyaWN0XCIuIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYWR2YW5jZSgpOwogICAgICAgICAgICBhZHZhbmNlKCc7Jyk7CiAgICAgICAgICAgIHN0cmljdF9tb2RlID0gdHJ1ZTsKICAgICAgICAgICAgb3B0aW9uLm5ld2NhcCA9IHRydWU7CiAgICAgICAgICAgIG9wdGlvbi51bmRlZiA9IHRydWU7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CgoKICAgIGZ1bmN0aW9uIHN0YXRlbWVudHMoYmVnaW4pIHsKICAgICAgICB2YXIgYSA9IFtdLCBmLCBwOwoKICAgICAgICB3aGlsZSAoIW5leHR0b2tlbi5yZWFjaCAmJiBuZXh0dG9rZW4uaWQgIT09ICcoZW5kKScpIHsKICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJzsnKSB7CiAgICAgICAgICAgICAgICB3YXJuaW5nKCJVbm5lY2Vzc2FyeSBzZW1pY29sb24uIik7CiAgICAgICAgICAgICAgICBhZHZhbmNlKCc7Jyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhLnB1c2goc3RhdGVtZW50KCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBhOwogICAgfQoKCiAgICAvKgogICAgICogUGFyc2VzIGEgc2luZ2xlIGJsb2NrLiBBIGJsb2NrIGlzIGEgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cyB3cmFwcGVkIGluCiAgICAgKiBicmFjZXMuCiAgICAgKgogICAgICogb3JkaW5hcnkgLSB0cnVlIGZvciBldmVyeXRoaW5nIGJ1dCBmdW5jdGlvbiBib2RpZXMgYW5kIHRyeSBibG9ja3MuCiAgICAgKiBzdG10ICAgICAtIHRydWUgaWYgYmxvY2sgY2FuIGJlIGEgc2luZ2xlIHN0YXRlbWVudCAoZS5nLiBpbiBpZi9mb3Ivd2hpbGUpLgogICAgICovCiAgICBmdW5jdGlvbiBibG9jayhvcmRpbmFyeSwgc3RtdCkgewogICAgICAgIHZhciBhLAogICAgICAgICAgICBiID0gaW5ibG9jaywKICAgICAgICAgICAgb2xkX2luZGVudCA9IGluZGVudCwKICAgICAgICAgICAgbSA9IHN0cmljdF9tb2RlLAogICAgICAgICAgICBzID0gc2NvcGUsCiAgICAgICAgICAgIHQ7CgogICAgICAgIGluYmxvY2sgPSBvcmRpbmFyeTsKICAgICAgICBzY29wZSA9IE9iamVjdC5jcmVhdGUoc2NvcGUpOwogICAgICAgIG5vbmFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOwogICAgICAgIHQgPSBuZXh0dG9rZW47CgogICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICd7JykgewogICAgICAgICAgICBhZHZhbmNlKCd7Jyk7CiAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgIT09ICd9JyB8fCB0b2tlbi5saW5lICE9PSBuZXh0dG9rZW4ubGluZSkgewogICAgICAgICAgICAgICAgaW5kZW50ICs9IG9wdGlvbi5pbmRlbnQ7CiAgICAgICAgICAgICAgICB3aGlsZSAoIW9yZGluYXJ5ICYmIG5leHR0b2tlbi5mcm9tID4gaW5kZW50KSB7CiAgICAgICAgICAgICAgICAgICAgaW5kZW50ICs9IG9wdGlvbi5pbmRlbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIW9yZGluYXJ5ICYmICF1c2Vfc3RyaWN0KCkgJiYgIW0gJiYgb3B0aW9uLnN0cmljdCAmJgogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdFsnKGNvbnRleHQpJ11bJyhnbG9iYWwpJ10pIHsKICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJNaXNzaW5nIFwidXNlIHN0cmljdFwiIHN0YXRlbWVudC4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGEgPSBzdGF0ZW1lbnRzKCk7CiAgICAgICAgICAgICAgICBzdHJpY3RfbW9kZSA9IG07CiAgICAgICAgICAgICAgICBpbmRlbnQgLT0gb3B0aW9uLmluZGVudDsKICAgICAgICAgICAgICAgIGluZGVudGF0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYWR2YW5jZSgnfScsIHQpOwogICAgICAgICAgICBpbmRlbnQgPSBvbGRfaW5kZW50OwogICAgICAgIH0gZWxzZSBpZiAoIW9yZGluYXJ5KSB7CiAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCAne2F9JyBhbmQgaW5zdGVhZCBzYXcgJ3tifScuIiwKICAgICAgICAgICAgICAgICAgbmV4dHRva2VuLCAneycsIG5leHR0b2tlbi52YWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCFzdG10IHx8IG9wdGlvbi5jdXJseSkKICAgICAgICAgICAgICAgIHdhcm5pbmcoIkV4cGVjdGVkICd7YX0nIGFuZCBpbnN0ZWFkIHNhdyAne2J9Jy4iLAogICAgICAgICAgICAgICAgICAgICAgICBuZXh0dG9rZW4sICd7JywgbmV4dHRva2VuLnZhbHVlKTsKCiAgICAgICAgICAgIG5vcmVhY2ggPSB0cnVlOwogICAgICAgICAgICBhID0gW3N0YXRlbWVudCgpXTsKICAgICAgICAgICAgbm9yZWFjaCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBmdW5jdFsnKHZlcmIpJ10gPSBudWxsOwogICAgICAgIHNjb3BlID0gczsKICAgICAgICBpbmJsb2NrID0gYjsKICAgICAgICBpZiAob3JkaW5hcnkgJiYgb3B0aW9uLm5vZW1wdHkgJiYgKCFhIHx8IGEubGVuZ3RoID09PSAwKSkgewogICAgICAgICAgICB3YXJuaW5nKCJFbXB0eSBibG9jay4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGE7CiAgICB9CgoKICAgIGZ1bmN0aW9uIGNvdW50TWVtYmVyKG0pIHsKICAgICAgICBpZiAobWVtYmVyc09ubHkgJiYgdHlwZW9mIG1lbWJlcnNPbmx5W21dICE9PSAnYm9vbGVhbicpIHsKICAgICAgICAgICAgd2FybmluZygiVW5leHBlY3RlZCAvKm1lbWJlciAne2F9Jy4iLCB0b2tlbiwgbSk7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2YgbWVtYmVyW21dID09PSAnbnVtYmVyJykgewogICAgICAgICAgICBtZW1iZXJbbV0gKz0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtZW1iZXJbbV0gPSAxOwogICAgICAgIH0KICAgIH0KCgogICAgZnVuY3Rpb24gbm90ZV9pbXBsaWVkKHRva2VuKSB7CiAgICAgICAgdmFyIG5hbWUgPSB0b2tlbi52YWx1ZSwgbGluZSA9IHRva2VuLmxpbmUsIGEgPSBpbXBsaWVkW25hbWVdOwogICAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICBhID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmICghYSkgewogICAgICAgICAgICBhID0gW2xpbmVdOwogICAgICAgICAgICBpbXBsaWVkW25hbWVdID0gYTsKICAgICAgICB9IGVsc2UgaWYgKGFbYS5sZW5ndGggLSAxXSAhPT0gbGluZSkgewogICAgICAgICAgICBhLnB1c2gobGluZSk7CiAgICAgICAgfQogICAgfQoKLy8gQnVpbGQgdGhlIHN5bnRheCB0YWJsZSBieSBkZWNsYXJpbmcgdGhlIHN5bnRhY3RpYyBlbGVtZW50cyBvZiB0aGUgbGFuZ3VhZ2UuCgogICAgdHlwZSgnKG51bWJlciknLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9KTsKICAgIHR5cGUoJyhzdHJpbmcpJywgZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiB0aGlzOwogICAgfSk7CgogICAgc3ludGF4WycoaWRlbnRpZmllciknXSA9IHsKICAgICAgICB0eXBlOiAnKGlkZW50aWZpZXIpJywKICAgICAgICBsYnA6IDAsCiAgICAgICAgaWRlbnRpZmllcjogdHJ1ZSwKICAgICAgICBudWQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHYgPSB0aGlzLnZhbHVlLAogICAgICAgICAgICAgICAgcyA9IHNjb3BlW3ZdLAogICAgICAgICAgICAgICAgZjsKICAgICAgICAgICAgaWYgKHR5cGVvZiBzID09PSAnZnVuY3Rpb24nKSB7CgovLyBQcm90ZWN0aW9uIGFnYWluc3QgYWNjaWRlbnRhbCBpbmhlcml0YW5jZS4KCiAgICAgICAgICAgICAgICBzID0gdW5kZWZpbmVkOwogICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzID09PSAnYm9vbGVhbicpIHsKICAgICAgICAgICAgICAgIGYgPSBmdW5jdDsKICAgICAgICAgICAgICAgIGZ1bmN0ID0gZnVuY3Rpb25zWzBdOwogICAgICAgICAgICAgICAgYWRkbGFiZWwodiwgJ3ZhcicpOwogICAgICAgICAgICAgICAgcyA9IGZ1bmN0OwogICAgICAgICAgICAgICAgZnVuY3QgPSBmOwogICAgICAgICAgICB9CgovLyBUaGUgbmFtZSBpcyBpbiBzY29wZSBhbmQgZGVmaW5lZCBpbiB0aGUgY3VycmVudCBmdW5jdGlvbi4KCiAgICAgICAgICAgIGlmIChmdW5jdCA9PT0gcykgewoKLy8gICAgICBDaGFuZ2UgJ3VudXNlZCcgdG8gJ3ZhcicsIGFuZCByZWplY3QgbGFiZWxzLgoKICAgICAgICAgICAgICAgIHN3aXRjaCAoZnVuY3Rbdl0pIHsKICAgICAgICAgICAgICAgIGNhc2UgJ3VudXNlZCc6CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rbdl0gPSAndmFyJzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3VuY3Rpb24nOgogICAgICAgICAgICAgICAgICAgIGZ1bmN0W3ZdID0gJ2Z1bmN0aW9uJzsKICAgICAgICAgICAgICAgICAgICB0aGlzWydmdW5jdGlvbiddID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzoKICAgICAgICAgICAgICAgICAgICB0aGlzWydmdW5jdGlvbiddID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2xhYmVsJzoKICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCIne2F9JyBpcyBhIHN0YXRlbWVudCBsYWJlbC4iLCB0b2tlbiwgdik7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgovLyBUaGUgbmFtZSBpcyBub3QgZGVmaW5lZCBpbiB0aGUgZnVuY3Rpb24uICBJZiB3ZSBhcmUgaW4gdGhlIGdsb2JhbCBzY29wZSwKLy8gdGhlbiB3ZSBoYXZlIGFuIHVuZGVmaW5lZCB2YXJpYWJsZS4KLy8KLy8gT3BlcmF0b3JzIHR5cGVvZiBhbmQgZGVsZXRlIGRvIG5vdCByYWlzZSBydW50aW1lIGVycm9ycyBldmVuIGlmIHRoZSBiYXNlCi8vIG9iamVjdCBvZiBhIHJlZmVyZW5jZSBpcyBudWxsIHNvIG5vIG5lZWQgdG8gZGlzcGxheSB3YXJuaW5nIGlmIHdlJ3JlCi8vIGluc2lkZSBvZiB0eXBlb2Ygb3IgZGVsZXRlLgoKICAgICAgICAgICAgfSBlbHNlIGlmIChmdW5jdFsnKGdsb2JhbCknXSkgewogICAgICAgICAgICAgICAgaWYgKGFub25uYW1lICE9ICd0eXBlb2YnICYmIGFub25uYW1lICE9ICdkZWxldGUnICYmCiAgICAgICAgICAgICAgICAgICAgb3B0aW9uLnVuZGVmICYmIHR5cGVvZiBwcmVkZWZpbmVkW3ZdICE9PSAnYm9vbGVhbicpIHsKICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCIne2F9JyBpcyBub3QgZGVmaW5lZC4iLCB0b2tlbiwgdik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBub3RlX2ltcGxpZWQodG9rZW4pOwoKLy8gSWYgdGhlIG5hbWUgaXMgYWxyZWFkeSBkZWZpbmVkIGluIHRoZSBjdXJyZW50Ci8vIGZ1bmN0aW9uLCBidXQgbm90IGFzIG91dGVyLCB0aGVuIHRoZXJlIGlzIGEgc2NvcGUgZXJyb3IuCgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3dpdGNoIChmdW5jdFt2XSkgewogICAgICAgICAgICAgICAgY2FzZSAnY2xvc3VyZSc6CiAgICAgICAgICAgICAgICBjYXNlICdmdW5jdGlvbic6CiAgICAgICAgICAgICAgICBjYXNlICd2YXInOgogICAgICAgICAgICAgICAgY2FzZSAndW51c2VkJzoKICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCIne2F9JyB1c2VkIG91dCBvZiBzY29wZS4iLCB0b2tlbiwgdik7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdsYWJlbCc6CiAgICAgICAgICAgICAgICAgICAgd2FybmluZygiJ3thfScgaXMgYSBzdGF0ZW1lbnQgbGFiZWwuIiwgdG9rZW4sIHYpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnb3V0ZXInOgogICAgICAgICAgICAgICAgY2FzZSAnZ2xvYmFsJzoKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CgovLyBJZiB0aGUgbmFtZSBpcyBkZWZpbmVkIGluIGFuIG91dGVyIGZ1bmN0aW9uLCBtYWtlIGFuIG91dGVyIGVudHJ5LCBhbmQgaWYKLy8gaXQgd2FzIHVudXNlZCwgbWFrZSBpdCB2YXIuCgogICAgICAgICAgICAgICAgICAgIGlmIChzID09PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0W3ZdID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZygiJ3thfScgaXMgbm90IGFsbG93ZWQuIiwgdG9rZW4sIHYpOwogICAgICAgICAgICAgICAgICAgICAgICBub3RlX2ltcGxpZWQodG9rZW4pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHMgIT09ICdvYmplY3QnKSB7CgovLyBPcGVyYXRvcnMgdHlwZW9mIGFuZCBkZWxldGUgZG8gbm90IHJhaXNlIHJ1bnRpbWUgZXJyb3JzIGV2ZW4gaWYgdGhlIGJhc2Ugb2JqZWN0IG9mCi8vIGEgcmVmZXJlbmNlIGlzIG51bGwgc28gbm8gbmVlZCB0byBkaXNwbGF5IHdhcm5pbmcgaWYgd2UncmUgaW5zaWRlIG9mIHR5cGVvZiBvciBkZWxldGUuCgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5vbm5hbWUgIT0gJ3R5cGVvZicgJiYgYW5vbm5hbWUgIT0gJ2RlbGV0ZScgJiYgb3B0aW9uLnVuZGVmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCIne2F9JyBpcyBub3QgZGVmaW5lZC4iLCB0b2tlbiwgdik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdFt2XSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbm90ZV9pbXBsaWVkKHRva2VuKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNbdl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZnVuY3Rpb24nOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd1bmN0aW9uJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbJ2Z1bmN0aW9uJ10gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc1t2XSA9ICdjbG9zdXJlJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0W3ZdID0gc1snKGdsb2JhbCknXSA/ICdnbG9iYWwnIDogJ291dGVyJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd2YXInOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd1bnVzZWQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc1t2XSA9ICdjbG9zdXJlJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0W3ZdID0gc1snKGdsb2JhbCknXSA/ICdnbG9iYWwnIDogJ291dGVyJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjbG9zdXJlJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncGFyYW1ldGVyJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0W3ZdID0gc1snKGdsb2JhbCknXSA/ICdnbG9iYWwnIDogJ291dGVyJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdsYWJlbCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCIne2F9JyBpcyBhIHN0YXRlbWVudCBsYWJlbC4iLCB0b2tlbiwgdik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKICAgICAgICBsZWQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgZXJyb3IoIkV4cGVjdGVkIGFuIG9wZXJhdG9yIGFuZCBpbnN0ZWFkIHNhdyAne2F9Jy4iLAogICAgICAgICAgICAgICAgbmV4dHRva2VuLCBuZXh0dG9rZW4udmFsdWUpOwogICAgICAgIH0KICAgIH07CgogICAgdHlwZSgnKHJlZ2V4cCknLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9KTsKCgovLyBFQ01BU2NyaXB0IHBhcnNlcgoKICAgIGRlbGltKCcoZW5kbGluZSknKTsKICAgIGRlbGltKCcoYmVnaW4pJyk7CiAgICBkZWxpbSgnKGVuZCknKS5yZWFjaCA9IHRydWU7CiAgICBkZWxpbSgnPC8nKS5yZWFjaCA9IHRydWU7CiAgICBkZWxpbSgnPCEnKTsKICAgIGRlbGltKCc8IS0tJyk7CiAgICBkZWxpbSgnLS0+Jyk7CiAgICBkZWxpbSgnKGVycm9yKScpLnJlYWNoID0gdHJ1ZTsKICAgIGRlbGltKCd9JykucmVhY2ggPSB0cnVlOwogICAgZGVsaW0oJyknKTsKICAgIGRlbGltKCddJyk7CiAgICBkZWxpbSgnIicpLnJlYWNoID0gdHJ1ZTsKICAgIGRlbGltKCInIikucmVhY2ggPSB0cnVlOwogICAgZGVsaW0oJzsnKTsKICAgIGRlbGltKCc6JykucmVhY2ggPSB0cnVlOwogICAgZGVsaW0oJywnKTsKICAgIGRlbGltKCcjJyk7CiAgICBkZWxpbSgnQCcpOwogICAgcmVzZXJ2ZSgnZWxzZScpOwogICAgcmVzZXJ2ZSgnY2FzZScpLnJlYWNoID0gdHJ1ZTsKICAgIHJlc2VydmUoJ2NhdGNoJyk7CiAgICByZXNlcnZlKCdkZWZhdWx0JykucmVhY2ggPSB0cnVlOwogICAgcmVzZXJ2ZSgnZmluYWxseScpOwogICAgcmVzZXJ2ZXZhcignYXJndW1lbnRzJywgZnVuY3Rpb24gKHgpIHsKICAgICAgICBpZiAoc3RyaWN0X21vZGUgJiYgZnVuY3RbJyhnbG9iYWwpJ10pIHsKICAgICAgICAgICAgd2FybmluZygiU3RyaWN0IHZpb2xhdGlvbi4iLCB4KTsKICAgICAgICB9CiAgICB9KTsKICAgIHJlc2VydmV2YXIoJ2V2YWwnKTsKICAgIHJlc2VydmV2YXIoJ2ZhbHNlJyk7CiAgICByZXNlcnZldmFyKCdJbmZpbml0eScpOwogICAgcmVzZXJ2ZXZhcignTmFOJyk7CiAgICByZXNlcnZldmFyKCdudWxsJyk7CiAgICByZXNlcnZldmFyKCd0aGlzJywgZnVuY3Rpb24gKHgpIHsKICAgICAgICBpZiAoc3RyaWN0X21vZGUgJiYgKChmdW5jdFsnKHN0YXRlbWVudCknXSAmJgogICAgICAgICAgICAgICAgZnVuY3RbJyhuYW1lKSddLmNoYXJBdCgwKSA+ICdaJykgfHwgZnVuY3RbJyhnbG9iYWwpJ10pKSB7CiAgICAgICAgICAgIHdhcm5pbmcoIlN0cmljdCB2aW9sYXRpb24uIiwgeCk7CiAgICAgICAgfQogICAgfSk7CiAgICByZXNlcnZldmFyKCd0cnVlJyk7CiAgICByZXNlcnZldmFyKCd1bmRlZmluZWQnKTsKICAgIGFzc2lnbm9wKCc9JywgJ2Fzc2lnbicsIDIwKTsKICAgIGFzc2lnbm9wKCcrPScsICdhc3NpZ25hZGQnLCAyMCk7CiAgICBhc3NpZ25vcCgnLT0nLCAnYXNzaWduc3ViJywgMjApOwogICAgYXNzaWdub3AoJyo9JywgJ2Fzc2lnbm11bHQnLCAyMCk7CiAgICBhc3NpZ25vcCgnLz0nLCAnYXNzaWduZGl2JywgMjApLm51ZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBlcnJvcigiQSByZWd1bGFyIGV4cHJlc3Npb24gbGl0ZXJhbCBjYW4gYmUgY29uZnVzZWQgd2l0aCAnLz0nLiIpOwogICAgfTsKICAgIGFzc2lnbm9wKCclPScsICdhc3NpZ25tb2QnLCAyMCk7CiAgICBiaXR3aXNlYXNzaWdub3AoJyY9JywgJ2Fzc2lnbmJpdGFuZCcsIDIwKTsKICAgIGJpdHdpc2Vhc3NpZ25vcCgnfD0nLCAnYXNzaWduYml0b3InLCAyMCk7CiAgICBiaXR3aXNlYXNzaWdub3AoJ149JywgJ2Fzc2lnbmJpdHhvcicsIDIwKTsKICAgIGJpdHdpc2Vhc3NpZ25vcCgnPDw9JywgJ2Fzc2lnbnNoaWZ0bGVmdCcsIDIwKTsKICAgIGJpdHdpc2Vhc3NpZ25vcCgnPj49JywgJ2Fzc2lnbnNoaWZ0cmlnaHQnLCAyMCk7CiAgICBiaXR3aXNlYXNzaWdub3AoJz4+Pj0nLCAnYXNzaWduc2hpZnRyaWdodHVuc2lnbmVkJywgMjApOwogICAgaW5maXgoJz8nLCBmdW5jdGlvbiAobGVmdCwgdGhhdCkgewogICAgICAgIHRoYXQubGVmdCA9IGxlZnQ7CiAgICAgICAgdGhhdC5yaWdodCA9IGV4cHJlc3Npb24oMTApOwogICAgICAgIGFkdmFuY2UoJzonKTsKICAgICAgICB0aGF0WydlbHNlJ10gPSBleHByZXNzaW9uKDEwKTsKICAgICAgICByZXR1cm4gdGhhdDsKICAgIH0sIDMwKTsKCiAgICBpbmZpeCgnfHwnLCAnb3InLCA0MCk7CiAgICBpbmZpeCgnJiYnLCAnYW5kJywgNTApOwogICAgYml0d2lzZSgnfCcsICdiaXRvcicsIDcwKTsKICAgIGJpdHdpc2UoJ14nLCAnYml0eG9yJywgODApOwogICAgYml0d2lzZSgnJicsICdiaXRhbmQnLCA5MCk7CiAgICByZWxhdGlvbignPT0nLCBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHsKICAgICAgICB2YXIgZXFudWxsID0gb3B0aW9uLmVxbnVsbCAmJgogICAgICAgICAgICAgICAgKGxlZnQudmFsdWUgPT0gJ251bGwnIHx8IHJpZ2h0LnZhbHVlID09ICdudWxsJyk7CgogICAgICAgIGlmICghZXFudWxsICYmIG9wdGlvbi5lcWVxZXEpIHsKICAgICAgICAgICAgd2FybmluZygiRXhwZWN0ZWQgJ3thfScgYW5kIGluc3RlYWQgc2F3ICd7Yn0nLiIsCiAgICAgICAgICAgICAgICAgICAgdGhpcywgJz09PScsICc9PScpOwogICAgICAgIH0gZWxzZSBpZiAoaXNQb29yUmVsYXRpb24obGVmdCkpIHsKICAgICAgICAgICAgd2FybmluZygiVXNlICd7YX0nIHRvIGNvbXBhcmUgd2l0aCAne2J9Jy4iLAogICAgICAgICAgICAgICAgdGhpcywgJz09PScsIGxlZnQudmFsdWUpOwogICAgICAgIH0gZWxzZSBpZiAoaXNQb29yUmVsYXRpb24ocmlnaHQpKSB7CiAgICAgICAgICAgIHdhcm5pbmcoIlVzZSAne2F9JyB0byBjb21wYXJlIHdpdGggJ3tifScuIiwKICAgICAgICAgICAgICAgIHRoaXMsICc9PT0nLCByaWdodC52YWx1ZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgfSk7CiAgICByZWxhdGlvbignPT09Jyk7CiAgICByZWxhdGlvbignIT0nLCBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHsKICAgICAgICB2YXIgZXFudWxsID0gb3B0aW9uLmVxbnVsbCAmJgogICAgICAgICAgICAgICAgKGxlZnQudmFsdWUgPT0gJ251bGwnIHx8IHJpZ2h0LnZhbHVlID09ICdudWxsJyk7CgogICAgICAgIGlmICghZXFudWxsICYmIG9wdGlvbi5lcWVxZXEpIHsKICAgICAgICAgICAgd2FybmluZygiRXhwZWN0ZWQgJ3thfScgYW5kIGluc3RlYWQgc2F3ICd7Yn0nLiIsCiAgICAgICAgICAgICAgICAgICAgdGhpcywgJyE9PScsICchPScpOwogICAgICAgIH0gZWxzZSBpZiAoaXNQb29yUmVsYXRpb24obGVmdCkpIHsKICAgICAgICAgICAgd2FybmluZygiVXNlICd7YX0nIHRvIGNvbXBhcmUgd2l0aCAne2J9Jy4iLAogICAgICAgICAgICAgICAgICAgIHRoaXMsICchPT0nLCBsZWZ0LnZhbHVlKTsKICAgICAgICB9IGVsc2UgaWYgKGlzUG9vclJlbGF0aW9uKHJpZ2h0KSkgewogICAgICAgICAgICB3YXJuaW5nKCJVc2UgJ3thfScgdG8gY29tcGFyZSB3aXRoICd7Yn0nLiIsCiAgICAgICAgICAgICAgICAgICAgdGhpcywgJyE9PScsIHJpZ2h0LnZhbHVlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9KTsKICAgIHJlbGF0aW9uKCchPT0nKTsKICAgIHJlbGF0aW9uKCc8Jyk7CiAgICByZWxhdGlvbignPicpOwogICAgcmVsYXRpb24oJzw9Jyk7CiAgICByZWxhdGlvbignPj0nKTsKICAgIGJpdHdpc2UoJzw8JywgJ3NoaWZ0bGVmdCcsIDEyMCk7CiAgICBiaXR3aXNlKCc+PicsICdzaGlmdHJpZ2h0JywgMTIwKTsKICAgIGJpdHdpc2UoJz4+PicsICdzaGlmdHJpZ2h0dW5zaWduZWQnLCAxMjApOwogICAgaW5maXgoJ2luJywgJ2luJywgMTIwKTsKICAgIGluZml4KCdpbnN0YW5jZW9mJywgJ2luc3RhbmNlb2YnLCAxMjApOwogICAgaW5maXgoJysnLCBmdW5jdGlvbiAobGVmdCwgdGhhdCkgewogICAgICAgIHZhciByaWdodCA9IGV4cHJlc3Npb24oMTMwKTsKICAgICAgICBpZiAobGVmdCAmJiByaWdodCAmJiBsZWZ0LmlkID09PSAnKHN0cmluZyknICYmIHJpZ2h0LmlkID09PSAnKHN0cmluZyknKSB7CiAgICAgICAgICAgIGxlZnQudmFsdWUgKz0gcmlnaHQudmFsdWU7CiAgICAgICAgICAgIGxlZnQuY2hhcmFjdGVyID0gcmlnaHQuY2hhcmFjdGVyOwogICAgICAgICAgICBpZiAoIW9wdGlvbi5zY3JpcHR1cmwgJiYgangudGVzdChsZWZ0LnZhbHVlKSkgewogICAgICAgICAgICAgICAgd2FybmluZygiSmF2YVNjcmlwdCBVUkwuIiwgbGVmdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGxlZnQ7CiAgICAgICAgfQogICAgICAgIHRoYXQubGVmdCA9IGxlZnQ7CiAgICAgICAgdGhhdC5yaWdodCA9IHJpZ2h0OwogICAgICAgIHJldHVybiB0aGF0OwogICAgfSwgMTMwKTsKICAgIHByZWZpeCgnKycsICdudW0nKTsKICAgIHByZWZpeCgnKysrJywgZnVuY3Rpb24gKCkgewogICAgICAgIHdhcm5pbmcoIkNvbmZ1c2luZyBwbHVzZXMuIik7CiAgICAgICAgdGhpcy5yaWdodCA9IGV4cHJlc3Npb24oMTUwKTsKICAgICAgICB0aGlzLmFyaXR5ID0gJ3VuYXJ5JzsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0pOwogICAgaW5maXgoJysrKycsIGZ1bmN0aW9uIChsZWZ0KSB7CiAgICAgICAgd2FybmluZygiQ29uZnVzaW5nIHBsdXNlcy4iKTsKICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0OwogICAgICAgIHRoaXMucmlnaHQgPSBleHByZXNzaW9uKDEzMCk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LCAxMzApOwogICAgaW5maXgoJy0nLCAnc3ViJywgMTMwKTsKICAgIHByZWZpeCgnLScsICduZWcnKTsKICAgIHByZWZpeCgnLS0tJywgZnVuY3Rpb24gKCkgewogICAgICAgIHdhcm5pbmcoIkNvbmZ1c2luZyBtaW51c2VzLiIpOwogICAgICAgIHRoaXMucmlnaHQgPSBleHByZXNzaW9uKDE1MCk7CiAgICAgICAgdGhpcy5hcml0eSA9ICd1bmFyeSc7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9KTsKICAgIGluZml4KCctLS0nLCBmdW5jdGlvbiAobGVmdCkgewogICAgICAgIHdhcm5pbmcoIkNvbmZ1c2luZyBtaW51c2VzLiIpOwogICAgICAgIHRoaXMubGVmdCA9IGxlZnQ7CiAgICAgICAgdGhpcy5yaWdodCA9IGV4cHJlc3Npb24oMTMwKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0sIDEzMCk7CiAgICBpbmZpeCgnKicsICdtdWx0JywgMTQwKTsKICAgIGluZml4KCcvJywgJ2RpdicsIDE0MCk7CiAgICBpbmZpeCgnJScsICdtb2QnLCAxNDApOwoKICAgIHN1ZmZpeCgnKysnLCAncG9zdGluYycpOwogICAgcHJlZml4KCcrKycsICdwcmVpbmMnKTsKICAgIHN5bnRheFsnKysnXS5leHBzID0gdHJ1ZTsKCiAgICBzdWZmaXgoJy0tJywgJ3Bvc3RkZWMnKTsKICAgIHByZWZpeCgnLS0nLCAncHJlZGVjJyk7CiAgICBzeW50YXhbJy0tJ10uZXhwcyA9IHRydWU7CiAgICBwcmVmaXgoJ2RlbGV0ZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgcCA9IGV4cHJlc3Npb24oMCk7CiAgICAgICAgaWYgKCFwIHx8IChwLmlkICE9PSAnLicgJiYgcC5pZCAhPT0gJ1snKSkgewogICAgICAgICAgICB3YXJuaW5nKCJWYXJpYWJsZXMgc2hvdWxkIG5vdCBiZSBkZWxldGVkLiIpOwogICAgICAgIH0KICAgICAgICB0aGlzLmZpcnN0ID0gcDsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0pLmV4cHMgPSB0cnVlOwoKICAgIHByZWZpeCgnficsIGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAob3B0aW9uLmJpdHdpc2UpIHsKICAgICAgICAgICAgd2FybmluZygiVW5leHBlY3RlZCAne2F9Jy4iLCB0aGlzLCAnficpOwogICAgICAgIH0KICAgICAgICBleHByZXNzaW9uKDE1MCk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9KTsKCiAgICBwcmVmaXgoJyEnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdGhpcy5yaWdodCA9IGV4cHJlc3Npb24oMTUwKTsKICAgICAgICB0aGlzLmFyaXR5ID0gJ3VuYXJ5JzsKICAgICAgICBpZiAoYmFuZ1t0aGlzLnJpZ2h0LmlkXSA9PT0gdHJ1ZSkgewogICAgICAgICAgICB3YXJuaW5nKCJDb25mdXNpbmcgdXNlIG9mICd7YX0nLiIsIHRoaXMsICchJyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgfSk7CiAgICBwcmVmaXgoJ3R5cGVvZicsICd0eXBlb2YnKTsKICAgIHByZWZpeCgnbmV3JywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBjID0gZXhwcmVzc2lvbigxNTUpLCBpOwogICAgICAgIGlmIChjICYmIGMuaWQgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgaWYgKGMuaWRlbnRpZmllcikgewogICAgICAgICAgICAgICAgY1snbmV3J10gPSB0cnVlOwogICAgICAgICAgICAgICAgc3dpdGNoIChjLnZhbHVlKSB7CiAgICAgICAgICAgICAgICBjYXNlICdPYmplY3QnOgogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIlVzZSB0aGUgb2JqZWN0IGxpdGVyYWwgbm90YXRpb24ge30uIiwgdG9rZW4pOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnTnVtYmVyJzoKICAgICAgICAgICAgICAgIGNhc2UgJ1N0cmluZyc6CiAgICAgICAgICAgICAgICBjYXNlICdCb29sZWFuJzoKICAgICAgICAgICAgICAgIGNhc2UgJ01hdGgnOgogICAgICAgICAgICAgICAgY2FzZSAnSlNPTic6CiAgICAgICAgICAgICAgICAgICAgd2FybmluZygiRG8gbm90IHVzZSB7YX0gYXMgYSBjb25zdHJ1Y3Rvci4iLCB0b2tlbiwgYy52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdGdW5jdGlvbic6CiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb24uZXZpbCkgewogICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJUaGUgRnVuY3Rpb24gY29uc3RydWN0b3IgaXMgZXZhbC4iKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdEYXRlJzoKICAgICAgICAgICAgICAgIGNhc2UgJ1JlZ0V4cCc6CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIGlmIChjLmlkICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBjLnZhbHVlLnN1YnN0cigwLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbi5uZXdjYXAgJiYgKGkgPCAnQScgfHwgaSA+ICdaJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIkEgY29uc3RydWN0b3IgbmFtZSBzaG91bGQgc3RhcnQgd2l0aCAiKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbiB1cHBlcmNhc2UgbGV0dGVyLiIsIHRva2VuKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChjLmlkICE9PSAnLicgJiYgYy5pZCAhPT0gJ1snICYmIGMuaWQgIT09ICcoJykgewogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIkJhZCBjb25zdHJ1Y3Rvci4iLCB0b2tlbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoIW9wdGlvbi5zdXBlcm5ldykKICAgICAgICAgICAgICAgIHdhcm5pbmcoIldlaXJkIGNvbnN0cnVjdGlvbi4gRGVsZXRlICduZXcnLiIsIHRoaXMpOwogICAgICAgIH0KICAgICAgICBhZGphY2VudCh0b2tlbiwgbmV4dHRva2VuKTsKICAgICAgICBpZiAobmV4dHRva2VuLmlkICE9PSAnKCcgJiYgIW9wdGlvbi5zdXBlcm5ldykgewogICAgICAgICAgICB3YXJuaW5nKCJNaXNzaW5nICcoKScgaW52b2tpbmcgYSBjb25zdHJ1Y3Rvci4iKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5maXJzdCA9IGM7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9KTsKICAgIHN5bnRheFsnbmV3J10uZXhwcyA9IHRydWU7CgogICAgcHJlZml4KCd2b2lkJykuZXhwcyA9IHRydWU7CgogICAgaW5maXgoJy4nLCBmdW5jdGlvbiAobGVmdCwgdGhhdCkgewogICAgICAgIGFkamFjZW50KHByZXZ0b2tlbiwgdG9rZW4pOwogICAgICAgIG5vYnJlYWsoKTsKICAgICAgICB2YXIgbSA9IGlkZW50aWZpZXIoKTsKICAgICAgICBpZiAodHlwZW9mIG0gPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIGNvdW50TWVtYmVyKG0pOwogICAgICAgIH0KICAgICAgICB0aGF0LmxlZnQgPSBsZWZ0OwogICAgICAgIHRoYXQucmlnaHQgPSBtOwogICAgICAgIGlmIChvcHRpb24ubm9hcmcgJiYgbGVmdCAmJiBsZWZ0LnZhbHVlID09PSAnYXJndW1lbnRzJyAmJgogICAgICAgICAgICAgICAgKG0gPT09ICdjYWxsZWUnIHx8IG0gPT09ICdjYWxsZXInKSkgewogICAgICAgICAgICB3YXJuaW5nKCJBdm9pZCBhcmd1bWVudHMue2F9LiIsIGxlZnQsIG0pOwogICAgICAgIH0gZWxzZSBpZiAoIW9wdGlvbi5ldmlsICYmIGxlZnQgJiYgbGVmdC52YWx1ZSA9PT0gJ2RvY3VtZW50JyAmJgogICAgICAgICAgICAgICAgKG0gPT09ICd3cml0ZScgfHwgbSA9PT0gJ3dyaXRlbG4nKSkgewogICAgICAgICAgICB3YXJuaW5nKCJkb2N1bWVudC53cml0ZSBjYW4gYmUgYSBmb3JtIG9mIGV2YWwuIiwgbGVmdCk7CiAgICAgICAgfQogICAgICAgIGlmICghb3B0aW9uLmV2aWwgJiYgKG0gPT09ICdldmFsJyB8fCBtID09PSAnZXhlY1NjcmlwdCcpKSB7CiAgICAgICAgICAgIHdhcm5pbmcoJ2V2YWwgaXMgZXZpbC4nKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoYXQ7CiAgICB9LCAxNjAsIHRydWUpOwoKICAgIGluZml4KCcoJywgZnVuY3Rpb24gKGxlZnQsIHRoYXQpIHsKICAgICAgICBpZiAocHJldnRva2VuLmlkICE9PSAnfScgJiYgcHJldnRva2VuLmlkICE9PSAnKScpIHsKICAgICAgICAgICAgbm9icmVhayhwcmV2dG9rZW4sIHRva2VuKTsKICAgICAgICB9CiAgICAgICAgbm9zcGFjZSgpOwogICAgICAgIGlmIChvcHRpb24uaW1tZWQgJiYgIWxlZnQuaW1tZWQgJiYgbGVmdC5pZCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICB3YXJuaW5nKCJXcmFwIGFuIGltbWVkaWF0ZSBmdW5jdGlvbiBpbnZvY2F0aW9uIGluIHBhcmVudGhlc2VzICIgKwogICAgICAgICAgICAgICAgInRvIGFzc2lzdCB0aGUgcmVhZGVyIGluIHVuZGVyc3RhbmRpbmcgdGhhdCB0aGUgZXhwcmVzc2lvbiAiICsKICAgICAgICAgICAgICAgICJpcyB0aGUgcmVzdWx0IG9mIGEgZnVuY3Rpb24sIGFuZCBub3QgdGhlIGZ1bmN0aW9uIGl0c2VsZi4iKTsKICAgICAgICB9CiAgICAgICAgdmFyIG4gPSAwLAogICAgICAgICAgICBwID0gW107CiAgICAgICAgaWYgKGxlZnQpIHsKICAgICAgICAgICAgaWYgKGxlZnQudHlwZSA9PT0gJyhpZGVudGlmaWVyKScpIHsKICAgICAgICAgICAgICAgIGlmIChsZWZ0LnZhbHVlLm1hdGNoKC9eW0EtWl0oW0EtWjAtOV8kXSpbYS16XVtBLVphLXowLTlfJF0qKT8kLykpIHsKICAgICAgICAgICAgICAgICAgICBpZiAobGVmdC52YWx1ZSAhPT0gJ051bWJlcicgJiYgbGVmdC52YWx1ZSAhPT0gJ1N0cmluZycgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQudmFsdWUgIT09ICdCb29sZWFuJyAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdC52YWx1ZSAhPT0gJ0RhdGUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0LnZhbHVlID09PSAnTWF0aCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIk1hdGggaXMgbm90IGEgZnVuY3Rpb24uIiwgbGVmdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9uLm5ld2NhcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZygKIk1pc3NpbmcgJ25ldycgcHJlZml4IHdoZW4gaW52b2tpbmcgYSBjb25zdHJ1Y3Rvci4iLCBsZWZ0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAobmV4dHRva2VuLmlkICE9PSAnKScpIHsKICAgICAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICAgICAgcFtwLmxlbmd0aF0gPSBleHByZXNzaW9uKDEwKTsKICAgICAgICAgICAgICAgIG4gKz0gMTsKICAgICAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgIT09ICcsJykgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29tbWEoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBhZHZhbmNlKCcpJyk7CiAgICAgICAgbm9zcGFjZShwcmV2dG9rZW4sIHRva2VuKTsKICAgICAgICBpZiAodHlwZW9mIGxlZnQgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgIGlmIChsZWZ0LnZhbHVlID09PSAncGFyc2VJbnQnICYmIG4gPT09IDEpIHsKICAgICAgICAgICAgICAgIHdhcm5pbmcoIk1pc3NpbmcgcmFkaXggcGFyYW1ldGVyLiIsIGxlZnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghb3B0aW9uLmV2aWwpIHsKICAgICAgICAgICAgICAgIGlmIChsZWZ0LnZhbHVlID09PSAnZXZhbCcgfHwgbGVmdC52YWx1ZSA9PT0gJ0Z1bmN0aW9uJyB8fAogICAgICAgICAgICAgICAgICAgICAgICBsZWZ0LnZhbHVlID09PSAnZXhlY1NjcmlwdCcpIHsKICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJldmFsIGlzIGV2aWwuIiwgbGVmdCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBbMF0gJiYgcFswXS5pZCA9PT0gJyhzdHJpbmcpJyAmJgogICAgICAgICAgICAgICAgICAgICAgIChsZWZ0LnZhbHVlID09PSAnc2V0VGltZW91dCcgfHwKICAgICAgICAgICAgICAgICAgICAgICAgbGVmdC52YWx1ZSA9PT0gJ3NldEludGVydmFsJykpIHsKICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKAogICAgIkltcGxpZWQgZXZhbCBpcyBldmlsLiBQYXNzIGEgZnVuY3Rpb24gaW5zdGVhZCBvZiBhIHN0cmluZy4iLCBsZWZ0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWxlZnQuaWRlbnRpZmllciAmJiBsZWZ0LmlkICE9PSAnLicgJiYgbGVmdC5pZCAhPT0gJ1snICYmCiAgICAgICAgICAgICAgICAgICAgbGVmdC5pZCAhPT0gJygnICYmIGxlZnQuaWQgIT09ICcmJicgJiYgbGVmdC5pZCAhPT0gJ3x8JyAmJgogICAgICAgICAgICAgICAgICAgIGxlZnQuaWQgIT09ICc/JykgewogICAgICAgICAgICAgICAgd2FybmluZygiQmFkIGludm9jYXRpb24uIiwgbGVmdCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhhdC5sZWZ0ID0gbGVmdDsKICAgICAgICByZXR1cm4gdGhhdDsKICAgIH0sIDE1NSwgdHJ1ZSkuZXhwcyA9IHRydWU7CgogICAgcHJlZml4KCcoJywgZnVuY3Rpb24gKCkgewogICAgICAgIG5vc3BhY2UoKTsKICAgICAgICBpZiAobmV4dHRva2VuLmlkID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIG5leHR0b2tlbi5pbW1lZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHZhciB2ID0gZXhwcmVzc2lvbigwKTsKICAgICAgICBhZHZhbmNlKCcpJywgdGhpcyk7CiAgICAgICAgbm9zcGFjZShwcmV2dG9rZW4sIHRva2VuKTsKICAgICAgICBpZiAob3B0aW9uLmltbWVkICYmIHYuaWQgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJygnKSB7CiAgICAgICAgICAgICAgICB3YXJuaW5nKAoiTW92ZSB0aGUgaW52b2NhdGlvbiBpbnRvIHRoZSBwYXJlbnMgdGhhdCBjb250YWluIHRoZSBmdW5jdGlvbi4iLCBuZXh0dG9rZW4pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgd2FybmluZygKIkRvIG5vdCB3cmFwIGZ1bmN0aW9uIGxpdGVyYWxzIGluIHBhcmVucyB1bmxlc3MgdGhleSBhcmUgdG8gYmUgaW1tZWRpYXRlbHkgaW52b2tlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICB0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdjsKICAgIH0pOwoKICAgIGluZml4KCdbJywgZnVuY3Rpb24gKGxlZnQsIHRoYXQpIHsKICAgICAgICBub2JyZWFrKHByZXZ0b2tlbiwgdG9rZW4pOwogICAgICAgIG5vc3BhY2UoKTsKICAgICAgICB2YXIgZSA9IGV4cHJlc3Npb24oMCksIHM7CiAgICAgICAgaWYgKGUgJiYgZS50eXBlID09PSAnKHN0cmluZyknKSB7CiAgICAgICAgICAgIGlmICghb3B0aW9uLmV2aWwgJiYgKGUudmFsdWUgPT09ICdldmFsJyB8fCBlLnZhbHVlID09PSAnZXhlY1NjcmlwdCcpKSB7CiAgICAgICAgICAgICAgICB3YXJuaW5nKCJldmFsIGlzIGV2aWwuIiwgdGhhdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY291bnRNZW1iZXIoZS52YWx1ZSk7CiAgICAgICAgICAgIGlmICghb3B0aW9uLnN1YiAmJiBpeC50ZXN0KGUudmFsdWUpKSB7CiAgICAgICAgICAgICAgICBzID0gc3ludGF4W2UudmFsdWVdOwogICAgICAgICAgICAgICAgaWYgKCFzIHx8ICFzLnJlc2VydmVkKSB7CiAgICAgICAgICAgICAgICAgICAgd2FybmluZygiWyd7YX0nXSBpcyBiZXR0ZXIgd3JpdHRlbiBpbiBkb3Qgbm90YXRpb24uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUsIGUudmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGFkdmFuY2UoJ10nLCB0aGF0KTsKICAgICAgICBub3NwYWNlKHByZXZ0b2tlbiwgdG9rZW4pOwogICAgICAgIHRoYXQubGVmdCA9IGxlZnQ7CiAgICAgICAgdGhhdC5yaWdodCA9IGU7CiAgICAgICAgcmV0dXJuIHRoYXQ7CiAgICB9LCAxNjAsIHRydWUpOwoKICAgIHByZWZpeCgnWycsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgYiA9IHRva2VuLmxpbmUgIT09IG5leHR0b2tlbi5saW5lOwogICAgICAgIHRoaXMuZmlyc3QgPSBbXTsKICAgICAgICBpZiAoYikgewogICAgICAgICAgICBpbmRlbnQgKz0gb3B0aW9uLmluZGVudDsKICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5mcm9tID09PSBpbmRlbnQgKyBvcHRpb24uaW5kZW50KSB7CiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gb3B0aW9uLmluZGVudDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB3aGlsZSAobmV4dHRva2VuLmlkICE9PSAnKGVuZCknKSB7CiAgICAgICAgICAgIHdoaWxlIChuZXh0dG9rZW4uaWQgPT09ICcsJykgewogICAgICAgICAgICAgICAgd2FybmluZygiRXh0cmEgY29tbWEuIik7CiAgICAgICAgICAgICAgICBhZHZhbmNlKCcsJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJ10nKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYiAmJiB0b2tlbi5saW5lICE9PSBuZXh0dG9rZW4ubGluZSkgewogICAgICAgICAgICAgICAgaW5kZW50YXRpb24oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmZpcnN0LnB1c2goZXhwcmVzc2lvbigxMCkpOwogICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkID09PSAnLCcpIHsKICAgICAgICAgICAgICAgIGNvbW1hKCk7CiAgICAgICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkID09PSAnXScgJiYgIW9wdGlvbi5lczUpIHsKICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJFeHRyYSBjb21tYS4iLCB0b2tlbik7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoYikgewogICAgICAgICAgICBpbmRlbnQgLT0gb3B0aW9uLmluZGVudDsKICAgICAgICAgICAgaW5kZW50YXRpb24oKTsKICAgICAgICB9CiAgICAgICAgYWR2YW5jZSgnXScsIHRoaXMpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfSwgMTYwKTsKCgogICAgZnVuY3Rpb24gcHJvcGVydHlfbmFtZSgpIHsKICAgICAgICB2YXIgaWQgPSBvcHRpb25hbGlkZW50aWZpZXIodHJ1ZSk7CiAgICAgICAgaWYgKCFpZCkgewogICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkID09PSAnKHN0cmluZyknKSB7CiAgICAgICAgICAgICAgICBpZCA9IG5leHR0b2tlbi52YWx1ZTsKICAgICAgICAgICAgICAgIGFkdmFuY2UoKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0dG9rZW4uaWQgPT09ICcobnVtYmVyKScpIHsKICAgICAgICAgICAgICAgIGlkID0gbmV4dHRva2VuLnZhbHVlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICBhZHZhbmNlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGlkOwogICAgfQoKCiAgICBmdW5jdGlvbiBmdW5jdGlvbnBhcmFtcygpIHsKICAgICAgICB2YXIgaSwgdCA9IG5leHR0b2tlbiwgcCA9IFtdOwogICAgICAgIGFkdmFuY2UoJygnKTsKICAgICAgICBub3NwYWNlKCk7CiAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJyknKSB7CiAgICAgICAgICAgIGFkdmFuY2UoJyknKTsKICAgICAgICAgICAgbm9zcGFjZShwcmV2dG9rZW4sIHRva2VuKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgIGkgPSBpZGVudGlmaWVyKHRydWUpOwogICAgICAgICAgICBwLnB1c2goaSk7CiAgICAgICAgICAgIGFkZGxhYmVsKGksICdwYXJhbWV0ZXInKTsKICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJywnKSB7CiAgICAgICAgICAgICAgICBjb21tYSgpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgYWR2YW5jZSgnKScsIHQpOwogICAgICAgICAgICAgICAgbm9zcGFjZShwcmV2dG9rZW4sIHRva2VuKTsKICAgICAgICAgICAgICAgIHJldHVybiBwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKCiAgICBmdW5jdGlvbiBkb0Z1bmN0aW9uKGksIHN0YXRlbWVudCkgewogICAgICAgIHZhciBmLAogICAgICAgICAgICBvbGRPcHRpb24gPSBvcHRpb24sCiAgICAgICAgICAgIG9sZFNjb3BlICA9IHNjb3BlOwoKICAgICAgICBvcHRpb24gPSBPYmplY3QuY3JlYXRlKG9wdGlvbik7CiAgICAgICAgc2NvcGUgPSBPYmplY3QuY3JlYXRlKHNjb3BlKTsKCiAgICAgICAgZnVuY3QgPSB7CiAgICAgICAgICAgICcobmFtZSknICAgICA6IGkgfHwgJyInICsgYW5vbm5hbWUgKyAnIicsCiAgICAgICAgICAgICcobGluZSknICAgICA6IG5leHR0b2tlbi5saW5lLAogICAgICAgICAgICAnKGNvbnRleHQpJyAgOiBmdW5jdCwKICAgICAgICAgICAgJyhicmVha2FnZSknIDogMCwKICAgICAgICAgICAgJyhsb29wYWdlKScgIDogMCwKICAgICAgICAgICAgJyhzY29wZSknICAgIDogc2NvcGUsCiAgICAgICAgICAgICcoc3RhdGVtZW50KSc6IHN0YXRlbWVudAogICAgICAgIH07CiAgICAgICAgZiA9IGZ1bmN0OwogICAgICAgIHRva2VuLmZ1bmN0ID0gZnVuY3Q7CiAgICAgICAgZnVuY3Rpb25zLnB1c2goZnVuY3QpOwogICAgICAgIGlmIChpKSB7CiAgICAgICAgICAgIGFkZGxhYmVsKGksICdmdW5jdGlvbicpOwogICAgICAgIH0KICAgICAgICBmdW5jdFsnKHBhcmFtcyknXSA9IGZ1bmN0aW9ucGFyYW1zKCk7CgogICAgICAgIGJsb2NrKGZhbHNlKTsKICAgICAgICBzY29wZSA9IG9sZFNjb3BlOwogICAgICAgIG9wdGlvbiA9IG9sZE9wdGlvbjsKICAgICAgICBmdW5jdFsnKGxhc3QpJ10gPSB0b2tlbi5saW5lOwogICAgICAgIGZ1bmN0ID0gZnVuY3RbJyhjb250ZXh0KSddOwogICAgICAgIHJldHVybiBmOwogICAgfQoKCiAgICAoZnVuY3Rpb24gKHgpIHsKICAgICAgICB4Lm51ZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGIsIGYsIGksIGosIHAsIHNlZW4gPSB7fSwgdDsKCiAgICAgICAgICAgIGIgPSB0b2tlbi5saW5lICE9PSBuZXh0dG9rZW4ubGluZTsKICAgICAgICAgICAgaWYgKGIpIHsKICAgICAgICAgICAgICAgIGluZGVudCArPSBvcHRpb24uaW5kZW50OwogICAgICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5mcm9tID09PSBpbmRlbnQgKyBvcHRpb24uaW5kZW50KSB7CiAgICAgICAgICAgICAgICAgICAgaW5kZW50ICs9IG9wdGlvbi5pbmRlbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJ30nKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoYikgewogICAgICAgICAgICAgICAgICAgIGluZGVudGF0aW9uKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobmV4dHRva2VuLnZhbHVlID09PSAnZ2V0JyAmJiBwZWVrKCkuaWQgIT09ICc6JykgewogICAgICAgICAgICAgICAgICAgIGFkdmFuY2UoJ2dldCcpOwogICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9uLmVzNSkgewogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiZ2V0L3NldCBhcmUgRVM1IGZlYXR1cmVzLiIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpID0gcHJvcGVydHlfbmFtZSgpOwogICAgICAgICAgICAgICAgICAgIGlmICghaSkgewogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiTWlzc2luZyBwcm9wZXJ0eSBuYW1lLiIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0ID0gbmV4dHRva2VuOwogICAgICAgICAgICAgICAgICAgIGFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOwogICAgICAgICAgICAgICAgICAgIGYgPSBkb0Z1bmN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb24ubG9vcGZ1bmMgJiYgZnVuY3RbJyhsb29wYWdlKSddKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIkRvbid0IG1ha2UgZnVuY3Rpb25zIHdpdGhpbiBhIGxvb3AuIiwgdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHAgPSBmWycocGFyYW1zKSddOwogICAgICAgICAgICAgICAgICAgIGlmIChwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIlVuZXhwZWN0ZWQgcGFyYW1ldGVyICd7YX0nIGluIGdldCB7Yn0gZnVuY3Rpb24uIiwgdCwgcFswXSwgaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOwogICAgICAgICAgICAgICAgICAgIGFkdmFuY2UoJywnKTsKICAgICAgICAgICAgICAgICAgICBpbmRlbnRhdGlvbigpOwogICAgICAgICAgICAgICAgICAgIGFkdmFuY2UoJ3NldCcpOwogICAgICAgICAgICAgICAgICAgIGogPSBwcm9wZXJ0eV9uYW1lKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT09IGopIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIkV4cGVjdGVkIHthfSBhbmQgaW5zdGVhZCBzYXcge2J9LiIsIHRva2VuLCBpLCBqKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdCA9IG5leHR0b2tlbjsKICAgICAgICAgICAgICAgICAgICBhZGphY2VudCh0b2tlbiwgbmV4dHRva2VuKTsKICAgICAgICAgICAgICAgICAgICBmID0gZG9GdW5jdGlvbigpOwogICAgICAgICAgICAgICAgICAgIHAgPSBmWycocGFyYW1zKSddOwogICAgICAgICAgICAgICAgICAgIGlmICghcCB8fCBwLmxlbmd0aCAhPT0gMSB8fCBwWzBdICE9PSAndmFsdWUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIkV4cGVjdGVkICh2YWx1ZSkgaW4gc2V0IHthfSBmdW5jdGlvbi4iLCB0LCBpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGkgPSBwcm9wZXJ0eV9uYW1lKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpICE9PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSgnOicpOwogICAgICAgICAgICAgICAgICAgIG5vbmFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOwogICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24oMTApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNlZW5baV0gPT09IHRydWUpIHsKICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJEdXBsaWNhdGUgbWVtYmVyICd7YX0nLiIsIG5leHR0b2tlbiwgaSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzZWVuW2ldID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvdW50TWVtYmVyKGkpOwogICAgICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJywnKSB7CiAgICAgICAgICAgICAgICAgICAgY29tbWEoKTsKICAgICAgICAgICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkID09PSAnLCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZygiRXh0cmEgY29tbWEuIiwgdG9rZW4pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dHRva2VuLmlkID09PSAnfScgJiYgIW9wdGlvbi5lczUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZygiRXh0cmEgY29tbWEuIiwgdG9rZW4pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGIpIHsKICAgICAgICAgICAgICAgIGluZGVudCAtPSBvcHRpb24uaW5kZW50OwogICAgICAgICAgICAgICAgaW5kZW50YXRpb24oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhZHZhbmNlKCd9JywgdGhpcyk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgeC5mdWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCB0byBzZWUgYSBzdGF0ZW1lbnQgYW5kIGluc3RlYWQgc2F3IGEgYmxvY2suIiwgdG9rZW4pOwogICAgICAgIH07CiAgICB9KGRlbGltKCd7JykpKTsKCiAgICB2YXIgdmFyc3RhdGVtZW50ID0gc3RtdCgndmFyJywgZnVuY3Rpb24gKHByZWZpeCkgewogICAgICAgIC8vIEphdmFTY3JpcHQgZG9lcyBub3QgaGF2ZSBibG9jayBzY29wZS4gSXQgb25seSBoYXMgZnVuY3Rpb24gc2NvcGUuIFNvLAogICAgICAgIC8vIGRlY2xhcmluZyBhIHZhcmlhYmxlIGluIGEgYmxvY2sgY2FuIGhhdmUgdW5leHBlY3RlZCBjb25zZXF1ZW5jZXMuCiAgICAgICAgdmFyIGlkLCBuYW1lLCB2YWx1ZTsKCiAgICAgICAgaWYgKGZ1bmN0Wycob25ldmFyKSddICYmIG9wdGlvbi5vbmV2YXIpIHsKICAgICAgICAgICAgd2FybmluZygiVG9vIG1hbnkgdmFyIHN0YXRlbWVudHMuIik7CiAgICAgICAgfSBlbHNlIGlmICghZnVuY3RbJyhnbG9iYWwpJ10pIHsKICAgICAgICAgICAgZnVuY3RbJyhvbmV2YXIpJ10gPSB0cnVlOwogICAgICAgIH0KICAgICAgICB0aGlzLmZpcnN0ID0gW107CiAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICBub25hZGphY2VudCh0b2tlbiwgbmV4dHRva2VuKTsKICAgICAgICAgICAgaWQgPSBpZGVudGlmaWVyKCk7CiAgICAgICAgICAgIGlmIChmdW5jdFsnKGdsb2JhbCknXSAmJiBwcmVkZWZpbmVkW2lkXSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIHdhcm5pbmcoIlJlZGVmaW5pdGlvbiBvZiAne2F9Jy4iLCB0b2tlbiwgaWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFkZGxhYmVsKGlkLCAndW51c2VkJyk7CiAgICAgICAgICAgIGlmIChwcmVmaXgpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5hbWUgPSB0b2tlbjsKICAgICAgICAgICAgdGhpcy5maXJzdC5wdXNoKHRva2VuKTsKICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJz0nKSB7CiAgICAgICAgICAgICAgICBub25hZGphY2VudCh0b2tlbiwgbmV4dHRva2VuKTsKICAgICAgICAgICAgICAgIGFkdmFuY2UoJz0nKTsKICAgICAgICAgICAgICAgIG5vbmFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOwogICAgICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGluaXRpYWxpemUgJ3thfScgdG8gJ3VuZGVmaW5lZCcuIiwgdG9rZW4sIGlkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChwZWVrKDApLmlkID09PSAnPScgJiYgbmV4dHRva2VuLmlkZW50aWZpZXIpIHsKICAgICAgICAgICAgICAgICAgICBlcnJvcigiVmFyaWFibGUge2F9IHdhcyBub3QgZGVjbGFyZWQgY29ycmVjdGx5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0dG9rZW4sIG5leHR0b2tlbi52YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YWx1ZSA9IGV4cHJlc3Npb24oMCk7CiAgICAgICAgICAgICAgICBuYW1lLmZpcnN0ID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCAhPT0gJywnKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb21tYSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpczsKICAgIH0pOwogICAgdmFyc3RhdGVtZW50LmV4cHMgPSB0cnVlOwoKICAgIGJsb2Nrc3RtdCgnZnVuY3Rpb24nLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKGluYmxvY2spIHsKICAgICAgICAgICAgd2FybmluZygiRnVuY3Rpb24gZGVjbGFyYXRpb25zIHNob3VsZCBub3QgYmUgcGxhY2VkIGluIGJsb2Nrcy4gIiArCiAgICAgICAgICAgICAgICAiVXNlIGEgZnVuY3Rpb24gZXhwcmVzc2lvbiBvciBtb3ZlIHRoZSBzdGF0ZW1lbnQgdG8gdGhlIHRvcCBvZiAiICsKICAgICAgICAgICAgICAgICJ0aGUgb3V0ZXIgZnVuY3Rpb24uIiwgdG9rZW4pOwoKICAgICAgICB9CiAgICAgICAgdmFyIGkgPSBpZGVudGlmaWVyKCk7CiAgICAgICAgYWRqYWNlbnQodG9rZW4sIG5leHR0b2tlbik7CiAgICAgICAgYWRkbGFiZWwoaSwgJ3VuY3Rpb24nKTsKICAgICAgICBkb0Z1bmN0aW9uKGksIHRydWUpOwogICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICcoJyAmJiBuZXh0dG9rZW4ubGluZSA9PT0gdG9rZW4ubGluZSkgewogICAgICAgICAgICBlcnJvcigKIkZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBhcmUgbm90IGludm9jYWJsZS4gV3JhcCB0aGUgd2hvbGUgZnVuY3Rpb24gaW52b2NhdGlvbiBpbiBwYXJlbnMuIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgfSk7CgogICAgcHJlZml4KCdmdW5jdGlvbicsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgaSA9IG9wdGlvbmFsaWRlbnRpZmllcigpOwogICAgICAgIGlmIChpKSB7CiAgICAgICAgICAgIGFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5vbmFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOwogICAgICAgIH0KICAgICAgICBkb0Z1bmN0aW9uKGkpOwogICAgICAgIGlmICghb3B0aW9uLmxvb3BmdW5jICYmIGZ1bmN0WycobG9vcGFnZSknXSkgewogICAgICAgICAgICB3YXJuaW5nKCJEb24ndCBtYWtlIGZ1bmN0aW9ucyB3aXRoaW4gYSBsb29wLiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpczsKICAgIH0pOwoKICAgIGJsb2Nrc3RtdCgnaWYnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIHQgPSBuZXh0dG9rZW47CiAgICAgICAgYWR2YW5jZSgnKCcpOwogICAgICAgIG5vbmFkamFjZW50KHRoaXMsIHQpOwogICAgICAgIG5vc3BhY2UoKTsKICAgICAgICBleHByZXNzaW9uKDIwKTsKICAgICAgICBpZiAobmV4dHRva2VuLmlkID09PSAnPScpIHsKICAgICAgICAgICAgaWYgKCFvcHRpb24uYm9zcykKICAgICAgICAgICAgICAgIHdhcm5pbmcoIkV4cGVjdGVkIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBhbmQgaW5zdGVhZCBzYXcgYW4gYXNzaWdubWVudC4iKTsKICAgICAgICAgICAgYWR2YW5jZSgnPScpOwogICAgICAgICAgICBleHByZXNzaW9uKDIwKTsKICAgICAgICB9CiAgICAgICAgYWR2YW5jZSgnKScsIHQpOwogICAgICAgIG5vc3BhY2UocHJldnRva2VuLCB0b2tlbik7CiAgICAgICAgYmxvY2sodHJ1ZSwgdHJ1ZSk7CiAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJ2Vsc2UnKSB7CiAgICAgICAgICAgIG5vbmFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOwogICAgICAgICAgICBhZHZhbmNlKCdlbHNlJyk7CiAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICdpZicgfHwgbmV4dHRva2VuLmlkID09PSAnc3dpdGNoJykgewogICAgICAgICAgICAgICAgc3RhdGVtZW50KHRydWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgYmxvY2sodHJ1ZSwgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9KTsKCiAgICBibG9ja3N0bXQoJ3RyeScsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgYiwgZSwgczsKCiAgICAgICAgYmxvY2soZmFsc2UpOwogICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICdjYXRjaCcpIHsKICAgICAgICAgICAgYWR2YW5jZSgnY2F0Y2gnKTsKICAgICAgICAgICAgbm9uYWRqYWNlbnQodG9rZW4sIG5leHR0b2tlbik7CiAgICAgICAgICAgIGFkdmFuY2UoJygnKTsKICAgICAgICAgICAgcyA9IHNjb3BlOwogICAgICAgICAgICBzY29wZSA9IE9iamVjdC5jcmVhdGUocyk7CiAgICAgICAgICAgIGUgPSBuZXh0dG9rZW4udmFsdWU7CiAgICAgICAgICAgIGlmIChuZXh0dG9rZW4udHlwZSAhPT0gJyhpZGVudGlmaWVyKScpIHsKICAgICAgICAgICAgICAgIHdhcm5pbmcoIkV4cGVjdGVkIGFuIGlkZW50aWZpZXIgYW5kIGluc3RlYWQgc2F3ICd7YX0nLiIsCiAgICAgICAgICAgICAgICAgICAgbmV4dHRva2VuLCBlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGFkZGxhYmVsKGUsICdleGNlcHRpb24nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhZHZhbmNlKCk7CiAgICAgICAgICAgIGFkdmFuY2UoJyknKTsKICAgICAgICAgICAgYmxvY2soZmFsc2UpOwogICAgICAgICAgICBiID0gdHJ1ZTsKICAgICAgICAgICAgc2NvcGUgPSBzOwogICAgICAgIH0KICAgICAgICBpZiAobmV4dHRva2VuLmlkID09PSAnZmluYWxseScpIHsKICAgICAgICAgICAgYWR2YW5jZSgnZmluYWxseScpOwogICAgICAgICAgICBibG9jayhmYWxzZSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9IGVsc2UgaWYgKCFiKSB7CiAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCAne2F9JyBhbmQgaW5zdGVhZCBzYXcgJ3tifScuIiwKICAgICAgICAgICAgICAgICAgICBuZXh0dG9rZW4sICdjYXRjaCcsIG5leHR0b2tlbi52YWx1ZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgfSk7CgogICAgYmxvY2tzdG10KCd3aGlsZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgdCA9IG5leHR0b2tlbjsKICAgICAgICBmdW5jdFsnKGJyZWFrYWdlKSddICs9IDE7CiAgICAgICAgZnVuY3RbJyhsb29wYWdlKSddICs9IDE7CiAgICAgICAgYWR2YW5jZSgnKCcpOwogICAgICAgIG5vbmFkamFjZW50KHRoaXMsIHQpOwogICAgICAgIG5vc3BhY2UoKTsKICAgICAgICBleHByZXNzaW9uKDIwKTsKICAgICAgICBpZiAobmV4dHRva2VuLmlkID09PSAnPScpIHsKICAgICAgICAgICAgaWYgKCFvcHRpb24uYm9zcykKICAgICAgICAgICAgICAgIHdhcm5pbmcoIkV4cGVjdGVkIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBhbmQgaW5zdGVhZCBzYXcgYW4gYXNzaWdubWVudC4iKTsKICAgICAgICAgICAgYWR2YW5jZSgnPScpOwogICAgICAgICAgICBleHByZXNzaW9uKDIwKTsKICAgICAgICB9CiAgICAgICAgYWR2YW5jZSgnKScsIHQpOwogICAgICAgIG5vc3BhY2UocHJldnRva2VuLCB0b2tlbik7CiAgICAgICAgYmxvY2sodHJ1ZSwgdHJ1ZSk7CiAgICAgICAgZnVuY3RbJyhicmVha2FnZSknXSAtPSAxOwogICAgICAgIGZ1bmN0WycobG9vcGFnZSknXSAtPSAxOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfSkubGFiZWxsZWQgPSB0cnVlOwoKICAgIHJlc2VydmUoJ3dpdGgnKTsKCiAgICBibG9ja3N0bXQoJ3N3aXRjaCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgdCA9IG5leHR0b2tlbiwKICAgICAgICAgICAgZyA9IGZhbHNlOwogICAgICAgIGZ1bmN0WycoYnJlYWthZ2UpJ10gKz0gMTsKICAgICAgICBhZHZhbmNlKCcoJyk7CiAgICAgICAgbm9uYWRqYWNlbnQodGhpcywgdCk7CiAgICAgICAgbm9zcGFjZSgpOwogICAgICAgIHRoaXMuY29uZGl0aW9uID0gZXhwcmVzc2lvbigyMCk7CiAgICAgICAgYWR2YW5jZSgnKScsIHQpOwogICAgICAgIG5vc3BhY2UocHJldnRva2VuLCB0b2tlbik7CiAgICAgICAgbm9uYWRqYWNlbnQodG9rZW4sIG5leHR0b2tlbik7CiAgICAgICAgdCA9IG5leHR0b2tlbjsKICAgICAgICBhZHZhbmNlKCd7Jyk7CiAgICAgICAgbm9uYWRqYWNlbnQodG9rZW4sIG5leHR0b2tlbik7CiAgICAgICAgaW5kZW50ICs9IG9wdGlvbi5pbmRlbnQ7CiAgICAgICAgdGhpcy5jYXNlcyA9IFtdOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgc3dpdGNoIChuZXh0dG9rZW4uaWQpIHsKICAgICAgICAgICAgY2FzZSAnY2FzZSc6CiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZ1bmN0WycodmVyYiknXSkgewogICAgICAgICAgICAgICAgY2FzZSAnYnJlYWsnOgogICAgICAgICAgICAgICAgY2FzZSAnY2FzZSc6CiAgICAgICAgICAgICAgICBjYXNlICdjb250aW51ZSc6CiAgICAgICAgICAgICAgICBjYXNlICdyZXR1cm4nOgogICAgICAgICAgICAgICAgY2FzZSAnc3dpdGNoJzoKICAgICAgICAgICAgICAgIGNhc2UgJ3Rocm93JzoKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgLy8gWW91IGNhbiB0ZWxsIEpTSGludCB0aGF0IHlvdSBkb24ndCB1c2UgYnJlYWsgaW50ZW50aW9uYWxseSBieQogICAgICAgICAgICAgICAgICAgIC8vIGFkZGluZyBhIGNvbW1lbnQgLyogZmFsbHMgdGhyb3VnaCAqLyBvbiBhIGxpbmUganVzdCBiZWZvcmUKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbmV4dCBgY2FzZWAuCiAgICAgICAgICAgICAgICAgICAgaWYgKCFmdC50ZXN0KGxpbmVzW25leHR0b2tlbi5saW5lIC0gMl0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgYSAnYnJlYWsnIHN0YXRlbWVudCBiZWZvcmUgJ2Nhc2UnLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaW5kZW50YXRpb24oLW9wdGlvbi5pbmRlbnQpOwogICAgICAgICAgICAgICAgYWR2YW5jZSgnY2FzZScpOwogICAgICAgICAgICAgICAgdGhpcy5jYXNlcy5wdXNoKGV4cHJlc3Npb24oMjApKTsKICAgICAgICAgICAgICAgIGcgPSB0cnVlOwogICAgICAgICAgICAgICAgYWR2YW5jZSgnOicpOwogICAgICAgICAgICAgICAgZnVuY3RbJyh2ZXJiKSddID0gJ2Nhc2UnOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2RlZmF1bHQnOgogICAgICAgICAgICAgICAgc3dpdGNoIChmdW5jdFsnKHZlcmIpJ10pIHsKICAgICAgICAgICAgICAgIGNhc2UgJ2JyZWFrJzoKICAgICAgICAgICAgICAgIGNhc2UgJ2NvbnRpbnVlJzoKICAgICAgICAgICAgICAgIGNhc2UgJ3JldHVybic6CiAgICAgICAgICAgICAgICBjYXNlICd0aHJvdyc6CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIGlmICghZnQudGVzdChsaW5lc1tuZXh0dG9rZW4ubGluZSAtIDJdKSkgewogICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGEgJ2JyZWFrJyBzdGF0ZW1lbnQgYmVmb3JlICdkZWZhdWx0Jy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGluZGVudGF0aW9uKC1vcHRpb24uaW5kZW50KTsKICAgICAgICAgICAgICAgIGFkdmFuY2UoJ2RlZmF1bHQnKTsKICAgICAgICAgICAgICAgIGcgPSB0cnVlOwogICAgICAgICAgICAgICAgYWR2YW5jZSgnOicpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ30nOgogICAgICAgICAgICAgICAgaW5kZW50IC09IG9wdGlvbi5pbmRlbnQ7CiAgICAgICAgICAgICAgICBpbmRlbnRhdGlvbigpOwogICAgICAgICAgICAgICAgYWR2YW5jZSgnfScsIHQpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FzZXMubGVuZ3RoID09PSAxIHx8IHRoaXMuY29uZGl0aW9uLmlkID09PSAndHJ1ZScgfHwKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25kaXRpb24uaWQgPT09ICdmYWxzZScpIHsKICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJUaGlzICdzd2l0Y2gnIHNob3VsZCBiZSBhbiAnaWYnLiIsIHRoaXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3RbJyhicmVha2FnZSknXSAtPSAxOwogICAgICAgICAgICAgICAgZnVuY3RbJyh2ZXJiKSddID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBjYXNlICcoZW5kKSc6CiAgICAgICAgICAgICAgICBlcnJvcigiTWlzc2luZyAne2F9Jy4iLCBuZXh0dG9rZW4sICd9Jyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBpZiAoZykgewogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodG9rZW4uaWQpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICcsJzoKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIkVhY2ggdmFsdWUgc2hvdWxkIGhhdmUgaXRzIG93biBjYXNlIGxhYmVsLiIpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnOic6CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIk1pc3NpbmcgJzonIG9uIGEgY2FzZSBjbGF1c2UuIiwgdG9rZW4pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3IoIkV4cGVjdGVkICd7YX0nIGFuZCBpbnN0ZWFkIHNhdyAne2J9Jy4iLAogICAgICAgICAgICAgICAgICAgICAgICBuZXh0dG9rZW4sICdjYXNlJywgbmV4dHRva2VuLnZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pLmxhYmVsbGVkID0gdHJ1ZTsKCiAgICBzdG10KCdkZWJ1Z2dlcicsIGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoIW9wdGlvbi5kZWJ1ZykgewogICAgICAgICAgICB3YXJuaW5nKCJBbGwgJ2RlYnVnZ2VyJyBzdGF0ZW1lbnRzIHNob3VsZCBiZSByZW1vdmVkLiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpczsKICAgIH0pLmV4cHMgPSB0cnVlOwoKICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIHggPSBzdG10KCdkbycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgZnVuY3RbJyhicmVha2FnZSknXSArPSAxOwogICAgICAgICAgICBmdW5jdFsnKGxvb3BhZ2UpJ10gKz0gMTsKICAgICAgICAgICAgdGhpcy5maXJzdCA9IGJsb2NrKHRydWUpOwogICAgICAgICAgICBhZHZhbmNlKCd3aGlsZScpOwogICAgICAgICAgICB2YXIgdCA9IG5leHR0b2tlbjsKICAgICAgICAgICAgbm9uYWRqYWNlbnQodG9rZW4sIHQpOwogICAgICAgICAgICBhZHZhbmNlKCcoJyk7CiAgICAgICAgICAgIG5vc3BhY2UoKTsKICAgICAgICAgICAgZXhwcmVzc2lvbigyMCk7CiAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICc9JykgewogICAgICAgICAgICAgICAgaWYgKCFvcHRpb24uYm9zcykKICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJFeHBlY3RlZCBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gYW5kIGluc3RlYWQgc2F3IGFuIGFzc2lnbm1lbnQuIik7CiAgICAgICAgICAgICAgICBhZHZhbmNlKCc9Jyk7CiAgICAgICAgICAgICAgICBleHByZXNzaW9uKDIwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhZHZhbmNlKCcpJywgdCk7CiAgICAgICAgICAgIG5vc3BhY2UocHJldnRva2VuLCB0b2tlbik7CiAgICAgICAgICAgIGZ1bmN0WycoYnJlYWthZ2UpJ10gLT0gMTsKICAgICAgICAgICAgZnVuY3RbJyhsb29wYWdlKSddIC09IDE7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0pOwogICAgICAgIHgubGFiZWxsZWQgPSB0cnVlOwogICAgICAgIHguZXhwcyA9IHRydWU7CiAgICB9KCkpOwoKICAgIGJsb2Nrc3RtdCgnZm9yJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBzLCB0ID0gbmV4dHRva2VuOwogICAgICAgIGZ1bmN0WycoYnJlYWthZ2UpJ10gKz0gMTsKICAgICAgICBmdW5jdFsnKGxvb3BhZ2UpJ10gKz0gMTsKICAgICAgICBhZHZhbmNlKCcoJyk7CiAgICAgICAgbm9uYWRqYWNlbnQodGhpcywgdCk7CiAgICAgICAgbm9zcGFjZSgpOwogICAgICAgIGlmIChwZWVrKG5leHR0b2tlbi5pZCA9PT0gJ3ZhcicgPyAxIDogMCkuaWQgPT09ICdpbicpIHsKICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJ3ZhcicpIHsKICAgICAgICAgICAgICAgIGFkdmFuY2UoJ3ZhcicpOwogICAgICAgICAgICAgICAgdmFyc3RhdGVtZW50LmZ1ZC5jYWxsKHZhcnN0YXRlbWVudCwgdHJ1ZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZ1bmN0W25leHR0b2tlbi52YWx1ZV0pIHsKICAgICAgICAgICAgICAgIGNhc2UgJ3VudXNlZCc6CiAgICAgICAgICAgICAgICAgICAgZnVuY3RbbmV4dHRva2VuLnZhbHVlXSA9ICd2YXInOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAndmFyJzoKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgd2FybmluZygiQmFkIGZvciBpbiB2YXJpYWJsZSAne2F9Jy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dHRva2VuLCBuZXh0dG9rZW4udmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYWR2YW5jZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFkdmFuY2UoJ2luJyk7CiAgICAgICAgICAgIGV4cHJlc3Npb24oMjApOwogICAgICAgICAgICBhZHZhbmNlKCcpJywgdCk7CiAgICAgICAgICAgIHMgPSBibG9jayh0cnVlLCB0cnVlKTsKICAgICAgICAgICAgaWYgKG9wdGlvbi5mb3JpbiAmJiAocy5sZW5ndGggPiAxIHx8IHR5cGVvZiBzWzBdICE9PSAnb2JqZWN0JyB8fAogICAgICAgICAgICAgICAgICAgIHNbMF0udmFsdWUgIT09ICdpZicpKSB7CiAgICAgICAgICAgICAgICB3YXJuaW5nKCJUaGUgYm9keSBvZiBhIGZvciBpbiBzaG91bGQgYmUgd3JhcHBlZCBpbiBhbiBpZiBzdGF0ZW1lbnQgdG8gZmlsdGVyICIgKwogICAgICAgICAgICAgICAgICAgICAgICAidW53YW50ZWQgcHJvcGVydGllcyBmcm9tIHRoZSBwcm90b3R5cGUuIiwgdGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3RbJyhicmVha2FnZSknXSAtPSAxOwogICAgICAgICAgICBmdW5jdFsnKGxvb3BhZ2UpJ10gLT0gMTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCAhPT0gJzsnKSB7CiAgICAgICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkID09PSAndmFyJykgewogICAgICAgICAgICAgICAgICAgIGFkdmFuY2UoJ3ZhcicpOwogICAgICAgICAgICAgICAgICAgIHZhcnN0YXRlbWVudC5mdWQuY2FsbCh2YXJzdGF0ZW1lbnQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24oMCwgJ2ZvcicpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkICE9PSAnLCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG5vbGluZWJyZWFrKHRva2VuKTsKICAgICAgICAgICAgYWR2YW5jZSgnOycpOwogICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkICE9PSAnOycpIHsKICAgICAgICAgICAgICAgIGV4cHJlc3Npb24oMjApOwogICAgICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJz0nKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb24uYm9zcykKICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZygiRXhwZWN0ZWQgYSBjb25kaXRpb25hbCBleHByZXNzaW9uIGFuZCBpbnN0ZWFkIHNhdyBhbiBhc3NpZ25tZW50LiIpOwogICAgICAgICAgICAgICAgICAgIGFkdmFuY2UoJz0nKTsKICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uKDIwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBub2xpbmVicmVhayh0b2tlbik7CiAgICAgICAgICAgIGFkdmFuY2UoJzsnKTsKICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCA9PT0gJzsnKSB7CiAgICAgICAgICAgICAgICBlcnJvcigiRXhwZWN0ZWQgJ3thfScgYW5kIGluc3RlYWQgc2F3ICd7Yn0nLiIsCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHR0b2tlbiwgJyknLCAnOycpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgIT09ICcpJykgewogICAgICAgICAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24oMCwgJ2ZvcicpOwogICAgICAgICAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgIT09ICcsJykgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29tbWEoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBhZHZhbmNlKCcpJywgdCk7CiAgICAgICAgICAgIG5vc3BhY2UocHJldnRva2VuLCB0b2tlbik7CiAgICAgICAgICAgIGJsb2NrKHRydWUsIHRydWUpOwogICAgICAgICAgICBmdW5jdFsnKGJyZWFrYWdlKSddIC09IDE7CiAgICAgICAgICAgIGZ1bmN0WycobG9vcGFnZSknXSAtPSAxOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9CiAgICB9KS5sYWJlbGxlZCA9IHRydWU7CgoKICAgIHN0bXQoJ2JyZWFrJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciB2ID0gbmV4dHRva2VuLnZhbHVlOwogICAgICAgIGlmIChmdW5jdFsnKGJyZWFrYWdlKSddID09PSAwKSB7CiAgICAgICAgICAgIHdhcm5pbmcoIlVuZXhwZWN0ZWQgJ3thfScuIiwgbmV4dHRva2VuLCB0aGlzLnZhbHVlKTsKICAgICAgICB9CiAgICAgICAgbm9saW5lYnJlYWsodGhpcyk7CiAgICAgICAgaWYgKG5leHR0b2tlbi5pZCAhPT0gJzsnKSB7CiAgICAgICAgICAgIGlmICh0b2tlbi5saW5lID09PSBuZXh0dG9rZW4ubGluZSkgewogICAgICAgICAgICAgICAgaWYgKGZ1bmN0W3ZdICE9PSAnbGFiZWwnKSB7CiAgICAgICAgICAgICAgICAgICAgd2FybmluZygiJ3thfScgaXMgbm90IGEgc3RhdGVtZW50IGxhYmVsLiIsIG5leHR0b2tlbiwgdik7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNjb3BlW3ZdICE9PSBmdW5jdCkgewogICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIid7YX0nIGlzIG91dCBvZiBzY29wZS4iLCBuZXh0dG9rZW4sIHYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5maXJzdCA9IG5leHR0b2tlbjsKICAgICAgICAgICAgICAgIGFkdmFuY2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZWFjaGFibGUoJ2JyZWFrJyk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9KS5leHBzID0gdHJ1ZTsKCgogICAgc3RtdCgnY29udGludWUnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIHYgPSBuZXh0dG9rZW4udmFsdWU7CiAgICAgICAgaWYgKGZ1bmN0WycoYnJlYWthZ2UpJ10gPT09IDApIHsKICAgICAgICAgICAgd2FybmluZygiVW5leHBlY3RlZCAne2F9Jy4iLCBuZXh0dG9rZW4sIHRoaXMudmFsdWUpOwogICAgICAgIH0KICAgICAgICBub2xpbmVicmVhayh0aGlzKTsKICAgICAgICBpZiAobmV4dHRva2VuLmlkICE9PSAnOycpIHsKICAgICAgICAgICAgaWYgKHRva2VuLmxpbmUgPT09IG5leHR0b2tlbi5saW5lKSB7CiAgICAgICAgICAgICAgICBpZiAoZnVuY3Rbdl0gIT09ICdsYWJlbCcpIHsKICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCIne2F9JyBpcyBub3QgYSBzdGF0ZW1lbnQgbGFiZWwuIiwgbmV4dHRva2VuLCB2KTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2NvcGVbdl0gIT09IGZ1bmN0KSB7CiAgICAgICAgICAgICAgICAgICAgd2FybmluZygiJ3thfScgaXMgb3V0IG9mIHNjb3BlLiIsIG5leHR0b2tlbiwgdik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmZpcnN0ID0gbmV4dHRva2VuOwogICAgICAgICAgICAgICAgYWR2YW5jZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICghZnVuY3RbJyhsb29wYWdlKSddKSB7CiAgICAgICAgICAgIHdhcm5pbmcoIlVuZXhwZWN0ZWQgJ3thfScuIiwgbmV4dHRva2VuLCB0aGlzLnZhbHVlKTsKICAgICAgICB9CiAgICAgICAgcmVhY2hhYmxlKCdjb250aW51ZScpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfSkuZXhwcyA9IHRydWU7CgoKICAgIHN0bXQoJ3JldHVybicsIGZ1bmN0aW9uICgpIHsKICAgICAgICBub2xpbmVicmVhayh0aGlzKTsKICAgICAgICBpZiAobmV4dHRva2VuLmlkID09PSAnKHJlZ2V4cCknKSB7CiAgICAgICAgICAgIHdhcm5pbmcoIldyYXAgdGhlIC9yZWdleHAvIGxpdGVyYWwgaW4gcGFyZW5zIHRvIGRpc2FtYmlndWF0ZSB0aGUgc2xhc2ggb3BlcmF0b3IuIik7CiAgICAgICAgfQogICAgICAgIGlmIChuZXh0dG9rZW4uaWQgIT09ICc7JyAmJiAhbmV4dHRva2VuLnJlYWNoKSB7CiAgICAgICAgICAgIG5vbmFkamFjZW50KHRva2VuLCBuZXh0dG9rZW4pOwogICAgICAgICAgICB0aGlzLmZpcnN0ID0gZXhwcmVzc2lvbigyMCk7CiAgICAgICAgfQogICAgICAgIHJlYWNoYWJsZSgncmV0dXJuJyk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9KS5leHBzID0gdHJ1ZTsKCgogICAgc3RtdCgndGhyb3cnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgbm9saW5lYnJlYWsodGhpcyk7CiAgICAgICAgbm9uYWRqYWNlbnQodG9rZW4sIG5leHR0b2tlbik7CiAgICAgICAgdGhpcy5maXJzdCA9IGV4cHJlc3Npb24oMjApOwogICAgICAgIHJlYWNoYWJsZSgndGhyb3cnKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0pLmV4cHMgPSB0cnVlOwoKLy8gIFN1cGVyZmx1b3VzIHJlc2VydmVkIHdvcmRzCgogICAgcmVzZXJ2ZSgnY2xhc3MnKTsKICAgIHJlc2VydmUoJ2NvbnN0Jyk7CiAgICByZXNlcnZlKCdlbnVtJyk7CiAgICByZXNlcnZlKCdleHBvcnQnKTsKICAgIHJlc2VydmUoJ2V4dGVuZHMnKTsKICAgIHJlc2VydmUoJ2ltcG9ydCcpOwogICAgcmVzZXJ2ZSgnc3VwZXInKTsKCiAgICByZXNlcnZlKCdsZXQnKTsKICAgIHJlc2VydmUoJ3lpZWxkJyk7CiAgICByZXNlcnZlKCdpbXBsZW1lbnRzJyk7CiAgICByZXNlcnZlKCdpbnRlcmZhY2UnKTsKICAgIHJlc2VydmUoJ3BhY2thZ2UnKTsKICAgIHJlc2VydmUoJ3ByaXZhdGUnKTsKICAgIHJlc2VydmUoJ3Byb3RlY3RlZCcpOwogICAgcmVzZXJ2ZSgncHVibGljJyk7CiAgICByZXNlcnZlKCdzdGF0aWMnKTsKCgovLyBQYXJzZSBKU09OCgogICAgZnVuY3Rpb24ganNvblZhbHVlKCkgewoKICAgICAgICBmdW5jdGlvbiBqc29uT2JqZWN0KCkgewogICAgICAgICAgICB2YXIgbyA9IHt9LCB0ID0gbmV4dHRva2VuOwogICAgICAgICAgICBhZHZhbmNlKCd7Jyk7CiAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgIT09ICd9JykgewogICAgICAgICAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICcoZW5kKScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIk1pc3NpbmcgJ30nIHRvIG1hdGNoICd7JyBmcm9tIGxpbmUge2F9LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dHRva2VuLCB0LmxpbmUpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dHRva2VuLmlkID09PSAnfScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZygiVW5leHBlY3RlZCBjb21tYS4iLCB0b2tlbik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dHRva2VuLmlkID09PSAnLCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIlVuZXhwZWN0ZWQgY29tbWEuIiwgbmV4dHRva2VuKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHR0b2tlbi5pZCAhPT0gJyhzdHJpbmcpJykgewogICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCJFeHBlY3RlZCBhIHN0cmluZyBhbmQgaW5zdGVhZCBzYXcge2F9LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dHRva2VuLCBuZXh0dG9rZW4udmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAob1tuZXh0dG9rZW4udmFsdWVdID09PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIkR1cGxpY2F0ZSBrZXkgJ3thfScuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0dG9rZW4sIG5leHR0b2tlbi52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgobmV4dHRva2VuLnZhbHVlID09PSAnX19wcm90b19fJyAmJgogICAgICAgICAgICAgICAgICAgICAgICAhb3B0aW9uLnByb3RvKSB8fCAobmV4dHRva2VuLnZhbHVlID09PSAnX19pdGVyYXRvcl9fJyAmJgogICAgICAgICAgICAgICAgICAgICAgICAhb3B0aW9uLml0ZXJhdG9yKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZygiVGhlICd7YX0nIGtleSBtYXkgcHJvZHVjZSB1bmV4cGVjdGVkIHJlc3VsdHMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0dG9rZW4sIG5leHR0b2tlbi52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgb1tuZXh0dG9rZW4udmFsdWVdID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSgpOwogICAgICAgICAgICAgICAgICAgIGFkdmFuY2UoJzonKTsKICAgICAgICAgICAgICAgICAgICBqc29uVmFsdWUoKTsKICAgICAgICAgICAgICAgICAgICBpZiAobmV4dHRva2VuLmlkICE9PSAnLCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFkdmFuY2UoJywnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBhZHZhbmNlKCd9Jyk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBqc29uQXJyYXkoKSB7CiAgICAgICAgICAgIHZhciB0ID0gbmV4dHRva2VuOwogICAgICAgICAgICBhZHZhbmNlKCdbJyk7CiAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgIT09ICddJykgewogICAgICAgICAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICAgICAgICAgIGlmIChuZXh0dG9rZW4uaWQgPT09ICcoZW5kKScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIk1pc3NpbmcgJ10nIHRvIG1hdGNoICdbJyBmcm9tIGxpbmUge2F9LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dHRva2VuLCB0LmxpbmUpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dHRva2VuLmlkID09PSAnXScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZygiVW5leHBlY3RlZCBjb21tYS4iLCB0b2tlbik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dHRva2VuLmlkID09PSAnLCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIlVuZXhwZWN0ZWQgY29tbWEuIiwgbmV4dHRva2VuKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAganNvblZhbHVlKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHR0b2tlbi5pZCAhPT0gJywnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhZHZhbmNlKCcsJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYWR2YW5jZSgnXScpOwogICAgICAgIH0KCiAgICAgICAgc3dpdGNoIChuZXh0dG9rZW4uaWQpIHsKICAgICAgICBjYXNlICd7JzoKICAgICAgICAgICAganNvbk9iamVjdCgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdbJzoKICAgICAgICAgICAganNvbkFycmF5KCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3RydWUnOgogICAgICAgIGNhc2UgJ2ZhbHNlJzoKICAgICAgICBjYXNlICdudWxsJzoKICAgICAgICBjYXNlICcobnVtYmVyKSc6CiAgICAgICAgY2FzZSAnKHN0cmluZyknOgogICAgICAgICAgICBhZHZhbmNlKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJy0nOgogICAgICAgICAgICBhZHZhbmNlKCctJyk7CiAgICAgICAgICAgIGlmICh0b2tlbi5jaGFyYWN0ZXIgIT09IG5leHR0b2tlbi5mcm9tKSB7CiAgICAgICAgICAgICAgICB3YXJuaW5nKCJVbmV4cGVjdGVkIHNwYWNlIGFmdGVyICctJy4iLCB0b2tlbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYWRqYWNlbnQodG9rZW4sIG5leHR0b2tlbik7CiAgICAgICAgICAgIGFkdmFuY2UoJyhudW1iZXIpJyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCBhIEpTT04gdmFsdWUuIiwgbmV4dHRva2VuKTsKICAgICAgICB9CiAgICB9CgoKLy8gVGhlIGFjdHVhbCBKU0hJTlQgZnVuY3Rpb24gaXRzZWxmLgoKICAgIHZhciBpdHNlbGYgPSBmdW5jdGlvbiAocywgbywgZykgewogICAgICAgIHZhciBhLCBpLCBrOwogICAgICAgIEpTSElOVC5lcnJvcnMgPSBbXTsKICAgICAgICBwcmVkZWZpbmVkID0gT2JqZWN0LmNyZWF0ZShzdGFuZGFyZCk7CiAgICAgICAgY29tYmluZShwcmVkZWZpbmVkLCBnIHx8IHt9KTsKICAgICAgICBpZiAobykgewogICAgICAgICAgICBhID0gby5wcmVkZWY7CiAgICAgICAgICAgIGlmIChhKSB7CiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkgewogICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByZWRlZmluZWRbYVtpXV0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGEgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgICAgICAgICAgayA9IE9iamVjdC5rZXlzKGEpOwogICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByZWRlZmluZWRba1tpXV0gPSAhIWFba1tpXV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG9wdGlvbiA9IG87CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgb3B0aW9uID0ge307CiAgICAgICAgfQogICAgICAgIG9wdGlvbi5pbmRlbnQgPSBvcHRpb24uaW5kZW50IHx8IDQ7CiAgICAgICAgb3B0aW9uLm1heGVyciA9IG9wdGlvbi5tYXhlcnIgfHwgNTA7CgogICAgICAgIHRhYiA9ICcnOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBvcHRpb24uaW5kZW50OyBpICs9IDEpIHsKICAgICAgICAgICAgdGFiICs9ICcgJzsKICAgICAgICB9CiAgICAgICAgaW5kZW50ID0gMTsKICAgICAgICBnbG9iYWwgPSBPYmplY3QuY3JlYXRlKHByZWRlZmluZWQpOwogICAgICAgIHNjb3BlID0gZ2xvYmFsOwogICAgICAgIGZ1bmN0ID0gewogICAgICAgICAgICAnKGdsb2JhbCknOiB0cnVlLAogICAgICAgICAgICAnKG5hbWUpJzogJyhnbG9iYWwpJywKICAgICAgICAgICAgJyhzY29wZSknOiBzY29wZSwKICAgICAgICAgICAgJyhicmVha2FnZSknOiAwLAogICAgICAgICAgICAnKGxvb3BhZ2UpJzogMAogICAgICAgIH07CiAgICAgICAgZnVuY3Rpb25zID0gW2Z1bmN0XTsKICAgICAgICB1cmxzID0gW107CiAgICAgICAgc3JjID0gZmFsc2U7CiAgICAgICAgc3RhY2sgPSBudWxsOwogICAgICAgIG1lbWJlciA9IHt9OwogICAgICAgIG1lbWJlcnNPbmx5ID0gbnVsbDsKICAgICAgICBpbXBsaWVkID0ge307CiAgICAgICAgaW5ibG9jayA9IGZhbHNlOwogICAgICAgIGxvb2thaGVhZCA9IFtdOwogICAgICAgIGpzb25tb2RlID0gZmFsc2U7CiAgICAgICAgd2FybmluZ3MgPSAwOwogICAgICAgIGxleC5pbml0KHMpOwogICAgICAgIHByZXJlZyA9IHRydWU7CiAgICAgICAgc3RyaWN0X21vZGUgPSBmYWxzZTsKCiAgICAgICAgcHJldnRva2VuID0gdG9rZW4gPSBuZXh0dG9rZW4gPSBzeW50YXhbJyhiZWdpbiknXTsKICAgICAgICBhc3N1bWUoKTsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgYWR2YW5jZSgpOwogICAgICAgICAgICBzd2l0Y2ggKG5leHR0b2tlbi5pZCkgewogICAgICAgICAgICBjYXNlICd7JzoKICAgICAgICAgICAgY2FzZSAnWyc6CiAgICAgICAgICAgICAgICBvcHRpb24ubGF4YnJlYWsgPSB0cnVlOwogICAgICAgICAgICAgICAganNvbm1vZGUgPSB0cnVlOwogICAgICAgICAgICAgICAganNvblZhbHVlKCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIGlmIChuZXh0dG9rZW4udmFsdWUgPT09ICd1c2Ugc3RyaWN0JykgewogICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9uLmdsb2JhbHN0cmljdCkKICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZygiVXNlIHRoZSBmdW5jdGlvbiBmb3JtIG9mIFwidXNlIHN0cmljdFwiLiIpOwogICAgICAgICAgICAgICAgICAgIHVzZV9zdHJpY3QoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN0YXRlbWVudHMoJ2xpYicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFkdmFuY2UoJyhlbmQpJyk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgSlNISU5ULmVycm9ycy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICByZWFzb24gICAgOiBlLm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgbGluZSAgICAgIDogZS5saW5lIHx8IG5leHR0b2tlbi5saW5lLAogICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciA6IGUuY2hhcmFjdGVyIHx8IG5leHR0b2tlbi5mcm9tCiAgICAgICAgICAgICAgICB9LCBudWxsKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gSlNISU5ULmVycm9ycy5sZW5ndGggPT09IDA7CiAgICB9OwoKCi8vIERhdGEgc3VtbWFyeS4KCiAgICBpdHNlbGYuZGF0YSA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgdmFyIGRhdGEgPSB7ZnVuY3Rpb25zOiBbXX0sIGZ1LCBnbG9iYWxzLCBpbXBsaWVkcyA9IFtdLCBmLCBpLCBqLAogICAgICAgICAgICBtZW1iZXJzID0gW10sIG4sIHVudXNlZCA9IFtdLCB2OwogICAgICAgIGlmIChpdHNlbGYuZXJyb3JzLmxlbmd0aCkgewogICAgICAgICAgICBkYXRhLmVycm9ycyA9IGl0c2VsZi5lcnJvcnM7CiAgICAgICAgfQoKICAgICAgICBpZiAoanNvbm1vZGUpIHsKICAgICAgICAgICAgZGF0YS5qc29uID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGZvciAobiBpbiBpbXBsaWVkKSB7CiAgICAgICAgICAgIGlmIChpc19vd24oaW1wbGllZCwgbikpIHsKICAgICAgICAgICAgICAgIGltcGxpZWRzLnB1c2goewogICAgICAgICAgICAgICAgICAgIG5hbWU6IG4sCiAgICAgICAgICAgICAgICAgICAgbGluZTogaW1wbGllZFtuXQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGltcGxpZWRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgZGF0YS5pbXBsaWVkcyA9IGltcGxpZWRzOwogICAgICAgIH0KCiAgICAgICAgaWYgKHVybHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICBkYXRhLnVybHMgPSB1cmxzOwogICAgICAgIH0KCiAgICAgICAgZ2xvYmFscyA9IE9iamVjdC5rZXlzKHNjb3BlKTsKICAgICAgICBpZiAoZ2xvYmFscy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGRhdGEuZ2xvYmFscyA9IGdsb2JhbHM7CiAgICAgICAgfQoKICAgICAgICBmb3IgKGkgPSAxOyBpIDwgZnVuY3Rpb25zLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICAgIGYgPSBmdW5jdGlvbnNbaV07CiAgICAgICAgICAgIGZ1ID0ge307CiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBmdW5jdGlvbmljaXR5Lmxlbmd0aDsgaiArPSAxKSB7CiAgICAgICAgICAgICAgICBmdVtmdW5jdGlvbmljaXR5W2pdXSA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAobiBpbiBmKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNfb3duKGYsIG4pICYmIG4uY2hhckF0KDApICE9PSAnKCcpIHsKICAgICAgICAgICAgICAgICAgICB2ID0gZltuXTsKICAgICAgICAgICAgICAgICAgICBpZiAodiA9PT0gJ3VuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHYgPSAndW51c2VkJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZnVbdl0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1W3ZdLnB1c2gobik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ID09PSAndW51c2VkJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW51c2VkLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogZlsnKGxpbmUpJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJzogZlsnKG5hbWUpJ10KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBmdW5jdGlvbmljaXR5Lmxlbmd0aDsgaiArPSAxKSB7CiAgICAgICAgICAgICAgICBpZiAoZnVbZnVuY3Rpb25pY2l0eVtqXV0ubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGZ1W2Z1bmN0aW9uaWNpdHlbal1dOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1Lm5hbWUgPSBmWycobmFtZSknXTsKICAgICAgICAgICAgZnUucGFyYW0gPSBmWycocGFyYW1zKSddOwogICAgICAgICAgICBmdS5saW5lID0gZlsnKGxpbmUpJ107CiAgICAgICAgICAgIGZ1Lmxhc3QgPSBmWycobGFzdCknXTsKICAgICAgICAgICAgZGF0YS5mdW5jdGlvbnMucHVzaChmdSk7CiAgICAgICAgfQoKICAgICAgICBpZiAodW51c2VkLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgZGF0YS51bnVzZWQgPSB1bnVzZWQ7CiAgICAgICAgfQoKICAgICAgICBtZW1iZXJzID0gW107CiAgICAgICAgZm9yIChuIGluIG1lbWJlcikgewogICAgICAgICAgICBpZiAodHlwZW9mIG1lbWJlcltuXSA9PT0gJ251bWJlcicpIHsKICAgICAgICAgICAgICAgIGRhdGEubWVtYmVyID0gbWVtYmVyOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBkYXRhOwogICAgfTsKCiAgICBpdHNlbGYucmVwb3J0ID0gZnVuY3Rpb24gKG9wdGlvbikgewogICAgICAgIHZhciBkYXRhID0gaXRzZWxmLmRhdGEoKTsKCiAgICAgICAgdmFyIGEgPSBbXSwgYywgZSwgZXJyLCBmLCBpLCBrLCBsLCBtID0gJycsIG4sIG8gPSBbXSwgczsKCiAgICAgICAgZnVuY3Rpb24gZGV0YWlsKGgsIGFycmF5KSB7CiAgICAgICAgICAgIHZhciBiLCBpLCBzaW5ndWxhcml0eTsKICAgICAgICAgICAgaWYgKGFycmF5KSB7CiAgICAgICAgICAgICAgICBvLnB1c2goJzxkaXY+PGk+JyArIGggKyAnPC9pPiAnKTsKICAgICAgICAgICAgICAgIGFycmF5ID0gYXJyYXkuc29ydCgpOwogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFycmF5W2ldICE9PSBzaW5ndWxhcml0eSkgewogICAgICAgICAgICAgICAgICAgICAgICBzaW5ndWxhcml0eSA9IGFycmF5W2ldOwogICAgICAgICAgICAgICAgICAgICAgICBvLnB1c2goKGIgPyAnLCAnIDogJycpICsgc2luZ3VsYXJpdHkpOwogICAgICAgICAgICAgICAgICAgICAgICBiID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBvLnB1c2goJzwvZGl2PicpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKCiAgICAgICAgaWYgKGRhdGEuZXJyb3JzIHx8IGRhdGEuaW1wbGllZHMgfHwgZGF0YS51bnVzZWQpIHsKICAgICAgICAgICAgZXJyID0gdHJ1ZTsKICAgICAgICAgICAgby5wdXNoKCc8ZGl2IGlkPWVycm9ycz48aT5FcnJvcjo8L2k+Jyk7CiAgICAgICAgICAgIGlmIChkYXRhLmVycm9ycykgewogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRhdGEuZXJyb3JzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICAgICAgICAgICAgYyA9IGRhdGEuZXJyb3JzW2ldOwogICAgICAgICAgICAgICAgICAgIGlmIChjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBjLmV2aWRlbmNlIHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBvLnB1c2goJzxwPlByb2JsZW0nICsgKGlzRmluaXRlKGMubGluZSkgPyAnIGF0IGxpbmUgJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5saW5lICsgJyBjaGFyYWN0ZXIgJyArIGMuY2hhcmFjdGVyIDogJycpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOiAnICsgYy5yZWFzb24uZW50aXR5aWZ5KCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L3A+PHAgY2xhc3M9ZXZpZGVuY2U+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUgJiYgKGUubGVuZ3RoID4gODAgPyBlLnNsaWNlKDAsIDc3KSArICcuLi4nIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKS5lbnRpdHlpZnkoKSkgKyAnPC9wPicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGRhdGEuaW1wbGllZHMpIHsKICAgICAgICAgICAgICAgIHMgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkYXRhLmltcGxpZWRzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICAgICAgICAgICAgc1tpXSA9ICc8Y29kZT4nICsgZGF0YS5pbXBsaWVkc1tpXS5uYW1lICsgJzwvY29kZT4mbmJzcDs8aT4nICsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5pbXBsaWVkc1tpXS5saW5lICsgJzwvaT4nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgby5wdXNoKCc8cD48aT5JbXBsaWVkIGdsb2JhbDo8L2k+ICcgKyBzLmpvaW4oJywgJykgKyAnPC9wPicpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZGF0YS51bnVzZWQpIHsKICAgICAgICAgICAgICAgIHMgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkYXRhLnVudXNlZC5sZW5ndGg7IGkgKz0gMSkgewogICAgICAgICAgICAgICAgICAgIHNbaV0gPSAnPGNvZGU+PHU+JyArIGRhdGEudW51c2VkW2ldLm5hbWUgKyAnPC91PjwvY29kZT4mbmJzcDs8aT4nICsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS51bnVzZWRbaV0ubGluZSArICc8L2k+IDxjb2RlPicgKwogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnVudXNlZFtpXVsnZnVuY3Rpb24nXSArICc8L2NvZGU+JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG8ucHVzaCgnPHA+PGk+VW51c2VkIHZhcmlhYmxlOjwvaT4gJyArIHMuam9pbignLCAnKSArICc8L3A+Jyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRhdGEuanNvbikgewogICAgICAgICAgICAgICAgby5wdXNoKCc8cD5KU09OOiBiYWQuPC9wPicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG8ucHVzaCgnPC9kaXY+Jyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIW9wdGlvbikgewoKICAgICAgICAgICAgby5wdXNoKCc8YnI+PGRpdiBpZD1mdW5jdGlvbnM+Jyk7CgogICAgICAgICAgICBpZiAoZGF0YS51cmxzKSB7CiAgICAgICAgICAgICAgICBkZXRhaWwoIlVSTHM8YnI+IiwgZGF0YS51cmxzLCAnPGJyPicpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZGF0YS5qc29uICYmICFlcnIpIHsKICAgICAgICAgICAgICAgIG8ucHVzaCgnPHA+SlNPTjogZ29vZC48L3A+Jyk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5nbG9iYWxzKSB7CiAgICAgICAgICAgICAgICBvLnB1c2goJzxkaXY+PGk+R2xvYmFsPC9pPiAnICsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nbG9iYWxzLnNvcnQoKS5qb2luKCcsICcpICsgJzwvZGl2PicpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgby5wdXNoKCc8ZGl2PjxpPk5vIG5ldyBnbG9iYWwgdmFyaWFibGVzIGludHJvZHVjZWQuPC9pPjwvZGl2PicpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGF0YS5mdW5jdGlvbnMubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICAgICAgICAgIGYgPSBkYXRhLmZ1bmN0aW9uc1tpXTsKCiAgICAgICAgICAgICAgICBvLnB1c2goJzxicj48ZGl2IGNsYXNzPWZ1bmN0aW9uPjxpPicgKyBmLmxpbmUgKyAnLScgKwogICAgICAgICAgICAgICAgICAgICAgICBmLmxhc3QgKyAnPC9pPiAnICsgKGYubmFtZSB8fCAnJykgKyAnKCcgKwogICAgICAgICAgICAgICAgICAgICAgICAoZi5wYXJhbSA/IGYucGFyYW0uam9pbignLCAnKSA6ICcnKSArICcpPC9kaXY+Jyk7CiAgICAgICAgICAgICAgICBkZXRhaWwoJzxiaWc+PGI+VW51c2VkPC9iPjwvYmlnPicsIGYudW51c2VkKTsKICAgICAgICAgICAgICAgIGRldGFpbCgnQ2xvc3VyZScsIGYuY2xvc3VyZSk7CiAgICAgICAgICAgICAgICBkZXRhaWwoJ1ZhcmlhYmxlJywgZlsndmFyJ10pOwogICAgICAgICAgICAgICAgZGV0YWlsKCdFeGNlcHRpb24nLCBmLmV4Y2VwdGlvbik7CiAgICAgICAgICAgICAgICBkZXRhaWwoJ091dGVyJywgZi5vdXRlcik7CiAgICAgICAgICAgICAgICBkZXRhaWwoJ0dsb2JhbCcsIGYuZ2xvYmFsKTsKICAgICAgICAgICAgICAgIGRldGFpbCgnTGFiZWwnLCBmLmxhYmVsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGRhdGEubWVtYmVyKSB7CiAgICAgICAgICAgICAgICBhID0gT2JqZWN0LmtleXMoZGF0YS5tZW1iZXIpOwogICAgICAgICAgICAgICAgaWYgKGEubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgYSA9IGEuc29ydCgpOwogICAgICAgICAgICAgICAgICAgIG0gPSAnPGJyPjxwcmUgaWQ9bWVtYmVycz4vKm1lbWJlcnMgJzsKICAgICAgICAgICAgICAgICAgICBsID0gMTA7CiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGEubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgayA9IGFbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBrLm5hbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGwgKyBuLmxlbmd0aCA+IDcyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLnB1c2gobSArICc8YnI+Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtID0gJyAgICAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbCA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbCArPSBuLmxlbmd0aCArIDI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLm1lbWJlcltrXSA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9ICc8aT4nICsgbiArICc8L2k+JzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGEubGVuZ3RoIC0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbiArPSAnLCAnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIG0gKz0gbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgby5wdXNoKG0gKyAnPGJyPiovPC9wcmU+Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBvLnB1c2goJzwvZGl2PicpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBvLmpvaW4oJycpOwogICAgfTsKICAgIGl0c2VsZi5qc2hpbnQgPSBpdHNlbGY7CgogICAgaXRzZWxmLmVkaXRpb24gPSAnMjAxMS0wNC0xNic7CgogICAgcmV0dXJuIGl0c2VsZjsKCn0oKSk7CgovLyBNYWtlIEpTSElOVCBhIE5vZGUgbW9kdWxlLCBpZiBwb3NzaWJsZS4KaWYgKHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMpCiAgICBleHBvcnRzLkpTSElOVCA9IEpTSElOVDsKCn0pOy8qIC0qLSBNb2RlOiBKUzsgdGFiLXdpZHRoOiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLQogKiB2aW06IHNldCBzdz00IHRzPTQgZXQgdHc9Nzg6CiAqICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKICoKICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCiAqCiAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgogKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KICoKICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKICogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCiAqIExpY2Vuc2UuCiAqCiAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIHRoZSBOYXJjaXNzdXMgSmF2YVNjcmlwdCBlbmdpbmUuCiAqCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwogKiBCcmVuZGFuIEVpY2ggPGJyZW5kYW5AbW96aWxsYS5vcmc+LgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDA0CiAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogQ29udHJpYnV0b3Iocyk6CiAqICAgVG9tIEF1c3RpbiA8dGF1c3RpbkB1Y3NjLmVkdT4KICogICBCcmVuZGFuIEVpY2ggPGJyZW5kYW5AbW96aWxsYS5vcmc+CiAqICAgU2h1LVl1IEd1byA8c2h1QHJmcm4ub3JnPgogKiAgIERhdmUgSGVybWFuIDxkaGVybWFuQG1vemlsbGEuY29tPgogKiAgIERpbWl0cmlzIFZhcmRvdWxha2lzIDxkaW12YXJAY2NzLm5ldS5lZHU+CiAqICAgUGF0cmljayBXYWx0b24gPHBjd2FsdG9uQG1vemlsbGEuY29tPgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksCiAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiAqIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKICogZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgogKiB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgogKgogKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwoKLyoKICogTmFyY2lzc3VzIC0gSlMgaW1wbGVtZW50ZWQgaW4gSlMuCiAqCiAqIFBhcnNlci4KICovCgpkZWZpbmUoJ2FjZS9uYXJjaXNzdXMvanNwYXJzZScsIFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZScgLCAnYWNlL25hcmNpc3N1cy9qc2xleCcsICdhY2UvbmFyY2lzc3VzL2pzZGVmcyddLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKCiAgICB2YXIgbGV4ZXIgPSByZXF1aXJlKCIuL2pzbGV4Iik7CiAgICB2YXIgZGVmaW5pdGlvbnMgPSByZXF1aXJlKCIuL2pzZGVmcyIpOwoKICAgIGNvbnN0IFN0cmluZ01hcCA9IGRlZmluaXRpb25zLlN0cmluZ01hcDsKICAgIGNvbnN0IFN0YWNrID0gZGVmaW5pdGlvbnMuU3RhY2s7CgogICAgLy8gU2V0IGNvbnN0YW50cyBpbiB0aGUgbG9jYWwgc2NvcGUuCiAgICBldmFsKGRlZmluaXRpb25zLmNvbnN0cyk7CgogICAgLy8gQmFubmVkIHN0YXRlbWVudCB0eXBlcyBieSBsYW5ndWFnZSB2ZXJzaW9uLgogICAgY29uc3QgYmxhY2tMaXN0cyA9IHsgMTYwOiB7fSwgMTg1OiB7fSwgaGFybW9ueToge30gfTsKICAgIGJsYWNrTGlzdHNbMTYwXVtJTVBPUlRdID0gdHJ1ZTsKICAgIGJsYWNrTGlzdHNbMTYwXVtFWFBPUlRdID0gdHJ1ZTsKICAgIGJsYWNrTGlzdHNbMTYwXVtMRVRdID0gdHJ1ZTsKICAgIGJsYWNrTGlzdHNbMTYwXVtNT0RVTEVdID0gdHJ1ZTsKICAgIGJsYWNrTGlzdHNbMTYwXVtZSUVMRF0gPSB0cnVlOwogICAgYmxhY2tMaXN0c1sxODVdW0lNUE9SVF0gPSB0cnVlOwogICAgYmxhY2tMaXN0c1sxODVdW0VYUE9SVF0gPSB0cnVlOwogICAgYmxhY2tMaXN0c1sxODVdW01PRFVMRV0gPSB0cnVlOwogICAgYmxhY2tMaXN0cy5oYXJtb255W1dJVEhdID0gdHJ1ZTsKCiAgICAvKgogICAgICogcHVzaERlc3RydWN0dXJpbmdWYXJEZWNscyA6OiAobm9kZSwgaG9pc3Rpbmcgbm9kZSkgLT4gdm9pZAogICAgICoKICAgICAqIFJlY3Vyc2l2ZWx5IGFkZCBhbGwgZGVzdHJ1Y3R1cmVkIGRlY2xhcmF0aW9ucyB0byB2YXJEZWNscy4KICAgICAqLwogICAgZnVuY3Rpb24gcHVzaERlc3RydWN0dXJpbmdWYXJEZWNscyhuLCBzKSB7CiAgICAgICAgZm9yICh2YXIgaSBpbiBuKSB7CiAgICAgICAgICAgIHZhciBzdWIgPSBuW2ldOwogICAgICAgICAgICBpZiAoc3ViLnR5cGUgPT09IElERU5USUZJRVIpIHsKICAgICAgICAgICAgICAgIHMudmFyRGVjbHMucHVzaChzdWIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcHVzaERlc3RydWN0dXJpbmdWYXJEZWNscyhzdWIsIHMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIFN0YXRpY0NvbnRleHQocGFyZW50U2NyaXB0LCBwYXJlbnRCbG9jaywgaW5Nb2R1bGUsIGluRnVuY3Rpb24pIHsKICAgICAgICB0aGlzLnBhcmVudFNjcmlwdCA9IHBhcmVudFNjcmlwdDsKICAgICAgICB0aGlzLnBhcmVudEJsb2NrID0gcGFyZW50QmxvY2sgfHwgcGFyZW50U2NyaXB0OwogICAgICAgIHRoaXMuaW5Nb2R1bGUgPSBpbk1vZHVsZSB8fCBmYWxzZTsKICAgICAgICB0aGlzLmluRnVuY3Rpb24gPSBpbkZ1bmN0aW9uIHx8IGZhbHNlOwogICAgICAgIHRoaXMuaW5Gb3JMb29wSW5pdCA9IGZhbHNlOwogICAgICAgIHRoaXMudG9wTGV2ZWwgPSB0cnVlOwogICAgICAgIHRoaXMuYWxsTGFiZWxzID0gbmV3IFN0YWNrKCk7CiAgICAgICAgdGhpcy5jdXJyZW50TGFiZWxzID0gbmV3IFN0YWNrKCk7CiAgICAgICAgdGhpcy5sYWJlbGVkVGFyZ2V0cyA9IG5ldyBTdGFjaygpOwogICAgICAgIHRoaXMuZGVmYXVsdExvb3BUYXJnZXQgPSBudWxsOwogICAgICAgIHRoaXMuZGVmYXVsdFRhcmdldCA9IG51bGw7CiAgICAgICAgdGhpcy5ibGFja0xpc3QgPSBibGFja0xpc3RzW05hcmNpc3N1cy5vcHRpb25zLnZlcnNpb25dOwogICAgICAgIE5hcmNpc3N1cy5vcHRpb25zLmVjbWEzT25seU1vZGUgJiYgKHRoaXMuZWNtYTNPbmx5TW9kZSA9IHRydWUpOwogICAgICAgIE5hcmNpc3N1cy5vcHRpb25zLnBhcmVuRnJlZU1vZGUgJiYgKHRoaXMucGFyZW5GcmVlTW9kZSA9IHRydWUpOwogICAgfQoKICAgIFN0YXRpY0NvbnRleHQucHJvdG90eXBlID0gewogICAgICAgIGVjbWEzT25seU1vZGU6IGZhbHNlLAogICAgICAgIHBhcmVuRnJlZU1vZGU6IGZhbHNlLAogICAgICAgIC8vIG5vbi1kZXN0cnVjdGl2ZSB1cGRhdGUgdmlhIHByb3RvdHlwZSBleHRlbnNpb24KICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uKGV4dCkgewogICAgICAgICAgICB2YXIgZGVzYyA9IHt9OwogICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gZXh0KSB7CiAgICAgICAgICAgICAgICBkZXNjW2tleV0gPSB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGV4dFtrZXldLAogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUodGhpcywgZGVzYyk7CiAgICAgICAgfSwKICAgICAgICBwdXNoTGFiZWw6IGZ1bmN0aW9uKGxhYmVsKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZSh7IGN1cnJlbnRMYWJlbHM6IHRoaXMuY3VycmVudExhYmVscy5wdXNoKGxhYmVsKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsTGFiZWxzOiB0aGlzLmFsbExhYmVscy5wdXNoKGxhYmVsKSB9KTsKICAgICAgICB9LAogICAgICAgIHB1c2hUYXJnZXQ6IGZ1bmN0aW9uKHRhcmdldCkgewogICAgICAgICAgICB2YXIgaXNEZWZhdWx0TG9vcFRhcmdldCA9IHRhcmdldC5pc0xvb3A7CiAgICAgICAgICAgIHZhciBpc0RlZmF1bHRUYXJnZXQgPSBpc0RlZmF1bHRMb29wVGFyZ2V0IHx8IHRhcmdldC50eXBlID09PSBTV0lUQ0g7CgogICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50TGFiZWxzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgaWYgKGlzRGVmYXVsdExvb3BUYXJnZXQpIHRoaXMudXBkYXRlKHsgZGVmYXVsdExvb3BUYXJnZXQ6IHRhcmdldCB9KTsKICAgICAgICAgICAgICAgIGlmIChpc0RlZmF1bHRUYXJnZXQpIHRoaXMudXBkYXRlKHsgZGVmYXVsdFRhcmdldDogdGFyZ2V0IH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRhcmdldC5sYWJlbHMgPSBuZXcgU3RyaW5nTWFwKCk7CiAgICAgICAgICAgIHRoaXMuY3VycmVudExhYmVscy5mb3JFYWNoKGZ1bmN0aW9uKGxhYmVsKSB7CiAgICAgICAgICAgICAgICB0YXJnZXQubGFiZWxzLnNldChsYWJlbCwgdHJ1ZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gdGhpcy51cGRhdGUoeyBjdXJyZW50TGFiZWxzOiBuZXcgU3RhY2soKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxlZFRhcmdldHM6IHRoaXMubGFiZWxlZFRhcmdldHMucHVzaCh0YXJnZXQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0TG9vcFRhcmdldDogaXNEZWZhdWx0TG9vcFRhcmdldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0YXJnZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5kZWZhdWx0TG9vcFRhcmdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFRhcmdldDogaXNEZWZhdWx0VGFyZ2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGFyZ2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5kZWZhdWx0VGFyZ2V0IH0pOwogICAgICAgIH0sCiAgICAgICAgbmVzdDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvcExldmVsID8gdGhpcy51cGRhdGUoeyB0b3BMZXZlbDogZmFsc2UgfSkgOiB0aGlzOwogICAgICAgIH0sCiAgICAgICAgYWxsb3c6IGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgICAgICAgY2FzZSBFWFBPUlQ6CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaW5Nb2R1bGUgfHwgdGhpcy5pbkZ1bmN0aW9uIHx8ICF0aGlzLnRvcExldmVsKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIC8vIEZBTEwgVEhST1VHSAoKICAgICAgICAgICAgICBjYXNlIElNUE9SVDoKICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5pbkZ1bmN0aW9uICYmIHRoaXMudG9wTGV2ZWw7CgogICAgICAgICAgICAgIGNhc2UgTU9EVUxFOgogICAgICAgICAgICAgICAgcmV0dXJuICF0aGlzLmluRnVuY3Rpb24gJiYgdGhpcy50b3BMZXZlbDsKCiAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU2NyaXB0IDo6ICh0b2tlbml6ZXIsIGJvb2xlYW4sIGJvb2xlYW4pIC0+IG5vZGUKICAgICAqCiAgICAgKiBQYXJzZXMgdGhlIHRvcGxldmVsIGFuZCBtb2R1bGUvZnVuY3Rpb24gYm9kaWVzLgogICAgICovCiAgICBmdW5jdGlvbiBTY3JpcHQodCwgaW5Nb2R1bGUsIGluRnVuY3Rpb24pIHsKICAgICAgICB2YXIgbiA9IG5ldyBOb2RlKHQsIHNjcmlwdEluaXQoKSk7CiAgICAgICAgU3RhdGVtZW50cyh0LCBuZXcgU3RhdGljQ29udGV4dChuLCBuLCBpbk1vZHVsZSwgaW5GdW5jdGlvbiksIG4pOwogICAgICAgIHJldHVybiBuOwogICAgfQoKICAgIC8vIFdlIGV4dGVuZCBBcnJheSBzbGlnaHRseSB3aXRoIGEgdG9wLW9mLXN0YWNrIG1ldGhvZC4KICAgIGRlZmluaXRpb25zLmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwgInRvcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggJiYgdGhpc1t0aGlzLmxlbmd0aC0xXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CgogICAgLyoKICAgICAqIE5vZGUgOjogKHRva2VuaXplciwgb3B0aW9uYWwgaW5pdCBvYmplY3QpIC0+IG5vZGUKICAgICAqLwogICAgZnVuY3Rpb24gTm9kZSh0LCBpbml0KSB7CiAgICAgICAgdmFyIHRva2VuID0gdC50b2tlbjsKICAgICAgICBpZiAodG9rZW4pIHsKICAgICAgICAgICAgLy8gSWYgaW5pdC50eXBlIGV4aXN0cyBpdCB3aWxsIG92ZXJyaWRlIHRva2VuLnR5cGUuCiAgICAgICAgICAgIHRoaXMudHlwZSA9IHRva2VuLnR5cGU7CiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0b2tlbi52YWx1ZTsKICAgICAgICAgICAgdGhpcy5saW5lbm8gPSB0b2tlbi5saW5lbm87CgogICAgICAgICAgICAvLyBTdGFydCBhbmQgZW5kIGFyZSBmaWxlIHBvc2l0aW9ucyBmb3IgZXJyb3IgaGFuZGxpbmcuCiAgICAgICAgICAgIHRoaXMuc3RhcnQgPSB0b2tlbi5zdGFydDsKICAgICAgICAgICAgdGhpcy5lbmQgPSB0b2tlbi5lbmQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5saW5lbm8gPSB0LmxpbmVubzsKICAgICAgICB9CgogICAgICAgIC8vIE5vZGUgdXNlcyBhIHRva2VuaXplciBmb3IgZGVidWdnaW5nIChnZXRTb3VyY2UsIGZpbGVuYW1lIGdldHRlcikuCiAgICAgICAgdGhpcy50b2tlbml6ZXIgPSB0OwogICAgICAgIHRoaXMuY2hpbGRyZW4gPSBbXTsKCiAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBpbml0KQogICAgICAgICAgICB0aGlzW3Byb3BdID0gaW5pdFtwcm9wXTsKICAgIH0KCiAgICAvKgogICAgICogU3ludGhldGljTm9kZSA6OiAodG9rZW5pemVyLCBvcHRpb25hbCBpbml0IG9iamVjdCkgLT4gbm9kZQogICAgICovCiAgICBmdW5jdGlvbiBTeW50aGV0aWNOb2RlKHQsIGluaXQpIHsKICAgICAgICAvLyBwcmludCgiU1lOVEhFVElDIE5PREUiKTsKICAgICAgICAvLyBpZiAoaW5pdC50eXBlID09PSBDT01NQSkgewogICAgICAgIC8vICAgICBwcmludCgiU1lOVEhFVElDIENPTU1BIik7CiAgICAgICAgLy8gICAgIHByaW50KGluaXQpOwogICAgICAgIC8vIH0KICAgICAgICB0aGlzLnRva2VuaXplciA9IHQ7CiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwogICAgICAgIGZvciAodmFyIHByb3AgaW4gaW5pdCkKICAgICAgICAgICAgdGhpc1twcm9wXSA9IGluaXRbcHJvcF07CiAgICAgICAgdGhpcy5zeW50aGV0aWMgPSB0cnVlOwogICAgfQoKICAgIHZhciBOcCA9IE5vZGUucHJvdG90eXBlID0gU3ludGhldGljTm9kZS5wcm90b3R5cGUgPSB7fTsKICAgIE5wLmNvbnN0cnVjdG9yID0gTm9kZTsKCiAgICBjb25zdCBUT19TT1VSQ0VfU0tJUCA9IHsKICAgICAgICB0eXBlOiB0cnVlLAogICAgICAgIHZhbHVlOiB0cnVlLAogICAgICAgIGxpbmVubzogdHJ1ZSwKICAgICAgICBzdGFydDogdHJ1ZSwKICAgICAgICBlbmQ6IHRydWUsCiAgICAgICAgdG9rZW5pemVyOiB0cnVlLAogICAgICAgIGFzc2lnbk9wOiB0cnVlCiAgICB9OwogICAgZnVuY3Rpb24gdW5ldmFsYWJsZUNvbnN0KGNvZGUpIHsKICAgICAgICB2YXIgdG9rZW4gPSBkZWZpbml0aW9ucy50b2tlbnNbY29kZV07CiAgICAgICAgdmFyIGNvbnN0TmFtZSA9IGRlZmluaXRpb25zLm9wVHlwZU5hbWVzLmhhc093blByb3BlcnR5KHRva2VuKQogICAgICAgICAgICAgICAgICAgICAgPyBkZWZpbml0aW9ucy5vcFR5cGVOYW1lc1t0b2tlbl0KICAgICAgICAgICAgICAgICAgICAgIDogdG9rZW4gaW4gZGVmaW5pdGlvbnMua2V5d29yZHMKICAgICAgICAgICAgICAgICAgICAgID8gdG9rZW4udG9VcHBlckNhc2UoKQogICAgICAgICAgICAgICAgICAgICAgOiB0b2tlbjsKICAgICAgICByZXR1cm4geyB0b1NvdXJjZTogZnVuY3Rpb24oKSB7IHJldHVybiBjb25zdE5hbWUgfSB9OwogICAgfQogICAgTnAudG9Tb3VyY2UgPSBmdW5jdGlvbiB0b1NvdXJjZSgpIHsKICAgICAgICB2YXIgbW9jayA9IHt9OwogICAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgICBtb2NrLnR5cGUgPSB1bmV2YWxhYmxlQ29uc3QodGhpcy50eXBlKTsKICAgICAgICBpZiAoInZhbHVlIiBpbiB0aGlzKQogICAgICAgICAgICBtb2NrLnZhbHVlID0gdGhpcy52YWx1ZTsKICAgICAgICBpZiAoImxpbmVubyIgaW4gdGhpcykKICAgICAgICAgICAgbW9jay5saW5lbm8gPSB0aGlzLmxpbmVubzsKICAgICAgICBpZiAoInN0YXJ0IiBpbiB0aGlzKQogICAgICAgICAgICBtb2NrLnN0YXJ0ID0gdGhpcy5zdGFydDsKICAgICAgICBpZiAoImVuZCIgaW4gdGhpcykKICAgICAgICAgICAgbW9jay5lbmQgPSB0aGlzLmVuZDsKICAgICAgICBpZiAodGhpcy5hc3NpZ25PcCkKICAgICAgICAgICAgbW9jay5hc3NpZ25PcCA9IHVuZXZhbGFibGVDb25zdCh0aGlzLmFzc2lnbk9wKTsKICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcykgewogICAgICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICEoa2V5IGluIFRPX1NPVVJDRV9TS0lQKSkKICAgICAgICAgICAgICAgIG1vY2tba2V5XSA9IHRoaXNba2V5XTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1vY2sudG9Tb3VyY2UoKTsKICAgIH07CgogICAgLy8gQWx3YXlzIHVzZSBwdXNoIHRvIGFkZCBvcGVyYW5kcyB0byBhbiBleHByZXNzaW9uLCB0byB1cGRhdGUgc3RhcnQgYW5kIGVuZC4KICAgIE5wLnB1c2ggPSBmdW5jdGlvbiAoa2lkKSB7CiAgICAgICAgLy8ga2lkIGNhbiBiZSBudWxsIGUuZy4gWzEsICwgMl0uCiAgICAgICAgaWYgKGtpZCAhPT0gbnVsbCkgewogICAgICAgICAgICBpZiAoa2lkLnN0YXJ0IDwgdGhpcy5zdGFydCkKICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQgPSBraWQuc3RhcnQ7CiAgICAgICAgICAgIGlmICh0aGlzLmVuZCA8IGtpZC5lbmQpCiAgICAgICAgICAgICAgICB0aGlzLmVuZCA9IGtpZC5lbmQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLnB1c2goa2lkKTsKICAgIH0KCiAgICBOb2RlLmluZGVudExldmVsID0gMDsKCiAgICBmdW5jdGlvbiB0b2tlblN0cmluZyh0dCkgewogICAgICAgIHZhciB0ID0gZGVmaW5pdGlvbnMudG9rZW5zW3R0XTsKICAgICAgICByZXR1cm4gL15cVy8udGVzdCh0KSA/IGRlZmluaXRpb25zLm9wVHlwZU5hbWVzW3RdIDogdC50b1VwcGVyQ2FzZSgpOwogICAgfQoKICAgIE5wLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBhID0gW107CiAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGkpICYmIGkgIT09ICd0eXBlJyAmJiBpICE9PSAndGFyZ2V0JykKICAgICAgICAgICAgICAgIGEucHVzaCh7aWQ6IGksIHZhbHVlOiB0aGlzW2ldfSk7CiAgICAgICAgfQogICAgICAgIGEuc29ydChmdW5jdGlvbiAoYSxiKSB7IHJldHVybiAoYS5pZCA8IGIuaWQpID8gLTEgOiAxOyB9KTsKICAgICAgICBjb25zdCBJTkRFTlRBVElPTiA9ICIgICAgIjsKICAgICAgICB2YXIgbiA9ICsrTm9kZS5pbmRlbnRMZXZlbDsKICAgICAgICB2YXIgcyA9ICJ7XG4iICsgSU5ERU5UQVRJT04ucmVwZWF0KG4pICsgInR5cGU6ICIgKyB0b2tlblN0cmluZyh0aGlzLnR5cGUpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKQogICAgICAgICAgICBzICs9ICIsXG4iICsgSU5ERU5UQVRJT04ucmVwZWF0KG4pICsgYVtpXS5pZCArICI6ICIgKyBhW2ldLnZhbHVlOwogICAgICAgIG4gPSAtLU5vZGUuaW5kZW50TGV2ZWw7CiAgICAgICAgcyArPSAiXG4iICsgSU5ERU5UQVRJT04ucmVwZWF0KG4pICsgIn0iOwogICAgICAgIHJldHVybiBzOwogICAgfQoKICAgIE5wLmdldFNvdXJjZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gdGhpcy50b2tlbml6ZXIuc291cmNlLnNsaWNlKHRoaXMuc3RhcnQsIHRoaXMuZW5kKTsKICAgIH07CgogICAgLyoKICAgICAqIEhlbHBlciBpbml0IG9iamVjdHMgZm9yIGNvbW1vbiBub2Rlcy4KICAgICAqLwoKICAgIGNvbnN0IExPT1BfSU5JVCA9IHsgaXNMb29wOiB0cnVlIH07CgogICAgZnVuY3Rpb24gYmxvY2tJbml0KCkgewogICAgICAgIHJldHVybiB7IHR5cGU6IEJMT0NLLCB2YXJEZWNsczogW10gfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzY3JpcHRJbml0KCkgewogICAgICAgIHJldHVybiB7IHR5cGU6IFNDUklQVCwKICAgICAgICAgICAgICAgICBmdW5EZWNsczogW10sCiAgICAgICAgICAgICAgICAgdmFyRGVjbHM6IFtdLAogICAgICAgICAgICAgICAgIG1vZERlZm5zOiBuZXcgU3RyaW5nTWFwKCksCiAgICAgICAgICAgICAgICAgbW9kQXNzbnM6IG5ldyBTdHJpbmdNYXAoKSwKICAgICAgICAgICAgICAgICBtb2REZWNsczogbmV3IFN0cmluZ01hcCgpLAogICAgICAgICAgICAgICAgIG1vZExvYWRzOiBuZXcgU3RyaW5nTWFwKCksCiAgICAgICAgICAgICAgICAgaW1wRGVjbHM6IFtdLAogICAgICAgICAgICAgICAgIGV4cERlY2xzOiBbXSwKICAgICAgICAgICAgICAgICBleHBvcnRzOiBuZXcgU3RyaW5nTWFwKCksCiAgICAgICAgICAgICAgICAgaGFzRW1wdHlSZXR1cm46IGZhbHNlLAogICAgICAgICAgICAgICAgIGhhc1JldHVybldpdGhWYWx1ZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgaXNHZW5lcmF0b3I6IGZhbHNlIH07CiAgICB9CgogICAgZGVmaW5pdGlvbnMuZGVmaW5lR2V0dGVyKE5wLCAiZmlsZW5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50b2tlbml6ZXIuZmlsZW5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgZGVmaW5pdGlvbnMuZGVmaW5lR2V0dGVyKE5wLCAibGVuZ3RoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJOb2RlLnByb3RvdHlwZS5sZW5ndGggaXMgZ29uZTsgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlIG4uY2hpbGRyZW4ubGVuZ3RoIGluc3RlYWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICBkZWZpbml0aW9ucy5kZWZpbmVQcm9wZXJ0eShTdHJpbmcucHJvdG90eXBlLCAicmVwZWF0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9ICIiLCB0ID0gdGhpcyArIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKC0tbiA+PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICs9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmYWxzZSwgZmFsc2UsIHRydWUpOwoKICAgIGZ1bmN0aW9uIE1heWJlTGVmdFBhcmVuKHQsIHgpIHsKICAgICAgICBpZiAoeC5wYXJlbkZyZWVNb2RlKQogICAgICAgICAgICByZXR1cm4gdC5tYXRjaChMRUZUX1BBUkVOKSA/IExFRlRfUEFSRU4gOiBFTkQ7CiAgICAgICAgcmV0dXJuIHQubXVzdE1hdGNoKExFRlRfUEFSRU4pLnR5cGU7CiAgICB9CgogICAgZnVuY3Rpb24gTWF5YmVSaWdodFBhcmVuKHQsIHApIHsKICAgICAgICBpZiAocCA9PT0gTEVGVF9QQVJFTikKICAgICAgICAgICAgdC5tdXN0TWF0Y2goUklHSFRfUEFSRU4pOwogICAgfQoKICAgIC8qCiAgICAgKiBTdGF0ZW1lbnRzIDo6ICh0b2tlbml6ZXIsIGNvbXBpbGVyIGNvbnRleHQsIG5vZGUpIC0+IHZvaWQKICAgICAqCiAgICAgKiBQYXJzZXMgYSBzZXF1ZW5jZSBvZiBTdGF0ZW1lbnRzLgogICAgICovCiAgICBmdW5jdGlvbiBTdGF0ZW1lbnRzKHQsIHgsIG4pIHsKICAgICAgICB0cnkgewogICAgICAgICAgICB3aGlsZSAoIXQuZG9uZSAmJiB0LnBlZWsodHJ1ZSkgIT09IFJJR0hUX0NVUkxZKQogICAgICAgICAgICAgICAgbi5wdXNoKFN0YXRlbWVudCh0LCB4KSk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBpZiAodC5kb25lKQogICAgICAgICAgICAgICAgdC51bmV4cGVjdGVkRU9GID0gdHJ1ZTsKICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gQmxvY2sodCwgeCkgewogICAgICAgIHQubXVzdE1hdGNoKExFRlRfQ1VSTFkpOwogICAgICAgIHZhciBuID0gbmV3IE5vZGUodCwgYmxvY2tJbml0KCkpOwogICAgICAgIFN0YXRlbWVudHModCwgeC51cGRhdGUoeyBwYXJlbnRCbG9jazogbiB9KS5wdXNoVGFyZ2V0KG4pLCBuKTsKICAgICAgICB0Lm11c3RNYXRjaChSSUdIVF9DVVJMWSk7CiAgICAgICAgcmV0dXJuIG47CiAgICB9CgogICAgY29uc3QgREVDTEFSRURfRk9STSA9IDAsIEVYUFJFU1NFRF9GT1JNID0gMSwgU1RBVEVNRU5UX0ZPUk0gPSAyOwoKICAgIC8qCiAgICAgKiBFeHBvcnQgOjogKGJpbmRpbmcgbm9kZSwgYm9vbGVhbikgLT4gRXhwb3J0CiAgICAgKgogICAgICogU3RhdGljIHNlbWFudGljIHJlcHJlc2VudGF0aW9uIG9mIGEgbW9kdWxlIGV4cG9ydC4KICAgICAqLwogICAgZnVuY3Rpb24gRXhwb3J0KG5vZGUsIGlzRGVmaW5pdGlvbikgewogICAgICAgIHRoaXMubm9kZSA9IG5vZGU7ICAgICAgICAgICAgICAgICAvLyB0aGUgQVNUIG5vZGUgZGVjbGFyaW5nIHRoaXMgaW5kaXZpZHVhbCBleHBvcnQKICAgICAgICB0aGlzLmlzRGVmaW5pdGlvbiA9IGlzRGVmaW5pdGlvbjsgLy8gaXMgdGhlIG5vZGUgYW4gJ2V4cG9ydCctYW5ub3RhdGVkIGRlZmluaXRpb24/CiAgICAgICAgdGhpcy5yZXNvbHZlZCA9IG51bGw7ICAgICAgICAgICAgIC8vIHJlc29sdmVkIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBvZiB0aGlzIGV4cG9ydAogICAgfQoKICAgIC8qCiAgICAgKiByZWdpc3RlckV4cG9ydCA6OiAoU3RyaW5nTWFwLCBFWFBPUlQgbm9kZSkgLT4gdm9pZAogICAgICovCiAgICBmdW5jdGlvbiByZWdpc3RlckV4cG9ydChleHBvcnRzLCBkZWNsKSB7CiAgICAgICAgZnVuY3Rpb24gcmVnaXN0ZXIobmFtZSwgZXhwKSB7CiAgICAgICAgICAgIGlmIChleHBvcnRzLmhhcyhuYW1lKSkKICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcigibXVsdGlwbGUgZXhwb3J0cyBvZiAiICsgbmFtZSk7CiAgICAgICAgICAgIGV4cG9ydHMuc2V0KG5hbWUsIGV4cCk7CiAgICAgICAgfQoKICAgICAgICBzd2l0Y2ggKGRlY2wudHlwZSkgewogICAgICAgICAgY2FzZSBNT0RVTEU6CiAgICAgICAgICBjYXNlIEZVTkNUSU9OOgogICAgICAgICAgICByZWdpc3RlcihkZWNsLm5hbWUsIG5ldyBFeHBvcnQoZGVjbCwgdHJ1ZSkpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBjYXNlIFZBUjoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWNsLmNoaWxkcmVuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgcmVnaXN0ZXIoZGVjbC5jaGlsZHJlbltpXS5uYW1lLCBuZXcgRXhwb3J0KGRlY2wuY2hpbGRyZW5baV0sIHRydWUpKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgY2FzZSBMRVQ6CiAgICAgICAgICBjYXNlIENPTlNUOgogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk5ZSTogIiArIGRlZmluaXRpb25zLnRva2Vuc1tkZWNsLnR5cGVdKTsKCiAgICAgICAgICBjYXNlIEVYUE9SVDoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWNsLnBhdGhMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgcGF0aCA9IGRlY2wucGF0aExpc3RbaV07CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBhdGgudHlwZSkgewogICAgICAgICAgICAgICAgICBjYXNlIE9CSkVDVF9JTklUOgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcGF0aC5jaGlsZHJlbi5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBpbml0IDo6IElERU5USUZJRVIgfCBQUk9QRVJUWV9JTklUCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbml0ID0gcGF0aC5jaGlsZHJlbltqXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluaXQudHlwZSA9PT0gSURFTlRJRklFUikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyKGluaXQudmFsdWUsIG5ldyBFeHBvcnQoaW5pdCwgZmFsc2UpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIoaW5pdC5jaGlsZHJlblswXS52YWx1ZSwgbmV3IEV4cG9ydChpbml0LmNoaWxkcmVuWzFdLCBmYWxzZSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgIGNhc2UgRE9UOgogICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyKHBhdGguY2hpbGRyZW5bMV0udmFsdWUsIG5ldyBFeHBvcnQocGF0aCwgZmFsc2UpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgIGNhc2UgSURFTlRJRklFUjoKICAgICAgICAgICAgICAgICAgICByZWdpc3RlcihwYXRoLnZhbHVlLCBuZXcgRXhwb3J0KHBhdGgsIGZhbHNlKSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigidW5leHBlY3RlZCBleHBvcnQgcGF0aDogIiArIGRlZmluaXRpb25zLnRva2Vuc1twYXRoLnR5cGVdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoInVuZXhwZWN0ZWQgZXhwb3J0IGRlY2w6ICIgKyBkZWZpbml0aW9ucy50b2tlbnNbZXhwLnR5cGVdKTsKICAgICAgICB9CiAgICB9CgogICAgLyoKICAgICAqIE1vZHVsZSA6OiAobm9kZSkgLT4gTW9kdWxlCiAgICAgKgogICAgICogU3RhdGljIHNlbWFudGljIHJlcHJlc2VudGF0aW9uIG9mIGEgbW9kdWxlLgogICAgICovCiAgICBmdW5jdGlvbiBNb2R1bGUobm9kZSkgewogICAgICAgIHZhciBleHBvcnRzID0gbm9kZS5ib2R5LmV4cG9ydHM7CiAgICAgICAgdmFyIG1vZERlZm5zID0gbm9kZS5ib2R5Lm1vZERlZm5zOwoKICAgICAgICB2YXIgZXhwb3J0ZWRNb2R1bGVzID0gbmV3IFN0cmluZ01hcCgpOwoKICAgICAgICBleHBvcnRzLmZvckVhY2goZnVuY3Rpb24obmFtZSwgZXhwKSB7CiAgICAgICAgICAgIHZhciBub2RlID0gZXhwLm5vZGU7CiAgICAgICAgICAgIGlmIChub2RlLnR5cGUgPT09IE1PRFVMRSkgewogICAgICAgICAgICAgICAgZXhwb3J0ZWRNb2R1bGVzLnNldChuYW1lLCBub2RlKTsKICAgICAgICAgICAgfSBlbHNlIGlmICghZXhwLmlzRGVmaW5pdGlvbiAmJiBub2RlLnR5cGUgPT09IElERU5USUZJRVIgJiYgbW9kRGVmbnMuaGFzKG5vZGUudmFsdWUpKSB7CiAgICAgICAgICAgICAgICB2YXIgbW9kID0gbW9kRGVmbnMuZ2V0KG5vZGUudmFsdWUpOwogICAgICAgICAgICAgICAgZXhwb3J0ZWRNb2R1bGVzLnNldChuYW1lLCBtb2QpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIHRoaXMubm9kZSA9IG5vZGU7CiAgICAgICAgdGhpcy5leHBvcnRzID0gZXhwb3J0czsKICAgICAgICB0aGlzLmV4cG9ydGVkTW9kdWxlcyA9IGV4cG9ydGVkTW9kdWxlczsKICAgIH0KCiAgICAvKgogICAgICogU3RhdGVtZW50IDo6ICh0b2tlbml6ZXIsIGNvbXBpbGVyIGNvbnRleHQpIC0+IG5vZGUKICAgICAqCiAgICAgKiBQYXJzZXMgYSBTdGF0ZW1lbnQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIFN0YXRlbWVudCh0LCB4KSB7CiAgICAgICAgdmFyIGksIGxhYmVsLCBuLCBuMiwgcCwgYywgc3MsIHR0ID0gdC5nZXQodHJ1ZSksIHR0MiwgeDIsIHgzOwoKICAgICAgICB2YXIgY29tbWVudHMgPSB0LmJsb2NrQ29tbWVudHM7CgogICAgICAgIGlmICh4LmJsYWNrTGlzdFt0dF0pCiAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoZGVmaW5pdGlvbnMudG9rZW5zW3R0XSArICIgc3RhdGVtZW50cyBvbmx5IGFsbG93ZWQgaW4gSGFybW9ueSIpOwogICAgICAgIGlmICgheC5hbGxvdyh0dCkpCiAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoZGVmaW5pdGlvbnMudG9rZW5zW3R0XSArICIgc3RhdGVtZW50IGluIGlsbGVnYWwgY29udGV4dCIpOwoKICAgICAgICAvLyBDYXNlcyBmb3Igc3RhdGVtZW50cyBlbmRpbmcgaW4gYSByaWdodCBjdXJseSByZXR1cm4gZWFybHksIGF2b2lkaW5nIHRoZQogICAgICAgIC8vIGNvbW1vbiBzZW1pY29sb24gaW5zZXJ0aW9uIG1hZ2ljIGFmdGVyIHRoaXMgc3dpdGNoLgogICAgICAgIHN3aXRjaCAodHQpIHsKICAgICAgICAgIGNhc2UgSU1QT1JUOgogICAgICAgICAgICBuID0gbmV3IE5vZGUodCk7CiAgICAgICAgICAgIG4ucGF0aExpc3QgPSBJbXBvcnRQYXRoTGlzdCh0LCB4KTsKICAgICAgICAgICAgeC5wYXJlbnRTY3JpcHQuaW1wRGVjbHMucHVzaChuKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgY2FzZSBFWFBPUlQ6CiAgICAgICAgICAgIHN3aXRjaCAodC5wZWVrKCkpIHsKICAgICAgICAgICAgICBjYXNlIE1PRFVMRToKICAgICAgICAgICAgICBjYXNlIEZVTkNUSU9OOgogICAgICAgICAgICAgIGNhc2UgTEVUOgogICAgICAgICAgICAgIGNhc2UgVkFSOgogICAgICAgICAgICAgIGNhc2UgQ09OU1Q6CiAgICAgICAgICAgICAgICBuID0gU3RhdGVtZW50KHQsIHgpOwogICAgICAgICAgICAgICAgbi5ibG9ja0NvbW1lbnRzID0gY29tbWVudHM7CiAgICAgICAgICAgICAgICBuLmV4cG9ydGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHgucGFyZW50U2NyaXB0LmV4cERlY2xzLnB1c2gobik7CiAgICAgICAgICAgICAgICByZWdpc3RlckV4cG9ydCh4LnBhcmVudFNjcmlwdC5leHBvcnRzLCBuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuOwoKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQpOwogICAgICAgICAgICAgICAgbi5wYXRoTGlzdCA9IEV4cG9ydFBhdGhMaXN0KHQsIHgpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgeC5wYXJlbnRTY3JpcHQuZXhwRGVjbHMucHVzaChuKTsKICAgICAgICAgICAgcmVnaXN0ZXJFeHBvcnQoeC5wYXJlbnRTY3JpcHQuZXhwb3J0cywgbik7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgTU9EVUxFOgogICAgICAgICAgICBuID0gbmV3IE5vZGUodCk7CiAgICAgICAgICAgIG4uYmxvY2tDb21tZW50cyA9IGNvbW1lbnRzOwogICAgICAgICAgICB0Lm11c3RNYXRjaChJREVOVElGSUVSKTsKICAgICAgICAgICAgbGFiZWwgPSB0LnRva2VuLnZhbHVlOwoKICAgICAgICAgICAgaWYgKHQubWF0Y2goTEVGVF9DVVJMWSkpIHsKICAgICAgICAgICAgICAgIG4ubmFtZSA9IGxhYmVsOwogICAgICAgICAgICAgICAgbi5ib2R5ID0gU2NyaXB0KHQsIHRydWUsIGZhbHNlKTsKICAgICAgICAgICAgICAgIG4ubW9kdWxlID0gbmV3IE1vZHVsZShuKTsKICAgICAgICAgICAgICAgIHQubXVzdE1hdGNoKFJJR0hUX0NVUkxZKTsKICAgICAgICAgICAgICAgIHgucGFyZW50U2NyaXB0Lm1vZERlZm5zLnNldChuLm5hbWUsIG4pOwogICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHQudW5nZXQoKTsKICAgICAgICAgICAgTW9kdWxlVmFyaWFibGVzKHQsIHgsIG4pOwogICAgICAgICAgICByZXR1cm4gbjsKCiAgICAgICAgICBjYXNlIEZVTkNUSU9OOgogICAgICAgICAgICAvLyBERUNMQVJFRF9GT1JNIGV4dGVuZHMgZnVuRGVjbHMgb2YgeCwgU1RBVEVNRU5UX0ZPUk0gZG9lc24ndC4KICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uRGVmaW5pdGlvbih0LCB4LCB0cnVlLCB4LnRvcExldmVsID8gREVDTEFSRURfRk9STSA6IFNUQVRFTUVOVF9GT1JNLCBjb21tZW50cyk7CgogICAgICAgICAgY2FzZSBMRUZUX0NVUkxZOgogICAgICAgICAgICBuID0gbmV3IE5vZGUodCwgYmxvY2tJbml0KCkpOwogICAgICAgICAgICBTdGF0ZW1lbnRzKHQsIHgudXBkYXRlKHsgcGFyZW50QmxvY2s6IG4gfSkucHVzaFRhcmdldChuKS5uZXN0KCksIG4pOwogICAgICAgICAgICB0Lm11c3RNYXRjaChSSUdIVF9DVVJMWSk7CiAgICAgICAgICAgIHJldHVybiBuOwoKICAgICAgICAgIGNhc2UgSUY6CiAgICAgICAgICAgIG4gPSBuZXcgTm9kZSh0KTsKICAgICAgICAgICAgbi5jb25kaXRpb24gPSBIZWFkRXhwcmVzc2lvbih0LCB4KTsKICAgICAgICAgICAgeDIgPSB4LnB1c2hUYXJnZXQobikubmVzdCgpOwogICAgICAgICAgICBuLnRoZW5QYXJ0ID0gU3RhdGVtZW50KHQsIHgyKTsKICAgICAgICAgICAgbi5lbHNlUGFydCA9IHQubWF0Y2goRUxTRSwgdHJ1ZSkgPyBTdGF0ZW1lbnQodCwgeDIpIDogbnVsbDsKICAgICAgICAgICAgcmV0dXJuIG47CgogICAgICAgICAgY2FzZSBTV0lUQ0g6CiAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIENBU0VzIGFmdGVyIGEgREVGQVVMVCwgd2hpY2ggaXMgaW4gdGhlIHN0YW5kYXJkLgogICAgICAgICAgICBuID0gbmV3IE5vZGUodCwgeyBjYXNlczogW10sIGRlZmF1bHRJbmRleDogLTEgfSk7CiAgICAgICAgICAgIG4uZGlzY3JpbWluYW50ID0gSGVhZEV4cHJlc3Npb24odCwgeCk7CiAgICAgICAgICAgIHgyID0geC5wdXNoVGFyZ2V0KG4pLm5lc3QoKTsKICAgICAgICAgICAgdC5tdXN0TWF0Y2goTEVGVF9DVVJMWSk7CiAgICAgICAgICAgIHdoaWxlICgodHQgPSB0LmdldCgpKSAhPT0gUklHSFRfQ1VSTFkpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAodHQpIHsKICAgICAgICAgICAgICAgICAgY2FzZSBERUZBVUxUOgogICAgICAgICAgICAgICAgICAgIGlmIChuLmRlZmF1bHRJbmRleCA+PSAwKQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJNb3JlIHRoYW4gb25lIHN3aXRjaCBkZWZhdWx0Iik7CiAgICAgICAgICAgICAgICAgICAgLy8gRkFMTCBUSFJPVUdICiAgICAgICAgICAgICAgICAgIGNhc2UgQ0FTRToKICAgICAgICAgICAgICAgICAgICBuMiA9IG5ldyBOb2RlKHQpOwogICAgICAgICAgICAgICAgICAgIGlmICh0dCA9PT0gREVGQVVMVCkKICAgICAgICAgICAgICAgICAgICAgICAgbi5kZWZhdWx0SW5kZXggPSBuLmNhc2VzLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIG4yLmNhc2VMYWJlbCA9IEV4cHJlc3Npb24odCwgeDIsIENPTE9OKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiSW52YWxpZCBzd2l0Y2ggY2FzZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdC5tdXN0TWF0Y2goQ09MT04pOwogICAgICAgICAgICAgICAgbjIuc3RhdGVtZW50cyA9IG5ldyBOb2RlKHQsIGJsb2NrSW5pdCgpKTsKICAgICAgICAgICAgICAgIHdoaWxlICgodHQ9dC5wZWVrKHRydWUpKSAhPT0gQ0FTRSAmJiB0dCAhPT0gREVGQVVMVCAmJgogICAgICAgICAgICAgICAgICAgICAgICB0dCAhPT0gUklHSFRfQ1VSTFkpCiAgICAgICAgICAgICAgICAgICAgbjIuc3RhdGVtZW50cy5wdXNoKFN0YXRlbWVudCh0LCB4MikpOwogICAgICAgICAgICAgICAgbi5jYXNlcy5wdXNoKG4yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbjsKCiAgICAgICAgICBjYXNlIEZPUjoKICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQsIExPT1BfSU5JVCk7CiAgICAgICAgICAgIG4uYmxvY2tDb21tZW50cyA9IGNvbW1lbnRzOwogICAgICAgICAgICBpZiAodC5tYXRjaChJREVOVElGSUVSKSkgewogICAgICAgICAgICAgICAgaWYgKHQudG9rZW4udmFsdWUgPT09ICJlYWNoIikKICAgICAgICAgICAgICAgICAgICBuLmlzRWFjaCA9IHRydWU7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgdC51bmdldCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgheC5wYXJlbkZyZWVNb2RlKQogICAgICAgICAgICAgICAgdC5tdXN0TWF0Y2goTEVGVF9QQVJFTik7CiAgICAgICAgICAgIHgyID0geC5wdXNoVGFyZ2V0KG4pLm5lc3QoKTsKICAgICAgICAgICAgeDMgPSB4LnVwZGF0ZSh7IGluRm9yTG9vcEluaXQ6IHRydWUgfSk7CiAgICAgICAgICAgIG4yID0gbnVsbDsKICAgICAgICAgICAgaWYgKCh0dCA9IHQucGVlayh0cnVlKSkgIT09IFNFTUlDT0xPTikgewogICAgICAgICAgICAgICAgaWYgKHR0ID09PSBWQVIgfHwgdHQgPT09IENPTlNUKSB7CiAgICAgICAgICAgICAgICAgICAgdC5nZXQoKTsKICAgICAgICAgICAgICAgICAgICBuMiA9IFZhcmlhYmxlcyh0LCB4Myk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR0ID09PSBMRVQpIHsKICAgICAgICAgICAgICAgICAgICB0LmdldCgpOwogICAgICAgICAgICAgICAgICAgIGlmICh0LnBlZWsoKSA9PT0gTEVGVF9QQVJFTikgewogICAgICAgICAgICAgICAgICAgICAgICBuMiA9IExldEJsb2NrKHQsIHgzLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0IGluIGZvciBoZWFkLCB3ZSBuZWVkIHRvIGFkZCBhbiBpbXBsaWNpdCBibG9jawogICAgICAgICAgICAgICAgICAgICAgICAvLyBhcm91bmQgdGhlIHJlc3Qgb2YgdGhlIGZvci4KICAgICAgICAgICAgICAgICAgICAgICAgeDMucGFyZW50QmxvY2sgPSBuOwogICAgICAgICAgICAgICAgICAgICAgICBuLnZhckRlY2xzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIG4yID0gVmFyaWFibGVzKHQsIHgzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIG4yID0gRXhwcmVzc2lvbih0LCB4Myk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG4yICYmIHQubWF0Y2goSU4pKSB7CiAgICAgICAgICAgICAgICBuLnR5cGUgPSBGT1JfSU47CiAgICAgICAgICAgICAgICBuLm9iamVjdCA9IEV4cHJlc3Npb24odCwgeDMpOwogICAgICAgICAgICAgICAgaWYgKG4yLnR5cGUgPT09IFZBUiB8fCBuMi50eXBlID09PSBMRVQpIHsKICAgICAgICAgICAgICAgICAgICBjID0gbjIuY2hpbGRyZW47CgogICAgICAgICAgICAgICAgICAgIC8vIERlc3RydWN0dXJpbmcgdHVybnMgb25lIGRlY2wgaW50byBtdWx0aXBsZXMsIHNvIGVpdGhlcgogICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIG11c3QgYmUgb25seSBvbmUgZGVzdHJ1Y3R1cmluZyBvciBvbmx5IG9uZQogICAgICAgICAgICAgICAgICAgIC8vIGRlY2wuCiAgICAgICAgICAgICAgICAgICAgaWYgKGMubGVuZ3RoICE9PSAxICYmIG4yLmRlc3RydWN0dXJpbmdzLmxlbmd0aCAhPT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkludmFsaWQgZm9yLi5pbiBsZWZ0LWhhbmQgc2lkZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmZpbGVuYW1lLCBuMi5saW5lbm8pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAobjIuZGVzdHJ1Y3R1cmluZ3MubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBuLml0ZXJhdG9yID0gbjIuZGVzdHJ1Y3R1cmluZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgbi5pdGVyYXRvciA9IGNbMF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG4udmFyRGVjbCA9IG4yOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAobjIudHlwZSA9PT0gQVJSQVlfSU5JVCB8fCBuMi50eXBlID09PSBPQkpFQ1RfSU5JVCkgewogICAgICAgICAgICAgICAgICAgICAgICBuMi5kZXN0cnVjdHVyZWROYW1lcyA9IGNoZWNrRGVzdHJ1Y3R1cmluZyh0LCB4MywgbjIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBuLml0ZXJhdG9yID0gbjI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB4My5pbkZvckxvb3BJbml0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICBuLnNldHVwID0gbjI7CiAgICAgICAgICAgICAgICB0Lm11c3RNYXRjaChTRU1JQ09MT04pOwogICAgICAgICAgICAgICAgaWYgKG4uaXNFYWNoKQogICAgICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIkludmFsaWQgZm9yIGVhY2guLmluIGxvb3AiKTsKICAgICAgICAgICAgICAgIG4uY29uZGl0aW9uID0gKHQucGVlayh0cnVlKSA9PT0gU0VNSUNPTE9OKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBFeHByZXNzaW9uKHQsIHgzKTsKICAgICAgICAgICAgICAgIHQubXVzdE1hdGNoKFNFTUlDT0xPTik7CiAgICAgICAgICAgICAgICB0dDIgPSB0LnBlZWsodHJ1ZSk7CiAgICAgICAgICAgICAgICBuLnVwZGF0ZSA9ICh4LnBhcmVuRnJlZU1vZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdHQyID09PSBMRUZUX0NVUkxZIHx8IGRlZmluaXRpb25zLmlzU3RhdGVtZW50U3RhcnRDb2RlW3R0Ml0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdHQyID09PSBSSUdIVF9QQVJFTikKICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRXhwcmVzc2lvbih0LCB4Myk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF4LnBhcmVuRnJlZU1vZGUpCiAgICAgICAgICAgICAgICB0Lm11c3RNYXRjaChSSUdIVF9QQVJFTik7CiAgICAgICAgICAgIG4uYm9keSA9IFN0YXRlbWVudCh0LCB4Mik7CiAgICAgICAgICAgIHJldHVybiBuOwoKICAgICAgICAgIGNhc2UgV0hJTEU6CiAgICAgICAgICAgIG4gPSBuZXcgTm9kZSh0LCB7IGlzTG9vcDogdHJ1ZSB9KTsKICAgICAgICAgICAgbi5ibG9ja0NvbW1lbnRzID0gY29tbWVudHM7CiAgICAgICAgICAgIG4uY29uZGl0aW9uID0gSGVhZEV4cHJlc3Npb24odCwgeCk7CiAgICAgICAgICAgIG4uYm9keSA9IFN0YXRlbWVudCh0LCB4LnB1c2hUYXJnZXQobikubmVzdCgpKTsKICAgICAgICAgICAgcmV0dXJuIG47CgogICAgICAgICAgY2FzZSBETzoKICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQsIHsgaXNMb29wOiB0cnVlIH0pOwogICAgICAgICAgICBuLmJsb2NrQ29tbWVudHMgPSBjb21tZW50czsKICAgICAgICAgICAgbi5ib2R5ID0gU3RhdGVtZW50KHQsIHgucHVzaFRhcmdldChuKS5uZXN0KCkpOwogICAgICAgICAgICB0Lm11c3RNYXRjaChXSElMRSk7CiAgICAgICAgICAgIG4uY29uZGl0aW9uID0gSGVhZEV4cHJlc3Npb24odCwgeCk7CiAgICAgICAgICAgIGlmICgheC5lY21hU3RyaWN0TW9kZSkgewogICAgICAgICAgICAgICAgLy8gPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+ICh3aXRob3V0IHZlcnNpb24gaGludHMpIG1heSBuZWVkCiAgICAgICAgICAgICAgICAvLyBhdXRvbWF0aWMgc2VtaWNvbG9uIGluc2VydGlvbiB3aXRob3V0IGEgbmV3bGluZSBhZnRlciBkby13aGlsZS4KICAgICAgICAgICAgICAgIC8vIFNlZSBodHRwOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTIzODk0NS4KICAgICAgICAgICAgICAgIHQubWF0Y2goU0VNSUNPTE9OKTsKICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgQlJFQUs6CiAgICAgICAgICBjYXNlIENPTlRJTlVFOgogICAgICAgICAgICBuID0gbmV3IE5vZGUodCk7CiAgICAgICAgICAgIG4uYmxvY2tDb21tZW50cyA9IGNvbW1lbnRzOwoKICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSB8Zm9vOiBicmVhayBmb287fCBjb3JuZXIgY2FzZQogICAgICAgICAgICB4MiA9IHgucHVzaFRhcmdldChuKTsKCiAgICAgICAgICAgIGlmICh0LnBlZWtPblNhbWVMaW5lKCkgPT09IElERU5USUZJRVIpIHsKICAgICAgICAgICAgICAgIHQuZ2V0KCk7CiAgICAgICAgICAgICAgICBuLmxhYmVsID0gdC50b2tlbi52YWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKG4ubGFiZWwpIHsKICAgICAgICAgICAgICAgIG4udGFyZ2V0ID0geDIubGFiZWxlZFRhcmdldHMuZmluZChmdW5jdGlvbih0YXJnZXQpIHsgcmV0dXJuIHRhcmdldC5sYWJlbHMuaGFzKG4ubGFiZWwpIH0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKHR0ID09PSBDT05USU5VRSkgewogICAgICAgICAgICAgICAgbi50YXJnZXQgPSB4Mi5kZWZhdWx0TG9vcFRhcmdldDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG4udGFyZ2V0ID0geDIuZGVmYXVsdFRhcmdldDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFuLnRhcmdldCkKICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIkludmFsaWQgIiArICgodHQgPT09IEJSRUFLKSA/ICJicmVhayIgOiAiY29udGludWUiKSk7CiAgICAgICAgICAgIGlmICghbi50YXJnZXQuaXNMb29wICYmIHR0ID09PSBDT05USU5VRSkKICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIkludmFsaWQgY29udGludWUiKTsKCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgVFJZOgogICAgICAgICAgICBuID0gbmV3IE5vZGUodCwgeyBjYXRjaENsYXVzZXM6IFtdIH0pOwogICAgICAgICAgICBuLmJsb2NrQ29tbWVudHMgPSBjb21tZW50czsKICAgICAgICAgICAgbi50cnlCbG9jayA9IEJsb2NrKHQsIHgpOwogICAgICAgICAgICB3aGlsZSAodC5tYXRjaChDQVRDSCkpIHsKICAgICAgICAgICAgICAgIG4yID0gbmV3IE5vZGUodCk7CiAgICAgICAgICAgICAgICBwID0gTWF5YmVMZWZ0UGFyZW4odCwgeCk7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHQuZ2V0KCkpIHsKICAgICAgICAgICAgICAgICAgY2FzZSBMRUZUX0JSQUNLRVQ6CiAgICAgICAgICAgICAgICAgIGNhc2UgTEVGVF9DVVJMWToKICAgICAgICAgICAgICAgICAgICAvLyBEZXN0cnVjdHVyZWQgY2F0Y2ggaWRlbnRpZmllcnMuCiAgICAgICAgICAgICAgICAgICAgdC51bmdldCgpOwogICAgICAgICAgICAgICAgICAgIG4yLnZhck5hbWUgPSBEZXN0cnVjdHVyaW5nRXhwcmVzc2lvbih0LCB4LCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgY2FzZSBJREVOVElGSUVSOgogICAgICAgICAgICAgICAgICAgIG4yLnZhck5hbWUgPSB0LnRva2VuLnZhbHVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIm1pc3NpbmcgaWRlbnRpZmllciBpbiBjYXRjaCIpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHQubWF0Y2goSUYpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHguZWNtYTNPbmx5TW9kZSkKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiSWxsZWdhbCBjYXRjaCBndWFyZCIpOwogICAgICAgICAgICAgICAgICAgIGlmIChuLmNhdGNoQ2xhdXNlcy5sZW5ndGggJiYgIW4uY2F0Y2hDbGF1c2VzLnRvcCgpLmd1YXJkKQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJHdWFyZGVkIGNhdGNoIGFmdGVyIHVuZ3VhcmRlZCIpOwogICAgICAgICAgICAgICAgICAgIG4yLmd1YXJkID0gRXhwcmVzc2lvbih0LCB4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIE1heWJlUmlnaHRQYXJlbih0LCBwKTsKICAgICAgICAgICAgICAgIG4yLmJsb2NrID0gQmxvY2sodCwgeCk7CiAgICAgICAgICAgICAgICBuLmNhdGNoQ2xhdXNlcy5wdXNoKG4yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodC5tYXRjaChGSU5BTExZKSkKICAgICAgICAgICAgICAgIG4uZmluYWxseUJsb2NrID0gQmxvY2sodCwgeCk7CiAgICAgICAgICAgIGlmICghbi5jYXRjaENsYXVzZXMubGVuZ3RoICYmICFuLmZpbmFsbHlCbG9jaykKICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIkludmFsaWQgdHJ5IHN0YXRlbWVudCIpOwogICAgICAgICAgICByZXR1cm4gbjsKCiAgICAgICAgICBjYXNlIENBVENIOgogICAgICAgICAgY2FzZSBGSU5BTExZOgogICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKGRlZmluaXRpb25zLnRva2Vuc1t0dF0gKyAiIHdpdGhvdXQgcHJlY2VkaW5nIHRyeSIpOwoKICAgICAgICAgIGNhc2UgVEhST1c6CiAgICAgICAgICAgIG4gPSBuZXcgTm9kZSh0KTsKICAgICAgICAgICAgbi5leGNlcHRpb24gPSBFeHByZXNzaW9uKHQsIHgpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBjYXNlIFJFVFVSTjoKICAgICAgICAgICAgbiA9IFJldHVybk9yWWllbGQodCwgeCk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgV0lUSDoKICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQpOwogICAgICAgICAgICBuLmJsb2NrQ29tbWVudHMgPSBjb21tZW50czsKICAgICAgICAgICAgbi5vYmplY3QgPSBIZWFkRXhwcmVzc2lvbih0LCB4KTsKICAgICAgICAgICAgbi5ib2R5ID0gU3RhdGVtZW50KHQsIHgucHVzaFRhcmdldChuKS5uZXN0KCkpOwogICAgICAgICAgICByZXR1cm4gbjsKCiAgICAgICAgICBjYXNlIFZBUjoKICAgICAgICAgIGNhc2UgQ09OU1Q6CiAgICAgICAgICAgIG4gPSBWYXJpYWJsZXModCwgeCk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgTEVUOgogICAgICAgICAgICBpZiAodC5wZWVrKCkgPT09IExFRlRfUEFSRU4pCiAgICAgICAgICAgICAgICBuID0gTGV0QmxvY2sodCwgeCwgdHJ1ZSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIG4gPSBWYXJpYWJsZXModCwgeCk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgREVCVUdHRVI6CiAgICAgICAgICAgIG4gPSBuZXcgTm9kZSh0KTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgY2FzZSBORVdMSU5FOgogICAgICAgICAgY2FzZSBTRU1JQ09MT046CiAgICAgICAgICAgIG4gPSBuZXcgTm9kZSh0LCB7IHR5cGU6IFNFTUlDT0xPTiB9KTsKICAgICAgICAgICAgbi5ibG9ja0NvbW1lbnRzID0gY29tbWVudHM7CiAgICAgICAgICAgIG4uZXhwcmVzc2lvbiA9IG51bGw7CiAgICAgICAgICAgIHJldHVybiBuOwoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGlmICh0dCA9PT0gSURFTlRJRklFUikgewogICAgICAgICAgICAgICAgdHQgPSB0LnBlZWsoKTsKICAgICAgICAgICAgICAgIC8vIExhYmVsZWQgc3RhdGVtZW50LgogICAgICAgICAgICAgICAgaWYgKHR0ID09PSBDT0xPTikgewogICAgICAgICAgICAgICAgICAgIGxhYmVsID0gdC50b2tlbi52YWx1ZTsKICAgICAgICAgICAgICAgICAgICBpZiAoeC5hbGxMYWJlbHMuaGFzKGxhYmVsKSkKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiRHVwbGljYXRlIGxhYmVsIik7CiAgICAgICAgICAgICAgICAgICAgdC5nZXQoKTsKICAgICAgICAgICAgICAgICAgICBuID0gbmV3IE5vZGUodCwgeyB0eXBlOiBMQUJFTCwgbGFiZWw6IGxhYmVsIH0pOwogICAgICAgICAgICAgICAgICAgIG4uYmxvY2tDb21tZW50cyA9IGNvbW1lbnRzOwogICAgICAgICAgICAgICAgICAgIG4uc3RhdGVtZW50ID0gU3RhdGVtZW50KHQsIHgucHVzaExhYmVsKGxhYmVsKS5uZXN0KCkpOwogICAgICAgICAgICAgICAgICAgIG4udGFyZ2V0ID0gKG4uc3RhdGVtZW50LnR5cGUgPT09IExBQkVMKSA/IG4uc3RhdGVtZW50LnRhcmdldCA6IG4uc3RhdGVtZW50OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBFeHByZXNzaW9uIHN0YXRlbWVudC4KICAgICAgICAgICAgLy8gV2UgdW5nZXQgdGhlIGN1cnJlbnQgdG9rZW4gdG8gcGFyc2UgdGhlIGV4cHJlc3Npb24gYXMgYSB3aG9sZS4KICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQsIHsgdHlwZTogU0VNSUNPTE9OIH0pOwogICAgICAgICAgICB0LnVuZ2V0KCk7CiAgICAgICAgICAgIG4uYmxvY2tDb21tZW50cyA9IGNvbW1lbnRzOwogICAgICAgICAgICBuLmV4cHJlc3Npb24gPSBFeHByZXNzaW9uKHQsIHgpOwogICAgICAgICAgICBuLmVuZCA9IG4uZXhwcmVzc2lvbi5lbmQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgbi5ibG9ja0NvbW1lbnRzID0gY29tbWVudHM7CiAgICAgICAgTWFnaWNhbFNlbWljb2xvbih0KTsKICAgICAgICByZXR1cm4gbjsKICAgIH0KCiAgICAvKgogICAgICogTWFnaWNhbFNlbWljb2xvbiA6OiAodG9rZW5pemVyKSAtPiB2b2lkCiAgICAgKi8KICAgIGZ1bmN0aW9uIE1hZ2ljYWxTZW1pY29sb24odCkgewogICAgICAgIHZhciB0dDsKICAgICAgICBpZiAodC5saW5lbm8gPT09IHQudG9rZW4ubGluZW5vKSB7CiAgICAgICAgICAgIHR0ID0gdC5wZWVrT25TYW1lTGluZSgpOwogICAgICAgICAgICBpZiAodHQgIT09IEVORCAmJiB0dCAhPT0gTkVXTElORSAmJiB0dCAhPT0gU0VNSUNPTE9OICYmIHR0ICE9PSBSSUdIVF9DVVJMWSkKICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIm1pc3NpbmcgOyBiZWZvcmUgc3RhdGVtZW50Iik7CiAgICAgICAgfQogICAgICAgIHQubWF0Y2goU0VNSUNPTE9OKTsKICAgIH0KCiAgICAvKgogICAgICogUmV0dXJuT3JZaWVsZCA6OiAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0KSAtPiAoUkVUVVJOIHwgWUlFTEQpIG5vZGUKICAgICAqLwogICAgZnVuY3Rpb24gUmV0dXJuT3JZaWVsZCh0LCB4KSB7CiAgICAgICAgdmFyIG4sIGIsIHR0ID0gdC50b2tlbi50eXBlLCB0dDI7CgogICAgICAgIHZhciBwYXJlbnRTY3JpcHQgPSB4LnBhcmVudFNjcmlwdDsKCiAgICAgICAgaWYgKHR0ID09PSBSRVRVUk4pIHsKICAgICAgICAgICAgaWYgKCF4LmluRnVuY3Rpb24pCiAgICAgICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJSZXR1cm4gbm90IGluIGZ1bmN0aW9uIik7CiAgICAgICAgfSBlbHNlIC8qIGlmICh0dCA9PT0gWUlFTEQpICovIHsKICAgICAgICAgICAgaWYgKCF4LmluRnVuY3Rpb24pCiAgICAgICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJZaWVsZCBub3QgaW4gZnVuY3Rpb24iKTsKICAgICAgICAgICAgcGFyZW50U2NyaXB0LmlzR2VuZXJhdG9yID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgbiA9IG5ldyBOb2RlKHQsIHsgdmFsdWU6IHVuZGVmaW5lZCB9KTsKCiAgICAgICAgdHQyID0gKHR0ID09PSBSRVRVUk4pID8gdC5wZWVrT25TYW1lTGluZSh0cnVlKSA6IHQucGVlayh0cnVlKTsKICAgICAgICBpZiAodHQyICE9PSBFTkQgJiYgdHQyICE9PSBORVdMSU5FICYmCiAgICAgICAgICAgIHR0MiAhPT0gU0VNSUNPTE9OICYmIHR0MiAhPT0gUklHSFRfQ1VSTFkKICAgICAgICAgICAgJiYgKHR0ICE9PSBZSUVMRCB8fAogICAgICAgICAgICAgICAgKHR0MiAhPT0gdHQgJiYgdHQyICE9PSBSSUdIVF9CUkFDS0VUICYmIHR0MiAhPT0gUklHSFRfUEFSRU4gJiYKICAgICAgICAgICAgICAgICB0dDIgIT09IENPTE9OICYmIHR0MiAhPT0gQ09NTUEpKSkgewogICAgICAgICAgICBpZiAodHQgPT09IFJFVFVSTikgewogICAgICAgICAgICAgICAgbi52YWx1ZSA9IEV4cHJlc3Npb24odCwgeCk7CiAgICAgICAgICAgICAgICBwYXJlbnRTY3JpcHQuaGFzUmV0dXJuV2l0aFZhbHVlID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG4udmFsdWUgPSBBc3NpZ25FeHByZXNzaW9uKHQsIHgpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0dCA9PT0gUkVUVVJOKSB7CiAgICAgICAgICAgIHBhcmVudFNjcmlwdC5oYXNFbXB0eVJldHVybiA9IHRydWU7CiAgICAgICAgfQoKICAgICAgICAvLyBEaXNhbGxvdyByZXR1cm4gdjsgaW4gZ2VuZXJhdG9yLgogICAgICAgIGlmIChwYXJlbnRTY3JpcHQuaGFzUmV0dXJuV2l0aFZhbHVlICYmIHBhcmVudFNjcmlwdC5pc0dlbmVyYXRvcikKICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiR2VuZXJhdG9yIHJldHVybnMgYSB2YWx1ZSIpOwoKICAgICAgICByZXR1cm4gbjsKICAgIH0KCiAgICAvKgogICAgICogTW9kdWxlRXhwcmVzc2lvbiA6OiAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0KSAtPiAoU1RSSU5HIHwgSURFTlRJRklFUiB8IERPVCkgbm9kZQogICAgICovCiAgICBmdW5jdGlvbiBNb2R1bGVFeHByZXNzaW9uKHQsIHgpIHsKICAgICAgICByZXR1cm4gdC5tYXRjaChTVFJJTkcpID8gbmV3IE5vZGUodCkgOiBRdWFsaWZpZWRQYXRoKHQsIHgpOwogICAgfQoKICAgIC8qCiAgICAgKiBJbXBvcnRQYXRoTGlzdCA6OiAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0KSAtPiBBcnJheVtET1Qgbm9kZV0KICAgICAqLwogICAgZnVuY3Rpb24gSW1wb3J0UGF0aExpc3QodCwgeCkgewogICAgICAgIHZhciBhID0gW107CiAgICAgICAgZG8gewogICAgICAgICAgICBhLnB1c2goSW1wb3J0UGF0aCh0LCB4KSk7CiAgICAgICAgfSB3aGlsZSAodC5tYXRjaChDT01NQSkpOwogICAgICAgIHJldHVybiBhOwogICAgfQoKICAgIC8qCiAgICAgKiBJbXBvcnRQYXRoIDo6ICh0b2tlbml6ZXIsIGNvbXBpbGVyIGNvbnRleHQpIC0+IERPVCBub2RlCiAgICAgKi8KICAgIGZ1bmN0aW9uIEltcG9ydFBhdGgodCwgeCkgewogICAgICAgIHZhciBuID0gUXVhbGlmaWVkUGF0aCh0LCB4KTsKICAgICAgICBpZiAoIXQubWF0Y2goRE9UKSkgewogICAgICAgICAgICBpZiAobi50eXBlID09PSBJREVOVElGSUVSKQogICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiY2Fubm90IGltcG9ydCBsb2NhbCB2YXJpYWJsZSIpOwogICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICB9CgogICAgICAgIHZhciBuMiA9IG5ldyBOb2RlKHQpOwogICAgICAgIG4yLnB1c2gobik7CiAgICAgICAgbjIucHVzaChJbXBvcnRTcGVjaWZpZXJTZXQodCwgeCkpOwogICAgICAgIHJldHVybiBuMjsKICAgIH0KCiAgICAvKgogICAgICogRXhwbGljaXRTcGVjaWZpZXJTZXQgOjogKHRva2VuaXplciwgY29tcGlsZXIgY29udGV4dCwgKHRva2VuaXplciwgY29tcGlsZXIgY29udGV4dCkgLT4gbm9kZSkKICAgICAqICAgICAgICAgICAgICAgICAgICAgIC0+IE9CSkVDVF9JTklUIG5vZGUKICAgICAqLwogICAgZnVuY3Rpb24gRXhwbGljaXRTcGVjaWZpZXJTZXQodCwgeCwgU3BlY2lmaWVyUkhTKSB7CiAgICAgICAgdmFyIG4sIG4yLCBpZCwgdHQ7CgogICAgICAgIG4gPSBuZXcgTm9kZSh0LCB7IHR5cGU6IE9CSkVDVF9JTklUIH0pOwogICAgICAgIHQubXVzdE1hdGNoKExFRlRfQ1VSTFkpOwoKICAgICAgICBpZiAoIXQubWF0Y2goUklHSFRfQ1VSTFkpKSB7CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgIGlkID0gSWRlbnRpZmllcih0LCB4KTsKICAgICAgICAgICAgICAgIGlmICh0Lm1hdGNoKENPTE9OKSkgewogICAgICAgICAgICAgICAgICAgIG4yID0gbmV3IE5vZGUodCwgeyB0eXBlOiBQUk9QRVJUWV9JTklUIH0pOwogICAgICAgICAgICAgICAgICAgIG4yLnB1c2goaWQpOwogICAgICAgICAgICAgICAgICAgIG4yLnB1c2goU3BlY2lmaWVyUkhTKHQsIHgpKTsKICAgICAgICAgICAgICAgICAgICBuLnB1c2gobjIpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBuLnB1c2goaWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IHdoaWxlICghdC5tYXRjaChSSUdIVF9DVVJMWSkgJiYgdC5tdXN0TWF0Y2goQ09NTUEpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuOwogICAgfQoKICAgIC8qCiAgICAgKiBJbXBvcnRTcGVjaWZpZXJTZXQgOjogKHRva2VuaXplciwgY29tcGlsZXIgY29udGV4dCkgLT4gKElERU5USUZJRVIgfCBPQkpFQ1RfSU5JVCkgbm9kZQogICAgICovCiAgICBmdW5jdGlvbiBJbXBvcnRTcGVjaWZpZXJTZXQodCwgeCkgewogICAgICAgIHJldHVybiB0Lm1hdGNoKE1VTCkKICAgICAgICAgICAgID8gbmV3IE5vZGUodCwgeyB0eXBlOiBJREVOVElGSUVSLCBuYW1lOiAiKiIgfSkKICAgICAgICAgICAgIDogRXhwbGljaXRTcGVjaWZpZXJTZXQodCwgeCwgSWRlbnRpZmllcik7CiAgICB9CgogICAgLyoKICAgICAqIElkZW50aWZpZXIgOjogKHRva2VuaXplciwgY29tcGlsZXIgY29udGV4dCkgLT4gSURFTlRJRklFUiBub2RlCiAgICAgKi8KICAgIGZ1bmN0aW9uIElkZW50aWZpZXIodCwgeCkgewogICAgICAgIHQubXVzdE1hdGNoKElERU5USUZJRVIpOwogICAgICAgIHJldHVybiBuZXcgTm9kZSh0LCB7IHR5cGU6IElERU5USUZJRVIgfSk7CiAgICB9CgogICAgLyoKICAgICAqIElkZW50aWZpZXJOYW1lIDo6ICh0b2tlbml6ZXIpIC0+IElERU5USUZJRVIgbm9kZQogICAgICovCiAgICBmdW5jdGlvbiBJZGVudGlmaWVyTmFtZSh0KSB7CiAgICAgICAgaWYgKHQubWF0Y2goSURFTlRJRklFUikpCiAgICAgICAgICAgIHJldHVybiBuZXcgTm9kZSh0LCB7IHR5cGU6IElERU5USUZJRVIgfSk7CiAgICAgICAgdC5nZXQoKTsKICAgICAgICBpZiAodC50b2tlbi52YWx1ZSBpbiBkZWZpbml0aW9ucy5rZXl3b3JkcykKICAgICAgICAgICAgcmV0dXJuIG5ldyBOb2RlKHQsIHsgdHlwZTogSURFTlRJRklFUiB9KTsKICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJtaXNzaW5nIElkZW50aWZpZXJOYW1lIik7CiAgICB9CgogICAgLyoKICAgICAqIFF1YWxpZmllZFBhdGggOjogKHRva2VuaXplciwgY29tcGlsZXIgY29udGV4dCkgLT4gKElERU5USUZJRVIgfCBET1QpIG5vZGUKICAgICAqLwogICAgZnVuY3Rpb24gUXVhbGlmaWVkUGF0aCh0LCB4KSB7CiAgICAgICAgdmFyIG4sIG4yOwoKICAgICAgICBuID0gSWRlbnRpZmllcih0LCB4KTsKCiAgICAgICAgd2hpbGUgKHQubWF0Y2goRE9UKSkgewogICAgICAgICAgICBpZiAodC5wZWVrKCkgIT09IElERU5USUZJRVIpIHsKICAgICAgICAgICAgICAgIC8vIFVuZ2V0IHRoZSAnLicgdG9rZW4sIHdoaWNoIGlzbid0IHBhcnQgb2YgdGhlIFF1YWxpZmllZFBhdGguCiAgICAgICAgICAgICAgICB0LnVuZ2V0KCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBuMiA9IG5ldyBOb2RlKHQpOwogICAgICAgICAgICBuMi5wdXNoKG4pOwogICAgICAgICAgICBuMi5wdXNoKElkZW50aWZpZXIodCwgeCkpOwogICAgICAgICAgICBuID0gbjI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbjsKICAgIH0KCiAgICAvKgogICAgICogRXhwb3J0UGF0aCA6OiAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0KSAtPiAoSURFTlRJRklFUiB8IERPVCB8IE9CSkVDVF9JTklUKSBub2RlCiAgICAgKi8KICAgIGZ1bmN0aW9uIEV4cG9ydFBhdGgodCwgeCkgewogICAgICAgIGlmICh0LnBlZWsoKSA9PT0gTEVGVF9DVVJMWSkKICAgICAgICAgICAgcmV0dXJuIEV4cGxpY2l0U3BlY2lmaWVyU2V0KHQsIHgsIFF1YWxpZmllZFBhdGgpOwogICAgICAgIHJldHVybiBRdWFsaWZpZWRQYXRoKHQsIHgpOwogICAgfQoKICAgIC8qCiAgICAgKiBFeHBvcnRQYXRoTGlzdCA6OiAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0KQogICAgICogICAgICAgICAgICAgICAgLT4gQXJyYXlbKElERU5USUZJRVIgfCBET1QgfCBPQkpFQ1RfSU5JVCkgbm9kZV0KICAgICAqLwogICAgZnVuY3Rpb24gRXhwb3J0UGF0aExpc3QodCwgeCkgewogICAgICAgIHZhciBhID0gW107CiAgICAgICAgZG8gewogICAgICAgICAgICBhLnB1c2goRXhwb3J0UGF0aCh0LCB4KSk7CiAgICAgICAgfSB3aGlsZSAodC5tYXRjaChDT01NQSkpOwogICAgICAgIHJldHVybiBhOwogICAgfQoKICAgIC8qCiAgICAgKiBGdW5jdGlvbkRlZmluaXRpb24gOjogKHRva2VuaXplciwgY29tcGlsZXIgY29udGV4dCwgYm9vbGVhbiwKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgREVDTEFSRURfRk9STSBvciBFWFBSRVNTRURfRk9STSBvciBTVEFURU1FTlRfRk9STSwKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgW3N0cmluZ10gb3IgbnVsbCBvciB1bmRlZmluZWQpCiAgICAgKiAgICAgICAgICAgICAgICAgICAgLT4gbm9kZQogICAgICovCiAgICBmdW5jdGlvbiBGdW5jdGlvbkRlZmluaXRpb24odCwgeCwgcmVxdWlyZU5hbWUsIGZ1bmN0aW9uRm9ybSwgY29tbWVudHMpIHsKICAgICAgICB2YXIgdHQ7CiAgICAgICAgdmFyIGYgPSBuZXcgTm9kZSh0LCB7IHBhcmFtczogW10sIHBhcmFtQ29tbWVudHM6IFtdIH0pOwogICAgICAgIGlmICh0eXBlb2YgY29tbWVudCA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIGNvbW1lbnQgPSBudWxsOwogICAgICAgIGYuYmxvY2tDb21tZW50cyA9IGNvbW1lbnRzOwogICAgICAgIGlmIChmLnR5cGUgIT09IEZVTkNUSU9OKQogICAgICAgICAgICBmLnR5cGUgPSAoZi52YWx1ZSA9PT0gImdldCIpID8gR0VUVEVSIDogU0VUVEVSOwogICAgICAgIGlmICh0Lm1hdGNoKElERU5USUZJRVIpKQogICAgICAgICAgICBmLm5hbWUgPSB0LnRva2VuLnZhbHVlOwogICAgICAgIGVsc2UgaWYgKHJlcXVpcmVOYW1lKQogICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJtaXNzaW5nIGZ1bmN0aW9uIGlkZW50aWZpZXIiKTsKCiAgICAgICAgdmFyIGluTW9kdWxlID0geCA/IHguaW5Nb2R1bGUgOiBmYWxzZTsKICAgICAgICB2YXIgeDIgPSBuZXcgU3RhdGljQ29udGV4dChudWxsLCBudWxsLCBpbk1vZHVsZSwgdHJ1ZSk7CgogICAgICAgIHQubXVzdE1hdGNoKExFRlRfUEFSRU4pOwogICAgICAgIGlmICghdC5tYXRjaChSSUdIVF9QQVJFTikpIHsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgdHQgPSB0LmdldCgpOwogICAgICAgICAgICAgICAgZi5wYXJhbUNvbW1lbnRzLnB1c2godC5sYXN0QmxvY2tDb21tZW50KCkpOwogICAgICAgICAgICAgICAgc3dpdGNoICh0dCkgewogICAgICAgICAgICAgICAgICBjYXNlIExFRlRfQlJBQ0tFVDoKICAgICAgICAgICAgICAgICAgY2FzZSBMRUZUX0NVUkxZOgogICAgICAgICAgICAgICAgICAgIC8vIERlc3RydWN0dXJlZCBmb3JtYWwgcGFyYW1ldGVycy4KICAgICAgICAgICAgICAgICAgICB0LnVuZ2V0KCk7CiAgICAgICAgICAgICAgICAgICAgZi5wYXJhbXMucHVzaChEZXN0cnVjdHVyaW5nRXhwcmVzc2lvbih0LCB4MikpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICBjYXNlIElERU5USUZJRVI6CiAgICAgICAgICAgICAgICAgICAgZi5wYXJhbXMucHVzaCh0LnRva2VuLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJtaXNzaW5nIGZvcm1hbCBwYXJhbWV0ZXIiKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSB3aGlsZSAodC5tYXRjaChDT01NQSkpOwogICAgICAgICAgICB0Lm11c3RNYXRjaChSSUdIVF9QQVJFTik7CiAgICAgICAgfQoKICAgICAgICAvLyBEbyB3ZSBoYXZlIGFuIGV4cHJlc3Npb24gY2xvc3VyZSBvciBhIG5vcm1hbCBib2R5PwogICAgICAgIHR0ID0gdC5nZXQoKTsKICAgICAgICBpZiAodHQgIT09IExFRlRfQ1VSTFkpCiAgICAgICAgICAgIHQudW5nZXQoKTsKCiAgICAgICAgaWYgKHR0ICE9PSBMRUZUX0NVUkxZKSB7CiAgICAgICAgICAgIGYuYm9keSA9IEFzc2lnbkV4cHJlc3Npb24odCwgeDIpOwogICAgICAgICAgICBpZiAoZi5ib2R5LmlzR2VuZXJhdG9yKQogICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiR2VuZXJhdG9yIHJldHVybnMgYSB2YWx1ZSIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGYuYm9keSA9IFNjcmlwdCh0LCBpbk1vZHVsZSwgdHJ1ZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAodHQgPT09IExFRlRfQ1VSTFkpCiAgICAgICAgICAgIHQubXVzdE1hdGNoKFJJR0hUX0NVUkxZKTsKCiAgICAgICAgZi5lbmQgPSB0LnRva2VuLmVuZDsKICAgICAgICBmLmZ1bmN0aW9uRm9ybSA9IGZ1bmN0aW9uRm9ybTsKICAgICAgICBpZiAoZnVuY3Rpb25Gb3JtID09PSBERUNMQVJFRF9GT1JNKQogICAgICAgICAgICB4LnBhcmVudFNjcmlwdC5mdW5EZWNscy5wdXNoKGYpOwogICAgICAgIHJldHVybiBmOwogICAgfQoKICAgIC8qCiAgICAgKiBNb2R1bGVWYXJpYWJsZXMgOjogKHRva2VuaXplciwgY29tcGlsZXIgY29udGV4dCwgTU9EVUxFIG5vZGUpIC0+IHZvaWQKICAgICAqCiAgICAgKiBQYXJzZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtb2R1bGUgZGVjbGFyYXRpb25zIChhbmQgbWF5YmUKICAgICAqIGluaXRpYWxpemF0aW9ucykuCiAgICAgKi8KICAgIGZ1bmN0aW9uIE1vZHVsZVZhcmlhYmxlcyh0LCB4LCBuKSB7CiAgICAgICAgdmFyIG4xLCBuMjsKICAgICAgICBkbyB7CiAgICAgICAgICAgIG4xID0gSWRlbnRpZmllcih0LCB4KTsKICAgICAgICAgICAgaWYgKHQubWF0Y2goQVNTSUdOKSkgewogICAgICAgICAgICAgICAgbjIgPSBNb2R1bGVFeHByZXNzaW9uKHQsIHgpOwogICAgICAgICAgICAgICAgbjEuaW5pdGlhbGl6ZXIgPSBuMjsKICAgICAgICAgICAgICAgIGlmIChuMi50eXBlID09PSBTVFJJTkcpCiAgICAgICAgICAgICAgICAgICAgeC5wYXJlbnRTY3JpcHQubW9kTG9hZHMuc2V0KG4xLnZhbHVlLCBuMi52YWx1ZSk7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgeC5wYXJlbnRTY3JpcHQubW9kQXNzbnMuc2V0KG4xLnZhbHVlLCBuMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbi5wdXNoKG4xKTsKICAgICAgICB9IHdoaWxlICh0Lm1hdGNoKENPTU1BKSk7CiAgICB9CgogICAgLyoKICAgICAqIFZhcmlhYmxlcyA6OiAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0KSAtPiBub2RlCiAgICAgKgogICAgICogUGFyc2VzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdmFyIGRlY2xhcmF0aW9ucyAoYW5kIG1heWJlCiAgICAgKiBpbml0aWFsaXphdGlvbnMpLgogICAgICovCiAgICBmdW5jdGlvbiBWYXJpYWJsZXModCwgeCwgbGV0QmxvY2spIHsKICAgICAgICB2YXIgbiwgbjIsIHNzLCBpLCBzLCB0dDsKCiAgICAgICAgdHQgPSB0LnRva2VuLnR5cGU7CiAgICAgICAgc3dpdGNoICh0dCkgewogICAgICAgICAgY2FzZSBWQVI6CiAgICAgICAgICBjYXNlIENPTlNUOgogICAgICAgICAgICBzID0geC5wYXJlbnRTY3JpcHQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBMRVQ6CiAgICAgICAgICAgIHMgPSB4LnBhcmVudEJsb2NrOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgTEVGVF9QQVJFTjoKICAgICAgICAgICAgdHQgPSBMRVQ7CiAgICAgICAgICAgIHMgPSBsZXRCbG9jazsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBuID0gbmV3IE5vZGUodCwgeyB0eXBlOiB0dCwgZGVzdHJ1Y3R1cmluZ3M6IFtdIH0pOwoKICAgICAgICBkbyB7CiAgICAgICAgICAgIHR0ID0gdC5nZXQoKTsKICAgICAgICAgICAgaWYgKHR0ID09PSBMRUZUX0JSQUNLRVQgfHwgdHQgPT09IExFRlRfQ1VSTFkpIHsKICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gdW5nZXQgdG8gcGFyc2UgdGhlIGZ1bGwgZGVzdHJ1Y3R1cmVkIGV4cHJlc3Npb24uCiAgICAgICAgICAgICAgICB0LnVuZ2V0KCk7CgogICAgICAgICAgICAgICAgdmFyIGRleHAgPSBEZXN0cnVjdHVyaW5nRXhwcmVzc2lvbih0LCB4LCB0cnVlKTsKCiAgICAgICAgICAgICAgICBuMiA9IG5ldyBOb2RlKHQsIHsgdHlwZTogSURFTlRJRklFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBkZXhwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRPbmx5OiBuLnR5cGUgPT09IENPTlNUIH0pOwogICAgICAgICAgICAgICAgbi5wdXNoKG4yKTsKICAgICAgICAgICAgICAgIHB1c2hEZXN0cnVjdHVyaW5nVmFyRGVjbHMobjIubmFtZS5kZXN0cnVjdHVyZWROYW1lcywgcyk7CiAgICAgICAgICAgICAgICBuLmRlc3RydWN0dXJpbmdzLnB1c2goeyBleHA6IGRleHAsIGRlY2w6IG4yIH0pOwoKICAgICAgICAgICAgICAgIGlmICh4LmluRm9yTG9vcEluaXQgJiYgdC5wZWVrKCkgPT09IElOKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdC5tdXN0TWF0Y2goQVNTSUdOKTsKICAgICAgICAgICAgICAgIGlmICh0LnRva2VuLmFzc2lnbk9wKQogICAgICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIkludmFsaWQgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24iKTsKCiAgICAgICAgICAgICAgICBuMi5ibG9ja0NvbW1lbnQgPSB0Lmxhc3RCbG9ja0NvbW1lbnQoKTsKICAgICAgICAgICAgICAgIG4yLmluaXRpYWxpemVyID0gQXNzaWduRXhwcmVzc2lvbih0LCB4KTsKCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHR0ICE9PSBJREVOVElGSUVSKQogICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigibWlzc2luZyB2YXJpYWJsZSBuYW1lIik7CgogICAgICAgICAgICBuMiA9IG5ldyBOb2RlKHQsIHsgdHlwZTogSURFTlRJRklFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHQudG9rZW4udmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkT25seTogbi50eXBlID09PSBDT05TVCB9KTsKICAgICAgICAgICAgbi5wdXNoKG4yKTsKICAgICAgICAgICAgcy52YXJEZWNscy5wdXNoKG4yKTsKCiAgICAgICAgICAgIGlmICh0Lm1hdGNoKEFTU0lHTikpIHsKICAgICAgICAgICAgICAgIHZhciBjb21tZW50ID0gdC5sYXN0QmxvY2tDb21tZW50KCk7CiAgICAgICAgICAgICAgICBpZiAodC50b2tlbi5hc3NpZ25PcCkKICAgICAgICAgICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJJbnZhbGlkIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uIik7CgogICAgICAgICAgICAgICAgbjIuaW5pdGlhbGl6ZXIgPSBBc3NpZ25FeHByZXNzaW9uKHQsIHgpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFyIGNvbW1lbnQgPSB0Lmxhc3RCbG9ja0NvbW1lbnQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBuMi5ibG9ja0NvbW1lbnQgPSBjb21tZW50OwogICAgICAgIH0gd2hpbGUgKHQubWF0Y2goQ09NTUEpKTsKCiAgICAgICAgcmV0dXJuIG47CiAgICB9CgogICAgLyoKICAgICAqIExldEJsb2NrIDo6ICh0b2tlbml6ZXIsIGNvbXBpbGVyIGNvbnRleHQsIGJvb2xlYW4pIC0+IG5vZGUKICAgICAqCiAgICAgKiBEb2VzIG5vdCBoYW5kbGUgbGV0IGluc2lkZSBvZiBmb3IgbG9vcCBpbml0LgogICAgICovCiAgICBmdW5jdGlvbiBMZXRCbG9jayh0LCB4LCBpc1N0YXRlbWVudCkgewogICAgICAgIHZhciBuLCBuMjsKCiAgICAgICAgLy8gdC50b2tlbi50eXBlIG11c3QgYmUgTEVUCiAgICAgICAgbiA9IG5ldyBOb2RlKHQsIHsgdHlwZTogTEVUX0JMT0NLLCB2YXJEZWNsczogW10gfSk7CiAgICAgICAgdC5tdXN0TWF0Y2goTEVGVF9QQVJFTik7CiAgICAgICAgbi52YXJpYWJsZXMgPSBWYXJpYWJsZXModCwgeCwgbik7CiAgICAgICAgdC5tdXN0TWF0Y2goUklHSFRfUEFSRU4pOwoKICAgICAgICBpZiAoaXNTdGF0ZW1lbnQgJiYgdC5wZWVrKCkgIT09IExFRlRfQ1VSTFkpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogSWYgdGhpcyBpcyByZWFsbHkgYW4gZXhwcmVzc2lvbiBpbiBsZXQgc3RhdGVtZW50IGd1aXNlLCB0aGVuIHdlCiAgICAgICAgICAgICAqIG5lZWQgdG8gd3JhcCB0aGUgTEVUX0JMT0NLIG5vZGUgaW4gYSBTRU1JQ09MT04gbm9kZSBzbyB0aGF0IHdlIHBvcAogICAgICAgICAgICAgKiB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbjIgPSBuZXcgTm9kZSh0LCB7IHR5cGU6IFNFTUlDT0xPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IG4gfSk7CiAgICAgICAgICAgIGlzU3RhdGVtZW50ID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNTdGF0ZW1lbnQpCiAgICAgICAgICAgIG4uYmxvY2sgPSBCbG9jayh0LCB4KTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIG4uZXhwcmVzc2lvbiA9IEFzc2lnbkV4cHJlc3Npb24odCwgeCk7CgogICAgICAgIHJldHVybiBuOwogICAgfQoKICAgIGZ1bmN0aW9uIGNoZWNrRGVzdHJ1Y3R1cmluZyh0LCB4LCBuLCBzaW1wbGVOYW1lc09ubHkpIHsKICAgICAgICBpZiAobi50eXBlID09PSBBUlJBWV9DT01QKQogICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJJbnZhbGlkIGFycmF5IGNvbXByZWhlbnNpb24gbGVmdC1oYW5kIHNpZGUiKTsKICAgICAgICBpZiAobi50eXBlICE9PSBBUlJBWV9JTklUICYmIG4udHlwZSAhPT0gT0JKRUNUX0lOSVQpCiAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgdmFyIGxoc3MgPSB7fTsKICAgICAgICB2YXIgbm4sIG4yLCBpZHgsIHN1YiwgY2MsIGMgPSBuLmNoaWxkcmVuOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gYy5sZW5ndGg7IGkgPCBqOyBpKyspIHsKICAgICAgICAgICAgaWYgKCEobm4gPSBjW2ldKSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICBpZiAobm4udHlwZSA9PT0gUFJPUEVSVFlfSU5JVCkgewogICAgICAgICAgICAgICAgY2MgPSBubi5jaGlsZHJlbjsKICAgICAgICAgICAgICAgIHN1YiA9IGNjWzFdOwogICAgICAgICAgICAgICAgaWR4ID0gY2NbMF0udmFsdWU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobi50eXBlID09PSBPQkpFQ1RfSU5JVCkgewogICAgICAgICAgICAgICAgLy8gRG8gd2UgaGF2ZSBkZXN0cnVjdHVyaW5nIHNob3J0aGFuZCB7Zm9vLCBiYXJ9PwogICAgICAgICAgICAgICAgc3ViID0gbm47CiAgICAgICAgICAgICAgICBpZHggPSBubi52YWx1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHN1YiA9IG5uOwogICAgICAgICAgICAgICAgaWR4ID0gaTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHN1Yi50eXBlID09PSBBUlJBWV9JTklUIHx8IHN1Yi50eXBlID09PSBPQkpFQ1RfSU5JVCkgewogICAgICAgICAgICAgICAgbGhzc1tpZHhdID0gY2hlY2tEZXN0cnVjdHVyaW5nKHQsIHgsIHN1Yiwgc2ltcGxlTmFtZXNPbmx5KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChzaW1wbGVOYW1lc09ubHkgJiYgc3ViLnR5cGUgIT09IElERU5USUZJRVIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJbiBkZWNsYXJhdGlvbnMsIGxocyBtdXN0IGJlIHNpbXBsZSBuYW1lcwogICAgICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIm1pc3NpbmcgbmFtZSBpbiBwYXR0ZXJuIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbGhzc1tpZHhdID0gc3ViOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbGhzczsKICAgIH0KCiAgICBmdW5jdGlvbiBEZXN0cnVjdHVyaW5nRXhwcmVzc2lvbih0LCB4LCBzaW1wbGVOYW1lc09ubHkpIHsKICAgICAgICB2YXIgbiA9IFByaW1hcnlFeHByZXNzaW9uKHQsIHgpOwogICAgICAgIC8vIEtlZXAgdGhlIGxpc3Qgb2YgbGVmdGhhbmQgc2lkZXMgZm9yIHZhckRlY2xzCiAgICAgICAgbi5kZXN0cnVjdHVyZWROYW1lcyA9IGNoZWNrRGVzdHJ1Y3R1cmluZyh0LCB4LCBuLCBzaW1wbGVOYW1lc09ubHkpOwogICAgICAgIHJldHVybiBuOwogICAgfQoKICAgIGZ1bmN0aW9uIEdlbmVyYXRvckV4cHJlc3Npb24odCwgeCwgZSkgewogICAgICAgIHJldHVybiBuZXcgTm9kZSh0LCB7IHR5cGU6IEdFTkVSQVRPUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhaWw6IENvbXByZWhlbnNpb25UYWlsKHQsIHgpIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIENvbXByZWhlbnNpb25UYWlsKHQsIHgpIHsKICAgICAgICB2YXIgYm9keSwgbiwgbjIsIG4zLCBwOwoKICAgICAgICAvLyB0LnRva2VuLnR5cGUgbXVzdCBiZSBGT1IKICAgICAgICBib2R5ID0gbmV3IE5vZGUodCwgeyB0eXBlOiBDT01QX1RBSUwgfSk7CgogICAgICAgIGRvIHsKICAgICAgICAgICAgLy8gQ29tcHJlaGVuc2lvbiB0YWlscyBhcmUgYWx3YXlzIGZvci4uaW4gbG9vcHMuCiAgICAgICAgICAgIG4gPSBuZXcgTm9kZSh0LCB7IHR5cGU6IEZPUl9JTiwgaXNMb29wOiB0cnVlIH0pOwogICAgICAgICAgICBpZiAodC5tYXRjaChJREVOVElGSUVSKSkgewogICAgICAgICAgICAgICAgLy8gQnV0IHNvbWV0aW1lcyB0aGV5J3JlIGZvciBlYWNoLi5pbi4KICAgICAgICAgICAgICAgIGlmICh0LnRva2VuLnZhbHVlID09PSAiZWFjaCIpCiAgICAgICAgICAgICAgICAgICAgbi5pc0VhY2ggPSB0cnVlOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHQudW5nZXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwID0gTWF5YmVMZWZ0UGFyZW4odCwgeCk7CiAgICAgICAgICAgIHN3aXRjaCh0LmdldCgpKSB7CiAgICAgICAgICAgICAgY2FzZSBMRUZUX0JSQUNLRVQ6CiAgICAgICAgICAgICAgY2FzZSBMRUZUX0NVUkxZOgogICAgICAgICAgICAgICAgdC51bmdldCgpOwogICAgICAgICAgICAgICAgLy8gRGVzdHJ1Y3R1cmVkIGxlZnQgc2lkZSBvZiBmb3IgaW4gY29tcHJlaGVuc2lvbiB0YWlscy4KICAgICAgICAgICAgICAgIG4uaXRlcmF0b3IgPSBEZXN0cnVjdHVyaW5nRXhwcmVzc2lvbih0LCB4KTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICBjYXNlIElERU5USUZJRVI6CiAgICAgICAgICAgICAgICBuLml0ZXJhdG9yID0gbjMgPSBuZXcgTm9kZSh0LCB7IHR5cGU6IElERU5USUZJRVIgfSk7CiAgICAgICAgICAgICAgICBuMy5uYW1lID0gbjMudmFsdWU7CiAgICAgICAgICAgICAgICBuLnZhckRlY2wgPSBuMiA9IG5ldyBOb2RlKHQsIHsgdHlwZTogVkFSIH0pOwogICAgICAgICAgICAgICAgbjIucHVzaChuMyk7CiAgICAgICAgICAgICAgICB4LnBhcmVudFNjcmlwdC52YXJEZWNscy5wdXNoKG4zKTsKICAgICAgICAgICAgICAgIC8vIERvbid0IGFkZCB0byB2YXJEZWNscyBzaW5jZSB0aGUgc2VtYW50aWNzIG9mIGNvbXByZWhlbnNpb25zIGlzCiAgICAgICAgICAgICAgICAvLyBzdWNoIHRoYXQgdGhlIHZhcmlhYmxlcyBhcmUgaW4gdGhlaXIgb3duIGZ1bmN0aW9uIHdoZW4KICAgICAgICAgICAgICAgIC8vIGRlc3VnYXJlZC4KICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigibWlzc2luZyBpZGVudGlmaWVyIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdC5tdXN0TWF0Y2goSU4pOwogICAgICAgICAgICBuLm9iamVjdCA9IEV4cHJlc3Npb24odCwgeCk7CiAgICAgICAgICAgIE1heWJlUmlnaHRQYXJlbih0LCBwKTsKICAgICAgICAgICAgYm9keS5wdXNoKG4pOwogICAgICAgIH0gd2hpbGUgKHQubWF0Y2goRk9SKSk7CgogICAgICAgIC8vIE9wdGlvbmFsIGd1YXJkLgogICAgICAgIGlmICh0Lm1hdGNoKElGKSkKICAgICAgICAgICAgYm9keS5ndWFyZCA9IEhlYWRFeHByZXNzaW9uKHQsIHgpOwoKICAgICAgICByZXR1cm4gYm9keTsKICAgIH0KCiAgICBmdW5jdGlvbiBIZWFkRXhwcmVzc2lvbih0LCB4KSB7CiAgICAgICAgdmFyIHAgPSBNYXliZUxlZnRQYXJlbih0LCB4KTsKICAgICAgICB2YXIgbiA9IFBhcmVuRXhwcmVzc2lvbih0LCB4KTsKICAgICAgICBNYXliZVJpZ2h0UGFyZW4odCwgcCk7CiAgICAgICAgaWYgKHAgPT09IEVORCAmJiAhbi5wYXJlbnRoZXNpemVkKSB7CiAgICAgICAgICAgIHZhciB0dCA9IHQucGVlaygpOwogICAgICAgICAgICBpZiAodHQgIT09IExFRlRfQ1VSTFkgJiYgIWRlZmluaXRpb25zLmlzU3RhdGVtZW50U3RhcnRDb2RlW3R0XSkKICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIlVucGFyZW50aGVzaXplZCBoZWFkIGZvbGxvd2VkIGJ5IHVuYnJhY2VkIGJvZHkiKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG47CiAgICB9CgogICAgZnVuY3Rpb24gUGFyZW5FeHByZXNzaW9uKHQsIHgpIHsKICAgICAgICAvLyBBbHdheXMgYWNjZXB0IHRoZSAnaW4nIG9wZXJhdG9yIGluIGEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uLAogICAgICAgIC8vIHdoZXJlIGl0J3MgdW5hbWJpZ3VvdXMsIGV2ZW4gaWYgd2UgbWlnaHQgYmUgcGFyc2luZyB0aGUgaW5pdCBvZiBhCiAgICAgICAgLy8gZm9yIHN0YXRlbWVudC4KICAgICAgICB2YXIgbiA9IEV4cHJlc3Npb24odCwgeC51cGRhdGUoeyBpbkZvckxvb3BJbml0OiB4LmluRm9yTG9vcEluaXQgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodC50b2tlbi50eXBlID09PSBMRUZUX1BBUkVOKSB9KSk7CgogICAgICAgIGlmICh0Lm1hdGNoKEZPUikpIHsKICAgICAgICAgICAgaWYgKG4udHlwZSA9PT0gWUlFTEQgJiYgIW4ucGFyZW50aGVzaXplZCkKICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIllpZWxkIGV4cHJlc3Npb24gbXVzdCBiZSBwYXJlbnRoZXNpemVkIik7CiAgICAgICAgICAgIGlmIChuLnR5cGUgPT09IENPTU1BICYmICFuLnBhcmVudGhlc2l6ZWQpCiAgICAgICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJHZW5lcmF0b3IgZXhwcmVzc2lvbiBtdXN0IGJlIHBhcmVudGhlc2l6ZWQiKTsKICAgICAgICAgICAgbiA9IEdlbmVyYXRvckV4cHJlc3Npb24odCwgeCwgbik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbjsKICAgIH0KCiAgICAvKgogICAgICogRXhwcmVzc2lvbiA6OiAodG9rZW5pemVyLCBjb21waWxlciBjb250ZXh0KSAtPiBub2RlCiAgICAgKgogICAgICogVG9wLWRvd24gZXhwcmVzc2lvbiBwYXJzZXIgbWF0Y2hlZCBhZ2FpbnN0IFNwaWRlck1vbmtleS4KICAgICAqLwogICAgZnVuY3Rpb24gRXhwcmVzc2lvbih0LCB4KSB7CiAgICAgICAgdmFyIG4sIG4yOwoKICAgICAgICBuID0gQXNzaWduRXhwcmVzc2lvbih0LCB4KTsKICAgICAgICBpZiAodC5tYXRjaChDT01NQSkpIHsKICAgICAgICAgICAgbjIgPSBuZXcgTm9kZSh0LCB7IHR5cGU6IENPTU1BIH0pOwogICAgICAgICAgICBuMi5wdXNoKG4pOwogICAgICAgICAgICBuID0gbjI7CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgIG4yID0gbi5jaGlsZHJlbltuLmNoaWxkcmVuLmxlbmd0aC0xXTsKICAgICAgICAgICAgICAgIGlmIChuMi50eXBlID09PSBZSUVMRCAmJiAhbjIucGFyZW50aGVzaXplZCkKICAgICAgICAgICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJZaWVsZCBleHByZXNzaW9uIG11c3QgYmUgcGFyZW50aGVzaXplZCIpOwogICAgICAgICAgICAgICAgbi5wdXNoKEFzc2lnbkV4cHJlc3Npb24odCwgeCkpOwogICAgICAgICAgICB9IHdoaWxlICh0Lm1hdGNoKENPTU1BKSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbjsKICAgIH0KCiAgICBmdW5jdGlvbiBBc3NpZ25FeHByZXNzaW9uKHQsIHgpIHsKICAgICAgICB2YXIgbiwgbGhzOwoKICAgICAgICAvLyBIYXZlIHRvIHRyZWF0IHlpZWxkIGxpa2UgYW4gb3BlcmFuZCBiZWNhdXNlIGl0IGNvdWxkIGJlIHRoZSBsZWZ0bW9zdAogICAgICAgIC8vIG9wZXJhbmQgb2YgdGhlIGV4cHJlc3Npb24uCiAgICAgICAgaWYgKHQubWF0Y2goWUlFTEQsIHRydWUpKQogICAgICAgICAgICByZXR1cm4gUmV0dXJuT3JZaWVsZCh0LCB4KTsKCiAgICAgICAgbiA9IG5ldyBOb2RlKHQsIHsgdHlwZTogQVNTSUdOIH0pOwogICAgICAgIGxocyA9IENvbmRpdGlvbmFsRXhwcmVzc2lvbih0LCB4KTsKCiAgICAgICAgaWYgKCF0Lm1hdGNoKEFTU0lHTikpIHsKICAgICAgICAgICAgcmV0dXJuIGxoczsKICAgICAgICB9CgogICAgICAgIG4uYmxvY2tDb21tZW50ID0gdC5sYXN0QmxvY2tDb21tZW50KCk7CgogICAgICAgIHN3aXRjaCAobGhzLnR5cGUpIHsKICAgICAgICAgIGNhc2UgT0JKRUNUX0lOSVQ6CiAgICAgICAgICBjYXNlIEFSUkFZX0lOSVQ6CiAgICAgICAgICAgIGxocy5kZXN0cnVjdHVyZWROYW1lcyA9IGNoZWNrRGVzdHJ1Y3R1cmluZyh0LCB4LCBsaHMpOwogICAgICAgICAgICAvLyBGQUxMIFRIUk9VR0gKICAgICAgICAgIGNhc2UgSURFTlRJRklFUjogY2FzZSBET1Q6IGNhc2UgSU5ERVg6IGNhc2UgQ0FMTDoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJCYWQgbGVmdC1oYW5kIHNpZGUgb2YgYXNzaWdubWVudCIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIG4uYXNzaWduT3AgPSBsaHMuYXNzaWduT3AgPSB0LnRva2VuLmFzc2lnbk9wOwogICAgICAgIG4ucHVzaChsaHMpOwogICAgICAgIG4ucHVzaChBc3NpZ25FeHByZXNzaW9uKHQsIHgpKTsKCiAgICAgICAgcmV0dXJuIG47CiAgICB9CgogICAgZnVuY3Rpb24gQ29uZGl0aW9uYWxFeHByZXNzaW9uKHQsIHgpIHsKICAgICAgICB2YXIgbiwgbjI7CgogICAgICAgIG4gPSBPckV4cHJlc3Npb24odCwgeCk7CiAgICAgICAgaWYgKHQubWF0Y2goSE9PSykpIHsKICAgICAgICAgICAgbjIgPSBuOwogICAgICAgICAgICBuID0gbmV3IE5vZGUodCwgeyB0eXBlOiBIT09LIH0pOwogICAgICAgICAgICBuLnB1c2gobjIpOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBBbHdheXMgYWNjZXB0IHRoZSAnaW4nIG9wZXJhdG9yIGluIHRoZSBtaWRkbGUgY2xhdXNlIG9mIGEgdGVybmFyeSwKICAgICAgICAgICAgICogd2hlcmUgaXQncyB1bmFtYmlndW91cywgZXZlbiBpZiB3ZSBtaWdodCBiZSBwYXJzaW5nIHRoZSBpbml0IG9mIGEKICAgICAgICAgICAgICogZm9yIHN0YXRlbWVudC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG4ucHVzaChBc3NpZ25FeHByZXNzaW9uKHQsIHgudXBkYXRlKHsgaW5Gb3JMb29wSW5pdDogZmFsc2UgfSkpKTsKICAgICAgICAgICAgaWYgKCF0Lm1hdGNoKENPTE9OKSkKICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIm1pc3NpbmcgOiBhZnRlciA/Iik7CiAgICAgICAgICAgIG4ucHVzaChBc3NpZ25FeHByZXNzaW9uKHQsIHgpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuOwogICAgfQoKICAgIGZ1bmN0aW9uIE9yRXhwcmVzc2lvbih0LCB4KSB7CiAgICAgICAgdmFyIG4sIG4yOwoKICAgICAgICBuID0gQW5kRXhwcmVzc2lvbih0LCB4KTsKICAgICAgICB3aGlsZSAodC5tYXRjaChPUikpIHsKICAgICAgICAgICAgbjIgPSBuZXcgTm9kZSh0KTsKICAgICAgICAgICAgbjIucHVzaChuKTsKICAgICAgICAgICAgbjIucHVzaChBbmRFeHByZXNzaW9uKHQsIHgpKTsKICAgICAgICAgICAgbiA9IG4yOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG47CiAgICB9CgogICAgZnVuY3Rpb24gQW5kRXhwcmVzc2lvbih0LCB4KSB7CiAgICAgICAgdmFyIG4sIG4yOwoKICAgICAgICBuID0gQml0d2lzZU9yRXhwcmVzc2lvbih0LCB4KTsKICAgICAgICB3aGlsZSAodC5tYXRjaChBTkQpKSB7CiAgICAgICAgICAgIG4yID0gbmV3IE5vZGUodCk7CiAgICAgICAgICAgIG4yLnB1c2gobik7CiAgICAgICAgICAgIG4yLnB1c2goQml0d2lzZU9yRXhwcmVzc2lvbih0LCB4KSk7CiAgICAgICAgICAgIG4gPSBuMjsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuOwogICAgfQoKICAgIGZ1bmN0aW9uIEJpdHdpc2VPckV4cHJlc3Npb24odCwgeCkgewogICAgICAgIHZhciBuLCBuMjsKCiAgICAgICAgbiA9IEJpdHdpc2VYb3JFeHByZXNzaW9uKHQsIHgpOwogICAgICAgIHdoaWxlICh0Lm1hdGNoKEJJVFdJU0VfT1IpKSB7CiAgICAgICAgICAgIG4yID0gbmV3IE5vZGUodCk7CiAgICAgICAgICAgIG4yLnB1c2gobik7CiAgICAgICAgICAgIG4yLnB1c2goQml0d2lzZVhvckV4cHJlc3Npb24odCwgeCkpOwogICAgICAgICAgICBuID0gbjI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbjsKICAgIH0KCiAgICBmdW5jdGlvbiBCaXR3aXNlWG9yRXhwcmVzc2lvbih0LCB4KSB7CiAgICAgICAgdmFyIG4sIG4yOwoKICAgICAgICBuID0gQml0d2lzZUFuZEV4cHJlc3Npb24odCwgeCk7CiAgICAgICAgd2hpbGUgKHQubWF0Y2goQklUV0lTRV9YT1IpKSB7CiAgICAgICAgICAgIG4yID0gbmV3IE5vZGUodCk7CiAgICAgICAgICAgIG4yLnB1c2gobik7CiAgICAgICAgICAgIG4yLnB1c2goQml0d2lzZUFuZEV4cHJlc3Npb24odCwgeCkpOwogICAgICAgICAgICBuID0gbjI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbjsKICAgIH0KCiAgICBmdW5jdGlvbiBCaXR3aXNlQW5kRXhwcmVzc2lvbih0LCB4KSB7CiAgICAgICAgdmFyIG4sIG4yOwoKICAgICAgICBuID0gRXF1YWxpdHlFeHByZXNzaW9uKHQsIHgpOwogICAgICAgIHdoaWxlICh0Lm1hdGNoKEJJVFdJU0VfQU5EKSkgewogICAgICAgICAgICBuMiA9IG5ldyBOb2RlKHQpOwogICAgICAgICAgICBuMi5wdXNoKG4pOwogICAgICAgICAgICBuMi5wdXNoKEVxdWFsaXR5RXhwcmVzc2lvbih0LCB4KSk7CiAgICAgICAgICAgIG4gPSBuMjsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuOwogICAgfQoKICAgIGZ1bmN0aW9uIEVxdWFsaXR5RXhwcmVzc2lvbih0LCB4KSB7CiAgICAgICAgdmFyIG4sIG4yOwoKICAgICAgICBuID0gUmVsYXRpb25hbEV4cHJlc3Npb24odCwgeCk7CiAgICAgICAgd2hpbGUgKHQubWF0Y2goRVEpIHx8IHQubWF0Y2goTkUpIHx8CiAgICAgICAgICAgICAgIHQubWF0Y2goU1RSSUNUX0VRKSB8fCB0Lm1hdGNoKFNUUklDVF9ORSkpIHsKICAgICAgICAgICAgbjIgPSBuZXcgTm9kZSh0KTsKICAgICAgICAgICAgbjIucHVzaChuKTsKICAgICAgICAgICAgbjIucHVzaChSZWxhdGlvbmFsRXhwcmVzc2lvbih0LCB4KSk7CiAgICAgICAgICAgIG4gPSBuMjsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuOwogICAgfQoKICAgIGZ1bmN0aW9uIFJlbGF0aW9uYWxFeHByZXNzaW9uKHQsIHgpIHsKICAgICAgICB2YXIgbiwgbjI7CgogICAgICAgIC8qCiAgICAgICAgICogVXNlcyBvZiB0aGUgaW4gb3BlcmF0b3IgaW4gc2hpZnRFeHBycyBhcmUgYWx3YXlzIHVuYW1iaWd1b3VzLAogICAgICAgICAqIHNvIHVuc2V0IHRoZSBmbGFnIHRoYXQgcHJvaGliaXRzIHJlY29nbml6aW5nIGl0LgogICAgICAgICAqLwogICAgICAgIHZhciB4MiA9IHgudXBkYXRlKHsgaW5Gb3JMb29wSW5pdDogZmFsc2UgfSk7CiAgICAgICAgbiA9IFNoaWZ0RXhwcmVzc2lvbih0LCB4Mik7CiAgICAgICAgd2hpbGUgKCh0Lm1hdGNoKExUKSB8fCB0Lm1hdGNoKExFKSB8fCB0Lm1hdGNoKEdFKSB8fCB0Lm1hdGNoKEdUKSB8fAogICAgICAgICAgICAgICAoIXguaW5Gb3JMb29wSW5pdCAmJiB0Lm1hdGNoKElOKSkgfHwKICAgICAgICAgICAgICAgdC5tYXRjaChJTlNUQU5DRU9GKSkpIHsKICAgICAgICAgICAgbjIgPSBuZXcgTm9kZSh0KTsKICAgICAgICAgICAgbjIucHVzaChuKTsKICAgICAgICAgICAgbjIucHVzaChTaGlmdEV4cHJlc3Npb24odCwgeDIpKTsKICAgICAgICAgICAgbiA9IG4yOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG47CiAgICB9CgogICAgZnVuY3Rpb24gU2hpZnRFeHByZXNzaW9uKHQsIHgpIHsKICAgICAgICB2YXIgbiwgbjI7CgogICAgICAgIG4gPSBBZGRFeHByZXNzaW9uKHQsIHgpOwogICAgICAgIHdoaWxlICh0Lm1hdGNoKExTSCkgfHwgdC5tYXRjaChSU0gpIHx8IHQubWF0Y2goVVJTSCkpIHsKICAgICAgICAgICAgbjIgPSBuZXcgTm9kZSh0KTsKICAgICAgICAgICAgbjIucHVzaChuKTsKICAgICAgICAgICAgbjIucHVzaChBZGRFeHByZXNzaW9uKHQsIHgpKTsKICAgICAgICAgICAgbiA9IG4yOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG47CiAgICB9CgogICAgZnVuY3Rpb24gQWRkRXhwcmVzc2lvbih0LCB4KSB7CiAgICAgICAgdmFyIG4sIG4yOwoKICAgICAgICBuID0gTXVsdGlwbHlFeHByZXNzaW9uKHQsIHgpOwogICAgICAgIHdoaWxlICh0Lm1hdGNoKFBMVVMpIHx8IHQubWF0Y2goTUlOVVMpKSB7CiAgICAgICAgICAgIG4yID0gbmV3IE5vZGUodCk7CiAgICAgICAgICAgIG4yLnB1c2gobik7CiAgICAgICAgICAgIG4yLnB1c2goTXVsdGlwbHlFeHByZXNzaW9uKHQsIHgpKTsKICAgICAgICAgICAgbiA9IG4yOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG47CiAgICB9CgogICAgZnVuY3Rpb24gTXVsdGlwbHlFeHByZXNzaW9uKHQsIHgpIHsKICAgICAgICB2YXIgbiwgbjI7CgogICAgICAgIG4gPSBVbmFyeUV4cHJlc3Npb24odCwgeCk7CiAgICAgICAgd2hpbGUgKHQubWF0Y2goTVVMKSB8fCB0Lm1hdGNoKERJVikgfHwgdC5tYXRjaChNT0QpKSB7CiAgICAgICAgICAgIG4yID0gbmV3IE5vZGUodCk7CiAgICAgICAgICAgIG4yLnB1c2gobik7CiAgICAgICAgICAgIG4yLnB1c2goVW5hcnlFeHByZXNzaW9uKHQsIHgpKTsKICAgICAgICAgICAgbiA9IG4yOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG47CiAgICB9CgogICAgZnVuY3Rpb24gVW5hcnlFeHByZXNzaW9uKHQsIHgpIHsKICAgICAgICB2YXIgbiwgbjIsIHR0OwoKICAgICAgICBzd2l0Y2ggKHR0ID0gdC5nZXQodHJ1ZSkpIHsKICAgICAgICAgIGNhc2UgREVMRVRFOiBjYXNlIFZPSUQ6IGNhc2UgVFlQRU9GOgogICAgICAgICAgY2FzZSBOT1Q6IGNhc2UgQklUV0lTRV9OT1Q6IGNhc2UgUExVUzogY2FzZSBNSU5VUzoKICAgICAgICAgICAgaWYgKHR0ID09PSBQTFVTKQogICAgICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQsIHsgdHlwZTogVU5BUllfUExVUyB9KTsKICAgICAgICAgICAgZWxzZSBpZiAodHQgPT09IE1JTlVTKQogICAgICAgICAgICAgICAgbiA9IG5ldyBOb2RlKHQsIHsgdHlwZTogVU5BUllfTUlOVVMgfSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIG4gPSBuZXcgTm9kZSh0KTsKICAgICAgICAgICAgbi5wdXNoKFVuYXJ5RXhwcmVzc2lvbih0LCB4KSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgSU5DUkVNRU5UOgogICAgICAgICAgY2FzZSBERUNSRU1FTlQ6CiAgICAgICAgICAgIC8vIFByZWZpeCBpbmNyZW1lbnQvZGVjcmVtZW50LgogICAgICAgICAgICBuID0gbmV3IE5vZGUodCk7CiAgICAgICAgICAgIG4ucHVzaChNZW1iZXJFeHByZXNzaW9uKHQsIHgsIHRydWUpKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdC51bmdldCgpOwogICAgICAgICAgICBuID0gTWVtYmVyRXhwcmVzc2lvbih0LCB4LCB0cnVlKTsKCiAgICAgICAgICAgIC8vIERvbid0IGxvb2sgYWNyb3NzIGEgbmV3bGluZSBib3VuZGFyeSBmb3IgYSBwb3N0Zml4IHtpbixkZX1jcmVtZW50LgogICAgICAgICAgICBpZiAodC50b2tlbnNbKHQudG9rZW5JbmRleCArIHQubG9va2FoZWFkIC0gMSkgJiAzXS5saW5lbm8gPT09CiAgICAgICAgICAgICAgICB0LmxpbmVubykgewogICAgICAgICAgICAgICAgaWYgKHQubWF0Y2goSU5DUkVNRU5UKSB8fCB0Lm1hdGNoKERFQ1JFTUVOVCkpIHsKICAgICAgICAgICAgICAgICAgICBuMiA9IG5ldyBOb2RlKHQsIHsgcG9zdGZpeDogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgICAgICBuMi5wdXNoKG4pOwogICAgICAgICAgICAgICAgICAgIG4gPSBuMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuOwogICAgfQoKICAgIGZ1bmN0aW9uIE1lbWJlckV4cHJlc3Npb24odCwgeCwgYWxsb3dDYWxsU3ludGF4KSB7CiAgICAgICAgdmFyIG4sIG4yLCBuYW1lLCB0dDsKCiAgICAgICAgaWYgKHQubWF0Y2goTkVXKSkgewogICAgICAgICAgICBuID0gbmV3IE5vZGUodCk7CiAgICAgICAgICAgIG4ucHVzaChNZW1iZXJFeHByZXNzaW9uKHQsIHgsIGZhbHNlKSk7CiAgICAgICAgICAgIGlmICh0Lm1hdGNoKExFRlRfUEFSRU4pKSB7CiAgICAgICAgICAgICAgICBuLnR5cGUgPSBORVdfV0lUSF9BUkdTOwogICAgICAgICAgICAgICAgbi5wdXNoKEFyZ3VtZW50TGlzdCh0LCB4KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBuID0gUHJpbWFyeUV4cHJlc3Npb24odCwgeCk7CiAgICAgICAgfQoKICAgICAgICB3aGlsZSAoKHR0ID0gdC5nZXQoKSkgIT09IEVORCkgewogICAgICAgICAgICBzd2l0Y2ggKHR0KSB7CiAgICAgICAgICAgICAgY2FzZSBET1Q6CiAgICAgICAgICAgICAgICBuMiA9IG5ldyBOb2RlKHQpOwogICAgICAgICAgICAgICAgbjIucHVzaChuKTsKICAgICAgICAgICAgICAgIG4yLnB1c2goSWRlbnRpZmllck5hbWUodCkpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgIGNhc2UgTEVGVF9CUkFDS0VUOgogICAgICAgICAgICAgICAgbjIgPSBuZXcgTm9kZSh0LCB7IHR5cGU6IElOREVYIH0pOwogICAgICAgICAgICAgICAgbjIucHVzaChuKTsKICAgICAgICAgICAgICAgIG4yLnB1c2goRXhwcmVzc2lvbih0LCB4KSk7CiAgICAgICAgICAgICAgICB0Lm11c3RNYXRjaChSSUdIVF9CUkFDS0VUKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICBjYXNlIExFRlRfUEFSRU46CiAgICAgICAgICAgICAgICBpZiAoYWxsb3dDYWxsU3ludGF4KSB7CiAgICAgICAgICAgICAgICAgICAgbjIgPSBuZXcgTm9kZSh0LCB7IHR5cGU6IENBTEwgfSk7CiAgICAgICAgICAgICAgICAgICAgbjIucHVzaChuKTsKICAgICAgICAgICAgICAgICAgICBuMi5wdXNoKEFyZ3VtZW50TGlzdCh0LCB4KSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gRkFMTCBUSFJPVUdICiAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHQudW5nZXQoKTsKICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBuID0gbjI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbjsKICAgIH0KCiAgICBmdW5jdGlvbiBBcmd1bWVudExpc3QodCwgeCkgewogICAgICAgIHZhciBuLCBuMjsKCiAgICAgICAgbiA9IG5ldyBOb2RlKHQsIHsgdHlwZTogTElTVCB9KTsKICAgICAgICBpZiAodC5tYXRjaChSSUdIVF9QQVJFTiwgdHJ1ZSkpCiAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgIGRvIHsKICAgICAgICAgICAgbjIgPSBBc3NpZ25FeHByZXNzaW9uKHQsIHgpOwogICAgICAgICAgICBpZiAobjIudHlwZSA9PT0gWUlFTEQgJiYgIW4yLnBhcmVudGhlc2l6ZWQgJiYgdC5wZWVrKCkgPT09IENPTU1BKQogICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiWWllbGQgZXhwcmVzc2lvbiBtdXN0IGJlIHBhcmVudGhlc2l6ZWQiKTsKICAgICAgICAgICAgaWYgKHQubWF0Y2goRk9SKSkgewogICAgICAgICAgICAgICAgbjIgPSBHZW5lcmF0b3JFeHByZXNzaW9uKHQsIHgsIG4yKTsKICAgICAgICAgICAgICAgIGlmIChuLmNoaWxkcmVuLmxlbmd0aCA+IDEgfHwgdC5wZWVrKHRydWUpID09PSBDT01NQSkKICAgICAgICAgICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJHZW5lcmF0b3IgZXhwcmVzc2lvbiBtdXN0IGJlIHBhcmVudGhlc2l6ZWQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBuLnB1c2gobjIpOwogICAgICAgIH0gd2hpbGUgKHQubWF0Y2goQ09NTUEpKTsKICAgICAgICB0Lm11c3RNYXRjaChSSUdIVF9QQVJFTik7CgogICAgICAgIHJldHVybiBuOwogICAgfQoKICAgIGZ1bmN0aW9uIFByaW1hcnlFeHByZXNzaW9uKHQsIHgpIHsKICAgICAgICB2YXIgbiwgbjIsIHR0ID0gdC5nZXQodHJ1ZSk7CgogICAgICAgIHN3aXRjaCAodHQpIHsKICAgICAgICAgIGNhc2UgRlVOQ1RJT046CiAgICAgICAgICAgIG4gPSBGdW5jdGlvbkRlZmluaXRpb24odCwgeCwgZmFsc2UsIEVYUFJFU1NFRF9GT1JNKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgY2FzZSBMRUZUX0JSQUNLRVQ6CiAgICAgICAgICAgIG4gPSBuZXcgTm9kZSh0LCB7IHR5cGU6IEFSUkFZX0lOSVQgfSk7CiAgICAgICAgICAgIHdoaWxlICgodHQgPSB0LnBlZWsodHJ1ZSkpICE9PSBSSUdIVF9CUkFDS0VUKSB7CiAgICAgICAgICAgICAgICBpZiAodHQgPT09IENPTU1BKSB7CiAgICAgICAgICAgICAgICAgICAgdC5nZXQoKTsKICAgICAgICAgICAgICAgICAgICBuLnB1c2gobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBuLnB1c2goQXNzaWduRXhwcmVzc2lvbih0LCB4KSk7CiAgICAgICAgICAgICAgICBpZiAodHQgIT09IENPTU1BICYmICF0Lm1hdGNoKENPTU1BKSkKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gSWYgd2UgbWF0Y2hlZCBleGFjdGx5IG9uZSBlbGVtZW50IGFuZCBnb3QgYSBGT1IsIHdlIGhhdmUgYW4KICAgICAgICAgICAgLy8gYXJyYXkgY29tcHJlaGVuc2lvbi4KICAgICAgICAgICAgaWYgKG4uY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIHQubWF0Y2goRk9SKSkgewogICAgICAgICAgICAgICAgbjIgPSBuZXcgTm9kZSh0LCB7IHR5cGU6IEFSUkFZX0NPTVAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogbi5jaGlsZHJlblswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWlsOiBDb21wcmVoZW5zaW9uVGFpbCh0LCB4KSB9KTsKICAgICAgICAgICAgICAgIG4gPSBuMjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0Lm11c3RNYXRjaChSSUdIVF9CUkFDS0VUKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgY2FzZSBMRUZUX0NVUkxZOgogICAgICAgICAgICB2YXIgaWQsIGZkOwogICAgICAgICAgICBuID0gbmV3IE5vZGUodCwgeyB0eXBlOiBPQkpFQ1RfSU5JVCB9KTsKCiAgICAgICAgICBvYmplY3RfaW5pdDoKICAgICAgICAgICAgaWYgKCF0Lm1hdGNoKFJJR0hUX0NVUkxZKSkgewogICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgIHR0ID0gdC5nZXQoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKHQudG9rZW4udmFsdWUgPT09ICJnZXQiIHx8IHQudG9rZW4udmFsdWUgPT09ICJzZXQiKSAmJgogICAgICAgICAgICAgICAgICAgICAgICB0LnBlZWsoKSA9PT0gSURFTlRJRklFUikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoeC5lY21hM09ubHlNb2RlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgdC5uZXdTeW50YXhFcnJvcigiSWxsZWdhbCBwcm9wZXJ0eSBhY2Nlc3NvciIpOwogICAgICAgICAgICAgICAgICAgICAgICBuLnB1c2goRnVuY3Rpb25EZWZpbml0aW9uKHQsIHgsIHRydWUsIEVYUFJFU1NFRF9GT1JNKSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbW1lbnRzID0gdC5ibG9ja0NvbW1lbnRzOwogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHR0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJREVOVElGSUVSOiBjYXNlIE5VTUJFUjogY2FzZSBTVFJJTkc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCA9IG5ldyBOb2RlKHQsIHsgdHlwZTogSURFTlRJRklFUiB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUklHSFRfQ1VSTFk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeC5lY21hM09ubHlNb2RlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIklsbGVnYWwgdHJhaWxpbmcgLCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgb2JqZWN0X2luaXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LnRva2VuLnZhbHVlIGluIGRlZmluaXRpb25zLmtleXdvcmRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSBuZXcgTm9kZSh0LCB7IHR5cGU6IElERU5USUZJRVIgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJJbnZhbGlkIHByb3BlcnR5IG5hbWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5tYXRjaChDT0xPTikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4yID0gbmV3IE5vZGUodCwgeyB0eXBlOiBQUk9QRVJUWV9JTklUIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbjIucHVzaChpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuMi5wdXNoKEFzc2lnbkV4cHJlc3Npb24odCwgeCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbjIuYmxvY2tDb21tZW50cyA9IGNvbW1lbnRzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5wdXNoKG4yKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQsIGUuZy4sIHx2YXIge3gsIHl9ID0gb3wgYXMgZGVzdHJ1Y3R1cmluZyBzaG9ydGhhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB8dmFyIHt4OiB4LCB5OiB5fSA9IG98LCBwZXIgcHJvcG9zZWQgSlMyL0VTNCBmb3IgSlMxLjguCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5wZWVrKCkgIT09IENPTU1BICYmIHQucGVlaygpICE9PSBSSUdIVF9DVVJMWSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJtaXNzaW5nIDogYWZ0ZXIgcHJvcGVydHkiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ucHVzaChpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IHdoaWxlICh0Lm1hdGNoKENPTU1BKSk7CiAgICAgICAgICAgICAgICB0Lm11c3RNYXRjaChSSUdIVF9DVVJMWSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgY2FzZSBMRUZUX1BBUkVOOgogICAgICAgICAgICBuID0gUGFyZW5FeHByZXNzaW9uKHQsIHgpOwogICAgICAgICAgICB0Lm11c3RNYXRjaChSSUdIVF9QQVJFTik7CiAgICAgICAgICAgIG4ucGFyZW50aGVzaXplZCA9IHRydWU7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgTEVUOgogICAgICAgICAgICBuID0gTGV0QmxvY2sodCwgeCwgZmFsc2UpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBjYXNlIE5VTEw6IGNhc2UgVEhJUzogY2FzZSBUUlVFOiBjYXNlIEZBTFNFOgogICAgICAgICAgY2FzZSBJREVOVElGSUVSOiBjYXNlIE5VTUJFUjogY2FzZSBTVFJJTkc6IGNhc2UgUkVHRVhQOgogICAgICAgICAgICBuID0gbmV3IE5vZGUodCk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHRocm93IHQubmV3U3ludGF4RXJyb3IoIm1pc3Npbmcgb3BlcmFuZCIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuOwogICAgfQoKICAgIC8qCiAgICAgKiBwYXJzZSA6OiAoc291cmNlLCBmaWxlbmFtZSwgbGluZSBudW1iZXIpIC0+IG5vZGUKICAgICAqLwogICAgZnVuY3Rpb24gcGFyc2UocywgZiwgbCkgewogICAgICAgIHZhciB0ID0gbmV3IGxleGVyLlRva2VuaXplcihzLCBmLCBsKTsKICAgICAgICB2YXIgbiA9IFNjcmlwdCh0LCBmYWxzZSwgZmFsc2UpOwogICAgICAgIGlmICghdC5kb25lKQogICAgICAgICAgICB0aHJvdyB0Lm5ld1N5bnRheEVycm9yKCJTeW50YXggZXJyb3IiKTsKCiAgICAgICAgcmV0dXJuIG47CiAgICB9CgogICAgLyoKICAgICAqIHBhcnNlU3RkaW4gOjogKHNvdXJjZSwge2xpbmUgbnVtYmVyfSwgc3RyaW5nLCAoc3RyaW5nKSAtPiBib29sZWFuKSAtPiBwcm9ncmFtIG5vZGUKICAgICAqLwogICAgZnVuY3Rpb24gcGFyc2VTdGRpbihzLCBsbiwgcHJlZml4LCBpc0NvbW1hbmQpIHsKICAgICAgICAvLyB0aGUgc3BlY2lhbCAuYmVnaW4gY29tbWFuZCBpcyBvbmx5IHJlY29nbml6ZWQgYXQgdGhlIGJlZ2lubmluZwogICAgICAgIGlmIChzLm1hdGNoKC9eW1xzXSpcLmJlZ2luW1xzXSokLykpIHsKICAgICAgICAgICAgKytsbi52YWx1ZTsKICAgICAgICAgICAgcmV0dXJuIHBhcnNlTXVsdGlsaW5lKGxuLCBwcmVmaXgpOwogICAgICAgIH0KCiAgICAgICAgLy8gY29tbWFuZHMgYXQgdGhlIGJlZ2lubmluZyBhcmUgdHJlYXRlZCBhcyB0aGUgZW50aXJlIGlucHV0CiAgICAgICAgaWYgKGlzQ29tbWFuZChzLnRyaW0oKSkpCiAgICAgICAgICAgIHMgPSAiIjsKCiAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdmFyIHQgPSBuZXcgbGV4ZXIuVG9rZW5pemVyKHMsICJzdGRpbiIsIGxuLnZhbHVlKTsKICAgICAgICAgICAgICAgIHZhciBuID0gU2NyaXB0KHQsIGZhbHNlLCBmYWxzZSk7CiAgICAgICAgICAgICAgICBsbi52YWx1ZSA9IHQubGluZW5vOwogICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIGlmICghdC51bmV4cGVjdGVkRU9GKQogICAgICAgICAgICAgICAgICAgIHRocm93IGU7CgogICAgICAgICAgICAgICAgLy8gY29tbWFuZHMgaW4gdGhlIG1pZGRsZSBhcmUgbm90IHRyZWF0ZWQgYXMgcGFydCBvZiB0aGUgaW5wdXQKICAgICAgICAgICAgICAgIHZhciBtb3JlOwogICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgpCiAgICAgICAgICAgICAgICAgICAgICAgIHB1dHN0cihwcmVmaXgpOwogICAgICAgICAgICAgICAgICAgIG1vcmUgPSByZWFkbGluZSgpOwogICAgICAgICAgICAgICAgICAgIGlmICghbW9yZSkKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKGlzQ29tbWFuZChtb3JlLnRyaW0oKSkpOwoKICAgICAgICAgICAgICAgIHMgKz0gIlxuIiArIG1vcmU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoKICAgICAqIHBhcnNlTXVsdGlsaW5lIDo6ICh7bGluZSBudW1iZXJ9LCBzdHJpbmcgfCBudWxsKSAtPiBwcm9ncmFtIG5vZGUKICAgICAqLwogICAgZnVuY3Rpb24gcGFyc2VNdWx0aWxpbmUobG4sIHByZWZpeCkgewogICAgICAgIHZhciBzID0gIiI7CiAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICBpZiAocHJlZml4KQogICAgICAgICAgICAgICAgcHV0c3RyKHByZWZpeCk7CiAgICAgICAgICAgIHZhciBtb3JlID0gcmVhZGxpbmUoKTsKICAgICAgICAgICAgaWYgKG1vcmUgPT09IG51bGwpCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgLy8gdGhlIG9ubHkgY29tbWFuZCByZWNvZ25pemVkIGluIG11bHRpbGluZSBtb2RlIGlzIC5lbmQKICAgICAgICAgICAgaWYgKG1vcmUubWF0Y2goL15bXHNdKlwuZW5kW1xzXSokLykpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgcyArPSAiXG4iICsgbW9yZTsKICAgICAgICB9CiAgICAgICAgdmFyIHQgPSBuZXcgbGV4ZXIuVG9rZW5pemVyKHMsICJzdGRpbiIsIGxuLnZhbHVlKTsKICAgICAgICB2YXIgbiA9IFNjcmlwdCh0LCBmYWxzZSwgZmFsc2UpOwogICAgICAgIGxuLnZhbHVlID0gdC5saW5lbm87CiAgICAgICAgcmV0dXJuIG47CiAgICB9CgogICAgbW9kdWxlLmV4cG9ydHMgPSB7CiAgICAgICAgcGFyc2U6IHBhcnNlLAogICAgICAgIHBhcnNlU3RkaW46IHBhcnNlU3RkaW4sCiAgICAgICAgTm9kZTogTm9kZSwKICAgICAgICBTeW50aGV0aWNOb2RlOiBTeW50aGV0aWNOb2RlLAogICAgICAgIERFQ0xBUkVEX0ZPUk06IERFQ0xBUkVEX0ZPUk0sCiAgICAgICAgRVhQUkVTU0VEX0ZPUk06IEVYUFJFU1NFRF9GT1JNLAogICAgICAgIFNUQVRFTUVOVF9GT1JNOiBTVEFURU1FTlRfRk9STSwKICAgICAgICBUb2tlbml6ZXI6IGxleGVyLlRva2VuaXplciwKICAgICAgICBGdW5jdGlvbkRlZmluaXRpb246IEZ1bmN0aW9uRGVmaW5pdGlvbiwKICAgICAgICBNb2R1bGU6IE1vZHVsZSwKICAgICAgICBFeHBvcnQ6IEV4cG9ydAogICAgfTsKCn0pOy8qIHZpbTogc2V0IHN3PTQgdHM9NCBldCB0dz03ODogKi8KLyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgogKiBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCiAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAogKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKICogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKICogTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgdGhlIE5hcmNpc3N1cyBKYXZhU2NyaXB0IGVuZ2luZS4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiAqIEJyZW5kYW4gRWljaCA8YnJlbmRhbkBtb3ppbGxhLm9yZz4uCiAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDQKICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBDb250cmlidXRvcihzKToKICogICBUb20gQXVzdGluIDx0YXVzdGluQHVjc2MuZWR1PgogKiAgIEJyZW5kYW4gRWljaCA8YnJlbmRhbkBtb3ppbGxhLm9yZz4KICogICBTaHUtWXUgR3VvIDxzaHVAcmZybi5vcmc+CiAqICAgRGF2ZSBIZXJtYW4gPGRoZXJtYW5AbW96aWxsYS5jb20+CiAqICAgRGltaXRyaXMgVmFyZG91bGFraXMgPGRpbXZhckBjY3MubmV1LmVkdT4KICogICBQYXRyaWNrIFdhbHRvbiA8cGN3YWx0b25AbW96aWxsYS5jb20+CiAqCiAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgogKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKICogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKICogdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwogKiB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgogKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQogKiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQogKiB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCiAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCiAqCiAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCgovKgogKiBOYXJjaXNzdXMgLSBKUyBpbXBsZW1lbnRlZCBpbiBKUy4KICoKICogTGV4aWNhbCBzY2FubmVyLgogKi8KCiBkZWZpbmUoJ2FjZS9uYXJjaXNzdXMvanNsZXgnLCBbJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnICwgJ2FjZS9uYXJjaXNzdXMvanNkZWZzJ10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkgewoKICAgIHZhciBkZWZpbml0aW9ucyA9IHJlcXVpcmUoIi4vanNkZWZzIik7CgogICAgLy8gU2V0IGNvbnN0YW50cyBpbiB0aGUgbG9jYWwgc2NvcGUuCiAgICBldmFsKGRlZmluaXRpb25zLmNvbnN0cyk7CgogICAgLy8gQmFubmVkIGtleXdvcmRzIGJ5IGxhbmd1YWdlIHZlcnNpb24KICAgIGNvbnN0IGJsYWNrTGlzdHMgPSB7IDE2MDoge30sIDE4NToge30sIGhhcm1vbnk6IHt9IH07CiAgICBibGFja0xpc3RzWzE2MF1bTEVUXSA9IHRydWU7CiAgICBibGFja0xpc3RzWzE2MF1bTU9EVUxFXSA9IHRydWU7CiAgICBibGFja0xpc3RzWzE2MF1bWUlFTERdID0gdHJ1ZTsKICAgIGJsYWNrTGlzdHNbMTg1XVtNT0RVTEVdID0gdHJ1ZTsKCiAgICAvLyBCdWlsZCB1cCBhIHRyaWUgb2Ygb3BlcmF0b3IgdG9rZW5zLgogICAgdmFyIG9wVG9rZW5zID0ge307CiAgICBmb3IgKHZhciBvcCBpbiBkZWZpbml0aW9ucy5vcFR5cGVOYW1lcykgewogICAgICAgIGlmIChvcCA9PT0gJ1xuJyB8fCBvcCA9PT0gJy4nKQogICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgdmFyIG5vZGUgPSBvcFRva2VuczsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBjaCA9IG9wW2ldOwogICAgICAgICAgICBpZiAoIShjaCBpbiBub2RlKSkKICAgICAgICAgICAgICAgIG5vZGVbY2hdID0ge307CiAgICAgICAgICAgIG5vZGUgPSBub2RlW2NoXTsKICAgICAgICAgICAgbm9kZS5vcCA9IG9wOwogICAgICAgIH0KICAgIH0KCiAgICAvKgogICAgICogVG9rZW5pemVyIDo6IChzb3VyY2UsIGZpbGVuYW1lLCBsaW5lIG51bWJlcikgLT4gVG9rZW5pemVyCiAgICAgKi8KICAgIGZ1bmN0aW9uIFRva2VuaXplcihzLCBmLCBsKSB7CiAgICAgICAgdGhpcy5jdXJzb3IgPSAwOwogICAgICAgIHRoaXMuc291cmNlID0gU3RyaW5nKHMpOwogICAgICAgIHRoaXMudG9rZW5zID0gW107CiAgICAgICAgdGhpcy50b2tlbkluZGV4ID0gMDsKICAgICAgICB0aGlzLmxvb2thaGVhZCA9IDA7CiAgICAgICAgdGhpcy5zY2FuTmV3bGluZXMgPSBmYWxzZTsKICAgICAgICB0aGlzLnVuZXhwZWN0ZWRFT0YgPSBmYWxzZTsKICAgICAgICB0aGlzLmZpbGVuYW1lID0gZiB8fCAiIjsKICAgICAgICB0aGlzLmxpbmVubyA9IGwgfHwgMTsKICAgICAgICB0aGlzLmJsYWNrTGlzdCA9IGJsYWNrTGlzdHNbTmFyY2lzc3VzLm9wdGlvbnMudmVyc2lvbl07CiAgICAgICAgdGhpcy5ibG9ja0NvbW1lbnRzID0gbnVsbDsKICAgIH0KCiAgICBUb2tlbml6ZXIucHJvdG90eXBlID0gewogICAgICAgIGdldCBkb25lKCkgewogICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHNldCBzY2FuT3BlcmFuZCB0byB0cnVlIGhlcmUgYmVjYXVzZSB0aGUgZmlyc3QgdGhpbmcKICAgICAgICAgICAgLy8gbWlnaHQgYmUgYSByZWdleHAuCiAgICAgICAgICAgIHJldHVybiB0aGlzLnBlZWsodHJ1ZSkgPT09IEVORDsKICAgICAgICB9LAoKICAgICAgICBnZXQgdG9rZW4oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnRva2Vuc1t0aGlzLnRva2VuSW5kZXhdOwogICAgICAgIH0sCgogICAgICAgIG1hdGNoOiBmdW5jdGlvbiAodHQsIHNjYW5PcGVyYW5kKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChzY2FuT3BlcmFuZCkgPT09IHR0IHx8IHRoaXMudW5nZXQoKTsKICAgICAgICB9LAoKICAgICAgICBtdXN0TWF0Y2g6IGZ1bmN0aW9uICh0dCkgewogICAgICAgICAgICBpZiAoIXRoaXMubWF0Y2godHQpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyB0aGlzLm5ld1N5bnRheEVycm9yKCJNaXNzaW5nICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9ucy50b2tlbnNbdHRdLnRvTG93ZXJDYXNlKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLnRva2VuOwogICAgICAgIH0sCgogICAgICAgIHBlZWs6IGZ1bmN0aW9uIChzY2FuT3BlcmFuZCkgewogICAgICAgICAgICB2YXIgdHQsIG5leHQ7CiAgICAgICAgICAgIGlmICh0aGlzLmxvb2thaGVhZCkgewogICAgICAgICAgICAgICAgbmV4dCA9IHRoaXMudG9rZW5zWyh0aGlzLnRva2VuSW5kZXggKyB0aGlzLmxvb2thaGVhZCkgJiAzXTsKICAgICAgICAgICAgICAgIHR0ID0gKHRoaXMuc2Nhbk5ld2xpbmVzICYmIG5leHQubGluZW5vICE9PSB0aGlzLmxpbmVubykKICAgICAgICAgICAgICAgICAgICAgPyBORVdMSU5FCiAgICAgICAgICAgICAgICAgICAgIDogbmV4dC50eXBlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdHQgPSB0aGlzLmdldChzY2FuT3BlcmFuZCk7CiAgICAgICAgICAgICAgICB0aGlzLnVuZ2V0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHR0OwogICAgICAgIH0sCgogICAgICAgIHBlZWtPblNhbWVMaW5lOiBmdW5jdGlvbiAoc2Nhbk9wZXJhbmQpIHsKICAgICAgICAgICAgdGhpcy5zY2FuTmV3bGluZXMgPSB0cnVlOwogICAgICAgICAgICB2YXIgdHQgPSB0aGlzLnBlZWsoc2Nhbk9wZXJhbmQpOwogICAgICAgICAgICB0aGlzLnNjYW5OZXdsaW5lcyA9IGZhbHNlOwogICAgICAgICAgICByZXR1cm4gdHQ7CiAgICAgICAgfSwKCiAgICAgICAgbGFzdEJsb2NrQ29tbWVudDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBsZW5ndGggPSB0aGlzLmJsb2NrQ29tbWVudHMubGVuZ3RoOwogICAgICAgICAgICByZXR1cm4gbGVuZ3RoID8gdGhpcy5ibG9ja0NvbW1lbnRzW2xlbmd0aCAtIDFdIDogbnVsbDsKICAgICAgICB9LAoKICAgICAgICAvLyBFYXQgY29tbWVudHMgYW5kIHdoaXRlc3BhY2UuCiAgICAgICAgc2tpcDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgaW5wdXQgPSB0aGlzLnNvdXJjZTsKICAgICAgICAgICAgdGhpcy5ibG9ja0NvbW1lbnRzID0gW107CiAgICAgICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgICAgIHZhciBjaCA9IGlucHV0W3RoaXMuY3Vyc29yKytdOwogICAgICAgICAgICAgICAgdmFyIG5leHQgPSBpbnB1dFt0aGlzLmN1cnNvcl07CiAgICAgICAgICAgICAgICAvLyBoYW5kbGUgXHIsIFxyXG4gYW5kIChhbHdheXMgcHJlZmVyYWJsZSkgXG4KICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xyJykgewogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBuZXh0IGNoYXJhY3RlciBpcyBcbiwgd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIGF0IGFsbAogICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID09PSAnXG4nKSBjb250aW51ZTsKCiAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCB3ZSB3YW50IHRvIGNvbnNpZGVyIHRoaXMgYXMgYSBuZXdsaW5lCiAgICAgICAgICAgICAgICAgICAgY2ggPSAnXG4nOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xuJyAmJiAhdGhpcy5zY2FuTmV3bGluZXMpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmVubysrOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJy8nICYmIG5leHQgPT09ICcqJykgewogICAgICAgICAgICAgICAgICAgIHZhciBjb21tZW50U3RhcnQgPSArK3RoaXMuY3Vyc29yOwogICAgICAgICAgICAgICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBpbnB1dFt0aGlzLmN1cnNvcisrXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSB1bmRlZmluZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB0aGlzLm5ld1N5bnRheEVycm9yKCJVbnRlcm1pbmF0ZWQgY29tbWVudCIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnKicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBpbnB1dFt0aGlzLmN1cnNvcl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCA9PT0gJy8nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbW1lbnRFbmQgPSB0aGlzLmN1cnNvciAtIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xuJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5saW5lbm8rKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0aGlzLmJsb2NrQ29tbWVudHMucHVzaChpbnB1dC5zdWJzdHJpbmcoY29tbWVudFN0YXJ0LCBjb21tZW50RW5kKSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnLycgJiYgbmV4dCA9PT0gJy8nKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IrKzsKICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gaW5wdXRbdGhpcy5jdXJzb3IrK107CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBpbnB1dFt0aGlzLmN1cnNvcl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gdW5kZWZpbmVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXHInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgXHJcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgIT09ICdcbicpIGNoID0gJ1xuJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXG4nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2FuTmV3bGluZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnNvci0tOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmVubysrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEoY2ggaW4gZGVmaW5pdGlvbnMud2hpdGVzcGFjZSkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnNvci0tOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8vIExleCB0aGUgZXhwb25lbnRpYWwgcGFydCBvZiBhIG51bWJlciwgaWYgcHJlc2VudC4gUmV0dXJuIHRydWUgaWZmIGFuCiAgICAgICAgLy8gZXhwb25lbnRpYWwgcGFydCB3YXMgZm91bmQuCiAgICAgICAgbGV4RXhwb25lbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgaW5wdXQgPSB0aGlzLnNvdXJjZTsKICAgICAgICAgICAgdmFyIG5leHQgPSBpbnB1dFt0aGlzLmN1cnNvcl07CiAgICAgICAgICAgIGlmIChuZXh0ID09PSAnZScgfHwgbmV4dCA9PT0gJ0UnKSB7CiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvcisrOwogICAgICAgICAgICAgICAgY2ggPSBpbnB1dFt0aGlzLmN1cnNvcisrXTsKICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJysnIHx8IGNoID09PSAnLScpCiAgICAgICAgICAgICAgICAgICAgY2ggPSBpbnB1dFt0aGlzLmN1cnNvcisrXTsKCiAgICAgICAgICAgICAgICBpZiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgdGhpcy5uZXdTeW50YXhFcnJvcigiTWlzc2luZyBleHBvbmVudCIpOwoKICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICBjaCA9IGlucHV0W3RoaXMuY3Vyc29yKytdOwogICAgICAgICAgICAgICAgfSB3aGlsZSAoY2ggPj0gJzAnICYmIGNoIDw9ICc5Jyk7CiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvci0tOwoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSwKCiAgICAgICAgbGV4WmVyb051bWJlcjogZnVuY3Rpb24gKGNoKSB7CiAgICAgICAgICAgIHZhciB0b2tlbiA9IHRoaXMudG9rZW4sIGlucHV0ID0gdGhpcy5zb3VyY2U7CiAgICAgICAgICAgIHRva2VuLnR5cGUgPSBOVU1CRVI7CgogICAgICAgICAgICBjaCA9IGlucHV0W3RoaXMuY3Vyc29yKytdOwogICAgICAgICAgICBpZiAoY2ggPT09ICcuJykgewogICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgIGNoID0gaW5wdXRbdGhpcy5jdXJzb3IrK107CiAgICAgICAgICAgICAgICB9IHdoaWxlIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKTsKICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLS07CgogICAgICAgICAgICAgICAgdGhpcy5sZXhFeHBvbmVudCgpOwogICAgICAgICAgICAgICAgdG9rZW4udmFsdWUgPSBwYXJzZUZsb2F0KHRva2VuLnN0YXJ0LCB0aGlzLmN1cnNvcik7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICd4JyB8fCBjaCA9PT0gJ1gnKSB7CiAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgY2ggPSBpbnB1dFt0aGlzLmN1cnNvcisrXTsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB8fCAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykgfHwKICAgICAgICAgICAgICAgICAgICAgICAgIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKSk7CiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvci0tOwoKICAgICAgICAgICAgICAgIHRva2VuLnZhbHVlID0gcGFyc2VJbnQoaW5wdXQuc3Vic3RyaW5nKHRva2VuLnN0YXJ0LCB0aGlzLmN1cnNvcikpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnNycpIHsKICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICBjaCA9IGlucHV0W3RoaXMuY3Vyc29yKytdOwogICAgICAgICAgICAgICAgfSB3aGlsZSAoY2ggPj0gJzAnICYmIGNoIDw9ICc3Jyk7CiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvci0tOwoKICAgICAgICAgICAgICAgIHRva2VuLnZhbHVlID0gcGFyc2VJbnQoaW5wdXQuc3Vic3RyaW5nKHRva2VuLnN0YXJ0LCB0aGlzLmN1cnNvcikpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5jdXJzb3ItLTsKICAgICAgICAgICAgICAgIHRoaXMubGV4RXhwb25lbnQoKTsgICAgIC8vIDBFMSwgJmMuCiAgICAgICAgICAgICAgICB0b2tlbi52YWx1ZSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBsZXhOdW1iZXI6IGZ1bmN0aW9uIChjaCkgewogICAgICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLnRva2VuLCBpbnB1dCA9IHRoaXMuc291cmNlOwogICAgICAgICAgICB0b2tlbi50eXBlID0gTlVNQkVSOwoKICAgICAgICAgICAgdmFyIGZsb2F0aW5nID0gZmFsc2U7CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgIGNoID0gaW5wdXRbdGhpcy5jdXJzb3IrK107CiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICcuJyAmJiAhZmxvYXRpbmcpIHsKICAgICAgICAgICAgICAgICAgICBmbG9hdGluZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgY2ggPSBpbnB1dFt0aGlzLmN1cnNvcisrXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSB3aGlsZSAoY2ggPj0gJzAnICYmIGNoIDw9ICc5Jyk7CgogICAgICAgICAgICB0aGlzLmN1cnNvci0tOwoKICAgICAgICAgICAgdmFyIGV4cG9uZW50ID0gdGhpcy5sZXhFeHBvbmVudCgpOwogICAgICAgICAgICBmbG9hdGluZyA9IGZsb2F0aW5nIHx8IGV4cG9uZW50OwoKICAgICAgICAgICAgdmFyIHN0ciA9IGlucHV0LnN1YnN0cmluZyh0b2tlbi5zdGFydCwgdGhpcy5jdXJzb3IpOwogICAgICAgICAgICB0b2tlbi52YWx1ZSA9IGZsb2F0aW5nID8gcGFyc2VGbG9hdChzdHIpIDogcGFyc2VJbnQoc3RyKTsKICAgICAgICB9LAoKICAgICAgICBsZXhEb3Q6IGZ1bmN0aW9uIChjaCkgewogICAgICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLnRva2VuLCBpbnB1dCA9IHRoaXMuc291cmNlOwogICAgICAgICAgICB2YXIgbmV4dCA9IGlucHV0W3RoaXMuY3Vyc29yXTsKICAgICAgICAgICAgaWYgKG5leHQgPj0gJzAnICYmIG5leHQgPD0gJzknKSB7CiAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgY2ggPSBpbnB1dFt0aGlzLmN1cnNvcisrXTsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpOwogICAgICAgICAgICAgICAgdGhpcy5jdXJzb3ItLTsKCiAgICAgICAgICAgICAgICB0aGlzLmxleEV4cG9uZW50KCk7CgogICAgICAgICAgICAgICAgdG9rZW4udHlwZSA9IE5VTUJFUjsKICAgICAgICAgICAgICAgIHRva2VuLnZhbHVlID0gcGFyc2VGbG9hdCh0b2tlbi5zdGFydCwgdGhpcy5jdXJzb3IpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdG9rZW4udHlwZSA9IERPVDsKICAgICAgICAgICAgICAgIHRva2VuLmFzc2lnbk9wID0gbnVsbDsKICAgICAgICAgICAgICAgIHRva2VuLnZhbHVlID0gJy4nOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgbGV4U3RyaW5nOiBmdW5jdGlvbiAoY2gpIHsKICAgICAgICAgICAgdmFyIHRva2VuID0gdGhpcy50b2tlbiwgaW5wdXQgPSB0aGlzLnNvdXJjZTsKICAgICAgICAgICAgdG9rZW4udHlwZSA9IFNUUklORzsKCiAgICAgICAgICAgIHZhciBoYXNFc2NhcGVzID0gZmFsc2U7CiAgICAgICAgICAgIHZhciBkZWxpbSA9IGNoOwogICAgICAgICAgICBpZiAoaW5wdXQubGVuZ3RoIDw9IHRoaXMuY3Vyc29yKQogICAgICAgICAgICAgICAgdGhyb3cgdGhpcy5uZXdTeW50YXhFcnJvcigiVW50ZXJtaW5hdGVkIHN0cmluZyBsaXRlcmFsIik7CiAgICAgICAgICAgIHdoaWxlICgoY2ggPSBpbnB1dFt0aGlzLmN1cnNvcisrXSkgIT09IGRlbGltKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJzb3IgPT0gaW5wdXQubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgIHRocm93IHRoaXMubmV3U3ludGF4RXJyb3IoIlVudGVybWluYXRlZCBzdHJpbmcgbGl0ZXJhbCIpOwogICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXFwnKSB7CiAgICAgICAgICAgICAgICAgICAgaGFzRXNjYXBlcyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKCsrdGhpcy5jdXJzb3IgPT0gaW5wdXQubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB0aGlzLm5ld1N5bnRheEVycm9yKCJVbnRlcm1pbmF0ZWQgc3RyaW5nIGxpdGVyYWwiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdG9rZW4udmFsdWUgPSBoYXNFc2NhcGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBldmFsKGlucHV0LnN1YnN0cmluZyh0b2tlbi5zdGFydCwgdGhpcy5jdXJzb3IpKQogICAgICAgICAgICAgICAgICAgICAgICAgIDogaW5wdXQuc3Vic3RyaW5nKHRva2VuLnN0YXJ0ICsgMSwgdGhpcy5jdXJzb3IgLSAxKTsKICAgICAgICB9LAoKICAgICAgICBsZXhSZWdFeHA6IGZ1bmN0aW9uIChjaCkgewogICAgICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLnRva2VuLCBpbnB1dCA9IHRoaXMuc291cmNlOwogICAgICAgICAgICB0b2tlbi50eXBlID0gUkVHRVhQOwoKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgY2ggPSBpbnB1dFt0aGlzLmN1cnNvcisrXTsKICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xcJykgewogICAgICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yKys7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnWycpIHsKICAgICAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gdW5kZWZpbmVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgdGhpcy5uZXdTeW50YXhFcnJvcigiVW50ZXJtaW5hdGVkIGNoYXJhY3RlciBjbGFzcyIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXFwnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IrKzsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gaW5wdXRbdGhpcy5jdXJzb3IrK107CiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoY2ggIT09ICddJyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyB0aGlzLm5ld1N5bnRheEVycm9yKCJVbnRlcm1pbmF0ZWQgcmVnZXgiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSB3aGlsZSAoY2ggIT09ICcvJyk7CgogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBjaCA9IGlucHV0W3RoaXMuY3Vyc29yKytdOwogICAgICAgICAgICB9IHdoaWxlIChjaCA+PSAnYScgJiYgY2ggPD0gJ3onKTsKCiAgICAgICAgICAgIHRoaXMuY3Vyc29yLS07CgogICAgICAgICAgICB0b2tlbi52YWx1ZSA9IGV2YWwoaW5wdXQuc3Vic3RyaW5nKHRva2VuLnN0YXJ0LCB0aGlzLmN1cnNvcikpOwogICAgICAgIH0sCgogICAgICAgIGxleE9wOiBmdW5jdGlvbiAoY2gpIHsKICAgICAgICAgICAgdmFyIHRva2VuID0gdGhpcy50b2tlbiwgaW5wdXQgPSB0aGlzLnNvdXJjZTsKCiAgICAgICAgICAgIC8vIEEgYml0IHVnbHksIGJ1dCBpdCBzZWVtcyB3YXN0ZWZ1bCB0byB3cml0ZSBhIHRyaWUgbG9va3VwIHJvdXRpbmUKICAgICAgICAgICAgLy8gZm9yIG9ubHkgMyBjaGFyYWN0ZXJzLi4uCiAgICAgICAgICAgIHZhciBub2RlID0gb3BUb2tlbnNbY2hdOwogICAgICAgICAgICB2YXIgbmV4dCA9IGlucHV0W3RoaXMuY3Vyc29yXTsKICAgICAgICAgICAgaWYgKG5leHQgaW4gbm9kZSkgewogICAgICAgICAgICAgICAgbm9kZSA9IG5vZGVbbmV4dF07CiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvcisrOwogICAgICAgICAgICAgICAgbmV4dCA9IGlucHV0W3RoaXMuY3Vyc29yXTsKICAgICAgICAgICAgICAgIGlmIChuZXh0IGluIG5vZGUpIHsKICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZVtuZXh0XTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnNvcisrOwogICAgICAgICAgICAgICAgICAgIG5leHQgPSBpbnB1dFt0aGlzLmN1cnNvcl07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBvcCA9IG5vZGUub3A7CiAgICAgICAgICAgIGlmIChkZWZpbml0aW9ucy5hc3NpZ25PcHNbb3BdICYmIGlucHV0W3RoaXMuY3Vyc29yXSA9PT0gJz0nKSB7CiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvcisrOwogICAgICAgICAgICAgICAgdG9rZW4udHlwZSA9IEFTU0lHTjsKICAgICAgICAgICAgICAgIHRva2VuLmFzc2lnbk9wID0gZGVmaW5pdGlvbnMudG9rZW5JZHNbZGVmaW5pdGlvbnMub3BUeXBlTmFtZXNbb3BdXTsKICAgICAgICAgICAgICAgIG9wICs9ICc9JzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRva2VuLnR5cGUgPSBkZWZpbml0aW9ucy50b2tlbklkc1tkZWZpbml0aW9ucy5vcFR5cGVOYW1lc1tvcF1dOwogICAgICAgICAgICAgICAgdG9rZW4uYXNzaWduT3AgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0b2tlbi52YWx1ZSA9IG9wOwogICAgICAgIH0sCgogICAgICAgIC8vIEZJWE1FOiBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMKICAgICAgICBsZXhJZGVudDogZnVuY3Rpb24gKGNoKSB7CiAgICAgICAgICAgIHZhciB0b2tlbiA9IHRoaXMudG9rZW47CiAgICAgICAgICAgIHZhciBpZCA9IGNoOwoKICAgICAgICAgICAgd2hpbGUgKChjaCA9IHRoaXMuZ2V0VmFsaWRJZGVudGlmaWVyQ2hhcihmYWxzZSkpICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBpZCArPSBjaDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdG9rZW4udHlwZSA9IGRlZmluaXRpb25zLmtleXdvcmRzW2lkXSB8fCBJREVOVElGSUVSOwogICAgICAgICAgICBpZiAodG9rZW4udHlwZSBpbiB0aGlzLmJsYWNrTGlzdCkgewogICAgICAgICAgICAgICAgLy8gYmFubmVkIGtleXdvcmQsIHRoaXMgaXMgYW4gaWRlbnRpZmllcgogICAgICAgICAgICAgICAgdG9rZW4udHlwZSA9IElERU5USUZJRVI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdG9rZW4udmFsdWUgPSBpZDsKICAgICAgICB9LAoKICAgICAgICAvKgogICAgICAgICAqIFRva2VuaXplci5nZXQgOjogdm9pZCAtPiB0b2tlbiB0eXBlCiAgICAgICAgICoKICAgICAgICAgKiBDb25zdW1lIGlucHV0ICpvbmx5KiBpZiB0aGVyZSBpcyBubyBsb29rYWhlYWQuCiAgICAgICAgICogRGlzcGF0Y2ggdG8gdGhlIGFwcHJvcHJpYXRlIGxleGluZyBmdW5jdGlvbiBkZXBlbmRpbmcgb24gdGhlIGlucHV0LgogICAgICAgICAqLwogICAgICAgIGdldDogZnVuY3Rpb24gKHNjYW5PcGVyYW5kKSB7CiAgICAgICAgICAgIHZhciB0b2tlbjsKICAgICAgICAgICAgd2hpbGUgKHRoaXMubG9va2FoZWFkKSB7CiAgICAgICAgICAgICAgICAtLXRoaXMubG9va2FoZWFkOwogICAgICAgICAgICAgICAgdGhpcy50b2tlbkluZGV4ID0gKHRoaXMudG9rZW5JbmRleCArIDEpICYgMzsKICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy50b2tlbnNbdGhpcy50b2tlbkluZGV4XTsKICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlICE9PSBORVdMSU5FIHx8IHRoaXMuc2Nhbk5ld2xpbmVzKQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbi50eXBlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLnNraXAoKTsKCiAgICAgICAgICAgIHRoaXMudG9rZW5JbmRleCA9ICh0aGlzLnRva2VuSW5kZXggKyAxKSAmIDM7CiAgICAgICAgICAgIHRva2VuID0gdGhpcy50b2tlbnNbdGhpcy50b2tlbkluZGV4XTsKICAgICAgICAgICAgaWYgKCF0b2tlbikKICAgICAgICAgICAgICAgIHRoaXMudG9rZW5zW3RoaXMudG9rZW5JbmRleF0gPSB0b2tlbiA9IHt9OwoKICAgICAgICAgICAgdmFyIGlucHV0ID0gdGhpcy5zb3VyY2U7CiAgICAgICAgICAgIGlmICh0aGlzLmN1cnNvciA+PSBpbnB1dC5sZW5ndGgpCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4udHlwZSA9IEVORDsKCiAgICAgICAgICAgIHRva2VuLnN0YXJ0ID0gdGhpcy5jdXJzb3I7CiAgICAgICAgICAgIHRva2VuLmxpbmVubyA9IHRoaXMubGluZW5vOwoKICAgICAgICAgICAgdmFyIGljaCA9IHRoaXMuZ2V0VmFsaWRJZGVudGlmaWVyQ2hhcih0cnVlKTsKICAgICAgICAgICAgdmFyIGNoID0gKGljaCA9PT0gbnVsbCkgPyBpbnB1dFt0aGlzLmN1cnNvcisrXSA6IG51bGw7CiAgICAgICAgICAgIGlmIChpY2ggIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMubGV4SWRlbnQoaWNoKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChzY2FuT3BlcmFuZCAmJiBjaCA9PT0gJy8nKSB7CiAgICAgICAgICAgICAgICB0aGlzLmxleFJlZ0V4cChjaCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggaW4gb3BUb2tlbnMpIHsKICAgICAgICAgICAgICAgIHRoaXMubGV4T3AoY2gpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnLicpIHsKICAgICAgICAgICAgICAgIHRoaXMubGV4RG90KGNoKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA+PSAnMScgJiYgY2ggPD0gJzknKSB7CiAgICAgICAgICAgICAgICB0aGlzLmxleE51bWJlcihjaCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICcwJykgewogICAgICAgICAgICAgICAgdGhpcy5sZXhaZXJvTnVtYmVyKGNoKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJyInIHx8IGNoID09PSAiJyIpIHsKICAgICAgICAgICAgICAgIHRoaXMubGV4U3RyaW5nKGNoKTsKICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNjYW5OZXdsaW5lcyAmJiAoY2ggPT09ICdcbicgfHwgY2ggPT09ICdccicpKSB7CiAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIHdhcyBhIFxyLCBsb29rIGZvciBcclxuCiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdccicgJiYgaW5wdXRbdGhpcy5jdXJzb3JdID09PSAnXG4nKSB0aGlzLmN1cnNvcisrOwogICAgICAgICAgICAgICAgdG9rZW4udHlwZSA9IE5FV0xJTkU7CiAgICAgICAgICAgICAgICB0b2tlbi52YWx1ZSA9ICdcbic7CiAgICAgICAgICAgICAgICB0aGlzLmxpbmVubysrOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgdGhpcy5uZXdTeW50YXhFcnJvcigiSWxsZWdhbCB0b2tlbiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0b2tlbi5lbmQgPSB0aGlzLmN1cnNvcjsKICAgICAgICAgICAgcmV0dXJuIHRva2VuLnR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgLyoKICAgICAgICAgKiBUb2tlbml6ZXIudW5nZXQgOjogdm9pZCAtPiB1bmRlZmluZWQKICAgICAgICAgKgogICAgICAgICAqIE1hdGNoIGRlcGVuZHMgb24gdW5nZXQgcmV0dXJuaW5nIHVuZGVmaW5lZC4KICAgICAgICAgKi8KICAgICAgICB1bmdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoKyt0aGlzLmxvb2thaGVhZCA9PT0gNCkgdGhyb3cgIlBBTklDOiB0b28gbXVjaCBsb29rYWhlYWQhIjsKICAgICAgICAgICAgdGhpcy50b2tlbkluZGV4ID0gKHRoaXMudG9rZW5JbmRleCAtIDEpICYgMzsKICAgICAgICB9LAoKICAgICAgICBuZXdTeW50YXhFcnJvcjogZnVuY3Rpb24gKG0pIHsKICAgICAgICAgICAgbSA9ICh0aGlzLmZpbGVuYW1lID8gdGhpcy5maWxlbmFtZSArICI6IiA6ICIiKSArIHRoaXMubGluZW5vICsgIjogIiArIG07CiAgICAgICAgICAgIHZhciBlID0gbmV3IFN5bnRheEVycm9yKG0sIHRoaXMuZmlsZW5hbWUsIHRoaXMubGluZW5vKTsKICAgICAgICAgICAgZS5zb3VyY2UgPSB0aGlzLnNvdXJjZTsKICAgICAgICAgICAgZS5jdXJzb3IgPSB0aGlzLmxvb2thaGVhZAogICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy50b2tlbnNbKHRoaXMudG9rZW5JbmRleCArIHRoaXMubG9va2FoZWFkKSAmIDNdLnN0YXJ0CiAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmN1cnNvcjsKICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgfSwKCiAgICAgICAgLyogR2V0cyBhIHNpbmdsZSB2YWxpZCBpZGVudGlmaWVyIGNoYXIgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCBvciBudWxsCiAgICAgICAgICogaWYgdGhlcmUgaXMgbm9uZS4KICAgICAgICAgKiBTaW5jZSBKYXZhU2NyaXB0IHByb3ZpZGVzIG5vIGNvbnZlbmllbnQgd2F5IHRvIGRldGVybWluZSBpZiBhCiAgICAgICAgICogY2hhcmFjdGVyIGlzIGluIGEgcGFydGljdWxhciBVbmljb2RlIGNhdGVnb3J5LCB3ZSB1c2UKICAgICAgICAgKiBtZXRhY2lyY3VsYXJpdHkgdG8gYWNjb21wbGlzaCB0aGlzIChvaCB5ZWFhYWFoISkgKi8KICAgICAgICBnZXRWYWxpZElkZW50aWZpZXJDaGFyOiBmdW5jdGlvbihmaXJzdCkgewogICAgICAgICAgICB2YXIgaW5wdXQgPSB0aGlzLnNvdXJjZTsKICAgICAgICAgICAgaWYgKHRoaXMuY3Vyc29yID49IGlucHV0Lmxlbmd0aCkgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIHZhciBjaCA9IGlucHV0W3RoaXMuY3Vyc29yXTsKCiAgICAgICAgICAgIC8vIGZpcnN0IGNoZWNrIGZvciBcdSBlc2NhcGVzCiAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xcJyAmJiBpbnB1dFt0aGlzLmN1cnNvcisxXSA9PT0gJ3UnKSB7CiAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGNoYXJhY3RlciB2YWx1ZQogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBjaCA9IFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoCiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnN1YnN0cmluZyh0aGlzLmN1cnNvciArIDIsIHRoaXMuY3Vyc29yICsgNiksCiAgICAgICAgICAgICAgICAgICAgICAgIDE2KSk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChleCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IgKz0gNTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY2hlY2sgZGlyZWN0bHkgZm9yIEFTQ0lJCiAgICAgICAgICAgIGlmIChjaCA8PSAiXHUwMDdGIikgewogICAgICAgICAgICAgICAgaWYgKChjaCA+PSAnYScgJiYgY2ggPD0gJ3onKSB8fCAoY2ggPj0gJ0EnICYmIGNoIDw9ICdaJykgfHwgY2ggPT09ICckJyB8fCBjaCA9PT0gJ18nIHx8CiAgICAgICAgICAgICAgICAgICAgKCFmaXJzdCAmJiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IrKzsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2g7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgIC8vIGNyZWF0ZSBhbiBvYmplY3QgdG8gdGVzdCB0aGlzIGluCiAgICAgICAgICAgIHZhciB4ID0ge307CiAgICAgICAgICAgIHhbIngiK2NoXSA9IHRydWU7CiAgICAgICAgICAgIHhbY2hdID0gdHJ1ZTsKICAgIAogICAgICAgICAgICAvLyB0aGVuIHVzZSBldmFsIHRvIGRldGVybWluZSBpZiBpdCdzIGEgdmFsaWQgY2hhcmFjdGVyCiAgICAgICAgICAgIHZhciB2YWxpZCA9IGZhbHNlOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdmFsaWQgPSAoRnVuY3Rpb24oIngiLCAicmV0dXJuICh4LiIgKyAoZmlyc3Q/IiI6IngiKSArIGNoICsgIik7IikoeCkgPT09IHRydWUpOwogICAgICAgICAgICB9IGNhdGNoIChleCkge30KICAgICAgICAgICAgaWYgKHZhbGlkKSB0aGlzLmN1cnNvcisrOwogICAgICAgICAgICByZXR1cm4gKHZhbGlkID8gY2ggOiBudWxsKTsKICAgICAgICB9LAogICAgfTsKCgogICAgbW9kdWxlLmV4cG9ydHMgPSB7IFRva2VuaXplcjogVG9rZW5pemVyIH07Cgp9KTsKLyogdmltOiBzZXQgc3c9NCB0cz00IGV0IHR3PTc4OiAqLwovKiAqKioqKiBCRUdJTiBMSUNFTlNFIEJMT0NLICoqKioqCiAqIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQogKgogKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24KICogMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCiAqCiAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQogKiBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQogKiBMaWNlbnNlLgogKgogKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyB0aGUgTmFyY2lzc3VzIEphdmFTY3JpcHQgZW5naW5lLgogKgogKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKICogQnJlbmRhbiBFaWNoIDxicmVuZGFuQG1vemlsbGEub3JnPi4KICogUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAwNAogKiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgIFRvbSBBdXN0aW4gPHRhdXN0aW5AdWNzYy5lZHU+CiAqICAgQnJlbmRhbiBFaWNoIDxicmVuZGFuQG1vemlsbGEub3JnPgogKiAgIFNodS1ZdSBHdW8gPHNodUByZnJuLm9yZz4KICogICBEYXZlIEhlcm1hbiA8ZGhlcm1hbkBtb3ppbGxhLmNvbT4KICogICBEaW1pdHJpcyBWYXJkb3VsYWtpcyA8ZGltdmFyQGNjcy5uZXUuZWR1PgogKiAgIFBhdHJpY2sgV2FsdG9uIDxwY3dhbHRvbkBtb3ppbGxhLmNvbT4KICoKICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCiAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAogKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAogKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQogKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCiAqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiAqIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KICoKICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KCi8qCiAqIE5hcmNpc3N1cyAtIEpTIGltcGxlbWVudGVkIGluIEpTLgogKgogKiBXZWxsLWtub3duIGNvbnN0YW50cyBhbmQgbG9va3VwIHRhYmxlcy4gIE1hbnkgY29uc3RzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUKICogdG9rZW5zIHRhYmxlIHZpYSBldmFsIHRvIG1pbmltaXplIHJlZHVuZGFuY3ksIHNvIGNvbnN1bWVycyBtdXN0IGJlIGNvbXBpbGVkCiAqIHNlcGFyYXRlbHkgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIHNpbXBsZSBzd2l0Y2gtY2FzZSBjb25zdGFudCBwcm9wYWdhdGlvbgogKiBkb25lIGJ5IFNwaWRlck1vbmtleS4KICovCgpkZWZpbmUoJ2FjZS9uYXJjaXNzdXMvanNkZWZzJywgWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJyBdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKCiAgICB2YXIgbmFyY2lzc3VzID0gewogICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgdmVyc2lvbjogMTg1LAogICAgICAgICAgICAvLyBHbG9iYWwgdmFyaWFibGVzIHRvIGhpZGUgZnJvbSB0aGUgaW50ZXJwcmV0ZXIKICAgICAgICAgICAgaGlkZGVuSG9zdEdsb2JhbHM6IHsgTmFyY2lzc3VzOiB0cnVlIH0sCiAgICAgICAgICAgIC8vIERlc3VnYXIgU3BpZGVyTW9ua2V5IGxhbmd1YWdlIGV4dGVuc2lvbnM/CiAgICAgICAgICAgIGRlc3VnYXJFeHRlbnNpb25zOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgaG9zdFN1cHBvcnRzRXZhbENvbnN0OiAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZXZhbCgiKGZ1bmN0aW9uKHMpIHsgZXZhbChzKTsgcmV0dXJuIHggfSkoJ2NvbnN0IHggPSB0cnVlOycpIik7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0pKCksCiAgICAgICAgaG9zdEdsb2JhbDogdGhpcwogICAgfTsKICAgIE5hcmNpc3N1cyA9IG5hcmNpc3N1czsKCiAgICB2YXIgdG9rZW5zID0gWwogICAgICAgIC8vIEVuZCBvZiBzb3VyY2UuCiAgICAgICAgIkVORCIsCgogICAgICAgIC8vIE9wZXJhdG9ycyBhbmQgcHVuY3R1YXRvcnMuICBTb21lIHBhaXItd2lzZSBvcmRlciBtYXR0ZXJzLCBlLmcuICgrLCAtKQogICAgICAgIC8vIGFuZCAoVU5BUllfUExVUywgVU5BUllfTUlOVVMpLgogICAgICAgICJcbiIsICI7IiwKICAgICAgICAiLCIsCiAgICAgICAgIj0iLAogICAgICAgICI/IiwgIjoiLCAiQ09ORElUSU9OQUwiLAogICAgICAgICJ8fCIsCiAgICAgICAgIiYmIiwKICAgICAgICAifCIsCiAgICAgICAgIl4iLAogICAgICAgICImIiwKICAgICAgICAiPT0iLCAiIT0iLCAiPT09IiwgIiE9PSIsCiAgICAgICAgIjwiLCAiPD0iLCAiPj0iLCAiPiIsCiAgICAgICAgIjw8IiwgIj4+IiwgIj4+PiIsCiAgICAgICAgIisiLCAiLSIsCiAgICAgICAgIioiLCAiLyIsICIlIiwKICAgICAgICAiISIsICJ+IiwgIlVOQVJZX1BMVVMiLCAiVU5BUllfTUlOVVMiLAogICAgICAgICIrKyIsICItLSIsCiAgICAgICAgIi4iLAogICAgICAgICJbIiwgIl0iLAogICAgICAgICJ7IiwgIn0iLAogICAgICAgICIoIiwgIikiLAoKICAgICAgICAvLyBOb250ZXJtaW5hbCB0cmVlIG5vZGUgdHlwZSBjb2Rlcy4KICAgICAgICAiU0NSSVBUIiwgIkJMT0NLIiwgIkxBQkVMIiwgIkZPUl9JTiIsICJDQUxMIiwgIk5FV19XSVRIX0FSR1MiLCAiSU5ERVgiLAogICAgICAgICJBUlJBWV9JTklUIiwgIk9CSkVDVF9JTklUIiwgIlBST1BFUlRZX0lOSVQiLCAiR0VUVEVSIiwgIlNFVFRFUiIsCiAgICAgICAgIkdST1VQIiwgIkxJU1QiLCAiTEVUX0JMT0NLIiwgIkFSUkFZX0NPTVAiLCAiR0VORVJBVE9SIiwgIkNPTVBfVEFJTCIsCgogICAgICAgIC8vIFRlcm1pbmFscy4KICAgICAgICAiSURFTlRJRklFUiIsICJOVU1CRVIiLCAiU1RSSU5HIiwgIlJFR0VYUCIsCgogICAgICAgIC8vIEtleXdvcmRzLgogICAgICAgICJicmVhayIsCiAgICAgICAgImNhc2UiLCAiY2F0Y2giLCAiY29uc3QiLCAiY29udGludWUiLAogICAgICAgICJkZWJ1Z2dlciIsICJkZWZhdWx0IiwgImRlbGV0ZSIsICJkbyIsCiAgICAgICAgImVsc2UiLCAiZXhwb3J0IiwKICAgICAgICAiZmFsc2UiLCAiZmluYWxseSIsICJmb3IiLCAiZnVuY3Rpb24iLAogICAgICAgICJpZiIsICJpbXBvcnQiLCAiaW4iLCAiaW5zdGFuY2VvZiIsCiAgICAgICAgImxldCIsICJtb2R1bGUiLAogICAgICAgICJuZXciLCAibnVsbCIsCiAgICAgICAgInJldHVybiIsCiAgICAgICAgInN3aXRjaCIsCiAgICAgICAgInRoaXMiLCAidGhyb3ciLCAidHJ1ZSIsICJ0cnkiLCAidHlwZW9mIiwKICAgICAgICAidmFyIiwgInZvaWQiLAogICAgICAgICJ5aWVsZCIsCiAgICAgICAgIndoaWxlIiwgIndpdGgiLAogICAgXTsKCiAgICB2YXIgc3RhdGVtZW50U3RhcnRUb2tlbnMgPSBbCiAgICAgICAgImJyZWFrIiwKICAgICAgICAiY29uc3QiLCAiY29udGludWUiLAogICAgICAgICJkZWJ1Z2dlciIsICJkbyIsCiAgICAgICAgImZvciIsCiAgICAgICAgImlmIiwKICAgICAgICAicmV0dXJuIiwKICAgICAgICAic3dpdGNoIiwKICAgICAgICAidGhyb3ciLCAidHJ5IiwKICAgICAgICAidmFyIiwKICAgICAgICAieWllbGQiLAogICAgICAgICJ3aGlsZSIsICJ3aXRoIiwKICAgIF07CgogICAgLy8gV2hpdGVzcGFjZSBjaGFyYWN0ZXJzIChzZWUgRUNNQS0yNjIgNy4yKQogICAgdmFyIHdoaXRlc3BhY2VDaGFycyA9IFsKICAgICAgICAvLyBub3JtYWwgd2hpdGVzcGFjZToKICAgICAgICAiXHUwMDA5IiwgIlx1MDAwQiIsICJcdTAwMEMiLCAiXHUwMDIwIiwgIlx1MDBBMCIsICJcdUZFRkYiLCAKCiAgICAgICAgLy8gaGlnaC1Vbmljb2RlIHdoaXRlc3BhY2U6CiAgICAgICAgIlx1MTY4MCIsICJcdTE4MEUiLAogICAgICAgICJcdTIwMDAiLCAiXHUyMDAxIiwgIlx1MjAwMiIsICJcdTIwMDMiLCAiXHUyMDA0IiwgIlx1MjAwNSIsICJcdTIwMDYiLAogICAgICAgICJcdTIwMDciLCAiXHUyMDA4IiwgIlx1MjAwOSIsICJcdTIwMEEiLAogICAgICAgICJcdTIwMkYiLCAiXHUyMDVGIiwgIlx1MzAwMCIKICAgIF07CgogICAgdmFyIHdoaXRlc3BhY2UgPSB7fTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd2hpdGVzcGFjZUNoYXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgd2hpdGVzcGFjZVt3aGl0ZXNwYWNlQ2hhcnNbaV1dID0gdHJ1ZTsKICAgIH0KCiAgICAvLyBPcGVyYXRvciBhbmQgcHVuY3R1YXRvciBtYXBwaW5nIGZyb20gdG9rZW4gdG8gdHJlZSBub2RlIHR5cGUgbmFtZS4KICAgIC8vIE5COiBiZWNhdXNlIHRoZSBsZXhlciBkb2Vzbid0IGJhY2t0cmFjaywgYWxsIHRva2VuIHByZWZpeGVzIG11c3QgdGhlbXNlbHZlcwogICAgLy8gYmUgdmFsaWQgdG9rZW5zIChlLmcuICE9PSBpcyBhY2NlcHRhYmxlIGJlY2F1c2UgaXRzIHByZWZpeGVzIGFyZSB0aGUgdmFsaWQKICAgIC8vIHRva2VucyAhPSBhbmQgISkuCiAgICB2YXIgb3BUeXBlTmFtZXMgPSB7CiAgICAgICAgJ1xuJzogICAiTkVXTElORSIsCiAgICAgICAgJzsnOiAgICAiU0VNSUNPTE9OIiwKICAgICAgICAnLCc6ICAgICJDT01NQSIsCiAgICAgICAgJz8nOiAgICAiSE9PSyIsCiAgICAgICAgJzonOiAgICAiQ09MT04iLAogICAgICAgICd8fCc6ICAgIk9SIiwKICAgICAgICAnJiYnOiAgICJBTkQiLAogICAgICAgICd8JzogICAgIkJJVFdJU0VfT1IiLAogICAgICAgICdeJzogICAgIkJJVFdJU0VfWE9SIiwKICAgICAgICAnJic6ICAgICJCSVRXSVNFX0FORCIsCiAgICAgICAgJz09PSc6ICAiU1RSSUNUX0VRIiwKICAgICAgICAnPT0nOiAgICJFUSIsCiAgICAgICAgJz0nOiAgICAiQVNTSUdOIiwKICAgICAgICAnIT09JzogICJTVFJJQ1RfTkUiLAogICAgICAgICchPSc6ICAgIk5FIiwKICAgICAgICAnPDwnOiAgICJMU0giLAogICAgICAgICc8PSc6ICAgIkxFIiwKICAgICAgICAnPCc6ICAgICJMVCIsCiAgICAgICAgJz4+Pic6ICAiVVJTSCIsCiAgICAgICAgJz4+JzogICAiUlNIIiwKICAgICAgICAnPj0nOiAgICJHRSIsCiAgICAgICAgJz4nOiAgICAiR1QiLAogICAgICAgICcrKyc6ICAgIklOQ1JFTUVOVCIsCiAgICAgICAgJy0tJzogICAiREVDUkVNRU5UIiwKICAgICAgICAnKyc6ICAgICJQTFVTIiwKICAgICAgICAnLSc6ICAgICJNSU5VUyIsCiAgICAgICAgJyonOiAgICAiTVVMIiwKICAgICAgICAnLyc6ICAgICJESVYiLAogICAgICAgICclJzogICAgIk1PRCIsCiAgICAgICAgJyEnOiAgICAiTk9UIiwKICAgICAgICAnfic6ICAgICJCSVRXSVNFX05PVCIsCiAgICAgICAgJy4nOiAgICAiRE9UIiwKICAgICAgICAnWyc6ICAgICJMRUZUX0JSQUNLRVQiLAogICAgICAgICddJzogICAgIlJJR0hUX0JSQUNLRVQiLAogICAgICAgICd7JzogICAgIkxFRlRfQ1VSTFkiLAogICAgICAgICd9JzogICAgIlJJR0hUX0NVUkxZIiwKICAgICAgICAnKCc6ICAgICJMRUZUX1BBUkVOIiwKICAgICAgICAnKSc6ICAgICJSSUdIVF9QQVJFTiIKICAgIH07CgogICAgLy8gSGFzaCBvZiBrZXl3b3JkIGlkZW50aWZpZXIgdG8gdG9rZW5zIGluZGV4LiAgTkI6IHdlIG11c3QgbnVsbCBfX3Byb3RvX18gdG8KICAgIC8vIGF2b2lkIHRvU3RyaW5nLCBldGMuIG5hbWVzcGFjZSBwb2xsdXRpb24uCiAgICB2YXIga2V5d29yZHMgPSB7X19wcm90b19fOiBudWxsfTsKCiAgICAvLyBEZWZpbmUgY29uc3QgRU5ELCBldGMuLCBiYXNlZCBvbiB0aGUgdG9rZW4gbmFtZXMuICBBbHNvIG1hcCBuYW1lIHRvIGluZGV4LgogICAgdmFyIHRva2VuSWRzID0ge307CgogICAgLy8gQnVpbGRpbmcgdXAgYSBzdHJpbmcgdG8gYmUgZXZhbCdkIGluIGRpZmZlcmVudCBjb250ZXh0cy4KICAgIHZhciBjb25zdHMgPSBOYXJjaXNzdXMuaG9zdFN1cHBvcnRzRXZhbENvbnN0ID8gImNvbnN0ICIgOiAidmFyICI7CiAgICBmb3IgKHZhciBpID0gMCwgaiA9IHRva2Vucy5sZW5ndGg7IGkgPCBqOyBpKyspIHsKICAgICAgICBpZiAoaSA+IDApCiAgICAgICAgICAgIGNvbnN0cyArPSAiLCAiOwogICAgICAgIHZhciB0ID0gdG9rZW5zW2ldOwogICAgICAgIHZhciBuYW1lOwogICAgICAgIGlmICgvXlthLXpdLy50ZXN0KHQpKSB7CiAgICAgICAgICAgIG5hbWUgPSB0LnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgIGtleXdvcmRzW3RdID0gaTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBuYW1lID0gKC9eXFcvLnRlc3QodCkgPyBvcFR5cGVOYW1lc1t0XSA6IHQpOwogICAgICAgIH0KICAgICAgICBjb25zdHMgKz0gbmFtZSArICIgPSAiICsgaTsKICAgICAgICB0b2tlbklkc1tuYW1lXSA9IGk7CiAgICAgICAgdG9rZW5zW3RdID0gaTsKICAgIH0KICAgIGNvbnN0cyArPSAiOyI7CgogICAgdmFyIGlzU3RhdGVtZW50U3RhcnRDb2RlID0ge19fcHJvdG9fXzogbnVsbH07CiAgICBmb3IgKGkgPSAwLCBqID0gc3RhdGVtZW50U3RhcnRUb2tlbnMubGVuZ3RoOyBpIDwgajsgaSsrKQogICAgICAgIGlzU3RhdGVtZW50U3RhcnRDb2RlW2tleXdvcmRzW3N0YXRlbWVudFN0YXJ0VG9rZW5zW2ldXV0gPSB0cnVlOwoKICAgIC8vIE1hcCBhc3NpZ25tZW50IG9wZXJhdG9ycyB0byB0aGVpciBpbmRleGVzIGluIHRoZSB0b2tlbnMgYXJyYXkuCiAgICB2YXIgYXNzaWduT3BzID0gWyd8JywgJ14nLCAnJicsICc8PCcsICc+PicsICc+Pj4nLCAnKycsICctJywgJyonLCAnLycsICclJ107CgogICAgZm9yIChpID0gMCwgaiA9IGFzc2lnbk9wcy5sZW5ndGg7IGkgPCBqOyBpKyspIHsKICAgICAgICB0ID0gYXNzaWduT3BzW2ldOwogICAgICAgIGFzc2lnbk9wc1t0XSA9IHRva2Vuc1t0XTsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWZpbmVHZXR0ZXIob2JqLCBwcm9wLCBmbiwgZG9udERlbGV0ZSwgZG9udEVudW0pIHsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdldDogZm4sIGNvbmZpZ3VyYWJsZTogIWRvbnREZWxldGUsIGVudW1lcmFibGU6ICFkb250RW51bSB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWZpbmVHZXR0ZXJTZXR0ZXIob2JqLCBwcm9wLCBnZXR0ZXIsIHNldHRlciwgZG9udERlbGV0ZSwgZG9udEVudW0pIHsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCB7CiAgICAgICAgICAgIGdldDogZ2V0dGVyLAogICAgICAgICAgICBzZXQ6IHNldHRlciwKICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhZG9udERlbGV0ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogIWRvbnRFbnVtCiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gZGVmaW5lTWVtb0dldHRlcihvYmosIHByb3AsIGZuLCBkb250RGVsZXRlLCBkb250RW51bSkgewogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIHsKICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciB2YWwgPSBmbigpOwogICAgICAgICAgICAgICAgZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCB2YWwsIGRvbnREZWxldGUsIHRydWUsIGRvbnRFbnVtKTsKICAgICAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogIWRvbnRFbnVtCiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCB2YWwsIGRvbnREZWxldGUsIHJlYWRPbmx5LCBkb250RW51bSkgewogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdmFsdWU6IHZhbCwgd3JpdGFibGU6ICFyZWFkT25seSwgY29uZmlndXJhYmxlOiAhZG9udERlbGV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhZG9udEVudW0gfSk7CiAgICB9CgogICAgLy8gUmV0dXJucyB0cnVlIGlmIGZuIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLiAgKE5vdGU6IFNwaWRlck1vbmtleSBzcGVjaWZpYy4pCiAgICBmdW5jdGlvbiBpc05hdGl2ZUNvZGUoZm4pIHsKICAgICAgICAvLyBSZWxpZXMgb24gdGhlIHRvU3RyaW5nIG1ldGhvZCB0byBpZGVudGlmeSBuYXRpdmUgY29kZS4KICAgICAgICByZXR1cm4gKCh0eXBlb2YgZm4pID09PSAiZnVuY3Rpb24iKSAmJiBmbi50b1N0cmluZygpLm1hdGNoKC9cW25hdGl2ZSBjb2RlXF0vKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBuYW1lKSB7CiAgICAgICAgd2hpbGUgKG9iaikgewogICAgICAgICAgICBpZiAoKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgbmFtZSkpCiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIG5hbWUpOwogICAgICAgICAgICBvYmogPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0UHJvcGVydHlOYW1lcyhvYmopIHsKICAgICAgICB2YXIgdGFibGUgPSBPYmplY3QuY3JlYXRlKG51bGwsIHt9KTsKICAgICAgICB3aGlsZSAob2JqKSB7CiAgICAgICAgICAgIHZhciBuYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaik7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gbmFtZXMubGVuZ3RoOyBpIDwgbjsgaSsrKQogICAgICAgICAgICAgICAgdGFibGVbbmFtZXNbaV1dID0gdHJ1ZTsKICAgICAgICAgICAgb2JqID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0YWJsZSk7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0T3duUHJvcGVydGllcyhvYmopIHsKICAgICAgICB2YXIgbWFwID0ge307CiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopKQogICAgICAgICAgICBtYXBbbmFtZV0gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgbmFtZSk7CiAgICAgICAgcmV0dXJuIG1hcDsKICAgIH0KCiAgICBmdW5jdGlvbiBibGFja2xpc3RIYW5kbGVyKHRhcmdldCwgYmxhY2tsaXN0KSB7CiAgICAgICAgdmFyIG1hc2sgPSBPYmplY3QuY3JlYXRlKG51bGwsIHt9KTsKICAgICAgICB2YXIgcmVkaXJlY3QgPSBTdHJpbmdNYXAuY3JlYXRlKGJsYWNrbGlzdCkubWFwT2JqZWN0KGZ1bmN0aW9uKG5hbWUpIHsgcmV0dXJuIG1hc2s7IH0pOwogICAgICAgIHJldHVybiBtaXhpbkhhbmRsZXIocmVkaXJlY3QsIHRhcmdldCk7CiAgICB9CgogICAgZnVuY3Rpb24gd2hpdGVsaXN0SGFuZGxlcih0YXJnZXQsIHdoaXRlbGlzdCkgewogICAgICAgIHZhciBjYXRjaGFsbCA9IE9iamVjdC5jcmVhdGUobnVsbCwge30pOwogICAgICAgIHZhciByZWRpcmVjdCA9IFN0cmluZ01hcC5jcmVhdGUod2hpdGVsaXN0KS5tYXBPYmplY3QoZnVuY3Rpb24obmFtZSkgeyByZXR1cm4gdGFyZ2V0OyB9KTsKICAgICAgICByZXR1cm4gbWl4aW5IYW5kbGVyKHJlZGlyZWN0LCBjYXRjaGFsbCk7CiAgICB9CgogICAgZnVuY3Rpb24gbWlycm9ySGFuZGxlcih0YXJnZXQsIHdyaXRhYmxlKSB7CiAgICAgICAgdmFyIGhhbmRsZXIgPSBtYWtlUGFzc3RocnVIYW5kbGVyKHRhcmdldCk7CgogICAgICAgIHZhciBkZWZpbmVQcm9wZXJ0eSA9IGhhbmRsZXIuZGVmaW5lUHJvcGVydHk7CiAgICAgICAgaGFuZGxlci5kZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uKG5hbWUsIGRlc2MpIHsKICAgICAgICAgICAgaWYgKCFkZXNjLmVudW1lcmFibGUpCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIm1pcnJvciBwcm9wZXJ0eSBtdXN0IGJlIGVudW1lcmFibGUiKTsKICAgICAgICAgICAgaWYgKCFkZXNjLmNvbmZpZ3VyYWJsZSkKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigibWlycm9yIHByb3BlcnR5IG11c3QgYmUgY29uZmlndXJhYmxlIik7CiAgICAgICAgICAgIGlmIChkZXNjLndyaXRhYmxlICE9PSB3cml0YWJsZSkKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigibWlycm9yIHByb3BlcnR5IG11c3QgIiArICh3cml0YWJsZSA/ICIiIDogIm5vdCAiKSArICJiZSB3cml0YWJsZSIpOwogICAgICAgICAgICBkZWZpbmVQcm9wZXJ0eShuYW1lLCBkZXNjKTsKICAgICAgICB9OwoKICAgICAgICBoYW5kbGVyLmZpeCA9IGZ1bmN0aW9uKCkgeyB9OwogICAgICAgIGhhbmRsZXIuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gaGFuZGxlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3I7CiAgICAgICAgaGFuZGxlci5nZXRPd25Qcm9wZXJ0eU5hbWVzID0gZ2V0UHJvcGVydHlOYW1lcy5iaW5kKGhhbmRsZXIsIHRhcmdldCk7CiAgICAgICAgaGFuZGxlci5rZXlzID0gaGFuZGxlci5lbnVtZXJhdGU7CiAgICAgICAgaGFuZGxlclsiZGVsZXRlIl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIGZhbHNlOyB9OwogICAgICAgIGhhbmRsZXIuaGFzT3duID0gaGFuZGxlci5oYXM7CiAgICAgICAgcmV0dXJuIGhhbmRsZXI7CiAgICB9CgogICAgLyoKICAgICAqIE1peGluIHByb3hpZXMgYnJlYWsgdGhlIHNpbmdsZS1pbmhlcml0YW5jZSBtb2RlbCBvZiBwcm90b3R5cGVzLCBzbwogICAgICogdGhlIGhhbmRsZXIgdHJlYXRzIGFsbCBwcm9wZXJ0aWVzIGFzIG93bi1wcm9wZXJ0aWVzOgogICAgICoKICAgICAqICAgICAgICAgICAgICAgICAgWAogICAgICogICAgICAgICAgICAgICAgICB8CiAgICAgKiAgICAgKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCiAgICAgKiAgICAgfCAgICAgICAgICAgICAgICAgTyAgICAgICB8CiAgICAgKiAgICAgfCAgICAgICAgICAgICAgICAgfCAgICAgICB8CiAgICAgKiAgICAgfCAgTyAgICAgICAgIE8gICAgTyAgICAgICB8CiAgICAgKiAgICAgfCAgfCAgICAgICAgIHwgICAgfCAgICAgICB8CiAgICAgKiAgICAgfCAgTyAgICBPICAgIE8gICAgTyAgICAgICB8CiAgICAgKiAgICAgfCAgfCAgICB8ICAgIHwgICAgfCAgICAgICB8CiAgICAgKiAgICAgfCAgTyAgICBPICAgIE8gICAgTyAgICBPICB8CiAgICAgKiAgICAgfCAgfCAgICB8ICAgIHwgICAgfCAgICB8ICB8CiAgICAgKiAgICAgKy0oKiktLSh3KS0tKHgpLS0oeSktLSh6KS0rCiAgICAgKi8KCiAgICBmdW5jdGlvbiBtaXhpbkhhbmRsZXIocmVkaXJlY3QsIGNhdGNoYWxsKSB7CiAgICAgICAgZnVuY3Rpb24gdGFyZ2V0Rm9yKG5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIGhhc093bihyZWRpcmVjdCwgbmFtZSkgPyByZWRpcmVjdFtuYW1lXSA6IGNhdGNoYWxsOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZ2V0TXV4UHJvcGVydHlEZXNjcmlwdG9yKG5hbWUpIHsKICAgICAgICAgICAgdmFyIGRlc2MgPSBnZXRQcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0Rm9yKG5hbWUpLCBuYW1lKTsKICAgICAgICAgICAgaWYgKGRlc2MpCiAgICAgICAgICAgICAgICBkZXNjLmNvbmZpZ3VyYWJsZSA9IHRydWU7CiAgICAgICAgICAgIHJldHVybiBkZXNjOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZ2V0TXV4UHJvcGVydHlOYW1lcygpIHsKICAgICAgICAgICAgdmFyIG5hbWVzMSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHJlZGlyZWN0KS5maWx0ZXIoZnVuY3Rpb24obmFtZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5hbWUgaW4gcmVkaXJlY3RbbmFtZV07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIgbmFtZXMyID0gZ2V0UHJvcGVydHlOYW1lcyhjYXRjaGFsbCkuZmlsdGVyKGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAhaGFzT3duKHJlZGlyZWN0LCBuYW1lKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBuYW1lczEuY29uY2F0KG5hbWVzMik7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBlbnVtZXJhdGVNdXgoKSB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyZWRpcmVjdCkuZmlsdGVyKGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuYW1lIGluIHJlZGlyZWN0W25hbWVdOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZm9yIChuYW1lIGluIGNhdGNoYWxsKSB7CiAgICAgICAgICAgICAgICBpZiAoIWhhc093bihyZWRpcmVjdCwgbmFtZSkpCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmFtZSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBoYXNNdXgobmFtZSkgewogICAgICAgICAgICByZXR1cm4gbmFtZSBpbiB0YXJnZXRGb3IobmFtZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGdldE11eFByb3BlcnR5RGVzY3JpcHRvciwKICAgICAgICAgICAgZ2V0UHJvcGVydHlEZXNjcmlwdG9yOiBnZXRNdXhQcm9wZXJ0eURlc2NyaXB0b3IsCiAgICAgICAgICAgIGdldE93blByb3BlcnR5TmFtZXM6IGdldE11eFByb3BlcnR5TmFtZXMsCiAgICAgICAgICAgIGRlZmluZVByb3BlcnR5OiBmdW5jdGlvbihuYW1lLCBkZXNjKSB7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0Rm9yKG5hbWUpLCBuYW1lLCBkZXNjKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRlbGV0ZSI6IGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0YXJnZXRGb3IobmFtZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZGVsZXRlIHRhcmdldFtuYW1lXTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gRklYTUU6IGhhIGhhIGhhCiAgICAgICAgICAgIGZpeDogZnVuY3Rpb24oKSB7IH0sCiAgICAgICAgICAgIGhhczogaGFzTXV4LAogICAgICAgICAgICBoYXNPd246IGhhc011eCwKICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbihyZWNlaXZlciwgbmFtZSkgewogICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IHRhcmdldEZvcihuYW1lKTsKICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbbmFtZV07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNldDogZnVuY3Rpb24ocmVjZWl2ZXIsIG5hbWUsIHZhbCkgewogICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IHRhcmdldEZvcihuYW1lKTsKICAgICAgICAgICAgICAgIHRhcmdldFtuYW1lXSA9IHZhbDsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9LAogICAgICAgICAgICBlbnVtZXJhdGU6IGVudW1lcmF0ZU11eCwKICAgICAgICAgICAga2V5czogZW51bWVyYXRlTXV4CiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBtYWtlUGFzc3RocnVIYW5kbGVyKG9iaikgewogICAgICAgIC8vIEhhbmRsZXIgY29waWVkIGZyb20KICAgICAgICAvLyBodHRwOi8vd2lraS5lY21hc2NyaXB0Lm9yZy9kb2t1LnBocD9pZD1oYXJtb255OnByb3hpZXMmcz1wcm94eSUyMG9iamVjdCNleGFtcGxlYV9uby1vcF9mb3J3YXJkaW5nX3Byb3h5CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbihuYW1lKSB7CiAgICAgICAgICAgICAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBuYW1lKTsKCiAgICAgICAgICAgICAgICAvLyBhIHRyYXBwaW5nIHByb3h5J3MgcHJvcGVydGllcyBtdXN0IGFsd2F5cyBiZSBjb25maWd1cmFibGUKICAgICAgICAgICAgICAgIGRlc2MuY29uZmlndXJhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHJldHVybiBkZXNjOwogICAgICAgICAgICB9LAogICAgICAgICAgICBnZXRQcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgICAgICAgICAgIHZhciBkZXNjID0gZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgbmFtZSk7CgogICAgICAgICAgICAgICAgLy8gYSB0cmFwcGluZyBwcm94eSdzIHByb3BlcnRpZXMgbXVzdCBhbHdheXMgYmUgY29uZmlndXJhYmxlCiAgICAgICAgICAgICAgICBkZXNjLmNvbmZpZ3VyYWJsZSA9IHRydWU7CiAgICAgICAgICAgICAgICByZXR1cm4gZGVzYzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZ2V0T3duUHJvcGVydHlOYW1lczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZGVmaW5lUHJvcGVydHk6IGZ1bmN0aW9uKG5hbWUsIGRlc2MpIHsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIG5hbWUsIGRlc2MpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGVsZXRlIjogZnVuY3Rpb24obmFtZSkgeyByZXR1cm4gZGVsZXRlIG9ialtuYW1lXTsgfSwKICAgICAgICAgICAgZml4OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGlmIChPYmplY3QuaXNGcm96ZW4ob2JqKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRPd25Qcm9wZXJ0aWVzKG9iaik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gQXMgbG9uZyBhcyBvYmogaXMgbm90IGZyb3plbiwgdGhlIHByb3h5IHdvbid0IGFsbG93IGl0c2VsZiB0byBiZSBmaXhlZC4KICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIHdpbGwgY2F1c2UgYSBUeXBlRXJyb3IgdG8gYmUgdGhyb3duCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBoYXM6IGZ1bmN0aW9uKG5hbWUpIHsgcmV0dXJuIG5hbWUgaW4gb2JqOyB9LAogICAgICAgICAgICBoYXNPd246IGZ1bmN0aW9uKG5hbWUpIHsgcmV0dXJuICh7fSkuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIG5hbWUpOyB9LAogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKHJlY2VpdmVyLCBuYW1lKSB7IHJldHVybiBvYmpbbmFtZV07IH0sCgogICAgICAgICAgICAvLyBiYWQgYmVoYXZpb3Igd2hlbiBzZXQgZmFpbHMgaW4gbm9uLXN0cmljdCBtb2RlCiAgICAgICAgICAgIHNldDogZnVuY3Rpb24ocmVjZWl2ZXIsIG5hbWUsIHZhbCkgeyBvYmpbbmFtZV0gPSB2YWw7IHJldHVybiB0cnVlOyB9LAogICAgICAgICAgICBlbnVtZXJhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgICAgICAgICAgZm9yIChuYW1lIGluIG9iaikgeyByZXN1bHQucHVzaChuYW1lKTsgfTsKICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGtleXM6IGZ1bmN0aW9uKCkgeyByZXR1cm4gT2JqZWN0LmtleXMob2JqKTsgfQogICAgICAgIH07CiAgICB9CgogICAgdmFyIGhhc093blByb3BlcnR5ID0gKHt9KS5oYXNPd25Qcm9wZXJ0eTsKCiAgICBmdW5jdGlvbiBoYXNPd24ob2JqLCBuYW1lKSB7CiAgICAgICAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwob2JqLCBuYW1lKTsKICAgIH0KCiAgICBmdW5jdGlvbiBTdHJpbmdNYXAodGFibGUsIHNpemUpIHsKICAgICAgICB0aGlzLnRhYmxlID0gdGFibGUgfHwgT2JqZWN0LmNyZWF0ZShudWxsLCB7fSk7CiAgICAgICAgdGhpcy5zaXplID0gc2l6ZSB8fCAwOwogICAgfQoKICAgIFN0cmluZ01hcC5jcmVhdGUgPSBmdW5jdGlvbih0YWJsZSkgewogICAgICAgIHZhciBpbml0ID0gT2JqZWN0LmNyZWF0ZShudWxsLCB7fSk7CiAgICAgICAgdmFyIHNpemUgPSAwOwogICAgICAgIHZhciBuYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhYmxlKTsKICAgICAgICBmb3IgKHZhciBpID0gMCwgbiA9IG5hbWVzLmxlbmd0aDsgaSA8IG47IGkrKykgewogICAgICAgICAgICB2YXIgbmFtZSA9IG5hbWVzW2ldOwogICAgICAgICAgICBpbml0W25hbWVdID0gdGFibGVbbmFtZV07CiAgICAgICAgICAgIHNpemUrKzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdNYXAoaW5pdCwgc2l6ZSk7CiAgICB9OwoKICAgIFN0cmluZ01hcC5wcm90b3R5cGUgPSB7CiAgICAgICAgaGFzOiBmdW5jdGlvbih4KSB7IHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMudGFibGUsIHgpOyB9LAogICAgICAgIHNldDogZnVuY3Rpb24oeCwgdikgewogICAgICAgICAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwodGhpcy50YWJsZSwgeCkpCiAgICAgICAgICAgICAgICB0aGlzLnNpemUrKzsKICAgICAgICAgICAgdGhpcy50YWJsZVt4XSA9IHY7CiAgICAgICAgfSwKICAgICAgICBnZXQ6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHRoaXMudGFibGVbeF07IH0sCiAgICAgICAgZ2V0RGVmOiBmdW5jdGlvbih4LCB0aHVuaykgewogICAgICAgICAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwodGhpcy50YWJsZSwgeCkpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2l6ZSsrOwogICAgICAgICAgICAgICAgdGhpcy50YWJsZVt4XSA9IHRodW5rKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMudGFibGVbeF07CiAgICAgICAgfSwKICAgICAgICBmb3JFYWNoOiBmdW5jdGlvbihmKSB7CiAgICAgICAgICAgIHZhciB0YWJsZSA9IHRoaXMudGFibGU7CiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiB0YWJsZSkKICAgICAgICAgICAgICAgIGYuY2FsbCh0aGlzLCBrZXksIHRhYmxlW2tleV0pOwogICAgICAgIH0sCiAgICAgICAgbWFwOiBmdW5jdGlvbihmKSB7CiAgICAgICAgICAgIHZhciB0YWJsZTEgPSB0aGlzLnRhYmxlOwogICAgICAgICAgICB2YXIgdGFibGUyID0gT2JqZWN0LmNyZWF0ZShudWxsLCB7fSk7CiAgICAgICAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbihrZXksIHZhbCkgewogICAgICAgICAgICAgICAgdGFibGUyW2tleV0gPSBmLmNhbGwodGhpcywgdmFsLCBrZXkpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdNYXAodGFibGUyLCB0aGlzLnNpemUpOwogICAgICAgIH0sCiAgICAgICAgbWFwT2JqZWN0OiBmdW5jdGlvbihmKSB7CiAgICAgICAgICAgIHZhciB0YWJsZTEgPSB0aGlzLnRhYmxlOwogICAgICAgICAgICB2YXIgdGFibGUyID0gT2JqZWN0LmNyZWF0ZShudWxsLCB7fSk7CiAgICAgICAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbihrZXksIHZhbCkgewogICAgICAgICAgICAgICAgdGFibGUyW2tleV0gPSBmLmNhbGwodGhpcywgdmFsLCBrZXkpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHRhYmxlMjsKICAgICAgICB9LAogICAgICAgIHRvT2JqZWN0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFwT2JqZWN0KGZ1bmN0aW9uKHZhbCkgeyByZXR1cm4gdmFsOyB9KTsKICAgICAgICB9LAogICAgICAgIGNob29zZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzLnRhYmxlKVswXTsKICAgICAgICB9LAogICAgICAgIHJlbW92ZTogZnVuY3Rpb24oeCkgewogICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLnRhYmxlLCB4KSkgewogICAgICAgICAgICAgICAgdGhpcy5zaXplLS07CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy50YWJsZVt4XTsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgY29weTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciB0YWJsZSA9IE9iamVjdC5jcmVhdGUobnVsbCwge30pOwogICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy50YWJsZSkKICAgICAgICAgICAgICAgIHRhYmxlW2tleV0gPSB0aGlzLnRhYmxlW2tleV07CiAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nTWFwKHRhYmxlLCB0aGlzLnNpemUpOwogICAgICAgIH0sCiAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgeyByZXR1cm4gIltvYmplY3QgU3RyaW5nTWFwXSIgfQogICAgfTsKCiAgICAvLyBhbiBvYmplY3Qta2V5IHRhYmxlIHdpdGggcG9vciBhc3ltcHRvdGljcyAocmVwbGFjZSB3aXRoIFdlYWtNYXAgd2hlbiBwb3NzaWJsZSkKICAgIGZ1bmN0aW9uIE9iamVjdE1hcChhcnJheSkgewogICAgICAgIHRoaXMuYXJyYXkgPSBhcnJheSB8fCBbXTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWFyY2hNYXAobWFwLCBrZXksIGZvdW5kLCBub3RGb3VuZCkgewogICAgICAgIHZhciBhID0gbWFwLmFycmF5OwogICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gYS5sZW5ndGg7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgdmFyIHBhaXIgPSBhW2ldOwogICAgICAgICAgICBpZiAocGFpci5rZXkgPT09IGtleSkKICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZChwYWlyLCBpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5vdEZvdW5kKCk7CiAgICB9CgogICAgT2JqZWN0TWFwLnByb3RvdHlwZSA9IHsKICAgICAgICBoYXM6IGZ1bmN0aW9uKHgpIHsKICAgICAgICAgICAgcmV0dXJuIHNlYXJjaE1hcCh0aGlzLCB4LCBmdW5jdGlvbigpIHsgcmV0dXJuIHRydWUgfSwgZnVuY3Rpb24oKSB7IHJldHVybiBmYWxzZSB9KTsKICAgICAgICB9LAogICAgICAgIHNldDogZnVuY3Rpb24oeCwgdikgewogICAgICAgICAgICB2YXIgYSA9IHRoaXMuYXJyYXk7CiAgICAgICAgICAgIHNlYXJjaE1hcCh0aGlzLCB4LAogICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24ocGFpcikgeyBwYWlyLnZhbHVlID0gdiB9LAogICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IGEucHVzaCh7IGtleTogeCwgdmFsdWU6IHYgfSkgfSk7CiAgICAgICAgfSwKICAgICAgICBnZXQ6IGZ1bmN0aW9uKHgpIHsKICAgICAgICAgICAgcmV0dXJuIHNlYXJjaE1hcCh0aGlzLCB4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHBhaXIpIHsgcmV0dXJuIHBhaXIudmFsdWUgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgcmV0dXJuIG51bGwgfSk7CiAgICAgICAgfSwKICAgICAgICBnZXREZWY6IGZ1bmN0aW9uKHgsIHRodW5rKSB7CiAgICAgICAgICAgIHZhciBhID0gdGhpcy5hcnJheTsKICAgICAgICAgICAgcmV0dXJuIHNlYXJjaE1hcCh0aGlzLCB4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHBhaXIpIHsgcmV0dXJuIHBhaXIudmFsdWUgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSB0aHVuaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnB1c2goeyBrZXk6IHgsIHZhbHVlOiB2IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICB9LAogICAgICAgIGZvckVhY2g6IGZ1bmN0aW9uKGYpIHsKICAgICAgICAgICAgdmFyIGEgPSB0aGlzLmFycmF5OwogICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbiA9IGEubGVuZ3RoOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgcGFpciA9IGFbaV07CiAgICAgICAgICAgICAgICBmLmNhbGwodGhpcywgcGFpci5rZXksIHBhaXIudmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBjaG9vc2U6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5hcnJheVswXS5rZXk7CiAgICAgICAgfSwKICAgICAgICBnZXQgc2l6ZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXkubGVuZ3RoOwogICAgICAgIH0sCiAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbih4KSB7CiAgICAgICAgICAgIHZhciBhID0gdGhpcy5hcnJheTsKICAgICAgICAgICAgc2VhcmNoTWFwKHRoaXMsIHgsCiAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihwYWlyLCBpKSB7IGEuc3BsaWNlKGksIDEpIH0sCiAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgfSk7CiAgICAgICAgfSwKICAgICAgICBjb3B5OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RNYXAodGhpcy5hcnJheS5tYXAoZnVuY3Rpb24ocGFpcikgewogICAgICAgICAgICAgICAgcmV0dXJuIHsga2V5OiBwYWlyLmtleSwgdmFsdWU6IHBhaXIudmFsdWUgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgfSwKICAgICAgICBjbGVhcjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMuYXJyYXkgPSBbXTsKICAgICAgICB9LAogICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsgcmV0dXJuICJbb2JqZWN0IE9iamVjdE1hcF0iIH0KICAgIH07CgogICAgLy8gbm9uLWRlc3RydWN0aXZlIHN0YWNrCiAgICBmdW5jdGlvbiBTdGFjayhlbHRzKSB7CiAgICAgICAgdGhpcy5lbHRzID0gZWx0cyB8fCBudWxsOwogICAgfQoKICAgIFN0YWNrLnByb3RvdHlwZSA9IHsKICAgICAgICBwdXNoOiBmdW5jdGlvbih4KSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgU3RhY2soeyB0b3A6IHgsIHJlc3Q6IHRoaXMuZWx0cyB9KTsKICAgICAgICB9LAogICAgICAgIHRvcDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5lbHRzKQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJlbXB0eSBzdGFjayIpOwogICAgICAgICAgICByZXR1cm4gdGhpcy5lbHRzLnRvcDsKICAgICAgICB9LAogICAgICAgIGlzRW1wdHk6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy50b3AgPT09IG51bGw7CiAgICAgICAgfSwKICAgICAgICBmaW5kOiBmdW5jdGlvbih0ZXN0KSB7CiAgICAgICAgICAgIGZvciAodmFyIGVsdHMgPSB0aGlzLmVsdHM7IGVsdHM7IGVsdHMgPSBlbHRzLnJlc3QpIHsKICAgICAgICAgICAgICAgIGlmICh0ZXN0KGVsdHMudG9wKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWx0cy50b3A7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKICAgICAgICBoYXM6IGZ1bmN0aW9uKHgpIHsKICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5maW5kKGZ1bmN0aW9uKGVsdCkgeyByZXR1cm4gZWx0ID09PSB4IH0pKTsKICAgICAgICB9LAogICAgICAgIGZvckVhY2g6IGZ1bmN0aW9uKGYpIHsKICAgICAgICAgICAgZm9yICh2YXIgZWx0cyA9IHRoaXMuZWx0czsgZWx0czsgZWx0cyA9IGVsdHMucmVzdCkgewogICAgICAgICAgICAgICAgZihlbHRzLnRvcCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIG1vZHVsZS5leHBvcnRzID0gewogICAgICAgIHRva2VuczogdG9rZW5zLAogICAgICAgIHdoaXRlc3BhY2U6IHdoaXRlc3BhY2UsCiAgICAgICAgb3BUeXBlTmFtZXM6IG9wVHlwZU5hbWVzLAogICAgICAgIGtleXdvcmRzOiBrZXl3b3JkcywKICAgICAgICBpc1N0YXRlbWVudFN0YXJ0Q29kZTogaXNTdGF0ZW1lbnRTdGFydENvZGUsCiAgICAgICAgdG9rZW5JZHM6IHRva2VuSWRzLAogICAgICAgIGNvbnN0czogY29uc3RzLAogICAgICAgIGFzc2lnbk9wczogYXNzaWduT3BzLAogICAgICAgIGRlZmluZUdldHRlcjogZGVmaW5lR2V0dGVyLAogICAgICAgIGRlZmluZUdldHRlclNldHRlcjogZGVmaW5lR2V0dGVyU2V0dGVyLAogICAgICAgIGRlZmluZU1lbW9HZXR0ZXI6IGRlZmluZU1lbW9HZXR0ZXIsCiAgICAgICAgZGVmaW5lUHJvcGVydHk6IGRlZmluZVByb3BlcnR5LAogICAgICAgIGlzTmF0aXZlQ29kZTogaXNOYXRpdmVDb2RlLAogICAgICAgIG1pcnJvckhhbmRsZXI6IG1pcnJvckhhbmRsZXIsCiAgICAgICAgbWl4aW5IYW5kbGVyOiBtaXhpbkhhbmRsZXIsCiAgICAgICAgd2hpdGVsaXN0SGFuZGxlcjogd2hpdGVsaXN0SGFuZGxlciwKICAgICAgICBibGFja2xpc3RIYW5kbGVyOiBibGFja2xpc3RIYW5kbGVyLAogICAgICAgIG1ha2VQYXNzdGhydUhhbmRsZXI6IG1ha2VQYXNzdGhydUhhbmRsZXIsCiAgICAgICAgU3RyaW5nTWFwOiBTdHJpbmdNYXAsCiAgICAgICAgT2JqZWN0TWFwOiBPYmplY3RNYXAsCiAgICAgICAgU3RhY2s6IFN0YWNrCiAgICB9Owp9KTs=]]></data>
	</file>
	<file>
	  <filename>/AceEditor.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEFjZUVkaXRvciAtIFN5bnRheCBoaWdobGlnaHRpbmcgZWRpdG9yIGh0dHA6Ly9hY2UuYWpheC5vcmcvLgojIFZlcnNpb246IDAuMiwgR29yYW4gSWxpYyB1bmlxdTNlQGdtYWlsLmNvbSBodHRwOi8vd3d3LmljaC1tYWNoLWRhcy5hdAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA3IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgRm9yIEhlbHAgYnVpbGRpbmcgbW9kdWxlczoKIyAtIFJlYWQgdGhlIERvY3VtZW50YXRpb24gYXMgaXQgYmVjb21lcyBhdmFpbGFibGUgYXQKIyAgIGh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmcvCiMgLSBDaGVjayBvdXQgdGhlIFNrZWxldG9uIE1vZHVsZSBmb3IgYSBjb21tZW50ZWQgZXhhbXBsZQojIC0gTG9vayBhdCBvdGhlciBtb2R1bGVzLCBhbmQgbGVhcm4gZnJvbSB0aGUgc291cmNlCiMgLSBDaGVjayBvdXQgdGhlIGZvcnVtcyBhdCBodHRwOi8vZm9ydW1zLmNtc21hZGVzaW1wbGUub3JnCiMgLSBDaGF0IHdpdGggZGV2ZWxvcGVycyBvbiB0aGUgI2NtcyBJUkMgY2hhbm5lbAojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKY2xhc3MgQWNlRWRpdG9yIGV4dGVuZHMgQ01TTW9kdWxlIHsKCXByb3RlY3RlZCAkbm9lZGl0b3JzID0gMCwKCSRoZWFkZXJpbmZvc2VudCA9IGZhbHNlLAoJJF9odG1sYWN0aXZlID0gZmFsc2UsCgkkX2phdmFzY3JpcHRhY3RpdmUgPSBmYWxzZSwKCSRfY3NzYWN0aXZlID0gZmFsc2UsCgkkX3BocGFjdGl2ZSA9IGZhbHNlLAoJJF9kZWZhdWx0YWN0aXZlID0gZmFsc2U7CgoJcHVibGljIGZ1bmN0aW9uIEdldE5hbWUoKSB7CgkJcmV0dXJuICdBY2VFZGl0b3InOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBHZXRGcmllbmRseU5hbWUoKSB7CgkJcmV0dXJuICR0aGlzIC0+IExhbmcoJ2ZyaWVuZGx5bmFtZScpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBHZXRWZXJzaW9uKCkgewoJCXJldHVybiAnMC4yLjInOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBHZXRIZWxwKCkgewoKCQkkc21hcnR5ID0gY21zbXMoKSAtPiBHZXRTbWFydHkoKTsKCQkkY29uZmlnID0gY21zbXMoKS0+IEdldENvbmZpZygpOwkJCQoJCSRzbWFydHkgLT4gYXNzaWduKCdtb2R1bGVfcGF0aCcsICgkdGhpcyAtPiBHZXRNb2R1bGVVUkxQYXRoKCkpKTsKCQkKCQkkc21hcnR5IC0+IGFzc2lnbignaGVscF9nZW5lcmFsX3RpdGxlJywgJHRoaXMgLT4gTGFuZygnaGVscF9nZW5lcmFsX3RpdGxlJykpOwoJCSRzbWFydHkgLT4gYXNzaWduKCdoZWxwX2dlbmVyYWxfdGV4dCcsICR0aGlzIC0+IExhbmcoJ2hlbHBfZ2VuZXJhbF90ZXh0JykpOwoJCSRzbWFydHkgLT4gYXNzaWduKCdoZWxwX2tleWJvYXJkc2hvcnRjdXRzX3RpdGxlJywgJHRoaXMgLT4gTGFuZygnaGVscF9rZXlib2FyZHNob3J0Y3V0c190aXRsZScpKTsKCQkkc21hcnR5IC0+IGFzc2lnbignaGVscF9rZXlib2FyZHNob3J0Y3V0c19jb250ZW50JywgJHRoaXMgLT4gTGFuZygnaGVscF9rZXlib2FyZHNob3J0Y3V0c19jb250ZW50JykpOwoJCSRzbWFydHkgLT4gYXNzaWduKCdoZWxwX2Zyb250ZW5kX3RpdGxlJywgJHRoaXMgLT4gTGFuZygnaGVscF9mcm9udGVuZF90aXRsZScpKTsJCQoJCSRzbWFydHkgLT4gYXNzaWduKCdoZWxwX2Zyb250ZW5kX2NvbnRlbnQnLCAkdGhpcyAtPiBMYW5nKCdoZWxwX2Zyb250ZW5kX2NvbnRlbnQnKSk7CgkJJHNtYXJ0eSAtPiBhc3NpZ24oJ2hlbHBfZnJvbnRlbmRfc2FtcGxlJywgY21zX2h0bWxlbnRpdGllcygkdGhpcyAtPiBMYW5nKCdoZWxwX2Zyb250ZW5kX3NhbXBsZScpKSk7CgkJJHNtYXJ0eSAtPiBhc3NpZ24oJ2hlbHBfYWJvdXRfdGl0bGUnLCAkdGhpcyAtPiBMYW5nKCdoZWxwX2Fib3V0X3RpdGxlJykpOwoJCSRzbWFydHkgLT4gYXNzaWduKCdoZWxwX2Fib3V0X3RleHQnLCAkdGhpcyAtPiBMYW5nKCdoZWxwX2Fib3V0X3RleHQnKSk7CgoJCXJldHVybiAkdGhpcyAtPiBQcm9jZXNzVGVtcGxhdGUoJ2hlbHAudHBsJyk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIEdldEF1dGhvcigpIHsKCQlyZXR1cm4gJ0dvcmFuIElsaWMnOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBHZXRBdXRob3JFbWFpbCgpIHsKCQlyZXR1cm4gJ3VuaXF1M2VAZ21haWwuY29tJzsKCX0KCglwdWJsaWMgZnVuY3Rpb24gR2V0Q2hhbmdlTG9nKCkgewoJCXJldHVybiAkdGhpcyAtPiBMYW5nKCdjaGFuZ2Vsb2cnKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gSXNQbHVnaW5Nb2R1bGUoKSB7CgkgIHJldHVybiB0cnVlOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBTZXRQYXJhbWV0ZXJzKCkgCgl7CgkJaWYgKHZlcnNpb25fY29tcGFyZShDTVNfVkVSU0lPTiwgJzEuMTAnKSA8IDApIHsKCQkJJHRoaXMgLT4gSW5pdGlhbGl6ZUZyb250ZW5kKCk7CgkJCSR0aGlzIC0+IEluaXRpYWxpemVBZG1pbigpOwoJCX0JCQoJfQoKCXB1YmxpYyBmdW5jdGlvbiBJbml0aWFsaXplRnJvbnRlbmQoKQoJewoJCSR0aGlzLT5SZWdpc3Rlck1vZHVsZVBsdWdpbigpOwoJCSR0aGlzLT5SZXN0cmljdFVua25vd25QYXJhbXMoKTsKCQkKCQkkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnYWN0aW9uJywgQ0xFQU5fU1RSSU5HKTsKCQkkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnbW9kZXMnLCBDTEVBTl9TVFJJTkcpOwoJCSR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCd0aGVtZXMnLCBDTEVBTl9TVFJJTkcpOwoJCSR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdtb2RlJywgQ0xFQU5fU1RSSU5HKTsKCQkkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgndGhlbWUnLCBDTEVBTl9TVFJJTkcpOwoJCSR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCd3aWR0aCcsIENMRUFOX1NUUklORyk7CgkJJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ2hlaWdodCcsIENMRUFOX1NUUklORyk7CgkJJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ2RpdmlkJywgQ0xFQU5fU1RSSU5HKTsKCgl9CgoJcHVibGljIGZ1bmN0aW9uIEluaXRpYWxpemVBZG1pbigpCgl7CgkJJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcignYWN0aW9uJywgJ2RlZmF1bHQnLCAkdGhpcy0+TGFuZygnaGVscF9wYXJhbV9hY3Rpb24nKSk7CgkJJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcignbW9kZXMnLCAnaHRtbCcsICR0aGlzLT5MYW5nKCdoZWxwX3BhcmFtX21vZGVzJykpOwoJCSR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ3RoZW1lcycsICd0ZXh0bWF0ZScsICR0aGlzLT5MYW5nKCdoZWxwX3BhcmFtX3RoZW1lcycpKTsKCQkkdGhpcy0+Q3JlYXRlUGFyYW1ldGVyKCdtb2RlJywgJ2h0bWwnLCAkdGhpcy0+TGFuZygnaGVscF9wYXJhbV9tb2RlJykpOwoJCSR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ3RoZW1lJywgJ3RleHRtYXRlJywgJHRoaXMtPkxhbmcoJ2hlbHBfcGFyYW1fdGhlbWUnKSk7CgkJJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcignd2lkdGgnLCAnNDAwJywgJHRoaXMtPkxhbmcoJ2hlbHBfcGFyYW1fd2lkdGgnKSk7CgkJJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcignaGVpZ2h0JywgJzQwMCcsICR0aGlzLT5MYW5nKCdoZWxwX3BhcmFtX2hlaWdodCcpKTsKCQkkdGhpcy0+Q3JlYXRlUGFyYW1ldGVyKCdkaXZpZCcsICdlZGl0b3InLCAkdGhpcy0+TGFuZygnaGVscF9wYXJhbV9kaXZpZCcpKTsKCgl9CQoKCXB1YmxpYyBmdW5jdGlvbiBMYXp5TG9hZEZyb250ZW5kKCkgCgl7CgkJcmV0dXJuIHRydWU7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIEhhc0FkbWluKCkgewoJCXJldHVybiB0cnVlOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBHZXRBZG1pblNlY3Rpb24oKSB7CgkJcmV0dXJuICdleHRlbnNpb25zJzsKCX0JCgoJcHVibGljIGZ1bmN0aW9uIEdldEFkbWluRGVzY3JpcHRpb24oKSB7CgkJcmV0dXJuICR0aGlzIC0+IExhbmcoJ2FkbWluZGVzY3JpcHRpb24nKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gVmlzaWJsZVRvQWRtaW5Vc2VyKCkgewoJCXJldHVybiAkdGhpcyAtPiBDaGVja1Blcm1pc3Npb24oJ01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJyk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIE1pbmltdW1DTVNWZXJzaW9uKCkgewoJCXJldHVybiAiMS45IjsKCX0KCglwdWJsaWMgZnVuY3Rpb24gTWF4aW11bUNNU1ZlcnNpb24oKSB7CgkJcmV0dXJuICIxLjExIjsKCX0KCglwdWJsaWMgZnVuY3Rpb24gSW5zdGFsbFBvc3RNZXNzYWdlKCkgewoJCXJldHVybiAkdGhpcyAtPiBMYW5nKCdwb3N0aW5zdGFsbCcpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBVbmluc3RhbGxQb3N0TWVzc2FnZSgpIHsKCQlyZXR1cm4gJHRoaXMgLT4gTGFuZygncG9zdHVuaW5zdGFsbCcpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBVbmluc3RhbGxQcmVNZXNzYWdlKCkgewoJCXJldHVybiAkdGhpcyAtPiBMYW5nKCdyZWFsbHlfdW5pbnN0YWxsJyk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIEhhc0NhcGFiaWxpdHkoJGNhcGFiaWxpdHksICRwYXJhbXMgPSBhcnJheSgpKSB7CgkJc3dpdGNoKCRjYXBhYmlsaXR5KQoJCXsKCQkJZGVmYXVsdDoKCQkJCXJldHVybiBmYWxzZTsKCQkJCWJyZWFrOwoKCQkJY2FzZSAnd3lzaXd5Zyc6CgkJCQlyZXR1cm4gZmFsc2U7CgkJCQlicmVhazsKCgkJCWNhc2UgJ3N5bnRheGhpZ2hsaWdodGluZyc6CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJCWJyZWFrOwoJCX0KCX0KCglwdWJsaWMgZnVuY3Rpb24gSXNXWVNJV1lHKCkgewoJCXJldHVybiBmYWxzZTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gSXNTeW50YXhIaWdobGlnaHRlcigpIHsKCQlyZXR1cm4gdHJ1ZTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gU3ludGF4UGFnZUZvcm1TdWJtaXQoKSB7CgkJcmV0dXJuOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBTeW50YXhUZXh0YXJlYSgkbmFtZSA9ICd0ZXh0YXJlYScsICRzeW50YXggPSAnaHRtbCcsICRjb2x1bW5zID0gJzgwJywgJHJvd3MgPSAnMTUnLCAkZW5jb2RpbmcgPSAnJywgJGNvbnRlbnQgPSAnJywgJHN0eWxlc2hlZXQgPSAnJywgJGFkZHRleHQgPSAnJykKCXsKCQkkdGV4dGFyZWEgPSAiIjsKCQkkdGhpcyAtPiBzeW50YXhhY3RpdmUgPSB0cnVlOwoJCSRzbWFydHkgPSAkdGhpcyAtPiBzbWFydHk7CiAgICAJJGNvbmZpZyA9IGNtc21zKCkgLT4gR2V0Q29uZmlnKCk7CiAgICAJJHNtYXJ0eSAtPiBhc3NpZ24oJ3RleHRhcmVhaWQnLCAiZWRpdG9yIi4kdGhpcyAtPiBub2VkaXRvcnMpOwoJCSRzbWFydHkgLT4gYXNzaWduKCdlZGl0b3JpZCcsICJhY2UtZWRpdG9yIi4kdGhpcyAtPiBub2VkaXRvcnMpOwogICAgCSRzbWFydHkgLT4gYXNzaWduKCd0ZXh0YXJlYW5hbWUnLCAkbmFtZSk7CiAgICAJJHNtYXJ0eSAtPiBhc3NpZ24oJ3N5bnRheF9jb250ZW50JywgJGNvbnRlbnQpOwogICAgCSRzbWFydHkgLT4gYXNzaWduKCdpZCcsICR0aGlzIC0+IG5vZWRpdG9ycyk7CQoKCQkkd2lkdGggPSAkdGhpcyAtPiBHZXRQcmVmZXJlbmNlKCd3aWR0aCcsJzgwJyk7CgkJJHNtYXJ0eSAtPiBhc3NpZ24oJ3dpZHRoJywgJHdpZHRoKTsJCgkJJGhlaWdodCA9ICR0aGlzIC0+IEdldFByZWZlcmVuY2UoJ2hlaWdodCcsJzQwJyk7CgkJJHNtYXJ0eSAtPiBhc3NpZ24oJ2hlaWdodCcsICRoZWlnaHQpOwoJCWlmICgkdGhpcyAtPiBHZXRQcmVmZXJlbmNlKCdlbmFibGVfaWUnLCcxJykgPT0gJzEnKXsKCQkJJHNtYXJ0eSAtPiBhc3NpZ24oJ2VuYWJsZV9pZScsICd0cnVlJyk7CgkJfSBlbHNlIHsKCQkJJHNtYXJ0eSAtPiBhc3NpZ24oJ2VuYWJsZV9pZScsICdmYWxzZScpOwoJCX0JCQkKCQkkdGhlbWUgPSAkdGhpcyAtPiBHZXRQcmVmZXJlbmNlKCd0aGVtZScsJ3RleHRtYXRlJyk7CgkJJHNtYXJ0eSAtPiBhc3NpZ24oJ3RoZW1lJywgJHRoZW1lKTsJCgkJJGZvbnRzaXplID0gJHRoaXMgLT4gR2V0UHJlZmVyZW5jZSgnZm9udHNpemUnLCcxMnB4Jyk7CgkJJHNtYXJ0eSAtPiBhc3NpZ24oJ2ZvbnRzaXplJywgJGZvbnRzaXplKTsJCQkJCgkJaWYgKCR0aGlzIC0+IEdldFByZWZlcmVuY2UoJ2Z1bGxfbGluZScsJzEnKSA9PSAnMScpewoJCQkgJHNtYXJ0eSAtPiBhc3NpZ24oJ2Z1bGxfbGluZScsICdsaW5lJyk7CgkJfSBlbHNlIHsKCQkJJHNtYXJ0eSAtPiBhc3NpZ24oJ2Z1bGxfbGluZScsICd0ZXh0Jyk7CgkJfQoJCWlmICgkdGhpcyAtPiBHZXRQcmVmZXJlbmNlKCdoaWdobGlnaHRfYWN0aXZlJywxKSA9PSAxKXsKCQkJJHNtYXJ0eSAtPiBhc3NpZ24oJ2hpZ2hsaWdodF9hY3RpdmUnLCAndHJ1ZScpOwoJCX0gZWxzZSB7CgkJCSRzbWFydHkgLT4gYXNzaWduKCdoaWdobGlnaHRfYWN0aXZlJywgJ2ZhbHNlJyk7CgkJfQoJCWlmICgkdGhpcyAtPiBHZXRQcmVmZXJlbmNlKCdzaG93X2ludmlzaWJsZXMnLCcxJykgPT0gJzEnKXsKCQkJJHNtYXJ0eSAtPiBhc3NpZ24oJ3Nob3dfaW52aXNpYmxlcycsICd0cnVlJyk7CgkJfSBlbHNlIHsKCQkJJHNtYXJ0eSAtPiBhc3NpZ24oJ3Nob3dfaW52aXNpYmxlcycsICdmYWxzZScpOwoJCX0KCQlpZiAoJHRoaXMgLT4gR2V0UHJlZmVyZW5jZSgncGVyc2lzdGVudF9oc2Nyb2xsJywnMScpID09ICcxJyl7CgkJCSRzbWFydHkgLT4gYXNzaWduKCdwZXJzaXN0ZW50X2hzY3JvbGwnLCAndHJ1ZScpOwoJCX0gZWxzZSB7CgkJCSRzbWFydHkgLT4gYXNzaWduKCdwZXJzaXN0ZW50X2hzY3JvbGwnLCAnZmFsc2UnKTsKCQl9CQoJCSRzb2Z0X3dyYXAgPSAkdGhpcyAtPiBHZXRQcmVmZXJlbmNlKCdzb2Z0X3dyYXAnLCc4MCw4MCcpOwoJCSRzbWFydHkgLT4gYXNzaWduKCdzb2Z0X3dyYXAnLCAkc29mdF93cmFwKTsJCQkJCgkJaWYgKCR0aGlzIC0+IEdldFByZWZlcmVuY2UoJ3Nob3dfZ3V0dGVyJywnMScpID09ICcxJyl7CgkJCSRzbWFydHkgLT4gYXNzaWduKCdzaG93X2d1dHRlcicsICd0cnVlJyk7CgkJfSBlbHNlIHsKCQkJJHNtYXJ0eSAtPiBhc3NpZ24oJ3Nob3dfZ3V0dGVyJywgJ2ZhbHNlJyk7CgkJfQkKCQlpZiAoJHRoaXMgLT4gR2V0UHJlZmVyZW5jZSgncHJpbnRfbWFyZ2luJywnMScpID09ICcxJyl7CgkJCSRzbWFydHkgLT4gYXNzaWduKCdwcmludF9tYXJnaW4nLCAndHJ1ZScpOwoJCX0gZWxzZSB7CgkJCSRzbWFydHkgLT4gYXNzaWduKCdwcmludF9tYXJnaW4nLCAnZmFsc2UnKTsKCQl9CgkJaWYgKCR0aGlzIC0+IEdldFByZWZlcmVuY2UoJ3NvZnRfdGFiJywxKSA9PSAxKXsKCQkJJHNtYXJ0eSAtPiBhc3NpZ24oJ3NvZnRfdGFiJywgJ3RydWUnKTsKCQl9IGVsc2UgewoJCQkkc21hcnR5IC0+IGFzc2lnbignc29mdF90YWInLCAnZmFsc2UnKTsKCQl9CgkJaWYgKCR0aGlzIC0+IEdldFByZWZlcmVuY2UoJ2hpZ2hsaWdodF9zZWxlY3RlZCcsJzEnKSA9PSAnMScpewoJCQkkc21hcnR5IC0+IGFzc2lnbignaGlnaGxpZ2h0X3NlbGVjdGVkJywgJ3RydWUnKTsKCQl9IGVsc2UgewoJCQkkc21hcnR5IC0+IGFzc2lnbignaGlnaGxpZ2h0X3NlbGVjdGVkJywgJ2ZhbHNlJyk7CgkJfQoJCQoJCXN3aXRjaCAoJHN5bnRheCkgewoJCQljYXNlICdodG1sJyA6ICRzbWFydHkgLT4gYXNzaWduKCdtb2RlJywgJ2h0bWwnKTsgJHRoaXMgLT4gX2h0bWxhY3RpdmUgPSB0cnVlOyBicmVhazsKCQkJY2FzZSAnanMnOiBjYXNlICdqYXZhc2NyaXB0JyA6ICRzbWFydHkgLT4gYXNzaWduKCdtb2RlJywgJ2phdmFzY3JpcHQnKTsgJHRoaXMgLT4gX2phdmFzY3JpcHRhY3RpdmUgPSB0cnVlOyBicmVhazsKCQkJY2FzZSAnY3NzJyA6ICRzbWFydHkgLT4gYXNzaWduKCdtb2RlJywgJ2NzcycpOyAkdGhpcyAtPiBfY3NzYWN0aXZlID0gdHJ1ZTsgYnJlYWs7CgkJCWNhc2UgJ3BocCcgOiAkc21hcnR5IC0+IGFzc2lnbignbW9kZScsICdwaHAnKTsgJHRoaXMgLT4gX3BocGFjdGl2ZSA9IHRydWU7IGJyZWFrOwoJCQlkZWZhdWx0IDogJHN5bnRheCA9ICR0aGlzIC0+IEdldFByZWZlcmVuY2UoJ21vZGUnLCdodG1sJyk7ICRzbWFydHkgLT4gYXNzaWduKCdtb2RlJywgJHN5bnRheCk7ICR0aGlzIC0+IF9kZWZhdWx0YWN0aXZlID0gdHJ1ZTsgYnJlYWs7CQoJCX0KCQkKICAgIAkkdGV4dGFyZWEgPSAkdGhpcyAtPiBQcm9jZXNzVGVtcGxhdGUoJ2FjZS50cGwnKTsKCQkkdGhpcyAtPiBub2VkaXRvcnMrKzsKCgkJcmV0dXJuICR0ZXh0YXJlYTsJCQkJCQkJCQkJCQoJfQoKCXB1YmxpYyBmdW5jdGlvbiBTeW50YXhHZW5lcmF0ZUhlYWRlcigkaHRtbHJlc3VsdCA9ICcnKSB7CgkJaWYgKCR0aGlzIC0+IGhlYWRlcmluZm9zZW50KSByZXR1cm4gJyc7CgkJJHRoZW1lID0gJHRoaXMgLT4gR2V0UHJlZmVyZW5jZSgndGhlbWUnLCd0ZXh0bWF0ZScpOwoKCQlpZiAoJHRoaXMgLT4gX2Nzc2FjdGl2ZSkgewoJCQkkc3ludGF4ID0gJ2Nzcyc7CgkJfQoJCWlmICgkdGhpcyAtPiBfamF2YXNjcmlwdGFjdGl2ZSkgewoJCQkkc3ludGF4ID0gJ2phdmFzY3JpcHQnOwoJCX0KCQlpZiAoJHRoaXMgLT4gX3BocGFjdGl2ZSkgewoJCQkkc3ludGF4ID0gJ3BocCc7CgkJfQoJCWlmICgkdGhpcyAtPiBfaHRtbGFjdGl2ZSkgewoJCQkkc3ludGF4ID0gJ2h0bWwnOwoJCX0KCQlpZiAoJHRoaXMgLT4gX2RlZmF1bHRhY3RpdmUpewoJCQkkc3ludGF4ID0gJHRoaXMgLT4gR2V0UHJlZmVyZW5jZSgnbW9kZScsJ2h0bWwnKTsKCQl9CgoJCSRjb21wcmVzc2lvbiA9ICR0aGlzIC0+IEdldFByZWZlcmVuY2UoJ3VzZV91bmNvbXByZXNzZWQnKSA/ICctdW5jb21wcmVzc2VkJyA6ICcnOwoKCQkkaGVhZGVyID0gJwoJCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IicgLiAkdGhpcyAtPiBHZXRNb2R1bGVVUkxQYXRoKCkgLiAnL2Nzcy9qcXVlcnktdWktMS44LjE2LmN1c3RvbS5jc3MiIC8+CgkJPHNjcmlwdCBzcmM9IicgLiAkdGhpcyAtPiBHZXRNb2R1bGVVUkxQYXRoKCkgLiAnL2FjZS9zcmMvYWNlJyAuICRjb21wcmVzc2lvbiAuICcuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgoJCTxzY3JpcHQgc3JjPSInIC4gJHRoaXMgLT4gR2V0TW9kdWxlVVJMUGF0aCgpIC4gJy9hY2Uvc3JjL3RoZW1lLScgLiAkdGhlbWUgLiAkY29tcHJlc3Npb24gLiAnLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4nOwoKCQlpZiAoJHN5bnRheCAhPSAncGxhaW4nKSB7CgkJCSRoZWFkZXIgLj0gJwoJCQk8c2NyaXB0IHNyYz0iJyAuICR0aGlzIC0+IEdldE1vZHVsZVVSTFBhdGgoKSAuICcvYWNlL3NyYy9tb2RlLScgLiAkc3ludGF4IC4gJGNvbXByZXNzaW9uIC4gJy5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+JzsKCQl9CgoJCSR0aGlzIC0+IGhlYWRlcmluZm9zZW50ID0gdHJ1ZTsKCQlyZXR1cm4gJGhlYWRlcjsKCX0KCglwdWJsaWMgZnVuY3Rpb24gTGF6eUxvYWRBZG1pbigpIHsKCQlyZXR1cm4gdHJ1ZTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gR2V0SGVhZGVySFRNTCgpIHsKCQkkaW5jZGlyID0gJHRoaXMgLT4gR2V0TW9kdWxlVVJMUGF0aCgpOwoJCSR0bXBsID0gPDw8RU9UCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7JGluY2Rpcn0vanMvZnVuY3Rpb25zLmpzIj48L3NjcmlwdD4KRU9UOwoJCXJldHVybiAkdGhpcyAtPiBQcm9jZXNzVGVtcGxhdGVGcm9tRGF0YSgkdG1wbCk7Cgl9Cn0KPz4=]]></data>
	</file>
	<file>
	  <filename>/action.default.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFpc3NldCgkZ0NtcykpCglleGl0IDsKCiRkaXZpZCA9ICcnOwokZm9udHNpemUgPSAnMTJweCc7CiR0aGVtZSA9ICd0d2lsaWdodCc7CgppZiAoIWlzc2V0KCRwYXJhbXNbJ2RpdmlkJ10pKQoJcmV0dXJuOwoJLy8gaWQgb2Ygd3JhcHBpbmcgZWxlbWVudAoJJGRpdmlkID0gdHJpbSgkcGFyYW1zWydkaXZpZCddKTsKCS8vIGZvbnRzaXplCgkkZm9udHNpemUgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfZm9udHNpemUnKTsKCS8vIHdpZHRoIG9mIHdyYXBwaW5nIGVsZW1lbnQKCSR3aWR0aCA9IGdldF9wYXJhbWV0ZXJfdmFsdWUoJHBhcmFtcywnd2lkdGgnLCR0aGlzLT5HZXRQcmVmZXJlbmNlKCdmcm9udGVuZF93aWR0aCcpKTsKCS8vIGhlaWdodCBvZiB3cmFwcGluZyBlbGVtZW50CgkkaGVpZ2h0ID0gZ2V0X3BhcmFtZXRlcl92YWx1ZSgkcGFyYW1zLCdoZWlnaHQnLCR0aGlzLT5HZXRQcmVmZXJlbmNlKCdmcm9udGVuZF9oZWlnaHQnKSk7CgkvLyBtb2RlIGZvciBjdXJyZW50IGFyZWEKCSRtb2RlID0gZ2V0X3BhcmFtZXRlcl92YWx1ZSgkcGFyYW1zLCdtb2RlJywgJHRoaXMtPkdldFByZWZlcmVuY2UoJ2Zyb250ZW5kX3N5bnRheGFyZWFfbW9kZScpKTsKCS8vIHRoZW1lIGZvciBjdXJyZW50IGFyZWEKCSR0aGVtZSA9IGdldF9wYXJhbWV0ZXJfdmFsdWUoJHBhcmFtcywndGhlbWUnLCAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfc3ludGF4YXJlYV90aGVtZScpKTsKCgkkc21hcnR5IC0+IGFzc2lnbignZGl2aWQnLCAkZGl2aWQpOwoJaWYgKCRtb2RlKQoJCSRzbWFydHkgLT4gYXNzaWduKCdtb2RlJywgJG1vZGUpOwoJaWYgKCR0aGVtZSkKCQkkc21hcnR5IC0+IGFzc2lnbigndGhlbWUnLCAkdGhlbWUpOwoJaWYgKCRmb250c2l6ZSkKCQkkc21hcnR5IC0+IGFzc2lnbignZm9udHNpemUnLCAkZm9udHNpemUpOwoJaWYgKCR3aWR0aCkKCQkkc21hcnR5IC0+IGFzc2lnbignd2lkdGgnLCAkd2lkdGgpOwoJaWYgKCRoZWlnaHQpCgkJJHNtYXJ0eSAtPiBhc3NpZ24oJ2hlaWdodCcsICRoZWlnaHQpOwoJCgkkc21hcnR5IC0+IGFzc2lnbignYWNlX3VybCcsICR0aGlzIC0+IEdldE1vZHVsZVVSTFBhdGgoKSk7CgkvLyBvdXRwdXQgdGVtcGxhdGUKCWVjaG8gJHRoaXMgLT4gUHJvY2Vzc1RlbXBsYXRlKCdvcmlnX2RlZmF1bHQudHBsJyk7Cj8+]]></data>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFpc3NldCgkZ0NtcykpIApleGl0OwoKCWlmICghJHRoaXMgLT4gQ2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycpKQoJewoJCWVjaG8gJHRoaXMgLT4gU2hvd0Vycm9ycygkdGhpcyAtPiBMYW5nKCduZWVkcGVybWlzc2lvbicsIGFycmF5KCdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycpKSk7CgkJcmV0dXJuOwoJfQoJCiAJaWYgKCFlbXB0eSgkcGFyYW1zWydhY3RpdmVfdGFiJ10pKSB7CgkkdGFiID0gJHBhcmFtc1snYWN0aXZlX3RhYiddOwoJfSBlbHNlIHsKCQkkdGFiID0gJ3NldHRpbmdzJzsKCX0JCgkvKiBUYWJIZWFkZXJzICovCgllY2hvICR0aGlzIC0+IFN0YXJ0VGFiSGVhZGVycygpOwoJCS8vIGJhY2tlbmQKCQllY2hvICR0aGlzIC0+IFNldFRhYkhlYWRlcignc2V0dGluZ3MnLCAkdGhpcyAtPiBMYW5nKCdzZXR0aW5nc190YWInKSwgKCR0YWIgPT0gJ3NldHRpbmdzJykpOwoJCS8vIGZyb250ZW5kCgkJZWNobyAkdGhpcyAtPiBTZXRUYWJIZWFkZXIoJ2Zyb250ZW5kc2V0dGluZ3MnLCAkdGhpcyAtPiBMYW5nKCdmcm9udGVuZHNldHRpbmdzX3RhYicpLCAoJHRhYiA9PSAnZnJvbnRlbmRzZXR0aW5ncycpKTsKCWVjaG8gJHRoaXMgLT4gRW5kVGFiSGVhZGVycygpOwoJCgkvKiBUYWJDb250ZW50ICovCgllY2hvICR0aGlzIC0+IFN0YXJ0VGFiQ29udGVudCgpOwoJCS8vIGJhY2tlbmQKCQllY2hvICR0aGlzIC0+IFN0YXJ0VGFiKCdzZXR0aW5ncycsICRwYXJhbXMpOwoJCWluY2x1ZGUoZGlybmFtZShfX0ZJTEVfXykuJy9mdW5jdGlvbi5hZG1pbl9wcmVmc3RhYi5waHAnKTsKCQllY2hvICR0aGlzIC0+IEVuZFRhYigpOwoJCS8vIGZyb250ZW5kCgkJZWNobyAkdGhpcyAtPiBTdGFydFRhYignZnJvbnRlbmRzZXR0aW5ncycsICRwYXJhbXMpOwoJCWluY2x1ZGUoZGlybmFtZShfX0ZJTEVfXykuJy9mdW5jdGlvbi5hZG1pbl9mcm9udGVuZHByZWZzdGFiLnBocCcpOwoJCWVjaG8gJHRoaXMgLT4gRW5kVGFiKCk7CgllY2hvICR0aGlzIC0+IEVuZFRhYkNvbnRlbnQoKTsKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.head.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFpc3NldCgkZ0NtcykpCglleGl0IDsKCi8vIGluaXRpYWxpemUKJHRoaXMgLT4gZGl2aWQgPSAnJzsKLy8gc2VsZWN0ZWQgdGhlbWVzCiR0aGlzIC0+IHRoZW1lcyA9IGdldF9wYXJhbWV0ZXJfdmFsdWUoJHBhcmFtcywgJ3RoZW1lcycsICR0aGlzIC0+IEdldFByZWZlcmVuY2UoJ2Zyb250ZW5kX3RoZW1lJykpOwovLyBzZWxlY3RlZCBtb2RlcwokdGhpcyAtPiBtb2RlcyA9IGdldF9wYXJhbWV0ZXJfdmFsdWUoJHBhcmFtcywgJ21vZGVzJywgJHRoaXMgLT4gR2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfbW9kZScpKTsKCglpZiAoaXNzZXQoJHBhcmFtc1snZGl2aWQnXSkpCgkJJHRoaXMgLT4gZGl2aWQgPSB0cmltKCRwYXJhbXNbJ2RpdmlkJ10pOwoJaWYgKCFpc19hcnJheSgkdGhpcyAtPiBtb2RlKSkgewoJCSR0aGlzIC0+IG1vZGVzID0gZXhwbG9kZSgnLCcsICR0aGlzIC0+IG1vZGVzKTsKCX0KCWlmIChpc3NldCgkdGhpcyAtPiB0aGVtZXMpICYmICFpc19hcnJheSgkdGhpcyAtPiB0aGVtZXMpKSB7CgkJJHRoaXMgLT4gdGhlbWVzID0gZXhwbG9kZSgnLCcsICR0aGlzIC0+IHRoZW1lcyk7Cgl9CglpZiAoaXNzZXQoJHRoaXMgLT4gdGhlbWVzKSkgewoJCSRzbWFydHkgLT4gYXNzaWduKCd0aGVtZXMnLCAkdGhpcyAtPiB0aGVtZXMpOwoJfQoKCSRzbWFydHkgLT4gYXNzaWduKCdtb2RlcycsICR0aGlzIC0+IG1vZGVzKTsKCSRzbWFydHkgLT4gYXNzaWduKCdhY2VfdXJsJywgJHRoaXMgLT4gR2V0TW9kdWxlVVJMUGF0aCgpKTsKCS8vIG91dHB1dCB0ZW1wbGF0ZQoJZWNobyAkdGhpcyAtPiBQcm9jZXNzVGVtcGxhdGUoJ29yaWdfaGVhZC5qcycpOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.savefrontendsettings.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFpc3NldCgkZ0NtcykpIApleGl0OwoKCWlmICghJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnKSkgewoJCWVjaG8gJHRoaXMtPlNob3dFcnJvcnMoJHRoaXMtPkxhbmcoJ25lZWRwZXJtaXNzaW9uJywgYXJyYXkoJ01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJykpKTsKCQlyZXR1cm47Cgl9CgoJaWYoaXNzZXQoJHBhcmFtc1snZnJvbnRlbmRfd2lkdGgnXSkpIAoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2Zyb250ZW5kX3dpZHRoJywgJHBhcmFtc1snZnJvbnRlbmRfd2lkdGgnXSk7CQoKCWlmKGlzc2V0KCRwYXJhbXNbJ2Zyb250ZW5kX2hlaWdodCddKSkgCgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfaGVpZ2h0JywgJHBhcmFtc1snZnJvbnRlbmRfaGVpZ2h0J10pOwkJCgoJaWYoaXNzZXQoJHBhcmFtc1snZnJvbnRlbmRfbW9kZSddKSkgCgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfbW9kZScsIGltcGxvZGUoJywnLCAkcGFyYW1zWydmcm9udGVuZF9tb2RlJ10pKTsKCglpZihpc3NldCgkcGFyYW1zWydmcm9udGVuZF9zeW50YXhhcmVhX21vZGUnXSkpCgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfc3ludGF4YXJlYV9tb2RlJywgJHBhcmFtc1snZnJvbnRlbmRfc3ludGF4YXJlYV9tb2RlJ10pOwkKCglpZihpc3NldCgkcGFyYW1zWydmcm9udGVuZF90aGVtZSddKSkgCgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfdGhlbWUnLCBpbXBsb2RlKCcsJywgJHBhcmFtc1snZnJvbnRlbmRfdGhlbWUnXSkpOwkKCQoJaWYoaXNzZXQoJHBhcmFtc1snZnJvbnRlbmRfc3ludGF4YXJlYV90aGVtZSddKSkKCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdmcm9udGVuZF9zeW50YXhhcmVhX3RoZW1lJywgJHBhcmFtc1snZnJvbnRlbmRfc3ludGF4YXJlYV90aGVtZSddKTsKCQoJaWYoaXNzZXQoJHBhcmFtc1snZnJvbnRlbmRfZm9udHNpemUnXSkpCgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfZm9udHNpemUnLCAkcGFyYW1zWydmcm9udGVuZF9mb250c2l6ZSddKTsJCQkJCQoKCS8vIHJlZGlyZWN0IHRvIHRhYgkJCQoJJHBhcmFtcyA9IGFycmF5KCdtb2R1bGVfbWVzc2FnZScgPT4gJHRoaXMtPkxhbmcoJ3NldHRpbmdzc2F2ZWQnKSwgJ2FjdGl2ZV90YWInID0+ICdmcm9udGVuZHNldHRpbmdzJyk7CgkkdGhpcy0+UmVkaXJlY3QoJGlkLCAnZGVmYXVsdGFkbWluJywgJycsICRwYXJhbXMpOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.savesettings.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFpc19vYmplY3QoY21zbXMoKSkpIGV4aXQ7CgppZiAoISR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJykpIHsKCWVjaG8gJHRoaXMtPlNob3dFcnJvcnMoJHRoaXMtPkxhbmcoJ25lZWRwZXJtaXNzaW9uJywgYXJyYXkoJ01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJykpKTsKCXJldHVybjsKfQoKaWYoIWVtcHR5KCRwYXJhbXNbJ3dpZHRoJ10pKQp7CgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnd2lkdGgnLCAkcGFyYW1zWyd3aWR0aCddKTsKfQoKaWYoIWVtcHR5KCRwYXJhbXNbJ2hlaWdodCddKSkKewoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2hlaWdodCcsICRwYXJhbXNbJ2hlaWdodCddKTsKfQoKJHRoaXMtPlNldFByZWZlcmVuY2UoJ2VuYWJsZV9pZScsIChpc3NldCgkcGFyYW1zWydlbmFibGVfaWUnXSkgPyAxIDogMCkpOwokdGhpcy0+U2V0UHJlZmVyZW5jZSgndXNlX3VuY29tcHJlc3NlZCcsIChpc3NldCgkcGFyYW1zWyd1c2VfdW5jb21wcmVzc2VkJ10pID8gMSA6IDApKTsKJHRoaXMtPlNldFByZWZlcmVuY2UoJ21vZGUnLCAkcGFyYW1zWydtb2RlJ10pOwokdGhpcy0+U2V0UHJlZmVyZW5jZSgndGhlbWUnLCAkcGFyYW1zWyd0aGVtZSddKTsKJHRoaXMtPlNldFByZWZlcmVuY2UoJ2ZvbnRzaXplJywgJHBhcmFtc1snZm9udHNpemUnXSk7CQokdGhpcy0+U2V0UHJlZmVyZW5jZSgnZnVsbF9saW5lJywgKGlzc2V0KCRwYXJhbXNbJ2Z1bGxfbGluZSddKSA/IDEgOiAwKSk7CiR0aGlzLT5TZXRQcmVmZXJlbmNlKCdoaWdobGlnaHRfYWN0aXZlJywgKGlzc2V0KCRwYXJhbXNbJ2hpZ2hsaWdodF9hY3RpdmUnXSkgPyAxIDogMCkpOwokdGhpcy0+U2V0UHJlZmVyZW5jZSgnc2hvd19pbnZpc2libGVzJywgKGlzc2V0KCRwYXJhbXNbJ3Nob3dfaW52aXNpYmxlcyddKSA/IDEgOiAwKSk7CiR0aGlzLT5TZXRQcmVmZXJlbmNlKCdwZXJzaXN0ZW50X2hzY3JvbGwnLCAoaXNzZXQoJHBhcmFtc1sncGVyc2lzdGVudF9oc2Nyb2xsJ10pID8gMSA6IDApKTsKJHRoaXMtPlNldFByZWZlcmVuY2UoJ2tleWJpbmRpbmcnLCAoaXNzZXQoJHBhcmFtc1sna2V5YmluZGluZyddKSA/IDEgOiAwKSk7CiR0aGlzLT5TZXRQcmVmZXJlbmNlKCdzb2Z0X3dyYXAnLCAkcGFyYW1zWydzb2Z0X3dyYXAnXSk7CiR0aGlzLT5TZXRQcmVmZXJlbmNlKCdzaG93X2d1dHRlcicsIChpc3NldCgkcGFyYW1zWydzaG93X2d1dHRlciddKSA/IDEgOiAwKSk7CiR0aGlzLT5TZXRQcmVmZXJlbmNlKCdwcmludF9tYXJnaW4nLCAoaXNzZXQoJHBhcmFtc1sncHJpbnRfbWFyZ2luJ10pID8gMSA6IDApKTsKJHRoaXMtPlNldFByZWZlcmVuY2UoJ3NvZnRfdGFiJywgKGlzc2V0KCRwYXJhbXNbJ3NvZnRfdGFiJ10pID8gMSA6IDApKTsKJHRoaXMtPlNldFByZWZlcmVuY2UoJ2hpZ2hsaWdodF9zZWxlY3RlZCcsIChpc3NldCgkcGFyYW1zWydoaWdobGlnaHRfc2VsZWN0ZWQnXSkgPyAxIDogMCkpOwokdGhpcy0+U2V0UHJlZmVyZW5jZSgnZW5hYmxlX2JlaGF2aW9ycycsIChpc3NldCgkcGFyYW1zWydlbmFibGVfYmVoYXZpb3JzJ10pID8gMSA6IDApKTsJCQkJCQoKLy8gcmVkaXJlY3QgdG8gdGFiCiRwYXJhbXMgPSBhcnJheSgnbW9kdWxlX21lc3NhZ2UnID0+ICR0aGlzLT5MYW5nKCdzZXR0aW5nc3NhdmVkJyksICdhY3RpdmVfdGFiJyA9PiAnc2V0dGluZ3MnKTsKJHRoaXMtPlJlZGlyZWN0KCRpZCwgJ2RlZmF1bHRhZG1pbicsICcnLCAkcGFyYW1zKTsKPz4=]]></data>
	</file>
	<file>
	  <filename>/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/css/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/css/images/ui-bg_flat_0_aaaaaa_40x100.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAACgAAABkCAYAAAD0ZHJ6AAAAe0lEQVRoge3OMQHAIBAAMcC/kjdZJHTI0A4XBdkz86wfO18H3hRUBVVBVVAVVAVVQVVQFVQFVUFVUBVUBVVBVVAVVAVVQVVQFVQFVUFVUBVUBVVBVVAVVAVVQVVQFVQFVUFVUBVUBVVBVVAVVAVVQVVQFVQFVUFVUBVUF8O8A8WdY6opAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/css/images/ui-bg_flat_75_ffffff_40x100.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAACgAAABkCAYAAAD0ZHJ6AAAAeUlEQVRoge3OMQHAIBAAsVL/nh8JDDfAkCjImpn5HvbfDpwIVoKVYCVYCVaClWAlWAlWgpVgJVgJVoKVYCVYCVaClWAlWAlWgpVgJVgJVoKVYCVYCVaClWAlWAlWgpVgJVgJVoKVYCVYCVaClWAlWAlWgpVgJVgJVhtqiwTEKTLXTgAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/css/images/ui-bg_glass_55_fbf9ee_1x400.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQCAYAAABvWArbAAAAP0lEQVQ4je3PMQrAMABC0a/3v2zX0mCXNkOgc6C4PARd5DqPGKCU8luS8SbAQhiCQRgJE56kZTfbbP9RSvnkBsWcEAZRWcgqAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/css/images/ui-bg_glass_65_ffffff_1x400.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQCAYAAABvWArbAAAAMElEQVQ4je3LIQ4AIBTD0O3f/8wrFgmKhMy8pKJKwkhSKeVbbGuAPU9f4PIopTxgAeS0DRtI4yK0AAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/css/images/ui-bg_glass_75_dadada_1x400.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQCAYAAABvWArbAAAANklEQVQ4jWN48uTJfyYGBgaGUWKUGCWGLfHt2zcoi5GREYNgYmJCZiG42IiB98woMUqMEtgIAMdjCdyg+eEBAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/css/images/ui-bg_glass_75_e6e6e6_1x400.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQCAYAAABvWArbAAAANUlEQVQ4je3LMQoAIBADwb38/6t5wFXaWAiCtUiaYZvF9hBACOFbuntVVe11B0CSjjeE8BwThQIJ8dhEl0YAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/css/images/ui-bg_glass_95_fef1ec_1x400.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQCAYAAABvWArbAAAAPklEQVQ4je3PMQqAMABD0Z/c/7aCIAXjJIhD10LJ8vgZw30eMUApZV/GhZNgSTjoLYElY/hNMJ/S6gullCkPiCIPCr4NiEwAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAABkCAYAAABHLFpgAAAALElEQVQYlWN49OjRfyYGBgaGIUT8//8fSqBx0Yh///4RL8vAwAAVQ2MNOwIAl6g6KkOJwk8AAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/css/images/ui-icons_2e83ff_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAA7VBMVEUsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvwsgvzLrJBNAAAATnRSTlMAGBAyBAhQv4OZLiJUcEBmYBoSzQwgPBZCSEoeWiYwUiyFNIeBw2rJz8c4RBy9uXyrtaWNqa2zKP2fJO8KBgKPo2KVoa9s351GPm5+kWho0kj9AAAPhUlEQVR4nO1djWLbthEGyUiq5YSSLXtp7FpLOmfzkmxr126tmi2p03RJ1/Xe/3EGgARxPyAgRbIk2/hkSz4CJO4+HsE7AJSVysjI2AMUUOxahZ2iANhzBtZWr4BoIRSYAVN5u4QwDwQDRbcwfUi5KS3wFuDmFnQLa4Dtb//cqktwD5QEFFwfUs7PoCCA7y4bEJVFizcIob8KmhAplwwqVjt+9FBl3uINQniwEiryEyw9JHqGpQdEFNi+B4QQ7QOiHhysIPoAxUqxvdvvA9K42bsAv4S2fxfYOe57IJSRkZGRkZGxx7jxSHDHcRBXQMTyIjInBgHwBJ/bEx8PEANC+uhbpSSggCBAVODVabpI1S/k4WLZpTn6NpMhoX9Y40hxYERFpMcqUs4AloCtDQdID1YhnyXZ2hLjAYWiO9Dy1PDB7tPhIqLx+uMB8grZaR+Qxl2/C2RkZGRkZGRk7A7rBf7J0DR5/LUTjzUPIPSPGvQJiVJiB7kcQCiUOJrcFNtDZIf2xarQ3aGvLNxAVIFAabz90BFiBIlycTBhgWwOWCH0FLYHlPqwHaCvcIn2ZbosCevfPTRiFFcgvHukCjWwrc3GrGh1fsAof8EaUReKXkCB4/MzFNo97qLpFiKFYv/kNR5YQxQbQEofkZ2OuEOHqqT6gFTpru8CN7x/+jaZkZGRkZGRcV+x/rLUNcMMqUAscgnFocmpqkTzqymwVAPxfJ5PnIUUQOUKT04tEdWZyv3JCQSn96WS4pD97QfyW25A7NhSAbyhmVj0FEltA4vdiygBibXhoUYgykCUP7HwPTDeEqAIcHVMkZg7Zx4k0uFANs63hPQXCoRLAwdgGsr9Az7Qv7sgQGgg1aPl/BJLExBWgG4RFRLFImGmIquPC/klEGyCG0AuAXaJJC+B8FVe9NYQDEcXB8g6AQcjYJ1goJIggHWCrFR0S6kRHN5+4BzFi8NaoN35NRxUvL+JJdZr7PV4wK6fj8nIyMjIyNhr3OxdXAYq7FHZwB6bDSzSh4sF0utChqo0NAvaT1hLzXwFinmCzmeDucEQK18TTaQoFgP7bNC+RZ4OT4T6gQogDFYk+1QxQlj19QGSAWKiLYp8P0Ag1Gbz1ULfWHLg9iUnQNK5QQJcukm04blKLH2GgEJCY+HzXAZWCvHKco3Bp6MIaCjSXXRJyOxeqhnzEaF93MfFGW/O16ZvDL5TM4MJIjujz/cHypkQuuzRwWJ93BKdIt+wCRAPl9kpe2Ikkb2mFgGlxh/i40d3EHfdvoyMjIyMu43ylt/IAmGHnN5iIt7wKfbv01RAcJqFRl9lcjYQSnbQqKgC4fYOwSJt6N6trE0twZ9kN/PqNpTQeICvr4TLsDYC06U7BMjshS+v1/aT7IwQYD5LcgRQXMT2FrBfBLjZ6151jDElk9tPFfpUgk2yregusX25BJbwAFEfM+YI6vGAti4bTtizB+TjfQCrERyhKb2X8D6A9wX75P4t4neBYJeP6pdhg/gQl8MWvytzeSTjgOQBynQdh/iXKdxOrGJ/RkZGRsb9QmXihGr5+g8GGg9uTh+KoVZuNIzV+CwRucFBEyr1mVjx4irOxwM1BhirB6Q+2eNQi4eqR+aF6mELtoMzCR7V9RAFe/ZvQogNiyY8FPSUTFsLp8TeTmMui5mtw7bcaT0Yw2AA4wFRQIlkgq+1DQrNhkmoxS5Jq+u6bMAIGRECEANgXHTgWzwgBOhDH2l0oTQ4D8D5NMktBgNywAEMjo8rwATMZrPY7JGxBoJCkIBDQiAY09EGTUiBCWkUpISfGPR5AAwBfZiG2z7Ayc1yeKTxid39xBNwfHr4O0LA48ePFTvhYrF1r4tyAoz9n2MCqEuBtp/6GDR0oAYfG/R6wJExHYZHfhygsv7fEWCOj4bYmsP5A+pL4MkTfAnMlD4F+r3bobKvTyTA2P/w7PN+Agq2QW8piqMCpTBwenoKvX0AHGkGtP2YAPvTEWA7QUTAudn7/NxtOG46wWNmDtpBEkBzN7rBEvAFHp+YTB/q97qPAN4gHFqgBi8uLsC7qPCA6mg41G/+ErByPwEXDdoNxRhOx+M5jPEzQugS0ht+b1/Y3gEnYMAIAOIBE29/hIDucE8tmMsNOgK4B1RHFu4UCRlMHzv0xzcajcfdXWDs2h8TArBCkoDUJYDLmz6w7ip3BFS0ve5wTRwAn6keMA9I3QYbfSZ0DKbyt+7OXjGI1idPcfNyAyfAMlCrzaGqphYrxHocLHRJVycnfGUcbtT+jIyMjIw9x7Nn8fJSzG0TmFtO8rZT+XT3S3ub+tKJbbLd5diTVp50+zahyeHSslJ/YPrU0fuazrZO2CZ92/ZCCVXlGRiZKPJyPPRxyIFWeXLQBXJBKiq/3divEAN6ZwM200Qjm7EJBZeWm/PRWVCbYK7s7u2l4XaCz+lzgOfMfhMonXr7TWzeZb98dbgIzBT8Ub8eYYUqfZ4rVJ/MDbIDgPqTulJ/xvntWAtjIisqnwxOkGz0n077FARoY79GdA6HPE4rOy196NiMWHTZlSSApcOgXpy/fHV2joaNKu3ffsAnRcBf4K/6NcIG6tIxk3HyoXPjASqfUgXbYN5PzpL2njkR9QMjeDTVHDTCgRuxOegjoO0FvKzP/t/gmVdI24+G7NIe8JX6Wv3dDyldMA+4YB5wwTygtd+dwRqaTqrLb1l73zTSN52CNpnHuQOYPsDblybgxfkXh/oVtr+N1DEBJdhRJyd/Bd/q1z+cbNrD17iVKyajcnv9arhOkRPgsruuD6DmNPwpDNrLw2CoTgHni4yALr0L29+tiKAEIPn868ejx//8rpWP3OEOl5On9OwpcQm0MhafP/ey8f1uvDNIgGLQG8z4YO99ENgg95etwv4uYJYY8fUGHYH6j6fscHFZMftlAl9i+9XL73X3N/n+ZStOzfVfRvYXhrbdKOpEgVQTg/wsDuDD3kwOfQNMTJ5y+/ltUDWLunyxnRF46IqlBzGMY4X7inggREFioIyMjIyMHWCIB6ZNKAcXseo3vLTQTkVE7348dlwJJSz0+wLfmi8BhZqfw3D4ww/wHVLnEd5/fgYvXsDZ3MlsvYUbbnDjDZ3MN3TJG4+bxjAaDl8TBri9qxEw1ccao2wTNAMLHo2f+sjrXwb/9qHoYqgPMBXJTVfOpmrZH23y6uvo0LHSyY6fHGwKfHJlAuMFvObjDYrIqxBgQi20h7Hd/nYVLmno+eaNUm/eeH2GCuopntnhBJAlI2AHo9CCh1I1QxUdAbqqGY9BBLwyc3W4wYVhvY8A4BoIc1l5M7vnPWphZW9/Ses3n37y9a0uGqFwFQZsQQbd386DogpgEk+dzynsAZMJXq8+ns9NeukJ0PYrNATGGefJQlhkLo7DTXr+y3bNiOsDvrXTz/C2q1DXZH84iRNwrP88Nj+u2DjYEE6RBxD9Knj16ujVHC67A7422o02RwD3gB+t7EblWvu9geOFxSnd3ROmT+nJyQkhoPlsxVONc/3TEdBos+jtA+ZzcwHgTvD1cDjaYCcItA8w9i88A8b+mqSjc6Pvqd998QguEQPmQMeo23ODN86+p0/bn1buBkT6+oBhNZ/PYY4ZAHYb3PRd4LkZmPX68NRtMZn4ASvdA+qf0jMA5MP9eeg28Nug9QiLnj5A33U1MAES6xHAUNpz/9zFAYE1gqQDMT3G6xI9pwdw/aIgKoHCS1YGlRnSq9yCjdXjgN3j+N27YyROHxmuNAeNKPpYuXIyIyMjYy0M8eros59MF/PT2c602T7eA7zvhJ9dr/vzDjXaLp4Yc5+0wllzxzHv3gdmMMM7/CcQzKgVBqYTmFn+Z+mKm8J7k0A5F/jgCfjQ1WBhQyiOqD0lYuqBb+AyzMw9Ha2G3m6c8qQx+AlqnIceQp+Sb6i9UyQWbhr54+AjnZ0VzW2TAN0DmBT6PWmc6jDBE2PK2u+nF43dyP7Q0t1pOcX2fdRvH0mF2Q4JqN35rnHjVIeaXfIAVyUuw/aHCCiJy9iF5l1621zweI8KZrPZ9iJdb7DXJ3US0OSrtZ10imt7wHY7QesAzUMz1oZ3noB3qFJ/H18j97FYuw8QDN4oeKf30osvcSW2ExLo+VcbuAuo/sUIm8fMG9xocO3Ea19J9gFYivnHJ2KnyfovZlgW3v6ySx32abQiIyMjIyPjhlFDTLxpwIgFMnTp6A3g4IDKNY+stkwAMAoIAbasxBXqUWneSAWTMjt50lTqT29rFjvXohjsDNm2YPXDFlICmrJOZ3t6tHm8AiEAl0sCeLIIorIRt+cFbew/QRsoAXb4o1XSfoywzm0FTMAoYBNvLyFu8v8HpLBtD1iKgC17wHb7AI6d9wFbvguAIGTHd4E9wG7jgIyMjIyM+434c2R3HeV/Ffx6jtZu6ijl8h59T655jhR+rdHzDOP6beABCheb8O8/WFXeOyzgf5oAhVYnKxP7CwaAf1afJu8bSrhS6tdaXeGnrRenOqOlz9d6QwYnA/3TLd+GE7qe3chA5YF5DfY0vK3adfOX/gyNp2BW25MHdxAB9qvRiiP3/XpQQFGYDU4+Mi///XumXG8pjvaUAOsBGlf4jJt+YYEzeEzAdw06F19R3juM7D1wita86GR0CKfDHgLuXCc4Bri6vMLdfjMc4VNSUNsdodo2xu/1+Xl/K5+az8jIyMhYG/z5gJTMF1GtKq/a3rpyCvz5gJTMl9GtKq/a3rpyCmfQ4WwZmS+kXFVetb115ST48wEf/AGcfG1iw+tWbpbS2vJ3nQxcVr3lH3z5h972FUTLzYpOVk7l5hD+eYcYwDcAnewOotrZ4OtrPDucqi/LRX0/RR4qx7Nn4U8g+qjffvuN6Gf+nC85vwauHjaYyubqvWYKY4VEfSUMitdnBCT1Ue63R5439m+OgCn6DroAAaHPVQxKth/wkJgHmG8bmQMsT0D6EjDfvhVRKO3ywOQUgRA7nmL1uawZmHf1k+DPBwQ6NdcJ+k6Md1LA5f5ONdhJ8vZ5J0vLHT99srkGOjmJbd/G1r2Nriqnse1AZt1AalU5jW2HsuuG0qvKGRkZGRkZGRG0gcONyXsP9v8D0/IdJADiBNiXl3327WRGgOL/9HC/0XwlIURkRhC4tz6Z/fu7fUf2gHvfB9z3u0BGRkZGRkbGplHcnkgguQoSqtUXuhbs/wPtMwqV0HUJAvj5vk32b8IDuL23yn7qAXZ5u32hbRX7d3o82Df1FZXvbh9QOfhyxldr/+3xgXU9oKmvsHyr7F/XA269/eveBXrsv7N9QALe/tvjA0kPWAXGbvebkbHn+D/J5nMcHzx1UAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/css/images/ui-icons_222222_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAA7VBMVEUkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiQkIiTww4gUAAAATnRSTlMAGBAyBAhQv4OZLiJUcEBmYBoSzQwgPBZCSEoeWiYwUiyFNIeBw2rJz8c4RBy9uXyrtaWNqa2zKP2fJO8KBgKPo2KVoa9s351GPm5+kWho0kj9AAAPhUlEQVR4nO1djWLbthEGyUiq5YSSLXtp7FpLOmfzkmxr126tmi2p03RJ1/Xe/3EGgARxPyAgRbIk2/hkSz4CJO4+HsE7AJSVysjI2AMUUOxahZ2iANhzBtZWr4BoIRSYAVN5u4QwDwQDRbcwfUi5KS3wFuDmFnQLa4Dtb//cqktwD5QEFFwfUs7PoCCA7y4bEJVFizcIob8KmhAplwwqVjt+9FBl3uINQniwEiryEyw9JHqGpQdEFNi+B4QQ7QOiHhysIPoAxUqxvdvvA9K42bsAv4S2fxfYOe57IJSRkZGRkZGxx7jxSHDHcRBXQMTyIjInBgHwBJ/bEx8PEANC+uhbpSSggCBAVODVabpI1S/k4WLZpTn6NpMhoX9Y40hxYERFpMcqUs4AloCtDQdID1YhnyXZ2hLjAYWiO9Dy1PDB7tPhIqLx+uMB8grZaR+Qxl2/C2RkZGRkZGRk7A7rBf7J0DR5/LUTjzUPIPSPGvQJiVJiB7kcQCiUOJrcFNtDZIf2xarQ3aGvLNxAVIFAabz90BFiBIlycTBhgWwOWCH0FLYHlPqwHaCvcIn2ZbosCevfPTRiFFcgvHukCjWwrc3GrGh1fsAof8EaUReKXkCB4/MzFNo97qLpFiKFYv/kNR5YQxQbQEofkZ2OuEOHqqT6gFTpru8CN7x/+jaZkZGRkZGRcV+x/rLUNcMMqUAscgnFocmpqkTzqymwVAPxfJ5PnIUUQOUKT04tEdWZyv3JCQSn96WS4pD97QfyW25A7NhSAbyhmVj0FEltA4vdiygBibXhoUYgykCUP7HwPTDeEqAIcHVMkZg7Zx4k0uFANs63hPQXCoRLAwdgGsr9Az7Qv7sgQGgg1aPl/BJLExBWgG4RFRLFImGmIquPC/klEGyCG0AuAXaJJC+B8FVe9NYQDEcXB8g6AQcjYJ1goJIggHWCrFR0S6kRHN5+4BzFi8NaoN35NRxUvL+JJdZr7PV4wK6fj8nIyMjIyNhr3OxdXAYq7FHZwB6bDSzSh4sF0utChqo0NAvaT1hLzXwFinmCzmeDucEQK18TTaQoFgP7bNC+RZ4OT4T6gQogDFYk+1QxQlj19QGSAWKiLYp8P0Ag1Gbz1ULfWHLg9iUnQNK5QQJcukm04blKLH2GgEJCY+HzXAZWCvHKco3Bp6MIaCjSXXRJyOxeqhnzEaF93MfFGW/O16ZvDL5TM4MJIjujz/cHypkQuuzRwWJ93BKdIt+wCRAPl9kpe2Ikkb2mFgGlxh/i40d3EHfdvoyMjIyMu43ylt/IAmGHnN5iIt7wKfbv01RAcJqFRl9lcjYQSnbQqKgC4fYOwSJt6N6trE0twZ9kN/PqNpTQeICvr4TLsDYC06U7BMjshS+v1/aT7IwQYD5LcgRQXMT2FrBfBLjZ6151jDElk9tPFfpUgk2yregusX25BJbwAFEfM+YI6vGAti4bTtizB+TjfQCrERyhKb2X8D6A9wX75P4t4neBYJeP6pdhg/gQl8MWvytzeSTjgOQBynQdh/iXKdxOrGJ/RkZGRsb9QmXihGr5+g8GGg9uTh+KoVZuNIzV+CwRucFBEyr1mVjx4irOxwM1BhirB6Q+2eNQi4eqR+aF6mELtoMzCR7V9RAFe/ZvQogNiyY8FPSUTFsLp8TeTmMui5mtw7bcaT0Yw2AA4wFRQIlkgq+1DQrNhkmoxS5Jq+u6bMAIGRECEANgXHTgWzwgBOhDH2l0oTQ4D8D5NMktBgNywAEMjo8rwATMZrPY7JGxBoJCkIBDQiAY09EGTUiBCWkUpISfGPR5AAwBfZiG2z7Ayc1yeKTxid39xBNwfHr4O0LA48ePFTvhYrF1r4tyAoz9n2MCqEuBtp/6GDR0oAYfG/R6wJExHYZHfhygsv7fEWCOj4bYmsP5A+pL4MkTfAnMlD4F+r3bobKvTyTA2P/w7PN+Agq2QW8piqMCpTBwenoKvX0AHGkGtP2YAPvTEWA7QUTAudn7/NxtOG46wWNmDtpBEkBzN7rBEvAFHp+YTB/q97qPAN4gHFqgBi8uLsC7qPCA6mg41G/+ErByPwEXDdoNxRhOx+M5jPEzQugS0ht+b1/Y3gEnYMAIAOIBE29/hIDucE8tmMsNOgK4B1RHFu4UCRlMHzv0xzcajcfdXWDs2h8TArBCkoDUJYDLmz6w7ip3BFS0ve5wTRwAn6keMA9I3QYbfSZ0DKbyt+7OXjGI1idPcfNyAyfAMlCrzaGqphYrxHocLHRJVycnfGUcbtT+jIyMjIw9x7Nn8fJSzG0TmFtO8rZT+XT3S3ub+tKJbbLd5diTVp50+zahyeHSslJ/YPrU0fuazrZO2CZ92/ZCCVXlGRiZKPJyPPRxyIFWeXLQBXJBKiq/3divEAN6ZwM200Qjm7EJBZeWm/PRWVCbYK7s7u2l4XaCz+lzgOfMfhMonXr7TWzeZb98dbgIzBT8Ub8eYYUqfZ4rVJ/MDbIDgPqTulJ/xvntWAtjIisqnwxOkGz0n077FARoY79GdA6HPE4rOy196NiMWHTZlSSApcOgXpy/fHV2joaNKu3ffsAnRcBf4K/6NcIG6tIxk3HyoXPjASqfUgXbYN5PzpL2njkR9QMjeDTVHDTCgRuxOegjoO0FvKzP/t/gmVdI24+G7NIe8JX6Wv3dDyldMA+4YB5wwTygtd+dwRqaTqrLb1l73zTSN52CNpnHuQOYPsDblybgxfkXh/oVtr+N1DEBJdhRJyd/Bd/q1z+cbNrD17iVKyajcnv9arhOkRPgsruuD6DmNPwpDNrLw2CoTgHni4yALr0L29+tiKAEIPn868ejx//8rpWP3OEOl5On9OwpcQm0MhafP/ey8f1uvDNIgGLQG8z4YO99ENgg95etwv4uYJYY8fUGHYH6j6fscHFZMftlAl9i+9XL73X3N/n+ZStOzfVfRvYXhrbdKOpEgVQTg/wsDuDD3kwOfQNMTJ5y+/ltUDWLunyxnRF46IqlBzGMY4X7inggREFioIyMjIyMHWCIB6ZNKAcXseo3vLTQTkVE7348dlwJJSz0+wLfmi8BhZqfw3D4ww/wHVLnEd5/fgYvXsDZ3MlsvYUbbnDjDZ3MN3TJG4+bxjAaDl8TBri9qxEw1ccao2wTNAMLHo2f+sjrXwb/9qHoYqgPMBXJTVfOpmrZH23y6uvo0LHSyY6fHGwKfHJlAuMFvObjDYrIqxBgQi20h7Hd/nYVLmno+eaNUm/eeH2GCuopntnhBJAlI2AHo9CCh1I1QxUdAbqqGY9BBLwyc3W4wYVhvY8A4BoIc1l5M7vnPWphZW9/Ses3n37y9a0uGqFwFQZsQQbd386DogpgEk+dzynsAZMJXq8+ns9NeukJ0PYrNATGGefJQlhkLo7DTXr+y3bNiOsDvrXTz/C2q1DXZH84iRNwrP88Nj+u2DjYEE6RBxD9Knj16ujVHC67A7422o02RwD3gB+t7EblWvu9geOFxSnd3ROmT+nJyQkhoPlsxVONc/3TEdBos+jtA+ZzcwHgTvD1cDjaYCcItA8w9i88A8b+mqSjc6Pvqd998QguEQPmQMeo23ODN86+p0/bn1buBkT6+oBhNZ/PYY4ZAHYb3PRd4LkZmPX68NRtMZn4ASvdA+qf0jMA5MP9eeg28Nug9QiLnj5A33U1MAES6xHAUNpz/9zFAYE1gqQDMT3G6xI9pwdw/aIgKoHCS1YGlRnSq9yCjdXjgN3j+N27YyROHxmuNAeNKPpYuXIyIyMjYy0M8eros59MF/PT2c602T7eA7zvhJ9dr/vzDjXaLp4Yc5+0wllzxzHv3gdmMMM7/CcQzKgVBqYTmFn+Z+mKm8J7k0A5F/jgCfjQ1WBhQyiOqD0lYuqBb+AyzMw9Ha2G3m6c8qQx+AlqnIceQp+Sb6i9UyQWbhr54+AjnZ0VzW2TAN0DmBT6PWmc6jDBE2PK2u+nF43dyP7Q0t1pOcX2fdRvH0mF2Q4JqN35rnHjVIeaXfIAVyUuw/aHCCiJy9iF5l1621zweI8KZrPZ9iJdb7DXJ3US0OSrtZ10imt7wHY7QesAzUMz1oZ3noB3qFJ/H18j97FYuw8QDN4oeKf30osvcSW2ExLo+VcbuAuo/sUIm8fMG9xocO3Ea19J9gFYivnHJ2KnyfovZlgW3v6ySx32abQiIyMjIyPjhlFDTLxpwIgFMnTp6A3g4IDKNY+stkwAMAoIAbasxBXqUWneSAWTMjt50lTqT29rFjvXohjsDNm2YPXDFlICmrJOZ3t6tHm8AiEAl0sCeLIIorIRt+cFbew/QRsoAXb4o1XSfoywzm0FTMAoYBNvLyFu8v8HpLBtD1iKgC17wHb7AI6d9wFbvguAIGTHd4E9wG7jgIyMjIyM+434c2R3HeV/Ffx6jtZu6ijl8h59T655jhR+rdHzDOP6beABCheb8O8/WFXeOyzgf5oAhVYnKxP7CwaAf1afJu8bSrhS6tdaXeGnrRenOqOlz9d6QwYnA/3TLd+GE7qe3chA5YF5DfY0vK3adfOX/gyNp2BW25MHdxAB9qvRiiP3/XpQQFGYDU4+Mi///XumXG8pjvaUAOsBGlf4jJt+YYEzeEzAdw06F19R3juM7D1wita86GR0CKfDHgLuXCc4Bri6vMLdfjMc4VNSUNsdodo2xu/1+Xl/K5+az8jIyMhYG/z5gJTMF1GtKq/a3rpyCvz5gJTMl9GtKq/a3rpyCmfQ4WwZmS+kXFVetb115ST48wEf/AGcfG1iw+tWbpbS2vJ3nQxcVr3lH3z5h972FUTLzYpOVk7l5hD+eYcYwDcAnewOotrZ4OtrPDucqi/LRX0/RR4qx7Nn4U8g+qjffvuN6Gf+nC85vwauHjaYyubqvWYKY4VEfSUMitdnBCT1Ue63R5439m+OgCn6DroAAaHPVQxKth/wkJgHmG8bmQMsT0D6EjDfvhVRKO3ywOQUgRA7nmL1uawZmHf1k+DPBwQ6NdcJ+k6Md1LA5f5ONdhJ8vZ5J0vLHT99srkGOjmJbd/G1r2Nriqnse1AZt1AalU5jW2HsuuG0qvKGRkZGRkZGRG0gcONyXsP9v8D0/IdJADiBNiXl3327WRGgOL/9HC/0XwlIURkRhC4tz6Z/fu7fUf2gHvfB9z3u0BGRkZGRkbGplHcnkgguQoSqtUXuhbs/wPtMwqV0HUJAvj5vk32b8IDuL23yn7qAXZ5u32hbRX7d3o82Df1FZXvbh9QOfhyxldr/+3xgXU9oKmvsHyr7F/XA269/eveBXrsv7N9QALe/tvjA0kPWAXGbvebkbHn+D/J5nMcHzx1UAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/css/images/ui-icons_454545_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAA7VBMVEVERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkRERkQfbf86AAAATnRSTlMAGBAyBAhQv4OZLiJUcEBmYBoSzQwgPBZCSEoeWiYwUiyFNIeBw2rJz8c4RBy9uXyrtaWNqa2zKP2fJO8KBgKPo2KVoa9s351GPm5+kWho0kj9AAAPhUlEQVR4nO1djWLbthEGyUiq5YSSLXtp7FpLOmfzkmxr126tmi2p03RJ1/Xe/3EGgARxPyAgRbIk2/hkSz4CJO4+HsE7AJSVysjI2AMUUOxahZ2iANhzBtZWr4BoIRSYAVN5u4QwDwQDRbcwfUi5KS3wFuDmFnQLa4Dtb//cqktwD5QEFFwfUs7PoCCA7y4bEJVFizcIob8KmhAplwwqVjt+9FBl3uINQniwEiryEyw9JHqGpQdEFNi+B4QQ7QOiHhysIPoAxUqxvdvvA9K42bsAv4S2fxfYOe57IJSRkZGRkZGxx7jxSHDHcRBXQMTyIjInBgHwBJ/bEx8PEANC+uhbpSSggCBAVODVabpI1S/k4WLZpTn6NpMhoX9Y40hxYERFpMcqUs4AloCtDQdID1YhnyXZ2hLjAYWiO9Dy1PDB7tPhIqLx+uMB8grZaR+Qxl2/C2RkZGRkZGRk7A7rBf7J0DR5/LUTjzUPIPSPGvQJiVJiB7kcQCiUOJrcFNtDZIf2xarQ3aGvLNxAVIFAabz90BFiBIlycTBhgWwOWCH0FLYHlPqwHaCvcIn2ZbosCevfPTRiFFcgvHukCjWwrc3GrGh1fsAof8EaUReKXkCB4/MzFNo97qLpFiKFYv/kNR5YQxQbQEofkZ2OuEOHqqT6gFTpru8CN7x/+jaZkZGRkZGRcV+x/rLUNcMMqUAscgnFocmpqkTzqymwVAPxfJ5PnIUUQOUKT04tEdWZyv3JCQSn96WS4pD97QfyW25A7NhSAbyhmVj0FEltA4vdiygBibXhoUYgykCUP7HwPTDeEqAIcHVMkZg7Zx4k0uFANs63hPQXCoRLAwdgGsr9Az7Qv7sgQGgg1aPl/BJLExBWgG4RFRLFImGmIquPC/klEGyCG0AuAXaJJC+B8FVe9NYQDEcXB8g6AQcjYJ1goJIggHWCrFR0S6kRHN5+4BzFi8NaoN35NRxUvL+JJdZr7PV4wK6fj8nIyMjIyNhr3OxdXAYq7FHZwB6bDSzSh4sF0utChqo0NAvaT1hLzXwFinmCzmeDucEQK18TTaQoFgP7bNC+RZ4OT4T6gQogDFYk+1QxQlj19QGSAWKiLYp8P0Ag1Gbz1ULfWHLg9iUnQNK5QQJcukm04blKLH2GgEJCY+HzXAZWCvHKco3Bp6MIaCjSXXRJyOxeqhnzEaF93MfFGW/O16ZvDL5TM4MJIjujz/cHypkQuuzRwWJ93BKdIt+wCRAPl9kpe2Ikkb2mFgGlxh/i40d3EHfdvoyMjIyMu43ylt/IAmGHnN5iIt7wKfbv01RAcJqFRl9lcjYQSnbQqKgC4fYOwSJt6N6trE0twZ9kN/PqNpTQeICvr4TLsDYC06U7BMjshS+v1/aT7IwQYD5LcgRQXMT2FrBfBLjZ6151jDElk9tPFfpUgk2yregusX25BJbwAFEfM+YI6vGAti4bTtizB+TjfQCrERyhKb2X8D6A9wX75P4t4neBYJeP6pdhg/gQl8MWvytzeSTjgOQBynQdh/iXKdxOrGJ/RkZGRsb9QmXihGr5+g8GGg9uTh+KoVZuNIzV+CwRucFBEyr1mVjx4irOxwM1BhirB6Q+2eNQi4eqR+aF6mELtoMzCR7V9RAFe/ZvQogNiyY8FPSUTFsLp8TeTmMui5mtw7bcaT0Yw2AA4wFRQIlkgq+1DQrNhkmoxS5Jq+u6bMAIGRECEANgXHTgWzwgBOhDH2l0oTQ4D8D5NMktBgNywAEMjo8rwATMZrPY7JGxBoJCkIBDQiAY09EGTUiBCWkUpISfGPR5AAwBfZiG2z7Ayc1yeKTxid39xBNwfHr4O0LA48ePFTvhYrF1r4tyAoz9n2MCqEuBtp/6GDR0oAYfG/R6wJExHYZHfhygsv7fEWCOj4bYmsP5A+pL4MkTfAnMlD4F+r3bobKvTyTA2P/w7PN+Agq2QW8piqMCpTBwenoKvX0AHGkGtP2YAPvTEWA7QUTAudn7/NxtOG46wWNmDtpBEkBzN7rBEvAFHp+YTB/q97qPAN4gHFqgBi8uLsC7qPCA6mg41G/+ErByPwEXDdoNxRhOx+M5jPEzQugS0ht+b1/Y3gEnYMAIAOIBE29/hIDucE8tmMsNOgK4B1RHFu4UCRlMHzv0xzcajcfdXWDs2h8TArBCkoDUJYDLmz6w7ip3BFS0ve5wTRwAn6keMA9I3QYbfSZ0DKbyt+7OXjGI1idPcfNyAyfAMlCrzaGqphYrxHocLHRJVycnfGUcbtT+jIyMjIw9x7Nn8fJSzG0TmFtO8rZT+XT3S3ub+tKJbbLd5diTVp50+zahyeHSslJ/YPrU0fuazrZO2CZ92/ZCCVXlGRiZKPJyPPRxyIFWeXLQBXJBKiq/3divEAN6ZwM200Qjm7EJBZeWm/PRWVCbYK7s7u2l4XaCz+lzgOfMfhMonXr7TWzeZb98dbgIzBT8Ub8eYYUqfZ4rVJ/MDbIDgPqTulJ/xvntWAtjIisqnwxOkGz0n077FARoY79GdA6HPE4rOy196NiMWHTZlSSApcOgXpy/fHV2joaNKu3ffsAnRcBf4K/6NcIG6tIxk3HyoXPjASqfUgXbYN5PzpL2njkR9QMjeDTVHDTCgRuxOegjoO0FvKzP/t/gmVdI24+G7NIe8JX6Wv3dDyldMA+4YB5wwTygtd+dwRqaTqrLb1l73zTSN52CNpnHuQOYPsDblybgxfkXh/oVtr+N1DEBJdhRJyd/Bd/q1z+cbNrD17iVKyajcnv9arhOkRPgsruuD6DmNPwpDNrLw2CoTgHni4yALr0L29+tiKAEIPn868ejx//8rpWP3OEOl5On9OwpcQm0MhafP/ey8f1uvDNIgGLQG8z4YO99ENgg95etwv4uYJYY8fUGHYH6j6fscHFZMftlAl9i+9XL73X3N/n+ZStOzfVfRvYXhrbdKOpEgVQTg/wsDuDD3kwOfQNMTJ5y+/ltUDWLunyxnRF46IqlBzGMY4X7inggREFioIyMjIyMHWCIB6ZNKAcXseo3vLTQTkVE7348dlwJJSz0+wLfmi8BhZqfw3D4ww/wHVLnEd5/fgYvXsDZ3MlsvYUbbnDjDZ3MN3TJG4+bxjAaDl8TBri9qxEw1ccao2wTNAMLHo2f+sjrXwb/9qHoYqgPMBXJTVfOpmrZH23y6uvo0LHSyY6fHGwKfHJlAuMFvObjDYrIqxBgQi20h7Hd/nYVLmno+eaNUm/eeH2GCuopntnhBJAlI2AHo9CCh1I1QxUdAbqqGY9BBLwyc3W4wYVhvY8A4BoIc1l5M7vnPWphZW9/Ses3n37y9a0uGqFwFQZsQQbd386DogpgEk+dzynsAZMJXq8+ns9NeukJ0PYrNATGGefJQlhkLo7DTXr+y3bNiOsDvrXTz/C2q1DXZH84iRNwrP88Nj+u2DjYEE6RBxD9Knj16ujVHC67A7422o02RwD3gB+t7EblWvu9geOFxSnd3ROmT+nJyQkhoPlsxVONc/3TEdBos+jtA+ZzcwHgTvD1cDjaYCcItA8w9i88A8b+mqSjc6Pvqd998QguEQPmQMeo23ODN86+p0/bn1buBkT6+oBhNZ/PYY4ZAHYb3PRd4LkZmPX68NRtMZn4ASvdA+qf0jMA5MP9eeg28Nug9QiLnj5A33U1MAES6xHAUNpz/9zFAYE1gqQDMT3G6xI9pwdw/aIgKoHCS1YGlRnSq9yCjdXjgN3j+N27YyROHxmuNAeNKPpYuXIyIyMjYy0M8eros59MF/PT2c602T7eA7zvhJ9dr/vzDjXaLp4Yc5+0wllzxzHv3gdmMMM7/CcQzKgVBqYTmFn+Z+mKm8J7k0A5F/jgCfjQ1WBhQyiOqD0lYuqBb+AyzMw9Ha2G3m6c8qQx+AlqnIceQp+Sb6i9UyQWbhr54+AjnZ0VzW2TAN0DmBT6PWmc6jDBE2PK2u+nF43dyP7Q0t1pOcX2fdRvH0mF2Q4JqN35rnHjVIeaXfIAVyUuw/aHCCiJy9iF5l1621zweI8KZrPZ9iJdb7DXJ3US0OSrtZ10imt7wHY7QesAzUMz1oZ3noB3qFJ/H18j97FYuw8QDN4oeKf30osvcSW2ExLo+VcbuAuo/sUIm8fMG9xocO3Ea19J9gFYivnHJ2KnyfovZlgW3v6ySx32abQiIyMjIyPjhlFDTLxpwIgFMnTp6A3g4IDKNY+stkwAMAoIAbasxBXqUWneSAWTMjt50lTqT29rFjvXohjsDNm2YPXDFlICmrJOZ3t6tHm8AiEAl0sCeLIIorIRt+cFbew/QRsoAXb4o1XSfoywzm0FTMAoYBNvLyFu8v8HpLBtD1iKgC17wHb7AI6d9wFbvguAIGTHd4E9wG7jgIyMjIyM+434c2R3HeV/Ffx6jtZu6ijl8h59T655jhR+rdHzDOP6beABCheb8O8/WFXeOyzgf5oAhVYnKxP7CwaAf1afJu8bSrhS6tdaXeGnrRenOqOlz9d6QwYnA/3TLd+GE7qe3chA5YF5DfY0vK3adfOX/gyNp2BW25MHdxAB9qvRiiP3/XpQQFGYDU4+Mi///XumXG8pjvaUAOsBGlf4jJt+YYEzeEzAdw06F19R3juM7D1wita86GR0CKfDHgLuXCc4Bri6vMLdfjMc4VNSUNsdodo2xu/1+Xl/K5+az8jIyMhYG/z5gJTMF1GtKq/a3rpyCvz5gJTMl9GtKq/a3rpyCmfQ4WwZmS+kXFVetb115ST48wEf/AGcfG1iw+tWbpbS2vJ3nQxcVr3lH3z5h972FUTLzYpOVk7l5hD+eYcYwDcAnewOotrZ4OtrPDucqi/LRX0/RR4qx7Nn4U8g+qjffvuN6Gf+nC85vwauHjaYyubqvWYKY4VEfSUMitdnBCT1Ue63R5439m+OgCn6DroAAaHPVQxKth/wkJgHmG8bmQMsT0D6EjDfvhVRKO3ywOQUgRA7nmL1uawZmHf1k+DPBwQ6NdcJ+k6Md1LA5f5ONdhJ8vZ5J0vLHT99srkGOjmJbd/G1r2Nriqnse1AZt1AalU5jW2HsuuG0qvKGRkZGRkZGRG0gcONyXsP9v8D0/IdJADiBNiXl3327WRGgOL/9HC/0XwlIURkRhC4tz6Z/fu7fUf2gHvfB9z3u0BGRkZGRkbGplHcnkgguQoSqtUXuhbs/wPtMwqV0HUJAvj5vk32b8IDuL23yn7qAXZ5u32hbRX7d3o82Df1FZXvbh9QOfhyxldr/+3xgXU9oKmvsHyr7F/XA269/eveBXrsv7N9QALe/tvjA0kPWAXGbvebkbHn+D/J5nMcHzx1UAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/css/images/ui-icons_888888_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAA7VBMVEWMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMioyMiozJxoFPAAAATnRSTlMAGBAyBAhQv4OZLiJUcEBmYBoSzQwgPBZCSEoeWiYwUiyFNIeBw2rJz8c4RBy9uXyrtaWNqa2zKP2fJO8KBgKPo2KVoa9s351GPm5+kWho0kj9AAAPhUlEQVR4nO1djWLbthEGyUiq5YSSLXtp7FpLOmfzkmxr126tmi2p03RJ1/Xe/3EGgARxPyAgRbIk2/hkSz4CJO4+HsE7AJSVysjI2AMUUOxahZ2iANhzBtZWr4BoIRSYAVN5u4QwDwQDRbcwfUi5KS3wFuDmFnQLa4Dtb//cqktwD5QEFFwfUs7PoCCA7y4bEJVFizcIob8KmhAplwwqVjt+9FBl3uINQniwEiryEyw9JHqGpQdEFNi+B4QQ7QOiHhysIPoAxUqxvdvvA9K42bsAv4S2fxfYOe57IJSRkZGRkZGxx7jxSHDHcRBXQMTyIjInBgHwBJ/bEx8PEANC+uhbpSSggCBAVODVabpI1S/k4WLZpTn6NpMhoX9Y40hxYERFpMcqUs4AloCtDQdID1YhnyXZ2hLjAYWiO9Dy1PDB7tPhIqLx+uMB8grZaR+Qxl2/C2RkZGRkZGRk7A7rBf7J0DR5/LUTjzUPIPSPGvQJiVJiB7kcQCiUOJrcFNtDZIf2xarQ3aGvLNxAVIFAabz90BFiBIlycTBhgWwOWCH0FLYHlPqwHaCvcIn2ZbosCevfPTRiFFcgvHukCjWwrc3GrGh1fsAof8EaUReKXkCB4/MzFNo97qLpFiKFYv/kNR5YQxQbQEofkZ2OuEOHqqT6gFTpru8CN7x/+jaZkZGRkZGRcV+x/rLUNcMMqUAscgnFocmpqkTzqymwVAPxfJ5PnIUUQOUKT04tEdWZyv3JCQSn96WS4pD97QfyW25A7NhSAbyhmVj0FEltA4vdiygBibXhoUYgykCUP7HwPTDeEqAIcHVMkZg7Zx4k0uFANs63hPQXCoRLAwdgGsr9Az7Qv7sgQGgg1aPl/BJLExBWgG4RFRLFImGmIquPC/klEGyCG0AuAXaJJC+B8FVe9NYQDEcXB8g6AQcjYJ1goJIggHWCrFR0S6kRHN5+4BzFi8NaoN35NRxUvL+JJdZr7PV4wK6fj8nIyMjIyNhr3OxdXAYq7FHZwB6bDSzSh4sF0utChqo0NAvaT1hLzXwFinmCzmeDucEQK18TTaQoFgP7bNC+RZ4OT4T6gQogDFYk+1QxQlj19QGSAWKiLYp8P0Ag1Gbz1ULfWHLg9iUnQNK5QQJcukm04blKLH2GgEJCY+HzXAZWCvHKco3Bp6MIaCjSXXRJyOxeqhnzEaF93MfFGW/O16ZvDL5TM4MJIjujz/cHypkQuuzRwWJ93BKdIt+wCRAPl9kpe2Ikkb2mFgGlxh/i40d3EHfdvoyMjIyMu43ylt/IAmGHnN5iIt7wKfbv01RAcJqFRl9lcjYQSnbQqKgC4fYOwSJt6N6trE0twZ9kN/PqNpTQeICvr4TLsDYC06U7BMjshS+v1/aT7IwQYD5LcgRQXMT2FrBfBLjZ6151jDElk9tPFfpUgk2yregusX25BJbwAFEfM+YI6vGAti4bTtizB+TjfQCrERyhKb2X8D6A9wX75P4t4neBYJeP6pdhg/gQl8MWvytzeSTjgOQBynQdh/iXKdxOrGJ/RkZGRsb9QmXihGr5+g8GGg9uTh+KoVZuNIzV+CwRucFBEyr1mVjx4irOxwM1BhirB6Q+2eNQi4eqR+aF6mELtoMzCR7V9RAFe/ZvQogNiyY8FPSUTFsLp8TeTmMui5mtw7bcaT0Yw2AA4wFRQIlkgq+1DQrNhkmoxS5Jq+u6bMAIGRECEANgXHTgWzwgBOhDH2l0oTQ4D8D5NMktBgNywAEMjo8rwATMZrPY7JGxBoJCkIBDQiAY09EGTUiBCWkUpISfGPR5AAwBfZiG2z7Ayc1yeKTxid39xBNwfHr4O0LA48ePFTvhYrF1r4tyAoz9n2MCqEuBtp/6GDR0oAYfG/R6wJExHYZHfhygsv7fEWCOj4bYmsP5A+pL4MkTfAnMlD4F+r3bobKvTyTA2P/w7PN+Agq2QW8piqMCpTBwenoKvX0AHGkGtP2YAPvTEWA7QUTAudn7/NxtOG46wWNmDtpBEkBzN7rBEvAFHp+YTB/q97qPAN4gHFqgBi8uLsC7qPCA6mg41G/+ErByPwEXDdoNxRhOx+M5jPEzQugS0ht+b1/Y3gEnYMAIAOIBE29/hIDucE8tmMsNOgK4B1RHFu4UCRlMHzv0xzcajcfdXWDs2h8TArBCkoDUJYDLmz6w7ip3BFS0ve5wTRwAn6keMA9I3QYbfSZ0DKbyt+7OXjGI1idPcfNyAyfAMlCrzaGqphYrxHocLHRJVycnfGUcbtT+jIyMjIw9x7Nn8fJSzG0TmFtO8rZT+XT3S3ub+tKJbbLd5diTVp50+zahyeHSslJ/YPrU0fuazrZO2CZ92/ZCCVXlGRiZKPJyPPRxyIFWeXLQBXJBKiq/3divEAN6ZwM200Qjm7EJBZeWm/PRWVCbYK7s7u2l4XaCz+lzgOfMfhMonXr7TWzeZb98dbgIzBT8Ub8eYYUqfZ4rVJ/MDbIDgPqTulJ/xvntWAtjIisqnwxOkGz0n077FARoY79GdA6HPE4rOy196NiMWHTZlSSApcOgXpy/fHV2joaNKu3ffsAnRcBf4K/6NcIG6tIxk3HyoXPjASqfUgXbYN5PzpL2njkR9QMjeDTVHDTCgRuxOegjoO0FvKzP/t/gmVdI24+G7NIe8JX6Wv3dDyldMA+4YB5wwTygtd+dwRqaTqrLb1l73zTSN52CNpnHuQOYPsDblybgxfkXh/oVtr+N1DEBJdhRJyd/Bd/q1z+cbNrD17iVKyajcnv9arhOkRPgsruuD6DmNPwpDNrLw2CoTgHni4yALr0L29+tiKAEIPn868ejx//8rpWP3OEOl5On9OwpcQm0MhafP/ey8f1uvDNIgGLQG8z4YO99ENgg95etwv4uYJYY8fUGHYH6j6fscHFZMftlAl9i+9XL73X3N/n+ZStOzfVfRvYXhrbdKOpEgVQTg/wsDuDD3kwOfQNMTJ5y+/ltUDWLunyxnRF46IqlBzGMY4X7inggREFioIyMjIyMHWCIB6ZNKAcXseo3vLTQTkVE7348dlwJJSz0+wLfmi8BhZqfw3D4ww/wHVLnEd5/fgYvXsDZ3MlsvYUbbnDjDZ3MN3TJG4+bxjAaDl8TBri9qxEw1ccao2wTNAMLHo2f+sjrXwb/9qHoYqgPMBXJTVfOpmrZH23y6uvo0LHSyY6fHGwKfHJlAuMFvObjDYrIqxBgQi20h7Hd/nYVLmno+eaNUm/eeH2GCuopntnhBJAlI2AHo9CCh1I1QxUdAbqqGY9BBLwyc3W4wYVhvY8A4BoIc1l5M7vnPWphZW9/Ses3n37y9a0uGqFwFQZsQQbd386DogpgEk+dzynsAZMJXq8+ns9NeukJ0PYrNATGGefJQlhkLo7DTXr+y3bNiOsDvrXTz/C2q1DXZH84iRNwrP88Nj+u2DjYEE6RBxD9Knj16ujVHC67A7422o02RwD3gB+t7EblWvu9geOFxSnd3ROmT+nJyQkhoPlsxVONc/3TEdBos+jtA+ZzcwHgTvD1cDjaYCcItA8w9i88A8b+mqSjc6Pvqd998QguEQPmQMeo23ODN86+p0/bn1buBkT6+oBhNZ/PYY4ZAHYb3PRd4LkZmPX68NRtMZn4ASvdA+qf0jMA5MP9eeg28Nug9QiLnj5A33U1MAES6xHAUNpz/9zFAYE1gqQDMT3G6xI9pwdw/aIgKoHCS1YGlRnSq9yCjdXjgN3j+N27YyROHxmuNAeNKPpYuXIyIyMjYy0M8eros59MF/PT2c602T7eA7zvhJ9dr/vzDjXaLp4Yc5+0wllzxzHv3gdmMMM7/CcQzKgVBqYTmFn+Z+mKm8J7k0A5F/jgCfjQ1WBhQyiOqD0lYuqBb+AyzMw9Ha2G3m6c8qQx+AlqnIceQp+Sb6i9UyQWbhr54+AjnZ0VzW2TAN0DmBT6PWmc6jDBE2PK2u+nF43dyP7Q0t1pOcX2fdRvH0mF2Q4JqN35rnHjVIeaXfIAVyUuw/aHCCiJy9iF5l1621zweI8KZrPZ9iJdb7DXJ3US0OSrtZ10imt7wHY7QesAzUMz1oZ3noB3qFJ/H18j97FYuw8QDN4oeKf30osvcSW2ExLo+VcbuAuo/sUIm8fMG9xocO3Ea19J9gFYivnHJ2KnyfovZlgW3v6ySx32abQiIyMjIyPjhlFDTLxpwIgFMnTp6A3g4IDKNY+stkwAMAoIAbasxBXqUWneSAWTMjt50lTqT29rFjvXohjsDNm2YPXDFlICmrJOZ3t6tHm8AiEAl0sCeLIIorIRt+cFbew/QRsoAXb4o1XSfoywzm0FTMAoYBNvLyFu8v8HpLBtD1iKgC17wHb7AI6d9wFbvguAIGTHd4E9wG7jgIyMjIyM+434c2R3HeV/Ffx6jtZu6ijl8h59T655jhR+rdHzDOP6beABCheb8O8/WFXeOyzgf5oAhVYnKxP7CwaAf1afJu8bSrhS6tdaXeGnrRenOqOlz9d6QwYnA/3TLd+GE7qe3chA5YF5DfY0vK3adfOX/gyNp2BW25MHdxAB9qvRiiP3/XpQQFGYDU4+Mi///XumXG8pjvaUAOsBGlf4jJt+YYEzeEzAdw06F19R3juM7D1wita86GR0CKfDHgLuXCc4Bri6vMLdfjMc4VNSUNsdodo2xu/1+Xl/K5+az8jIyMhYG/z5gJTMF1GtKq/a3rpyCvz5gJTMl9GtKq/a3rpyCmfQ4WwZmS+kXFVetb115ST48wEf/AGcfG1iw+tWbpbS2vJ3nQxcVr3lH3z5h972FUTLzYpOVk7l5hD+eYcYwDcAnewOotrZ4OtrPDucqi/LRX0/RR4qx7Nn4U8g+qjffvuN6Gf+nC85vwauHjaYyubqvWYKY4VEfSUMitdnBCT1Ue63R5439m+OgCn6DroAAaHPVQxKth/wkJgHmG8bmQMsT0D6EjDfvhVRKO3ywOQUgRA7nmL1uawZmHf1k+DPBwQ6NdcJ+k6Md1LA5f5ONdhJ8vZ5J0vLHT99srkGOjmJbd/G1r2Nriqnse1AZt1AalU5jW2HsuuG0qvKGRkZGRkZGRG0gcONyXsP9v8D0/IdJADiBNiXl3327WRGgOL/9HC/0XwlIURkRhC4tz6Z/fu7fUf2gHvfB9z3u0BGRkZGRkbGplHcnkgguQoSqtUXuhbs/wPtMwqV0HUJAvj5vk32b8IDuL23yn7qAXZ5u32hbRX7d3o82Df1FZXvbh9QOfhyxldr/+3xgXU9oKmvsHyr7F/XA269/eveBXrsv7N9QALe/tvjA0kPWAXGbvebkbHn+D/J5nMcHzx1UAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/css/images/ui-icons_cd0a0a_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAA7VBMVEXMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzMCgzrDkZjAAAATnRSTlMAGBAyBAhQv4OZLiJUcEBmYBoSzQwgPBZCSEoeWiYwUiyFNIeBw2rJz8c4RBy9uXyrtaWNqa2zKP2fJO8KBgKPo2KVoa9s351GPm5+kWho0kj9AAAPhUlEQVR4nO1djWLbthEGyUiq5YSSLXtp7FpLOmfzkmxr126tmi2p03RJ1/Xe/3EGgARxPyAgRbIk2/hkSz4CJO4+HsE7AJSVysjI2AMUUOxahZ2iANhzBtZWr4BoIRSYAVN5u4QwDwQDRbcwfUi5KS3wFuDmFnQLa4Dtb//cqktwD5QEFFwfUs7PoCCA7y4bEJVFizcIob8KmhAplwwqVjt+9FBl3uINQniwEiryEyw9JHqGpQdEFNi+B4QQ7QOiHhysIPoAxUqxvdvvA9K42bsAv4S2fxfYOe57IJSRkZGRkZGxx7jxSHDHcRBXQMTyIjInBgHwBJ/bEx8PEANC+uhbpSSggCBAVODVabpI1S/k4WLZpTn6NpMhoX9Y40hxYERFpMcqUs4AloCtDQdID1YhnyXZ2hLjAYWiO9Dy1PDB7tPhIqLx+uMB8grZaR+Qxl2/C2RkZGRkZGRk7A7rBf7J0DR5/LUTjzUPIPSPGvQJiVJiB7kcQCiUOJrcFNtDZIf2xarQ3aGvLNxAVIFAabz90BFiBIlycTBhgWwOWCH0FLYHlPqwHaCvcIn2ZbosCevfPTRiFFcgvHukCjWwrc3GrGh1fsAof8EaUReKXkCB4/MzFNo97qLpFiKFYv/kNR5YQxQbQEofkZ2OuEOHqqT6gFTpru8CN7x/+jaZkZGRkZGRcV+x/rLUNcMMqUAscgnFocmpqkTzqymwVAPxfJ5PnIUUQOUKT04tEdWZyv3JCQSn96WS4pD97QfyW25A7NhSAbyhmVj0FEltA4vdiygBibXhoUYgykCUP7HwPTDeEqAIcHVMkZg7Zx4k0uFANs63hPQXCoRLAwdgGsr9Az7Qv7sgQGgg1aPl/BJLExBWgG4RFRLFImGmIquPC/klEGyCG0AuAXaJJC+B8FVe9NYQDEcXB8g6AQcjYJ1goJIggHWCrFR0S6kRHN5+4BzFi8NaoN35NRxUvL+JJdZr7PV4wK6fj8nIyMjIyNhr3OxdXAYq7FHZwB6bDSzSh4sF0utChqo0NAvaT1hLzXwFinmCzmeDucEQK18TTaQoFgP7bNC+RZ4OT4T6gQogDFYk+1QxQlj19QGSAWKiLYp8P0Ag1Gbz1ULfWHLg9iUnQNK5QQJcukm04blKLH2GgEJCY+HzXAZWCvHKco3Bp6MIaCjSXXRJyOxeqhnzEaF93MfFGW/O16ZvDL5TM4MJIjujz/cHypkQuuzRwWJ93BKdIt+wCRAPl9kpe2Ikkb2mFgGlxh/i40d3EHfdvoyMjIyMu43ylt/IAmGHnN5iIt7wKfbv01RAcJqFRl9lcjYQSnbQqKgC4fYOwSJt6N6trE0twZ9kN/PqNpTQeICvr4TLsDYC06U7BMjshS+v1/aT7IwQYD5LcgRQXMT2FrBfBLjZ6151jDElk9tPFfpUgk2yregusX25BJbwAFEfM+YI6vGAti4bTtizB+TjfQCrERyhKb2X8D6A9wX75P4t4neBYJeP6pdhg/gQl8MWvytzeSTjgOQBynQdh/iXKdxOrGJ/RkZGRsb9QmXihGr5+g8GGg9uTh+KoVZuNIzV+CwRucFBEyr1mVjx4irOxwM1BhirB6Q+2eNQi4eqR+aF6mELtoMzCR7V9RAFe/ZvQogNiyY8FPSUTFsLp8TeTmMui5mtw7bcaT0Yw2AA4wFRQIlkgq+1DQrNhkmoxS5Jq+u6bMAIGRECEANgXHTgWzwgBOhDH2l0oTQ4D8D5NMktBgNywAEMjo8rwATMZrPY7JGxBoJCkIBDQiAY09EGTUiBCWkUpISfGPR5AAwBfZiG2z7Ayc1yeKTxid39xBNwfHr4O0LA48ePFTvhYrF1r4tyAoz9n2MCqEuBtp/6GDR0oAYfG/R6wJExHYZHfhygsv7fEWCOj4bYmsP5A+pL4MkTfAnMlD4F+r3bobKvTyTA2P/w7PN+Agq2QW8piqMCpTBwenoKvX0AHGkGtP2YAPvTEWA7QUTAudn7/NxtOG46wWNmDtpBEkBzN7rBEvAFHp+YTB/q97qPAN4gHFqgBi8uLsC7qPCA6mg41G/+ErByPwEXDdoNxRhOx+M5jPEzQugS0ht+b1/Y3gEnYMAIAOIBE29/hIDucE8tmMsNOgK4B1RHFu4UCRlMHzv0xzcajcfdXWDs2h8TArBCkoDUJYDLmz6w7ip3BFS0ve5wTRwAn6keMA9I3QYbfSZ0DKbyt+7OXjGI1idPcfNyAyfAMlCrzaGqphYrxHocLHRJVycnfGUcbtT+jIyMjIw9x7Nn8fJSzG0TmFtO8rZT+XT3S3ub+tKJbbLd5diTVp50+zahyeHSslJ/YPrU0fuazrZO2CZ92/ZCCVXlGRiZKPJyPPRxyIFWeXLQBXJBKiq/3divEAN6ZwM200Qjm7EJBZeWm/PRWVCbYK7s7u2l4XaCz+lzgOfMfhMonXr7TWzeZb98dbgIzBT8Ub8eYYUqfZ4rVJ/MDbIDgPqTulJ/xvntWAtjIisqnwxOkGz0n077FARoY79GdA6HPE4rOy196NiMWHTZlSSApcOgXpy/fHV2joaNKu3ffsAnRcBf4K/6NcIG6tIxk3HyoXPjASqfUgXbYN5PzpL2njkR9QMjeDTVHDTCgRuxOegjoO0FvKzP/t/gmVdI24+G7NIe8JX6Wv3dDyldMA+4YB5wwTygtd+dwRqaTqrLb1l73zTSN52CNpnHuQOYPsDblybgxfkXh/oVtr+N1DEBJdhRJyd/Bd/q1z+cbNrD17iVKyajcnv9arhOkRPgsruuD6DmNPwpDNrLw2CoTgHni4yALr0L29+tiKAEIPn868ejx//8rpWP3OEOl5On9OwpcQm0MhafP/ey8f1uvDNIgGLQG8z4YO99ENgg95etwv4uYJYY8fUGHYH6j6fscHFZMftlAl9i+9XL73X3N/n+ZStOzfVfRvYXhrbdKOpEgVQTg/wsDuDD3kwOfQNMTJ5y+/ltUDWLunyxnRF46IqlBzGMY4X7inggREFioIyMjIyMHWCIB6ZNKAcXseo3vLTQTkVE7348dlwJJSz0+wLfmi8BhZqfw3D4ww/wHVLnEd5/fgYvXsDZ3MlsvYUbbnDjDZ3MN3TJG4+bxjAaDl8TBri9qxEw1ccao2wTNAMLHo2f+sjrXwb/9qHoYqgPMBXJTVfOpmrZH23y6uvo0LHSyY6fHGwKfHJlAuMFvObjDYrIqxBgQi20h7Hd/nYVLmno+eaNUm/eeH2GCuopntnhBJAlI2AHo9CCh1I1QxUdAbqqGY9BBLwyc3W4wYVhvY8A4BoIc1l5M7vnPWphZW9/Ses3n37y9a0uGqFwFQZsQQbd386DogpgEk+dzynsAZMJXq8+ns9NeukJ0PYrNATGGefJQlhkLo7DTXr+y3bNiOsDvrXTz/C2q1DXZH84iRNwrP88Nj+u2DjYEE6RBxD9Knj16ujVHC67A7422o02RwD3gB+t7EblWvu9geOFxSnd3ROmT+nJyQkhoPlsxVONc/3TEdBos+jtA+ZzcwHgTvD1cDjaYCcItA8w9i88A8b+mqSjc6Pvqd998QguEQPmQMeo23ODN86+p0/bn1buBkT6+oBhNZ/PYY4ZAHYb3PRd4LkZmPX68NRtMZn4ASvdA+qf0jMA5MP9eeg28Nug9QiLnj5A33U1MAES6xHAUNpz/9zFAYE1gqQDMT3G6xI9pwdw/aIgKoHCS1YGlRnSq9yCjdXjgN3j+N27YyROHxmuNAeNKPpYuXIyIyMjYy0M8eros59MF/PT2c602T7eA7zvhJ9dr/vzDjXaLp4Yc5+0wllzxzHv3gdmMMM7/CcQzKgVBqYTmFn+Z+mKm8J7k0A5F/jgCfjQ1WBhQyiOqD0lYuqBb+AyzMw9Ha2G3m6c8qQx+AlqnIceQp+Sb6i9UyQWbhr54+AjnZ0VzW2TAN0DmBT6PWmc6jDBE2PK2u+nF43dyP7Q0t1pOcX2fdRvH0mF2Q4JqN35rnHjVIeaXfIAVyUuw/aHCCiJy9iF5l1621zweI8KZrPZ9iJdb7DXJ3US0OSrtZ10imt7wHY7QesAzUMz1oZ3noB3qFJ/H18j97FYuw8QDN4oeKf30osvcSW2ExLo+VcbuAuo/sUIm8fMG9xocO3Ea19J9gFYivnHJ2KnyfovZlgW3v6ySx32abQiIyMjIyPjhlFDTLxpwIgFMnTp6A3g4IDKNY+stkwAMAoIAbasxBXqUWneSAWTMjt50lTqT29rFjvXohjsDNm2YPXDFlICmrJOZ3t6tHm8AiEAl0sCeLIIorIRt+cFbew/QRsoAXb4o1XSfoywzm0FTMAoYBNvLyFu8v8HpLBtD1iKgC17wHb7AI6d9wFbvguAIGTHd4E9wG7jgIyMjIyM+434c2R3HeV/Ffx6jtZu6ijl8h59T655jhR+rdHzDOP6beABCheb8O8/WFXeOyzgf5oAhVYnKxP7CwaAf1afJu8bSrhS6tdaXeGnrRenOqOlz9d6QwYnA/3TLd+GE7qe3chA5YF5DfY0vK3adfOX/gyNp2BW25MHdxAB9qvRiiP3/XpQQFGYDU4+Mi///XumXG8pjvaUAOsBGlf4jJt+YYEzeEzAdw06F19R3juM7D1wita86GR0CKfDHgLuXCc4Bri6vMLdfjMc4VNSUNsdodo2xu/1+Xl/K5+az8jIyMhYG/z5gJTMF1GtKq/a3rpyCvz5gJTMl9GtKq/a3rpyCmfQ4WwZmS+kXFVetb115ST48wEf/AGcfG1iw+tWbpbS2vJ3nQxcVr3lH3z5h972FUTLzYpOVk7l5hD+eYcYwDcAnewOotrZ4OtrPDucqi/LRX0/RR4qx7Nn4U8g+qjffvuN6Gf+nC85vwauHjaYyubqvWYKY4VEfSUMitdnBCT1Ue63R5439m+OgCn6DroAAaHPVQxKth/wkJgHmG8bmQMsT0D6EjDfvhVRKO3ywOQUgRA7nmL1uawZmHf1k+DPBwQ6NdcJ+k6Md1LA5f5ONdhJ8vZ5J0vLHT99srkGOjmJbd/G1r2Nriqnse1AZt1AalU5jW2HsuuG0qvKGRkZGRkZGRG0gcONyXsP9v8D0/IdJADiBNiXl3327WRGgOL/9HC/0XwlIURkRhC4tz6Z/fu7fUf2gHvfB9z3u0BGRkZGRkbGplHcnkgguQoSqtUXuhbs/wPtMwqV0HUJAvj5vk32b8IDuL23yn7qAXZ5u32hbRX7d3o82Df1FZXvbh9QOfhyxldr/+3xgXU9oKmvsHyr7F/XA269/eveBXrsv7N9QALe/tvjA0kPWAXGbvebkbHn+D/J5nMcHzx1UAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/css/jquery-ui-1.8.16.custom.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IFVJIENTUyBGcmFtZXdvcmsgMS44LjE2CiAqCiAqIENvcHlyaWdodCAyMDExLCBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9UaGVtaW5nL0FQSQogKi8KCi8qIExheW91dCBoZWxwZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoudWktaGVscGVyLWhpZGRlbiB7IGRpc3BsYXk6IG5vbmU7IH0KLnVpLWhlbHBlci1oaWRkZW4tYWNjZXNzaWJsZSB7IHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50OyBjbGlwOiByZWN0KDFweCAxcHggMXB4IDFweCk7IGNsaXA6IHJlY3QoMXB4LDFweCwxcHgsMXB4KTsgfQoudWktaGVscGVyLXJlc2V0IHsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyBib3JkZXI6IDA7IG91dGxpbmU6IDA7IGxpbmUtaGVpZ2h0OiAxLjM7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC1zaXplOiAxMDAlOyBsaXN0LXN0eWxlOiBub25lOyB9Ci51aS1oZWxwZXItY2xlYXJmaXg6YWZ0ZXIgeyBjb250ZW50OiAiLiI7IGRpc3BsYXk6IGJsb2NrOyBoZWlnaHQ6IDA7IGNsZWFyOiBib3RoOyB2aXNpYmlsaXR5OiBoaWRkZW47IH0KLnVpLWhlbHBlci1jbGVhcmZpeCB7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgfQovKiByZXF1aXJlZCBjb21tZW50IGZvciBjbGVhcmZpeCB0byB3b3JrIGluIE9wZXJhIFwqLwoqIGh0bWwgLnVpLWhlbHBlci1jbGVhcmZpeCB7IGhlaWdodDoxJTsgfQoudWktaGVscGVyLWNsZWFyZml4IHsgZGlzcGxheTpibG9jazsgfQovKiBlbmQgY2xlYXJmaXggKi8KLnVpLWhlbHBlci16Zml4IHsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgdG9wOiAwOyBsZWZ0OiAwOyBwb3NpdGlvbjogYWJzb2x1dGU7IG9wYWNpdHk6IDA7IGZpbHRlcjpBbHBoYShPcGFjaXR5PTApOyB9CgoKLyogSW50ZXJhY3Rpb24gQ3VlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLnVpLXN0YXRlLWRpc2FibGVkIHsgY3Vyc29yOiBkZWZhdWx0ICFpbXBvcnRhbnQ7IH0KCgovKiBJY29ucwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qIHN0YXRlcyBhbmQgaW1hZ2VzICovCi51aS1pY29uIHsgZGlzcGxheTogYmxvY2s7IHRleHQtaW5kZW50OiAtOTk5OTlweDsgb3ZlcmZsb3c6IGhpZGRlbjsgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsgfQoKCi8qIE1pc2MgdmlzdWFscwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qIE92ZXJsYXlzICovCi51aS13aWRnZXQtb3ZlcmxheSB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyB9CgoKLyoKICogalF1ZXJ5IFVJIENTUyBGcmFtZXdvcmsgMS44LjE2CiAqCiAqIENvcHlyaWdodCAyMDExLCBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9UaGVtaW5nL0FQSQogKgogKiBUbyB2aWV3IGFuZCBtb2RpZnkgdGhpcyB0aGVtZSwgdmlzaXQgaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci8/ZmZEZWZhdWx0PVZlcmRhbmEsQXJpYWwsc2Fucy1zZXJpZiZmd0RlZmF1bHQ9bm9ybWFsJmZzRGVmYXVsdD0xLjFlbSZjb3JuZXJSYWRpdXM9NHB4JmJnQ29sb3JIZWFkZXI9Y2NjY2NjJmJnVGV4dHVyZUhlYWRlcj0wM19oaWdobGlnaHRfc29mdC5wbmcmYmdJbWdPcGFjaXR5SGVhZGVyPTc1JmJvcmRlckNvbG9ySGVhZGVyPWFhYWFhYSZmY0hlYWRlcj0yMjIyMjImaWNvbkNvbG9ySGVhZGVyPTIyMjIyMiZiZ0NvbG9yQ29udGVudD1mZmZmZmYmYmdUZXh0dXJlQ29udGVudD0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlDb250ZW50PTc1JmJvcmRlckNvbG9yQ29udGVudD1hYWFhYWEmZmNDb250ZW50PTIyMjIyMiZpY29uQ29sb3JDb250ZW50PTIyMjIyMiZiZ0NvbG9yRGVmYXVsdD1lNmU2ZTYmYmdUZXh0dXJlRGVmYXVsdD0wMl9nbGFzcy5wbmcmYmdJbWdPcGFjaXR5RGVmYXVsdD03NSZib3JkZXJDb2xvckRlZmF1bHQ9ZDNkM2QzJmZjRGVmYXVsdD01NTU1NTUmaWNvbkNvbG9yRGVmYXVsdD04ODg4ODgmYmdDb2xvckhvdmVyPWRhZGFkYSZiZ1RleHR1cmVIb3Zlcj0wMl9nbGFzcy5wbmcmYmdJbWdPcGFjaXR5SG92ZXI9NzUmYm9yZGVyQ29sb3JIb3Zlcj05OTk5OTkmZmNIb3Zlcj0yMTIxMjEmaWNvbkNvbG9ySG92ZXI9NDU0NTQ1JmJnQ29sb3JBY3RpdmU9ZmZmZmZmJmJnVGV4dHVyZUFjdGl2ZT0wMl9nbGFzcy5wbmcmYmdJbWdPcGFjaXR5QWN0aXZlPTY1JmJvcmRlckNvbG9yQWN0aXZlPWFhYWFhYSZmY0FjdGl2ZT0yMTIxMjEmaWNvbkNvbG9yQWN0aXZlPTQ1NDU0NSZiZ0NvbG9ySGlnaGxpZ2h0PWZiZjllZSZiZ1RleHR1cmVIaWdobGlnaHQ9MDJfZ2xhc3MucG5nJmJnSW1nT3BhY2l0eUhpZ2hsaWdodD01NSZib3JkZXJDb2xvckhpZ2hsaWdodD1mY2VmYTEmZmNIaWdobGlnaHQ9MzYzNjM2Jmljb25Db2xvckhpZ2hsaWdodD0yZTgzZmYmYmdDb2xvckVycm9yPWZlZjFlYyZiZ1RleHR1cmVFcnJvcj0wMl9nbGFzcy5wbmcmYmdJbWdPcGFjaXR5RXJyb3I9OTUmYm9yZGVyQ29sb3JFcnJvcj1jZDBhMGEmZmNFcnJvcj1jZDBhMGEmaWNvbkNvbG9yRXJyb3I9Y2QwYTBhJmJnQ29sb3JPdmVybGF5PWFhYWFhYSZiZ1RleHR1cmVPdmVybGF5PTAxX2ZsYXQucG5nJmJnSW1nT3BhY2l0eU92ZXJsYXk9MCZvcGFjaXR5T3ZlcmxheT0zMCZiZ0NvbG9yU2hhZG93PWFhYWFhYSZiZ1RleHR1cmVTaGFkb3c9MDFfZmxhdC5wbmcmYmdJbWdPcGFjaXR5U2hhZG93PTAmb3BhY2l0eVNoYWRvdz0zMCZ0aGlja25lc3NTaGFkb3c9OHB4Jm9mZnNldFRvcFNoYWRvdz0tOHB4Jm9mZnNldExlZnRTaGFkb3c9LThweCZjb3JuZXJSYWRpdXNTaGFkb3c9OHB4CiAqLwoKCi8qIENvbXBvbmVudCBjb250YWluZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoudWktd2lkZ2V0IHsgZm9udC1mYW1pbHk6IFZlcmRhbmEsQXJpYWwsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxLjFlbTsgfQoudWktd2lkZ2V0IC51aS13aWRnZXQgeyBmb250LXNpemU6IDFlbTsgfQoudWktd2lkZ2V0IGlucHV0LCAudWktd2lkZ2V0IHNlbGVjdCwgLnVpLXdpZGdldCB0ZXh0YXJlYSwgLnVpLXdpZGdldCBidXR0b24geyBmb250LWZhbWlseTogVmVyZGFuYSxBcmlhbCxzYW5zLXNlcmlmOyBmb250LXNpemU6IDFlbTsgfQoudWktd2lkZ2V0LWNvbnRlbnQgeyBib3JkZXI6IDFweCBzb2xpZCAjYWFhYWFhOyBiYWNrZ3JvdW5kOiAjZmZmZmZmIHVybChpbWFnZXMvdWktYmdfZmxhdF83NV9mZmZmZmZfNDB4MTAwLnBuZykgNTAlIDUwJSByZXBlYXQteDsgY29sb3I6ICMyMjIyMjI7IH0KLnVpLXdpZGdldC1jb250ZW50IGEgeyBjb2xvcjogIzIyMjIyMjsgfQoudWktd2lkZ2V0LWhlYWRlciB7IGJvcmRlcjogMXB4IHNvbGlkICNhYWFhYWE7IGJhY2tncm91bmQ6ICNjY2NjY2MgdXJsKGltYWdlcy91aS1iZ19oaWdobGlnaHQtc29mdF83NV9jY2NjY2NfMXgxMDAucG5nKSA1MCUgNTAlIHJlcGVhdC14OyBjb2xvcjogIzIyMjIyMjsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLnVpLXdpZGdldC1oZWFkZXIgYSB7IGNvbG9yOiAjMjIyMjIyOyB9CgovKiBJbnRlcmFjdGlvbiBzdGF0ZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi51aS1zdGF0ZS1kZWZhdWx0LCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWRlZmF1bHQsIC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1kZWZhdWx0IHsgYm9yZGVyOiAxcHggc29saWQgI2QzZDNkMzsgYmFja2dyb3VuZDogI2U2ZTZlNiB1cmwoaW1hZ2VzL3VpLWJnX2dsYXNzXzc1X2U2ZTZlNl8xeDQwMC5wbmcpIDUwJSA1MCUgcmVwZWF0LXg7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGNvbG9yOiAjNTU1NTU1OyB9Ci51aS1zdGF0ZS1kZWZhdWx0IGEsIC51aS1zdGF0ZS1kZWZhdWx0IGE6bGluaywgLnVpLXN0YXRlLWRlZmF1bHQgYTp2aXNpdGVkIHsgY29sb3I6ICM1NTU1NTU7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfQoudWktc3RhdGUtaG92ZXIsIC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtaG92ZXIsIC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1ob3ZlciwgLnVpLXN0YXRlLWZvY3VzLCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWZvY3VzLCAudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtZm9jdXMgeyBib3JkZXI6IDFweCBzb2xpZCAjOTk5OTk5OyBiYWNrZ3JvdW5kOiAjZGFkYWRhIHVybChpbWFnZXMvdWktYmdfZ2xhc3NfNzVfZGFkYWRhXzF4NDAwLnBuZykgNTAlIDUwJSByZXBlYXQteDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgY29sb3I6ICMyMTIxMjE7IH0KLnVpLXN0YXRlLWhvdmVyIGEsIC51aS1zdGF0ZS1ob3ZlciBhOmhvdmVyIHsgY29sb3I6ICMyMTIxMjE7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfQoudWktc3RhdGUtYWN0aXZlLCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWFjdGl2ZSwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWFjdGl2ZSB7IGJvcmRlcjogMXB4IHNvbGlkICNhYWFhYWE7IGJhY2tncm91bmQ6ICNmZmZmZmYgdXJsKGltYWdlcy91aS1iZ19nbGFzc182NV9mZmZmZmZfMXg0MDAucG5nKSA1MCUgNTAlIHJlcGVhdC14OyBmb250LXdlaWdodDogbm9ybWFsOyBjb2xvcjogIzIxMjEyMTsgfQoudWktc3RhdGUtYWN0aXZlIGEsIC51aS1zdGF0ZS1hY3RpdmUgYTpsaW5rLCAudWktc3RhdGUtYWN0aXZlIGE6dmlzaXRlZCB7IGNvbG9yOiAjMjEyMTIxOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IH0KLnVpLXdpZGdldCA6YWN0aXZlIHsgb3V0bGluZTogbm9uZTsgfQoKLyogSW50ZXJhY3Rpb24gQ3VlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLnVpLXN0YXRlLWhpZ2hsaWdodCwgLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1oaWdobGlnaHQsIC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1oaWdobGlnaHQgIHtib3JkZXI6IDFweCBzb2xpZCAjZmNlZmExOyBiYWNrZ3JvdW5kOiAjZmJmOWVlIHVybChpbWFnZXMvdWktYmdfZ2xhc3NfNTVfZmJmOWVlXzF4NDAwLnBuZykgNTAlIDUwJSByZXBlYXQteDsgY29sb3I6ICMzNjM2MzY7IH0KLnVpLXN0YXRlLWhpZ2hsaWdodCBhLCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWhpZ2hsaWdodCBhLC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1oaWdobGlnaHQgYSB7IGNvbG9yOiAjMzYzNjM2OyB9Ci51aS1zdGF0ZS1lcnJvciwgLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1lcnJvciwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWVycm9yIHtib3JkZXI6IDFweCBzb2xpZCAjY2QwYTBhOyBiYWNrZ3JvdW5kOiAjZmVmMWVjIHVybChpbWFnZXMvdWktYmdfZ2xhc3NfOTVfZmVmMWVjXzF4NDAwLnBuZykgNTAlIDUwJSByZXBlYXQteDsgY29sb3I6ICNjZDBhMGE7IH0KLnVpLXN0YXRlLWVycm9yIGEsIC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZXJyb3IgYSwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWVycm9yIGEgeyBjb2xvcjogI2NkMGEwYTsgfQoudWktc3RhdGUtZXJyb3ItdGV4dCwgLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1lcnJvci10ZXh0LCAudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtZXJyb3ItdGV4dCB7IGNvbG9yOiAjY2QwYTBhOyB9Ci51aS1wcmlvcml0eS1wcmltYXJ5LCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXByaW9yaXR5LXByaW1hcnksIC51aS13aWRnZXQtaGVhZGVyIC51aS1wcmlvcml0eS1wcmltYXJ5IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLnVpLXByaW9yaXR5LXNlY29uZGFyeSwgLnVpLXdpZGdldC1jb250ZW50IC51aS1wcmlvcml0eS1zZWNvbmRhcnksICAudWktd2lkZ2V0LWhlYWRlciAudWktcHJpb3JpdHktc2Vjb25kYXJ5IHsgb3BhY2l0eTogLjc7IGZpbHRlcjpBbHBoYShPcGFjaXR5PTcwKTsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgfQoudWktc3RhdGUtZGlzYWJsZWQsIC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZGlzYWJsZWQsIC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1kaXNhYmxlZCB7IG9wYWNpdHk6IC4zNTsgZmlsdGVyOkFscGhhKE9wYWNpdHk9MzUpOyBiYWNrZ3JvdW5kLWltYWdlOiBub25lOyB9CgovKiBJY29ucwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qIHN0YXRlcyBhbmQgaW1hZ2VzICovCi51aS1pY29uIHsgd2lkdGg6IDE2cHg7IGhlaWdodDogMTZweDsgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy91aS1pY29uc18yMjIyMjJfMjU2eDI0MC5wbmcpOyB9Ci51aS13aWRnZXQtY29udGVudCAudWktaWNvbiB7YmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy91aS1pY29uc18yMjIyMjJfMjU2eDI0MC5wbmcpOyB9Ci51aS13aWRnZXQtaGVhZGVyIC51aS1pY29uIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL3VpLWljb25zXzIyMjIyMl8yNTZ4MjQwLnBuZyk7IH0KLnVpLXN0YXRlLWRlZmF1bHQgLnVpLWljb24geyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL3VpLWljb25zXzg4ODg4OF8yNTZ4MjQwLnBuZyk7IH0KLnVpLXN0YXRlLWhvdmVyIC51aS1pY29uLCAudWktc3RhdGUtZm9jdXMgLnVpLWljb24ge2JhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvdWktaWNvbnNfNDU0NTQ1XzI1NngyNDAucG5nKTsgfQoudWktc3RhdGUtYWN0aXZlIC51aS1pY29uIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL3VpLWljb25zXzQ1NDU0NV8yNTZ4MjQwLnBuZyk7IH0KLnVpLXN0YXRlLWhpZ2hsaWdodCAudWktaWNvbiB7YmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy91aS1pY29uc18yZTgzZmZfMjU2eDI0MC5wbmcpOyB9Ci51aS1zdGF0ZS1lcnJvciAudWktaWNvbiwgLnVpLXN0YXRlLWVycm9yLXRleHQgLnVpLWljb24ge2JhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvdWktaWNvbnNfY2QwYTBhXzI1NngyNDAucG5nKTsgfQoKLyogcG9zaXRpb25pbmcgKi8KLnVpLWljb24tY2FyYXQtMS1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAwOyB9Ci51aS1pY29uLWNhcmF0LTEtbmUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAwOyB9Ci51aS1pY29uLWNhcmF0LTEtZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IDA7IH0KLnVpLWljb24tY2FyYXQtMS1zZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IDA7IH0KLnVpLWljb24tY2FyYXQtMS1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggMDsgfQoudWktaWNvbi1jYXJhdC0xLXN3IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggMDsgfQoudWktaWNvbi1jYXJhdC0xLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAwOyB9Ci51aS1pY29uLWNhcmF0LTEtbncgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggMDsgfQoudWktaWNvbi1jYXJhdC0yLW4tcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAwOyB9Ci51aS1pY29uLWNhcmF0LTItZS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IDA7IH0KLnVpLWljb24tdHJpYW5nbGUtMS1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMTZweDsgfQoudWktaWNvbi10cmlhbmdsZS0xLW5lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTE2cHg7IH0KLnVpLWljb24tdHJpYW5nbGUtMS1lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTE2cHg7IH0KLnVpLWljb24tdHJpYW5nbGUtMS1zZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC0xNnB4OyB9Ci51aS1pY29uLXRyaWFuZ2xlLTEtcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0xNnB4OyB9Ci51aS1pY29uLXRyaWFuZ2xlLTEtc3cgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMTZweDsgfQoudWktaWNvbi10cmlhbmdsZS0xLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMTZweDsgfQoudWktaWNvbi10cmlhbmdsZS0xLW53IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0xNnB4OyB9Ci51aS1pY29uLXRyaWFuZ2xlLTItbi1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0xNnB4OyB9Ci51aS1pY29uLXRyaWFuZ2xlLTItZS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC0xNnB4OyB9Ci51aS1pY29uLWFycm93LTEtbiB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTMycHg7IH0KLnVpLWljb24tYXJyb3ctMS1uZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0zMnB4OyB9Ci51aS1pY29uLWFycm93LTEtZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0zMnB4OyB9Ci51aS1pY29uLWFycm93LTEtc2UgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMzJweDsgfQoudWktaWNvbi1hcnJvdy0xLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtMzJweDsgfQoudWktaWNvbi1hcnJvdy0xLXN3IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTMycHg7IH0KLnVpLWljb24tYXJyb3ctMS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTMycHg7IH0KLnVpLWljb24tYXJyb3ctMS1udyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtMzJweDsgfQoudWktaWNvbi1hcnJvdy0yLW4tcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMzJweDsgfQoudWktaWNvbi1hcnJvdy0yLW5lLXN3IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC0zMnB4OyB9Ci51aS1pY29uLWFycm93LTItZS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MHB4IC0zMnB4OyB9Ci51aS1pY29uLWFycm93LTItc2UtbncgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTc2cHggLTMycHg7IH0KLnVpLWljb24tYXJyb3dzdG9wLTEtbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xOTJweCAtMzJweDsgfQoudWktaWNvbi1hcnJvd3N0b3AtMS1lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIwOHB4IC0zMnB4OyB9Ci51aS1pY29uLWFycm93c3RvcC0xLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjI0cHggLTMycHg7IH0KLnVpLWljb24tYXJyb3dzdG9wLTEtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yNDBweCAtMzJweDsgfQoudWktaWNvbi1hcnJvd3RoaWNrLTEtbiB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTQ4cHg7IH0KLnVpLWljb24tYXJyb3d0aGljay0xLW5lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTQ4cHg7IH0KLnVpLWljb24tYXJyb3d0aGljay0xLWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtNDhweDsgfQoudWktaWNvbi1hcnJvd3RoaWNrLTEtc2UgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtNDhweDsgfQoudWktaWNvbi1hcnJvd3RoaWNrLTEtcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC00OHB4OyB9Ci51aS1pY29uLWFycm93dGhpY2stMS1zdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC00OHB4OyB9Ci51aS1pY29uLWFycm93dGhpY2stMS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTQ4cHg7IH0KLnVpLWljb24tYXJyb3d0aGljay0xLW53IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC00OHB4OyB9Ci51aS1pY29uLWFycm93dGhpY2stMi1uLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTQ4cHg7IH0KLnVpLWljb24tYXJyb3d0aGljay0yLW5lLXN3IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC00OHB4OyB9Ci51aS1pY29uLWFycm93dGhpY2stMi1lLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTYwcHggLTQ4cHg7IH0KLnVpLWljb24tYXJyb3d0aGljay0yLXNlLW53IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC00OHB4OyB9Ci51aS1pY29uLWFycm93dGhpY2tzdG9wLTEtbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xOTJweCAtNDhweDsgfQoudWktaWNvbi1hcnJvd3RoaWNrc3RvcC0xLWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjA4cHggLTQ4cHg7IH0KLnVpLWljb24tYXJyb3d0aGlja3N0b3AtMS1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIyNHB4IC00OHB4OyB9Ci51aS1pY29uLWFycm93dGhpY2tzdG9wLTEtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yNDBweCAtNDhweDsgfQoudWktaWNvbi1hcnJvd3JldHVybnRoaWNrLTEtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTY0cHg7IH0KLnVpLWljb24tYXJyb3dyZXR1cm50aGljay0xLW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtNjRweDsgfQoudWktaWNvbi1hcnJvd3JldHVybnRoaWNrLTEtZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC02NHB4OyB9Ci51aS1pY29uLWFycm93cmV0dXJudGhpY2stMS1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTY0cHg7IH0KLnVpLWljb24tYXJyb3dyZXR1cm4tMS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTY0cHg7IH0KLnVpLWljb24tYXJyb3dyZXR1cm4tMS1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTY0cHg7IH0KLnVpLWljb24tYXJyb3dyZXR1cm4tMS1lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTY0cHg7IH0KLnVpLWljb24tYXJyb3dyZXR1cm4tMS1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC02NHB4OyB9Ci51aS1pY29uLWFycm93cmVmcmVzaC0xLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTY0cHg7IH0KLnVpLWljb24tYXJyb3dyZWZyZXNoLTEtbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtNjRweDsgfQoudWktaWNvbi1hcnJvd3JlZnJlc2gtMS1lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MHB4IC02NHB4OyB9Ci51aS1pY29uLWFycm93cmVmcmVzaC0xLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTc2cHggLTY0cHg7IH0KLnVpLWljb24tYXJyb3ctNCB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTgwcHg7IH0KLnVpLWljb24tYXJyb3ctNC1kaWFnIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTgwcHg7IH0KLnVpLWljb24tZXh0bGluayB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC04MHB4OyB9Ci51aS1pY29uLW5ld3dpbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC04MHB4OyB9Ci51aS1pY29uLXJlZnJlc2ggeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtODBweDsgfQoudWktaWNvbi1zaHVmZmxlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTgwcHg7IH0KLnVpLWljb24tdHJhbnNmZXItZS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTgwcHg7IH0KLnVpLWljb24tdHJhbnNmZXJ0aGljay1lLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTgwcHg7IH0KLnVpLWljb24tZm9sZGVyLWNvbGxhcHNlZCB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTk2cHg7IH0KLnVpLWljb24tZm9sZGVyLW9wZW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtOTZweDsgfQoudWktaWNvbi1kb2N1bWVudCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC05NnB4OyB9Ci51aS1pY29uLWRvY3VtZW50LWIgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtOTZweDsgfQoudWktaWNvbi1ub3RlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTk2cHg7IH0KLnVpLWljb24tbWFpbC1jbG9zZWQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtOTZweDsgfQoudWktaWNvbi1tYWlsLW9wZW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtOTZweDsgfQoudWktaWNvbi1zdWl0Y2FzZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtOTZweDsgfQoudWktaWNvbi1jb21tZW50IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC05NnB4OyB9Ci51aS1pY29uLXBlcnNvbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtOTZweDsgfQoudWktaWNvbi1wcmludCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNjBweCAtOTZweDsgfQoudWktaWNvbi10cmFzaCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtOTZweDsgfQoudWktaWNvbi1sb2NrZWQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTkycHggLTk2cHg7IH0KLnVpLWljb24tdW5sb2NrZWQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjA4cHggLTk2cHg7IH0KLnVpLWljb24tYm9va21hcmsgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjI0cHggLTk2cHg7IH0KLnVpLWljb24tdGFnIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI0MHB4IC05NnB4OyB9Ci51aS1pY29uLWhvbWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xMTJweDsgfQoudWktaWNvbi1mbGFnIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTExMnB4OyB9Ci51aS1pY29uLWNhbGVuZGFyIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTExMnB4OyB9Ci51aS1pY29uLWNhcnQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMTEycHg7IH0KLnVpLWljb24tcGVuY2lsIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTExMnB4OyB9Ci51aS1pY29uLWNsb2NrIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTExMnB4OyB9Ci51aS1pY29uLWRpc2sgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMTEycHg7IH0KLnVpLWljb24tY2FsY3VsYXRvciB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtMTEycHg7IH0KLnVpLWljb24tem9vbWluIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0xMTJweDsgfQoudWktaWNvbi16b29tb3V0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC0xMTJweDsgfQoudWktaWNvbi1zZWFyY2ggeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTYwcHggLTExMnB4OyB9Ci51aS1pY29uLXdyZW5jaCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtMTEycHg7IH0KLnVpLWljb24tZ2VhciB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xOTJweCAtMTEycHg7IH0KLnVpLWljb24taGVhcnQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjA4cHggLTExMnB4OyB9Ci51aS1pY29uLXN0YXIgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjI0cHggLTExMnB4OyB9Ci51aS1pY29uLWxpbmsgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjQwcHggLTExMnB4OyB9Ci51aS1pY29uLWNhbmNlbCB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTEyOHB4OyB9Ci51aS1pY29uLXBsdXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMTI4cHg7IH0KLnVpLWljb24tcGx1c3RoaWNrIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTEyOHB4OyB9Ci51aS1pY29uLW1pbnVzIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTEyOHB4OyB9Ci51aS1pY29uLW1pbnVzdGhpY2sgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtMTI4cHg7IH0KLnVpLWljb24tY2xvc2UgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMTI4cHg7IH0KLnVpLWljb24tY2xvc2V0aGljayB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC0xMjhweDsgfQoudWktaWNvbi1rZXkgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTEyOHB4OyB9Ci51aS1pY29uLWxpZ2h0YnVsYiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTI4cHg7IH0KLnVpLWljb24tc2Npc3NvcnMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTEyOHB4OyB9Ci51aS1pY29uLWNsaXBib2FyZCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNjBweCAtMTI4cHg7IH0KLnVpLWljb24tY29weSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtMTI4cHg7IH0KLnVpLWljb24tY29udGFjdCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xOTJweCAtMTI4cHg7IH0KLnVpLWljb24taW1hZ2UgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjA4cHggLTEyOHB4OyB9Ci51aS1pY29uLXZpZGVvIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIyNHB4IC0xMjhweDsgfQoudWktaWNvbi1zY3JpcHQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjQwcHggLTEyOHB4OyB9Ci51aS1pY29uLWFsZXJ0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMTQ0cHg7IH0KLnVpLWljb24taW5mbyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0xNDRweDsgfQoudWktaWNvbi1ub3RpY2UgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTQ0cHg7IH0KLnVpLWljb24taGVscCB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC0xNDRweDsgfQoudWktaWNvbi1jaGVjayB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0xNDRweDsgfQoudWktaWNvbi1idWxsZXQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMTQ0cHg7IH0KLnVpLWljb24tcmFkaW8tb2ZmIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTE0NHB4OyB9Ci51aS1pY29uLXJhZGlvLW9uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0xNDRweDsgfQoudWktaWNvbi1waW4tdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTQ0cHg7IH0KLnVpLWljb24tcGluLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTE0NHB4OyB9Ci51aS1pY29uLXBsYXkgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xNjBweDsgfQoudWktaWNvbi1wYXVzZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0xNjBweDsgfQoudWktaWNvbi1zZWVrLW5leHQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTYwcHg7IH0KLnVpLWljb24tc2Vlay1wcmV2IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTE2MHB4OyB9Ci51aS1pY29uLXNlZWstZW5kIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTE2MHB4OyB9Ci51aS1pY29uLXNlZWstc3RhcnQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMTYwcHg7IH0KLyogdWktaWNvbi1zZWVrLWZpcnN0IGlzIGRlcHJlY2F0ZWQsIHVzZSB1aS1pY29uLXNlZWstc3RhcnQgaW5zdGVhZCAqLwoudWktaWNvbi1zZWVrLWZpcnN0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTE2MHB4OyB9Ci51aS1pY29uLXN0b3AgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMTYwcHg7IH0KLnVpLWljb24tZWplY3QgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTE2MHB4OyB9Ci51aS1pY29uLXZvbHVtZS1vZmYgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTE2MHB4OyB9Ci51aS1pY29uLXZvbHVtZS1vbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtMTYwcHg7IH0KLnVpLWljb24tcG93ZXIgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xNzZweDsgfQoudWktaWNvbi1zaWduYWwtZGlhZyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0xNzZweDsgfQoudWktaWNvbi1zaWduYWwgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTc2cHg7IH0KLnVpLWljb24tYmF0dGVyeS0wIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTE3NnB4OyB9Ci51aS1pY29uLWJhdHRlcnktMSB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0xNzZweDsgfQoudWktaWNvbi1iYXR0ZXJ5LTIgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMTc2cHg7IH0KLnVpLWljb24tYmF0dGVyeS0zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTE3NnB4OyB9Ci51aS1pY29uLWNpcmNsZS1wbHVzIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMTkycHg7IH0KLnVpLWljb24tY2lyY2xlLW1pbnVzIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTE5MnB4OyB9Ci51aS1pY29uLWNpcmNsZS1jbG9zZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0xOTJweDsgfQoudWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC0xOTJweDsgfQoudWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0xOTJweDsgfQoudWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xOTJweDsgfQoudWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC0xOTJweDsgfQoudWktaWNvbi1jaXJjbGUtYXJyb3ctZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtMTkycHg7IH0KLnVpLWljb24tY2lyY2xlLWFycm93LXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTE5MnB4OyB9Ci51aS1pY29uLWNpcmNsZS1hcnJvdy13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC0xOTJweDsgfQoudWktaWNvbi1jaXJjbGUtYXJyb3ctbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNjBweCAtMTkycHg7IH0KLnVpLWljb24tY2lyY2xlLXpvb21pbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtMTkycHg7IH0KLnVpLWljb24tY2lyY2xlLXpvb21vdXQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTkycHggLTE5MnB4OyB9Ci51aS1pY29uLWNpcmNsZS1jaGVjayB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMDhweCAtMTkycHg7IH0KLnVpLWljb24tY2lyY2xlc21hbGwtcGx1cyB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTIwOHB4OyB9Ci51aS1pY29uLWNpcmNsZXNtYWxsLW1pbnVzIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTIwOHB4OyB9Ci51aS1pY29uLWNpcmNsZXNtYWxsLWNsb3NlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTIwOHB4OyB9Ci51aS1pY29uLXNxdWFyZXNtYWxsLXBsdXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMjA4cHg7IH0KLnVpLWljb24tc3F1YXJlc21hbGwtbWludXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtMjA4cHg7IH0KLnVpLWljb24tc3F1YXJlc21hbGwtY2xvc2UgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMjA4cHg7IH0KLnVpLWljb24tZ3JpcC1kb3R0ZWQtdmVydGljYWwgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0yMjRweDsgfQoudWktaWNvbi1ncmlwLWRvdHRlZC1ob3Jpem9udGFsIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTIyNHB4OyB9Ci51aS1pY29uLWdyaXAtc29saWQtdmVydGljYWwgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMjI0cHg7IH0KLnVpLWljb24tZ3JpcC1zb2xpZC1ob3Jpem9udGFsIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTIyNHB4OyB9Ci51aS1pY29uLWdyaXBzbWFsbC1kaWFnb25hbC1zZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0yMjRweDsgfQoudWktaWNvbi1ncmlwLWRpYWdvbmFsLXNlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTIyNHB4OyB9CgoKLyogTWlzYyB2aXN1YWxzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyogQ29ybmVyIHJhZGl1cyAqLwoudWktY29ybmVyLWFsbCwgLnVpLWNvcm5lci10b3AsIC51aS1jb3JuZXItbGVmdCwgLnVpLWNvcm5lci10bCB7IC1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0OiA0cHg7IC13ZWJraXQtYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4OyAta2h0bWwtYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4OyBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiA0cHg7IH0KLnVpLWNvcm5lci1hbGwsIC51aS1jb3JuZXItdG9wLCAudWktY29ybmVyLXJpZ2h0LCAudWktY29ybmVyLXRyIHsgLW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0OiA0cHg7IC13ZWJraXQtYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDRweDsgLWtodG1sLWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0cHg7IGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0cHg7IH0KLnVpLWNvcm5lci1hbGwsIC51aS1jb3JuZXItYm90dG9tLCAudWktY29ybmVyLWxlZnQsIC51aS1jb3JuZXItYmwgeyAtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdDogNHB4OyAtd2Via2l0LWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDsgLWtodG1sLWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDsgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNHB4OyB9Ci51aS1jb3JuZXItYWxsLCAudWktY29ybmVyLWJvdHRvbSwgLnVpLWNvcm5lci1yaWdodCwgLnVpLWNvcm5lci1iciB7IC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodDogNHB4OyAtd2Via2l0LWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA0cHg7IC1raHRtbC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNHB4OyBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNHB4OyB9CgovKiBPdmVybGF5cyAqLwoudWktd2lkZ2V0LW92ZXJsYXkgeyBiYWNrZ3JvdW5kOiAjYWFhYWFhIHVybChpbWFnZXMvdWktYmdfZmxhdF8wX2FhYWFhYV80MHgxMDAucG5nKSA1MCUgNTAlIHJlcGVhdC14OyBvcGFjaXR5OiAuMzA7ZmlsdGVyOkFscGhhKE9wYWNpdHk9MzApOyB9Ci51aS13aWRnZXQtc2hhZG93IHsgbWFyZ2luOiAtOHB4IDAgMCAtOHB4OyBwYWRkaW5nOiA4cHg7IGJhY2tncm91bmQ6ICNhYWFhYWEgdXJsKGltYWdlcy91aS1iZ19mbGF0XzBfYWFhYWFhXzQweDEwMC5wbmcpIDUwJSA1MCUgcmVwZWF0LXg7IG9wYWNpdHk6IC4zMDtmaWx0ZXI6QWxwaGEoT3BhY2l0eT0zMCk7IC1tb3otYm9yZGVyLXJhZGl1czogOHB4OyAta2h0bWwtYm9yZGVyLXJhZGl1czogOHB4OyAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyLXJhZGl1czogOHB4OyB9LyoKICogalF1ZXJ5IFVJIFJlc2l6YWJsZSAxLjguMTYKICoKICogQ29weXJpZ2h0IDIwMTEsIEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL1Jlc2l6YWJsZSN0aGVtaW5nCiAqLwoudWktcmVzaXphYmxlIHsgcG9zaXRpb246IHJlbGF0aXZlO30KLnVpLXJlc2l6YWJsZS1oYW5kbGUgeyBwb3NpdGlvbjogYWJzb2x1dGU7Zm9udC1zaXplOiAwLjFweDt6LWluZGV4OiA5OTk5OTsgZGlzcGxheTogYmxvY2s7IH0KLnVpLXJlc2l6YWJsZS1kaXNhYmxlZCAudWktcmVzaXphYmxlLWhhbmRsZSwgLnVpLXJlc2l6YWJsZS1hdXRvaGlkZSAudWktcmVzaXphYmxlLWhhbmRsZSB7IGRpc3BsYXk6IG5vbmU7IH0KLnVpLXJlc2l6YWJsZS1uIHsgY3Vyc29yOiBuLXJlc2l6ZTsgaGVpZ2h0OiA3cHg7IHdpZHRoOiAxMDAlOyB0b3A6IC01cHg7IGxlZnQ6IDA7IH0KLnVpLXJlc2l6YWJsZS1zIHsgY3Vyc29yOiBzLXJlc2l6ZTsgaGVpZ2h0OiA3cHg7IHdpZHRoOiAxMDAlOyBib3R0b206IC01cHg7IGxlZnQ6IDA7IH0KLnVpLXJlc2l6YWJsZS1lIHsgY3Vyc29yOiBlLXJlc2l6ZTsgd2lkdGg6IDdweDsgcmlnaHQ6IC01cHg7IHRvcDogMDsgaGVpZ2h0OiAxMDAlOyB9Ci51aS1yZXNpemFibGUtdyB7IGN1cnNvcjogdy1yZXNpemU7IHdpZHRoOiA3cHg7IGxlZnQ6IC01cHg7IHRvcDogMDsgaGVpZ2h0OiAxMDAlOyB9Ci51aS1yZXNpemFibGUtc2UgeyBjdXJzb3I6IHNlLXJlc2l6ZTsgd2lkdGg6IDEycHg7IGhlaWdodDogMTJweDsgcmlnaHQ6IDFweDsgYm90dG9tOiAxcHg7IH0KLnVpLXJlc2l6YWJsZS1zdyB7IGN1cnNvcjogc3ctcmVzaXplOyB3aWR0aDogOXB4OyBoZWlnaHQ6IDlweDsgbGVmdDogLTVweDsgYm90dG9tOiAtNXB4OyB9Ci51aS1yZXNpemFibGUtbncgeyBjdXJzb3I6IG53LXJlc2l6ZTsgd2lkdGg6IDlweDsgaGVpZ2h0OiA5cHg7IGxlZnQ6IC01cHg7IHRvcDogLTVweDsgfQoudWktcmVzaXphYmxlLW5lIHsgY3Vyc29yOiBuZS1yZXNpemU7IHdpZHRoOiA5cHg7IGhlaWdodDogOXB4OyByaWdodDogLTVweDsgdG9wOiAtNXB4O30=]]></data>
	</file>
	<file>
	  <filename>/function.admin_frontendprefstab.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCWlmIChpc3NldCgkcGFyYW1zWydleGFtcGxlX3N5bnRheCddKSkgCgl7CgkJJHRoaXMgLT4gU2V0UHJlZmVyZW5jZSgnZXhhbXBsZV9zeW50YXgnLCAkcGFyYW1zWydleGFtcGxlX3N5bnRheCddKTsKCX0KCQkkdGhpcyAtPiBzbWFydHkgLT4gYXNzaWduKCdzdGFydGZvcm0nLCAkdGhpcyAtPiBDcmVhdGVGb3JtU3RhcnQoJGlkLCAnc2F2ZWZyb250ZW5kc2V0dGluZ3MnLCAkcmV0dXJuaWQpKTsKCQkkdGhpcyAtPiBzbWFydHkgLT4gYXNzaWduKCdlbmRmb3JtJywgJHRoaXMgLT4gQ3JlYXRlRm9ybUVuZCgpKTsKCQkkdGhpcyAtPiBzbWFydHkgLT4gYXNzaWduKCdzZXR0aW5nc3RleHQnLCAkdGhpcyAtPiBMYW5nKCdmcm9udGVuZF9oZWFkX3NldHRpbmdzJykpOwoJCSR0aGlzIC0+IHNtYXJ0eSAtPiBhc3NpZ24oJ3N5bnRheF9zZXR0aW5nc3RleHQnLCAkdGhpcyAtPiBMYW5nKCdmcm9udGVuZF9zeW50YXhhcmVhX3NldHRpbmdzJykpOwoJCSR0aGlzIC0+IHNtYXJ0eSAtPiBhc3NpZ24oJ2hlYWRfZGVzY3JpcHRpb24nLCAkdGhpcyAtPiBMYW5nKCdoZWFkX2Rlc2NyaXB0aW9uJykpOwoJCSR0aGlzIC0+IHNtYXJ0eSAtPiBhc3NpZ24oJ2NvbnRlbnRfZGVzY3JpcHRpb24nLCAkdGhpcyAtPiBMYW5nKCdjb250ZW50X2Rlc2NyaXB0aW9uJykpOwoJCQoJCSRzbWFydHktPmFzc2lnbignd2lkdGhfdGl0bGUnLCAkdGhpcyAtPiBMYW5nKCdmcm9udGVuZF93aWR0aF90aXRsZScpKTsKCQkkc21hcnR5LT5hc3NpZ24oJ3dpZHRoX2lucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsICdmcm9udGVuZF93aWR0aCcsICR0aGlzIC0+IEdldFByZWZlcmVuY2UoJ2Zyb250ZW5kX3dpZHRoJywgJzUwMCcpLCAxMCwgMjU1KSk7CQkKCQkkc21hcnR5LT5hc3NpZ24oJ2hlaWdodF90aXRsZScsICR0aGlzIC0+IExhbmcoJ2Zyb250ZW5kX2hlaWdodF90aXRsZScpKTsKCQkkc21hcnR5LT5hc3NpZ24oJ2hlaWdodF9pbnB1dCcsICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCAnZnJvbnRlbmRfaGVpZ2h0JywgJHRoaXMgLT4gR2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfaGVpZ2h0JywgJzQwMCcpLCAxMCwgMjU1KSk7CgkJCgkJLyogbW9kZXMgKi8KCQkkdGhpcyAtPiBzbWFydHkgLT4gYXNzaWduKCdmcm9udGVuZF9zeW50YXhfbW9kZScsICR0aGlzIC0+IExhbmcoJ3N5bnRheF9tb2RlJykpOwoJCQkkbW9kZXMgPSBhcnJheSgKCQkJCSR0aGlzIC0+IExhbmcoJ2pzJykgPT4gJ2phdmFzY3JpcHQnLCAKCQkJCSR0aGlzIC0+IExhbmcoJ3BsYWluJykgPT4gJ3BsYWluJywgCgkJCQkkdGhpcyAtPiBMYW5nKCdzdmcnKSA9PiAnc3ZnJywgCgkJCQkkdGhpcyAtPiBMYW5nKCdodG1sJykgPT4gJ2h0bWwnLAoJCQkJJHRoaXMgLT4gTGFuZygnY3NzJykgPT4gJ2NzcycsCgkJCQkkdGhpcyAtPiBMYW5nKCdzY3NzJykgPT4gJ3Njc3MnLAoJCQkJJHRoaXMgLT4gTGFuZygnY29mZmVlJykgPT4gJ2NvZmZlZScsCgkJCQkkdGhpcyAtPiBMYW5nKCdqc29uJykgPT4gJ2pzb24nLAoJCQkJJHRoaXMgLT4gTGFuZygncHl0aG9uJykgPT4gJ3B5dGhvbicsCgkJCQkkdGhpcyAtPiBMYW5nKCdydWJ5JykgPT4gJ3J1YnknLAoJCQkJJHRoaXMgLT4gTGFuZygncGVybCcpID0+ICdwZXJsJywKCQkJCSR0aGlzIC0+IExhbmcoJ3BocCcpID0+ICdwaHAnLAoJCQkJJHRoaXMgLT4gTGFuZygnamF2YScpID0+ICdqYXZhJywKCQkJCSR0aGlzIC0+IExhbmcoJ2NzaGFycCcpID0+ICdjc2hhcnAnLAoJCQkJJHRoaXMgLT4gTGFuZygnY19jcHAnKSA9PiAnY19jcHAnLAoJCQkJJHRoaXMgLT4gTGFuZygnY2xvanVyZScpID0+ICdjbG9qdXJlJywKCQkJCSR0aGlzIC0+IExhbmcoJ29jYW1sJykgPT4gJ29jYW1sJywKCQkJCSR0aGlzIC0+IExhbmcoJ3RleHRpbGUnKSA9PiAndGV4dGlsZScsCgkJCQkkdGhpcyAtPiBMYW5nKCdncm9vdnknKSA9PiAnZ3Jvb3Z5JywKCQkJCSR0aGlzIC0+IExhbmcoJ3NjYWxhJykgPT4gJ3NjYWxhJwoJCQkJKTsJCgkJLy8gaGVhZCBtdWx0aXNlbGVjdAkJCgkJJHRoaXMgLT4gc21hcnR5IC0+IGFzc2lnbignZnJvbnRlbmRfc3ludGF4X21vZGVpbnB1dCcsICR0aGlzIC0+IENyZWF0ZUlucHV0U2VsZWN0TGlzdCgkaWQsICdmcm9udGVuZF9tb2RlW10nLCAkbW9kZXMsIGV4cGxvZGUoJywnLCAkdGhpcyAtPiBHZXRQcmVmZXJlbmNlKCdmcm9udGVuZF9tb2RlJywgJ2h0bWwnKSksIDUpKTsKCQkvLyBzeW50YXhhcmVhIHByZWYKCQkkdGhpcyAtPiBzbWFydHkgLT4gYXNzaWduKCdmcm9udGVuZF9zeW50YXhhcmVhX21vZGVpbnB1dCcsICR0aGlzIC0+IENyZWF0ZUlucHV0RHJvcGRvd24oJGlkLCAnZnJvbnRlbmRfc3ludGF4YXJlYV9tb2RlJywgJG1vZGVzLCAtMSwgJHRoaXMgLT4gR2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfc3ludGF4YXJlYV9tb2RlJywgJ2h0bWwnKSkpOwkJCgkJCgkJLyogdGhlbWVzICovCQkKCQkkdGhpcyAtPiBzbWFydHkgLT4gYXNzaWduKCd0aGVtZXRleHQnLCAkdGhpcyAtPiBMYW5nKCd0aGVtZXMnKSk7CgkJCSR0aGVtZXMgPSBhcnJheSgKCQkJCSR0aGlzIC0+IExhbmcoJ2Nocm9tZScpID0+ICdjaHJvbWUnLCAKCQkJCSR0aGlzIC0+IExhbmcoJ2Nsb3VkcycpID0+ICdjbG91ZHMnLCAKCQkJCSR0aGlzIC0+IExhbmcoJ2Nsb3Vkc19taWRuaWdodCcpID0+ICdjbG91ZHNfbWlkbmlnaHQnLCAKCQkJCSR0aGlzIC0+IExhbmcoJ2NvYmFsdCcpID0+ICdjb2JhbHQnLCAKCQkJCSR0aGlzIC0+IExhbmcoJ2NyaW1zb25fZWRpdG9yJykgPT4gJ2NyaW1zb25fZWRpdG9yJywKCQkJCSR0aGlzIC0+IExhbmcoJ2Rhd24nKSA9PiAnZGF3bicsCgkJCQkkdGhpcyAtPiBMYW5nKCdkcmVhbXdlYXZlcicpID0+ICdkcmVhbXdlYXZlcicsIAoJCQkJJHRoaXMgLT4gTGFuZygnZWNsaXBzZScpID0+ICdlY2xpcHNlJywKCQkJCSR0aGlzIC0+IExhbmcoJ2lkbGVfZmluZ2VycycpID0+ICdpZGxlX2ZpbmdlcnMnLAoJCQkJJHRoaXMgLT4gTGFuZygna3JfdGhlbWUnKSA9PiAna3JfdGhlbWUnLAoJCQkJJHRoaXMgLT4gTGFuZygnbWVyYml2b3JlJykgPT4gJ21lcmJpdm9yZScsCgkJCQkkdGhpcyAtPiBMYW5nKCdtZXJiaXZvcmVfc29mdCcpID0+ICdtZXJiaXZvcmVfc29mdCcsCgkJCQkkdGhpcyAtPiBMYW5nKCdtb25vX2luZHVzdHJpYWwnKSA9PiAnbW9ub19pbmR1c3RyaWFsJywKCQkJCSR0aGlzIC0+IExhbmcoJ21vbm9rYWknKSA9PiAnbW9ub2thaScsCgkJCQkkdGhpcyAtPiBMYW5nKCdwYXN0ZWxfb25fZGFyaycpID0+ICdwYXN0ZWxfb25fZGFyaycsCgkJCQkkdGhpcyAtPiBMYW5nKCdzb2xhcml6ZWRfZGFyaycpID0+ICdzb2xhcml6ZWRfZGFyaycsCgkJCQkkdGhpcyAtPiBMYW5nKCdzb2xhcml6ZWRfbGlnaHQnKSA9PiAnc29sYXJpemVkX2xpZ2h0JywKCQkJCSR0aGlzIC0+IExhbmcoJ3RleHRtYXRlJykgPT4gJ3RleHRtYXRlJywKCQkJCSR0aGlzIC0+IExhbmcoJ3R3aWxpZ2h0JykgPT4gJ3R3aWxpZ2h0JywKCQkJCSR0aGlzIC0+IExhbmcoJ3ZpYnJhbnRfaW5rJykgPT4gJ3ZpYnJhbnRfaW5rJwkJCgkJCSk7CgkJLy8gaGVhZCB0aGVtZXMKCQkkdGhpcyAtPiBzbWFydHkgLT4gYXNzaWduKCdmcm9udGVuZF90aGVtZWlucHV0JywgJHRoaXMgLT4gQ3JlYXRlSW5wdXRTZWxlY3RMaXN0KCRpZCwgJ2Zyb250ZW5kX3RoZW1lW10nLCAkdGhlbWVzLCBleHBsb2RlKCcsJywgJHRoaXMgLT4gR2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfdGhlbWUnLCAndGV4dG1hdGUnKSksIDUpKTsKCQkvLyBzeW50YXhhcmVhIHRoZW1lCQoJCSR0aGlzIC0+IHNtYXJ0eSAtPiBhc3NpZ24oJ3RoZW1laW5wdXQnLCAkdGhpcyAtPiBDcmVhdGVJbnB1dERyb3Bkb3duKCRpZCwgJ2Zyb250ZW5kX3N5bnRheGFyZWFfdGhlbWUnLCAkdGhlbWVzLCAtMSwgJHRoaXMgLT4gR2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfc3ludGF4YXJlYV90aGVtZScsICd0ZXh0bWF0ZScpKSk7CgkJCgkJLyogZm9udCBzaXplICovCgkJJHRoaXMgLT4gc21hcnR5IC0+IGFzc2lnbignZm9udHNpemV0ZXh0JywgJHRoaXMgLT4gTGFuZygnZm9udF9zaXplJykpOwoJCQkkZm9udHMgPSBhcnJheSgKCQkJCScxMHB4JyA9PiAnMTBweCcsIAoJCQkJJzExcHgnID0+ICcxMXB4JywgCgkJCQknMTJweCcgPT4gJzEycHgnLCAKCQkJCScxNHB4JyA9PiAnMTRweCcsCgkJCQknMTZweCcgPT4gJzE2cHgnLAoJCQkJJzIwcHgnID0+ICcyMHB4JywKCQkJCScyNHB4JyA9PiAnMjRweCcKCQkJKTsKCQkkdGhpcyAtPiBzbWFydHkgLT4gYXNzaWduKCdmb250c2l6ZWlucHV0JywgJHRoaXMgLT4gQ3JlYXRlSW5wdXREcm9wZG93bigkaWQsICdmcm9udGVuZF9mb250c2l6ZScsICRmb250cywgLTEsICR0aGlzIC0+IEdldFByZWZlcmVuY2UoJ2Zyb250ZW5kX2ZvbnRzaXplJywgJzEycHgnKSkpOwkJCgkJLy8gc3VibWl0IHNldHRpbmdzCgkJJHRoaXMgLT4gc21hcnR5IC0+IGFzc2lnbignZnJvbnRlbmRzdWJtaXQnLCAkdGhpcyAtPiBDcmVhdGVJbnB1dFN1Ym1pdCgkaWQsICdmcm9udGVuZHN1Ym1pdCcsICR0aGlzIC0+IExhbmcoJ3NhdmVzZXR0aW5ncycpKSk7CgkJCgkvKiBQcm9jZXNzVGVtcGFsdGUgKi8KCWVjaG8gJHRoaXMgLT4gUHJvY2Vzc1RlbXBsYXRlKCdmcm9udGVuZHNldHRpbmdzLnRwbCcpOwoKPz4J]]></data>
	</file>
	<file>
	  <filename>/function.admin_prefstab.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCWlmIChpc3NldCgkcGFyYW1zWydleGFtcGxlX3N5bnRheCddKSkgCgl7CgkJJHRoaXMgLT4gU2V0UHJlZmVyZW5jZSgnZXhhbXBsZV9zeW50YXgnLCAkcGFyYW1zWydleGFtcGxlX3N5bnRheCddKTsKCX0KCQkkdGhpcyAtPiBzbWFydHkgLT4gYXNzaWduKCdzdGFydGZvcm0nLCAkdGhpcyAtPiBDcmVhdGVGb3JtU3RhcnQoJGlkLCAnc2F2ZXNldHRpbmdzJywgJHJldHVybmlkKSk7CgkJJHRoaXMgLT4gc21hcnR5IC0+IGFzc2lnbignZW5kZm9ybScsICR0aGlzIC0+IENyZWF0ZUZvcm1FbmQoKSk7CgkJJHRoaXMgLT4gc21hcnR5IC0+IGFzc2lnbignc2V0dGluZ3N0ZXh0JywgJHRoaXMgLT4gTGFuZygnc2V0dGluZ3NfdGFiJykpOwoKCQkkc21hcnR5LT5hc3NpZ24oJ3dpZHRoX3RpdGxlJywgJHRoaXMgLT4gTGFuZygnd2lkdGhfdGl0bGUnKSk7CgkJJHNtYXJ0eS0+YXNzaWduKCd3aWR0aF9pbnB1dCcsICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCAnd2lkdGgnLCAkdGhpcyAtPiBHZXRQcmVmZXJlbmNlKCd3aWR0aCcsICc4MCcpLCAxMCwgMjU1KSk7CQkKCQkkc21hcnR5LT5hc3NpZ24oJ2hlaWdodF90aXRsZScsICR0aGlzIC0+IExhbmcoJ2hlaWdodF90aXRsZScpKTsKCQkkc21hcnR5LT5hc3NpZ24oJ2hlaWdodF9pbnB1dCcsICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCAnaGVpZ2h0JywgJHRoaXMgLT4gR2V0UHJlZmVyZW5jZSgnaGVpZ2h0JywgJzQwJyksIDEwLCAyNTUpKTsKCQkvLyBjcmVhdGUgYSBJRSBwcmVmLCBET05UIFdBTlQgVE8gU0VFIEEgQlIgRk9SIFRISVMgU0hJVCEKCQkkdGhpcyAtPiBzbWFydHkgLT4gYXNzaWduKCdlbmFibGVfaWV0ZXh0JywgJHRoaXMgLT4gTGFuZygnZW5hYmxlX2llJykpOwoJCSR0aGlzIC0+IHNtYXJ0eSAtPiBhc3NpZ24oJ2VuYWJsZV9pZWRlc2NyJywgJHRoaXMgLT4gTGFuZygnZW5hYmxlX2llZGVzY3JpcHRpb24nKSk7CgkJJHRoaXMgLT4gc21hcnR5IC0+IGFzc2lnbignZW5hYmxlX2llaW5wdXQnLCAkdGhpcyAtPiBDcmVhdGVJbnB1dENoZWNrYm94KCRpZCwgJ2VuYWJsZV9pZScsIDEsICR0aGlzIC0+IEdldFByZWZlcmVuY2UoJ2VuYWJsZV9pZScsIDEpKSk7CgoJCSR0aGlzIC0+IHNtYXJ0eSAtPiBhc3NpZ24oJ3VzZV91bmNvbXByZXNzZWRfdGl0bGUnLCAkdGhpcyAtPiBMYW5nKCd1c2VfdW5jb21wcmVzc2VkJykpOwoJCSR0aGlzIC0+IHNtYXJ0eSAtPiBhc3NpZ24oJ3VzZV91bmNvbXByZXNzZWRfdGV4dCcsICR0aGlzIC0+IExhbmcoJ3VzZV91bmNvbXByZXNzZWRfdGV4dCcpKTsKCQkkdGhpcyAtPiBzbWFydHkgLT4gYXNzaWduKCd1c2VfdW5jb21wcmVzc2VkX2lucHV0JywgJHRoaXMgLT4gQ3JlYXRlSW5wdXRDaGVja2JveCgkaWQsICd1c2VfdW5jb21wcmVzc2VkJywgMSwgJHRoaXMgLT4gR2V0UHJlZmVyZW5jZSgndXNlX3VuY29tcHJlc3NlZCcsIDApKSk7CgoJCS8qIG1vZGUgZHJvcGRvd24gKi8KCQkkdGhpcyAtPiBzbWFydHkgLT4gYXNzaWduKCdzeW50YXhfbW9kZScsICR0aGlzIC0+IExhbmcoJ3N5bnRheF9tb2RlJykpOwoJCQkkbW9kZXMgPSBhcnJheSgKCQkJCSR0aGlzIC0+IExhbmcoJ2pzJykgPT4gJ2phdmFzY3JpcHQnLCAKCQkJCSR0aGlzIC0+IExhbmcoJ3BsYWluJykgPT4gJ3BsYWluJywgCgkJCQkkdGhpcyAtPiBMYW5nKCdzdmcnKSA9PiAnc3ZnJywgCgkJCQkkdGhpcyAtPiBMYW5nKCdodG1sJykgPT4gJ2h0bWwnLAoJCQkJJHRoaXMgLT4gTGFuZygnY3NzJykgPT4gJ2NzcycsCgkJCQkkdGhpcyAtPiBMYW5nKCdzY3NzJykgPT4gJ3Njc3MnLAoJCQkJJHRoaXMgLT4gTGFuZygnY29mZmVlJykgPT4gJ2NvZmZlZScsCgkJCQkkdGhpcyAtPiBMYW5nKCdqc29uJykgPT4gJ2pzb24nLAoJCQkJJHRoaXMgLT4gTGFuZygncHl0aG9uJykgPT4gJ3B5dGhvbicsCgkJCQkkdGhpcyAtPiBMYW5nKCdydWJ5JykgPT4gJ3J1YnknLAoJCQkJJHRoaXMgLT4gTGFuZygncGVybCcpID0+ICdwZXJsJywKCQkJCSR0aGlzIC0+IExhbmcoJ3BocCcpID0+ICdwaHAnLAoJCQkJJHRoaXMgLT4gTGFuZygnamF2YScpID0+ICdqYXZhJywKCQkJCSR0aGlzIC0+IExhbmcoJ2NzaGFycCcpID0+ICdjc2hhcnAnLAoJCQkJJHRoaXMgLT4gTGFuZygnY19jcHAnKSA9PiAnY19jcHAnLAoJCQkJJHRoaXMgLT4gTGFuZygnY2xvanVyZScpID0+ICdjbG9qdXJlJywKCQkJCSR0aGlzIC0+IExhbmcoJ29jYW1sJykgPT4gJ29jYW1sJywKCQkJCSR0aGlzIC0+IExhbmcoJ3RleHRpbGUnKSA9PiAndGV4dGlsZScsCgkJCQkkdGhpcyAtPiBMYW5nKCdncm9vdnknKSA9PiAnZ3Jvb3Z5JywKCQkJCSR0aGlzIC0+IExhbmcoJ3NjYWxhJykgPT4gJ3NjYWxhJwoJCQkJKTsJCgkJJHRoaXMgLT4gc21hcnR5IC0+IGFzc2lnbignc3ludGF4X21vZGVpbnB1dCcsICR0aGlzIC0+IENyZWF0ZUlucHV0RHJvcGRvd24oJGlkLCAnbW9kZScsICRtb2RlcywgLTEsICR0aGlzIC0+IEdldFByZWZlcmVuY2UoJ21vZGUnLCAnaHRtbCcpLCdvbmNoYW5nZT0idGhpcy5mb3JtLnN1Ym1pdCgpIicpKTsJCQkJCgoJCS8qIHRoZW1lcyAqLwkJCgkJJHRoaXMgLT4gc21hcnR5IC0+IGFzc2lnbigndGhlbWV0ZXh0JywgJHRoaXMgLT4gTGFuZygndGhlbWVzJykpOwoJCQkkdGhlbWVzID0gYXJyYXkoCgkJCQkkdGhpcyAtPiBMYW5nKCdjaHJvbWUnKSA9PiAnY2hyb21lJywgCgkJCQkkdGhpcyAtPiBMYW5nKCdjbG91ZHMnKSA9PiAnY2xvdWRzJywgCgkJCQkkdGhpcyAtPiBMYW5nKCdjbG91ZHNfbWlkbmlnaHQnKSA9PiAnY2xvdWRzX21pZG5pZ2h0JywgCgkJCQkkdGhpcyAtPiBMYW5nKCdjb2JhbHQnKSA9PiAnY29iYWx0JywgCgkJCQkkdGhpcyAtPiBMYW5nKCdjcmltc29uX2VkaXRvcicpID0+ICdjcmltc29uX2VkaXRvcicsCgkJCQkkdGhpcyAtPiBMYW5nKCdkYXduJykgPT4gJ2Rhd24nLAoJCQkJJHRoaXMgLT4gTGFuZygnZHJlYW13ZWF2ZXInKSA9PiAnZHJlYW13ZWF2ZXInLCAKCQkJCSR0aGlzIC0+IExhbmcoJ2VjbGlwc2UnKSA9PiAnZWNsaXBzZScsCgkJCQkkdGhpcyAtPiBMYW5nKCdpZGxlX2ZpbmdlcnMnKSA9PiAnaWRsZV9maW5nZXJzJywKCQkJCSR0aGlzIC0+IExhbmcoJ2tyX3RoZW1lJykgPT4gJ2tyX3RoZW1lJywKCQkJCSR0aGlzIC0+IExhbmcoJ21lcmJpdm9yZScpID0+ICdtZXJiaXZvcmUnLAoJCQkJJHRoaXMgLT4gTGFuZygnbWVyYml2b3JlX3NvZnQnKSA9PiAnbWVyYml2b3JlX3NvZnQnLAoJCQkJJHRoaXMgLT4gTGFuZygnbW9ub19pbmR1c3RyaWFsJykgPT4gJ21vbm9faW5kdXN0cmlhbCcsCgkJCQkkdGhpcyAtPiBMYW5nKCdtb25va2FpJykgPT4gJ21vbm9rYWknLAoJCQkJJHRoaXMgLT4gTGFuZygncGFzdGVsX29uX2RhcmsnKSA9PiAncGFzdGVsX29uX2RhcmsnLAoJCQkJJHRoaXMgLT4gTGFuZygnc29sYXJpemVkX2RhcmsnKSA9PiAnc29sYXJpemVkX2RhcmsnLAoJCQkJJHRoaXMgLT4gTGFuZygnc29sYXJpemVkX2xpZ2h0JykgPT4gJ3NvbGFyaXplZF9saWdodCcsCgkJCQkkdGhpcyAtPiBMYW5nKCd0ZXh0bWF0ZScpID0+ICd0ZXh0bWF0ZScsCgkJCQkkdGhpcyAtPiBMYW5nKCd0b21vcnJvdycpID0+ICd0b21vcnJvdycsCgkJCQkkdGhpcyAtPiBMYW5nKCd0b21vcnJvd19uaWdodCcpID0+ICd0b21vcnJvd19uaWdodCcsCgkJCQkkdGhpcyAtPiBMYW5nKCd0b21vcnJvd19uaWdodF9ibHVlJykgPT4gJ3RvbW9ycm93X25pZ2h0X2JsdWUnLAoJCQkJJHRoaXMgLT4gTGFuZygndG9tb3Jyb3dfbmlnaHRfYnJpZ2h0JykgPT4gJ3RvbW9ycm93X25pZ2h0X2JyaWdodCcsCgkJCQkkdGhpcyAtPiBMYW5nKCd0b21vcnJvd19uaWdodF9laWdodGllcycpID0+ICd0b21vcnJvd19uaWdodF9laWdodGllcycsCQkJCQoJCQkJJHRoaXMgLT4gTGFuZygndHdpbGlnaHQnKSA9PiAndHdpbGlnaHQnLAoJCQkJJHRoaXMgLT4gTGFuZygndmlicmFudF9pbmsnKSA9PiAndmlicmFudF9pbmsnCQkKCQkJKTsKCQkkdGhpcyAtPiBzbWFydHkgLT4gYXNzaWduKCd0aGVtZWlucHV0JywgJHRoaXMgLT4gQ3JlYXRlSW5wdXREcm9wZG93bigkaWQsICd0aGVtZScsICR0aGVtZXMsIC0xLCAkdGhpcyAtPiBHZXRQcmVmZXJlbmNlKCd0aGVtZScsICd0ZXh0bWF0ZScpLCdvbmNoYW5nZT0idGhpcy5mb3JtLnN1Ym1pdCgpIicpKTsKCgkJLyogZm9udCBzaXplICovCgkJJHRoaXMgLT4gc21hcnR5IC0+IGFzc2lnbignZm9udHNpemV0ZXh0JywgJHRoaXMgLT4gTGFuZygnZm9udF9zaXplJykpOwoJCQkkZm9udHMgPSBhcnJheSgKCQkJCScxMHB4JyA9PiAnMTBweCcsIAoJCQkJJzExcHgnID0+ICcxMXB4JywgCgkJCQknMTJweCcgPT4gJzEycHgnLCAKCQkJCScxNHB4JyA9PiAnMTRweCcsCgkJCQknMTZweCcgPT4gJzE2cHgnLAoJCQkJJzIwcHgnID0+ICcyMHB4JywKCQkJCScyNHB4JyA9PiAnMjRweCcKCQkJKTsKCQkkdGhpcyAtPiBzbWFydHkgLT4gYXNzaWduKCdmb250c2l6ZWlucHV0JywgJHRoaXMgLT4gQ3JlYXRlSW5wdXREcm9wZG93bigkaWQsICdmb250c2l6ZScsICRmb250cywgLTEsICR0aGlzIC0+IEdldFByZWZlcmVuY2UoJ2ZvbnRzaXplJywgJzEycHgnKSkpOwkJCgoJCSR0aGlzIC0+IHNtYXJ0eSAtPiBhc3NpZ24oJ2Z1bGxfbGluZXRleHQnLCAkdGhpcyAtPiBMYW5nKCdmdWxsX2xpbmUnKSk7CgkJJHRoaXMgLT4gc21hcnR5IC0+IGFzc2lnbignZnVsbF9saW5laW5wdXQnLCAkdGhpcyAtPiBDcmVhdGVJbnB1dENoZWNrYm94KCRpZCwgJ2Z1bGxfbGluZScsIDEsICR0aGlzIC0+IEdldFByZWZlcmVuY2UoJ2Z1bGxfbGluZScsIDEpKSk7CgkJJHRoaXMgLT4gc21hcnR5IC0+IGFzc2lnbignaGlnaGxpZ2h0X2FjdGl2ZXRleHQnLCAkdGhpcyAtPiBMYW5nKCdoaWdobGlnaHRfYWN0aXZlJykpOwoJCSR0aGlzIC0+IHNtYXJ0eSAtPiBhc3NpZ24oJ2hpZ2hsaWdodF9hY3RpdmVpbnB1dCcsICR0aGlzIC0+IENyZWF0ZUlucHV0Q2hlY2tib3goJGlkLCAnaGlnaGxpZ2h0X2FjdGl2ZScsIDEsICR0aGlzIC0+IEdldFByZWZlcmVuY2UoJ2hpZ2hsaWdodF9hY3RpdmUnLCAxKSkpOwoJCSR0aGlzIC0+IHNtYXJ0eSAtPiBhc3NpZ24oJ3Nob3dfaW52aXNpYmxlc3RleHQnLCAkdGhpcyAtPiBMYW5nKCdzaG93X2ludmlzaWJsZXMnKSk7CgkJJHRoaXMgLT4gc21hcnR5IC0+IGFzc2lnbignc2hvd19pbnZpc2libGVzaW5wdXQnLCAkdGhpcyAtPiBDcmVhdGVJbnB1dENoZWNrYm94KCRpZCwgJ3Nob3dfaW52aXNpYmxlcycsIDEsICR0aGlzIC0+IEdldFByZWZlcmVuY2UoJ3Nob3dfaW52aXNpYmxlcycsIDEpKSk7CQoJCSR0aGlzIC0+IHNtYXJ0eSAtPiBhc3NpZ24oJ3BlcnNpc3RlbnRfaHNjcm9sbHRleHQnLCAkdGhpcyAtPiBMYW5nKCdwZXJzaXN0ZW50X2hzY3JvbGwnKSk7CgkJJHRoaXMgLT4gc21hcnR5IC0+IGFzc2lnbigncGVyc2lzdGVudF9oc2Nyb2xsaW5wdXQnLCAkdGhpcyAtPiBDcmVhdGVJbnB1dENoZWNrYm94KCRpZCwgJ3BlcnNpc3RlbnRfaHNjcm9sbCcsIDEsICR0aGlzIC0+IEdldFByZWZlcmVuY2UoJ3BlcnNpc3RlbnRfaHNjcm9sbCcsIDEpKSk7CgoJCS8qIHRleHQgd3JhcHBpbmcgKi8KCQkkdGhpcyAtPiBzbWFydHkgLT4gYXNzaWduKCdzb2Z0X3dyYXB0ZXh0JywgJHRoaXMgLT4gTGFuZygnc29mdF93cmFwJykpOwoJCQkkc29mdF93cmFwID0gYXJyYXkoCgkJCQkkdGhpcyAtPiBMYW5nKCdvZmYnKSA9PiAnb2ZmJywgCgkJCQkkdGhpcyAtPiBMYW5nKCc0MCcpID0+ICc0MCw0MCcsIAoJCQkJJHRoaXMgLT4gTGFuZygnODAnKSA9PiAnODAsODAnLAoJCQkJJHRoaXMgLT4gTGFuZygnMTAwJykgPT4gJzEwMCwxMDAnLAoJCQkJJHRoaXMgLT4gTGFuZygnMTQwJykgPT4gJzE0MCwxNDAnCgkJCSk7CgkJJHRoaXMgLT4gc21hcnR5IC0+IGFzc2lnbignc29mdF93cmFwaW5wdXQnLCAkdGhpcyAtPiBDcmVhdGVJbnB1dERyb3Bkb3duKCRpZCwgJ3NvZnRfd3JhcCcsICRzb2Z0X3dyYXAsIC0xLCAkdGhpcyAtPiBHZXRQcmVmZXJlbmNlKCdzb2Z0X3dyYXAnLCAnODAsODAnKSkpOwoKCQkkdGhpcyAtPiBzbWFydHkgLT4gYXNzaWduKCdzaG93X2d1dHRlcnRleHQnLCAkdGhpcyAtPiBMYW5nKCdzaG93X2d1dHRlcicpKTsKCQkkdGhpcyAtPiBzbWFydHkgLT4gYXNzaWduKCdzaG93X2d1dHRlcmlucHV0JywgJHRoaXMgLT4gQ3JlYXRlSW5wdXRDaGVja2JveCgkaWQsICdzaG93X2d1dHRlcicsIDEsICR0aGlzIC0+IEdldFByZWZlcmVuY2UoJ3Nob3dfZ3V0dGVyJywgMSkpKTsJCgkJJHRoaXMgLT4gc21hcnR5IC0+IGFzc2lnbigncHJpbnRfbWFyZ2ludGV4dCcsICR0aGlzIC0+IExhbmcoJ3ByaW50X21hcmdpbicpKTsKCQkkdGhpcyAtPiBzbWFydHkgLT4gYXNzaWduKCdwcmludF9tYXJnaW5pbnB1dCcsICR0aGlzIC0+IENyZWF0ZUlucHV0Q2hlY2tib3goJGlkLCAncHJpbnRfbWFyZ2luJywgMSwgJHRoaXMgLT4gR2V0UHJlZmVyZW5jZSgncHJpbnRfbWFyZ2luJywgMSkpKTsKCQkkdGhpcyAtPiBzbWFydHkgLT4gYXNzaWduKCdzb2Z0X3RhYnRleHQnLCAkdGhpcyAtPiBMYW5nKCdzb2Z0X3RhYicpKTsKCQkkdGhpcyAtPiBzbWFydHkgLT4gYXNzaWduKCdzb2Z0X3RhYmlucHV0JywgJHRoaXMgLT4gQ3JlYXRlSW5wdXRDaGVja2JveCgkaWQsICdzb2Z0X3RhYicsIDEsICR0aGlzIC0+IEdldFByZWZlcmVuY2UoJ3NvZnRfdGFiJywgMSkpKTsKCQkkdGhpcyAtPiBzbWFydHkgLT4gYXNzaWduKCdoaWdobGlnaHRfc2VsZWN0ZWR0ZXh0JywgJHRoaXMgLT4gTGFuZygnaGlnaGxpZ2h0X3NlbGVjdGVkJykpOwoJCSR0aGlzIC0+IHNtYXJ0eSAtPiBhc3NpZ24oJ2hpZ2hsaWdodF9zZWxlY3RlZGlucHV0JywgJHRoaXMgLT4gQ3JlYXRlSW5wdXRDaGVja2JveCgkaWQsICdoaWdobGlnaHRfc2VsZWN0ZWQnLCAxLCAkdGhpcyAtPiBHZXRQcmVmZXJlbmNlKCdoaWdobGlnaHRfc2VsZWN0ZWQnLCAxKSkpOwkKCgkJJHRoaXMgLT4gc21hcnR5IC0+IGFzc2lnbignc3VibWl0JywgJHRoaXMgLT4gQ3JlYXRlSW5wdXRTdWJtaXQoJGlkLCAnc3VibWl0JywgJHRoaXMgLT4gTGFuZygnc2F2ZXNldHRpbmdzJykpKTsKCQkKCQkvKiBzYW1wbGUgY29udGVudCAqLwoJCSRzeW50YXhfY29udGVudCA9ICcnOwoJCXN3aXRjaCAoJHRoaXMtPkdldFByZWZlcmVuY2UoJ21vZGUnLCdodG1sJykpIHsKCQkJY2FzZSAnaHRtbCcgOiB7CgkJCQkkc3ludGF4X2NvbnRlbnQgPSAiCjxodG1sPgo8aGVhZD4KCjxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIj4KLnRleHQtbGF5ZXIgewogICAgZm9udC1mYW1pbHk6IE1vbmFjbywgXCJDb3VyaWVyIE5ld1wiLCBtb25vc3BhY2U7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjdXJzb3I6IHRleHQ7Cn0KPC9zdHlsZT4KCjwvaGVhZD4KPGJvZHk+CiAgICA8aDEgc3R5bGU9XCJjb2xvcjpyZWRcIj5KdWh1IEtpbm5lcnM8L2gxPgo8L2JvZHk+CjwvaHRtbD4KCQkJCSI7CgkJCQlicmVhazsKCQkJfQoJCQljYXNlICdjc3MnIDogewoJCQkJJHN5bnRheF9jb250ZW50ID0gIgoudGV4dC1sYXllciB7CiAgICBmb250LWZhbWlseTogTW9uYWNvLCBcIkNvdXJpZXIgTmV3XCIsIG1vbm9zcGFjZTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGN1cnNvcjogdGV4dDsKfQkJCQkiOwoJCQkJYnJlYWs7CgkJCX0KCQkJY2FzZSAnamF2YXNjcmlwdCcgOiB7CgkJCQkkc3ludGF4X2NvbnRlbnQgPSAiCmZ1bmN0aW9uIGZvbyhpdGVtcykgewogICAgZm9yICh2YXIgaT0wOyBpPGl0ZW1zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgYWxlcnQoaXRlbXNbaV0gKyBcImp1aHVcIik7CiAgICB9CS8vIFJlYWwgVGFiLgp9CQkJCSI7CgkJCQlicmVhazsKCQkJfQoJCQljYXNlICdwbGFpbicgOiB7CgkJCQkkc3ludGF4X2NvbnRlbnQgPSAiCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtIG5vbnVteSBlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkIGRpYW0gdm9sdXB0dWEuIEF0IHZlcm8gZW9zIGV0IGFjY3VzYW0gZXQganVzdG8gZHVvIGRvbG9yZXMgZXQgZWEgcmVidW0uIFN0ZXQgY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15IGVpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCBjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2V0ZXR1ciBzYWRpcHNjaW5nIGVsaXRyLCBzZWQgZGlhbSBub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCBkaWFtIHZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0IGNsaXRhIGthc2QgZ3ViZXJncmVuLCBubyBzZWEgdGFraW1hdGEgc2FuY3R1cyBlc3QgTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuCgpEdWlzIGF1dGVtIHZlbCBldW0gaXJpdXJlIGRvbG9yIGluIGhlbmRyZXJpdCBpbiB2dWxwdXRhdGUgdmVsaXQgZXNzZSBtb2xlc3RpZSBjb25zZXF1YXQsIHZlbCBpbGx1bSBkb2xvcmUgZXUgZmV1Z2lhdCBudWxsYSBmYWNpbGlzaXMgYXQgdmVybyBlcm9zIGV0IGFjY3Vtc2FuIGV0IGl1c3RvIG9kaW8gZGlnbmlzc2ltIHF1aSBibGFuZGl0IHByYWVzZW50IGx1cHRhdHVtIHp6cmlsIGRlbGVuaXQgYXVndWUgZHVpcyBkb2xvcmUgdGUgZmV1Z2FpdCBudWxsYSBmYWNpbGlzaS4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVlciBhZGlwaXNjaW5nIGVsaXQsIHNlZCBkaWFtIG5vbnVtbXkgbmliaCBldWlzbW9kIHRpbmNpZHVudCB1dCBsYW9yZWV0IGRvbG9yZSBtYWduYSBhbGlxdWFtIGVyYXQgdm9sdXRwYXQuCgkJCQkiOwoJCQkJYnJlYWs7CgkJCX0KCQkJY2FzZSAnc3ZnJyA6IHsKCQkJCSRzeW50YXhfY29udGVudCA9ICIKPHN2ZwogIHdpZHRoPVwiODAwXCIgaGVpZ2h0PVwiNjAwXCIKICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIKICBvbmxvYWQ9XCJTdGFydEFuaW1hdGlvbihldnQpXCI+CgogIDx0aXRsZT5UZXN0IFR1YmUgUHJvZ3Jlc3MgQmFyPC90aXRsZT4KICA8ZGVzYz5DcmVhdGVkIGZvciB0aGUgV2ViIERpcmVjdGlvbnMgU1ZHIGNvbXBldGl0aW9uPC9kZXNjPgoKICA8c2NyaXB0IHR5cGU9XCJ0ZXh0L2VjbWFzY3JpcHRcIj48IVtDREFUQVsKICAgIHZhciB0aW1ldmFsdWUgPSAwOwogICAgdmFyIHRpbWVyX2luY3JlbWVudCA9IDE7CiAgICB2YXIgbWF4X3RpbWUgPSAxMDA7CiAgICB2YXIgaGlja29yeTsKICAgIHZhciBkaWNrb3J5OwogICAgdmFyIGRvY2s7CiAgICB2YXIgaTsKCiAgICBmdW5jdGlvbiBTdGFydEFuaW1hdGlvbihldnQpIHsKICAgICAgICBoaWNrb3J5ICA9IGV2dC50YXJnZXQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImhpY2tvcnlcIik7CiAgICAgICAgZGlja29yeSA9IGV2dC50YXJnZXQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImRpY2tvcnlcIik7CiAgICAgICAgZG9jayA9IGV2dC50YXJnZXQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImRvY2tcIik7CgogICAgICAgIFNob3dBbmRHcm93RWxlbWVudCgpOwogICAgfQogICAgZnVuY3Rpb24gU2hvd0FuZEdyb3dFbGVtZW50KCkgewogICAgICAgIHRpbWV2YWx1ZSA9IHRpbWV2YWx1ZSArIHRpbWVyX2luY3JlbWVudDsKICAgICAgICBpZiAodGltZXZhbHVlID4gbWF4X3RpbWUpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAvLyBTY2FsZSB0aGUgdGV4dCBzdHJpbmcgZ3JhZHVhbGx5IHVudGlsIGl0IGlzIDIwIHRpbWVzIGxhcmdlcgogICAgICAgIHNjYWxlZmFjdG9yID0gKHRpbWV2YWx1ZSAqIDY1MCkgLyBtYXhfdGltZTsKCiAgICAgICAgaWYgKHRpbWV2YWx1ZSA8IDMwKSB7CiAgICAgICAgICAgIGhpY2tvcnkuc2V0QXR0cmlidXRlKFwiZGlzcGxheVwiLCBcIlwiKTsKICAgICAgICAgICAgaGlja29yeS5zZXRBdHRyaWJ1dGUoXCJ0cmFuc2Zvcm1cIiwgXCJ0cmFuc2xhdGUoXCIgKyAoNjAwK3NjYWxlZmFjdG9yKjMqLTEgKSArIFwiLCAtMTQ0IClcIik7CiAgICAgICAgfQoKICAgICAgICBpZiAodGltZXZhbHVlID4gMzAgJiYgdGltZXZhbHVlIDwgNjYpIHsKICAgICAgICAgICAgZGlja29yeS5zZXRBdHRyaWJ1dGUoXCJkaXNwbGF5XCIsIFwiXCIpOwogICAgICAgICAgICBkaWNrb3J5LnNldEF0dHJpYnV0ZShcInRyYW5zZm9ybVwiLCBcInRyYW5zbGF0ZShcIiArICgtNzk1K3NjYWxlZmFjdG9yKjIpICsgXCIsIDAgKVwiKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRpbWV2YWx1ZSA+IDY2KSB7CiAgICAgICAgICAgIGRvY2suc2V0QXR0cmlidXRlKFwiZGlzcGxheVwiLCBcIlwiKTsKICAgICAgICAgICAgZG9jay5zZXRBdHRyaWJ1dGUoXCJ0cmFuc2Zvcm1cIiwgXCJ0cmFuc2xhdGUoXCIgKyAoMTQ1MCtzY2FsZWZhY3RvcioyKi0xKSArIFwiLCAxNDQgKVwiKTsKICAgICAgICB9CgogICAgICAgIC8vIENhbGwgU2hvd0FuZEdyb3dFbGVtZW50IGFnYWluIDx0aW1lcl9pbmNyZW1lbnQ+IG1pbGxpc2Vjb25kcyBsYXRlci4KICAgICAgICBzZXRUaW1lb3V0KFwiU2hvd0FuZEdyb3dFbGVtZW50KClcIiwgdGltZXJfaW5jcmVtZW50KQogICAgfQogICAgd2luZG93LlNob3dBbmRHcm93RWxlbWVudCA9IFNob3dBbmRHcm93RWxlbWVudAogIF1dPjwvc2NyaXB0PgoKICA8cmVjdAogICAgZmlsbD1cIiMyZTM0MzZcIgogICAgZmlsbC1ydWxlPVwibm9uemVyb1wiCiAgICBzdHJva2Utd2lkdGg9XCIzXCIKICAgIHk9XCIwXCIKICAgIHg9XCIwXCIKICAgIGhlaWdodD1cIjYwMFwiCiAgICB3aWR0aD1cIjgwMFwiCiAgICBpZD1cInJlY3QzNTkwXCIvPgoKICAgIDx0ZXh0CiAgICAgICBzdHlsZT1cImZvbnQtc2l6ZToxNDRweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOkJpdHN0cmVhbSBWZXJhIFNhbnMgQm9sZFwiCiAgICAgICB4PVwiNTBcIgogICAgICAgeT1cIjM1MFwiCiAgICAgICBpZD1cImhpY2tvcnlcIgogICAgICAgZGlzcGxheT1cIm5vbmVcIj4KICAgICAgICBIaWNrb3J5LDwvdGV4dD4KICAgIDx0ZXh0CiAgICAgICBzdHlsZT1cImZvbnQtc2l6ZToxNDRweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOkJpdHN0cmVhbSBWZXJhIFNhbnMgQm9sZFwiCiAgICAgICB4PVwiNTBcIgogICAgICAgeT1cIjM1MFwiCiAgICAgICBpZD1cImRpY2tvcnlcIgogICAgICAgZGlzcGxheT1cIm5vbmVcIj4KICAgICAgICBkaWNrb3J5LDwvdGV4dD4KICAgIDx0ZXh0CiAgICAgICBzdHlsZT1cImZvbnQtc2l6ZToxNDRweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOkJpdHN0cmVhbSBWZXJhIFNhbnMgQm9sZFwiCiAgICAgICB4PVwiNTBcIgogICAgICAgeT1cIjM1MFwiCiAgICAgICBpZD1cImRvY2tcIgogICAgICAgZGlzcGxheT1cIm5vbmVcIj4KICAgICAgICBkb2NrITwvdGV4dD4KPC9zdmc+CQkJIjsKCQkJCWJyZWFrOwoJCQl9CgkJCWNhc2UgJ3Njc3MnIDogewoJCQkJJHN5bnRheF9jb250ZW50ID0gIgovKiBzdHlsZS5zY3NzICovCgojbmF2YmFyIHsKICAgIFwkbmF2YmFyLXdpZHRoOiA4MDBweDsKICAgIFwkaXRlbXM6IDU7CiAgICBcJG5hdmJhci1jb2xvcjogI2NlNGRkNjsKCiAgICB3aWR0aDogXCRuYXZiYXItd2lkdGg7CiAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgXCRuYXZiYXItY29sb3I7CgogICAgbGkgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIHdpZHRoOiBcJG5hdmJhci13aWR0aC9cJGl0ZW1zIC0gMTBweDsKCiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRlbihcJG5hdmJhci1jb2xvciwgMjAlKTsKICAgICAgICAmOmhvdmVyIHsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRlbihcJG5hdmJhci1jb2xvciwgMTAlKTsKICAgICAgICB9CiAgICB9Cn0JCQkJIjsKCQkJCWJyZWFrOwoJCQl9CgkJCWNhc2UgJ2NvZmZlZScgOiB7CgkJCQkkc3ludGF4X2NvbnRlbnQgPSAiCiMhL3Vzci9iaW4vZW52IGNvZmZlZQoKdHJ5CiAgICB0aHJvdyBVUklFcnJvciBkZWNvZGVVUkkoMHhDMGZmZWUgKiAxMjM0NTYuN2UtOCAvIC45KQpjYXRjaCBlCiAgICBjb25zb2xlLmxvZyAncXN0cmluZycgKyBcInFxc3RyaW5nXCIgKyAnJycKICAgICAgICBxZG9jCiAgICAnJycgKyBcIlwiXCIKICAgICAgICBxcWRvYwogICAgXCJcIlwiCgpkbyAtPgogICAgIyMjCiAgICBoZXJlY29tbWVudAogICAgIyMjCiAgICByZSA9IC9yZWdleC9pbWd5LnRlc3QgLy8vCiAgICAgICAgaGVyZWdleCAgIyBjb21tZW50CiAgICAvLy9pbWd5CiAgICB0aGlzIGlzbnQ6IGBqdXN0IEphdmFTY3JpcHRgCiAgICB1bmRlZmluZWQJCQkJCiAgICAJCQkiOwoJCQkJYnJlYWs7CgkJCX0KCQkJY2FzZSAnanNvbicgOiB7CgkJCQkkc3ludGF4X2NvbnRlbnQgPSAiCnsKIFwicXVlcnlcIjogewogIFwiY291bnRcIjogMTAsCiAgXCJjcmVhdGVkXCI6IFwiMjAxMS0wNi0yMVQwODoxMDo0NlpcIiwKICBcImxhbmdcIjogXCJlbi1VU1wiLAogIFwicmVzdWx0c1wiOiB7CiAgIFwicGhvdG9cIjogWwogICAgewogICAgIFwiZmFybVwiOiBcIjZcIiwKICAgICBcImlkXCI6IFwiNTg1NTYyMDk3NVwiLAogICAgIFwiaXNmYW1pbHlcIjogXCIwXCIsCiAgICAgXCJpc2ZyaWVuZFwiOiBcIjBcIiwKICAgICBcImlzcHVibGljXCI6IFwiMVwiLAogICAgIFwib3duZXJcIjogXCIzMjAyMTU1NEBOMDRcIiwKICAgICBcInNlY3JldFwiOiBcImYxZjVlODUxNWRcIiwKICAgICBcInNlcnZlclwiOiBcIjUxMTBcIiwKICAgICBcInRpdGxlXCI6IFwiNzA4NyBiYW5kaXQgY2F0XCIKICAgIH0sCiAgICB7CiAgICAgXCJmYXJtXCI6IFwiNFwiLAogICAgIFwiaWRcIjogXCI1ODU2MTcwNTM0XCIsCiAgICAgXCJpc2ZhbWlseVwiOiBcIjBcIiwKICAgICBcImlzZnJpZW5kXCI6IFwiMFwiLAogICAgIFwiaXNwdWJsaWNcIjogXCIxXCIsCiAgICAgXCJvd25lclwiOiBcIjMyMDIxNTU0QE4wNFwiLAogICAgIFwic2VjcmV0XCI6IFwiZmYxZWZiMmE2ZlwiLAogICAgIFwic2VydmVyXCI6IFwiMzIxN1wiLAogICAgIFwidGl0bGVcIjogXCI2OTc1IHJ1c3R5IGNhdFwiCiAgICB9LAogICAgewogICAgIFwiZmFybVwiOiBcIjZcIiwKICAgICBcImlkXCI6IFwiNTg1NjE3Mjk3MlwiLAogICAgIFwiaXNmYW1pbHlcIjogXCIwXCIsCiAgICAgXCJpc2ZyaWVuZFwiOiBcIjBcIiwKICAgICBcImlzcHVibGljXCI6IFwiMVwiLAogICAgIFwib3duZXJcIjogXCI1MTI0OTg3NUBOMDNcIiwKICAgICBcInNlY3JldFwiOiBcIjZjNjg4NzM0N2NcIiwKICAgICBcInNlcnZlclwiOiBcIjUxOTJcIiwKICAgICBcInRpdGxlXCI6IFwid2F0ZXJtYXJrZWQtY2F0c1wiCiAgICB9LAogICAgewogICAgIFwiZmFybVwiOiBcIjZcIiwKICAgICBcImlkXCI6IFwiNTg1NjE2ODMyOFwiLAogICAgIFwiaXNmYW1pbHlcIjogXCIwXCIsCiAgICAgXCJpc2ZyaWVuZFwiOiBcIjBcIiwKICAgICBcImlzcHVibGljXCI6IFwiMVwiLAogICAgIFwib3duZXJcIjogXCIzMjAyMTU1NEBOMDRcIiwKICAgICBcInNlY3JldFwiOiBcIjBjMWNmZGY2NGNcIiwKICAgICBcInNlcnZlclwiOiBcIjUwNzhcIiwKICAgICBcInRpdGxlXCI6IFwiNzAyMCBtYW5keSBjYXRcIgogICAgfSwKICAgIHsKICAgICBcImZhcm1cIjogXCIzXCIsCiAgICAgXCJpZFwiOiBcIjU4NTYxNzE3NzRcIiwKICAgICBcImlzZmFtaWx5XCI6IFwiMFwiLAogICAgIFwiaXNmcmllbmRcIjogXCIwXCIsCiAgICAgXCJpc3B1YmxpY1wiOiBcIjFcIiwKICAgICBcIm93bmVyXCI6IFwiMzIwMjE1NTRATjA0XCIsCiAgICAgXCJzZWNyZXRcIjogXCI3ZjVhMzE4MGFiXCIsCiAgICAgXCJzZXJ2ZXJcIjogXCIyNjk2XCIsCiAgICAgXCJ0aXRsZVwiOiBcIjc0NDggYm9iYnkgY2F0XCIKICAgIH0KICAgXQogIH0KIH0KfQkJCQkiOwoJCQkJYnJlYWs7CgkJCX0KCQkJY2FzZSAncHl0aG9uJyA6IHsKCQkJCSRzeW50YXhfY29udGVudCA9ICIKIyEvdXNyL2xvY2FsL2Jpbi9weXRob24KCmltcG9ydCBzdHJpbmcsIHN5cwoKIyBJZiBubyBhcmd1bWVudHMgd2VyZSBnaXZlbiwgcHJpbnQgYSBoZWxwZnVsIG1lc3NhZ2UKaWYgbGVuKHN5cy5hcmd2KT09MToKICAgIHByaW50ICdVc2FnZTogY2Vsc2l1cyB0ZW1wMSB0ZW1wMiAuLi4nCiAgICBzeXMuZXhpdCgwKQoKIyBMb29wIG92ZXIgdGhlIGFyZ3VtZW50cwpmb3IgaSBpbiBzeXMuYXJndlsxOl06CiAgICB0cnk6CiAgICAgICAgZmFocmVuaGVpdD1mbG9hdChzdHJpbmcuYXRvaShpKSkKICAgIGV4Y2VwdCBzdHJpbmcuYXRvaV9lcnJvcjoKICAgICAgICBwcmludCByZXByKGkpLCBcIm5vdCBhIG51bWVyaWMgdmFsdWVcIgkKICAgIGVsc2U6CiAgICAgICAgY2Vsc2l1cz0oZmFocmVuaGVpdC0zMikqNS4wLzkuMAogICAgICAgIHByaW50ICclaVxcMjYwRiA9ICVpXFwyNjBDJyAlIChpbnQoZmFocmVuaGVpdCksIGludChjZWxzaXVzKy41KSkKICAgICAgICAJCSI7CgkJCQlicmVhazsKCQkJfQoJCQljYXNlICdwaHAnIDogewoJCQkJJHN5bnRheF9jb250ZW50ID0gIgo8P3BocAoKZnVuY3Rpb24gbmZhY3QoXCRuKSB7CiAgaWYgKFwkbiA9PSAwKSB7CiAgICByZXR1cm4gMTsKICB9CiAgZWxzZSB7CiAgICByZXR1cm4gXCRuICogbmZhY3QoXCRuIC0gMSk7CiAgfQp9CgplY2hvIFwiXFxuXFxuUGxlYXNlIGVudGVyIGEgd2hvbGUgbnVtYmVyIC4uLiBcIjsKXCRudW0gPSB0cmltKGZnZXRzKFNURElOKSk7CgovLyA9PT09PSBQUk9DRVNTIC0gRGV0ZXJtaW5nIHRoZSBmYWN0b3JpYWwgb2YgdGhlIGlucHV0IG51bWJlciA9PT09PQpcJG91dHB1dCA9IFwiXFxuXFxuRmFjdG9yaWFsIFwiIC4gXCRudW0gLiBcIiA9IFwiIC4gbmZhY3QoXCRudW0pIC4gXCJcXG5cXG5cIjsKZWNobyBcJG91dHB1dDsKCj8+CgkJCQkiOwoJCQkJYnJlYWs7CgkJCX0KCQkJY2FzZSAncnVieScgOiB7CgkJCQkkc3ludGF4X2NvbnRlbnQgPSAiCiMhL3Vzci9iaW4vcnVieQoKIyBQcm9ncmFtIHRvIGZpbmQgdGhlIGZhY3RvcmlhbCBvZiBhIG51bWJlcgpkZWYgZmFjdChuKQogICAgaWYgbiA9PSAwCiAgICAgICAgMQogICAgZWxzZQogICAgICAgIG4gKiBmYWN0KG4tMSkKICAgIGVuZAplbmQKCnB1dHMgZmFjdChBUkdWWzBdLnRvX2kpCgkJCQkiOwoJCQkJYnJlYWs7CgkJCX0KCQkJY2FzZSAncGVybCcgOiB7CgkJCQkkc3ludGF4X2NvbnRlbnQgPSAiCiMhL3Vzci9iaW4vcGVybAp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cm15IFwkbnVtX3ByaW1lcyA9IDA7Cm15IEBwcmltZXM7CgojIFB1dCAyIGFzIHRoZSBmaXJzdCBwcmltZSBzbyB3ZSB3b24ndCBoYXZlIGFuIGVtcHR5IGFycmF5ClwkcHJpbWVzW1wkbnVtX3ByaW1lc10gPSAyOwpcJG51bV9wcmltZXMrKzsKCk1BSU5fTE9PUDoKZm9yIG15IFwkbnVtYmVyX3RvX2NoZWNrICgzIC4uIDIwMCkKewogICAgZm9yIG15IFwkcCAoMCAuLiAoXCRudW1fcHJpbWVzLTEpKQogICAgewogICAgICAgIGlmIChcJG51bWJlcl90b19jaGVjayAlIFwkcHJpbWVzW1wkcF0gPT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIG5leHQgTUFJTl9MT09QOwogICAgICAgIH0KICAgIH0KCiAgICAjIElmIHdlIHJlYWNoZWQgdGhpcyBwb2ludCBpdCBtZWFucyBcJG51bWJlcl90b19jaGVjayBpcyBub3QKICAgICMgZGl2aXNhYmxlIGJ5IGFueSBwcmltZSBudW1iZXIgdGhhdCBjYW1lIGJlZm9yZSBpdC4KICAgIFwkcHJpbWVzW1wkbnVtX3ByaW1lc10gPSBcJG51bWJlcl90b19jaGVjazsKICAgIFwkbnVtX3ByaW1lcysrOwp9Cgpmb3IgbXkgXCRwICgwIC4uIChcJG51bV9wcmltZXMtMSkpCnsKICAgIHByaW50IFwkcHJpbWVzW1wkcF0sIFwiLCBcIjsKfQpwcmludCBcIlxcblwiOwoJCQkJIjsKCQkJCWJyZWFrOwoJCQl9CgkJCWNhc2UgJ2phdmEnIDogewoJCQkJJHN5bnRheF9jb250ZW50ID0gIgpwdWJsaWMgY2xhc3MgSW5maW5pdGVMb29wIHsKCiAgICAvKgogICAgICogVGhpcyB3aWxsIGNhdXNlIHRoZSBwcm9ncmFtIHRvIGhhbmcuLi4KICAgICAqCiAgICAgKiBUYWtlbiBmcm9tOgogICAgICogaHR0cDovL3d3dy5leHBsb3JpbmdiaW5hcnkuY29tL2phdmEtaGFuZ3Mtd2hlbi1jb252ZXJ0aW5nLTItMjI1MDczODU4NTA3MjAxMmUtMzA4LwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgZG91YmxlIGQgPSBEb3VibGUucGFyc2VEb3VibGUoXCIyLjIyNTA3Mzg1ODUwNzIwMTJlLTMwOFwiKTsKCiAgICAgICAgLy8gdW5yZWFjaGFibGUgY29kZQogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihcIlZhbHVlOiBcIiArIGQpOwogICAgfQp9CgkJCQkiOwoJCQkJYnJlYWs7CgkJCX0KCQkJY2FzZSAnY3NoYXJwJyA6IHsKCQkJCSRzeW50YXhfY29udGVudCA9ICIKcHVibGljIHZvaWQgSGVsbG9Xb3JsZCgpIHsKICAgLy9TYXkgSGVsbG8hCiAgIENvbnNvbGUuV3JpdGVMaW5lKFwiSGVsbG8gV29ybGRcIik7Cn0JCQkJCgkJCQkiOwoJCQkJYnJlYWs7CgkJCX0KCQkJY2FzZSAnY19jcHAnIDogewoJCQkJJHN5bnRheF9jb250ZW50ID0gIgovLyBjb21wb3VuZCBhc3NpZ25tZW50IG9wZXJhdG9ycwoKI2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IG1haW4gKCkKewogICAgaW50IGEsIGI9MzsgLyogZm9vYmFyICovCiAgICBhID0gYjsKICAgIGErPTI7IC8vIGVxdWl2YWxlbnQgdG8gYT1hKzIKICAgIGNvdXQgPDwgYTsKICAgIHJldHVybiAwOwp9CQkJCQoJCQkJIjsKCQkJCWJyZWFrOwoJCQl9CgkJCWNhc2UgJ2Nsb2p1cmUnIDogewoJCQkJJHN5bnRheF9jb250ZW50ID0gIgooZGVmbiBwYXJ0aW5nCiAgXCJyZXR1cm5zIGEgU3RyaW5nIHBhcnRpbmcgaW4gYSBnaXZlbiBsYW5ndWFnZVwiCiAgKFtdIChwYXJ0aW5nIFwiV29ybGRcIikpCiAgKFtuYW1lXSAocGFydGluZyBuYW1lIFwiZW5cIikpCiAgKFtuYW1lIGxhbmd1YWdlXQogICAgOyBjb25kcCBpcyBzaW1pbGFyIHRvIGEgY2FzZSBzdGF0ZW1lbnQgaW4gb3RoZXIgbGFuZ3VhZ2VzLgogICAgOyBJdCBpcyBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgbGF0ZXIuCiAgICA7IEl0IGlzIHVzZWQgaGVyZSB0byB0YWtlIGRpZmZlcmVudCBhY3Rpb25zIGJhc2VkIG9uIHdoZXRoZXIgdGhlCiAgICA7IHBhcmFtZXRlciBcImxhbmd1YWdlXCIgaXMgc2V0IHRvIFwiZW5cIiwgXCJlc1wiIG9yIHNvbWV0aGluZyBlbHNlLgogICAgKGNvbmRwID0gbGFuZ3VhZ2UKICAgICAgXCJlblwiIChzdHIgXCJHb29kYnllLCBcIiBuYW1lKQogICAgICBcImVzXCIgKHN0ciBcIkFkaW9zLCBcIiBuYW1lKQogICAgICAodGhyb3cgKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4KICAgICAgICAoc3RyIFwidW5zdXBwb3J0ZWQgbGFuZ3VhZ2UgXCIgbGFuZ3VhZ2UpKSkpKSkKCihwcmludGxuIChwYXJ0aW5nKSkgOyAtPiBHb29kYnllLCBXb3JsZAoocHJpbnRsbiAocGFydGluZyBcIk1hcmtcIikpIDsgLT4gR29vZGJ5ZSwgTWFyawoocHJpbnRsbiAocGFydGluZyBcIk1hcmtcIiBcImVzXCIpKSA7IC0+IEFkaW9zLCBNYXJrCihwcmludGxuIChwYXJ0aW5nIFwiTWFya1wiLCBcInh5XCIpKSA7IC0+IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb246IHVuc3VwcG9ydGVkIGxhbmd1YWdlIHh5CQkJCQoJCQkJIjsKCQkJCWJyZWFrOwoJCQl9CgkJCWNhc2UgJ29jYW1sJyA6IHsKCQkJCSRzeW50YXhfY29udGVudCA9ICIKKCoKICogRXhhbXBsZSBvZiBlYXJseSByZXR1cm4gaW1wbGVtZW50YXRpb24gdGFrZW4gZnJvbQogKiBodHRwOi8vb2NhbWwuamFuZXN0cmVldC5jb20vP3E9bm9kZS85MQogKikKCmxldCB3aXRoX3JldHVybiAodHlwZSB0KSAoZiA6IF8gLT4gdCkgPQogIGxldCBtb2R1bGUgTSA9CiAgICAgc3RydWN0IGV4Y2VwdGlvbiBSZXR1cm4gb2YgdCBlbmQKICBpbgogIGxldCByZXR1cm4gPSB7IHJldHVybiA9IChmdW4geCAtPiByYWlzZSAoTS5SZXR1cm4geCkpOyB9IGluCiAgdHJ5IGYgcmV0dXJuIHdpdGggTS5SZXR1cm4geCAtPiB4CgoKKCogRnVuY3Rpb24gdGhhdCB1c2VzIHRoZSAnZWFybHkgcmV0dXJuJyBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5IGB3aXRoX3JldHVybmAgKikKbGV0IHN1bV91bnRpbF9maXJzdF9uZWdhdGl2ZSBsaXN0ID0KICB3aXRoX3JldHVybiAoZnVuIHIgLT4KICAgIExpc3QuZm9sZCBsaXN0IH5pbml0OjAgfmY6KGZ1biBhY2MgeCAtPgogICAgICBpZiB4ID49IDAgdGhlbiBhY2MgKyB4IGVsc2Ugci5yZXR1cm4gYWNjKSkJCQkJCgkJCQkiOwoJCQkJYnJlYWs7CgkJCX0KCQkJY2FzZSAndGV4dGlsZScgOiB7CgkJCQkkc3ludGF4X2NvbnRlbnQgPSAiCmgxLiBUZXh0aWxlIGRvY3VtZW50CgpoMi4gSGVhZGluZyBUd28KCmgzLiBBIHR3by1saW5lCiAgICBoZWFkZXIKCmgyLiBBbm90aGVyIHR3by1saW5lCmhlYWRlcgoKUGFyYWdyYXBoOgpvbmUsIHR3bywKdGhlZSBsaW5lcyEKCnAoY2xhc3NvbmUgdHdvIHRocmVlKS4gVGhpcyBpcyBhIHBhcmFncmFwaCB3aXRoIGNsYXNzZXMKCnAoI2lkKS4gKG9uZSB3aXRoIGFuIGlkKQoKcChvbmUgdHdvIHRocmVlI215X2lkKS4gLi5jbGFzc2VzICsgaWQKCiogVW5vcmRlcmVkIGxpc3QKKiogc3VibGlzdAoqIGJhY2sgYWdhaW4hCioqIHN1Ymxpc3QgYWdhaW4uLgoKIyBvcmRlcmVkCgpiZy4gQmxvY2txdW90ZSEKICAgIFRoaXMgaXMgYSB0d28tbGlzdCBibG9ja3F1b3RlLi4hCQkJCQoJCQkJIjsKCQkJCWJyZWFrOwoJCQl9CgkJCWNhc2UgJ2dyb292eScgOiB7CgkJCQkkc3ludGF4X2NvbnRlbnQgPSAiCgovL2h0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnL0NvbmN1cnJlbmN5K3dpdGgrR3Jvb3Z5CmltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcgoKZGVmIGNvdW50ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigpCgpzeW5jaHJvbml6ZWQgb3V0KG1lc3NhZ2UpIHsKICAgIHByaW50bG4obWVzc2FnZSkKfQoKZGVmIHRoID0gVGhyZWFkLnN0YXJ0IHsKICAgIGZvciggaSBpbiAxLi44ICkgewogICAgICAgIHNsZWVwIDMwCiAgICAgICAgb3V0IFwidGhyZWFkIGxvb3AgXCRpXCIKICAgICAgICBjb3VudGVyLmluY3JlbWVudEFuZEdldCgpCiAgICB9Cn0KCmZvciggaiBpbiAxLi40ICkgewogICAgc2xlZXAgNTAKICAgIG91dCBcIm1haW4gbG9vcCBcJGpcIgogICAgY291bnRlci5pbmNyZW1lbnRBbmRHZXQoKQp9Cgp0aC5qb2luKCkKCmFzc2VydCBjb3VudGVyLmdldCgpID09IDEyCgkJCQkKCQkJCSI7CgkJCQlicmVhazsKCQkJfQoJCQljYXNlICdzY2FsYScgOiB7CgkJCQkkc3ludGF4X2NvbnRlbnQgPSAiCi8vaHR0cDovL3d3dy5zY2FsYS1sYW5nLm9yZy9ub2RlLzIyNwovKiBEZWZpbmVzIGEgbmV3IG1ldGhvZCAnc29ydCcgZm9yIGFycmF5IG9iamVjdHMgKi8Kb2JqZWN0IGltcGxpY2l0cyBleHRlbmRzIEFwcGxpY2F0aW9uIHsKICBpbXBsaWNpdCBkZWYgYXJyYXlXcmFwcGVyW0EgOiBDbGFzc01hbmlmZXN0XSh4OiBBcnJheVtBXSkgPQogICAgbmV3IHsKICAgICAgZGVmIHNvcnQocDogKEEsIEEpID0+IEJvb2xlYW4pID0gewogICAgICAgIHV0aWwuU29ydGluZy5zdGFibGVTb3J0KHgsIHApOyB4CiAgICAgIH0KICAgIH0KICB2YWwgeCA9IEFycmF5KDIsIDMsIDEsIDQpCiAgcHJpbnRsbihcInggPSBcIisgeC5zb3J0KCh4OiBJbnQsIHk6IEludCkgPT4geCA8IHkpKQp9CQkJCQoJCQkJIjsKCQkJCWJyZWFrOwoJCQl9IAoJCX0JCgkJCgkJLyogY3JlYXRlIHRlc3QgdGV4dGFyZWEgKi8KCQkkdGhpcyAtPiBzbWFydHkgLT4gYXNzaWduKCd0ZXN0YXJlYXRleHQnLCAkdGhpcyAtPiBMYW5nKCd0ZXN0YXJlYXRleHQnKSk7CgkJJHRoaXMgLT4gc21hcnR5IC0+IGFzc2lnbigndGVzdGFyZWEnLCAkdGhpcyAtPiBDcmVhdGVUZXh0QXJlYShmYWxzZSwkaWQsJHN5bnRheF9jb250ZW50LCd0ZXN0YXJlYScsJycsJycsJycsJycsJycsJycsJ0FjZUVkaXRvcicsJHRoaXMtPkdldFByZWZlcmVuY2UoCgkJJ21vZGUnLAoJCSd0aGVtZScsCgkJJ2ZvbnRzaXplJywKCQknZnVsbF9saW5lJywKCQknaGlnaGxpZ2h0X2FjdGl2ZScsCgkJJ3Nob3dfaW52aXNpYmxlcycsCgkJJ3BlcnNpc3Rlbl9oc2Nyb2xsJywKCQkna2V5YmluZGluZycsCgkJJ3NvZnRfd3JhcCcsCgkJJ3Nob3dfZ3V0dGVyJywKCQkncHJpbnRfbWFyZ2luJywKCQknc29mdF90YWInLAoJCSdoaWdobGlnaHRfc2VsZWN0ZWQnLAoJCSdlbmFibGVfYmVoYXZpb3JzJwoJCSkpKTsKCQkKCS8qIFByb2Nlc3NUZW1wYWx0ZSAqLwoJZWNobyAkdGhpcyAtPiBQcm9jZXNzVGVtcGxhdGUoJ3NldHRpbmdzLnRwbCcpOwoKPz4J]]></data>
	</file>
	<file>
	  <filename>/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/images/editor.JPG</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[/9j/4AAQSkZJRgABAQEAYABgAAD/4RDgRXhpZgAATU0AKgAAAAgABAE7AAIAAAAHAAAISodpAAQAAAABAAAIUpydAAEAAAAOAAAQyuocAAcAAAgMAAAAPgAAAAAc6gAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVuaXF1MwAAAAWQAwACAAAAFAAAEKCQBAACAAAAFAAAELSSkQACAAAAAzIzAACSkgACAAAAAzIzAADqHAAHAAAIDAAACJQAAAAAHOoAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyMDExOjEyOjAzIDE1OjM4OjUzADIwMTE6MTI6MDMgMTU6Mzg6NTMAAAB1AG4AaQBxAHUAMwAAAP/hCxlodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvADw/eHBhY2tldCBiZWdpbj0n77u/JyBpZD0nVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkJz8+DQo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIj48cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSJ1dWlkOmZhZjViZGQ1LWJhM2QtMTFkYS1hZDMxLWQzM2Q3NTE4MmYxYiIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPjx4bXA6Q3JlYXRlRGF0ZT4yMDExLTEyLTAzVDE1OjM4OjUzLjIyNTwveG1wOkNyZWF0ZURhdGU+PC9yZGY6RGVzY3JpcHRpb24+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPjxkYzpjcmVhdG9yPjxyZGY6U2VxIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+PHJkZjpsaT51bmlxdTM8L3JkZjpsaT48L3JkZjpTZXE+DQoJCQk8L2RjOmNyZWF0b3I+PC9yZGY6RGVzY3JpcHRpb24+PC9yZGY6UkRGPjwveDp4bXBtZXRhPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3hwYWNrZXQgZW5kPSd3Jz8+/9sAQwAHBQUGBQQHBgUGCAcHCAoRCwoJCQoVDxAMERgVGhkYFRgXGx4nIRsdJR0XGCIuIiUoKSssKxogLzMvKjInKisq/9sAQwEHCAgKCQoUCwsUKhwYHCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq/8AAEQgBAwE8AwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A9v1C9+yXdnH5e/7VP5Oc42/u2fPv9zH41YqvqH2v7XZ/ZP8AV+f/AKR0/wBX5bev+1s6c/hmrFMOoUUUUgCiiigDxH9oz/mXP+3r/wBpV5QfC2rDRX1XyIfsscSzPi6i8xEZgqsYt28AkjBK85Fer/tGf8y5/wBvX/tKvO7nxlE/hX+x7S21GMGKFNk+pma3iZCrNJHCU+RmZT/EQAzDHNSw6lC48Ha1aWqXFzBBFGZI4n3XkOYXflVlG/MRPP3wuMHPQ1Jd+BvENleQ2tzYKs0zlFVbiJtuBuy5DEIu0FgzYBUFgcDNLqWtaHqM8ly+h3KXV1OJrqT+0MjkkuIl8v5NxP8AH5mB+dTXnibTZ/EsuqW2lXcUV3HLHdwSXyuXDqVOxhENhGcjIbkenFT/AF/X9fIP6/r+vmV7Pwwy+JLLStcnezW+KCC4tFju0cs21SGWQKVzkEhjggjGaq6PpVpqV1dW1xeTW80cEssHl24kWQxozkMS6lQQvUBuvStK28SaTbavpcy6Temx0v57e3/tBPMaXzN+55PJwR22hRwBz1zFputaDp+s3N5/ZGoyRSRPHFF/aUYZN8bI5ZvI+bhsjAGMc5pajVvy/wCCc7WoumWknhiXUoruY3MFxHDLbtbgIA4cqyybySf3fIKjr1NULloGuZGs45IoCx8tJZA7KOwLBVBPvgfStiy1bRoPDNxptzpd9LcXDpK1xHfoiB0DhMIYScYk5G7nHBFN7C6kFz4a1S00v7fPDCIQiSOq3MTSxq+NrPEG3qDlcFlA+YeorW1DwTHp+m6eX1WB9Rv9myBZ7UwpvzgtIJywGB94oFzxml1XxzPq+g/YrmfWxKYY4mRdXP2RtgAz9nMfcLnG/G7n2qhretaVqCWTabpl5aT2kaRBri+WZWRAcfKIkIOcc5/Cq0v8/wABa2+X46FTXdAu/D181rfS2cjq7pm1vI5xlTg5CMSv0YA+3WjQ9Bu/EF1NBYy2kbwwvMxurlIQVUZOC5AJ4/DqcDJqfxDq+m6vcPcWGlPZ3E88lxcSy3RmLM5ztUBVCoDnAILc8saraJqUWlaiZri3a5gkhlgljSTy2KyIUO1sEAjOQSD9KmO2o35E9t4X1O8u7mC3Fo32UqJZjfwLCC33QJS+wk84AYng+hqxB4G8Q3Fv5yWUar57W22W6hjczKcGLYzht/omNx7A05dc0Roriyl0S5TTXeOSKK31ALKropUs0jRsG3biSAqjIGMDIO3J4i0G60GO81WMXV6upy3cdhBdSQvChEaqrMYWR1xGM4YNgDnJID/r8v8Agi/r+v6+85OPQdSl0S61dLU/YbOVYZ5S6go7dBtJ3fkKzq17zUdPu9HkMlmz6zc3rzz3bMVVIyBhEUHByxYkkcYAHesikr9SnboFFFFMQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH2Xql5f22u6dHCLb7FcSmKUuGMhby3YbeQFA2dTnOegxk1NV1TUrDW7KJBb/Y7iVIgphkZnycMTLwkeMjCncX6DBq3rOiyane28yate2X2Zt6JbrCRu2ldx3xsc4Yjrj2zTLrQhd6gtxJqN95IkSVrMOpid0IKnlSw5CnCsFJHI5OdF0B9fQ1aKKKQBRRRQB4j+0Z/wAy5/29f+0q8iurK2Tw5p9/CJVmmnnhmDuGUlBGwKjAI4kwQSemc84Hrv7Rn/Muf9vX/tKvJLjUIT4YstNtnm3rcS3FyGUKhYhVQDBO7AVjkgY3kD1MsRl0UUUhhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH2Tq73sOvaW0N55drLOYZbcRKfMzE7ZLHJ42jAGO+Segy9S8TRw+M9P0mPUbe3AmCXEDum+YvGxUAH5gAQvI6l1GeorZ1bQbLVruKa8N2Hh5j8i9mhCnBGcI4GcEjPXBxTdStbCa5s574zh7RzLD5c0qhSBgswQ4IAOMtkYJ9TVOUYpOWyHZydl2NGiiimIKKKKAPEf2jP8AmXP+3r/2lXjAjRLEySLmSRsR+wHU/wBPzr2f9oz/AJlz/t6/9pV4pNM0xTcAAihFA6AD/JP41DAtX1vZxW0D2sxkdh86nHy9+cE9iBx6evFN02KCa5ZLkfuzG3zZPycdfwqnUsFxJbMzRbcspU7kDcH6ikBovpkJ8mJW2lUYzSqQRkEcZLBcAnHWoY9NjN9Lby3SoI8YbK/Nn6sB+p/GoU1C4SNI1MexAVCmFCCOvORz07046pdGR3Zo2aTBbdChBI6HBHXmlqBOmnRtFcqThbabDz4OQuD/AAkgdQOOvNZrbQ52Elc8EjBI+lWY9RuYixR1+dizbo1bcSCDnI56nj3qsTkknHPoMUK4zQuLOB1DW77ZPKjdotp2jdgfeJ9SD+PWkvNPjsk3rcRzMr7Wj3Lz9NrE4474NQNf3DBwTH86CNsRIPlHQdOP/rD0pJL6abaZPKYhg27yUyT7nGT+PWjURYNrBPfiPItUaASfKCwB2bj1OcdfWlh0yOf95Hc4g2k7nVUbOQMYLAd/X/Ckh1V1ukmuEVyilV8pEjIyMdQvOB2NQnUJ/O3qUA27QnlJt25zgrjB59qNRkq2EH2ieOS7AWJA4dFDhhxno3Xn35796pyqiysIn3oDw2MZH0qZL+eN5HQQgyABh5CYx9MYFV2O5iTjJOeBinqAlaBS0TTItqGS4mzgshGDkDgh8fmDWfVh72aS2WBvL2KMDESAj8cZ/WgRLLZwxh9twz+U4Wb93jHbK88/jim3trBauY4rkyupwwMe3H6/n/WmyX88uN5jOGDH90g3Ed24+bqeuaZc3Ut0++bYW9VjVc/XAGaWoyWxhhmjufPOwJGHEgBJX5gOBnBznv8ApUiWEBd990yxiISo/lZyucHIzwfzHv3qvb3c1rv8gqN42tuRWyPTkdKeuo3CyO4MZLgKd0KEYHQAEYA9hT1ESJZW7YLXRCyOUiIiznpy3PHUdM9/xkTSCxjYyOItmZX2D5DznjdyPl61Vivp4ARGY/vbhmJTtPqMjjt09KRb24WAQrKRGAw24HRuv8qWoyyumxvYeelyGkwD5YCnqcYPzZHXuAKLzTYrRQTdK+H2OFKEj3ADknp3x2qCS/uJIPKdk27QpIjUMQOgLAZPQd+1El9NKVMgiYht24wpkn3OMn8aeoE01jbR3a263mTv2uWj2hfxJx+eOe+Oaiv7RLOWNY5vNDpuzgcckdiQenY0NqNw1yJyY/MAIyIUGcjByMYPHrUU9xJcOGlK5A2gKoUAewAxS1An08Ql3+0QJIijczOzAIo69CMk8AVJELVVjZ7XzBcSMMbz+7XOMDHfnqc9uKrQXctsrrFsKvgsHjVwcdPvA+tPTUrpHdlkGXYuSUU4Y9xx8p9ximItfZreKZLNoRI8ik+fuIKnJxgdMcc5z36VLNZWapNKqrzD8kQY/I+Mk9c46dfX2rOS+uI4PJWQbMEcqCQD1AOMgH0FObULhpHcmPdImxj5KdPy4pWY9CrVvTI45r5Y5Y0kVlbh2KjIUkcgj0pl3dNdPGSu1Yo1jVc9AB/jk/jTLe4ktZfMhKhsEfMgbg9eCKYjQbTY5bnBMdsFhV5AjgqCTgbSzAHjB+96/SqF1ALe5aNZVlUYIdSCDx7EjP405L64jChWTCggBo1IwTkjBHIzzjtUUsjTSF3CgnsiBR+Q4pajPsPWopF8QaPcrdXKg3BhMCyFY2BikYllH3jlV65AxxjnPFeIDqM3i2LUYJ5JLJdSgsnit72QmIbirJJCBs2udpJY9CvBzXf6noWkarciXVNKsr2RF2q9xbpIVHXALA8U240HSLu9F5daVZT3QAAnkt0ZwBwPmIzUV6TqxUU7GlOag72DSJXa2kglbe1tIYt5OSwwCM++GAPuDV+mQwxW8Qit40ijXoiKFA/AU+tKUHCmoyd2iZyUpNpBRRRWhB4j+0Z/zLn/AG9f+0q8oNnbp4eEzMpkJzkbM/TO7Pb0/DrXq/7Rn/Muf9vX/tKvFftMpgWHf+7U7gMdDz3/ABNSzqw1WnT5ueN7ppepensrUzCK2MqESpGWkYMPmBOeAMYx+PtUEvkRqJbWGdWSTafOCuv8uvsc1E95dSqyyXMzq+CwaQkNjpmhr67eRHe6mZ4/uMZCSv09KRrOtRd3FW+S7+ull9/XuXPssE2pXXnMIo4huwvyjqB2U46+lENlZSXMp84tbjaFYMQdx7fcJPQ9h0qmb67aZZWupjIowrmQ5H0NAvrsStILqYSMMM/mHJHuaasX9Yoc1+Xq3t6+f4eW6LkdjaqWjn85pBc+QGRgBj1wQfyzSrbQTQWYkRxJMhVXQBVGGPJ4+b36YA71T+33gORdT53bv9Yevr9aGvrtkZWupirDDAyHBHvS6DWIw605dPRd0+/ZW+dx7MH0yMuifLKVyqhSRgdSBz+NWDp0LTGNfMQfaViEjHIwwJ9OvH69Kpm9ujB5JuZjFjGzzDtx6YpGu7l4hE9xK0YAAQuSMDoMU+pmq1H7Sb0X4J+e22vkTX0NpGENpNubJDoSxx6HJRferXhW0S+8XaVbypHJG93H5iSYwyhgWGD1yARtGSTwASQKz5ru4uQBcTyyhem9y2Pzp1heSadqVtfQBTLbTJMgcZBZSCM+3FI5cRKNSTcFZelv1Y28mNxezzMqKZJGYrHGI1GT2VQAo9gABUNS3My3F1LMkMcCyOWEUZYqmT0G4k4HuSfeoqS2Ik7tsKKKKZIUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB9b+KbvRLDxNot1qd7aW13HOdpuLgKUjMUgJAY4ALYBIHOAM8CszW5gfHCHUF0yWOM24sba9XfJNvfDvBlgFZTyTtYnAHyjBPa3N5awXsNtNcwxz3GfJieQBpNoydo6nA64qpJrukRakNOl1WyS+JCi1a4QSknkDZnPOfStE9gf6F+iiikAUUUUAeI/tGf8y5/29f+0q8afNvYLH0e4w7f7o6D8Tk/lXsv7Rn/ADLn/b1/7SrxJmZzl2LHAGSc9OBUMC5fXdtcW0CQW4jeMYZgDz345OOSf88CGwhE97HGYmlHJKJ1IAz6jP0zVeikBumytPtm37JIGEAcQCNizNuwcpvz07bvf2qJIYxc3kUOnNKwRWSKZHDjkZwA2cc565xWPUsFtPdSFLaGSZ1RnKxqWIVRljx2ABJPYClYYk6NHO6OqoysQVU5A9s5NX44jNpKGGxidlLh5ssCmACCTuwO/WqVpZ3N/dR2tjby3NxIcJFChd2PsByaiIIOCMEU+gjTltEWzZvsjLGsSut183zsccencjAGRj2NUrIRm+hWdA8bMFYEkDnjtzRd2d1YXBt762mtpgATHNGUYAjIODzyCD+NQUB0NaayW1WKOKBbud5G4UNkbR8y4DevfrxSy2TrqV3vs5JnBLRROH+cbsZ9T+dZFFKwzfuIma9uFaw86U28TJHJvZh90EDBBOOffj60yC2d7eC3uLMyB7p0G1mIjBAztwfr1z0NYdFFguKysjFXBVgcEEYINactoi2bH7IyxrErrdfN87HHHp3IwBkY9jWXRTEa+qPdR2NvC9q9vBtXj94F3c8YJx79M1QsmhF0ouY0eNvlO8kBc9+COlV6KLAa9vCF1O2torMSSxYEzRl8g5GTw3GP55osbFB54urSeSZGX90ImZgpzzgMp9Of8ayKKVhm1Dp9tcY2p5IjnZCJQdz9wrDdxxu6elBtYJoIpYtO2wyI5eZWciLBIHfA4A69e2KxamluZJoo432bYxhcIoIH1AyfxoswL0logtGItGWNYlZLr5vnY449O5GAMjHsadewpa+SX0sxbgrFnLhSccryen459+1ZNFMRoatA0VwzfY0tozIwTbkbxnrgk8e44qDT7iO1vEmmiEqrzt9xyO4xyOv6Gq1FCVkDL0Zia8luo4gsEPzKhHHoo6nv159apu7O7O5JZjkk9zRubYU3HaTkrnjP+TTaACiiimAUUUUAFFFFAH194kubW01zTJms7qSZJ98k1tp8sxEflyKAWRD/ABMPlz3zird9befqdjFFBiJpjdXDhMBiigLuP97cUIzzhParV5q1lbavb6dNNi6ucmKMIzdATyQML904zjODjOKil1qwh1VNOklYXDYHETlASCQpcDarHHCkgnjjkVp2B7/Iv0UUUgCiiigDxH9oz/mXP+3r/wBpV4hXt/7Rn/Muf9vX/tKvE1id43kUfKmNxz0z0qHuAyinvDJGqs6kBhkfmR/MH8qZQB03g5tKlGqWWuvBDbS2wl85kj80GNgxSJ3UlWZdwGOpx1rfVLO58S3NjpsmgyaZb6abY3FyLKEzOYXKOC+Dv8xgCy88Dca86opPUFoejeC44dOvNLXd4eAg1A/2rLfXNszqqldpidmzgDJBiPLZySMVU+0XF14NXTo73w/CtnPdrctcJamQLhCpjbaZHLEMA0eT0yQACOEooeoLT+vX/M9B1kpd6LdWch0IrZaPZvDNFcWxneZfLVx5gbe5CiQFASBtXjJBPN69/wAgnQ/+QN/x6H/kHf637x/4+P8App/TFYVFAL/gfkbXhFLRvE1sb9ohEiu4WYxBJHCEqhMoMa5OBlgQM8g9K63WLXTpdWuobAaHDJf6VG6KbuzdI7lJVLDzFCxxtsDZwEVvfOT5xRTetv6/r/gAtHf+v6/zPSjdNZ6xrdnptz4beW80+1eJ9ll9mklXyvMAMihE5Eh2HbyM4ziqmkRQQ4jhk8NXf/EwkGqTXRt0V4flx5Ik2sEwZMGIBsj/AHa4EKzAkKSFGSQOlJQKx0rx/ZvA93NFb6Z9jvNQ8u2luIyb3CAE7GHATDKG9zXNUUUrFN3CiiimIKKKKACiiigAopxQhA+RgkjqM/l1ptABRRRQAUUUUAFFFSJC8kcjoARGMt8wBAzjp360gI6KfDC88yxRAF2OACQMn6mmUAFFFLTA+w/EUt6up6cbPSLu+S3n86R4HhUAeW6Y+eRTnLA9MY79qo3mm3Enijz/AOzbqXdNC6XCXIW3RV27vMj8wbnGGwdjY+TnjjavtWjtNZtLFra5c3ZKiZUHloQpYBmJHJCtwMnjnGRUFzr0Ntqgs2tbl0DJHLdIF8qF34RWy27JyOikDcMkVougP9DUooopAFFFFAHiP7Rn/Muf9vX/ALSrxmdljtoreNg3HmSEHI3HoPwH6k17N+0Z/wAy5/29f+0q8QqGBbutSuLyCKGdsrF93knt7nn/AOv6cU3T5Jor6NrZZHfP3Y87mHcDHtmq1FIDZlmNpdPZ/aGgMEflxSvu+Ukgt0BIz0yP60w3ccjOhvvLYNG/nAN8zKCGIwM556nGcc1HpWh3etQ3Z04Cae2RHFqiO0swZ1T5AqkEgsuQSOvGaIPDut3V7cWdro9/NdW3+vgjtXZ4v95QMr+NKwXKt86SahO8TiRHkZlYAjIJz3q3BdbLJEjvvsyqjCSHYSZCc84xg8YHJGMVFp+i6rq6zNpWmXl8sABlNtA0gjBzjdtBx0PX0qzH4Y1O5s7SbT4Hv5Lkyj7NawyPLEYyu7eu3/aU5GRzzg8U7aWAdJdW76V5C3KAqqGNW8wsrDr/ALI79PzpmpXa3UU+69WfEqmJSG+7g5xkcdR+VRr4e1p9OF+mj37WbI0guRbOYyi9W3YxgdzSXvh7WtNhMuo6Rf2kYkEW+e2dBvIyFyR1I5x6UW1C5WsHWO9jdpFiC5IZ1JAOOOnPXuOlap1SM3m8zRl/ICCUmXap3Z4P3+nf8OlVbjw3rlpcGC70bUIJhC05jltXVhGvV8EZ2juelOi8L6/cTiCDQ9SllMSzCNLSQsY2OFfAH3T2PQ0WuGw5dQb7Vdbb1LczIuJITIELAjn+9nGecVmT7TO5SRpRuPzsMFver9n4d1e+1OWwg028a4tz/pEYtpGa3GcEuqqWAHfikvNCv7TUNRtUge6/s12W5mt0Zo0AbbuJxwpPcgUtBktvJcR6SLo+ev2fckL87SH44Ptz+gpr3i/ZWC3YMflqI7YBgUcY56YBzk5ByfxrKq2dOmXSxflk8ouEC5O7vz0x/CapRbvYEXLm4ikjlMWoANJcrMikOPL65OcdeRnHp3qDVrtrifi7W4iyWUKpGz8wOv696luvDt9ZWMNxcKUecgRwGGXeSegzs259s5p134av7Oe2t2Uvc3JwkCxSBumTyUAOO+Ca0+r1E7W2DXcp2EwieXEwt5GTCTHPynIz0BIyM8irwvrVxLFdytKmUbK7gJHxhm7c85yeuPequq6VLpFysFxIrSEZIEciYGcfxqufqMioINPvLpFe2tJ5leQRK0cZYFyMhRgdcdutQ4O9hN8u5rLqm+QbtQKxm5JdW3nMeMc8c5A6e9YTAKxAYMAeo6GrsOi6rcbvs+mXku2QxNsgZsOBkrwOoHbrTf7PzpBv1uYWCSrE8AD70LBiCcrtwdh6E0uVonnj3JvMVrK2DainmQyblB8zKA7eB8vGMHpV641GC4cie98yPfuwA2f9Zn0/unA+hrLi02aXSLnUtyJBbypEdxOXd9xAXj0Vic46e4p91pbWmk2N9JdQMb1WdLdd/mKquybmyu3BKnGGJ9hUtaldC9LdR3FzbtHOj3O10DRrKxUn7pywLH8OmeBUkt41rdRx3M+ZhbBRJKJF2tvJPTDDIxz1PGetVJ/Dt6t3ZWdljUby8t0uFtbOOR5EDIHAI2jJ2nPy5A9aiHh7WjfQWQ0e/N1cR+bDB9mfzJU5+ZVxkjg8j0NFh36le/m8+9eTMTZxlot208dfm5z9avaVd28FsY5ZkjDsfMV/MORjAwF4PfO6obbw/rN5qE1haaTfT3lvnzraK2dpI8HB3KBkc+tTWXhPxBqWnSX2naLfXVtFJ5TyQ27PtbBJGAM8Y59OM9RRbQOoR3a/Y4rZ9QXyhDIrIQ5GTnb/AA/Q+2KVruN7G4j+2r5bwqIrfa3yMCCe2B0PIPOeax6vzaHq1vFcS3Gl3sUdts893t3URb8bNxI+XdkYz1zxTtcVyCwdI9Rt5JnCIkgZiQTwDntWiLyITxGe8E7K7MkgDqIxjgHgEDOOF6Y4qG58O6vp6rJqum3mnweasTT3VtIiIxGQCdvXHOBzjtRf6MNP1qOwn1G0MciRyC8QSmLZIgcNjZvxhhkbc+1G4E013C175sV3GkrwBfPUSfI+eeSC3I4zyaz72QzXO5rj7Q20AybSM8fmfqea0IvDksni1vD8t9aQXAuDbCeTzDEzhtoA2oW5PQlR15xWQylHKnqDikrDPsTX4NXm1GxfS7WymjtpfOY3F28RJ2Om0BY24+fOc9sY71R1jw2+r67BO9rCkCvFJJOt9MGYxtuAMAAjY543MSQD04FbuoXv2S7s4/L3/ap/JznG392z59/uY/GrFbdhP9AooopAFFFFAHiP7Rn/ADLn/b1/7SrxCvb/ANoz/mXP+3r/ANpV5QfC2rDRX1XyIfsscSzPi6i8xEZgqsYt28AkjBK85FQw62Meity48Ha1aWqXFzBBFGZI4n3XkOYXflVlG/MRPP3wuMHPQ1Jd+BvENleQ2tzYKs0zlFVbiJtuBuy5DEIu0FgzYBUFgcDNAC+FdV03TYNYi1S4v7cahZfZEexiVyoLqzE7nXjCY29wx5Hfd03xhodpeDzRdFLdLWOG7l06C5lljiDblKSOVjJJGGG4qFA574Fn4YZfEllpWuTvZrfFBBcWix3aOWbapDLIFK5yCQxwQRjNVdH0q01K6ura4vJreaOCWWDy7cSLIY0ZyGJdSoIXqA3XpRzW+X6f0w5b3/rf/hjdbxBot1cyeZf6zYxw6pLf20tnbp5knmbfvfvR5brt4YFuvTjlbbxJoX/CEz6LOL6G4meWYXS20czoS6ERby6kowTLMApzjggEHjK1F0y0k8MS6lFdzG5guI4ZbdrcBAHDlWWTeST+75BUdepqUklYe7uddfXmny+DtW1FtQkW41a2tYRYmeBhGYnToiymTACNt3IgUHGTkZo3XijTrfVdFu9M1HVrmKwSCGS2uLdYV2R4OVxK/O4bgMAA85rBufDWqWml/b54YRCESR1W5iaWNXxtZ4g29QcrgsoHzD1Fa2oeCY9P03Ty+qwPqN/s2QLPamFN+cFpBOWAwPvFAueM1XX5kK34f1+g+317RtPFpaQ3WpXtoJLl5557ZI5I/Oh8o7E81gTzuOWGcAcYzUr674cgsjBp91q6ldHk09We0jBd2mMm44l+VW3EEc4H96ue13QLvw9fNa30tnI6u6ZtbyOcZU4OQjEr9GAPt1o0PQbvxBdTQWMtpG8MLzMbq5SEFVGTguQCePw6nAyaSs1/Xa35FPRq/T/O/wCZ0l14h0G8YwHUdZt4Va0mW4is4/NeSGHyjlfOAHQMrbiQWYY71T1PX9KvdZ8T3kV1rMKaoWkto4isauzPuKTruO5Rk4weSAcDpWZbeF9TvLu5gtxaN9lKiWY38Cwgt90CUvsJPOAGJ4PoasQeBvENxb+cllGq+e1ttluoY3MynBi2M4bf6JjcewND11f9bL/IFpp/Xf8AzOfrpLnxGJPCEGmo+JMKjqJJeFBb1baeNvHTnpwMZkeg6lLol1q6Wp+w2cqwzyl1BR26DaTu/IVnVrCrKClFddH+Y02tTU1CXTbg2vkXF2fLRIn32yjCjqwxIcn24+tSXN1pkmuxXkc92Yt4eQNbqGXGMADfznHqMe9Y9FUqzUuZJXvfruJ6qxa1BrZ715LOSWSNyWJljCEEk8YDN+eataXdaellcWupm5WOSWKYNborElA428kYyH684x0NZdFZRfK7oU1zrU6aXV9Lf+2DFfalbtqFyJl2Wy/dBZgrHzR3b3+6D7CjDcaY2hXMN1d3v2y4lWY4tlZdyhwAWMgJzvyTjj0NY9FPm8jJUUlZPt26fI3o7uGb4fT2PmIk9tqK3IRnAMqPGUOB32lV6f38+tM1dVfw3oM0c0DhLeSF0WdDIjefI3zIDuAwwIJGDmsSioau7/1tY2W1jrbiextPFOhalfXWbOO0s5CbIxzyBo4kBUpvG07lIwxB74NI+v6fLqGqw3GravPY6jGc3MlspmjcyK7DyzNgg7ACd4zwccYPJ0Uf194f8D8DsLnxBpGo28+n3N5qdvaqLXyruO1SSabyY2T94hlUD72Vwx2gY560yTX9E1a41VdZ/tCG3ur+O8Q20aPJIFV1KsWYBWYOCX+bnPymuSoo/r+vuQG4ngzxNcxrPZ+GdZe3lG+JlspHDKeQdwXB47jrWpNq+gvpN7HcnVIdTn06CxaP7NGYomhMfUlwx3eUOw25PDVx9FAHU6/q+l6gunw2Or6w1tDbw2k0U1oqKsaYyyqJyGO75tpwM96g11tK1jULJdCu7qSUww2zC/hitUHlxqgbf5rAZ255wB6mudoosG33WOwQxXXxhaeK6tBbpq/nm4kuo0i2LLuLB2YKeBxg89s1yrokksjGZF+Y4znn8hUNFEdAfXzPtXUPtf2uz+yf6vz/APSOn+r8tvX/AGtnTn8M1YrH8SXuqafi4sJLFYlAHlXCs0lzISAsSYICE9Afm5PTjmG61a/j1WUxC3Fha3ENtMjIxlkaTb8ytuAUL5i8ENnB6cVqtQZvUUUUgCiiigDxH9oz/mXP+3r/ANpV53c+Mon8K/2PaW2oxgxQpsn1MzW8TIVZpI4SnyMzKf4iAGYY5r0T9oz/AJlz/t6/9pV5FdWVsnhzT7+ESrNNPPDMHcMpKCNgVGARxJggk9M55wJdxaF/Uta0PUZ5Ll9DuUurqcTXUn9oZHJJcRL5fybif4/MwPzqa88TabP4ll1S20q7iiu45Y7uCS+Vy4dSp2MIhsIzkZDcj04rmKKnYZ09t4k0m21fS5l0m9Njpfz29v8A2gnmNL5m/c8nk4I7bQo4A565i03WtB0/Wbm8/sjUZIpInjii/tKMMm+Nkcs3kfNw2RgDGOc1ztFFgJbloGuZGs45IoCx8tJZA7KOwLBVBPvgfStiy1bRoPDNxptzpd9LcXDpK1xHfoiB0DhMIYScYk5G7nHBFYVFHSweZ1uq+OZ9X0H7Fcz62JTDHEyLq5+yNsAGfs5j7hc4343c+1UNb1rStQSybTdMvLSe0jSINcXyzKyIDj5REhBzjnP4Vg0U763+YW0sbXiHV9N1e4e4sNKezuJ55Li4llujMWZznaoCqFQHOAQW55Y1W0TUotK1EzXFu1zBJDLBLGknlsVkQodrYIBGcgkH6VnUUlpsD1OiXXNEaK4spdEuU013jkiit9QCyq6KVLNI0bBt24kgKoyBjAyDtyeItButBjvNVjF1erqct3HYQXUkLwoRGqqzGFkdcRjOGDYA5ySBwVFPrcVjXvNR0+70eQyWbPrNzevPPdsxVUjIGERQcHLFiSRxgAd6yKKKSVth3uFFFFMAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPsbVvDv9oa7FqaatfWk0EflxpCIWRM9WAkjbDEHBIwccU+bQ0m1MXZvLlIy6SyWqiPy5XTG12ym7I2r0YD5RxVfxRLewzQmw1VraeT5LazjgRzcy9fnLAnYB127cDJLdMSu97F4ugja83Wc9rKy2wiUBWQx/MW+8T857gYxxnk2gZr0UUUAFFFFAHiP7Rn/Muf9vX/ALSryS41CE+GLLTbZ5t63EtxchlCoWIVUAwTuwFY5IGN5A9T63+0Z/zLn/b1/wC0q8YEaJYmSRcySNiP2A6n+n51DAr0VevrezitoHtZjI7D51OPl784J7EDj09eKgtLdbmVoy7KQjMu1c7iBnHUUgIKK0l05Ibq2iu3ZZJWwybAwHOByGGQfUYqOwtBdi4iCAsqhg+cbAGGT1xjBPX0ougKNFW1htmiujFI7mNQULx4yMgZ4bg8+9VKACir/wDZ8X9nG5+1AsqhiihTjJxj72R+IA96S5trOK5jjS4mw20sXiHyggHPDc9en60XAo0VcltkswHkzIwlZPKkXAYDvkNn/PWpRp8c2o3aB1ghhY9x0zgAbmA/M0XAzqKmuoBb3LRrKsqjBDqQQePYkZ/GrVppiXFsJZblId7FVDMgHHc5YHHPYGi/UDPorQi06KTT2uzcMFjBEgEYO1sjaB83Oc9e1RzW1ssMHkzStLKgO1owFzuI67uOnpRcCnRWheabFaKCbpXw+xwpQke4Ack9O+O1OOnWovRbi9YkZ3HyemBn159/0zRdDsZtFX49PjlnUJMxhaLzPMKKpAzjkFgByPWhLZIL+a1lRJgEYq+TxhSwIwcenqKLiKFFFWVEbaZI3lKJEkUCQE5IIbg847DtQBWoqzJFCLKCRGJLOyuSmCMAdPmwRz6CpriygtnzFMZxHKqSK8ewHIJ7H2PpQBQorSu9OigvxA8vks8h+UgYRMnHJbrjHBx15NV7+0SzljWObzQ6bs4HHJHYkHp2NCaYFWirumwWs8rreTeSoU7WOMZPA7juQf58c1HBFF5sskgLQxAnBP3j0Ucf07A0XArUUUUwCiiigAooooA+ytT8N6dqOrf2hcC6S6EQh823vZoDsznb+7cDGTmln0CxudVj1GVrz7TFjYUvpkQDjjYHC4O0ZGMHHOaoeKI1udRhtbW9vl1N0/0eG1nZEh55nkC4BUej5BxgDJOW38a3PimGOxvb572J43mWOdhBbRDkq6DCkuMgBgW5yMBeLXQGdHRRRQAUUUUAeI/tGf8AMuf9vX/tKvFJpmmKbgAEUIoHQAf5J/Gva/2jP+Zc/wC3r/2lXjJVYbAblBknOVJH3UHcfU/y96hgVqkgmkt5llhba6HIOM4q1fNYNbQfY1YSgYkycj19BnrjPt+JisLeO5utkz7ECsxPPOBnsD/I0gBL+4SZJQ6s6KFUuitgA5HUfrSpqNzFK0kTRo7EElYlHQ5HGP8A9dWUs7Ga8MUErOjRFg4Y4jYf3iVGV98DrStb2UM16j29wwhA25lAP3gM/d7549qWgyrHqE8W/YIR5h+YGBDn25HTgcVWJyc1pxWNmsG++le3ZpGUKxbKYx1AQ5PPT5agjishYCWYT+YXKZRht6Zzgj36d/UUaARyX1xLB5Tsm3aFJEahiB0BYDJ6Dv2oa9lkjWKZt0QK7goCswHAy2MnjpnNTzWtr9nPkLMJVhSUl3BU5IGMYHr1p19ZQ2sCywPudJPLkUneNwGe6gfhz9aegiC5vvNuY5Yk2iOMIqy7ZOn1XB/KkbUbhpzMTHvYYb9ymGGc8jGDz60X5BuVYKq7okYhFCjJUE8Dik05tuowAqjB3VSHQMCCRngil0BkMsjTSF3CgnsiBR+Q4qSG8mgjMaeWyZziSJXAPtuBxUlmsTTypIrEmNypBGAQpPIIOentUtnbWs1vF5wm82WbygVcBRwOcY9+maB9SJNSuo4ljR0CKjIB5Snhuvb2pgvZxbeQHATG3hRuxnON2M4z2zVuK3ifSFuJ1ysTMpEZCu2duMnB4GTyfUCmmztBpjyB5PtCIrlSSMZIHIK9ORyGP0o0AryX00pUyCJiG3bjCmSfc4yfxpTqNw1yJyYvMAIyIUGc9cjGDTLOOOW8ijn3bHYKdrYPPvg1auLGKxhja5Vnd3PCSADaByOV4IPFPQRANQuFCAGPCJsAMKEYznBGOeeeaX+07r7Q85MRkcYZmhQ8Yx3HpUyAQ+IPLVUZDPsIeNSCN2OmMfkKhsm/0iSMojK0cmdyA4wpIxkcfhSGVncyOXYAEnJ2qAPyHAqZL2aO2MCiLyz1zChJ69yM9zVetIxW81lAGRlnMDsGTaF+UseRjJPGM59OtNiKxvpjbrARF5a9B5CZ7c5xnsKV9RuH3bzGd7h2/cpyR07f5yfWrD2NvHYeaWYyxhGkQPnhu33cA49z9KeNPtWmVP3qLPIogYuD8pAJJAXk8gfU+1K6AqnU7ppEdnQsm4AmJTw2cg8cjk8H1qGe4kuHDSlcgbQFUKAPYAYqa+is4whs5t5OQ65LY9Dkov8ALtUVtOtvIztEkuUZQHAIBIwD+HWmhkNSec32YQAALu3kjqTjAz9OfzNW4DFfa0reSkcbNu8pRxgDOPxx+tPtrWyktRPez+UZHYDbkBcY7BDnr0yKLiM2itOGxtn0xrllmLIrZUOBvIIwyjb90Z5pk0Fu1vAILeZZGiDvIZNyqNxBJG3+tFwM+itK+tbC2O2KZnkjk2vHuOWHc8oAp/Pr7U42unjUfs4Fzhd247l5wM8ce34+1K47GXRWjHaWryrIS6W5h8xt8nK/MV6hTnkf3e9Vr63W1vZIUYsqngnrgjNO4j7H1Pw/o2qXfn6npNjeTKoUSXFskjAemSCccmmS+HtFm1AX82kWEl4GDC4e2QyBhjB3YzkYGPpXP+Nrvw8+swadqcllHqMkQZLi8nWMWce7mRCx4kyONvJIGSAM0mvtpTeLLB457Y6pHcwgwOrG5ZCRgwknCpgsX2qQwDAkEGtF09QfX0OyooooAKKKKAPEf2jP+Zc/7ev/AGlXickrysDIckKFHsAMCvbP2jP+Zc/7ev8A2lXKan4PtI/h29/b6Vc/arW3t7hr+K2lEMwkxuAkaVlcDdztjQKR1PeJaagt7HndOR3jcPGxRlOQynBBrf0vw20Ot6APEcbW2m6q6ukiyITJFu2k/e+XnjnGOtdc3hexl8WaJa23grU8zvItzaXlnPZRSxgD51YzyNlckn5sH5Rj1LCuecNfXbszPdTMWXYxMhOV9PpSfbbrz/O+0zebjbv8w7sema9FfQ7LTPFMFnaeGbbULW60Z5LGWdLgHUX8ksJFTzMqxYY2DkdRyQai0Pw1ZPPqZ1jw1PJqEckJGkWFvLdG3idCSxRblJFOQAdzHaTggZGC39fO39fiN6Hn8V5dQFjDczRlzltjkbj70C8uhB5AuZRERjy952/lXdaZoEH2DXrmHwTf6rFZXoS2+0JcRyIvzbklEbY+QAEgYIJBJx8tPtvDtvqHh+wS08ITebe6feXK3qNcPIDFuMeBnYc4RSduDvGApxmelx9Tgje3TKVa5mKsuwgyHBX0+nNK1/eOFD3U7BSCoMhOCOld5qXg+0T4dvf2+lXP2q2gt5zfxW0ohmEmNwEjSsrgbudsaBSMZPfM8Zab4jGiaFfa/ZaoClo0MlxexSfKfPlKoWYcHbjA9Mdqb0dhLVXOUmu7i5AFxcSyhenmOWx+dNhnmt3L28rxMRjcjFTj8K1PCunrqnia0tXsZtQQlne2gGXkVVLEAblLcDO0MCegIJFd1P4d0r+1rq2sfB7z3KaMt3HYSm4gl87z9nMXmsy5U52b2JAUqV3U7WsFzzVdQvFkaRbucO+NzCQ5bHTJzQL+7ByLqcHcX4kP3j3+tekaN4Q0241qcXWgzO+y1WbS4oJ55LKSTcWJAmjKIAoO6Rm27wCDyaj03whBGY9PufCc9282uS6d9sk+0LIkQGdwCsE3AZbJXGFOQey2/rzS/UL3/ryv+h50L26UELczDII4kPQnJ/Oke7uZIBDJcStEuMIzkqMdOKZLFJbzPDPG0UsbFXR1IZWBwQQehrcuXeL4e6fFHOzRT6jcSSxoxChlSIKGHdgCSDggB+udwAPrYwQSpBBII5BFSC6uFkEizyBwSQwc5BPU596iopiLH9oXnm+b9rn8zG3f5hzj0zmhdQvFkaRbucO+NzCQ5bHTJzVeikA53eRy8jF2Y5LMckmpVvbpAoS5mUKpVcSEYHoPbioKKAJ/tl0YPJNzN5WMbPMO3Hpioi7kLlmOzheenOeKbRQBNPdXFzt+0zyzbenmOWx+dQ0UUAPhlaCdJYzhkYMM1JFeXEBb7NNJAHOSsTlR/OoKKAJ1vbpFVVuZlCgqAJDwD1FM+0TeR5HnSeTnPl7jtz9KjooAnN9dsqK11MVjIKAyHCkdMelKb+8aVZGu5zIowHMhyB9c1XooAnF9dqyFbqYFBtQiQ/KPQegpks0sz75pHkbGNzsSajopgfat/qlhp9zDFf31tbSXDbYUmmVDKeOFBPJ5HT1FPkuYIZooppo45JyViRnAMhAyQo78Anj0rnfFd5EdT/s19NuTFdQBbu+j0+WceTk/ulMaH5jz1wFznk8VX1ldTj8baVcGzW4tTcKkUiGVmgQxsHLBYiq5Zl5LjO1emGIta2B9Tr6KKKACiiigDxH9oz/mXP8At6/9pV4hXt/7Rn/Muf8Ab1/7SrxCoe4BRRRQAUV1ngYb11tUg0qSZbASQNqiRGOOQSxqDukG1ThmABIUkjdkVrEQLLctpUXh061tt/tIuHtDaj5WMnk+YfJyT5e7b0JO3AzRb+v6/EV/6/r8Dz2pVtp2tXuVhkMCOEeUKdqsQSAT0BIBwPY16Z4dOg2up38otdDn099QZS1zd22YY1UZIinVneLLHb5TK52kE5xXM2tjLfeAbnc2io63KTW4a5tIrnYBL5g5YSkZ2YU9eNopX/QpHKVLLbTwRxPPDJGkyb4mdSBIuSMrnqMgjI7g12Gr3c+q+DdPcXehR29vYrHInk2yXRlWZ8IoVPNHylWzwh5JOScy32n25vPDd1rL6GYVCw362N1aAE+c+C6QNnGzZlgOnfNPrbzJ6XOFq/pus3mlQ3cVn9n2XkYimE1rFNuUHOBvU7eQDxjkA9hXd2DR/wBq6e+sQ+FjfbrnKRvY/Z2h8rKCTYfLB8zhTw/XJxissqsniXw1ekeG1nuoA1wk7QizEgdwPOjiOEGzy8jA5980LXQb0VziaKnvP+P+f/U/6xv9R/q+v8P+z6e1d34Ct9Gl0ZotT/s6U3M0kc5vLq0gMCeWNpBlUyNkk/6spgjk9wk7xuD0djg7izubTyvtdvLB50Yli81CvmIejLnqDg8jipP7Ruf7K/s0shtRN54UxqWVyApIbG4AgDIBwcDjgV30KW0fhvRYbyTw9LZxWMy6juuLeS6XMkrIEO4uDhlKiPuTv4qOd9Kt/h6YLm10fzDbW5S4t7q1mmdmdGcBAgnRwpbcXZlG0gDlcPd2Xf8AUSPPoopJpUihRpJHYKiIMliegA7mpb6wvNMvHtNStJ7S5TG+G4jMbrkZGVPI4INdl4igguLK4g2aBGrXkcektYTWyuIjuB81kbcF27CWm+YHHI+anT2Udv4msxd3OjzQXWlLZ7jeW1wiSi0CDJDN5eJAuHOOmQcZqb+RS/r7zg6K9Htpv7I1fTlS58OtcXGiT20rxi0eITjzdqucbFbBjUueG5+Zhk0aG1haz6mL+LRNS1dpIXIiubG3t1jKHcqGaFoSQ20NsGT2JG6qtr/Xe3/B9CbnnFFddHH5Vn4qv7bT9Hhsd4t1ju3+0vCzsxVbaRBtZgFPzdNozXI0rlBRRRTEFFFFABRRRQAUUUUAFFFFABRRRQB9narr2naTdLFfTOjsu87IXkEa5xucqCEXP8TYHB54NI+t2Sav/Zv+kPcjbuEdpK6Ju6bpApVencis/wASy6rNqUdlBpF1daWyBrmW2kg3SnP+qxJIu1SOp5yDgY61DqGn3UniRbiz068hmeSEm+iv8QGNSNwkh3jLY3KPkbqDuHa10BnTUUUUAFFFFAHiP7Rn/Muf9vX/ALSrxCvb/wBoz/mXP+3r/wBpV4hUPcAooooA2fDja5Nevp/h3UJLSW8XY8a3y2qzjoFJZlDH5sBepzwKx2BVip4IODWx4TNpH4osLrUNQgsILWeOdpJ0kYMFdSVAjRjnGeoA4610/hfXbLw2NTtbTV9MFxLNHLHqDtfxRyIA2Y8whJAQSDhl2nn0FHUO/wDX9dDjtL0W81hpvsQgCwKGkkuLmOBFBOB80jKMk9s5qtNazQLuljIQuyLIPmRmXG4Kw4bGR0PcetdxpuvvHZ+IVtfFtrocl7diSKGzN5HEcNlmQLGSqsCAAcHjBAGKp2WvPceB4dLuPFl3p0Vs1wJLJTM/2hGVNiKq/IRuDAhmUDcSM9KXS4dbHG0Vu3d/5ngjT7H+2fO8q6lf+zPsu3yMgfvPN/i3enbFYsTrHKrtGsqqclHzhvY4IP5Gn1sHQfa20t5dJb26hpZDhQWCj8zwKmGl3TXn2VBDJJt3kpOjIoHUlwdoH1NWLfUITqFvJDDbaWYyT50SSSjOONyuzZH0HfoelWZbmzkuHh+02qGa08qS5igaOIvvDA7VQHoAOFHP51vGnDlvfW/ddvv+/QpJGfFpN7LdS26RqHh++WlVVGenzE7ecjHPPakg0q8uVlMUP+qba291U7uflAJG5uDwMmr7z2l0bm1a9ihTEAWd1cq/loVPAUnnORkDpUsV/aT3ZuZLlLfyb97pUZXJlU7TgYUjPy98dar2dPTXv1Xf+vXoFkc/RXXtcXNvoemS3t48Vo1u4a1kikxcDc20A4KnjGMkbRgiobzVIJfDf2NdX33Kwxh3xJ++UFv3ONuBtzncevT6OWHjFO8tV6f5/wBetkzlOWorofFF3K9ro2nvrKamllZJtWOFFS1L/MYg6n94RkZJ6HI7Vz1cpIUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH2ZrWtrpMpL2F7cRInmzTQRqUgQdWYswz3OF3NgdOmVudW8nUksbeyuryUgNKYAgWBScBmLso7HgZOAeKo+ILPXLzWIBZw2U+mRKHeCW7eBpZQcjcVjfKDg7eMnrkcVU1LwvLc+Jv7Tht7WVpWgP2iaVlltPLbLeUAhB3Dg8rnvkcC10BnU0UUUAFFFFAHiP7Rn/ADLn/b1/7SrxCvb/ANoz/mXP+3r/ANpV4hUPcAooooAswafe3VpcXVtaTzW9qAZ5o4iyRAnA3EDC57Zq9b+F9Zm3s+m3kEaWpuzJJaSlfKwSG+VThW2kBj8vqQMmp/CuuWeiXN42o2n2yGa3KpCyK6mVWV49wbgruXB68E8VqjxB4fuvFM+oXBvrCyS0a1tLa2tEl2q8LRtnMq7cM5YYznPak/IF5mHoHhnU/El2sWnW0pi8xY5LowyNDAW6b2RW2g+uKU+E9fGjjVl0e9fTiHP2pIGaMBfvMSBwvueOD6Gt7w/4i0LS7vSpLi91dE0a+e4gFtap/pKMVPz5mHlsdu0435GB2rNF/wCH59G+yXz6kWtLi5ltlhhjUTiRUCb2Lny8FASAHyDgEdaGC8/63KereGNT0iBLqW3kmsJEjaO/ihk8h96BwA7KOcHkeoNZ1xY3dpFBLdWs0Mdwm+F5IyolXONyk9RnuK6m+1/R7m0volvdUcSaRbWNuklqgUPEyMc/vTtXMfBGT+8bjj5sTV760u9P0qK1utTmkt7cpMl7IGjibcTthA6Jjse+aAX6f5GWqs7hUBZmOAB3NaEmizRai9pLPAvlRiWSYsdiKQDnOMnqBwDz0zVaxu2sL2O5SNJGjOQr5x0x2IP5GtW71PTZ9QfyllgtZbRLdykPzKVxyFaQ5Hygfe6e/J3hGDjd73/T/Mat1KaaPIbmaOW5t4Y4duZ3LbG3crjAJORz06dcUQaLPMZFeWGF0lMKpIxzJIOqrgHnpycDkc1Ob6xuHnguHuI7ZhCI3SJWc+Wu0ZUsAMgk9TinxatayXDXF35yPHdtdRLHGGDE4+ViWGPujkZ71fLT0+fXz/y27j0M46Zfi2NybK5EAUOZfKbaFPQ5xjFD6ZfxxNK9jcrGqCRnMTABT0YnHQ+tbZube103TLma6kaaGGQLBE8bqSzMcMA+5MgjPynI4qG61XTZtAGno12XjRCkrRLlnBbKsd33Bn5R2OacqVOKeuq/r+v+CgsjIuLC8tIIJrq0ngiuV3wSSRlVlXplSfvD3FV62fEF3aSpp1rYahfX0VraIrtcyExpIw3OsSkAqgJx7kE9MVjVykhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAfZOv6pfaWWmtdNS5tok8yeR7kRnGfuxrtO9/Y7R0GeeIrvVNVtdVji/sy2azluEgSY3hEr5UFmEYjIwPm6sD8pPpTdc0TU9Q1u3u7bUrWO3tlBS0ubNpk83OfM+WVMkcYzkDGRzzWjNZefqFpcvJ8tsHIjC9XYABs+w3DH+17VaBlqiiigAooooA8R/aM/5lz/t6/8AaVeP3Onxw6HY6hFOzm5lmhkjaPb5bR7DwcncCJF5wOcjHc+wftGf8y5/29f+0q8nurqAeEtPsYp45ZjdTXEyBDmIFUVBuI4J2sSFJBG3PIAEsRkUUUUhhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH2/J/rDTaKKsAooooAKKKKAPEf2jP+Zc/wC3r/2lXiFFFQ9wCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD//2Q==]]></data>
	</file>
	<file>
	  <filename>/images/icon.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhIAAgAOZ/AKyqqZiXlkh1j/Hx8RuL0CV6q4e83D3a/zNVasLi9S22/DaLuy2MwklRVpLG5dXV1Dp2jja2+oWHib7d8Onz+sbFxGqt1DTD/v3+/juRwkiBopXC3MvKykKay2JxeTWUyd/f31Om1ySU2WKNpnm111yEm+Pv9Sus/MTc6neCiPr6+ht5rySKxSSc57za7EOWxSSEvHG656vQ5lyy5BiS3TSb2fX297LT5qDK4jqWysri7yug6VSIprri+k6j1D6azd3s9r27upDN9CuRzfb6/CGh8EiLsS6FtiN/s9bp9FhgZNzu+imEuDlGTiau+mSo0SyJvk6q37azsnSHka+urVGdyO7u7kOczrDW7Cmk8z6AjPn7/CSHwEOk2jBge0ag0s/p+06ezf/79I+QkKvY9FOOsTKSx////ByDwCRqkyV0ojpngPjy7yiJwebm5sG/vkii2T6k4nx9flqw4nfE9rvY6T6Gr87l9KGfnyyOx2+Ej196iaWko0e29////////yH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkRCMzA3NzIxOUE3MTFFMTgyMjFDMzU0MzJGQzVDRTIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkRCMzA3NzMxOUE3MTFFMTgyMjFDMzU0MzJGQzVDRTIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyREIzMDc3MDE5QTcxMUUxODIyMUMzNTQzMkZDNUNFMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyREIzMDc3MTE5QTcxMUUxODIyMUMzNTQzMkZDNUNFMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAH8ALAAAAAAgACAAAAf/gH+Cg4SFhoeIiYqLjI2Oj5CRkpOOVhVUfHxUb26UghgcAVMjpCNTAW82lBUSPCFzMzNzIWUpUiqSDxJGUSE+vz4hUS8pFZE2eBpdVz8fOT9X0V1GY1aLGG4cUtspZjnOBgYdH+TkexwquIcDQWN6JTwlGkMMXBtibFVcDPxDAgFUALwBUcgKgBRGrnxZeOVFmxcDBjxpww8KFAYLNGiINybIAEEqpKTIcKXDi5MdxtU5g2JfPS5tcsh89sNOCgCqQEjQkCODzwwy82ywcaZOHhZmcKAgkecJChkvFuSw+UZFkD0Lsmb1mSeEiRtnsBAY4mKLHx0+KJjwY4HJAjP//9zgEQDlyBEmTLigyXPHAQk/JmrEwOAgiQEsFAxgqILEbgE5HMasYYJkwY0bJCxg8TMhiZ8lNRL4iVIDDhEbOp68wHEESQEPQQJ4YbJigx8gLohwRuyHjBA/GGbEueMnSY4wJjascK0kCBUESFag8CPDwBYHNGiI/gzGDwUiEyhgALJlAxIkTNQo4fBASZoVJDAAlyGiRREhFHpE6NMDDJ0WMdwxwRNowIAEF17I4YYKeDRRAAwW4GBBfVmccEIETiiggBMcnlBECyIQwAIMXKjRwBuCDCCBgwQQQEMLFWqowAU0XiDjCVmAKMIQajQRgDp/2BBAE17AsMMJM15wwDGSTC5JowIn7NCGF03wAeQgHMjRAAJeQOClFmCGCaaXEHiBQAOQeaLmmmy26eabcAYCADs=]]></data>
	</file>
	<file>
	  <filename>/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/js/functions.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[alF1ZXJ5KGZ1bmN0aW9uKCkgewoJalF1ZXJ5KCIucGFnZW1jb250YWluZXIsLnBhZ2VlcnJvcmNvbnRhaW5lciIpLmVhY2goZnVuY3Rpb24oKSB7CgkJdmFyIGMgPSBqUXVlcnkodGhpcyk7CgkJd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCWMuaGlkZSgpOwoJCX0sIDkwMDApOwoJfSk7Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddPSJBY2VFZGl0b3IiOwokbGFuZ1snYWRtaW5kZXNjcmlwdGlvbiddID0gIkFjZUVkaXRvciBpcyBhIFN5bnRheGhpZ2hsaWdodGVyIG1vZHVsZSB1c2luZyA8c3Ryb25nPkFjZTwvc3Ryb25nPiBhIHN0YW5kYWxvbmUgY29kZSBlZGl0b3Igd3JpdHRlbiBpbiBKYXZhU2NyaXB0LiI7CgovKiAtLS0gVGFicyAtLS0gKi8KJGxhbmdbJ3NldHRpbmdzX3RhYiddID0gIlByZWZlcmVuY2VzIjsKJGxhbmdbJ2Zyb250ZW5kc2V0dGluZ3NfdGFiJ10gPSAiRnJvbnRlbmQgUHJlZmVyZW5jZXMiOwokbGFuZ1snZnJvbnRlbmRfaGVhZF9zZXR0aW5ncyddID0gIkZyb250ZW5kIEhlYWQgUHJlZmVyZW5jZXMiOwokbGFuZ1snZnJvbnRlbmRfc3ludGF4YXJlYV9zZXR0aW5ncyddID0gIkZyb250ZW5kIFN5bnRheGFyZWEgUHJlZmVyZW5jZXMiOwokbGFuZ1snaGVhZF9kZXNjcmlwdGlvbiddID0gIlRoZXNlIHByZWZlcmVuY2VzIGFyZSB1c2VkIGZvciBkZWZhdWx0IHNldHRpbmdzIG9mIEFjZSBzY3JpcHRzIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHBhZ2UgPGNvZGU+Jmx0O2hlYWQmZ3Q7PC9jb2RlPiB3aGVuIGNhbGxpbmcgPGNvZGU+e0FjZUVkaXRvciBhY3Rpb249J2hlYWQnfTwvY29kZT4gZnJvbSBQYWdlIFNwZWNpZmljIE1ldGFkYXRhIG9yIFRlbXBsYXRlLiI7CiRsYW5nWydjb250ZW50X2Rlc2NyaXB0aW9uJ10gPSAiVGhlc2UgcHJlZmVyZW5jZXMgYXJlIHVzZWQgZm9yIGRlZmF1bHQgc2V0dGluZ3Mgb2YgU3ludGF4aGlnaGxpZ2h0aW5nIGFyZWEgd2hlbiBjYWxsaW5nIDxjb2RlPntBY2VFZGl0b3IgZGl2aWQ9J2VkaXRvcid9PC9jb2RlPiB0YWcgd2l0aGluIGEgUGFnZS4iOwokbGFuZ1snc3ludGF4YXJlYWRlc2NyaXB0aW9uJ10gPSAiVGhlc2UgcHJlZmVyZW5jZXMgYXJlIHVzZWQgZm9yIGRlZmF1bHQgc2V0dGluZ3Mgb2YgQWNlIGJlaGF2aW9yIHdoZW4gY2FsbGluZyA8Y29kZT57QWNlRWRpdG9yIGRpdmlkPSdmb28nfTwvY29kZT4gZnJvbSBhIFBhZ2Ugb3IgVGVtcGxhdGUiOwoKLyogLS0tIFNldHRpbmdzIGxhYmVscyAtLS0gKi8KJGxhbmdbJ2V4YW1wbGVfZG9jdW1lbnQnXSA9ICJEb2N1bWVudCI7CiRsYW5nWyd3aWR0aF90aXRsZSddID0gIkVkaXRvciB3aWR0aCAoaW4gZW0pIjsKJGxhbmdbJ2hlaWdodF90aXRsZSddID0gIkVkaXRvciBoZWlnaHQgKGluIGVtKSI7CiRsYW5nWydlbmFibGVfaWUnXSA9ICJFbmFibGUgSW50ZXJuZXQgRXhwbG9yZXIiOwokbGFuZ1sndXNlX3VuY29tcHJlc3NlZCddID0gIlVzZSB1bmNvbXByZXNzZWQiOwokbGFuZ1sndXNlX3VuY29tcHJlc3NlZF90ZXh0J10gPSAnTWlnaHQgaGVscCBpZiB5b3UgaGF2ZSBwcm9ibGVtcyB1c2luZyBpbiBTYWZhcmkuJzsKJGxhbmdbJ2VuYWJsZV9pZWRlc2NyaXB0aW9uJ10gPSAiQWNlIFN5bnRheGhpZ2hsaWdodGVyIGRvZXMgbm90IGJlaGF2ZSBwcm9wZXJseSB3aGVuIHVzaW5nIEludGVybmV0IEV4cGxvcmVyLiBFbmFibGUgdGhpcyBhdCB5b3VyIG93biByaXNrISI7CiRsYW5nWydmcm9udGVuZF93aWR0aF90aXRsZSddID0gIkZyb250ZW5kIFN5bnRheGFyZWEgd2lkdGggKGluIHB4KSI7CiRsYW5nWydmcm9udGVuZF9oZWlnaHRfdGl0bGUnXSA9ICJGcm9udGVuZCBTeW50YXhhcmVhIGhlaWdodCAoaW4gcHgpIjsKJGxhbmdbJ3N5bnRheF9tb2RlJ10gPSAiTW9kZSI7CiRsYW5nWyd0aGVtZXMnXSA9ICJUaGVtZSI7CiRsYW5nWydmb250X3NpemUnXSA9ICJGb250IFNpemUiOwokbGFuZ1snZnVsbF9saW5lJ10gPSAiRnVsbCBMaW5lIFNlbGVjdGlvbiI7CiRsYW5nWydoaWdobGlnaHRfYWN0aXZlJ10gPSAiSGlnaGxpZ2h0IEFjdGl2ZSBMaW5lIjsKJGxhbmdbJ3Nob3dfaW52aXNpYmxlcyddID0gIlNob3cgSW52aXNpYmxlcyI7CiRsYW5nWydwZXJzaXN0ZW50X2hzY3JvbGwnXSA9ICJQZXJzaXRlbnQgSFNjcm9sbCI7CiRsYW5nWydrZXlfYmluZGluZyddID0gIktleSBCaW5kaW5nIjsKJGxhbmdbJ3NvZnRfd3JhcCddID0gIlNvZnQgV3JhcCI7CiRsYW5nWydzaG93X2d1dHRlciddID0gIlNob3cgR3V0dGVyIjsKJGxhbmdbJ3ByaW50X21hcmdpbiddID0gIlNob3cgUHJpbnQgTWFyZ2luIjsKJGxhbmdbJ3NvZnRfdGFiJ10gPSAiVXNlIFNvZnQgVGFiIjsKJGxhbmdbJ2hpZ2hsaWdodF9zZWxlY3RlZCddID0gIkhpZ2hsaWdodCBzZWxlY3RlZCB3b3JkIjsKJGxhbmdbJ2VuYWJsZV9iZWhhdmlvcnMnXSA9ICJFbmFibGUgQmVoYXZpb3JzIjsKJGxhbmdbJ3Rlc3RhcmVhdGV4dCddID0gIlByZXZpZXciOwoKLyogLS0tIFNlbGVjdCBvcHRpb25zIC0tLSAqLwoKLyogbGFuZ3VhZ2VzICovCiRsYW5nWydqcyddID0gIkphdmFTY3JpcHQiOwokbGFuZ1sncGxhaW4nXSA9ICJQbGFpbiBUZXh0IjsKJGxhbmdbJ3N2ZyddID0gIlNWRyI7CiRsYW5nWydodG1sJ10gPSAiSFRNTCI7CiRsYW5nWydjc3MnXSA9ICJDU1MiOwokbGFuZ1snc2NzcyddID0gIlNDU1MiOwokbGFuZ1snY29mZmVlJ10gPSAiQ29mZmVlU2NyaXB0IjsKJGxhbmdbJ2pzb24nXSA9ICJKU09OIjsKJGxhbmdbJ3B5dGhvbiddID0gIlB5dGhvbiI7CiRsYW5nWydydWJ5J10gPSAiUnVieSI7CiRsYW5nWydwZXJsJ10gPSAiUGVybCI7CiRsYW5nWydwaHAnXSA9ICJQSFAiOwokbGFuZ1snamF2YSddID0gIkphdmEiOwokbGFuZ1snY3NoYXJwJ10gPSAiQyMiOwokbGFuZ1snY19jcHAnXSA9ICJDKysiOwokbGFuZ1snY2xvanVyZSddID0gIkNsb2p1cmUiOwokbGFuZ1snb2NhbWwnXSA9ICJPQ2FtbCI7CiRsYW5nWyd0ZXh0aWxlJ10gPSAiVGV4dGlsZSI7CiRsYW5nWydncm9vdnknXSA9ICJHcm9vdnkiOwokbGFuZ1snc2NhbGEnXSA9ICJTY2FsYSI7CgovKiB0aGVtZXMgKi8KJGxhbmdbJ2Nsb3VkcyddID0gIkNsb3VkcyI7IAokbGFuZ1snY2hyb21lJ10gPSAiQ2hyb21lIjsgCiRsYW5nWydjbG91ZHNfbWlkbmlnaHQnXSA9ICJDbG91ZHMgTWlkbmlnaHQiOyAKJGxhbmdbJ2NvYmFsdCddID0gIkNvYmFsdCI7IAokbGFuZ1snY3JpbXNvbl9lZGl0b3InXSA9ICJDcmltc29uIEVkaXRvciI7CiRsYW5nWydkYXduJ10gPSAiRGF3biI7CiRsYW5nWydkcmVhbXdlYXZlciddID0gIkRyZWFtd2VhdmVyIjsgCiRsYW5nWydlY2xpcHNlJ10gPSAiRWNsaXBzZSI7CiRsYW5nWydpZGxlX2ZpbmdlcnMnXSA9ICJpZGxlRmluZ2VycyI7CiRsYW5nWydrcl90aGVtZSddID0gImtyVGhlbWUiOwokbGFuZ1snbWVyYml2b3JlJ10gPSAiTWVyYml2b3JlIjsKJGxhbmdbJ21lcmJpdm9yZV9zb2Z0J10gPSAiTWVyYml2b3JlIFNvZnQiOwokbGFuZ1snbW9ub19pbmR1c3RyaWFsJ10gPSAiTW9ubyBJbmR1c3RyaWFsIjsKJGxhbmdbJ21vbm9rYWknXSA9ICJNb25va2FpIjsKJGxhbmdbJ3Bhc3RlbF9vbl9kYXJrJ10gPSAiUGFzdGVsIG9uIGRhcmsiOwokbGFuZ1snc29sYXJpemVkX2RhcmsnXSA9ICJTb2xhcml6ZWQgRGFyayI7CiRsYW5nWydzb2xhcml6ZWRfbGlnaHQnXSA9ICJTb2xhcml6ZWQgTGlnaHQiOwokbGFuZ1sndGV4dG1hdGUnXSA9ICJUZXh0TWF0ZSI7CiRsYW5nWyd0b21vcnJvdyddID0gIlRvbW9ycm93IjsKJGxhbmdbJ3RvbW9ycm93X25pZ2h0J10gPSAiVG9tb3Jyb3cgTmlnaHQiOwokbGFuZ1sndG9tb3Jyb3dfbmlnaHRfYnJpZ2h0J10gPSAiVG9tb3Jyb3cgTmlnaHQgQnJpZ2h0IjsKJGxhbmdbJ3RvbW9ycm93X25pZ2h0X2JsdWUnXSA9ICJUb21vcnJvdyBOaWdodCBCbHVlIjsKJGxhbmdbJ3RvbW9ycm93X25pZ2h0X2VpZ2h0aWVzJ10gPSAiVG9tb3Jyb3cgTmlnaHQgRWlnaHRpZXMiOwokbGFuZ1sndHdpbGlnaHQnXSA9ICJUd2lsaWdodCI7CiRsYW5nWyd2aWJyYW50X2luayddID0gIlZpYnJhbnQgSW5rIjsKCi8qIGtleSBiaW5kaW5nICovCiRsYW5nWydhY2UnXSA9ICJBY2UiOyAKJGxhbmdbJ3ZpbSddID0gIlZpbSI7IAokbGFuZ1snY29iYWx0J10gPSAiQ29iYWx0IjsgCiRsYW5nWydlbWFjcyddID0gIkVNYWNzIjsKJGxhbmdbJ2N1c3RvbSddID0gIkN1c3RvbSI7CgovKiBTb2Z0IHdyYXAgKi8KJGxhbmdbJ29mZiddID0gIk9mZiI7IAokbGFuZ1snNDAnXSA9ICI0MCBDaGFycyI7IAokbGFuZ1snODAnXSA9ICI4MCBDaGFycyI7IAokbGFuZ1snMTAwJ10gPSAiMTAwIENoYXJzIjsgCiRsYW5nWycxNDAnXSA9ICIxNDAgQ2hhcnMiOyAKCi8qIC0tLSBDb21tb24gLS0tICovCiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICJTYXZlIFByZWZlcmVuY2VzIjsKJGxhbmdbJ3NldHRpbmdzc2F2ZWQnXSA9ICJZb3VyIEFjZUVkaXRvciBzZXR0aW5ncyBoYXZlIGJlZW4gc2F2ZWQiOwokbGFuZ1snZnJvbnRlbmRzZXR0aW5nc3NhdmVkJ10gPSAiWW91ciBBY2VFZGl0b3IgRnJvbnRlbmQgc2V0dGluZ3MgaGF2ZSBiZWVuIHNhdmVkIjsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAiQWNlRWRpdG9yIFN1Y2Nlc3NmdWxseSBJbnN0YWxsZWQhIFNldCBcIk1vZGlmeSBTaXRlIFByZWZlcmVuY2VzXCIgcGVybWlzc2lvbnMgdG8gdXNlIHRoaXMgbW9kdWxlISI7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAiQWNlRWRpdG9yIFN1Y2Nlc3NmdWxseSBVbmluc3RhbGxlZCI7CiRsYW5nWydyZWFsbHlfdW5pbnN0YWxsJ10gPSAiUmVhbGx5PyBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gdW5pbnN0YWxsIEFjZUVkaXRvcj8gVGhpbmsgYWdhaW4hIjsKCi8qIC0tLSBIZWxwIC0tLSAqLwokbGFuZ1snaGVscF9wYXJhbV9hY3Rpb24nXSA9ICJpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgYWN0aW9uIG9mIE1vZHVsZSB0YWcuIFBvc3NpYmxlIHZhbHVlcyBhcmUgJ2RlZmF1bHQnIGFuZCAnaGVhZCcuIEJvdGggYXJlIG5lZWRlZCBmb3IgY29ycmVjdCBGcm9udGVuZCBTeW50YXhoaWdobGlnaHRpbmcgZnVuY3Rpb24uIDxiciAvPlBvc3NpYmxlIHZhbHVlcyBhcmU6Cjx1bD4KCTxsaT5oZWFkPC9saT4KCTxsaT5kZWZhdWx0PC9saT4KPC91bD4iOwokbGFuZ1snaGVscF9wYXJhbV9tb2RlcyddID0gImlzIHVzZWQgd2l0aCA8Y29kZT57QWNlRWRpdG9yIGFjdGlvbj0naGVhZCd9PC9jb2RlPi4gWW91IGNhbiBpbmNsdWRlIG11bHRpcGxlIGNvbW1hIHNlcGFyYXRlZCAnbW9kZXMnIHRoYXQgeW91IHdpbGwgYmUgdXNpbmcgb24geW91ciB3ZWJzaXRlLiBUaGlzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB5b3VyICZsdDtoZWFkJmd0OyBvZiBUZW1wbGF0ZSBvciBQYWdlIHNwZWNpZmljIE1ldGFkYXRhLiBUaGlzIHdpbGwgb3ZlcnJpZGUgeW91IFByZWZlcmVuY2VzIHNlbGVjdGVkIGluIE1vZHVsZSBBZG1pbiBhcmVhLiA8YnIgLz5Qb3NzaWJsZSB2YWx1ZXMgYXJlOgo8dWw+Cgk8bGk+amF2YXNjcmlwdDwvbGk+IAoJPGxpPnBsYWluPC9saT4gCgk8bGk+c3ZnPC9saT4gCgk8bGk+aHRtbDwvbGk+Cgk8bGk+Y3NzPC9saT4KCTxsaT5zY3NzPC9saT4KCTxsaT5jb2ZmZWU8L2xpPgoJPGxpPmpzb248L2xpPgoJPGxpPnB5dGhvbjwvbGk+Cgk8bGk+cnVieTwvbGk+Cgk8bGk+cGVybDwvbGk+Cgk8bGk+cGhwPC9saT4KCTxsaT5qYXZhPC9saT4KCTxsaT5jc2hhcnA8L2xpPgoJPGxpPmNfY3BwPC9saT4KCTxsaT5jbG9qdXJlPC9saT4KCTxsaT5vY2FtbDwvbGk+Cgk8bGk+dGV4dGlsZTwvbGk+Cgk8bGk+Z3Jvb3Z5PC9saT4KCTxsaT5zY2FsYTwvbGk+CjwvdWw+IjsKJGxhbmdbJ2hlbHBfcGFyYW1fdGhlbWVzJ10gPSAiaXMgdXNlZCB3aXRoIDxjb2RlPntBY2VFZGl0b3IgYWN0aW9uPSdoZWFkJ308L2NvZGU+LiBZb3UgY2FuIGluY2x1ZGUgbXVsdGlwbGUgY29tbWEgc2VwYXJhdGVkICd0aGVtZXMnIHRoYXQgeW91IHdpbGwgYmUgdXNpbmcgb24geW91ciB3ZWJzaXRlLiBUaGlzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB5b3VyICZsdDtoZWFkJmd0OyBvZiBUZW1wbGF0ZSBvciBQYWdlIHNwZWNpZmljIE1ldGFkYXRhLiBUaGlzIHdpbGwgb3ZlcnJpZGUgeW91IFByZWZlcmVuY2VzIHNlbGVjdGVkIGluIE1vZHVsZSBBZG1pbiBhcmVhLiA8YnIgLz5Qb3NzaWJsZSB2YWx1ZXMgYXJlOgo8dWw+Cgk8bGk+Y2xvdWRzPC9saT4gCgk8bGk+Y2xvdWRzX21pZG5pZ2h0PC9saT4gCgk8bGk+Y29iYWx0PC9saT4gCgk8bGk+Y3JpbXNvbl9lZGl0b3I8L2xpPgoJPGxpPmRhd248L2xpPgoJPGxpPmVjbGlwc2U8L2xpPgoJPGxpPmlkbGVfZmluZ2VyczwvbGk+Cgk8bGk+a3JfdGhlbWU8L2xpPgoJPGxpPm1lcmJpdm9yZTwvbGk+Cgk8bGk+bWVyYml2b3JlX3NvZnQ8L2xpPgoJPGxpPm1vbm9faW5kdXN0cmlhbDwvbGk+Cgk8bGk+bW9ub2thaTwvbGk+Cgk8bGk+cGFzdGVsX29uX2Rhcms8L2xpPgoJPGxpPnNvbGFyaXplZF9kYXJrPC9saT4KCTxsaT5zb2xhcml6ZWRfbGlnaHQ8L2xpPgoJPGxpPnRleHRtYXRlPC9saT4KCTxsaT50d2lsaWdodDwvbGk+Cgk8bGk+dmlicmFudF9pbms8L2xpPgo8L3VsPiI7CiRsYW5nWydoZWxwX3BhcmFtX21vZGUnXSA9ICJpcyB1c2VkIHdpdGhpbiBhIHBhZ2Ugd2l0aCA8Y29kZT57QWNlRWRpdG9yIGFjdGlvbj0nZGVmYXVsdCd9PC9jb2RlPiBtb2R1bGUgdGFnLiBUaGlzIHNwZWNpZmllcyBTeW50YXhoaWdobGlnaHRlciBtb2RlIGZvciBzcGVjaWZpYyBjb2RlIGFyZWEuIDxiciAvPlBvc3NpYmxlIHZhbHVlcyBhcmU6Cjx1bD4KCTxsaT5qYXZhc2NyaXB0PC9saT4gCgk8bGk+cGxhaW48L2xpPiAKCTxsaT5zdmc8L2xpPiAKCTxsaT5odG1sPC9saT4KCTxsaT5jc3M8L2xpPgoJPGxpPnNjc3M8L2xpPgoJPGxpPmNvZmZlZTwvbGk+Cgk8bGk+anNvbjwvbGk+Cgk8bGk+cHl0aG9uPC9saT4KCTxsaT5ydWJ5PC9saT4KCTxsaT5wZXJsPC9saT4KCTxsaT5waHA8L2xpPgoJPGxpPmphdmE8L2xpPgoJPGxpPmNzaGFycDwvbGk+Cgk8bGk+Y19jcHA8L2xpPgoJPGxpPmNsb2p1cmU8L2xpPgoJPGxpPm9jYW1sPC9saT4KCTxsaT50ZXh0aWxlPC9saT4KCTxsaT5ncm9vdnk8L2xpPgoJPGxpPnNjYWxhPC9saT4KPC91bD4iOwokbGFuZ1snaGVscF9wYXJhbV90aGVtZSddID0gImlzIHVzZWQgd2l0aGluIGEgcGFnZSB3aXRoIDxjb2RlPntBY2VFZGl0b3IgYWN0aW9uPSdkZWZhdWx0J308L2NvZGU+IG1vZHVsZSB0YWcuIFRoaXMgc3BlY2lmaWVzIFN5bnRheGhpZ2hsaWdodGVyIHRoZW1lIGZvciBzcGVjaWZpYyBjb2RlIGFyZWEuIDxiciAvPlBvc3NpYmxlIHZhbHVlcyBhcmU6Cjx1bD4KCTxsaT5jbG91ZHM8L2xpPiAKCTxsaT5jbG91ZHNfbWlkbmlnaHQ8L2xpPiAKCTxsaT5jb2JhbHQ8L2xpPiAKCTxsaT5jcmltc29uX2VkaXRvcjwvbGk+Cgk8bGk+ZGF3bjwvbGk+Cgk8bGk+ZWNsaXBzZTwvbGk+Cgk8bGk+aWRsZV9maW5nZXJzPC9saT4KCTxsaT5rcl90aGVtZTwvbGk+Cgk8bGk+bWVyYml2b3JlPC9saT4KCTxsaT5tZXJiaXZvcmVfc29mdDwvbGk+Cgk8bGk+bW9ub19pbmR1c3RyaWFsPC9saT4KCTxsaT5tb25va2FpPC9saT4KCTxsaT5wYXN0ZWxfb25fZGFyazwvbGk+Cgk8bGk+c29sYXJpemVkX2Rhcms8L2xpPgoJPGxpPnNvbGFyaXplZF9saWdodDwvbGk+Cgk8bGk+dGV4dG1hdGU8L2xpPgoJPGxpPnR3aWxpZ2h0PC9saT4KCTxsaT52aWJyYW50X2luazwvbGk+CjwvdWw+IjsKJGxhbmdbJ2hlbHBfcGFyYW1fd2lkdGgnXSA9ICJzcGVjaWZpZXMgd2lkdGggb2YgU3ludGF4aGlnaGxpZ2h0ZXIgYXJlYSBpbiBwaXhlbC4iOwokbGFuZ1snaGVscF9wYXJhbV9oZWlnaHQnXSA9ICJzcGVjaWZpZXMgaGVpZ2h0IG9mIFN5bnRheGhpZ2hsaWdodGVyIGFyZWEgaW4gcGl4ZWwuIjsKJGxhbmdbJ2hlbHBfcGFyYW1fZGl2aWQnXSA9ICJpZCBvZiB0aGUgZWxlbWVudCBjb250YWluaW5nIHlvdXIgY29kZS4gVXNlIHVuaXF1ZSBpZCBmb3IgZWFjaCBjb2RlIGNodW5jay4iOwokbGFuZ1snaGVscF9nZW5lcmFsX3RpdGxlJ10gPSAiR2VuZXJhbCI7CiRsYW5nWydoZWxwX2dlbmVyYWxfdGV4dCddID0gIgo8aDM+V2hhdCBkb2VzIHRoaXMgbW9kdWxlIGRvPzwvaDM+CjxwPkFjZUVkaXRvciBpcyBhIFN5bnRheGhpZ2hsaWdodGVyIG1vZHVsZSB1c2luZyA8c3Ryb25nPkFjZTwvc3Ryb25nPiBhIHN0YW5kYWxvbmUgY29kZSBlZGl0b3Igd3JpdHRlbiBpbiBKYXZhU2NyaXB0LjxiciAvPiAKR29hbCBvZiBBY2UgY29kZSBlZGl0b3IgZ3JvdXAgaXMgdG8gY3JlYXRlIGEgd2ViIGJhc2VkIGNvZGUgZWRpdG9yIHRoYXQgbWF0Y2hlcyBhbmQgZXh0ZW5kcyB0aGUgZmVhdHVyZXMsIHVzYWJpbGl0eSBhbmQgcGVyZm9ybWFuY2Ugb2YgZXhpc3RpbmcgbmF0aXZlIGVkaXRvcnMgc3VjaCBhcyBUZXh0TWF0ZSwgVmltIG9yIEVjbGlwc2UuPGJyIC8+Ckl0IGNhbiBiZSBlYXNpbHkgZW1iZWRkZWQgaW4gYW55IHdlYiBwYWdlIGFuZCBKYXZhU2NyaXB0IGFwcGxpY2F0aW9uLjxiciAvPiAKQWNlIGlzIGRldmVsb3BlZCBhcyB0aGUgcHJpbWFyeSBlZGl0b3IgZm9yIDxhIGhyZWY9XCJodHRwOi8vd3d3LmNsb3VkOWlkZS5jb21cIj5DbG91ZDkgSURFPC9hPiBhbmQgdGhlIHN1Y2Nlc3NvciBvZiB0aGUgTW96aWxsYSBTa3l3cml0ZXIgKEJlc3BpbikgUHJvamVjdC48L3A+CjxoMz5BY2UgaXMgaG9zdGVkIG9uIEdpdEh1YjwvaDM+CjxwPlRoZSBBY2Ugc291cmNlIGNvZGUgaXMgaG9zdGVkIG9uIEdpdEh1Yi4gSXQgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIE1vemlsbGEgdHJpLWxpY2Vuc2UgKE1QTC9HUEwvTEdQTCkuPGJyIC8+ClRoaXMgaXMgdGhlIHNhbWUgbGljZW5zZSB1c2VkIGJ5IEZpcmVmb3guIFRoaXMgbGljZW5zZSBpcyBmcmllbmRseSB0byBhbGwga2luZHMgb2YgcHJvamVjdHMsIHdoZXRoZXIgb3BlbiBzb3VyY2Ugb3Igbm90LjxiciAvPgogVGFrZSBjaGFyZ2Ugb2YgeW91ciBlZGl0b3IgYW5kIGFkZCB5b3VyIGZhdm9yaXRlIGxhbmd1YWdlIGhpZ2hsaWdodGluZyBhbmQga2V5YmluZGluZ3MhPC9wPgo8aDM+VXNpbmcgQWNlRWRpdG9yIE1vZHVsZTwvaDM+CjxwPlVzaW5nIEFjZUVkaXRvciBNb2R1bGUgaXMgc2ltcGxlLjxiciAvPgpBZnRlciBBY2VFZGl0b3Igd2FzIGluc3RhbGxlZCBnbyB0byBcIk15IFByZWZlcmVuY2VzICZyYXF1bzsgVXNlciBQcmVmZXJlbmNlc1wiIGFuZCBjaG9vc2UgQWNlRWRpdG9yIGFzIHlvdXIgU3ludGF4aGlnaGxpZ2h0ZXIgb2YgY2hvaWNlIGZyb20gXCJTZWxlY3Qgc3ludGF4IGhpZ2hsaWdodGVyIHRvIHVzZTpcIiBEcm9wZG93bi48YnIgLz4KTWFrZSBzdXJlIHlvdSBoYXZlICdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycgUGVybXNpc3Npb24uPC9wPgo8aDM+U2V0dGluZ3M8L2gzPgo8cD5Zb3UgY2FuIGNoYW5nZSBkZWZhdWx0IFNldHRpbmdzIGFuZCBUaGVtZXMgaW4gXCJFeHRlbnNpb25zICZyYXF1bzsgQWNlRWRpdG9yXCI8L3A+IjsKCiRsYW5nWydoZWxwX2tleWJvYXJkc2hvcnRjdXRzX3RpdGxlJ10gPSAiS2V5Ym9hcmQgU2hvcnRjdXRzIjsKJGxhbmdbJ2hlbHBfa2V5Ym9hcmRzaG9ydGN1dHNfY29udGVudCddID0gJwogICAgICA8aDM+RGVmYXVsdCBLZXlib2FyZCBTaG9ydGN1dHM8L2gzPgoKPHRhYmxlIGNsYXNzPSJwYWdldGFibGUiIGNlbGxzcGFjaW5nPSIwIiBzdW1tYXJ5PSJEZWZhdWx0IEtleWJvYXJkIFNob3J0Y3V0cyI+Cjx0aGVhZD48dHI+Cjx0aD5QQyAoV2luZG93cy9MaW51eCk8L3RkPgo8dGg+TWFjPC90ZD4KPHRoPmFjdGlvbjwvdGQ+CjwvdHI+PC90aGVhZD4KPHRib2R5Pgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtUmV0dXJuPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLVJldHVybjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+ZnVsbHNjcmVlbjwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1TPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLVM8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnBlcmZvcm0gc2F2ZTwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUw8L3RkPgo8dGQgYWxpZ249ImxlZnQiPmNlbnRlciBzZWxlY3Rpb248L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtQWx0LURvd248L3RkPgo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtT3B0aW9uLURvd248L3RkPgo8dGQgYWxpZ249ImxlZnQiPmNvcHkgbGluZXMgZG93bjwvdGQ+CjwvdHI+Cjx0ciBsY2Fzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1BbHQtVXA8L3RkPgo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtT3B0aW9uLVVwPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5jb3B5IGxpbmVzIHVwPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUY8L3RkPgo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtRjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+ZmluZDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1LPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLUc8L3RkPgo8dGQgYWxpZ249ImxlZnQiPmZpbmQgbmV4dDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1TaGlmdC1LPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLVNoaWZ0LUc8L3RkPgo8dGQgYWxpZ249ImxlZnQiPmZpbmQgcHJldmlvdXM8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPkRvd248L3RkPgo8dGQgYWxpZ249ImxlZnQiPkRvd24sQ3RybC1OPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5nbyBsaW5lIGRvd248L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPlVwPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5VcCxDdHJsLVA8L3RkPgo8dGQgYWxpZ249ImxlZnQiPmdvIGxpbmUgdXA8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtRW5kLEN0cmwtRG93bjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1FbmQsQ29tbWFuZC1Eb3duPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byBlbmQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPkxlZnQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPkxlZnQsQ3RybC1CPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byBsZWZ0PC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUw8L3RkPgo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtTDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Z28gdG8gbGluZTwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+QWx0LVJpZ2h0LEVuZDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1SaWdodCxFbmQsQ3RybC1FPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byBsaW5lIGVuZDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+QWx0LUxlZnQsSG9tZTwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1MZWZ0LEhvbWUsQ3RybC1BPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byBsaW5lIHN0YXJ0PC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij5QYWdlRG93bjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+T3B0aW9uLVBhZ2VEb3duLEN0cmwtVjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Z28gdG8gcGFnZSBkb3duPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5QYWdlVXA8L3RkPgo8dGQgYWxpZ249ImxlZnQiPk9wdGlvbi1QYWdlVXA8L3RkPgo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIHBhZ2UgdXA8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPlJpZ2h0PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5SaWdodCxDdHJsLUY8L3RkPgo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIHJpZ2h0PC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUhvbWUsQ3RybC1VcDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1Ib21lLENvbW1hbmQtVXA8L3RkPgo8dGQgYWxpZ249ImxlZnQiPmdvIHRvIHN0YXJ0PC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUxlZnQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPk9wdGlvbi1MZWZ0PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5nbyB0byB3b3JkIGxlZnQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtUmlnaHQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPk9wdGlvbi1SaWdodDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Z28gdG8gd29yZCByaWdodDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+VGFiPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5UYWI8L3RkPgo8dGQgYWxpZ249ImxlZnQiPmluZGVudDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+QWx0LURvd248L3RkPgo8dGQgYWxpZ249ImxlZnQiPk9wdGlvbi1Eb3duPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5tb3ZlIGxpbmVzIGRvd248L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPkFsdC1VcDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+T3B0aW9uLVVwPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5tb3ZlIGxpbmVzIHVwPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1UYWI8L3RkPgo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVRhYjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+b3V0ZGVudDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+SW5zZXJ0PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5JbnNlcnQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPm92ZXJ3cml0ZTwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5QYWdlRG93bjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+cGFnZWRvd248L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+UGFnZVVwPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5wYWdldXA8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtU2hpZnQtWixDdHJsLVk8L3RkPgo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtU2hpZnQtWixDb21tYW5kLVk8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnJlZG88L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtRDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1EPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5yZW1vdmUgbGluZTwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLUs8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnJlbW92ZSB0byBsaW5lIGVuZDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5PcHRpb24tQmFja3NwYWNlPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5yZW1vdmUgdG8gbGluZXN0YXJ0PC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij48L3RkPgo8dGQgYWxpZ249ImxlZnQiPkFsdC1CYWNrc3BhY2UsQ3RybC1BbHQtQmFja3NwYWNlPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5yZW1vdmUgd29yZCBsZWZ0PC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij48L3RkPgo8dGQgYWxpZ249ImxlZnQiPkFsdC1EZWxldGU8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnJlbW92ZSB3b3JkIHJpZ2h0PC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLVI8L3RkPgo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtT3B0aW9uLUY8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnJlcGxhY2U8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtU2hpZnQtUjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1TaGlmdC1PcHRpb24tRjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+cmVwbGFjZSBhbGw8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtQTwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1BPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgYWxsPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1Eb3duPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1Eb3duPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgZG93bjwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtTGVmdDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtTGVmdDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IGxlZnQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LUVuZDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtRW5kPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgbGluZSBlbmQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LUhvbWU8L3RkPgo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LUhvbWU8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCBsaW5lIHN0YXJ0PC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cyIj4KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1QYWdlRG93bjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtUGFnZURvd248L3RkPgo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCBwYWdlIGRvd248L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVBhZ2VVcDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtUGFnZVVwPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgcGFnZSB1cDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtUmlnaHQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPlNoaWZ0LVJpZ2h0PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgcmlnaHQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtU2hpZnQtRW5kLEFsdC1TaGlmdC1Eb3duPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5Db21tYW5kLVNoaWZ0LURvd248L3RkPgo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCB0byBlbmQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzIiPgo8dGQgYWxpZ249ImxlZnQiPkFsdC1TaGlmdC1SaWdodDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1TaGlmdC1SaWdodDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IHRvIGxpbmUgZW5kPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5BbHQtU2hpZnQtTGVmdDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1TaGlmdC1MZWZ0PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3QgdG8gbGluZSBzdGFydDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1TaGlmdC1Ib21lLEFsdC1TaGlmdC1VcDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC1TaGlmdC1VcDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IHRvIHN0YXJ0PC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5TaGlmdC1VcDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+U2hpZnQtVXA8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnNlbGVjdCB1cDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1TaGlmdC1MZWZ0PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5PcHRpb24tU2hpZnQtTGVmdDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+c2VsZWN0IHdvcmQgbGVmdDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MSI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1TaGlmdC1SaWdodDwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+T3B0aW9uLVNoaWZ0LVJpZ2h0PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5zZWxlY3Qgd29yZCByaWdodDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLU88L3RkPgo8dGQgYWxpZ249ImxlZnQiPnNwbGl0IGxpbmU8L3RkPgo8L3RyPgo8dHIgY2xhc3M9InJvdzEiPgo8dGQgYWxpZ249ImxlZnQiPkN0cmwtNzwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+Q29tbWFuZC03PC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij50b2dnbGUgY29tbWVudDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0icm93MiI+Cjx0ZCBhbGlnbj0ibGVmdCI+Q3RybC1UPC90ZD4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLVQ8L3RkPgo8dGQgYWxpZ249ImxlZnQiPnRyYW5zcG9zZSBsZXR0ZXJzPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJyb3cxIj4KPHRkIGFsaWduPSJsZWZ0Ij5DdHJsLVo8L3RkPgo8dGQgYWxpZ249ImxlZnQiPkNvbW1hbmQtWjwvdGQ+Cjx0ZCBhbGlnbj0ibGVmdCI+dW5kbzwvdGQ+CjwvdHI+CjwvdGJvZHk+CjwvdGFibGU+JzsKCiRsYW5nWydoZWxwX2Zyb250ZW5kX3RpdGxlJ10gPSAiRnJvbnRlbmQiOwokbGFuZ1snaGVscF9mcm9udGVuZF9jb250ZW50J10gPSAiPHA+VGhpcyBNb2R1bGUgYW5kIEFjZSBTY3JpcHQgY2FuIGFsc28gYmUgdXNlZCBhcyBhIEZyb250ZW5kIFN5bnRheGhpZ2hsaWdodGVyLjxiciAvPgpUbyBtYWtlIGl0IHdvcmsgeW91IGhhdmUgdG8gaW5jbHVkZSBqUXVlcnkgRnJhbWV3b3JrLCBmb3IgZXhhbXBsZSB1c2luZyBDTVNNUyB7Y21zX2pxdWVyeX0gdGFnIGFuZCBhcyB3ZWxsIGluY2x1ZGUge0FjZUVkaXRvcn0gaW4geW91ciBwYWdlIHR3aWNlLiBGaXJzdCBhZGQgdGhlIG1vZHVsZSB0YWcgaW4geW91ciAmbHQ7aGVhZCZndDsgc2VjdGlvbiBvZiBUZW1wbGF0ZSBvciBpbiAmcXVvdDtQYWdlIFNwZWNpZmljIE1ldGRhdGEmcXVvdDsgZmllbGQgb2YgeW91ciBDb250ZW50IHBhZ2UsIGxpa2Uge0FjZUVkaXRvciBhY3Rpb249J2hlYWQnfSBhbmQgYW5vdGhlciBjYWxsIHRvIHNwZWNpZnkgd2hpY2ggYXJlYSBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQsIGZvciBleGFtcGxlIHtBY2VFZGl0b3IgZGl2aWQ9J2Zvbyd9LCB3aGljaCB3b3VsZCB0YXJnZXQgYSBwYWdlIGVsZW1lbnQgd2l0aCBpZCA8ZW0+Zm9vPC9lbT4uPC9wPgo8aDM+U28gaG93IGRvIHlvdSB1c2UgaXQ/PC9oMz4KPHA+Rmlyc3QgaW5jbHVkZSBqUXVlcnkgYW5kIE1vZHVsZSB0YWcgaW4geW91ciBQYWdlICZsdDtoZWFkJmd0OyBhcmVhLCBmb3IgZXhhbXBsZSBpbiAmcXVvdDtQYWdlIFNwZWNpZmljIE1ldGRhdGEmcXVvdDs6PC9wPgoJPHByZT4KCXtjbXNfanF1ZXJ5fQoJe0FjZUVkaXRvciBhY3Rpb249J2hlYWQnfQoJPC9wcmU+CjxwPlRoaXMgaW5jbHVkZXMgbmVlZGVkIHNjcmlwdHMgZm9yIEFjZSBTeW50YXhoaWdobGlnaHRlciB0byB3b3JrLjxiciAvPgpJbiBNb2R1bGVzIEFkbWluIGludGVyZmFjZSB5b3UgY2FuIHNlbGVjdCBkZWZhdWx0IHNldHRpbmdzIGZvciB5b3VyICdoZWFkJyBhY3Rpb24gb3IgdXNlIHBhcmFtZXRlciBtb2Rlcz0naHRtbCxqYXZhc2NyaXB0JyBhbmQgdGhlbWVzPSd0ZXh0bWF0ZScgd2hpY2ggd291bGQgb3ZlcnJpZGUgc2VsZWN0ZWQgUHJlZmVyZW5jZXMuPC9wPgo8cD5Ob3cgd2hlbiB5b3UgaGF2ZSBuZWVkZWQgc2NyaXB0cyBpbmNsdWRlZCwgb25lIG1vcmUgTW9kdWxlIHRhZyBjYWxsIGlzIG5lZWRlZCAoZm9yIGV4YW1wbGUgaW4geW91ciBDb250ZW50IEVkaXRvciBhcmVhKSB0byBzcGVjaWZ5IHdoaWNoIGFyZWEgb2YgeW91ciBQYWdlIHNob3VsZCBiZSBoaWdobGlnaHRlZC48L3A+Cgk8cHJlPgoJe0FjZUVkaXRvciBkaXZpZD0nc29tZS1pZCd9Cgk8L3ByZT4KPHA+VGhpcyB0YWcgaW5jbHVkZXMgbmVlZGVkIFNjcmlwdCBhbmQgU3R5bGUgdGhhdCBpcyB1c2VkIHRvIEhpZ2hsaWdodCBzZWxlY3RlZCBlbGVtZW50IHdpdGggc3BlY2lmaWVkIGlkLjxiciAvPgpBbGwgeW91IG5lZWQgdGhlbiBpcyB3cml0ZSB5b3VyIENvZGUgdGhhdCB5b3Ugd2FudCB0byBIaWdobGlnaHQgYW5kIHdyYXAgaXQgaW5zaWRlIGFuIGVsZW1lbiBsaWtlICZsdDtkaXYmZ3Q7IHdpdGggc3BlY2lmaWVkIGlkLjwvcD4iOwokbGFuZ1snaGVscF9mcm9udGVuZF9zYW1wbGUnXSA9ICcKPHByZSBpZD0ic29tZS1pZCI+CiZsdDtodG1sJmd0OwogwqAgwqAgJmx0O2hlYWQmZ3Q7CiDCoCDCoCAmbHQ7c3R5bGUgdHlwZT0idGV4dC9jc3MiJmd0OwogwqAgwqAgwqAgwqAgLnRleHQtbGF5ZXIgewogwqAgwqAgwqAgwqAgwqAgwqAgZm9udC1mYW1pbHk6IE1vbmFjbywgIkNvdXJpZXIgTmV3IiwgbW9ub3NwYWNlOwogwqAgwqAgwqAgwqAgwqAgwqAgZm9udC1zaXplOiAxMnB4OwogwqAgwqAgwqAgwqAgwqAgwqAgY3Vyc29yOiB0ZXh0OwogwqAgwqAgwqAgwqAgfQogwqAgwqAgJmx0Oy9zdHlsZSZndDsKIMKgIMKgICZsdDsvaGVhZCZndDsKIMKgIMKgICZsdDtib2R5Jmd0OwogwqAgwqAgwqAgwqAgJmx0O2gxIHN0eWxlPSJjb2xvcjpyZWQiJmd0O0p1aHUgS2lubmVycyZsdDsvaDEmZ3Q7CiDCoCDCoCAmbHQ7L2JvZHkmZ3Q7ICZsdDsvaHRtbCZndDsKPC9wcmU+JzsKCiRsYW5nWydoZWxwX2Fib3V0X3RpdGxlJ10gPSAiQWJvdXQiOwokbGFuZ1snaGVscF9hYm91dF90ZXh0J10gPSAnPGgzPlN1cHBvcnQ8L2gzPgo8cD5BcyBwZXIgdGhlIEdQTCwgdGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBhcy1pcy4gUGxlYXNlIHJlYWQgdGhlIHRleHQgb2YgdGhlIGxpY2Vuc2UgZm9yIHRoZSBmdWxsIGRpc2NsYWltZXIuPC9wPgo8aDM+Q29weXJpZ2h0IGFuZCBMaWNlbnNlPC9oMz4KPHA+Q29weXJpZ2h0ICZjb3B5OyAyMDEyLCBHb3JhbiBJbGljIDxhIGhyZWY9Im1haWx0bzp1bmlxdTNlQGdtYWlsLmNvbSI+Jmx0O3VuaXF1M2VAZ21haWwuY29tJmd0OzwvYT4gPGEgaHJlZj0iaHR0cDovL3d3dy5pY2gtbWFjaC1kYXMuYXQiIHJlbD0iZXh0ZXJuYWwiPnd3dy5pY2gtbWFjaC1kYXMuYXQ8L2E+LiBBbGwgUmlnaHRzIEFyZSBSZXNlcnZlZC48L3A+CjxwPlRoaXMgbW9kdWxlIGhhcyBiZWVuIHJlbGVhc2VkIHVuZGVyIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwiPkdOVSBQdWJsaWMgTGljZW5zZTwvYT4uIFlvdSBtdXN0IGFncmVlIHRvIHRoaXMgbGljZW5zZSBiZWZvcmUgdXNpbmcgdGhlIG1vZHVsZS48L3A+Cgk8aDM+VGVhbTwvaDM+Cgk8dWw+CgkJPGxpPkdvcmFuIElsaWMgKHVuaXF1MykgZy5pbGljQGktYXJ0cy5ldSA8YnIgLz53d3cuaWNoLW1hY2gtZGFzLmF0PC9saT4JCgkJPGxpPlJvYmVydCBDYW1wYmVsbCAoY2FsZ3V5MTAwMCkgY2FsZ3V5MTAwMEBjbXNtYWRlc2ltcGxlLm9yZyAgPGJyIC8+d3d3LmNhbGd1eTEwMDAuY29tPC9saT4JCQoJCTxsaT5Kb25hdGhhbiBTY2htaWQgKEZvYWx5KikgaGlAam9uYXRoYW5zY2htaWQuZGUgPGJyIC8+d3d3LmpvbmF0aGFuc2NobWlkLmRlPC9saT4KCTwvdWw+Cic7CgovKiAtLS0gQ2hhbmdlbG9nIC0tLSAqLwokbGFuZ1snY2hhbmdlbG9nJ10gPSAiCjxoMz5WZXJzaW9uIDAuMTwvaDM+Cjx1bD4KCTxsaT5JdCdzIGZyZXNoISBOb3RoaW5nIGNoYW5nZWQgeWV0ITwvbGk+Cgk8bGk+VXNpbmcgQWNlIFZlcnNpb24gMC4yLjA8L2xpPgo8L3VsPgo8aDM+VmVyc2lvbiAwLjI8L2gzPgo8dWw+Cgk8bGk+QWRkZWQgQ1RSTC1TIEtleWJpbmRpbmc8L2xpPgoJPGxpPkFkZGVkIEZ1bGxzY3JlZW5tb2RlPC9saT4KCTxsaT5BZGRlZCBGcm9udGVuZCBIaWdobGlnaHRpbmc8L2xpPgoJPGxpPlVwZGF0ZWQgQWNlPC9saT4KPC91bD4KPGgzPlZlcnNpb24gMC4yLjE8L2gzPgo8dWw+Cgk8bGk+QWRkZWQgSW50ZXJuZXQgRXhwbG9yZXIgcHJlZmVyZW5jZTwvbGk+Cgk8bGk+VXBkYXRlZCBBQ0Ugd2l0aCB0aGVtZXM8L2xpPgo8L3VsPgo8aDM+VmVyc2lvbiAwLjIuMjwvaDM+Cjx1bD4KCTxsaT5GaXggZm9yIFNhZmFyaS9NYWM8L2xpPgo8L3VsPgo8aDM+Um9hZG1hcDwvaDM+Cjx1bD4KCTxsaT48ZGVsPkFkZCBGcm9udGVuZCBTeW50YXhoaWdobGlnaHRpbmc8L2RlbD48L2xpPgoJPGxpPjxkZWw+QWRkIEZ1bGxzY3JlZW5tb2RlPC9kZWw+PC9saT4KCTxsaT48ZGVsPkFkZCBLZXliaW5kaW5nIChDVFJMK1MpPC9kZWw+PC9saT4KCTxsaT5BZGQgRWRpdG9yIGJlaGF2aW9yIChWaW0sIEVNYWNzKTwvbGk+Cgk8bGk+TWF5YmUgYWRkIFRvb2xiYXI8L2xpPgo8L3VsPiI7Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/ext/.DS_Store</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[AAAAAUJ1ZDEAABAAAAAIAAAAEAAAAAAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAgLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAACAAAAABAAAAQAAAAAEAAACAAAAAAQAAAQAAAAABAAACAAAAAAEAAAQAAAAAAAAAAAEAABAAAAAAAQAAIAAAAAABAABAAAAAAAEAAIAAAAAAAQABAAAAAAABAAIAAAAAAAEABAAAAAAAAQAIAAAAAAABABAAAAAAAAEAIAAAAAAAAQBAAAAAAAABAIAAAAAAAAEBAAAAAAAAAQIAAAAAAAABBAAAAAAAAAEIAAAAAAAAARAAAAAAAAABIAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAEAsAAABFAAAAJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBERTREIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAYAAAAAAAAAABAAAAgAAAAAEAAAEAAAAAAQAAAgAAAAABAAAEAAAAAAIAAAgAAAAYAAAAAAAAAAABAAAgAAAAAAEAAEAAAAAAAQAAgAAAAAABAAEAAAAAAAEAAgAAAAAAAQAEAAAAAAABAAgAAAAAAAEAEAAAAAAAAQAgAAAAAAABAEAAAAAAAAEAgAAAAAAAAQEAAAAAAAABAgAAAAAAAAEEAAAAAAAAAQgAAAAAAAABEAAAAAAAAAEgAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==]]></data>
	</file>
	<file>
	  <filename>/lang/ext/de_DE.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0FjZUVkaXRvciAnOwokbGFuZ1snYWRtaW5kZXNjcmlwdGlvbiddID0gJ0FjZUVkaXRvciBpc3QgZWluIFN5bnRheGhpZ2hsaWdodGVyIE1vZHVsIGRhcyA8c3Ryb25nPkFjZTwvc3Ryb25nPiwgIGVpbmVuIGVpZ2Vuc3QmYXVtbDtuZGlnZW4gQ29kZS1FZGl0b3IgZ2VzY2hyaWViZW4gbWl0IEphdmFTY3JpcHQgIHZlcndlbmRldC48YnIgLz48c3Ryb25nPkhpbndlaXM6PC9zdHJvbmc+IEludGVybmV0IEV4cGxvcmVyIHdpcmQgenVyemVpdCBuaWNodCB1bnRlcnN0JnV1bWw7enQhJzsKJGxhbmdbJ3NldHRpbmdzX3RhYiddID0gJ0VpbnN0ZWxsdW5nZW4nOwokbGFuZ1snZnJvbnRlbmRzZXR0aW5nc190YWInXSA9ICdGcm9udGVuZCBFaW5zdGVsbHVuZ2VuJzsKJGxhbmdbJ2Zyb250ZW5kX2hlYWRfc2V0dGluZ3MnXSA9ICdGcm9udGVuZCBIZWFkIEVpbnN0ZWxsdW5nZW4nOwokbGFuZ1snZnJvbnRlbmRfc3ludGF4YXJlYV9zZXR0aW5ncyddID0gJ0Zyb250ZW5kIFN5bnRheGJlcmVpY2ggRWluc3RlbGx1bmdlbic7CiRsYW5nWydoZWFkX2Rlc2NyaXB0aW9uJ10gPSAnRGllc2UgRWluc3RlbGx1bmdlbiB3ZXJkZW4gYWxzIFN0YW5kYXJkZWluc3RlbGx1bmdlbiBmJnV1bWw7ciBBY2UgU2tyaXB0ZSB2ZXJ3ZW5kZXQsIGRpZSBpbSA8Y29kZT48aGVhZD48L2NvZGU+IGRlciBTZWl0ZSBlaW5nZWJ1bmRlbiB3ZXJkZW4gd2VubiA8Y29kZT57QWNlRWRpdG9yIGFjdGlvbj0mIzAzOTtoZWFkJiMwMzk7fTwvY29kZT4gaW4gU2VpdGVuc3BlemlmaXNjaGVuIE1ldGEtRGF0ZW4gb2RlciBUZW1wbGF0ZSBhdWZnZXJ1ZmVuIHdpcmQuJzsKJGxhbmdbJ2NvbnRlbnRfZGVzY3JpcHRpb24nXSA9ICdEaWVzZSBFaW5zdGVsbHVuZ2VuIHdlcmRlbiBhbHMgU3RhbmRhcmRlaW5zdGVsbHVuZ2VuIGYmdXVtbDtyIFN5bnRheGhpZ2hsaWdodGVyIEJlcmVpY2ggdmVyd2VuZGV0IHdlbm4gPGNvZGU+e0FjZUVkaXRvciBkaXZpZD0mIzAzOTtlZGl0b3ImIzAzOTt9PC9jb2RlPiB0YWcgaW4gZWluZXIgU2VpdGUgYXVmZ2VydWZlbiB3aXJkLic7CiRsYW5nWydzeW50YXhhcmVhZGVzY3JpcHRpb24nXSA9ICdUaGVzZSBwcmVmZXJlbmNlcyBhcmUgdXNlZCBmb3IgZGVmYXVsdCBzZXR0aW5ncyBvZiBBY2UgYmVoYXZpb3Igd2hlbiBjYWxsaW5nIDxjb2RlPntBY2VFZGl0b3IgZGl2aWQ9JiMwMzk7Zm9vJiMwMzk7fTwvY29kZT4gZnJvbSBhIFBhZ2Ugb3IgVGVtcGxhdGUnOwokbGFuZ1snZXhhbXBsZV9kb2N1bWVudCddID0gJ0Rva3VtZW50JzsKJGxhbmdbJ3dpZHRoX3RpdGxlJ10gPSAnRWRpdG9yIGJyZWl0ZSAoaW4gZW0pJzsKJGxhbmdbJ2hlaWdodF90aXRsZSddID0gJ0VkaXRvciBoJm91bWw7aGUgKGluIGVtKSc7CiRsYW5nWydlbmFibGVfaWUnXSA9ICdGJnV1bWw7ciBJbnRlcm5ldCBFeHBsb3JlciBha3RpdmllcmVuJzsKJGxhbmdbJ3VzZV91bmNvbXByZXNzZWQnXSA9ICdVbmtvbXByaW1pZXJ0IHZlcndlbmRlbic7CiRsYW5nWyd1c2VfdW5jb21wcmVzc2VkX3RleHQnXSA9ICdLJm91bWw7bm50ZSBiZWkgUHJvYmxlbWVuIGltIFNhZmFyaSBoZWxmZW4uJzsKJGxhbmdbJ2VuYWJsZV9pZWRlc2NyaXB0aW9uJ10gPSAnQWNlIFN5bnRheGhpZ2hsaWdodGVyIGZ1bmt0aW9uaWVydCBpbiBJbnRlcm5ldCBFeHBsb3JlciBuaWNodCByaWNodGlnLkFrdGl2aWVyZW4gU2llIGRpZXNlIE9wdGlvbiBhdWYgZWlnZW5lIHZlcmFudHdvcnR1bmchJzsKJGxhbmdbJ2Zyb250ZW5kX3dpZHRoX3RpdGxlJ10gPSAnRnJvbnRlbmQgU3ludGF4YmVyZWljaCBicmVpdGUgKGluIHB4KSc7CiRsYW5nWydmcm9udGVuZF9oZWlnaHRfdGl0bGUnXSA9ICdGcm9udGVuZCBTeW50YXhiZXJlaWNoIGgmb3VtbDtoZSAoaW4gcHgpJzsKJGxhbmdbJ3N5bnRheF9tb2RlJ10gPSAnTW9kdXMnOwokbGFuZ1sndGhlbWVzJ10gPSAnQXVzc2VoZW4nOwokbGFuZ1snZm9udF9zaXplJ10gPSAnU2NocmlmdGdyJm91bWw7JnN6bGlnO2UnOwokbGFuZ1snZnVsbF9saW5lJ10gPSAnR2FuemUgWmVpbGUnOwokbGFuZ1snaGlnaGxpZ2h0X2FjdGl2ZSddID0gJ0FrdGl2ZSBaZWlsZSBtYXJraWVyZW4nOwokbGFuZ1snc2hvd19pbnZpc2libGVzJ10gPSAnWmVpZ2UgdW5zaWNodGJhcmUnOwokbGFuZ1sncGVyc2lzdGVudF9oc2Nyb2xsJ10gPSAnUGVyc2lzdGVudGVzIEhTY3JvbGwnOwokbGFuZ1sna2V5X2JpbmRpbmcnXSA9ICdTY2hsJnV1bWw7c3NlbGJpbmR1bmcnOwokbGFuZ1snc29mdF93cmFwJ10gPSAnU29mdCBXcmFwJzsKJGxhbmdbJ3Nob3dfZ3V0dGVyJ10gPSAnR3V0dGVyIGFuemVpZ2VuJzsKJGxhbmdbJ3ByaW50X21hcmdpbiddID0gJ1ByaW50IE1hcmdpbiBhbnplaWdlbic7CiRsYW5nWydzb2Z0X3RhYiddID0gJ1NvZnQgVGFiIHZlcndlbmRlbic7CiRsYW5nWydoaWdobGlnaHRfc2VsZWN0ZWQnXSA9ICdBdXNnZXcmYXVtbDtobHRlcyBXb3J0IG1hcmtpZXJlbic7CiRsYW5nWydlbmFibGVfYmVoYXZpb3JzJ10gPSAnVmVyaGFsdGVuIGFrdGl2aWVyZW4nOwokbGFuZ1sndGVzdGFyZWF0ZXh0J10gPSAnVm9yc2NoYXUnOwokbGFuZ1snanMnXSA9ICdKYXZhU2NyaXB0ICc7CiRsYW5nWydwbGFpbiddID0gJ1RleHQnOwokbGFuZ1snc3ZnJ10gPSAnU1ZHICc7CiRsYW5nWydodG1sJ10gPSAnSFRNTCAnOwokbGFuZ1snY3NzJ10gPSAnQ1NTICc7CiRsYW5nWydzY3NzJ10gPSAnU0NTUyAnOwokbGFuZ1snY29mZmVlJ10gPSAnQ29mZmVlU2NyaXB0ICc7CiRsYW5nWydqc29uJ10gPSAnSlNPTiAnOwokbGFuZ1sncHl0aG9uJ10gPSAnUHl0aG9uICc7CiRsYW5nWydydWJ5J10gPSAnUnVieSAnOwokbGFuZ1sncGVybCddID0gJ1BlcmwgJzsKJGxhbmdbJ3BocCddID0gJ1BIUCAnOwokbGFuZ1snamF2YSddID0gJ0phdmEgJzsKJGxhbmdbJ2NzaGFycCddID0gJ0MjICc7CiRsYW5nWydjX2NwcCddID0gJ0MrKyAnOwokbGFuZ1snY2xvanVyZSddID0gJ0Nsb2p1cmUgJzsKJGxhbmdbJ29jYW1sJ10gPSAnT0NhbWwgJzsKJGxhbmdbJ3RleHRpbGUnXSA9ICdUZXh0aWxlICc7CiRsYW5nWydncm9vdnknXSA9ICdHcm9vdnkgJzsKJGxhbmdbJ3NjYWxhJ10gPSAnU2NhbGEgJzsKJGxhbmdbJ2Nsb3VkcyddID0gJ0Nsb3VkcyAnOwokbGFuZ1snY2hyb21lJ10gPSAnQ2hyb21lJzsKJGxhbmdbJ2Nsb3Vkc19taWRuaWdodCddID0gJ0Nsb3VkcyBNaWRuaWdodCAnOwokbGFuZ1snY29iYWx0J10gPSAnQ29iYWx0ICc7CiRsYW5nWydjcmltc29uX2VkaXRvciddID0gJ0NyaW1zb24gRWRpdG9yICc7CiRsYW5nWydkYXduJ10gPSAnRGF3biAnOwokbGFuZ1snZHJlYW13ZWF2ZXInXSA9ICdEcmVhbXdlYXZlcic7CiRsYW5nWydlY2xpcHNlJ10gPSAnRWNsaXBzZSAnOwokbGFuZ1snaWRsZV9maW5nZXJzJ10gPSAnaWRsZUZpbmdlcnMgJzsKJGxhbmdbJ2tyX3RoZW1lJ10gPSAna3JUaGVtZSAnOwokbGFuZ1snbWVyYml2b3JlJ10gPSAnTWVyYml2b3JlICc7CiRsYW5nWydtZXJiaXZvcmVfc29mdCddID0gJ01lcmJpdm9yZSBTb2Z0JzsKJGxhbmdbJ21vbm9faW5kdXN0cmlhbCddID0gJ01vbm8gSW5kdXN0cmlhbCc7CiRsYW5nWydtb25va2FpJ10gPSAnTW9ub2thaSc7CiRsYW5nWydwYXN0ZWxfb25fZGFyayddID0gJ1Bhc3RlbCBvbiBkYXJrJzsKJGxhbmdbJ3NvbGFyaXplZF9kYXJrJ10gPSAnU29sYXJpemVkIERhcmsnOwokbGFuZ1snc29sYXJpemVkX2xpZ2h0J10gPSAnU29sYXJpemVkIExpZ2h0JzsKJGxhbmdbJ3RleHRtYXRlJ10gPSAnVGV4dE1hdGUgJzsKJGxhbmdbJ3RvbW9ycm93J10gPSAnVG9tb3Jyb3cnOwokbGFuZ1sndG9tb3Jyb3dfbmlnaHQnXSA9ICdUb21vcnJvdyBOaWdodCc7CiRsYW5nWyd0b21vcnJvd19uaWdodF9icmlnaHQnXSA9ICdUb21vcnJvdyBOaWdodCBCcmlnaHQnOwokbGFuZ1sndG9tb3Jyb3dfbmlnaHRfYmx1ZSddID0gJ1RvbW9ycm93IE5pZ2h0IEJsdWUnOwokbGFuZ1sndG9tb3Jyb3dfbmlnaHRfZWlnaHRpZXMnXSA9ICdUb21vcnJvdyBOaWdodCBFaWdodGllcyc7CiRsYW5nWyd0d2lsaWdodCddID0gJ1R3aWxpZ2h0ICc7CiRsYW5nWyd2aWJyYW50X2luayddID0gJ1ZpYnJhbnQgSW5rICc7CiRsYW5nWydhY2UnXSA9ICdBY2UgJzsKJGxhbmdbJ3ZpbSddID0gJ1ZpbSAnOwokbGFuZ1snZW1hY3MnXSA9ICdFTWFjcyAnOwokbGFuZ1snY3VzdG9tJ10gPSAnQmVudXR6ZXJkZWZpbmllcnQnOwokbGFuZ1snb2ZmJ10gPSAnQXVzJzsKJGxhbmdbJzQwJ10gPSAnNDAgWmVpY2hlbic7CiRsYW5nWyc4MCddID0gJzgwIFplaWNoZW4nOwokbGFuZ1snMTAwJ10gPSAnMTAwIFplaWNoZW4nOwokbGFuZ1snMTQwJ10gPSAnMTQwIFplaWNoZW4nOwokbGFuZ1snc2F2ZXNldHRpbmdzJ10gPSAnRWluc3RlbGx1bmdlbiBzcGVpY2hlcm4nOwokbGFuZ1snc2V0dGluZ3NzYXZlZCddID0gJ0locmUgQWNlRWRpdG9yLUVpbnN0ZWxsdW5nZW4gd3VyZGVuIGdlc3BlaWNoZXJ0JzsKJGxhbmdbJ2Zyb250ZW5kc2V0dGluZ3NzYXZlZCddID0gJ0locmUgQWNlRWRpdG9yIEZyb250ZW5kIGVpbnN0ZWxsdW5nZW4gd3VyZGVuIGdlc3BlaWNoZXJ0JzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnQWNlRWRpdG9yIHd1cmRlaW5zdGFsbGllcnQhIFNldHplbiBTaWUgZGllIEJlcmVjaHRpZ3VuZyAmcXVvdDtNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcyZxdW90OywgdW0gZGllc2VzIE1vZHVsIHZlcndlbmRlbiB6dSBrJm91bWw7bm5lbiEnOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ0FjZUVkaXRvciB3dXJkZSBkZWluc3RhbGxpZXJ0JzsKJGxhbmdbJ3JlYWxseV91bmluc3RhbGwnXSA9ICdXb2xsZW4gU2llIHdpcmtsaWNoIEFjZUVkaXRvciBkZWluc3RhbGxpZXJlbj8gRGVua2VuIFNpZSBub2NobWFsIG5hY2ghJzsKJGxhbmdbJ2hlbHBfcGFyYW1fYWN0aW9uJ10gPSAnd2lyZCB2ZXJ3ZW5kZXQsIHVtIGRpZSBBa3Rpb24gZGVzIE1vZHVsIHRhZ3MgenUgYmVzdGltbWVuLiBNJm91bWw7Z2xpY2hlIHdlcnRlIHNpbmQgJiMwMzk7ZGVmYXVsdCYjMDM5OyB1bmQgJiMwMzk7aGVhZCYjMDM5Oy4gRiZ1dW1sO3IgZGllIGtvcnJla3RlIEZyb250ZW5kIFN5bnRheGhpZ2hsaWdodGluZyBGdW5rdGlvbiBzaW5kIGJlaWRlIGFrdGlvbmVuIG5vdHdlbmRpZ2JlbiZvdW1sO3RpZ3QuIDxiciAvPk0mb3VtbDtnbGljaGUgd2VydGUgc2luZDoNCjx1bD4NCgk8bGk+aGVhZDwvbGk+DQoJPGxpPmRlZmF1bHQ8L2xpPg0KPC91bD4nOwokbGFuZ1snaGVscF9wYXJhbV9tb2RlcyddID0gJ3dpcmQgbWl0IDxjb2RlPntBY2VFZGl0b3IgYWN0aW9uPSYjMDM5O2hlYWQmIzAzOTt9PC9jb2RlPiB2ZXJ3ZW5kZXQuIFNpZSBrJm91bWw7bm5lbiBtZWhyZXJlIGR1cmNoIEtvbW1hIGdldHJlbm50ZSAmIzAzOTttb2RlcyYjMDM5OywgZGllIFNpZSBhdWYgSWhyZXIgV2Vic2l0ZSB2ZXJ3ZW5kZW4gd2VyZGVuLCBhbmdlYmVuLiBEaWVzIHNvbGx0ZSBpbSAmYW1wO2d0O2hlYWQmYW1wO2x0OyBiZXJlaWNoIGRlcyBUZW1wbGF0ZXMgb2RlciB1bnRlciBTZWl0ZW5zcGV6aWZpc2NoZS1NZXRhZGF0ZW4gZWluZ2VnZWJlbiB3ZXJkZW4uIERpZXMgJnV1bWw7YmVyc2NocmVpYnQgSWhyZSBFaW5zdGVsbHVuZ2VuIGRpZSBpbSBNb2R1bCBBZG1pbi1CZXJlaWNoIGF1c2dldyZhdW1sO2hsdCB3dXJkZW4uIDxiciAvPk0mb3VtbDtnbGljaGUgd2VydGUgc2luZDoNCjx1bD4NCgk8bGk+amF2YXNjcmlwdDwvbGk+IA0KCTxsaT5wbGFpbjwvbGk+IA0KCTxsaT5zdmc8L2xpPiANCgk8bGk+aHRtbDwvbGk+DQoJPGxpPmNzczwvbGk+DQoJPGxpPnNjc3M8L2xpPg0KCTxsaT5jb2ZmZWU8L2xpPg0KCTxsaT5qc29uPC9saT4NCgk8bGk+cHl0aG9uPC9saT4NCgk8bGk+cnVieTwvbGk+DQoJPGxpPnBlcmw8L2xpPg0KCTxsaT5waHA8L2xpPg0KCTxsaT5qYXZhPC9saT4NCgk8bGk+Y3NoYXJwPC9saT4NCgk8bGk+Y19jcHA8L2xpPg0KCTxsaT5jbG9qdXJlPC9saT4NCgk8bGk+b2NhbWw8L2xpPg0KCTxsaT50ZXh0aWxlPC9saT4NCgk8bGk+Z3Jvb3Z5PC9saT4NCgk8bGk+c2NhbGE8L2xpPg0KPC91bD4nOwokbGFuZ1snaGVscF9wYXJhbV90aGVtZXMnXSA9ICd3aXJkIG1pdCA8Y29kZT57QWNlRWRpdG9yIGFjdGlvbj0mIzAzOTtoZWFkJiMwMzk7fTwvY29kZT4gdmVyd2VuZGV0LiBTaWUgayZvdW1sO25uZW4gbWVocmVyZSBkdXJjaCBLb21tYSBnZXRyZW5udGUgJiMwMzk7dGhlbWVzJiMwMzk7IChUZW1wbGF0ZXMpLCBkaWUgU2llIGF1ZiBJaHJlciBXZWJzaXRlIHZlcndlbmRlbiB3ZXJkZW4sIGFuZ2ViZW4uIERpZXMgc29sbHRlIGltICZhbXA7Z3Q7aGVhZCZhbXA7bHQ7IGJlcmVpY2ggZGVzIFRlbXBsYXRlcyBvZGVyIHVudGVyIFNlaXRlbnNwZXppZmlzY2hlLU1ldGFkYXRlbiBlaW5nZWdlYmVuIHdlcmRlbi4gRGllcyAmdXVtbDtiZXJzY2hyZWlidCBJaHJlIEVpbnN0ZWxsdW5nZW4gZGllIGltIE1vZHVsIEFkbWluLUJlcmVpY2ggYXVzZ2V3JmF1bWw7aGx0IHd1cmRlbi4gPGJyIC8+TSZvdW1sO2dsaWNoZSB3ZXJ0ZSBzaW5kOg0KPHVsPg0KCTxsaT5jbG91ZHM8L2xpPiANCgk8bGk+Y2xvdWRzX21pZG5pZ2h0PC9saT4gDQoJPGxpPmNvYmFsdDwvbGk+IA0KCTxsaT5jcmltc29uX2VkaXRvcjwvbGk+DQoJPGxpPmRhd248L2xpPg0KCTxsaT5lY2xpcHNlPC9saT4NCgk8bGk+aWRsZV9maW5nZXJzPC9saT4NCgk8bGk+a3JfdGhlbWU8L2xpPg0KCTxsaT5tZXJiaXZvcmU8L2xpPg0KCTxsaT5tZXJiaXZvcmVfc29mdDwvbGk+DQoJPGxpPm1vbm9faW5kdXN0cmlhbDwvbGk+DQoJPGxpPm1vbm9rYWk8L2xpPg0KCTxsaT5wYXN0ZWxfb25fZGFyazwvbGk+DQoJPGxpPnNvbGFyaXplZF9kYXJrPC9saT4NCgk8bGk+c29sYXJpemVkX2xpZ2h0PC9saT4NCgk8bGk+dGV4dG1hdGU8L2xpPg0KCTxsaT50d2lsaWdodDwvbGk+DQoJPGxpPnZpYnJhbnRfaW5rPC9saT4NCjwvdWw+JzsKJGxhbmdbJ2hlbHBfcGFyYW1fbW9kZSddID0gJ3dpcmQgaW5uZXJoYWxiIGVpbmVyIFNlaXRlIG1pdCA8Y29kZT57QWNlRWRpdG9yIGFjdGlvbiA9ICYjMDM5O2RlZmF1bHQmIzAzOTt9PC8gY29kZT4gTW9kdWwtVGFnIHZlcndlbmRldC4gRGFtaXQgd2lyZCBTeW50YXhIaWdobGlnaHRlciBNb2R1cyBmJnV1bWw7ciBha3R1ZWxsZW4gQ29kZS1CZXJlaWNoIGZlc3RnZWxlZ3QuIDxiciAvPiBNJm91bWw7Z2xpY2hlIFdlcnRlIHNpbmQ6DQo8dWw+DQoJPGxpPmphdmFzY3JpcHQ8L2xpPiANCgk8bGk+cGxhaW48L2xpPiANCgk8bGk+c3ZnPC9saT4gDQoJPGxpPmh0bWw8L2xpPg0KCTxsaT5jc3M8L2xpPg0KCTxsaT5zY3NzPC9saT4NCgk8bGk+Y29mZmVlPC9saT4NCgk8bGk+anNvbjwvbGk+DQoJPGxpPnB5dGhvbjwvbGk+DQoJPGxpPnJ1Ynk8L2xpPg0KCTxsaT5wZXJsPC9saT4NCgk8bGk+cGhwPC9saT4NCgk8bGk+amF2YTwvbGk+DQoJPGxpPmNzaGFycDwvbGk+DQoJPGxpPmNfY3BwPC9saT4NCgk8bGk+Y2xvanVyZTwvbGk+DQoJPGxpPm9jYW1sPC9saT4NCgk8bGk+dGV4dGlsZTwvbGk+DQoJPGxpPmdyb292eTwvbGk+DQoJPGxpPnNjYWxhPC9saT4NCjwvdWw+JzsKJGxhbmdbJ2hlbHBfcGFyYW1fdGhlbWUnXSA9ICd3aXJkIGlubmVyaGFsYiBlaW5lciBTZWl0ZSBtaXQgPGNvZGU+e0FjZUVkaXRvciBhY3Rpb24gPSAmIzAzOTtkZWZhdWx0JiMwMzk7fTwvIGNvZGU+IE1vZHVsLVRhZyB2ZXJ3ZW5kZXQuIERhbWl0IHdpcmQgU3ludGF4SGlnaGxpZ2h0ZXIgVGVtcGxhdGUgZiZ1dW1sO3IgYWt0dWVsbGVuIENvZGUtQmVyZWljaCBmZXN0Z2VsZWd0LiA8YnIgLz4gTSZvdW1sO2dsaWNoZSBXZXJ0ZSBzaW5kOg0KPHVsPg0KCTxsaT5jbG91ZHM8L2xpPiANCgk8bGk+Y2xvdWRzX21pZG5pZ2h0PC9saT4gDQoJPGxpPmNvYmFsdDwvbGk+IA0KCTxsaT5jcmltc29uX2VkaXRvcjwvbGk+DQoJPGxpPmRhd248L2xpPg0KCTxsaT5lY2xpcHNlPC9saT4NCgk8bGk+aWRsZV9maW5nZXJzPC9saT4NCgk8bGk+a3JfdGhlbWU8L2xpPg0KCTxsaT5tZXJiaXZvcmU8L2xpPg0KCTxsaT5tZXJiaXZvcmVfc29mdDwvbGk+DQoJPGxpPm1vbm9faW5kdXN0cmlhbDwvbGk+DQoJPGxpPm1vbm9rYWk8L2xpPg0KCTxsaT5wYXN0ZWxfb25fZGFyazwvbGk+DQoJPGxpPnNvbGFyaXplZF9kYXJrPC9saT4NCgk8bGk+c29sYXJpemVkX2xpZ2h0PC9saT4NCgk8bGk+dGV4dG1hdGU8L2xpPg0KCTxsaT50d2lsaWdodDwvbGk+DQoJPGxpPnZpYnJhbnRfaW5rPC9saT4NCjwvdWw+JzsKJGxhbmdbJ2hlbHBfcGFyYW1fd2lkdGgnXSA9ICdiZXN0aW1tdCBkaWUgQnJlaXRlIGRlcyBTeW50YXhoaWdobGlnaHRlciBCZXJlaWNocyBpbiBQaXhlbC4nOwokbGFuZ1snaGVscF9wYXJhbV9oZWlnaHQnXSA9ICdiZXN0aW1tdCBkaWUgSCZvdW1sO2hlIGRlcyBTeW50YXhoaWdobGlnaHRlciBCZXJlaWNocyBpbiBQaXhlbC4nOwokbGFuZ1snaGVscF9wYXJhbV9kaXZpZCddID0gJ2lkIGRlcyBFbGVtZW50cyBtaXQgSWhyZW0gQ29kZS4gVmVyd2VuZGVuIFNpZSBlaW5kZXV0aWdlIElEIGYmdXVtbDtyIGplZGVuIENvZGUgc25pcHBldC4nOwokbGFuZ1snaGVscF9nZW5lcmFsX3RpdGxlJ10gPSAnQWxsZ2VtZWluJzsKJGxhbmdbJ2hlbHBfZ2VuZXJhbF90ZXh0J10gPSAnPGgzPldoYXQgZG9lcyB0aGlzIG1vZHVsZSBkbz88L2gzPg0KPHA+QWNlRWRpdG9yIGlzIGEgU3ludGF4aGlnaGxpZ2h0ZXIgbW9kdWxlIHVzaW5nIDxzdHJvbmc+QWNlPC9zdHJvbmc+IGEgc3RhbmRhbG9uZSBjb2RlIGVkaXRvciB3cml0dGVuIGluIEphdmFTY3JpcHQuPGJyIC8+IA0KR29hbCBvZiBBY2UgY29kZSBlZGl0b3IgZ3JvdXAgaXMgdG8gY3JlYXRlIGEgd2ViIGJhc2VkIGNvZGUgZWRpdG9yIHRoYXQgbWF0Y2hlcyBhbmQgZXh0ZW5kcyB0aGUgZmVhdHVyZXMsIHVzYWJpbGl0eSBhbmQgcGVyZm9ybWFuY2Ugb2YgZXhpc3RpbmcgbmF0aXZlIGVkaXRvcnMgc3VjaCBhcyBUZXh0TWF0ZSwgVmltIG9yIEVjbGlwc2UuPGJyIC8+DQpJdCBjYW4gYmUgZWFzaWx5IGVtYmVkZGVkIGluIGFueSB3ZWIgcGFnZSBhbmQgSmF2YVNjcmlwdCBhcHBsaWNhdGlvbi48YnIgLz4gDQpBY2UgaXMgZGV2ZWxvcGVkIGFzIHRoZSBwcmltYXJ5IGVkaXRvciBmb3IgPGEgaHJlZj0iaHR0cDovL3d3dy5jbG91ZDlpZGUuY29tIj5DbG91ZDkgSURFPC9hPiBhbmQgdGhlIHN1Y2Nlc3NvciBvZiB0aGUgTW96aWxsYSBTa3l3cml0ZXIgKEJlc3BpbikgUHJvamVjdC48L3A+DQo8aDM+QWNlIGlzIGhvc3RlZCBvbiBHaXRIdWI8L2gzPg0KPHA+VGhlIEFjZSBzb3VyY2UgY29kZSBpcyBob3N0ZWQgb24gR2l0SHViLiBJdCBpcyByZWxlYXNlZCB1bmRlciB0aGUgTW96aWxsYSB0cmktbGljZW5zZSAoTVBML0dQTC9MR1BMKS48YnIgLz4NClRoaXMgaXMgdGhlIHNhbWUgbGljZW5zZSB1c2VkIGJ5IEZpcmVmb3guIFRoaXMgbGljZW5zZSBpcyBmcmllbmRseSB0byBhbGwga2luZHMgb2YgcHJvamVjdHMsIHdoZXRoZXIgb3BlbiBzb3VyY2Ugb3Igbm90LjxiciAvPg0KIFRha2UgY2hhcmdlIG9mIHlvdXIgZWRpdG9yIGFuZCBhZGQgeW91ciBmYXZvcml0ZSBsYW5ndWFnZSBoaWdobGlnaHRpbmcgYW5kIGtleWJpbmRpbmdzITwvcD4NCjxoMz5Vc2luZyBBY2VFZGl0b3IgTW9kdWxlPC9oMz4NCjxwPlVzaW5nIEFjZUVkaXRvciBNb2R1bGUgaXMgc2ltcGxlLjxiciAvPg0KQWZ0ZXIgQWNlRWRpdG9yIHdhcyBpbnN0YWxsZWQgZ28gdG8gJnF1b3Q7TXkgUHJlZmVyZW5jZXMgJnJhcXVvOyBVc2VyIFByZWZlcmVuY2VzJnF1b3Q7IGFuZCBjaG9vc2UgQWNlRWRpdG9yIGFzIHlvdXIgU3ludGF4aGlnaGxpZ2h0ZXIgb2YgY2hvaWNlIGZyb20gJnF1b3Q7U2VsZWN0IHN5bnRheCBoaWdobGlnaHRlciB0byB1c2U6JnF1b3Q7IERyb3Bkb3duLjxiciAvPg0KTWFrZSBzdXJlIHlvdSBoYXZlICYjMDM5O01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJiMwMzk7IFBlcm1zaXNzaW9uLjwvcD4NCjxoMz5TZXR0aW5nczwvaDM+DQo8cD5Zb3UgY2FuIGNoYW5nZSBkZWZhdWx0IFNldHRpbmdzIGFuZCBUaGVtZXMgaW4gJnF1b3Q7RXh0ZW5zaW9ucyAmcmFxdW87IEFjZUVkaXRvciZxdW90OzwvcD4nOwokbGFuZ1snaGVscF9rZXlib2FyZHNob3J0Y3V0c190aXRsZSddID0gJ1Rhc3RhdHVyayZ1dW1sO3J6ZWwnOwokbGFuZ1snaGVscF9rZXlib2FyZHNob3J0Y3V0c19jb250ZW50J10gPSAnICAgICAgPGgzPkRlZmF1bHQgS2V5Ym9hcmQgU2hvcnRjdXRzPC9oMz4NCg0KPHRhYmxlIGNsYXNzPSZxdW90O3BhZ2V0YWJsZSZxdW90OyBjZWxsc3BhY2luZz0mcXVvdDswJnF1b3Q7IHN1bW1hcnk9JnF1b3Q7RGVmYXVsdCBLZXlib2FyZCBTaG9ydGN1dHMmcXVvdDs+DQo8dGhlYWQ+PHRyPg0KPHRoPlBDIChXaW5kb3dzL0xpbnV4KTwvdGQ+DQo8dGg+TWFjPC90ZD4NCjx0aD5hY3Rpb248L3RkPg0KPC90cj48L3RoZWFkPg0KPHRib2R5Pg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz48L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1MPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmNlbnRlciBzZWxlY3Rpb248L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1BbHQtRG93bjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLU9wdGlvbi1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmNvcHkgbGluZXMgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGxjYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUFsdC1VcDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLU9wdGlvbi1VcDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5jb3B5IGxpbmVzIHVwPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtRjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLUY8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+ZmluZDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUs8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1HPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmZpbmQgbmV4dDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVNoaWZ0LUs8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1TaGlmdC1HPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmZpbmQgcHJldmlvdXM8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+RG93bjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Eb3duLEN0cmwtTjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5nbyBsaW5lIGRvd248L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+VXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+VXAsQ3RybC1QPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIGxpbmUgdXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1FbmQsQ3RybC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtRW5kLENvbW1hbmQtRG93bjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5nbyB0byBlbmQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+TGVmdDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5MZWZ0LEN0cmwtQjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5nbyB0byBsZWZ0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtTDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLUw8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gdG8gbGluZTwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5BbHQtUmlnaHQsRW5kPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtUmlnaHQsRW5kLEN0cmwtRTwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5nbyB0byBsaW5lIGVuZDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5BbHQtTGVmdCxIb21lPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtTGVmdCxIb21lLEN0cmwtQTwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5nbyB0byBsaW5lIHN0YXJ0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlBhZ2VEb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pk9wdGlvbi1QYWdlRG93bixDdHJsLVY8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gdG8gcGFnZSBkb3duPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlBhZ2VVcDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5PcHRpb24tUGFnZVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIHRvIHBhZ2UgdXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+UmlnaHQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+UmlnaHQsQ3RybC1GPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIHRvIHJpZ2h0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtSG9tZSxDdHJsLVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtSG9tZSxDb21tYW5kLVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIHRvIHN0YXJ0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtTGVmdDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5PcHRpb24tTGVmdDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5nbyB0byB3b3JkIGxlZnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1SaWdodDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5PcHRpb24tUmlnaHQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gdG8gd29yZCByaWdodDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5UYWI8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+VGFiPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmluZGVudDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5BbHQtRG93bjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5PcHRpb24tRG93bjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5tb3ZlIGxpbmVzIGRvd248L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+QWx0LVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pk9wdGlvbi1VcDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5tb3ZlIGxpbmVzIHVwPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LVRhYjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1UYWI8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+b3V0ZGVudDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5JbnNlcnQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+SW5zZXJ0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pm92ZXJ3cml0ZTwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz48L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+UGFnZURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+cGFnZWRvd248L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlBhZ2VVcDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5wYWdldXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1TaGlmdC1aLEN0cmwtWTwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLVNoaWZ0LVosQ29tbWFuZC1ZPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnJlZG88L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1EPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtRDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5yZW1vdmUgbGluZTwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz48L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1LPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnJlbW92ZSB0byBsaW5lIGVuZDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz48L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+T3B0aW9uLUJhY2tzcGFjZTwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5yZW1vdmUgdG8gbGluZXN0YXJ0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5BbHQtQmFja3NwYWNlLEN0cmwtQWx0LUJhY2tzcGFjZTwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5yZW1vdmUgd29yZCBsZWZ0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5BbHQtRGVsZXRlPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnJlbW92ZSB3b3JkIHJpZ2h0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtUjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLU9wdGlvbi1GPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnJlcGxhY2U8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1TaGlmdC1SPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtU2hpZnQtT3B0aW9uLUY8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+cmVwbGFjZSBhbGw8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1BPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtQTwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3QgYWxsPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtRG93bjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3QgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LUxlZnQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IGxlZnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtRW5kPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LUVuZDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3QgbGluZSBlbmQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtSG9tZTwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1Ib21lPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCBsaW5lIHN0YXJ0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LVBhZ2VEb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LVBhZ2VEb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCBwYWdlIGRvd248L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtUGFnZVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LVBhZ2VVcDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3QgcGFnZSB1cDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1SaWdodDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1SaWdodDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3QgcmlnaHQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1TaGlmdC1FbmQsQWx0LVNoaWZ0LURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1TaGlmdC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCB0byBlbmQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+QWx0LVNoaWZ0LVJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtU2hpZnQtUmlnaHQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IHRvIGxpbmUgZW5kPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkFsdC1TaGlmdC1MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtU2hpZnQtTGVmdDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3QgdG8gbGluZSBzdGFydDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVNoaWZ0LUhvbWUsQWx0LVNoaWZ0LVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtU2hpZnQtVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IHRvIHN0YXJ0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCB1cDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVNoaWZ0LUxlZnQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+T3B0aW9uLVNoaWZ0LUxlZnQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IHdvcmQgbGVmdDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVNoaWZ0LVJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pk9wdGlvbi1TaGlmdC1SaWdodDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3Qgd29yZCByaWdodDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz48L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1PPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNwbGl0IGxpbmU8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC03PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtNzwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz50b2dnbGUgY29tbWVudDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1UPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnRyYW5zcG9zZSBsZXR0ZXJzPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtWjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLVo8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+dW5kbzwvdGQ+DQo8L3RyPg0KPC90Ym9keT4NCjwvdGFibGU+JzsKJGxhbmdbJ2hlbHBfZnJvbnRlbmRfdGl0bGUnXSA9ICdGcm9udGVuZCc7CiRsYW5nWydoZWxwX2Zyb250ZW5kX2NvbnRlbnQnXSA9ICc8cD5UaGlzIE1vZHVsZSBhbmQgQWNlIFNjcmlwdCBjYW4gYWxzbyBiZSB1c2VkIGFzIGEgRnJvbnRlbmQgU3ludGF4aGlnaGxpZ2h0ZXIuPGJyIC8+DQpUbyBtYWtlIGl0IHdvcmsgeW91IGhhdmUgdG8gaW5jbHVkZSBqUXVlcnkgRnJhbWV3b3JrLCBmb3IgZXhhbXBsZSB1c2luZyBDTVNNUyB7Y21zX2pxdWVyeX0gdGFnIGFuZCBhcyB3ZWxsIGluY2x1ZGUge0FjZUVkaXRvcn0gaW4geW91ciBwYWdlIHR3aWNlLiBGaXJzdCBhZGQgdGhlIG1vZHVsZSB0YWcgaW4geW91ciA8aGVhZD4gc2VjdGlvbiBvZiBUZW1wbGF0ZSBvciBpbiAmcXVvdDtQYWdlIFNwZWNpZmljIE1ldGRhdGEmcXVvdDsgZmllbGQgb2YgeW91ciBDb250ZW50IHBhZ2UsIGxpa2Uge0FjZUVkaXRvciBhY3Rpb249JiMwMzk7aGVhZCYjMDM5O30gYW5kIGFub3RoZXIgY2FsbCB0byBzcGVjaWZ5IHdoaWNoIGFyZWEgc2hvdWxkIGJlIGhpZ2hsaWdodGVkLCBmb3IgZXhhbXBsZSB7QWNlRWRpdG9yIGRpdmlkPSYjMDM5O2ZvbyYjMDM5O30sIHdoaWNoIHdvdWxkIHRhcmdldCBhIHBhZ2UgZWxlbWVudCB3aXRoIGlkIDxlbT5mb288L2VtPi48L3A+DQo8aDM+U28gaG93IGRvIHlvdSB1c2UgaXQ/PC9oMz4NCjxwPkZpcnN0IGluY2x1ZGUgalF1ZXJ5IGFuZCBNb2R1bGUgdGFnIGluIHlvdXIgUGFnZSA8aGVhZD4gYXJlYSwgZm9yIGV4YW1wbGUgaW4gJnF1b3Q7UGFnZSBTcGVjaWZpYyBNZXRkYXRhJnF1b3Q7OjwvcD4NCgk8cHJlPg0KCXtjbXNfanF1ZXJ5fQ0KCXtBY2VFZGl0b3IgYWN0aW9uPSYjMDM5O2hlYWQmIzAzOTt9DQoJPC9wcmU+DQo8cD5UaGlzIGluY2x1ZGVzIG5lZWRlZCBzY3JpcHRzIGZvciBBY2UgU3ludGF4aGlnaGxpZ2h0ZXIgdG8gd29yay48YnIgLz4NCkluIE1vZHVsZXMgQWRtaW4gaW50ZXJmYWNlIHlvdSBjYW4gc2VsZWN0IGRlZmF1bHQgc2V0dGluZ3MgZm9yIHlvdXIgJiMwMzk7aGVhZCYjMDM5OyBhY3Rpb24gb3IgdXNlIHBhcmFtZXRlciBtb2Rlcz0mIzAzOTtodG1sLGphdmFzY3JpcHQmIzAzOTsgYW5kIHRoZW1lcz0mIzAzOTt0ZXh0bWF0ZSYjMDM5OyB3aGljaCB3b3VsZCBvdmVycmlkZSBzZWxlY3RlZCBQcmVmZXJlbmNlcy48L3A+DQo8cD5Ob3cgd2hlbiB5b3UgaGF2ZSBuZWVkZWQgc2NyaXB0cyBpbmNsdWRlZCwgb25lIG1vcmUgTW9kdWxlIHRhZyBjYWxsIGlzIG5lZWRlZCAoZm9yIGV4YW1wbGUgaW4geW91ciBDb250ZW50IEVkaXRvciBhcmVhKSB0byBzcGVjaWZ5IHdoaWNoIGFyZWEgb2YgeW91ciBQYWdlIHNob3VsZCBiZSBoaWdobGlnaHRlZC48L3A+DQoJPHByZT4NCgl7QWNlRWRpdG9yIGRpdmlkPSYjMDM5O3NvbWUtaWQmIzAzOTt9DQoJPC9wcmU+DQo8cD5UaGlzIHRhZyBpbmNsdWRlcyBuZWVkZWQgU2NyaXB0IGFuZCBTdHlsZSB0aGF0IGlzIHVzZWQgdG8gSGlnaGxpZ2h0IHNlbGVjdGVkIGVsZW1lbnQgd2l0aCBzcGVjaWZpZWQgaWQuPGJyIC8+DQpBbGwgeW91IG5lZWQgdGhlbiBpcyB3cml0ZSB5b3VyIENvZGUgdGhhdCB5b3Ugd2FudCB0byBIaWdobGlnaHQgYW5kIHdyYXAgaXQgaW5zaWRlIGFuIGVsZW1lbiBsaWtlIDxkaXY+IHdpdGggc3BlY2lmaWVkIGlkLjwvcD4nOwokbGFuZ1snaGVscF9mcm9udGVuZF9zYW1wbGUnXSA9ICc8cHJlIGlkPSZxdW90O3NvbWUtaWQmcXVvdDs+DQo8aHRtbD4NCiAmbmJzcDsgJm5ic3A7IDxoZWFkPg0KICZuYnNwOyAmbmJzcDsgPHN0eWxlIHR5cGU9JnF1b3Q7dGV4dC9jc3MmcXVvdDs+DQogJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IC50ZXh0LWxheWVyIHsNCiAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyBmb250LWZhbWlseTogTW9uYWNvLCAmcXVvdDtDb3VyaWVyIE5ldyZxdW90OywgbW9ub3NwYWNlOw0KICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IGZvbnQtc2l6ZTogMTJweDsNCiAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyBjdXJzb3I6IHRleHQ7DQogJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IH0NCiAmbmJzcDsgJm5ic3A7IDwvc3R5bGU+DQogJm5ic3A7ICZuYnNwOyA8L2hlYWQ+DQogJm5ic3A7ICZuYnNwOyA8Ym9keT4NCiAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgPGgxIHN0eWxlPSZxdW90O2NvbG9yOnJlZCZxdW90Oz5KdWh1IEtpbm5lcnM8L2gxPg0KICZuYnNwOyAmbmJzcDsgPC9ib2R5PiA8L2h0bWw+DQo8L3ByZT4NCjwvcHJlPic7CiRsYW5nWydoZWxwX2Fib3V0X3RpdGxlJ10gPSAnJlV1bWw7YmVyJzsKJGxhbmdbJ2hlbHBfYWJvdXRfdGV4dCddID0gJzxoMz5TdXBwb3J0PC9oMz4NCjxwPkFzIHBlciB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGFzLWlzLiBQbGVhc2UgcmVhZCB0aGUgdGV4dCBvZiB0aGUgbGljZW5zZSBmb3IgdGhlIGZ1bGwgZGlzY2xhaW1lci48L3A+DQo8aDM+Q29weXJpZ2h0IGFuZCBMaWNlbnNlPC9oMz4NCjxwPkNvcHlyaWdodCAmY29weTsgMjAxMiwgR29yYW4gSWxpYyA8YSBocmVmPSJtYWlsdG86dW5pcXUzZUBnbWFpbC5jb20iPjx1bmlxdTNlQGdtYWlsLmNvbT48L2E+IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNoLW1hY2gtZGFzLmF0IiByZWw9ImV4dGVybmFsIj53d3cuaWNoLW1hY2gtZGFzLmF0PC9hPi4gQWxsIFJpZ2h0cyBBcmUgUmVzZXJ2ZWQuPC9wPg0KPHA+VGhpcyBtb2R1bGUgaGFzIGJlZW4gcmVsZWFzZWQgdW5kZXIgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCI+R05VIFB1YmxpYyBMaWNlbnNlPC9hPi4gWW91IG11c3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlIGJlZm9yZSB1c2luZyB0aGUgbW9kdWxlLjwvcD4NCgk8aDM+VGVhbTwvaDM+DQoJPHVsPg0KCQk8bGk+R29yYW4gSWxpYyAodW5pcXUzKSBnLmlsaWNAaS1hcnRzLmV1IDxiciAvPnd3dy5pY2gtbWFjaC1kYXMuYXQ8L2xpPgkNCgkJPGxpPlJvYmVydCBDYW1wYmVsbCAoY2FsZ3V5MTAwMCkgY2FsZ3V5MTAwMEBjbXNtYWRlc2ltcGxlLm9yZyAgPGJyIC8+d3d3LmNhbGd1eTEwMDAuY29tPC9saT4JCQ0KCQk8bGk+Sm9uYXRoYW4gU2NobWlkIChGb2FseSopIGhpQGpvbmF0aGFuc2NobWlkLmRlIDxiciAvPnd3dy5qb25hdGhhbnNjaG1pZC5kZTwvbGk+DQoJPC91bD4NCic7CiRsYW5nWydjaGFuZ2Vsb2cnXSA9ICc8aDM+VmVyc2lvbiAwLjE8L2gzPg0KPHVsPg0KCTxsaT5JdCYjMDM5O3MgZnJlc2ghIE5vdGhpbmcgY2hhbmdlZCB5ZXQhPC9saT4NCgk8bGk+VXNpbmcgQWNlIFZlcnNpb24gMC4yLjA8L2xpPg0KPC91bD4NCjxoMz5WZXJzaW9uIDAuMjwvaDM+DQo8dWw+DQoJPGxpPkFkZGVkIENUUkwtUyBLZXliaW5kaW5nPC9saT4NCgk8bGk+QWRkZWQgRnVsbHNjcmVlbm1vZGU8L2xpPg0KCTxsaT5BZGRlZCBGcm9udGVuZCBIaWdobGlnaHRpbmc8L2xpPg0KCTxsaT5VcGRhdGVkIEFjZTwvbGk+DQo8L3VsPg0KPGgzPlZlcnNpb24gMC4yLjE8L2gzPg0KPHVsPg0KCTxsaT5BZGRlZCBJbnRlcm5ldCBFeHBsb3JlciBwcmVmZXJlbmNlPC9saT4NCgk8bGk+VXBkYXRlZCBBQ0Ugd2l0aCB0aGVtZXM8L2xpPg0KPC91bD4NCjxoMz5Sb2FkbWFwPC9oMz4NCjx1bD4NCgk8bGk+PGRlbD5BZGQgRnJvbnRlbmQgU3ludGF4aGlnaGxpZ2h0aW5nPC9kZWw+PC9saT4NCgk8bGk+PGRlbD5BZGQgRnVsbHNjcmVlbm1vZGU8L2RlbD48L2xpPg0KCTxsaT48ZGVsPkFkZCBLZXliaW5kaW5nIChDVFJMK1MpPC9kZWw+PC9saT4NCgk8bGk+QWRkIEVkaXRvciBiZWhhdmlvciAoVmltLCBFTWFjcyk8L2xpPg0KCTxsaT5NYXliZSBhZGQgVG9vbGJhcjwvbGk+DQo8L3VsPic7CiRsYW5nWyd1dG1iJ10gPSAnMTU2ODYxMzUzLjEuMTAuMTMyNzQ5Njg5Mic7CiRsYW5nWyd1dG1hJ10gPSAnMTU2ODYxMzUzLjgwMTg1Njc0OC4xMzI3NDkyNDMyLjEzMjc0OTI0MzIuMTMyNzQ5Njg5Mi4yJzsKJGxhbmdbJ3V0bWMnXSA9ICcxNTY4NjEzNTMnOwokbGFuZ1sndXRteiddID0gJzE1Njg2MTM1My4xMzI3NDkyNDMyLjEuMS51dG1jc3I9ZGV2LmNtc21hZGVzaW1wbGUub3JnfHV0bWNjbj0ocmVmZXJyYWwpfHV0bWNtZD1yZWZlcnJhbHx1dG1jY3Q9Lyc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/fr_FR.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0FjZUVkaXRvcic7CiRsYW5nWydhZG1pbmRlc2NyaXB0aW9uJ10gPSAnQWNlRWRpdG9yIGlzIGEgU3ludGF4aGlnaGxpZ2h0ZXIgbW9kdWxlIHVzaW5nIDxzdHJvbmc+QWNlPC9zdHJvbmc+IGEgc3RhbmRhbG9uZSBjb2RlIGVkaXRvciB3cml0dGVuIGluIEphdmFTY3JpcHQuPGJyIC8+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBJbnRlcm5ldCBFeHBsb3JlciBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCEnOwokbGFuZ1snc2V0dGluZ3NfdGFiJ10gPSAnUHImZWFjdXRlO2YmZWFjdXRlO3JlbmNlcyc7CiRsYW5nWydmcm9udGVuZHNldHRpbmdzX3RhYiddID0gJ1ByJmVhY3V0ZTtmJmVhY3V0ZTtyZW5jZXMgZHUgRnJvbnRlbmQnOwokbGFuZ1snZnJvbnRlbmRfaGVhZF9zZXR0aW5ncyddID0gJ0Zyb250ZW5kIEhlYWQgUHJlZmVyZW5jZXMnOwokbGFuZ1snZnJvbnRlbmRfc3ludGF4YXJlYV9zZXR0aW5ncyddID0gJ0Zyb250ZW5kIFN5bnRheGFyZWEgUHJlZmVyZW5jZXMnOwokbGFuZ1snaGVhZF9kZXNjcmlwdGlvbiddID0gJ1RoZXNlIHByZWZlcmVuY2VzIGFyZSB1c2VkIGZvciBkZWZhdWx0IHNldHRpbmdzIG9mIEFjZSBzY3JpcHRzIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHBhZ2UgPGNvZGU+PGhlYWQ+PC9jb2RlPiB3aGVuIGNhbGxpbmcgPGNvZGU+e0FjZUVkaXRvciBhY3Rpb249JiMwMzk7aGVhZCYjMDM5O308L2NvZGU+IGZyb20gUGFnZSBTcGVjaWZpYyBNZXRhZGF0YSBvciBUZW1wbGF0ZS4nOwokbGFuZ1snY29udGVudF9kZXNjcmlwdGlvbiddID0gJ1RoZXNlIHByZWZlcmVuY2VzIGFyZSB1c2VkIGZvciBkZWZhdWx0IHNldHRpbmdzIG9mIFN5bnRheGhpZ2hsaWdodGluZyBhcmVhIHdoZW4gY2FsbGluZyA8Y29kZT57QWNlRWRpdG9yIGRpdmlkPSYjMDM5O2VkaXRvciYjMDM5O308L2NvZGU+IHRhZyB3aXRoaW4gYSBQYWdlLic7CiRsYW5nWydzeW50YXhhcmVhZGVzY3JpcHRpb24nXSA9ICdUaGVzZSBwcmVmZXJlbmNlcyBhcmUgdXNlZCBmb3IgZGVmYXVsdCBzZXR0aW5ncyBvZiBBY2UgYmVoYXZpb3Igd2hlbiBjYWxsaW5nIDxjb2RlPntBY2VFZGl0b3IgZGl2aWQ9JiMwMzk7Zm9vJiMwMzk7fTwvY29kZT4gZnJvbSBhIFBhZ2Ugb3IgVGVtcGxhdGUnOwokbGFuZ1snZXhhbXBsZV9kb2N1bWVudCddID0gJ0RvY3VtZW50JzsKJGxhbmdbJ3dpZHRoX3RpdGxlJ10gPSAnRWRpdG9yIHdpZHRoIChpbiBlbSknOwokbGFuZ1snaGVpZ2h0X3RpdGxlJ10gPSAnRWRpdG9yIGhlaWdodCAoaW4gZW0pJzsKJGxhbmdbJ2Zyb250ZW5kX3dpZHRoX3RpdGxlJ10gPSAnRnJvbnRlbmQgU3ludGF4YXJlYSB3aWR0aCAoaW4gcHgpJzsKJGxhbmdbJ2Zyb250ZW5kX2hlaWdodF90aXRsZSddID0gJ0Zyb250ZW5kIFN5bnRheGFyZWEgaGVpZ2h0IChpbiBweCknOwokbGFuZ1snc3ludGF4X21vZGUnXSA9ICdNb2RlJzsKJGxhbmdbJ3RoZW1lcyddID0gJ1RoZW1lJzsKJGxhbmdbJ2ZvbnRfc2l6ZSddID0gJ0ZvbnQgU2l6ZSc7CiRsYW5nWydmdWxsX2xpbmUnXSA9ICdGdWxsIExpbmUgU2VsZWN0aW9uJzsKJGxhbmdbJ2hpZ2hsaWdodF9hY3RpdmUnXSA9ICdIaWdobGlnaHQgQWN0aXZlIExpbmUnOwokbGFuZ1snc2hvd19pbnZpc2libGVzJ10gPSAnU2hvdyBJbnZpc2libGVzJzsKJGxhbmdbJ3BlcnNpc3RlbnRfaHNjcm9sbCddID0gJ1BlcnNpdGVudCBIU2Nyb2xsJzsKJGxhbmdbJ2tleV9iaW5kaW5nJ10gPSAnS2V5IEJpbmRpbmcnOwokbGFuZ1snc29mdF93cmFwJ10gPSAnU29mdCBXcmFwJzsKJGxhbmdbJ3Nob3dfZ3V0dGVyJ10gPSAnU2hvdyBHdXR0ZXInOwokbGFuZ1sncHJpbnRfbWFyZ2luJ10gPSAnU2hvdyBQcmludCBNYXJnaW4nOwokbGFuZ1snc29mdF90YWInXSA9ICdVc2UgU29mdCBUYWInOwokbGFuZ1snaGlnaGxpZ2h0X3NlbGVjdGVkJ10gPSAnSGlnaGxpZ2h0IHNlbGVjdGVkIHdvcmQnOwokbGFuZ1snZW5hYmxlX2JlaGF2aW9ycyddID0gJ0VuYWJsZSBCZWhhdmlvcnMnOwokbGFuZ1sndGVzdGFyZWF0ZXh0J10gPSAnUHJldmlldyc7CiRsYW5nWydqcyddID0gJ0phdmFTY3JpcHQnOwokbGFuZ1sncGxhaW4nXSA9ICdQbGFpbiBUZXh0JzsKJGxhbmdbJ3N2ZyddID0gJ1NWRyc7CiRsYW5nWydodG1sJ10gPSAnSFRNTCc7CiRsYW5nWydjc3MnXSA9ICdDU1MnOwokbGFuZ1snc2NzcyddID0gJ1NDU1MnOwokbGFuZ1snY29mZmVlJ10gPSAnQ29mZmVlU2NyaXB0JzsKJGxhbmdbJ2pzb24nXSA9ICdKU09OJzsKJGxhbmdbJ3B5dGhvbiddID0gJ1B5dGhvbic7CiRsYW5nWydydWJ5J10gPSAnUnVieSc7CiRsYW5nWydwZXJsJ10gPSAnUGVybCc7CiRsYW5nWydwaHAnXSA9ICdQSFAnOwokbGFuZ1snamF2YSddID0gJ0phdmEnOwokbGFuZ1snY3NoYXJwJ10gPSAnQyMnOwokbGFuZ1snY19jcHAnXSA9ICdDKysnOwokbGFuZ1snY2xvanVyZSddID0gJ0Nsb2p1cmUnOwokbGFuZ1snb2NhbWwnXSA9ICdPQ2FtbCc7CiRsYW5nWyd0ZXh0aWxlJ10gPSAnVGV4dGlsZSc7CiRsYW5nWydncm9vdnknXSA9ICdHcm9vdnknOwokbGFuZ1snc2NhbGEnXSA9ICdTY2FsYSc7CiRsYW5nWydjbG91ZHMnXSA9ICdDbG91ZHMnOwokbGFuZ1snY2hyb21lJ10gPSAnQ2hyb21lJzsKJGxhbmdbJ2Nsb3Vkc19taWRuaWdodCddID0gJ0Nsb3VkcyBNaWRuaWdodCc7CiRsYW5nWydjb2JhbHQnXSA9ICdDb2JhbHQnOwokbGFuZ1snY3JpbXNvbl9lZGl0b3InXSA9ICdDcmltc29uIEVkaXRvcic7CiRsYW5nWydkYXduJ10gPSAnRGF3bic7CiRsYW5nWydkcmVhbXdlYXZlciddID0gJ0RyZWFtd2VhdmVyJzsKJGxhbmdbJ2VjbGlwc2UnXSA9ICdFY2xpcHNlJzsKJGxhbmdbJ2lkbGVfZmluZ2VycyddID0gJ2lkbGVGaW5nZXJzJzsKJGxhbmdbJ2tyX3RoZW1lJ10gPSAna3JUaGVtZSc7CiRsYW5nWydtZXJiaXZvcmUnXSA9ICdNZXJiaXZvcmUnOwokbGFuZ1snbWVyYml2b3JlX3NvZnQnXSA9ICdNZXJiaXZvcmUgU29mdCc7CiRsYW5nWydtb25vX2luZHVzdHJpYWwnXSA9ICdNb25vIEluZHVzdHJpYWwnOwokbGFuZ1snbW9ub2thaSddID0gJ01vbm9rYWknOwokbGFuZ1sncGFzdGVsX29uX2RhcmsnXSA9ICdQYXN0ZWwgb24gZGFyayc7CiRsYW5nWydzb2xhcml6ZWRfZGFyayddID0gJ1NvbGFyaXplZCBEYXJrJzsKJGxhbmdbJ3NvbGFyaXplZF9saWdodCddID0gJ1NvbGFyaXplZCBMaWdodCc7CiRsYW5nWyd0ZXh0bWF0ZSddID0gJ1RleHRNYXRlJzsKJGxhbmdbJ3R3aWxpZ2h0J10gPSAnVHdpbGlnaHQnOwokbGFuZ1sndmlicmFudF9pbmsnXSA9ICdWaWJyYW50IEluayc7CiRsYW5nWydhY2UnXSA9ICdBY2UnOwokbGFuZ1sndmltJ10gPSAnVmltJzsKJGxhbmdbJ2VtYWNzJ10gPSAnRU1hY3MnOwokbGFuZ1snY3VzdG9tJ10gPSAnQ3VzdG9tJzsKJGxhbmdbJ29mZiddID0gJ09mZic7CiRsYW5nWyc0MCddID0gJzQwIENoYXJzJzsKJGxhbmdbJzgwJ10gPSAnODAgQ2hhcnMnOwokbGFuZ1snMTAwJ10gPSAnMTAwIENoYXJzJzsKJGxhbmdbJ2ZyZWUnXSA9ICdGcmVlJzsKJGxhbmdbJ3NhdmVzZXR0aW5ncyddID0gJ1NhdmUgUHJlZmVyZW5jZXMnOwokbGFuZ1snc2V0dGluZ3NzYXZlZCddID0gJ1lvdXIgQWNlRWRpdG9yIHNldHRpbmdzIGhhdmUgYmVlbiBzYXZlZCc7CiRsYW5nWydmcm9udGVuZHNldHRpbmdzc2F2ZWQnXSA9ICdZb3VyIEFjZUVkaXRvciBGcm9udGVuZCBzZXR0aW5ncyBoYXZlIGJlZW4gc2F2ZWQnOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICdBY2VFZGl0b3IgU3VjY2Vzc2Z1bGx5IEluc3RhbGxlZCEgU2V0ICZxdW90O01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJnF1b3Q7IHBlcm1pc3Npb25zIHRvIHVzZSB0aGlzIG1vZHVsZSEnOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ0FjZUVkaXRvciBTdWNjZXNzZnVsbHkgVW5pbnN0YWxsZWQnOwokbGFuZ1sncmVhbGx5X3VuaW5zdGFsbCddID0gJ1JlYWxseT8gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHVuaW5zdGFsbCBBY2VFZGl0b3I/IFRoaW5rIGFnYWluISc7CiRsYW5nWydoZWxwX3BhcmFtX2FjdGlvbiddID0gJ2lzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBhY3Rpb24gb2YgTW9kdWxlIHRhZy4gUG9zc2libGUgdmFsdWVzIGFyZSAmIzAzOTtkZWZhdWx0JiMwMzk7IGFuZCAmIzAzOTtoZWFkJiMwMzk7LiBCb3RoIGFyZSBuZWVkZWQgZm9yIGNvcnJlY3QgRnJvbnRlbmQgU3ludGF4aGlnaGxpZ2h0aW5nIGZ1bmN0aW9uLiA8YnIgLz5Qb3NzaWJsZSB2YWx1ZXMgYXJlOg0KPHVsPg0KCTxsaT5oZWFkPC9saT4NCgk8bGk+ZGVmYXVsdDwvbGk+DQo8L3VsPic7CiRsYW5nWydoZWxwX3BhcmFtX21vZGVzJ10gPSAnaXMgdXNlZCB3aXRoIDxjb2RlPntBY2VFZGl0b3IgYWN0aW9uPSYjMDM5O2hlYWQmIzAzOTt9PC9jb2RlPi4gWW91IGNhbiBpbmNsdWRlIG11bHRpcGxlIGNvbW1hIHNlcGFyYXRlZCAmIzAzOTttb2RlcyYjMDM5OyB0aGF0IHlvdSB3aWxsIGJlIHVzaW5nIG9uIHlvdXIgd2Vic2l0ZS4gVGhpcyBzaG91bGQgYmUgaW5jbHVkZWQgaW4geW91ciA8aGVhZD4gb2YgVGVtcGxhdGUgb3IgUGFnZSBzcGVjaWZpYyBNZXRhZGF0YS4gVGhpcyB3aWxsIG92ZXJyaWRlIHlvdSBQcmVmZXJlbmNlcyBzZWxlY3RlZCBpbiBNb2R1bGUgQWRtaW4gYXJlYS4gPGJyIC8+UG9zc2libGUgdmFsdWVzIGFyZToNCjx1bD4NCgk8bGk+amF2YXNjcmlwdDwvbGk+IA0KCTxsaT5wbGFpbjwvbGk+IA0KCTxsaT5zdmc8L2xpPiANCgk8bGk+aHRtbDwvbGk+DQoJPGxpPmNzczwvbGk+DQoJPGxpPnNjc3M8L2xpPg0KCTxsaT5jb2ZmZWU8L2xpPg0KCTxsaT5qc29uPC9saT4NCgk8bGk+cHl0aG9uPC9saT4NCgk8bGk+cnVieTwvbGk+DQoJPGxpPnBlcmw8L2xpPg0KCTxsaT5waHA8L2xpPg0KCTxsaT5qYXZhPC9saT4NCgk8bGk+Y3NoYXJwPC9saT4NCgk8bGk+Y19jcHA8L2xpPg0KCTxsaT5jbG9qdXJlPC9saT4NCgk8bGk+b2NhbWw8L2xpPg0KCTxsaT50ZXh0aWxlPC9saT4NCgk8bGk+Z3Jvb3Z5PC9saT4NCgk8bGk+c2NhbGE8L2xpPg0KPC91bD4nOwokbGFuZ1snaGVscF9wYXJhbV90aGVtZXMnXSA9ICdpcyB1c2VkIHdpdGggPGNvZGU+e0FjZUVkaXRvciBhY3Rpb249JiMwMzk7aGVhZCYjMDM5O308L2NvZGU+LiBZb3UgY2FuIGluY2x1ZGUgbXVsdGlwbGUgY29tbWEgc2VwYXJhdGVkICYjMDM5O3RoZW1lcyYjMDM5OyB0aGF0IHlvdSB3aWxsIGJlIHVzaW5nIG9uIHlvdXIgd2Vic2l0ZS4gVGhpcyBzaG91bGQgYmUgaW5jbHVkZWQgaW4geW91ciA8aGVhZD4gb2YgVGVtcGxhdGUgb3IgUGFnZSBzcGVjaWZpYyBNZXRhZGF0YS4gVGhpcyB3aWxsIG92ZXJyaWRlIHlvdSBQcmVmZXJlbmNlcyBzZWxlY3RlZCBpbiBNb2R1bGUgQWRtaW4gYXJlYS4gPGJyIC8+UG9zc2libGUgdmFsdWVzIGFyZToNCjx1bD4NCgk8bGk+Y2xvdWRzPC9saT4gDQoJPGxpPmNsb3Vkc19taWRuaWdodDwvbGk+IA0KCTxsaT5jb2JhbHQ8L2xpPiANCgk8bGk+Y3JpbXNvbl9lZGl0b3I8L2xpPg0KCTxsaT5kYXduPC9saT4NCgk8bGk+ZWNsaXBzZTwvbGk+DQoJPGxpPmlkbGVfZmluZ2VyczwvbGk+DQoJPGxpPmtyX3RoZW1lPC9saT4NCgk8bGk+bWVyYml2b3JlPC9saT4NCgk8bGk+bWVyYml2b3JlX3NvZnQ8L2xpPg0KCTxsaT5tb25vX2luZHVzdHJpYWw8L2xpPg0KCTxsaT5tb25va2FpPC9saT4NCgk8bGk+cGFzdGVsX29uX2Rhcms8L2xpPg0KCTxsaT5zb2xhcml6ZWRfZGFyazwvbGk+DQoJPGxpPnNvbGFyaXplZF9saWdodDwvbGk+DQoJPGxpPnRleHRtYXRlPC9saT4NCgk8bGk+dHdpbGlnaHQ8L2xpPg0KCTxsaT52aWJyYW50X2luazwvbGk+DQo8L3VsPic7CiRsYW5nWydoZWxwX3BhcmFtX21vZGUnXSA9ICdpcyB1c2VkIHdpdGhpbiBhIHBhZ2Ugd2l0aCA8Y29kZT57QWNlRWRpdG9yIGFjdGlvbj0mIzAzOTtkZWZhdWx0JiMwMzk7fTwvY29kZT4gbW9kdWxlIHRhZy4gVGhpcyBzcGVjaWZpZXMgU3ludGF4aGlnaGxpZ2h0ZXIgbW9kZSBmb3Igc3BlY2lmaWMgY29kZSBhcmVhLiA8YnIgLz5Qb3NzaWJsZSB2YWx1ZXMgYXJlOg0KPHVsPg0KCTxsaT5qYXZhc2NyaXB0PC9saT4gDQoJPGxpPnBsYWluPC9saT4gDQoJPGxpPnN2ZzwvbGk+IA0KCTxsaT5odG1sPC9saT4NCgk8bGk+Y3NzPC9saT4NCgk8bGk+c2NzczwvbGk+DQoJPGxpPmNvZmZlZTwvbGk+DQoJPGxpPmpzb248L2xpPg0KCTxsaT5weXRob248L2xpPg0KCTxsaT5ydWJ5PC9saT4NCgk8bGk+cGVybDwvbGk+DQoJPGxpPnBocDwvbGk+DQoJPGxpPmphdmE8L2xpPg0KCTxsaT5jc2hhcnA8L2xpPg0KCTxsaT5jX2NwcDwvbGk+DQoJPGxpPmNsb2p1cmU8L2xpPg0KCTxsaT5vY2FtbDwvbGk+DQoJPGxpPnRleHRpbGU8L2xpPg0KCTxsaT5ncm9vdnk8L2xpPg0KCTxsaT5zY2FsYTwvbGk+DQo8L3VsPic7CiRsYW5nWydoZWxwX3BhcmFtX3RoZW1lJ10gPSAnaXMgdXNlZCB3aXRoaW4gYSBwYWdlIHdpdGggPGNvZGU+e0FjZUVkaXRvciBhY3Rpb249JiMwMzk7ZGVmYXVsdCYjMDM5O308L2NvZGU+IG1vZHVsZSB0YWcuIFRoaXMgc3BlY2lmaWVzIFN5bnRheGhpZ2hsaWdodGVyIHRoZW1lIGZvciBzcGVjaWZpYyBjb2RlIGFyZWEuIDxiciAvPlBvc3NpYmxlIHZhbHVlcyBhcmU6DQo8dWw+DQoJPGxpPmNsb3VkczwvbGk+IA0KCTxsaT5jbG91ZHNfbWlkbmlnaHQ8L2xpPiANCgk8bGk+Y29iYWx0PC9saT4gDQoJPGxpPmNyaW1zb25fZWRpdG9yPC9saT4NCgk8bGk+ZGF3bjwvbGk+DQoJPGxpPmVjbGlwc2U8L2xpPg0KCTxsaT5pZGxlX2ZpbmdlcnM8L2xpPg0KCTxsaT5rcl90aGVtZTwvbGk+DQoJPGxpPm1lcmJpdm9yZTwvbGk+DQoJPGxpPm1lcmJpdm9yZV9zb2Z0PC9saT4NCgk8bGk+bW9ub19pbmR1c3RyaWFsPC9saT4NCgk8bGk+bW9ub2thaTwvbGk+DQoJPGxpPnBhc3RlbF9vbl9kYXJrPC9saT4NCgk8bGk+c29sYXJpemVkX2Rhcms8L2xpPg0KCTxsaT5zb2xhcml6ZWRfbGlnaHQ8L2xpPg0KCTxsaT50ZXh0bWF0ZTwvbGk+DQoJPGxpPnR3aWxpZ2h0PC9saT4NCgk8bGk+dmlicmFudF9pbms8L2xpPg0KPC91bD4nOwokbGFuZ1snaGVscF9wYXJhbV93aWR0aCddID0gJ3NwZWNpZmllcyB3aWR0aCBvZiBTeW50YXhoaWdobGlnaHRlciBhcmVhIGluIHBpeGVsLic7CiRsYW5nWydoZWxwX3BhcmFtX2hlaWdodCddID0gJ3NwZWNpZmllcyBoZWlnaHQgb2YgU3ludGF4aGlnaGxpZ2h0ZXIgYXJlYSBpbiBwaXhlbC4nOwokbGFuZ1snaGVscF9wYXJhbV9kaXZpZCddID0gJ2lkIG9mIHRoZSBlbGVtZW50IGNvbnRhaW5pbmcgeW91ciBjb2RlLiBVc2UgdW5pcXVlIGlkIGZvciBlYWNoIGNvZGUgY2h1bmNrLic7CiRsYW5nWydoZWxwX2dlbmVyYWxfdGl0bGUnXSA9ICdHZW5lcmFsJzsKJGxhbmdbJ2hlbHBfZ2VuZXJhbF90ZXh0J10gPSAnPGgzPldoYXQgZG9lcyB0aGlzIG1vZHVsZSBkbz88L2gzPg0KPHA+QWNlRWRpdG9yIGlzIGEgU3ludGF4aGlnaGxpZ2h0ZXIgbW9kdWxlIHVzaW5nIDxzdHJvbmc+QWNlPC9zdHJvbmc+IGEgc3RhbmRhbG9uZSBjb2RlIGVkaXRvciB3cml0dGVuIGluIEphdmFTY3JpcHQuPGJyIC8+IA0KR29hbCBvZiBBY2UgY29kZSBlZGl0b3IgZ3JvdXAgaXMgdG8gY3JlYXRlIGEgd2ViIGJhc2VkIGNvZGUgZWRpdG9yIHRoYXQgbWF0Y2hlcyBhbmQgZXh0ZW5kcyB0aGUgZmVhdHVyZXMsIHVzYWJpbGl0eSBhbmQgcGVyZm9ybWFuY2Ugb2YgZXhpc3RpbmcgbmF0aXZlIGVkaXRvcnMgc3VjaCBhcyBUZXh0TWF0ZSwgVmltIG9yIEVjbGlwc2UuPGJyIC8+DQpJdCBjYW4gYmUgZWFzaWx5IGVtYmVkZGVkIGluIGFueSB3ZWIgcGFnZSBhbmQgSmF2YVNjcmlwdCBhcHBsaWNhdGlvbi48YnIgLz4gDQpBY2UgaXMgZGV2ZWxvcGVkIGFzIHRoZSBwcmltYXJ5IGVkaXRvciBmb3IgPGEgaHJlZj0iaHR0cDovL3d3dy5jbG91ZDlpZGUuY29tIj5DbG91ZDkgSURFPC9hPiBhbmQgdGhlIHN1Y2Nlc3NvciBvZiB0aGUgTW96aWxsYSBTa3l3cml0ZXIgKEJlc3BpbikgUHJvamVjdC48L3A+DQo8aDM+QWNlIGlzIGhvc3RlZCBvbiBHaXRIdWI8L2gzPg0KPHA+VGhlIEFjZSBzb3VyY2UgY29kZSBpcyBob3N0ZWQgb24gR2l0SHViLiBJdCBpcyByZWxlYXNlZCB1bmRlciB0aGUgTW96aWxsYSB0cmktbGljZW5zZSAoTVBML0dQTC9MR1BMKS48YnIgLz4NClRoaXMgaXMgdGhlIHNhbWUgbGljZW5zZSB1c2VkIGJ5IEZpcmVmb3guIFRoaXMgbGljZW5zZSBpcyBmcmllbmRseSB0byBhbGwga2luZHMgb2YgcHJvamVjdHMsIHdoZXRoZXIgb3BlbiBzb3VyY2Ugb3Igbm90LjxiciAvPg0KIFRha2UgY2hhcmdlIG9mIHlvdXIgZWRpdG9yIGFuZCBhZGQgeW91ciBmYXZvcml0ZSBsYW5ndWFnZSBoaWdobGlnaHRpbmcgYW5kIGtleWJpbmRpbmdzITwvcD4NCjxoMz5Vc2luZyBBY2VFZGl0b3IgTW9kdWxlPC9oMz4NCjxwPlVzaW5nIEFjZUVkaXRvciBNb2R1bGUgaXMgc2ltcGxlLjxiciAvPg0KQWZ0ZXIgQWNlRWRpdG9yIHdhcyBpbnN0YWxsZWQgZ28gdG8gJnF1b3Q7TXkgUHJlZmVyZW5jZXMgJnJhcXVvOyBVc2VyIFByZWZlcmVuY2VzJnF1b3Q7IGFuZCBjaG9vc2UgQWNlRWRpdG9yIGFzIHlvdXIgU3ludGF4aGlnaGxpZ2h0ZXIgb2YgY2hvaWNlIGZyb20gJnF1b3Q7U2VsZWN0IHN5bnRheCBoaWdobGlnaHRlciB0byB1c2U6JnF1b3Q7IERyb3Bkb3duLjxiciAvPg0KTWFrZSBzdXJlIHlvdSBoYXZlICYjMDM5O01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJiMwMzk7IFBlcm1zaXNzaW9uLjwvcD4NCjxoMz5TZXR0aW5nczwvaDM+DQo8cD5Zb3UgY2FuIGNoYW5nZSBkZWZhdWx0IFNldHRpbmdzIGFuZCBUaGVtZXMgaW4gJnF1b3Q7RXh0ZW5zaW9ucyAmcmFxdW87IEFjZUVkaXRvciZxdW90OzwvcD4nOwokbGFuZ1snaGVscF9rZXlib2FyZHNob3J0Y3V0c190aXRsZSddID0gJ0tleWJvYXJkIFNob3J0Y3V0cyc7CiRsYW5nWydoZWxwX2tleWJvYXJkc2hvcnRjdXRzX2NvbnRlbnQnXSA9ICcgICAgICA8aDM+RGVmYXVsdCBLZXlib2FyZCBTaG9ydGN1dHM8L2gzPg0KDQo8dGFibGUgY2xhc3M9JnF1b3Q7cGFnZXRhYmxlJnF1b3Q7IGNlbGxzcGFjaW5nPSZxdW90OzAmcXVvdDsgc3VtbWFyeT0mcXVvdDtEZWZhdWx0IEtleWJvYXJkIFNob3J0Y3V0cyZxdW90Oz4NCjx0aGVhZD48dHI+DQo8dGg+UEMgKFdpbmRvd3MvTGludXgpPC90ZD4NCjx0aD5NYWM8L3RkPg0KPHRoPmFjdGlvbjwvdGQ+DQo8L3RyPjwvdGhlYWQ+DQo8dGJvZHk+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtUmV0dXJuPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtUmV0dXJuPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmZ1bGxzY3JlZW48L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1TPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtUzwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5wZXJmb3JtIHNhdmU8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtTDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5jZW50ZXIgc2VsZWN0aW9uPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtQWx0LURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1PcHRpb24tRG93bjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5jb3B5IGxpbmVzIGRvd248L3RkPg0KPC90cj4NCjx0ciBsY2Fzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1BbHQtVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1PcHRpb24tVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Y29weSBsaW5lcyB1cDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUY8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1GPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmZpbmQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1LPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtRzwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5maW5kIG5leHQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1TaGlmdC1LPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtU2hpZnQtRzwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5maW5kIHByZXZpb3VzPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkRvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+RG93bixDdHJsLU48L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gbGluZSBkb3duPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlVwLEN0cmwtUDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5nbyBsaW5lIHVwPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtRW5kLEN0cmwtRG93bjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLUVuZCxDb21tYW5kLURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gdG8gZW5kPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkxlZnQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+TGVmdCxDdHJsLUI8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gdG8gbGVmdDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUw8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1MPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIHRvIGxpbmU8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+QWx0LVJpZ2h0LEVuZDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLVJpZ2h0LEVuZCxDdHJsLUU8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gdG8gbGluZSBlbmQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+QWx0LUxlZnQsSG9tZTwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLUxlZnQsSG9tZSxDdHJsLUE8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gdG8gbGluZSBzdGFydDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5QYWdlRG93bjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5PcHRpb24tUGFnZURvd24sQ3RybC1WPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIHRvIHBhZ2UgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5QYWdlVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+T3B0aW9uLVBhZ2VVcDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5nbyB0byBwYWdlIHVwPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlJpZ2h0LEN0cmwtRjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5nbyB0byByaWdodDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUhvbWUsQ3RybC1VcDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLUhvbWUsQ29tbWFuZC1VcDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5nbyB0byBzdGFydDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUxlZnQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+T3B0aW9uLUxlZnQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gdG8gd29yZCBsZWZ0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtUmlnaHQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+T3B0aW9uLVJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIHRvIHdvcmQgcmlnaHQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+VGFiPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlRhYjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5pbmRlbnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+QWx0LURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+T3B0aW9uLURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+bW92ZSBsaW5lcyBkb3duPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkFsdC1VcDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5PcHRpb24tVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+bW92ZSBsaW5lcyB1cDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1UYWI8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtVGFiPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pm91dGRlbnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+SW5zZXJ0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pkluc2VydDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5vdmVyd3JpdGU8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlBhZ2VEb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnBhZ2Vkb3duPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5QYWdlVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+cGFnZXVwPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtU2hpZnQtWixDdHJsLVk8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1TaGlmdC1aLENvbW1hbmQtWTwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5yZWRvPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtRDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLUQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+cmVtb3ZlIGxpbmU8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtSzwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5yZW1vdmUgdG8gbGluZSBlbmQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pk9wdGlvbi1CYWNrc3BhY2U8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+cmVtb3ZlIHRvIGxpbmVzdGFydDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz48L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+QWx0LUJhY2tzcGFjZSxDdHJsLUFsdC1CYWNrc3BhY2U8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+cmVtb3ZlIHdvcmQgbGVmdDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz48L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+QWx0LURlbGV0ZTwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5yZW1vdmUgd29yZCByaWdodDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVI8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1PcHRpb24tRjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5yZXBsYWNlPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtU2hpZnQtUjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLVNoaWZ0LU9wdGlvbi1GPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnJlcGxhY2UgYWxsPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtQTwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLUE8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IGFsbDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IGRvd248L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtTGVmdDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCBsZWZ0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LUVuZDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1FbmQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IGxpbmUgZW5kPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LUhvbWU8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtSG9tZTwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3QgbGluZSBzdGFydDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1QYWdlRG93bjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1QYWdlRG93bjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3QgcGFnZSBkb3duPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LVBhZ2VVcDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1QYWdlVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IHBhZ2UgdXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtUmlnaHQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtUmlnaHQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IHJpZ2h0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtU2hpZnQtRW5kLEFsdC1TaGlmdC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtU2hpZnQtRG93bjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3QgdG8gZW5kPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkFsdC1TaGlmdC1SaWdodDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLVNoaWZ0LVJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCB0byBsaW5lIGVuZDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5BbHQtU2hpZnQtTGVmdDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLVNoaWZ0LUxlZnQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IHRvIGxpbmUgc3RhcnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1TaGlmdC1Ib21lLEFsdC1TaGlmdC1VcDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLVNoaWZ0LVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCB0byBzdGFydDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1VcDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1VcDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3QgdXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1TaGlmdC1MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pk9wdGlvbi1TaGlmdC1MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCB3b3JkIGxlZnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1TaGlmdC1SaWdodDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5PcHRpb24tU2hpZnQtUmlnaHQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IHdvcmQgcmlnaHQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtTzwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zcGxpdCBsaW5lPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtNzwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLTc8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+dG9nZ2xlIGNvbW1lbnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1UPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtVDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz50cmFuc3Bvc2UgbGV0dGVyczwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVo8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1aPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnVuZG88L3RkPg0KPC90cj4NCjwvdGJvZHk+DQo8L3RhYmxlPic7CiRsYW5nWydoZWxwX2Zyb250ZW5kX3RpdGxlJ10gPSAnRnJvbnRlbmQnOwokbGFuZ1snaGVscF9mcm9udGVuZF9jb250ZW50J10gPSAnPHA+VGhpcyBNb2R1bGUgYW5kIEFjZSBTY3JpcHQgY2FuIGFsc28gYmUgdXNlZCBhcyBhIEZyb250ZW5kIFN5bnRheGhpZ2hsaWdodGVyLjxiciAvPg0KVG8gbWFrZSBpdCB3b3JrIHlvdSBoYXZlIHRvIGluY2x1ZGUgalF1ZXJ5IEZyYW1ld29yaywgZm9yIGV4YW1wbGUgdXNpbmcgQ01TTVMge2Ntc19qcXVlcnl9IHRhZyBhbmQgYXMgd2VsbCBpbmNsdWRlIHtBY2VFZGl0b3J9IGluIHlvdXIgcGFnZSB0d2ljZS4gRmlyc3QgYWRkIHRoZSBtb2R1bGUgdGFnIGluIHlvdXIgPGhlYWQ+IHNlY3Rpb24gb2YgVGVtcGxhdGUgb3IgaW4gJnF1b3Q7UGFnZSBTcGVjaWZpYyBNZXRkYXRhJnF1b3Q7IGZpZWxkIG9mIHlvdXIgQ29udGVudCBwYWdlLCBsaWtlIHtBY2VFZGl0b3IgYWN0aW9uPSYjMDM5O2hlYWQmIzAzOTt9IGFuZCBhbm90aGVyIGNhbGwgdG8gc3BlY2lmeSB3aGljaCBhcmVhIHNob3VsZCBiZSBoaWdobGlnaHRlZCwgZm9yIGV4YW1wbGUge0FjZUVkaXRvciBkaXZpZD0mIzAzOTtmb28mIzAzOTt9LCB3aGljaCB3b3VsZCB0YXJnZXQgYSBwYWdlIGVsZW1lbnQgd2l0aCBpZCA8ZW0+Zm9vPC9lbT4uPC9wPg0KPGgzPlNvIGhvdyBkbyB5b3UgdXNlIGl0PzwvaDM+DQo8cD5GaXJzdCBpbmNsdWRlIGpRdWVyeSBhbmQgTW9kdWxlIHRhZyBpbiB5b3VyIFBhZ2UgPGhlYWQ+IGFyZWEsIGZvciBleGFtcGxlIGluICZxdW90O1BhZ2UgU3BlY2lmaWMgTWV0ZGF0YSZxdW90Ozo8L3A+DQoJPHByZT4NCgl7Y21zX2pxdWVyeX0NCgl7QWNlRWRpdG9yIGFjdGlvbj0mIzAzOTtoZWFkJiMwMzk7fQ0KCTwvcHJlPg0KPHA+VGhpcyBpbmNsdWRlcyBuZWVkZWQgc2NyaXB0cyBmb3IgQWNlIFN5bnRheGhpZ2hsaWdodGVyIHRvIHdvcmsuPGJyIC8+DQpJbiBNb2R1bGVzIEFkbWluIGludGVyZmFjZSB5b3UgY2FuIHNlbGVjdCBkZWZhdWx0IHNldHRpbmdzIGZvciB5b3VyICYjMDM5O2hlYWQmIzAzOTsgYWN0aW9uIG9yIHVzZSBwYXJhbWV0ZXIgbW9kZXM9JiMwMzk7aHRtbCxqYXZhc2NyaXB0JiMwMzk7IGFuZCB0aGVtZXM9JiMwMzk7dGV4dG1hdGUmIzAzOTsgd2hpY2ggd291bGQgb3ZlcnJpZGUgc2VsZWN0ZWQgUHJlZmVyZW5jZXMuPC9wPg0KPHA+Tm93IHdoZW4geW91IGhhdmUgbmVlZGVkIHNjcmlwdHMgaW5jbHVkZWQsIG9uZSBtb3JlIE1vZHVsZSB0YWcgY2FsbCBpcyBuZWVkZWQgKGZvciBleGFtcGxlIGluIHlvdXIgQ29udGVudCBFZGl0b3IgYXJlYSkgdG8gc3BlY2lmeSB3aGljaCBhcmVhIG9mIHlvdXIgUGFnZSBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQuPC9wPg0KCTxwcmU+DQoJe0FjZUVkaXRvciBkaXZpZD0mIzAzOTtzb21lLWlkJiMwMzk7fQ0KCTwvcHJlPg0KPHA+VGhpcyB0YWcgaW5jbHVkZXMgbmVlZGVkIFNjcmlwdCBhbmQgU3R5bGUgdGhhdCBpcyB1c2VkIHRvIEhpZ2hsaWdodCBzZWxlY3RlZCBlbGVtZW50IHdpdGggc3BlY2lmaWVkIGlkLjxiciAvPg0KQWxsIHlvdSBuZWVkIHRoZW4gaXMgd3JpdGUgeW91ciBDb2RlIHRoYXQgeW91IHdhbnQgdG8gSGlnaGxpZ2h0IGFuZCB3cmFwIGl0IGluc2lkZSBhbiBlbGVtZW4gbGlrZSA8ZGl2PiB3aXRoIHNwZWNpZmllZCBpZC48L3A+JzsKJGxhbmdbJ2hlbHBfZnJvbnRlbmRfc2FtcGxlJ10gPSAnPHByZSBpZD0mcXVvdDtzb21lLWlkJnF1b3Q7Pg0KPGh0bWw+DQogJm5ic3A7ICZuYnNwOyA8aGVhZD4NCiAmbmJzcDsgJm5ic3A7IDxzdHlsZSB0eXBlPSZxdW90O3RleHQvY3NzJnF1b3Q7Pg0KICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAudGV4dC1sYXllciB7DQogJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgZm9udC1mYW1pbHk6IE1vbmFjbywgJnF1b3Q7Q291cmllciBOZXcmcXVvdDssIG1vbm9zcGFjZTsNCiAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyBmb250LXNpemU6IDEycHg7DQogJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgY3Vyc29yOiB0ZXh0Ow0KICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyB9DQogJm5ic3A7ICZuYnNwOyA8L3N0eWxlPg0KICZuYnNwOyAmbmJzcDsgPC9oZWFkPg0KICZuYnNwOyAmbmJzcDsgPGJvZHk+DQogJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IDxoMSBzdHlsZT0mcXVvdDtjb2xvcjpyZWQmcXVvdDs+SnVodSBLaW5uZXJzPC9oMT4NCiAmbmJzcDsgJm5ic3A7IDwvYm9keT4gPC9odG1sPg0KPC9wcmU+JzsKJGxhbmdbJ2hlbHBfYWJvdXRfdGl0bGUnXSA9ICdBYm91dCc7CiRsYW5nWydoZWxwX2Fib3V0X3RleHQnXSA9ICc8aDM+U3VwcG9ydDwvaDM+DQo8cD5BcyBwZXIgdGhlIEdQTCwgdGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBhcy1pcy4gUGxlYXNlIHJlYWQgdGhlIHRleHQgb2YgdGhlIGxpY2Vuc2UgZm9yIHRoZSBmdWxsIGRpc2NsYWltZXIuPC9wPg0KPGgzPkNvcHlyaWdodCBhbmQgTGljZW5zZTwvaDM+DQo8cD5Db3B5cmlnaHQgJmNvcHk7IDIwMTIsIEdvcmFuIElsaWMgPGEgaHJlZj0ibWFpbHRvOnVuaXF1M2VAZ21haWwuY29tIj48dW5pcXUzZUBnbWFpbC5jb20+PC9hPiA8YSBocmVmPSJodHRwOi8vd3d3LmljaC1tYWNoLWRhcy5hdCIgcmVsPSJleHRlcm5hbCI+d3d3LmljaC1tYWNoLWRhcy5hdDwvYT4uIEFsbCBSaWdodHMgQXJlIFJlc2VydmVkLjwvcD4NCjxwPlRoaXMgbW9kdWxlIGhhcyBiZWVuIHJlbGVhc2VkIHVuZGVyIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwiPkdOVSBQdWJsaWMgTGljZW5zZTwvYT4uIFlvdSBtdXN0IGFncmVlIHRvIHRoaXMgbGljZW5zZSBiZWZvcmUgdXNpbmcgdGhlIG1vZHVsZS48L3A+DQoJPGgzPlRlYW08L2gzPg0KCTx1bD4NCgkJPGxpPkdvcmFuIElsaWMgKHVuaXF1MykgZy5pbGljQGktYXJ0cy5ldSA8YnIgLz53d3cuaWNoLW1hY2gtZGFzLmF0PC9saT4JDQoJCTxsaT5Sb2JlcnQgQ2FtcGJlbGwgKGNhbGd1eTEwMDApIGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcgIDxiciAvPnd3dy5jYWxndXkxMDAwLmNvbTwvbGk+CQkNCgkJPGxpPkpvbmF0aGFuIFNjaG1pZCAoRm9hbHkqKSBoaUBqb25hdGhhbnNjaG1pZC5kZSA8YnIgLz53d3cuam9uYXRoYW5zY2htaWQuZGU8L2xpPg0KCTwvdWw+DQonOwokbGFuZ1snY2hhbmdlbG9nJ10gPSAnPGgzPlZlcnNpb24gMC4xPC9oMz4NCjx1bD4NCgk8bGk+SXQmIzAzOTtzIGZyZXNoISBOb3RoaW5nIGNoYW5nZWQgeWV0ITwvbGk+DQoJPGxpPlVzaW5nIEFjZSBWZXJzaW9uIDAuMi4wPC9saT4NCjwvdWw+DQo8aDM+VmVyc2lvbiAwLjI8L2gzPg0KPHVsPg0KCTxsaT5BZGRlZCBDVFJMLVMgS2V5YmluZGluZzwvbGk+DQoJPGxpPkFkZGVkIEZ1bGxzY3JlZW5tb2RlPC9saT4NCgk8bGk+QWRkZWQgRnJvbnRlbmQgSGlnaGxpZ2h0aW5nPC9saT4NCgk8bGk+VXBkYXRlZCBBY2U8L2xpPg0KPC91bD4NCjxoMz5Sb2FkbWFwPC9oMz4NCjx1bD4NCgk8bGk+PGRlbD5BZGQgRnJvbnRlbmQgU3ludGF4aGlnaGxpZ2h0aW5nPC9kZWw+PC9saT4NCgk8bGk+PGRlbD5BZGQgRnVsbHNjcmVlbm1vZGU8L2RlbD48L2xpPg0KCTxsaT48ZGVsPkFkZCBLZXliaW5kaW5nIChDVFJMK1MpPC9kZWw+PC9saT4NCgk8bGk+QWRkIEVkaXRvciBiZWhhdmlvciAoVmltLCBFTWFjcyk8L2xpPg0KCTxsaT5NYXliZSBhZGQgVG9vbGJhcjwvbGk+DQo8L3VsPic7CiRsYW5nWyd1dG1hJ10gPSAnMTU2ODYxMzUzLjEzMjgxNzA2NzcuMTMyMzY3NjU5OC4xMzI2NDY4MDE3LjEzMjcxNTM3ODMuNCc7CiRsYW5nWyd1dG16J10gPSAnMTU2ODYxMzUzLjEzMjcxNTM3ODMuNC40LnV0bWNzcj1nb29nbGV8dXRtY2NuPShvcmdhbmljKXx1dG1jbWQ9b3JnYW5pY3x1dG1jdHI9Y21zbXMnOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1My4xLjEwLjEzMjcxNTM3ODMnOwokbGFuZ1sndXRtYyddID0gJzE1Njg2MTM1Myc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nb_NO.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0FjZUVkaXRvcic7CiRsYW5nWydzZXR0aW5nc190YWInXSA9ICdJbm5zdGlsbGluZ2VyJzsKJGxhbmdbJ2V4YW1wbGVfZG9jdW1lbnQnXSA9ICdEb2N1bWVudCc7CiRsYW5nWydzeW50YXhfbW9kZSddID0gJ01vZGUnOwokbGFuZ1sndGhlbWVzJ10gPSAnVGhlbWUnOwokbGFuZ1snZm9udF9zaXplJ10gPSAnRm9udCBTaXplJzsKJGxhbmdbJ2Z1bGxfbGluZSddID0gJ0Z1bGwgTGluZSc7CiRsYW5nWydoaWdobGlnaHRfYWN0aXZlJ10gPSAnSGlnaGxpZ2h0IEFjdGl2ZSBMaW5lJzsKJGxhbmdbJ3Nob3dfaW52aXNpYmxlcyddID0gJ1Nob3cgSW52aXNpYmxlcyc7CiRsYW5nWydwZXJzaXN0ZW50X2hzY3JvbGwnXSA9ICdQZXJzaXRlbnQgSFNjcm9sbCc7CiRsYW5nWydrZXlfYmluZGluZyddID0gJ0tleSBCaW5kaW5nJzsKJGxhbmdbJ3NvZnRfd3JhcCddID0gJ1NvZnQgV3JhcCc7CiRsYW5nWydzaG93X2d1dHRlciddID0gJ1Nob3cgR3V0dGVyJzsKJGxhbmdbJ3ByaW50X21hcmdpbiddID0gJ1Nob3cgUHJpbnQgTWFyZ2luJzsKJGxhbmdbJ3NvZnRfdGFiJ10gPSAnVXNlIFNvZnQgVGFiJzsKJGxhbmdbJ2hpZ2hsaWdodF9zZWxlY3RlZCddID0gJ0hpZ2hsaWdodCBzZWxlY3RlZCB3b3JkJzsKJGxhbmdbJ2VuYWJsZV9iZWhhdmlvcnMnXSA9ICdFbmFibGUgQmVoYXZpb3JzJzsKJGxhbmdbJ3Rlc3RhcmVhdGV4dCddID0gJ1ByZXZpZXcnOwokbGFuZ1snanMnXSA9ICdKYXZhU2NyaXB0JzsKJGxhbmdbJ3BsYWluJ10gPSAnUGxhaW4gVGV4dCc7CiRsYW5nWydzdmcnXSA9ICdTVkcnOwokbGFuZ1snaHRtbCddID0gJ0hUTUwnOwokbGFuZ1snY3NzJ10gPSAnQ1NTJzsKJGxhbmdbJ3Njc3MnXSA9ICdTQ1NTJzsKJGxhbmdbJ2NvZmZlZSddID0gJ0NvZmZlZVNjcmlwdCc7CiRsYW5nWydqc29uJ10gPSAnSlNPTic7CiRsYW5nWydweXRob24nXSA9ICdQeXRob24nOwokbGFuZ1sncnVieSddID0gJ1J1YnknOwokbGFuZ1sncGVybCddID0gJ1BlcmwnOwokbGFuZ1sncGhwJ10gPSAnUEhQJzsKJGxhbmdbJ2phdmEnXSA9ICdKYXZhJzsKJGxhbmdbJ2NzaGFycCddID0gJ0MjJzsKJGxhbmdbJ2NfY3BwJ10gPSAnQysrJzsKJGxhbmdbJ2Nsb2p1cmUnXSA9ICdDbG9qdXJlJzsKJGxhbmdbJ29jYW1sJ10gPSAnT0NhbWwnOwokbGFuZ1sndGV4dGlsZSddID0gJ1RleHRpbGUnOwokbGFuZ1snZ3Jvb3Z5J10gPSAnR3Jvb3Z5JzsKJGxhbmdbJ3NjYWxhJ10gPSAnU2NhbGEnOwokbGFuZ1snY2xvdWRzJ10gPSAnQ2xvdWRzJzsKJGxhbmdbJ2Nsb3Vkc19taWRuaWdodCddID0gJ0Nsb3VkcyBNaWRuaWdodCc7CiRsYW5nWydjb2JhbHQnXSA9ICdDb2JhbHQnOwokbGFuZ1snY3JpbXNvbl9lZGl0b3InXSA9ICdDcmltc29uIEVkaXRvcic7CiRsYW5nWydkYXduJ10gPSAnRGF3bic7CiRsYW5nWydlY2xpcHNlJ10gPSAnRWNsaXBzZSc7CiRsYW5nWydpZGxlX2ZpbmdlcnMnXSA9ICdpZGxlRmluZ2Vycyc7CiRsYW5nWydrcl90aGVtZSddID0gJ2tyVGhlbWUnOwokbGFuZ1snbWVyYml2b3JlJ10gPSAnTWVyYml2b3JlJzsKJGxhbmdbJ21lcmJpdm9yZV9zb2Z0J10gPSAnTWVyYm92aW9yZSBTb2Z0JzsKJGxhbmdbJ21vbm9faW5kdXN0cmlhbCddID0gJ01vbm8gSW5kdXN0cmlhbCc7CiRsYW5nWydtb25va2FpJ10gPSAnTW9ub2thaSc7CiRsYW5nWydwYXN0ZWxfb25fZGFyayddID0gJ1Bhc3RlbCBvbiBkYXJrJzsKJGxhbmdbJ3NvbGFyaXplZF9kYXJrJ10gPSAnU29sYXJpemVkIERhcmsnOwokbGFuZ1snc29sYXJpemVkX2xpZ2h0J10gPSAnU29sYXJpemVkIExpZ2h0JzsKJGxhbmdbJ3RleHRtYXRlJ10gPSAnVGV4dE1hdGUnOwokbGFuZ1sndHdpbGlnaHQnXSA9ICdUd2lsaWdodCc7CiRsYW5nWyd2aWJyYW50X2luayddID0gJ1ZpYnJhbnQgSW5rJzsKJGxhbmdbJ2FjZSddID0gJ0FjZSc7CiRsYW5nWyd2aW0nXSA9ICdWaW0nOwokbGFuZ1snZW1hY3MnXSA9ICdFTWFjcyc7CiRsYW5nWydjdXN0b20nXSA9ICdDdXN0b20nOwokbGFuZ1snb2ZmJ10gPSAnT2ZmJzsKJGxhbmdbJzQwJ10gPSAnNDAgdGVnbic7CiRsYW5nWyc4MCddID0gJzgwIHRlZ24nOwokbGFuZ1snZnJlZSddID0gJ0ZyZWUnOwokbGFuZ1snc2F2ZXNldHRpbmdzJ10gPSAnTGFncmUgaW5uc3RpbGxpbmdlcic7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAnRGluZSBBY2VFZGl0b3IgaW5uc3RpbGxpbmdlciBoYXIgYmxpdHQgbGFncmV0JzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnQWNlRWRpdG9yIFN1Y2Nlc3NmdWxseSBJbnN0YWxsZWQhIFNldCAmcXVvdDtNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcyZxdW90OyBwZXJtaXNzaW9ucyB0byB1c2UgdGhpcyBtb2R1bGUhJzsKJGxhbmdbJ3Bvc3R1bmluc3RhbGwnXSA9ICdBY2VFZGl0b3IgU3VjY2Vzc2Z1bGx5IFVuaW5zdGFsbGVkJzsKJGxhbmdbJ3JlYWxseV91bmluc3RhbGwnXSA9ICdSZWFsbHk/IEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byB1bmluc3RhbGwgQWNlRWRpdG9yPyBUaGluayBhZ2FpbiEnOwokbGFuZ1snaGVscF9nZW5lcmFsX3RpdGxlJ10gPSAnR2VuZXJhbCc7CiRsYW5nWydjaGFuZ2Vsb2cnXSA9ICc8aDM+VmVyc2lvbiAwLjE8L2gzPg0KPHVsPg0KCTxsaT5JdCYjMDM5O3MgZnJlc2ghIE5vdGhpbmcgY2hhbmdlZCB5ZXQhPC9saT4NCjwvdWw+JzsKJGxhbmdbJ3FjYSddID0gJ1AwLTUzNjg0OTExNS0xMzA3OTgzNDk1MjEwJzsKJGxhbmdbJ3V0bWEnXSA9ICcxNTY4NjEzNTMuMjUxNzI4MDkxLjEzMjI0MzAzNzEuMTMyMjQzNTAxOS4xMzIyNTExMTE3LjMnOwokbGFuZ1sndXRteiddID0gJzE1Njg2MTM1My4xMzIyNDMwMzcxLjEuMS51dG1jc3I9KGRpcmVjdCl8dXRtY2NuPShkaXJlY3QpfHV0bWNtZD0obm9uZSknOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1My4yLjEwLjEzMjI1MTExMTcnOwokbGFuZ1sndXRtYyddID0gJzE1Njg2MTM1Myc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nl_NL.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0FjZUVkaXRvciAnOwokbGFuZ1snYWRtaW5kZXNjcmlwdGlvbiddID0gJ0FjZUVkaXRvciBpcyBhIFN5bnRheGhpZ2hsaWdodGVyIG1vZHVsZSB1c2luZyA8c3Ryb25nPkFjZTwvc3Ryb25nPiBhIHN0YW5kYWxvbmUgY29kZSBlZGl0b3Igd3JpdHRlbiBpbiBKYXZhU2NyaXB0LjxiciAvPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSW50ZXJuZXQgRXhwbG9yZXIgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQhJzsKJGxhbmdbJ3NldHRpbmdzX3RhYiddID0gJ0luc3RlbGxpbmdlbic7CiRsYW5nWydmcm9udGVuZHNldHRpbmdzX3RhYiddID0gJ0Zyb250ZW5kIEluc3RlbGxpbmdlbic7CiRsYW5nWydmcm9udGVuZF9oZWFkX3NldHRpbmdzJ10gPSAnRnJvbnRlbmQgSGVhZCBJbnN0ZWxsaW5nZW4nOwokbGFuZ1snZnJvbnRlbmRfc3ludGF4YXJlYV9zZXR0aW5ncyddID0gJ0Zyb250ZW5kIFN5bnRheCBydWltdGUgSW5zdGVsbGluZ2VuJzsKJGxhbmdbJ2hlYWRfZGVzY3JpcHRpb24nXSA9ICdUaGVzZSBwcmVmZXJlbmNlcyBhcmUgdXNlZCBmb3IgZGVmYXVsdCBzZXR0aW5ncyBvZiBBY2Ugc2NyaXB0cyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiBwYWdlIDxjb2RlPjxoZWFkPjwvY29kZT4gd2hlbiBjYWxsaW5nIDxjb2RlPntBY2VFZGl0b3IgYWN0aW9uPSYjMDM5O2hlYWQmIzAzOTt9PC9jb2RlPiBmcm9tIFBhZ2UgU3BlY2lmaWMgTWV0YWRhdGEgb3IgVGVtcGxhdGUuJzsKJGxhbmdbJ2NvbnRlbnRfZGVzY3JpcHRpb24nXSA9ICdUaGVzZSBwcmVmZXJlbmNlcyBhcmUgdXNlZCBmb3IgZGVmYXVsdCBzZXR0aW5ncyBvZiBTeW50YXhoaWdobGlnaHRpbmcgYXJlYSB3aGVuIGNhbGxpbmcgPGNvZGU+e0FjZUVkaXRvciBkaXZpZD0mIzAzOTtlZGl0b3ImIzAzOTt9PC9jb2RlPiB0YWcgd2l0aGluIGEgUGFnZS4nOwokbGFuZ1snc3ludGF4YXJlYWRlc2NyaXB0aW9uJ10gPSAnVGhlc2UgcHJlZmVyZW5jZXMgYXJlIHVzZWQgZm9yIGRlZmF1bHQgc2V0dGluZ3Mgb2YgQWNlIGJlaGF2aW9yIHdoZW4gY2FsbGluZyA8Y29kZT57QWNlRWRpdG9yIGRpdmlkPSYjMDM5O2ZvbyYjMDM5O308L2NvZGU+IGZyb20gYSBQYWdlIG9yIFRlbXBsYXRlJzsKJGxhbmdbJ2V4YW1wbGVfZG9jdW1lbnQnXSA9ICdEb2N1bWVudCAnOwokbGFuZ1snd2lkdGhfdGl0bGUnXSA9ICdFZGl0b3IgYnJlZWR0ZSAoaW4gZW0pJzsKJGxhbmdbJ2hlaWdodF90aXRsZSddID0gJ0VkaXRvciBicmVlZHRlIChpbiBlbSknOwokbGFuZ1snZW5hYmxlX2llJ10gPSAnSW50ZXJuZXQgRXhwbG9yZXIgSW5zY2hha2VsZW4nOwokbGFuZ1snZW5hYmxlX2llZGVzY3JpcHRpb24nXSA9ICdBY2UgU3ludGF4aGlnaGxpZ2h0ZXIgZnVuY3Rpb25lZXJ0IG5pZXQgY29ycmVjdCBpbiBJbnRlcm5ldCBFeHBsb3Jlci4gR2VicnVpayBkaXQgb3AgZWlnZW4gcmlzaWNvISc7CiRsYW5nWydmcm9udGVuZF93aWR0aF90aXRsZSddID0gJ0Zyb250ZW5kIFN5bnRheCBydWltdGUgYnJlZWR0ZSAoaW4gcHgpJzsKJGxhbmdbJ2Zyb250ZW5kX2hlaWdodF90aXRsZSddID0gJ0Zyb250ZW5kIFN5bnRheCBydWltdGUgaG9vZ3RlIChpbiBweCknOwokbGFuZ1snc3ludGF4X21vZGUnXSA9ICdNb2R1cyc7CiRsYW5nWyd0aGVtZXMnXSA9ICdUaGVtYSc7CiRsYW5nWydmb250X3NpemUnXSA9ICdMZXR0ZXJncm9vdHRlJzsKJGxhbmdbJ2Z1bGxfbGluZSddID0gJ1ZvbGxlZGlnZSBsaWpuJzsKJGxhbmdbJ2hpZ2hsaWdodF9hY3RpdmUnXSA9ICdIaWdobGlnaHQgYWN0aWV2ZSBsaWpuJzsKJGxhbmdbJ3Nob3dfaW52aXNpYmxlcyddID0gJ0dlZWYgb256aWNodGJhcmUgd2Vlcic7CiRsYW5nWydwZXJzaXN0ZW50X2hzY3JvbGwnXSA9ICdQZXJzaXRlbnQgSFNjcm9sbCAnOwokbGFuZ1sna2V5X2JpbmRpbmcnXSA9ICdLZXkgQmluZGluZyAnOwokbGFuZ1snc29mdF93cmFwJ10gPSAnU29mdCBXcmFwICc7CiRsYW5nWydzaG93X2d1dHRlciddID0gJ0dlZWYgR3V0dGVyIHdlZXInOwokbGFuZ1sncHJpbnRfbWFyZ2luJ10gPSAnR2VlZiBwcmludG1hcmdlIHdlZXInOwokbGFuZ1snc29mdF90YWInXSA9ICdHZWJydWlrIFNvZnQgVGFiJzsKJGxhbmdbJ2hpZ2hsaWdodF9zZWxlY3RlZCddID0gJ0hpZ2hsaWdodCBoZXQgZ2VzZWxlY3RlZXJkZSB3b29yZCc7CiRsYW5nWydlbmFibGVfYmVoYXZpb3JzJ10gPSAnU2NoYWtlbCBCZWhhdmlvcnMgaW4nOwokbGFuZ1sndGVzdGFyZWF0ZXh0J10gPSAnVm9vcmJlZWxkJzsKJGxhbmdbJ2pzJ10gPSAnSmF2YVNjcmlwdCAnOwokbGFuZ1sncGxhaW4nXSA9ICdQbGF0dGUgdGVrc3QnOwokbGFuZ1snc3ZnJ10gPSAnU1ZHICc7CiRsYW5nWydodG1sJ10gPSAnSFRNTCAnOwokbGFuZ1snY3NzJ10gPSAnQ1NTICc7CiRsYW5nWydzY3NzJ10gPSAnU0NTUyAnOwokbGFuZ1snY29mZmVlJ10gPSAnQ29mZmVlU2NyaXB0ICc7CiRsYW5nWydqc29uJ10gPSAnSlNPTiAnOwokbGFuZ1sncHl0aG9uJ10gPSAnUHl0aG9uICc7CiRsYW5nWydydWJ5J10gPSAnUnVieSAnOwokbGFuZ1sncGVybCddID0gJ1BlcmwgJzsKJGxhbmdbJ3BocCddID0gJ1BIUCAnOwokbGFuZ1snamF2YSddID0gJ0phdmEgJzsKJGxhbmdbJ2NzaGFycCddID0gJ0MjICc7CiRsYW5nWydjX2NwcCddID0gJ0MrKyAnOwokbGFuZ1snY2xvanVyZSddID0gJ0Nsb2p1cmUgJzsKJGxhbmdbJ29jYW1sJ10gPSAnT0NhbWwgJzsKJGxhbmdbJ3RleHRpbGUnXSA9ICdUZXh0aWxlJzsKJGxhbmdbJ2dyb292eSddID0gJ0dyb292eSc7CiRsYW5nWydzY2FsYSddID0gJ1NjYWxhJzsKJGxhbmdbJ2Nsb3VkcyddID0gJ0Nsb3Vkcyc7CiRsYW5nWydjaHJvbWUnXSA9ICdDaHJvbWUnOwokbGFuZ1snY2xvdWRzX21pZG5pZ2h0J10gPSAnQ2xvdWRzIE1pZG5pZ2h0JzsKJGxhbmdbJ2NvYmFsdCddID0gJ0NvYmFsdCc7CiRsYW5nWydjcmltc29uX2VkaXRvciddID0gJ0NyaW1zb24gRWRpdG9yJzsKJGxhbmdbJ2Rhd24nXSA9ICdEYXduJzsKJGxhbmdbJ2RyZWFtd2VhdmVyJ10gPSAnRHJlYW13ZWF2ZXInOwokbGFuZ1snZWNsaXBzZSddID0gJ0VjbGlwc2UnOwokbGFuZ1snaWRsZV9maW5nZXJzJ10gPSAnaWRsZUZpbmdlcnMnOwokbGFuZ1sna3JfdGhlbWUnXSA9ICdrclRoZW1lJzsKJGxhbmdbJ21lcmJpdm9yZSddID0gJ01lcmJpdm9yZSc7CiRsYW5nWydtZXJiaXZvcmVfc29mdCddID0gJ01lcmJvdmlvcmUgU29mdCc7CiRsYW5nWydtb25vX2luZHVzdHJpYWwnXSA9ICdNb25vIEluZHVzdHJpYWwnOwokbGFuZ1snbW9ub2thaSddID0gJ01vbm9rYWknOwokbGFuZ1sncGFzdGVsX29uX2RhcmsnXSA9ICdQYXN0ZWwgb24gZGFyayc7CiRsYW5nWydzb2xhcml6ZWRfZGFyayddID0gJ1NvbGFyaXplZCBEYXJrJzsKJGxhbmdbJ3NvbGFyaXplZF9saWdodCddID0gJ1NvbGFyaXplZCBMaWdodCc7CiRsYW5nWyd0ZXh0bWF0ZSddID0gJ1RleHRNYXRlJzsKJGxhbmdbJ3RvbW9ycm93J10gPSAnVG9tb3Jyb3cnOwokbGFuZ1sndG9tb3Jyb3dfbmlnaHQnXSA9ICdUb21vcnJvdyBOaWdodCc7CiRsYW5nWyd0b21vcnJvd19uaWdodF9icmlnaHQnXSA9ICdUb21vcnJvdyBOaWdodCBCcmlnaHQnOwokbGFuZ1sndG9tb3Jyb3dfbmlnaHRfYmx1ZSddID0gJ1RvbW9ycm93IE5pZ2h0IEJsdWUnOwokbGFuZ1sndG9tb3Jyb3dfbmlnaHRfZWlnaHRpZXMnXSA9ICdUb21vcnJvdyBOaWdodCBFaWdodGllcyc7CiRsYW5nWyd0d2lsaWdodCddID0gJ1R3aWxpZ2h0JzsKJGxhbmdbJ3ZpYnJhbnRfaW5rJ10gPSAnVmlicmFudCBJbmsnOwokbGFuZ1snYWNlJ10gPSAnQWNlJzsKJGxhbmdbJ3ZpbSddID0gJ1ZpbSc7CiRsYW5nWydlbWFjcyddID0gJ0VNYWNzJzsKJGxhbmdbJ2N1c3RvbSddID0gJ0dlYXZhbmNlZXJkJzsKJGxhbmdbJ29mZiddID0gJ1VpdCc7CiRsYW5nWyc0MCddID0gJzQwIEthcmFrdGVycyc7CiRsYW5nWyc4MCddID0gJzgwIEthcmFrdGVycyc7CiRsYW5nWycxMDAnXSA9ICcxMDAgS2FyYWt0ZXJzJzsKJGxhbmdbJzE0MCddID0gJzE0MCBLYXJha3RlcnMnOwokbGFuZ1snc2F2ZXNldHRpbmdzJ10gPSAnSW5zdGVsbGluZ2VuIG9wc2xhYW4nOwokbGFuZ1snc2V0dGluZ3NzYXZlZCddID0gJ1V3IEFjZUVkaXRvciBpbnN0ZWxsaW5nZW4gemlqbiBvcGdlc2xhZ2VuJzsKJGxhbmdbJ2Zyb250ZW5kc2V0dGluZ3NzYXZlZCddID0gJ1V3IEFjZUVkaXRvciBGcm9udGVuZCBpbnN0ZWxsaW5nZW4gemlqbiBvcGdlc2xhZ2VuJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnQWNlRWRpdG9yIHN1Y2Nlc3ZvbCBnZSZpdW1sO25zdGFsbGVlcmQhIFN0ZWwgJnF1b3Q7QmV3ZXJrIHNpdGV2b29ya2V1cmVuJnF1b3Q7IHBlcm1pc3NpZXMgaW4gb20gZGV6ZSBtb2R1bGUgdGUgZ2VicnVpa2VuISc7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnQWNlRWRpdG9yIHN1Y2Nlc3ZvbCBnZSZpdW1sO25zdGFsbGVlcmQnOwokbGFuZ1sncmVhbGx5X3VuaW5zdGFsbCddID0gJ0VjaHQ/IFdlZXQgdSB6ZWtlciBkYXQgdSBBY2VFZGl0b3Igd2lsdCB2ZXJ3aWpkZXJlbj8gRGVuayBub2cgZWVucyBnb2VkIG5hISc7CiRsYW5nWydoZWxwX3BhcmFtX2FjdGlvbiddID0gJ2lzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBhY3Rpb24gb2YgTW9kdWxlIHRhZy4gUG9zc2libGUgdmFsdWVzIGFyZSAmIzAzOTtkZWZhdWx0JiMwMzk7IGFuZCAmIzAzOTtoZWFkJiMwMzk7LiBCb3RoIGFyZSBuZWVkZWQgZm9yIGNvcnJlY3QgRnJvbnRlbmQgU3ludGF4aGlnaGxpZ2h0aW5nIGZ1bmN0aW9uLiA8YnIgLz5Qb3NzaWJsZSB2YWx1ZXMgYXJlOg0KPHVsPg0KCTxsaT5oZWFkPC9saT4NCgk8bGk+ZGVmYXVsdDwvbGk+DQo8L3VsPic7CiRsYW5nWydoZWxwX3BhcmFtX21vZGVzJ10gPSAnaXMgdXNlZCB3aXRoIDxjb2RlPntBY2VFZGl0b3IgYWN0aW9uPSYjMDM5O2hlYWQmIzAzOTt9PC9jb2RlPi4gWW91IGNhbiBpbmNsdWRlIG11bHRpcGxlIGNvbW1hIHNlcGFyYXRlZCAmIzAzOTttb2RlcyYjMDM5OyB0aGF0IHlvdSB3aWxsIGJlIHVzaW5nIG9uIHlvdXIgd2Vic2l0ZS4gVGhpcyBzaG91bGQgYmUgaW5jbHVkZWQgaW4geW91ciA8aGVhZD4gb2YgVGVtcGxhdGUgb3IgUGFnZSBzcGVjaWZpYyBNZXRhZGF0YS4gVGhpcyB3aWxsIG92ZXJyaWRlIHlvdSBQcmVmZXJlbmNlcyBzZWxlY3RlZCBpbiBNb2R1bGUgQWRtaW4gYXJlYS4gPGJyIC8+UG9zc2libGUgdmFsdWVzIGFyZToNCjx1bD4NCgk8bGk+amF2YXNjcmlwdDwvbGk+IA0KCTxsaT5wbGFpbjwvbGk+IA0KCTxsaT5zdmc8L2xpPiANCgk8bGk+aHRtbDwvbGk+DQoJPGxpPmNzczwvbGk+DQoJPGxpPnNjc3M8L2xpPg0KCTxsaT5jb2ZmZWU8L2xpPg0KCTxsaT5qc29uPC9saT4NCgk8bGk+cHl0aG9uPC9saT4NCgk8bGk+cnVieTwvbGk+DQoJPGxpPnBlcmw8L2xpPg0KCTxsaT5waHA8L2xpPg0KCTxsaT5qYXZhPC9saT4NCgk8bGk+Y3NoYXJwPC9saT4NCgk8bGk+Y19jcHA8L2xpPg0KCTxsaT5jbG9qdXJlPC9saT4NCgk8bGk+b2NhbWw8L2xpPg0KCTxsaT50ZXh0aWxlPC9saT4NCgk8bGk+Z3Jvb3Z5PC9saT4NCgk8bGk+c2NhbGE8L2xpPg0KPC91bD4nOwokbGFuZ1snaGVscF9wYXJhbV90aGVtZXMnXSA9ICdpcyB1c2VkIHdpdGggPGNvZGU+e0FjZUVkaXRvciBhY3Rpb249JiMwMzk7aGVhZCYjMDM5O308L2NvZGU+LiBZb3UgY2FuIGluY2x1ZGUgbXVsdGlwbGUgY29tbWEgc2VwYXJhdGVkICYjMDM5O3RoZW1lcyYjMDM5OyB0aGF0IHlvdSB3aWxsIGJlIHVzaW5nIG9uIHlvdXIgd2Vic2l0ZS4gVGhpcyBzaG91bGQgYmUgaW5jbHVkZWQgaW4geW91ciA8aGVhZD4gb2YgVGVtcGxhdGUgb3IgUGFnZSBzcGVjaWZpYyBNZXRhZGF0YS4gVGhpcyB3aWxsIG92ZXJyaWRlIHlvdSBQcmVmZXJlbmNlcyBzZWxlY3RlZCBpbiBNb2R1bGUgQWRtaW4gYXJlYS4gPGJyIC8+UG9zc2libGUgdmFsdWVzIGFyZToNCjx1bD4NCgk8bGk+Y2xvdWRzPC9saT4gDQoJPGxpPmNsb3Vkc19taWRuaWdodDwvbGk+IA0KCTxsaT5jb2JhbHQ8L2xpPiANCgk8bGk+Y3JpbXNvbl9lZGl0b3I8L2xpPg0KCTxsaT5kYXduPC9saT4NCgk8bGk+ZWNsaXBzZTwvbGk+DQoJPGxpPmlkbGVfZmluZ2VyczwvbGk+DQoJPGxpPmtyX3RoZW1lPC9saT4NCgk8bGk+bWVyYml2b3JlPC9saT4NCgk8bGk+bWVyYml2b3JlX3NvZnQ8L2xpPg0KCTxsaT5tb25vX2luZHVzdHJpYWw8L2xpPg0KCTxsaT5tb25va2FpPC9saT4NCgk8bGk+cGFzdGVsX29uX2Rhcms8L2xpPg0KCTxsaT5zb2xhcml6ZWRfZGFyazwvbGk+DQoJPGxpPnNvbGFyaXplZF9saWdodDwvbGk+DQoJPGxpPnRleHRtYXRlPC9saT4NCgk8bGk+dHdpbGlnaHQ8L2xpPg0KCTxsaT52aWJyYW50X2luazwvbGk+DQo8L3VsPic7CiRsYW5nWydoZWxwX3BhcmFtX21vZGUnXSA9ICdpcyB1c2VkIHdpdGhpbiBhIHBhZ2Ugd2l0aCA8Y29kZT57QWNlRWRpdG9yIGFjdGlvbj0mIzAzOTtkZWZhdWx0JiMwMzk7fTwvY29kZT4gbW9kdWxlIHRhZy4gVGhpcyBzcGVjaWZpZXMgU3ludGF4aGlnaGxpZ2h0ZXIgbW9kZSBmb3Igc3BlY2lmaWMgY29kZSBhcmVhLiA8YnIgLz5Qb3NzaWJsZSB2YWx1ZXMgYXJlOg0KPHVsPg0KCTxsaT5qYXZhc2NyaXB0PC9saT4gDQoJPGxpPnBsYWluPC9saT4gDQoJPGxpPnN2ZzwvbGk+IA0KCTxsaT5odG1sPC9saT4NCgk8bGk+Y3NzPC9saT4NCgk8bGk+c2NzczwvbGk+DQoJPGxpPmNvZmZlZTwvbGk+DQoJPGxpPmpzb248L2xpPg0KCTxsaT5weXRob248L2xpPg0KCTxsaT5ydWJ5PC9saT4NCgk8bGk+cGVybDwvbGk+DQoJPGxpPnBocDwvbGk+DQoJPGxpPmphdmE8L2xpPg0KCTxsaT5jc2hhcnA8L2xpPg0KCTxsaT5jX2NwcDwvbGk+DQoJPGxpPmNsb2p1cmU8L2xpPg0KCTxsaT5vY2FtbDwvbGk+DQoJPGxpPnRleHRpbGU8L2xpPg0KCTxsaT5ncm9vdnk8L2xpPg0KCTxsaT5zY2FsYTwvbGk+DQo8L3VsPic7CiRsYW5nWydoZWxwX3BhcmFtX3RoZW1lJ10gPSAnaXMgdXNlZCB3aXRoaW4gYSBwYWdlIHdpdGggPGNvZGU+e0FjZUVkaXRvciBhY3Rpb249JiMwMzk7ZGVmYXVsdCYjMDM5O308L2NvZGU+IG1vZHVsZSB0YWcuIFRoaXMgc3BlY2lmaWVzIFN5bnRheGhpZ2hsaWdodGVyIHRoZW1lIGZvciBzcGVjaWZpYyBjb2RlIGFyZWEuIDxiciAvPlBvc3NpYmxlIHZhbHVlcyBhcmU6DQo8dWw+DQoJPGxpPmNsb3VkczwvbGk+IA0KCTxsaT5jbG91ZHNfbWlkbmlnaHQ8L2xpPiANCgk8bGk+Y29iYWx0PC9saT4gDQoJPGxpPmNyaW1zb25fZWRpdG9yPC9saT4NCgk8bGk+ZGF3bjwvbGk+DQoJPGxpPmVjbGlwc2U8L2xpPg0KCTxsaT5pZGxlX2ZpbmdlcnM8L2xpPg0KCTxsaT5rcl90aGVtZTwvbGk+DQoJPGxpPm1lcmJpdm9yZTwvbGk+DQoJPGxpPm1lcmJpdm9yZV9zb2Z0PC9saT4NCgk8bGk+bW9ub19pbmR1c3RyaWFsPC9saT4NCgk8bGk+bW9ub2thaTwvbGk+DQoJPGxpPnBhc3RlbF9vbl9kYXJrPC9saT4NCgk8bGk+c29sYXJpemVkX2Rhcms8L2xpPg0KCTxsaT5zb2xhcml6ZWRfbGlnaHQ8L2xpPg0KCTxsaT50ZXh0bWF0ZTwvbGk+DQoJPGxpPnR3aWxpZ2h0PC9saT4NCgk8bGk+dmlicmFudF9pbms8L2xpPg0KPC91bD4nOwokbGFuZ1snaGVscF9wYXJhbV93aWR0aCddID0gJ0JyZWVkdGUgdmFuIGRlIFN5bnRheGhpZ2hsaWdodGVyIHJ1aW10ZSBpbiBwaXhlbHMuJzsKJGxhbmdbJ2hlbHBfcGFyYW1faGVpZ2h0J10gPSAnSG9vZ3RlIHZhbiBkZSBTeW50YXhoaWdobGlnaHRlciBydWltdGUgaW4gcGl4ZWxzLic7CiRsYW5nWydoZWxwX3BhcmFtX2RpdmlkJ10gPSAnaWQgb2YgdGhlIGVsZW1lbnQgY29udGFpbmluZyB5b3VyIGNvZGUuIFVzZSB1bmlxdWUgaWQgZm9yIGVhY2ggY29kZSBjaHVuY2suJzsKJGxhbmdbJ2hlbHBfZ2VuZXJhbF90aXRsZSddID0gJ0FsZ2VtZWVuJzsKJGxhbmdbJ2hlbHBfZ2VuZXJhbF90ZXh0J10gPSAnPGgzPldoYXQgZG9lcyB0aGlzIG1vZHVsZSBkbz88L2gzPg0KPHA+QWNlRWRpdG9yIGlzIGEgU3ludGF4aGlnaGxpZ2h0ZXIgbW9kdWxlIHVzaW5nIDxzdHJvbmc+QWNlPC9zdHJvbmc+IGEgc3RhbmRhbG9uZSBjb2RlIGVkaXRvciB3cml0dGVuIGluIEphdmFTY3JpcHQuPGJyIC8+IA0KR29hbCBvZiBBY2UgY29kZSBlZGl0b3IgZ3JvdXAgaXMgdG8gY3JlYXRlIGEgd2ViIGJhc2VkIGNvZGUgZWRpdG9yIHRoYXQgbWF0Y2hlcyBhbmQgZXh0ZW5kcyB0aGUgZmVhdHVyZXMsIHVzYWJpbGl0eSBhbmQgcGVyZm9ybWFuY2Ugb2YgZXhpc3RpbmcgbmF0aXZlIGVkaXRvcnMgc3VjaCBhcyBUZXh0TWF0ZSwgVmltIG9yIEVjbGlwc2UuPGJyIC8+DQpJdCBjYW4gYmUgZWFzaWx5IGVtYmVkZGVkIGluIGFueSB3ZWIgcGFnZSBhbmQgSmF2YVNjcmlwdCBhcHBsaWNhdGlvbi48YnIgLz4gDQpBY2UgaXMgZGV2ZWxvcGVkIGFzIHRoZSBwcmltYXJ5IGVkaXRvciBmb3IgPGEgaHJlZj0iaHR0cDovL3d3dy5jbG91ZDlpZGUuY29tIj5DbG91ZDkgSURFPC9hPiBhbmQgdGhlIHN1Y2Nlc3NvciBvZiB0aGUgTW96aWxsYSBTa3l3cml0ZXIgKEJlc3BpbikgUHJvamVjdC48L3A+DQo8aDM+QWNlIGlzIGhvc3RlZCBvbiBHaXRIdWI8L2gzPg0KPHA+VGhlIEFjZSBzb3VyY2UgY29kZSBpcyBob3N0ZWQgb24gR2l0SHViLiBJdCBpcyByZWxlYXNlZCB1bmRlciB0aGUgTW96aWxsYSB0cmktbGljZW5zZSAoTVBML0dQTC9MR1BMKS48YnIgLz4NClRoaXMgaXMgdGhlIHNhbWUgbGljZW5zZSB1c2VkIGJ5IEZpcmVmb3guIFRoaXMgbGljZW5zZSBpcyBmcmllbmRseSB0byBhbGwga2luZHMgb2YgcHJvamVjdHMsIHdoZXRoZXIgb3BlbiBzb3VyY2Ugb3Igbm90LjxiciAvPg0KIFRha2UgY2hhcmdlIG9mIHlvdXIgZWRpdG9yIGFuZCBhZGQgeW91ciBmYXZvcml0ZSBsYW5ndWFnZSBoaWdobGlnaHRpbmcgYW5kIGtleWJpbmRpbmdzITwvcD4NCjxoMz5Vc2luZyBBY2VFZGl0b3IgTW9kdWxlPC9oMz4NCjxwPlVzaW5nIEFjZUVkaXRvciBNb2R1bGUgaXMgc2ltcGxlLjxiciAvPg0KQWZ0ZXIgQWNlRWRpdG9yIHdhcyBpbnN0YWxsZWQgZ28gdG8gJnF1b3Q7TXkgUHJlZmVyZW5jZXMgJnJhcXVvOyBVc2VyIFByZWZlcmVuY2VzJnF1b3Q7IGFuZCBjaG9vc2UgQWNlRWRpdG9yIGFzIHlvdXIgU3ludGF4aGlnaGxpZ2h0ZXIgb2YgY2hvaWNlIGZyb20gJnF1b3Q7U2VsZWN0IHN5bnRheCBoaWdobGlnaHRlciB0byB1c2U6JnF1b3Q7IERyb3Bkb3duLjxiciAvPg0KTWFrZSBzdXJlIHlvdSBoYXZlICYjMDM5O01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJiMwMzk7IFBlcm1zaXNzaW9uLjwvcD4NCjxoMz5TZXR0aW5nczwvaDM+DQo8cD5Zb3UgY2FuIGNoYW5nZSBkZWZhdWx0IFNldHRpbmdzIGFuZCBUaGVtZXMgaW4gJnF1b3Q7RXh0ZW5zaW9ucyAmcmFxdW87IEFjZUVkaXRvciZxdW90OzwvcD4nOwokbGFuZ1snaGVscF9rZXlib2FyZHNob3J0Y3V0c190aXRsZSddID0gJ1RvZXRzZW5ib3JkIFNuZWxrb3BwZWxpbmdlbic7CiRsYW5nWydoZWxwX2tleWJvYXJkc2hvcnRjdXRzX2NvbnRlbnQnXSA9ICcgICAgDQogICAgICA8aDM+RGVmYXVsdCBLZXlib2FyZCBTaG9ydGN1dHM8L2gzPg0KDQo8dGFibGUgY2xhc3M9JnF1b3Q7cGFnZXRhYmxlJnF1b3Q7IGNlbGxzcGFjaW5nPSZxdW90OzAmcXVvdDsgc3VtbWFyeT0mcXVvdDtEZWZhdWx0IEtleWJvYXJkIFNob3J0Y3V0cyZxdW90Oz4NCjx0aGVhZD48dHI+DQo8dGg+UEMgKFdpbmRvd3MvTGludXgpPC90ZD4NCjx0aD5NYWM8L3RkPg0KPHRoPmFjdGlvbjwvdGQ+DQo8L3RyPjwvdGhlYWQ+DQo8dGJvZHk+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtUmV0dXJuPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtUmV0dXJuPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmZ1bGxzY3JlZW48L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1TPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtUzwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5wZXJmb3JtIHNhdmU8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtTDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5jZW50ZXIgc2VsZWN0aW9uPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtQWx0LURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1PcHRpb24tRG93bjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5jb3B5IGxpbmVzIGRvd248L3RkPg0KPC90cj4NCjx0ciBsY2Fzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1BbHQtVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1PcHRpb24tVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Y29weSBsaW5lcyB1cDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUY8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1GPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmZpbmQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1LPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtRzwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5maW5kIG5leHQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1TaGlmdC1LPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtU2hpZnQtRzwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5maW5kIHByZXZpb3VzPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkRvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+RG93bixDdHJsLU48L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gbGluZSBkb3duPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlVwLEN0cmwtUDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5nbyBsaW5lIHVwPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtRW5kLEN0cmwtRG93bjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLUVuZCxDb21tYW5kLURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gdG8gZW5kPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkxlZnQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+TGVmdCxDdHJsLUI8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gdG8gbGVmdDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUw8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1MPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIHRvIGxpbmU8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+QWx0LVJpZ2h0LEVuZDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLVJpZ2h0LEVuZCxDdHJsLUU8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gdG8gbGluZSBlbmQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+QWx0LUxlZnQsSG9tZTwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLUxlZnQsSG9tZSxDdHJsLUE8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gdG8gbGluZSBzdGFydDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5QYWdlRG93bjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5PcHRpb24tUGFnZURvd24sQ3RybC1WPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIHRvIHBhZ2UgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5QYWdlVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+T3B0aW9uLVBhZ2VVcDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5nbyB0byBwYWdlIHVwPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlJpZ2h0LEN0cmwtRjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5nbyB0byByaWdodDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUhvbWUsQ3RybC1VcDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLUhvbWUsQ29tbWFuZC1VcDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5nbyB0byBzdGFydDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUxlZnQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+T3B0aW9uLUxlZnQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gdG8gd29yZCBsZWZ0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtUmlnaHQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+T3B0aW9uLVJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIHRvIHdvcmQgcmlnaHQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+VGFiPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlRhYjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5pbmRlbnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+QWx0LURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+T3B0aW9uLURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+bW92ZSBsaW5lcyBkb3duPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkFsdC1VcDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5PcHRpb24tVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+bW92ZSBsaW5lcyB1cDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1UYWI8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtVGFiPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pm91dGRlbnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+SW5zZXJ0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pkluc2VydDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5vdmVyd3JpdGU8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlBhZ2VEb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnBhZ2Vkb3duPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5QYWdlVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+cGFnZXVwPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtU2hpZnQtWixDdHJsLVk8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1TaGlmdC1aLENvbW1hbmQtWTwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5yZWRvPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtRDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLUQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+cmVtb3ZlIGxpbmU8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtSzwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5yZW1vdmUgdG8gbGluZSBlbmQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pk9wdGlvbi1CYWNrc3BhY2U8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+cmVtb3ZlIHRvIGxpbmVzdGFydDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz48L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+QWx0LUJhY2tzcGFjZSxDdHJsLUFsdC1CYWNrc3BhY2U8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+cmVtb3ZlIHdvcmQgbGVmdDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz48L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+QWx0LURlbGV0ZTwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5yZW1vdmUgd29yZCByaWdodDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVI8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1PcHRpb24tRjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5yZXBsYWNlPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtU2hpZnQtUjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLVNoaWZ0LU9wdGlvbi1GPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnJlcGxhY2UgYWxsPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtQTwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLUE8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IGFsbDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IGRvd248L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtTGVmdDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCBsZWZ0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LUVuZDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1FbmQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IGxpbmUgZW5kPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LUhvbWU8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtSG9tZTwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3QgbGluZSBzdGFydDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1QYWdlRG93bjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1QYWdlRG93bjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3QgcGFnZSBkb3duPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LVBhZ2VVcDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1QYWdlVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IHBhZ2UgdXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtUmlnaHQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtUmlnaHQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IHJpZ2h0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtU2hpZnQtRW5kLEFsdC1TaGlmdC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtU2hpZnQtRG93bjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3QgdG8gZW5kPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkFsdC1TaGlmdC1SaWdodDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLVNoaWZ0LVJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCB0byBsaW5lIGVuZDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5BbHQtU2hpZnQtTGVmdDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLVNoaWZ0LUxlZnQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IHRvIGxpbmUgc3RhcnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1TaGlmdC1Ib21lLEFsdC1TaGlmdC1VcDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLVNoaWZ0LVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCB0byBzdGFydDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1VcDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1VcDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3QgdXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1TaGlmdC1MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pk9wdGlvbi1TaGlmdC1MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCB3b3JkIGxlZnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1TaGlmdC1SaWdodDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5PcHRpb24tU2hpZnQtUmlnaHQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IHdvcmQgcmlnaHQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtTzwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zcGxpdCBsaW5lPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtNzwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLTc8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+dG9nZ2xlIGNvbW1lbnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1UPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtVDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz50cmFuc3Bvc2UgbGV0dGVyczwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVo8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1aPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnVuZG88L3RkPg0KPC90cj4NCjwvdGJvZHk+DQo8L3RhYmxlPic7CiRsYW5nWydoZWxwX2Zyb250ZW5kX3RpdGxlJ10gPSAnIEZyb250ZW5kJzsKJGxhbmdbJ2hlbHBfZnJvbnRlbmRfY29udGVudCddID0gJzxwPlRoaXMgTW9kdWxlIGFuZCBBY2UgU2NyaXB0IGNhbiBhbHNvIGJlIHVzZWQgYXMgYSBGcm9udGVuZCBTeW50YXhoaWdobGlnaHRlci48YnIgLz4NClRvIG1ha2UgaXQgd29yayB5b3UgaGF2ZSB0byBpbmNsdWRlIGpRdWVyeSBGcmFtZXdvcmssIGZvciBleGFtcGxlIHVzaW5nIENNU01TIHtjbXNfanF1ZXJ5fSB0YWcgYW5kIGFzIHdlbGwgaW5jbHVkZSB7QWNlRWRpdG9yfSBpbiB5b3VyIHBhZ2UgdHdpY2UuIEZpcnN0IGFkZCB0aGUgbW9kdWxlIHRhZyBpbiB5b3VyIDxoZWFkPiBzZWN0aW9uIG9mIFRlbXBsYXRlIG9yIGluICZxdW90O1BhZ2UgU3BlY2lmaWMgTWV0ZGF0YSZxdW90OyBmaWVsZCBvZiB5b3VyIENvbnRlbnQgcGFnZSwgbGlrZSB7QWNlRWRpdG9yIGFjdGlvbj0mIzAzOTtoZWFkJiMwMzk7fSBhbmQgYW5vdGhlciBjYWxsIHRvIHNwZWNpZnkgd2hpY2ggYXJlYSBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQsIGZvciBleGFtcGxlIHtBY2VFZGl0b3IgZGl2aWQ9JiMwMzk7Zm9vJiMwMzk7fSwgd2hpY2ggd291bGQgdGFyZ2V0IGEgcGFnZSBlbGVtZW50IHdpdGggaWQgPGVtPmZvbzwvZW0+LjwvcD4NCjxoMz5TbyBob3cgZG8geW91IHVzZSBpdD88L2gzPg0KPHA+Rmlyc3QgaW5jbHVkZSBqUXVlcnkgYW5kIE1vZHVsZSB0YWcgaW4geW91ciBQYWdlIDxoZWFkPiBhcmVhLCBmb3IgZXhhbXBsZSBpbiAmcXVvdDtQYWdlIFNwZWNpZmljIE1ldGRhdGEmcXVvdDs6PC9wPg0KCTxwcmU+DQoJe2Ntc19qcXVlcnl9DQoJe0FjZUVkaXRvciBhY3Rpb249JiMwMzk7aGVhZCYjMDM5O30NCgk8L3ByZT4NCjxwPlRoaXMgaW5jbHVkZXMgbmVlZGVkIHNjcmlwdHMgZm9yIEFjZSBTeW50YXhoaWdobGlnaHRlciB0byB3b3JrLjxiciAvPg0KSW4gTW9kdWxlcyBBZG1pbiBpbnRlcmZhY2UgeW91IGNhbiBzZWxlY3QgZGVmYXVsdCBzZXR0aW5ncyBmb3IgeW91ciAmIzAzOTtoZWFkJiMwMzk7IGFjdGlvbiBvciB1c2UgcGFyYW1ldGVyIG1vZGVzPSYjMDM5O2h0bWwsamF2YXNjcmlwdCYjMDM5OyBhbmQgdGhlbWVzPSYjMDM5O3RleHRtYXRlJiMwMzk7IHdoaWNoIHdvdWxkIG92ZXJyaWRlIHNlbGVjdGVkIFByZWZlcmVuY2VzLjwvcD4NCjxwPk5vdyB3aGVuIHlvdSBoYXZlIG5lZWRlZCBzY3JpcHRzIGluY2x1ZGVkLCBvbmUgbW9yZSBNb2R1bGUgdGFnIGNhbGwgaXMgbmVlZGVkIChmb3IgZXhhbXBsZSBpbiB5b3VyIENvbnRlbnQgRWRpdG9yIGFyZWEpIHRvIHNwZWNpZnkgd2hpY2ggYXJlYSBvZiB5b3VyIFBhZ2Ugc2hvdWxkIGJlIGhpZ2hsaWdodGVkLjwvcD4NCgk8cHJlPg0KCXtBY2VFZGl0b3IgZGl2aWQ9JiMwMzk7c29tZS1pZCYjMDM5O30NCgk8L3ByZT4NCjxwPlRoaXMgdGFnIGluY2x1ZGVzIG5lZWRlZCBTY3JpcHQgYW5kIFN0eWxlIHRoYXQgaXMgdXNlZCB0byBIaWdobGlnaHQgc2VsZWN0ZWQgZWxlbWVudCB3aXRoIHNwZWNpZmllZCBpZC48YnIgLz4NCkFsbCB5b3UgbmVlZCB0aGVuIGlzIHdyaXRlIHlvdXIgQ29kZSB0aGF0IHlvdSB3YW50IHRvIEhpZ2hsaWdodCBhbmQgd3JhcCBpdCBpbnNpZGUgYW4gZWxlbWVuIGxpa2UgPGRpdj4gd2l0aCBzcGVjaWZpZWQgaWQuPC9wPic7CiRsYW5nWydoZWxwX2Zyb250ZW5kX3NhbXBsZSddID0gJzxwcmUgaWQ9JnF1b3Q7c29tZS1pZCZxdW90Oz4NCiZhbXA7bHQ7aHRtbCZhbXA7Z3Q7DQogICAgICZhbXA7bHQ7aGVhZCZhbXA7Z3Q7DQogICAgICZhbXA7bHQ7c3R5bGUgdHlwZT0mcXVvdDt0ZXh0L2NzcyZxdW90OyZhbXA7Z3Q7DQogICAgICAgICAudGV4dC1sYXllciB7DQogICAgICAgICAgICAgZm9udC1mYW1pbHk6IE1vbmFjbywgJnF1b3Q7Q291cmllciBOZXcmcXVvdDssIG1vbm9zcGFjZTsNCiAgICAgICAgICAgICBmb250LXNpemU6IDEycHg7DQogICAgICAgICAgICAgY3Vyc29yOiB0ZXh0Ow0KICAgICAgICAgfQ0KICAgICAmYW1wO2x0Oy9zdHlsZSZhbXA7Z3Q7DQogICAgICZhbXA7bHQ7L2hlYWQmYW1wO2d0Ow0KICAgICAmYW1wO2x0O2JvZHkmYW1wO2d0Ow0KICAgICAgICAgJmFtcDtsdDtoMSBzdHlsZT0mcXVvdDtjb2xvcjpyZWQmcXVvdDsmYW1wO2d0O0p1aHUgS2lubmVycyZhbXA7bHQ7L2gxJmFtcDtndDsNCiAgICAgJmFtcDtsdDsvYm9keSZhbXA7Z3Q7ICZhbXA7bHQ7L2h0bWwmYW1wO2d0Ow0KPC9wcmU+JzsKJGxhbmdbJ2hlbHBfYWJvdXRfdGl0bGUnXSA9ICdPdmVyJzsKJGxhbmdbJ2hlbHBfYWJvdXRfdGV4dCddID0gJzxoMz5TdXBwb3J0PC9oMz4NCjxwPkFzIHBlciB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGFzLWlzLiBQbGVhc2UgcmVhZCB0aGUgdGV4dCBvZiB0aGUgbGljZW5zZSBmb3IgdGhlIGZ1bGwgZGlzY2xhaW1lci48L3A+DQo8aDM+Q29weXJpZ2h0IGFuZCBMaWNlbnNlPC9oMz4NCjxwPkNvcHlyaWdodCAmY29weTsgMjAxMiwgR29yYW4gSWxpYyA8YSBocmVmPSJtYWlsdG86dW5pcXUzZUBnbWFpbC5jb20iPjx1bmlxdTNlQGdtYWlsLmNvbT48L2E+IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNoLW1hY2gtZGFzLmF0IiByZWw9ImV4dGVybmFsIj53d3cuaWNoLW1hY2gtZGFzLmF0PC9hPi4gQWxsIFJpZ2h0cyBBcmUgUmVzZXJ2ZWQuPC9wPg0KPHA+VGhpcyBtb2R1bGUgaGFzIGJlZW4gcmVsZWFzZWQgdW5kZXIgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCI+R05VIFB1YmxpYyBMaWNlbnNlPC9hPi4gWW91IG11c3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlIGJlZm9yZSB1c2luZyB0aGUgbW9kdWxlLjwvcD4NCgk8aDM+VGVhbTwvaDM+DQoJPHVsPg0KCQk8bGk+R29yYW4gSWxpYyAodW5pcXUzKSBnLmlsaWNAaS1hcnRzLmV1IDxiciAvPnd3dy5pY2gtbWFjaC1kYXMuYXQ8L2xpPgkNCgkJPGxpPlJvYmVydCBDYW1wYmVsbCAoY2FsZ3V5MTAwMCkgY2FsZ3V5MTAwMEBjbXNtYWRlc2ltcGxlLm9yZyAgPGJyIC8+d3d3LmNhbGd1eTEwMDAuY29tPC9saT4JCQ0KCQk8bGk+Sm9uYXRoYW4gU2NobWlkIChGb2FseSopIGhpQGpvbmF0aGFuc2NobWlkLmRlIDxiciAvPnd3dy5qb25hdGhhbnNjaG1pZC5kZTwvbGk+DQoJPC91bD4NCic7CiRsYW5nWydjaGFuZ2Vsb2cnXSA9ICc8aDM+VmVyc2lvbiAwLjE8L2gzPg0KPHVsPg0KCTxsaT5JdCYjMDM5O3MgZnJlc2ghIE5vdGhpbmcgY2hhbmdlZCB5ZXQhPC9saT4NCgk8bGk+VXNpbmcgQWNlIFZlcnNpb24gMC4yLjA8L2xpPg0KPC91bD4NCjxoMz5WZXJzaW9uIDAuMjwvaDM+DQo8dWw+DQoJPGxpPkFkZGVkIENUUkwtUyBLZXliaW5kaW5nPC9saT4NCgk8bGk+QWRkZWQgRnVsbHNjcmVlbm1vZGU8L2xpPg0KCTxsaT5BZGRlZCBGcm9udGVuZCBIaWdobGlnaHRpbmc8L2xpPg0KCTxsaT5VcGRhdGVkIEFjZTwvbGk+DQo8L3VsPg0KPGgzPlZlcnNpb24gMC4yLjE8L2gzPg0KPHVsPg0KCTxsaT5BZGRlZCBJbnRlcm5ldCBFeHBsb3JlciBwcmVmZXJlbmNlPC9saT4NCgk8bGk+VXBkYXRlZCBBQ0Ugd2l0aCB0aGVtZXM8L2xpPg0KPC91bD4NCjxoMz5Sb2FkbWFwPC9oMz4NCjx1bD4NCgk8bGk+PGRlbD5BZGQgRnJvbnRlbmQgU3ludGF4aGlnaGxpZ2h0aW5nPC9kZWw+PC9saT4NCgk8bGk+PGRlbD5BZGQgRnVsbHNjcmVlbm1vZGU8L2RlbD48L2xpPg0KCTxsaT48ZGVsPkFkZCBLZXliaW5kaW5nIChDVFJMK1MpPC9kZWw+PC9saT4NCgk8bGk+QWRkIEVkaXRvciBiZWhhdmlvciAoVmltLCBFTWFjcyk8L2xpPg0KCTxsaT5NYXliZSBhZGQgVG9vbGJhcjwvbGk+DQo8L3VsPic7CiRsYW5nWydxY2EnXSA9ICdQMC0yMzU3Njg4MzgtMTMxODg1OTkzNTc2NSc7CiRsYW5nWyd1dG1hJ10gPSAnMTU2ODYxMzUzLjY3NDI4OTk3OC4xMzI3MjU4MjE3LjEzMjcyNTgyMTcuMTMyNzI1ODIxNy4xJzsKJGxhbmdbJ3V0bXonXSA9ICcxNTY4NjEzNTMuMTMyNzI1ODIxNy4xLjEudXRtY2NuPShkaXJlY3QpfHV0bWNzcj0oZGlyZWN0KXx1dG1jbWQ9KG5vbmUpJzsKJGxhbmdbJ3V0bWInXSA9ICcxNTY4NjEzNTMnOwokbGFuZ1sndXRtYyddID0gJzE1Njg2MTM1Myc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/sr_YU.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0FjZUVkaXRvcic7CiRsYW5nWydhZG1pbmRlc2NyaXB0aW9uJ10gPSAnQWNlRWRpdG9yIGplIDxlbT5TeW50YXhoaWdobGlnaHRlcjwvZW0+IG1vZHVsIGtvamkga29yaXN0aSA8c3Ryb25nPkFjZTwvc3Ryb25nPiwgZWRpdG9yIGtvZGEgcGlzYW4gdSBKYXZhU2NyaXB0LXUuJzsKJGxhbmdbJ3NldHRpbmdzX3RhYiddID0gJ1ByZWZyZW5jaWplJzsKJGxhbmdbJ2Zyb250ZW5kc2V0dGluZ3NfdGFiJ10gPSAnUHJlZmVyZW5jaWplIHphIGtvcmlzbmnEjWtpIGRlbyc7CiRsYW5nWydmcm9udGVuZF9oZWFkX3NldHRpbmdzJ10gPSAnRnJvbnRlbmQgSGVhZCBQcmVmZXJlbmNlcyc7CiRsYW5nWydmcm9udGVuZF9zeW50YXhhcmVhX3NldHRpbmdzJ10gPSAnRnJvbnRlbmQgU3ludGF4YXJlYSBQcmVmZXJlbmNlcyc7CiRsYW5nWydoZWFkX2Rlc2NyaXB0aW9uJ10gPSAnVGhlc2UgcHJlZmVyZW5jZXMgYXJlIHVzZWQgZm9yIGRlZmF1bHQgc2V0dGluZ3Mgb2YgQWNlIHNjcmlwdHMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gcGFnZSA8Y29kZT48aGVhZD48L2NvZGU+IHdoZW4gY2FsbGluZyA8Y29kZT57QWNlRWRpdG9yIGFjdGlvbj0mIzAzOTtoZWFkJiMwMzk7fTwvY29kZT4gZnJvbSBQYWdlIFNwZWNpZmljIE1ldGFkYXRhIG9yIFRlbXBsYXRlLic7CiRsYW5nWydjb250ZW50X2Rlc2NyaXB0aW9uJ10gPSAnVGhlc2UgcHJlZmVyZW5jZXMgYXJlIHVzZWQgZm9yIGRlZmF1bHQgc2V0dGluZ3Mgb2YgU3ludGF4aGlnaGxpZ2h0aW5nIGFyZWEgd2hlbiBjYWxsaW5nIDxjb2RlPntBY2VFZGl0b3IgZGl2aWQ9JiMwMzk7ZWRpdG9yJiMwMzk7fTwvY29kZT4gdGFnIHdpdGhpbiBhIFBhZ2UuJzsKJGxhbmdbJ3N5bnRheGFyZWFkZXNjcmlwdGlvbiddID0gJ1RoZXNlIHByZWZlcmVuY2VzIGFyZSB1c2VkIGZvciBkZWZhdWx0IHNldHRpbmdzIG9mIEFjZSBiZWhhdmlvciB3aGVuIGNhbGxpbmcgPGNvZGU+e0FjZUVkaXRvciBkaXZpZD0mIzAzOTtmb28mIzAzOTt9PC9jb2RlPiBmcm9tIGEgUGFnZSBvciBUZW1wbGF0ZSc7CiRsYW5nWydleGFtcGxlX2RvY3VtZW50J10gPSAnRG9rdW1lbnQnOwokbGFuZ1snd2lkdGhfdGl0bGUnXSA9ICcmU2Nhcm9uO2lyaW5hIGVkaXRvcmEgKHUgZW0pJzsKJGxhbmdbJ2hlaWdodF90aXRsZSddID0gJ1Zpc2luYSBlZGl0b3JhICh1IGVtKSc7CiRsYW5nWydlbmFibGVfaWUnXSA9ICdPbW9ndcSHaSBpIHphIEludGVybmV0IEV4cGxvcmVyJzsKJGxhbmdbJ2VuYWJsZV9pZWRlc2NyaXB0aW9uJ10gPSAnPGVtPkFjZSBTeW50YXhoaWdobGlnaHRlcjwvZW0+IG5lIHJhZGkgYmEmc2Nhcm9uOyBuYWpib2xqZSB1IEludGVybmV0IEV4cGxvcmVydS4gT3Z1IG9wY2lqdSB1a2xqdcSNaXRlIG5hIHNvcHN0dmVuaSByaXppayEnOwokbGFuZ1snZnJvbnRlbmRfd2lkdGhfdGl0bGUnXSA9ICcmU2Nhcm9uO2lyaW5hIHphIGtvcmlzbmnEjWtpIGRlbyAodSBweCknOwokbGFuZ1snZnJvbnRlbmRfaGVpZ2h0X3RpdGxlJ10gPSAnVmlzaW5hIHphIGtvcmlzbmnEjWtpIGRlbyAodSBweCknOwokbGFuZ1snc3ludGF4X21vZGUnXSA9ICdNb2QgcmFkYSc7CiRsYW5nWyd0aGVtZXMnXSA9ICdUZW1hJzsKJGxhbmdbJ2ZvbnRfc2l6ZSddID0gJ1ZlbGnEjWluYSBmb250YSc7CiRsYW5nWydmdWxsX2xpbmUnXSA9ICdTZWxla3R1aiBjZWx1IGxpbmlqdSc7CiRsYW5nWydoaWdobGlnaHRfYWN0aXZlJ10gPSAnT3puYcSNaSBha3Rpdm51IGxpbmlqdSc7CiRsYW5nWydzaG93X2ludmlzaWJsZXMnXSA9ICdQcmlrYcW+aSBuZXZpZGxqaXZlIGthcmFrdGVyZSc7CiRsYW5nWydwZXJzaXN0ZW50X2hzY3JvbGwnXSA9ICdQZXJzaXRlbnQgSFNjcm9sbCc7CiRsYW5nWydrZXlfYmluZGluZyddID0gJ0tleSBCaW5kaW5nJzsKJGxhbmdbJ3NvZnRfd3JhcCddID0gJ1ByZWxhbWFuamUgbGluaWphJzsKJGxhbmdbJ3Nob3dfZ3V0dGVyJ10gPSAnUHJpa2HFvmkgPGVtPkd1dHRlcjwvZW0+JzsKJGxhbmdbJ3ByaW50X21hcmdpbiddID0gJ1ByaWthxb5pIG1hcmdpbnUgemEgJnNjYXJvbjt0YW1wdSc7CiRsYW5nWydzb2Z0X3RhYiddID0gJ1VzZSBTb2Z0IFRhYic7CiRsYW5nWydoaWdobGlnaHRfc2VsZWN0ZWQnXSA9ICdPem5hxI1pIHNlbGVrdG92YW51IHJlxI0nOwokbGFuZ1snZW5hYmxlX2JlaGF2aW9ycyddID0gJ0VuYWJsZSBCZWhhdmlvcnMnOwokbGFuZ1sndGVzdGFyZWF0ZXh0J10gPSAnUHJlZ2xlZCc7CiRsYW5nWydqcyddID0gJ0phdmFTY3JpcHQnOwokbGFuZ1sncGxhaW4nXSA9ICdPYmnEjW5pIHRla3N0JzsKJGxhbmdbJ3N2ZyddID0gJ1NWRyc7CiRsYW5nWydodG1sJ10gPSAnSFRNTCc7CiRsYW5nWydjc3MnXSA9ICdDU1MnOwokbGFuZ1snc2NzcyddID0gJ1NDU1MnOwokbGFuZ1snY29mZmVlJ10gPSAnQ29mZmVlU2NyaXB0JzsKJGxhbmdbJ2pzb24nXSA9ICdKU09OJzsKJGxhbmdbJ3B5dGhvbiddID0gJ1B5dGhvbic7CiRsYW5nWydydWJ5J10gPSAnUnVieSc7CiRsYW5nWydwZXJsJ10gPSAnUGVybCc7CiRsYW5nWydwaHAnXSA9ICdQSFAnOwokbGFuZ1snamF2YSddID0gJ0phdmEnOwokbGFuZ1snY3NoYXJwJ10gPSAnQyMnOwokbGFuZ1snY19jcHAnXSA9ICdDKysnOwokbGFuZ1snY2xvanVyZSddID0gJ0Nsb2p1cmUnOwokbGFuZ1snb2NhbWwnXSA9ICdPQ2FtbCc7CiRsYW5nWyd0ZXh0aWxlJ10gPSAnVGV4dGlsZSc7CiRsYW5nWydncm9vdnknXSA9ICdHcm9vdnknOwokbGFuZ1snc2NhbGEnXSA9ICdTY2FsYSc7CiRsYW5nWydjbG91ZHMnXSA9ICdDbG91ZHMnOwokbGFuZ1snY2hyb21lJ10gPSAnQ2hyb21lJzsKJGxhbmdbJ2Nsb3Vkc19taWRuaWdodCddID0gJ0Nsb3VkcyBNaWRuaWdodCc7CiRsYW5nWydjb2JhbHQnXSA9ICdDb2JhbHQnOwokbGFuZ1snY3JpbXNvbl9lZGl0b3InXSA9ICdDcmltc29uIEVkaXRvcic7CiRsYW5nWydkYXduJ10gPSAnRGF3bic7CiRsYW5nWydkcmVhbXdlYXZlciddID0gJ0RyZWFtd2VhdmVyJzsKJGxhbmdbJ2VjbGlwc2UnXSA9ICdFY2xpcHNlJzsKJGxhbmdbJ2lkbGVfZmluZ2VycyddID0gJ2lkbGVGaW5nZXJzJzsKJGxhbmdbJ2tyX3RoZW1lJ10gPSAna3JUaGVtZSc7CiRsYW5nWydtZXJiaXZvcmUnXSA9ICdNZXJiaXZvcmUnOwokbGFuZ1snbWVyYml2b3JlX3NvZnQnXSA9ICdNZXJiaXZvcmUgU29mdCc7CiRsYW5nWydtb25vX2luZHVzdHJpYWwnXSA9ICdNb25vIEluZHVzdHJpYWwnOwokbGFuZ1snbW9ub2thaSddID0gJ01vbm9rYWknOwokbGFuZ1sncGFzdGVsX29uX2RhcmsnXSA9ICdQYXN0ZWwgb24gZGFyayc7CiRsYW5nWydzb2xhcml6ZWRfZGFyayddID0gJ1NvbGFyaXplZCBEYXJrJzsKJGxhbmdbJ3NvbGFyaXplZF9saWdodCddID0gJ1NvbGFyaXplZCBMaWdodCc7CiRsYW5nWyd0ZXh0bWF0ZSddID0gJ1RleHRNYXRlJzsKJGxhbmdbJ3RvbW9ycm93J10gPSAnVG9tb3Jyb3cnOwokbGFuZ1sndG9tb3Jyb3dfbmlnaHQnXSA9ICdUb21vcnJvdyBOaWdodCc7CiRsYW5nWyd0b21vcnJvd19uaWdodF9icmlnaHQnXSA9ICdUb21vcnJvdyBOaWdodCBCcmlnaHQnOwokbGFuZ1sndG9tb3Jyb3dfbmlnaHRfYmx1ZSddID0gJ1RvbW9ycm93IE5pZ2h0IEJsdWUnOwokbGFuZ1sndG9tb3Jyb3dfbmlnaHRfZWlnaHRpZXMnXSA9ICdUb21vcnJvdyBOaWdodCBFaWdodGllcyc7CiRsYW5nWyd0d2lsaWdodCddID0gJ1R3aWxpZ2h0JzsKJGxhbmdbJ3ZpYnJhbnRfaW5rJ10gPSAnVmlicmFudCBJbmsnOwokbGFuZ1snYWNlJ10gPSAnQWNlJzsKJGxhbmdbJ3ZpbSddID0gJ1ZpbSc7CiRsYW5nWydlbWFjcyddID0gJ0VNYWNzJzsKJGxhbmdbJ2N1c3RvbSddID0gJ0tvcmlzbmnEjWtpIGRlZmluaXNhbm8nOwokbGFuZ1snb2ZmJ10gPSAnSXNrbGp1xI1lbm8nOwokbGFuZ1snNDAnXSA9ICc0MCBrYXJha3RlcmEnOwokbGFuZ1snODAnXSA9ICc4MCBrYXJha3RlcmEnOwokbGFuZ1snMTAwJ10gPSAnMTAwIGthcmFrdGVyYSc7CiRsYW5nWycxNDAnXSA9ICcxNDAga2FyYWt0ZXJhJzsKJGxhbmdbJ3NhdmVzZXR0aW5ncyddID0gJ1NhxI11dmFqIHBvZGUmc2Nhcm9uO2F2YW5qYSc7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAnVmEmc2Nhcm9uO2EgcG9kZSZzY2Fyb247YXZhbmphIEFjZUVkaXRvcmEgc3Ugc2HEjXV2YW5hJzsKJGxhbmdbJ2Zyb250ZW5kc2V0dGluZ3NzYXZlZCddID0gJ1ZhJnNjYXJvbjthIHBvZGUmc2Nhcm9uO2F2YW5qYSBBY2VFZGl0b3JhIHphIGtvcmlzbmnEjWtpIGRlbyBzYWp0YSBzdSBzYcSNdXZhbmEnOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICdBY2VFZGl0b3IgamUgdXNwZSZzY2Fyb247bm8gaW5zdGFsaXJhbiEgUG9kZXNpdGUgJnF1b3Q7TWVuamFuamUgcG9kZSZzY2Fyb247YXZhbmphIHNhanRhJnF1b3Q7IGRvenZvbGUgZGEgYmlzdGUga29yaXN0aWxpIG92YWogbW9kdWwuJzsKJGxhbmdbJ3Bvc3R1bmluc3RhbGwnXSA9ICdBY2VFZGl0b3IgamUgdXNwZSZzY2Fyb247bm8gZGVpbnN0YWxpcmFuJzsKJGxhbmdbJ3JlYWxseV91bmluc3RhbGwnXSA9ICdTdHZhcm5vPyBTaWd1cm5pIHN0ZSBkYSDFvmVsaXRlIGRhIGRlaW5zdGFsaXJhdGUgQWNlRWRpdG9yPyBSYXptaXNsaXRlIGpvJnNjYXJvbjsgamVkbm9tLi4uJzsKJGxhbmdbJ2hlbHBfcGFyYW1fYWN0aW9uJ10gPSAnaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGFjdGlvbiBvZiBNb2R1bGUgdGFnLiBQb3NzaWJsZSB2YWx1ZXMgYXJlICYjMDM5O2RlZmF1bHQmIzAzOTsgYW5kICYjMDM5O2hlYWQmIzAzOTsuIEJvdGggYXJlIG5lZWRlZCBmb3IgY29ycmVjdCBGcm9udGVuZCBTeW50YXhoaWdobGlnaHRpbmcgZnVuY3Rpb24uIDxiciAvPlBvc3NpYmxlIHZhbHVlcyBhcmU6DQo8dWw+DQoJPGxpPmhlYWQ8L2xpPg0KCTxsaT5kZWZhdWx0PC9saT4NCjwvdWw+JzsKJGxhbmdbJ2hlbHBfcGFyYW1fbW9kZXMnXSA9ICdpcyB1c2VkIHdpdGggPGNvZGU+e0FjZUVkaXRvciBhY3Rpb249JiMwMzk7aGVhZCYjMDM5O308L2NvZGU+LiBZb3UgY2FuIGluY2x1ZGUgbXVsdGlwbGUgY29tbWEgc2VwYXJhdGVkICYjMDM5O21vZGVzJiMwMzk7IHRoYXQgeW91IHdpbGwgYmUgdXNpbmcgb24geW91ciB3ZWJzaXRlLiBUaGlzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB5b3VyIDxoZWFkPiBvZiBUZW1wbGF0ZSBvciBQYWdlIHNwZWNpZmljIE1ldGFkYXRhLiBUaGlzIHdpbGwgb3ZlcnJpZGUgeW91IFByZWZlcmVuY2VzIHNlbGVjdGVkIGluIE1vZHVsZSBBZG1pbiBhcmVhLiA8YnIgLz5Qb3NzaWJsZSB2YWx1ZXMgYXJlOg0KPHVsPg0KCTxsaT5qYXZhc2NyaXB0PC9saT4gDQoJPGxpPnBsYWluPC9saT4gDQoJPGxpPnN2ZzwvbGk+IA0KCTxsaT5odG1sPC9saT4NCgk8bGk+Y3NzPC9saT4NCgk8bGk+c2NzczwvbGk+DQoJPGxpPmNvZmZlZTwvbGk+DQoJPGxpPmpzb248L2xpPg0KCTxsaT5weXRob248L2xpPg0KCTxsaT5ydWJ5PC9saT4NCgk8bGk+cGVybDwvbGk+DQoJPGxpPnBocDwvbGk+DQoJPGxpPmphdmE8L2xpPg0KCTxsaT5jc2hhcnA8L2xpPg0KCTxsaT5jX2NwcDwvbGk+DQoJPGxpPmNsb2p1cmU8L2xpPg0KCTxsaT5vY2FtbDwvbGk+DQoJPGxpPnRleHRpbGU8L2xpPg0KCTxsaT5ncm9vdnk8L2xpPg0KCTxsaT5zY2FsYTwvbGk+DQo8L3VsPic7CiRsYW5nWydoZWxwX3BhcmFtX3RoZW1lcyddID0gJ2lzIHVzZWQgd2l0aCA8Y29kZT57QWNlRWRpdG9yIGFjdGlvbj0mIzAzOTtoZWFkJiMwMzk7fTwvY29kZT4uIFlvdSBjYW4gaW5jbHVkZSBtdWx0aXBsZSBjb21tYSBzZXBhcmF0ZWQgJiMwMzk7dGhlbWVzJiMwMzk7IHRoYXQgeW91IHdpbGwgYmUgdXNpbmcgb24geW91ciB3ZWJzaXRlLiBUaGlzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB5b3VyIDxoZWFkPiBvZiBUZW1wbGF0ZSBvciBQYWdlIHNwZWNpZmljIE1ldGFkYXRhLiBUaGlzIHdpbGwgb3ZlcnJpZGUgeW91IFByZWZlcmVuY2VzIHNlbGVjdGVkIGluIE1vZHVsZSBBZG1pbiBhcmVhLiA8YnIgLz5Qb3NzaWJsZSB2YWx1ZXMgYXJlOg0KPHVsPg0KCTxsaT5jbG91ZHM8L2xpPiANCgk8bGk+Y2xvdWRzX21pZG5pZ2h0PC9saT4gDQoJPGxpPmNvYmFsdDwvbGk+IA0KCTxsaT5jcmltc29uX2VkaXRvcjwvbGk+DQoJPGxpPmRhd248L2xpPg0KCTxsaT5lY2xpcHNlPC9saT4NCgk8bGk+aWRsZV9maW5nZXJzPC9saT4NCgk8bGk+a3JfdGhlbWU8L2xpPg0KCTxsaT5tZXJiaXZvcmU8L2xpPg0KCTxsaT5tZXJiaXZvcmVfc29mdDwvbGk+DQoJPGxpPm1vbm9faW5kdXN0cmlhbDwvbGk+DQoJPGxpPm1vbm9rYWk8L2xpPg0KCTxsaT5wYXN0ZWxfb25fZGFyazwvbGk+DQoJPGxpPnNvbGFyaXplZF9kYXJrPC9saT4NCgk8bGk+c29sYXJpemVkX2xpZ2h0PC9saT4NCgk8bGk+dGV4dG1hdGU8L2xpPg0KCTxsaT50d2lsaWdodDwvbGk+DQoJPGxpPnZpYnJhbnRfaW5rPC9saT4NCjwvdWw+JzsKJGxhbmdbJ2hlbHBfcGFyYW1fbW9kZSddID0gJ2lzIHVzZWQgd2l0aGluIGEgcGFnZSB3aXRoIDxjb2RlPntBY2VFZGl0b3IgYWN0aW9uPSYjMDM5O2RlZmF1bHQmIzAzOTt9PC9jb2RlPiBtb2R1bGUgdGFnLiBUaGlzIHNwZWNpZmllcyBTeW50YXhoaWdobGlnaHRlciBtb2RlIGZvciBzcGVjaWZpYyBjb2RlIGFyZWEuIDxiciAvPlBvc3NpYmxlIHZhbHVlcyBhcmU6DQo8dWw+DQoJPGxpPmphdmFzY3JpcHQ8L2xpPiANCgk8bGk+cGxhaW48L2xpPiANCgk8bGk+c3ZnPC9saT4gDQoJPGxpPmh0bWw8L2xpPg0KCTxsaT5jc3M8L2xpPg0KCTxsaT5zY3NzPC9saT4NCgk8bGk+Y29mZmVlPC9saT4NCgk8bGk+anNvbjwvbGk+DQoJPGxpPnB5dGhvbjwvbGk+DQoJPGxpPnJ1Ynk8L2xpPg0KCTxsaT5wZXJsPC9saT4NCgk8bGk+cGhwPC9saT4NCgk8bGk+amF2YTwvbGk+DQoJPGxpPmNzaGFycDwvbGk+DQoJPGxpPmNfY3BwPC9saT4NCgk8bGk+Y2xvanVyZTwvbGk+DQoJPGxpPm9jYW1sPC9saT4NCgk8bGk+dGV4dGlsZTwvbGk+DQoJPGxpPmdyb292eTwvbGk+DQoJPGxpPnNjYWxhPC9saT4NCjwvdWw+JzsKJGxhbmdbJ2hlbHBfcGFyYW1fdGhlbWUnXSA9ICdpcyB1c2VkIHdpdGhpbiBhIHBhZ2Ugd2l0aCA8Y29kZT57QWNlRWRpdG9yIGFjdGlvbj0mIzAzOTtkZWZhdWx0JiMwMzk7fTwvY29kZT4gbW9kdWxlIHRhZy4gVGhpcyBzcGVjaWZpZXMgU3ludGF4aGlnaGxpZ2h0ZXIgdGhlbWUgZm9yIHNwZWNpZmljIGNvZGUgYXJlYS4gPGJyIC8+UG9zc2libGUgdmFsdWVzIGFyZToNCjx1bD4NCgk8bGk+Y2xvdWRzPC9saT4gDQoJPGxpPmNsb3Vkc19taWRuaWdodDwvbGk+IA0KCTxsaT5jb2JhbHQ8L2xpPiANCgk8bGk+Y3JpbXNvbl9lZGl0b3I8L2xpPg0KCTxsaT5kYXduPC9saT4NCgk8bGk+ZWNsaXBzZTwvbGk+DQoJPGxpPmlkbGVfZmluZ2VyczwvbGk+DQoJPGxpPmtyX3RoZW1lPC9saT4NCgk8bGk+bWVyYml2b3JlPC9saT4NCgk8bGk+bWVyYml2b3JlX3NvZnQ8L2xpPg0KCTxsaT5tb25vX2luZHVzdHJpYWw8L2xpPg0KCTxsaT5tb25va2FpPC9saT4NCgk8bGk+cGFzdGVsX29uX2Rhcms8L2xpPg0KCTxsaT5zb2xhcml6ZWRfZGFyazwvbGk+DQoJPGxpPnNvbGFyaXplZF9saWdodDwvbGk+DQoJPGxpPnRleHRtYXRlPC9saT4NCgk8bGk+dHdpbGlnaHQ8L2xpPg0KCTxsaT52aWJyYW50X2luazwvbGk+DQo8L3VsPic7CiRsYW5nWydoZWxwX3BhcmFtX3dpZHRoJ10gPSAnb2RyZcSRdWplICZzY2Fyb247aXJpbnUgU3ludGF4aGlnaGxpZ2h0ZXIgdSBwaWtzZWxpbWEuJzsKJGxhbmdbJ2hlbHBfcGFyYW1faGVpZ2h0J10gPSAnb2RyZcSRdWplIHZpc2ludSBTeW50YXhoaWdobGlnaHRlciB1IHBpa3NlbGltYS4nOwokbGFuZ1snaGVscF9wYXJhbV9kaXZpZCddID0gJ0lEIGVsZW1lbnRhIGtvamkgc2FkcsW+aSBWYSZzY2Fyb247IGtvZC4gS29yaXN0aXRlIGplZGluc3R2ZW51IElEIG96bmFrdSB6YSBzdmFraSBrb21hZCBrb2RhLic7CiRsYW5nWydoZWxwX2dlbmVyYWxfdGl0bGUnXSA9ICdPcCZzY2Fyb247dGEnOwokbGFuZ1snaGVscF9nZW5lcmFsX3RleHQnXSA9ICc8aDM+JlNjYXJvbjt0YSBvdm8gcmFkaT88L2gzPg0KPHA+QWNlRWRpdG9yIGplIFN5bnRheGhpZ2hsaWdodGVyIG1vZHVsIGtvamkga29yaXN0aSA8c3Ryb25nPkFjZTwvc3Ryb25nPiBlZGl0b3Iga29kYSBwaXNhbiB1IEphdmFTY3JpcHQtdS48YnIgLz4gDQpOYW1qZXJhIGdydXBlIGtvamEgcmF6dmlqYSBBY2UgZWRpdG9yIGtvZGEgamUgc3R2YXJhbmplIGVkaXRvcmEga29kYSBuYW1lbmplbm9nIFZlYnUga29qaSBpbWEgaXN0ZSBpIMSNYWsgYm9samUgbW9ndcSHbm9zdGksIHVwb3RyZWJsaml2b3N0IGkgcGVyZm9ybWFuc2Uga2FvIHBvc3RvamXEh2kgZWRpdG9yIHRpcGEgVGV4dE1hdGUsIFZpbSBpbGkgRWNsaXBzZS48YnIgLz4NCkxha28gc2UgbW/FvmUgaW1wbGVtZW50aXJhcmkgdSBiaWxvIGtvanUgVmViIHN0cmFuaWN1IGkgSmF2YVNjcmlwdCBhcGxpa2FjaWp1LjxiciAvPiANCkFjZSBqZSByYXp2aWphbiBrYW8gcHJpbWFybmkgZWRpdG9yIHphIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2xvdWQ5aWRlLmNvbSI+Q2xvdWQ5IElERTwvYT4gaSBuYXNsZWRuaWsgamUgTW96aWxsYSBTa3l3cml0ZXIgKEJlc3BpbikgUHJvamVrdGEuPC9wPg0KPGgzPkFjZSBqZSBob3N0b3ZhbiBuYSBHaXRIdWItdTwvaDM+DQo8cD5JenZvcm5pIGtvZCBBY2UgZWRpdG9yYSBqZSBob3N0b3ZhbiBuYSBHaXRIdWItdS4gUG9kbGXFvmUgdHJvc3RydWtvaiBNb3ppbGxhIGxpY2VuY2kgKE1QTC9HUEwvTEdQTCkuPGJyIC8+DQpJc3R1IGxpY2VuY3Uga29yaXN0aSBGaXJlZm94LiBPdmEgbGljZW5jYSBqZSBuYWtsb25qZW5hIHN2aW0gdnJzdGFtYSBwcm9qZWthdGEsIGJpbG8gZGEgc3UgPGVtPm9wZW4gc291cmNlPC9lbT4gaWxpIG5lLjxiciAvPg0KIFRha2UgY2hhcmdlIG9mIHlvdXIgZWRpdG9yIGFuZCBhZGQgeW91ciBmYXZvcml0ZSBsYW5ndWFnZSBoaWdobGlnaHRpbmcgYW5kIGtleWJpbmRpbmdzITwvcD4NCjxoMz5LYWtvIHNlIGtvcmlzdGk/PC9oMz4NCjxwPlVwb3RlYmEgQWNlRWRpdG9yIE1vZHVsYSBqZSBwcm9zdGEuPGJyIC8+DQpOYWtvbiAmc2Nhcm9uO3RvIGluc3RhbGlyYXRlIEFjZUVkaXRvciBpZGl0ZSBuYSAmcXVvdDtNb2plIHByZWZlcmVuY2lqZSAmcmFxdW87IEtvcmlzbmnEjWtlIHByZWZlcmVuY2lqZSZxdW90OyBpIGl6YWJlcml0ZSBBY2VFZGl0b3Iga2FvIFZhJnNjYXJvbjsgPGVtPnN5bnRheGhpZ2hsaWdodGVyPC9lbT4gdSAmcXVvdDtJemFiZXJpdGUgc3ludGF4IGhpZ2hsaWdodGVyIHphIHVwb3RyZWJ1OiZxdW90OyBwYWRhanXEh29qIGxpc3RpLjxiciAvPg0KUG9zdGFyYWp0ZSBzZSBkYSBpbWF0ZSBkb3p2b2x1ICZxdW90O01lbmphbmplIHBvZGUmc2Nhcm9uO2F2YW5qYSBzYWp0YSZxdW90Oy48L3A+DQo8aDM+UG9kZSZzY2Fyb247YXZhbmphPC9oMz4NCjxwPk1vxb5ldGUgcHJvbWVuaXRpIHBvZHJhenVtZXZhbmEgcG9kZSZzY2Fyb247YXZhbmphIGkgdGVtZSBuYWtvIG9kZXRlIG5hICZxdW90O0Vrc3RlbnppamUgJnJhcXVvOyBBY2VFZGl0b3ImcXVvdDs8L3A+JzsKJGxhbmdbJ2hlbHBfa2V5Ym9hcmRzaG9ydGN1dHNfdGl0bGUnXSA9ICdQcmXEjWljZSBuYSB0YXN0YXR1cmknOwokbGFuZ1snaGVscF9rZXlib2FyZHNob3J0Y3V0c19jb250ZW50J10gPSAnICAgICAgPGgzPlBvZHJhenVtZW5hbmUgcHJlxI1pY2UgbmEgdGFzdGF0dXJpPC9oMz4NCg0KPHRhYmxlIGNsYXNzPSZxdW90O3BhZ2V0YWJsZSZxdW90OyBjZWxsc3BhY2luZz0mcXVvdDswJnF1b3Q7IHN1bW1hcnk9JnF1b3Q7RGVmYXVsdCBLZXlib2FyZCBTaG9ydGN1dHMmcXVvdDs+DQo8dGhlYWQ+PHRyPg0KPHRoPlBDIChXaW5kb3dzL0xpbnV4KTwvdGQ+DQo8dGg+TWFjPC90ZD4NCjx0aD5hY3Rpb248L3RkPg0KPC90cj48L3RoZWFkPg0KPHRib2R5Pg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVJldHVybjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLVJldHVybjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5mdWxsc2NyZWVuPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtUzwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLVM8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+cGVyZm9ybSBzYXZlPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUw8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Y2VudGVyIHNlbGVjdGlvbjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUFsdC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtT3B0aW9uLURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Y29weSBsaW5lcyBkb3duPC90ZD4NCjwvdHI+DQo8dHIgbGNhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtQWx0LVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtT3B0aW9uLVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmNvcHkgbGluZXMgdXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1GPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtRjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5maW5kPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtSzwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLUc8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+ZmluZCBuZXh0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtU2hpZnQtSzwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLVNoaWZ0LUc8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+ZmluZCBwcmV2aW91czwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkRvd24sQ3RybC1OPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIGxpbmUgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5VcDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5VcCxDdHJsLVA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gbGluZSB1cDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUVuZCxDdHJsLURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1FbmQsQ29tbWFuZC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIHRvIGVuZDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkxlZnQsQ3RybC1CPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIHRvIGxlZnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1MPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtTDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5nbyB0byBsaW5lPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkFsdC1SaWdodCxFbmQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1SaWdodCxFbmQsQ3RybC1FPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIHRvIGxpbmUgZW5kPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkFsdC1MZWZ0LEhvbWU8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1MZWZ0LEhvbWUsQ3RybC1BPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIHRvIGxpbmUgc3RhcnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+UGFnZURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+T3B0aW9uLVBhZ2VEb3duLEN0cmwtVjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5nbyB0byBwYWdlIGRvd248L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+UGFnZVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pk9wdGlvbi1QYWdlVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gdG8gcGFnZSB1cDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5SaWdodDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5SaWdodCxDdHJsLUY8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gdG8gcmlnaHQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1Ib21lLEN0cmwtVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1Ib21lLENvbW1hbmQtVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Z28gdG8gc3RhcnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pk9wdGlvbi1MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PmdvIHRvIHdvcmQgbGVmdDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pk9wdGlvbi1SaWdodDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5nbyB0byB3b3JkIHJpZ2h0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlRhYjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5UYWI8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+aW5kZW50PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkFsdC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pk9wdGlvbi1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pm1vdmUgbGluZXMgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5BbHQtVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+T3B0aW9uLVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pm1vdmUgbGluZXMgdXA8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtVGFiPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LVRhYjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5vdXRkZW50PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7Pkluc2VydDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5JbnNlcnQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+b3ZlcndyaXRlPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5QYWdlRG93bjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5wYWdlZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz48L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+UGFnZVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnBhZ2V1cDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVNoaWZ0LVosQ3RybC1ZPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtU2hpZnQtWixDb21tYW5kLVk8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+cmVkbzwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1EPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnJlbW92ZSBsaW5lPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUs8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+cmVtb3ZlIHRvIGxpbmUgZW5kPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5PcHRpb24tQmFja3NwYWNlPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnJlbW92ZSB0byBsaW5lc3RhcnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkFsdC1CYWNrc3BhY2UsQ3RybC1BbHQtQmFja3NwYWNlPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnJlbW92ZSB3b3JkIGxlZnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkFsdC1EZWxldGU8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+cmVtb3ZlIHdvcmQgcmlnaHQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1SPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtT3B0aW9uLUY8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+cmVwbGFjZTwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVNoaWZ0LVI8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1TaGlmdC1PcHRpb24tRjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5yZXBsYWNlIGFsbDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLUE8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1BPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCBhbGw8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtRG93bjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1Eb3duPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCBkb3duPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LUxlZnQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtTGVmdDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3QgbGVmdDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1FbmQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtRW5kPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCBsaW5lIGVuZDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1Ib21lPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LUhvbWU8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IGxpbmUgc3RhcnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cyJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtUGFnZURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtUGFnZURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IHBhZ2UgZG93bjwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5TaGlmdC1QYWdlVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtUGFnZVVwPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCBwYWdlIHVwPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LVJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PlNoaWZ0LVJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCByaWdodDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVNoaWZ0LUVuZCxBbHQtU2hpZnQtRG93bjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5Db21tYW5kLVNoaWZ0LURvd248L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IHRvIGVuZDwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzImcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5BbHQtU2hpZnQtUmlnaHQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1TaGlmdC1SaWdodDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3QgdG8gbGluZSBlbmQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+QWx0LVNoaWZ0LUxlZnQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1TaGlmdC1MZWZ0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCB0byBsaW5lIHN0YXJ0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtU2hpZnQtSG9tZSxBbHQtU2hpZnQtVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC1TaGlmdC1VcDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3QgdG8gc3RhcnQ8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+U2hpZnQtVXA8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c2VsZWN0IHVwPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtU2hpZnQtTGVmdDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5PcHRpb24tU2hpZnQtTGVmdDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5zZWxlY3Qgd29yZCBsZWZ0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MSZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtU2hpZnQtUmlnaHQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+T3B0aW9uLVNoaWZ0LVJpZ2h0PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnNlbGVjdCB3b3JkIHJpZ2h0PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLU88L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+c3BsaXQgbGluZTwvdGQ+DQo8L3RyPg0KPHRyIGNsYXNzPSZxdW90O3JvdzEmcXVvdDs+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLTc8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q29tbWFuZC03PC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PnRvZ2dsZSBjb21tZW50PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9JnF1b3Q7cm93MiZxdW90Oz4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkN0cmwtVDwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz5DdHJsLVQ8L3RkPg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+dHJhbnNwb3NlIGxldHRlcnM8L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0mcXVvdDtyb3cxJnF1b3Q7Pg0KPHRkIGFsaWduPSZxdW90O2xlZnQmcXVvdDs+Q3RybC1aPC90ZD4NCjx0ZCBhbGlnbj0mcXVvdDtsZWZ0JnF1b3Q7PkNvbW1hbmQtWjwvdGQ+DQo8dGQgYWxpZ249JnF1b3Q7bGVmdCZxdW90Oz51bmRvPC90ZD4NCjwvdHI+DQo8L3Rib2R5Pg0KPC90YWJsZT4nOwokbGFuZ1snaGVscF9mcm9udGVuZF90aXRsZSddID0gJ0tvcmlzbmnEjWtpIGRlbyc7CiRsYW5nWydoZWxwX2Zyb250ZW5kX2NvbnRlbnQnXSA9ICc8cD5UaGlzIE1vZHVsZSBhbmQgQWNlIFNjcmlwdCBjYW4gYWxzbyBiZSB1c2VkIGFzIGEgRnJvbnRlbmQgU3ludGF4aGlnaGxpZ2h0ZXIuPGJyIC8+DQpUbyBtYWtlIGl0IHdvcmsgeW91IGhhdmUgdG8gaW5jbHVkZSBqUXVlcnkgRnJhbWV3b3JrLCBmb3IgZXhhbXBsZSB1c2luZyBDTVNNUyB7Y21zX2pxdWVyeX0gdGFnIGFuZCBhcyB3ZWxsIGluY2x1ZGUge0FjZUVkaXRvcn0gaW4geW91ciBwYWdlIHR3aWNlLiBGaXJzdCBhZGQgdGhlIG1vZHVsZSB0YWcgaW4geW91ciA8aGVhZD4gc2VjdGlvbiBvZiBUZW1wbGF0ZSBvciBpbiAmcXVvdDtQYWdlIFNwZWNpZmljIE1ldGRhdGEmcXVvdDsgZmllbGQgb2YgeW91ciBDb250ZW50IHBhZ2UsIGxpa2Uge0FjZUVkaXRvciBhY3Rpb249JiMwMzk7aGVhZCYjMDM5O30gYW5kIGFub3RoZXIgY2FsbCB0byBzcGVjaWZ5IHdoaWNoIGFyZWEgc2hvdWxkIGJlIGhpZ2hsaWdodGVkLCBmb3IgZXhhbXBsZSB7QWNlRWRpdG9yIGRpdmlkPSYjMDM5O2ZvbyYjMDM5O30sIHdoaWNoIHdvdWxkIHRhcmdldCBhIHBhZ2UgZWxlbWVudCB3aXRoIGlkIDxlbT5mb288L2VtPi48L3A+DQo8aDM+U28gaG93IGRvIHlvdSB1c2UgaXQ/PC9oMz4NCjxwPkZpcnN0IGluY2x1ZGUgalF1ZXJ5IGFuZCBNb2R1bGUgdGFnIGluIHlvdXIgUGFnZSA8aGVhZD4gYXJlYSwgZm9yIGV4YW1wbGUgaW4gJnF1b3Q7UGFnZSBTcGVjaWZpYyBNZXRkYXRhJnF1b3Q7OjwvcD4NCgk8cHJlPg0KCXtjbXNfanF1ZXJ5fQ0KCXtBY2VFZGl0b3IgYWN0aW9uPSYjMDM5O2hlYWQmIzAzOTt9DQoJPC9wcmU+DQo8cD5UaGlzIGluY2x1ZGVzIG5lZWRlZCBzY3JpcHRzIGZvciBBY2UgU3ludGF4aGlnaGxpZ2h0ZXIgdG8gd29yay48YnIgLz4NCkluIE1vZHVsZXMgQWRtaW4gaW50ZXJmYWNlIHlvdSBjYW4gc2VsZWN0IGRlZmF1bHQgc2V0dGluZ3MgZm9yIHlvdXIgJiMwMzk7aGVhZCYjMDM5OyBhY3Rpb24gb3IgdXNlIHBhcmFtZXRlciBtb2Rlcz0mIzAzOTtodG1sLGphdmFzY3JpcHQmIzAzOTsgYW5kIHRoZW1lcz0mIzAzOTt0ZXh0bWF0ZSYjMDM5OyB3aGljaCB3b3VsZCBvdmVycmlkZSBzZWxlY3RlZCBQcmVmZXJlbmNlcy48L3A+DQo8cD5Ob3cgd2hlbiB5b3UgaGF2ZSBuZWVkZWQgc2NyaXB0cyBpbmNsdWRlZCwgb25lIG1vcmUgTW9kdWxlIHRhZyBjYWxsIGlzIG5lZWRlZCAoZm9yIGV4YW1wbGUgaW4geW91ciBDb250ZW50IEVkaXRvciBhcmVhKSB0byBzcGVjaWZ5IHdoaWNoIGFyZWEgb2YgeW91ciBQYWdlIHNob3VsZCBiZSBoaWdobGlnaHRlZC48L3A+DQoJPHByZT4NCgl7QWNlRWRpdG9yIGRpdmlkPSYjMDM5O3NvbWUtaWQmIzAzOTt9DQoJPC9wcmU+DQo8cD5UaGlzIHRhZyBpbmNsdWRlcyBuZWVkZWQgU2NyaXB0IGFuZCBTdHlsZSB0aGF0IGlzIHVzZWQgdG8gSGlnaGxpZ2h0IHNlbGVjdGVkIGVsZW1lbnQgd2l0aCBzcGVjaWZpZWQgaWQuPGJyIC8+DQpBbGwgeW91IG5lZWQgdGhlbiBpcyB3cml0ZSB5b3VyIENvZGUgdGhhdCB5b3Ugd2FudCB0byBIaWdobGlnaHQgYW5kIHdyYXAgaXQgaW5zaWRlIGFuIGVsZW1lbiBsaWtlIDxkaXY+IHdpdGggc3BlY2lmaWVkIGlkLjwvcD4nOwokbGFuZ1snaGVscF9mcm9udGVuZF9zYW1wbGUnXSA9ICc8cHJlIGlkPSZxdW90O3NvbWUtaWQmcXVvdDs+DQo8aHRtbD4NCiAmbmJzcDsgJm5ic3A7IDxoZWFkPg0KICZuYnNwOyAmbmJzcDsgPHN0eWxlIHR5cGU9JnF1b3Q7dGV4dC9jc3MmcXVvdDs+DQogJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IC50ZXh0LWxheWVyIHsNCiAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyBmb250LWZhbWlseTogTW9uYWNvLCAmcXVvdDtDb3VyaWVyIE5ldyZxdW90OywgbW9ub3NwYWNlOw0KICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IGZvbnQtc2l6ZTogMTJweDsNCiAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyBjdXJzb3I6IHRleHQ7DQogJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IH0NCiAmbmJzcDsgJm5ic3A7IDwvc3R5bGU+DQogJm5ic3A7ICZuYnNwOyA8L2hlYWQ+DQogJm5ic3A7ICZuYnNwOyA8Ym9keT4NCiAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgPGgxIHN0eWxlPSZxdW90O2NvbG9yOnJlZCZxdW90Oz5KdWh1IEtpbm5lcnM8L2gxPg0KICZuYnNwOyAmbmJzcDsgPC9ib2R5PiA8L2h0bWw+DQo8L3ByZT4nOwokbGFuZ1snaGVscF9hYm91dF90aXRsZSddID0gJ08gbW9kdWx1JzsKJGxhbmdbJ2hlbHBfYWJvdXRfdGV4dCddID0gJzxoMz5Qb2RyJnNjYXJvbjtrYTwvaDM+DQo8cD5VIHNrbGFkdSBzYSBHUEwsIG92YWogc29mdHZlciBWYW0gamUgcHJ1xb5lbiAmcXVvdDt1IHZpxJFlbm9tIHN0YW5qdSZxdW90Oy4gTW9saW1vIHByb8SNaXRhanRlIGxpY2VuY3UgemEgxI1pdGF2dSBpemphdnUgbyBvZHJpY2FuanUgb2Qgb2Rnb3Zvcm5vc3RpLjwvcD4NCjxoMz5Db3B5cmlnaHQgYW5kIExpY2Vuc2U8L2gzPg0KPHA+Q29weXJpZ2h0ICZjb3B5OyAyMDEyLCBHb3JhbiBJbGljIDxhIGhyZWY9Im1haWx0bzp1bmlxdTNlQGdtYWlsLmNvbSI+PHVuaXF1M2VAZ21haWwuY29tPjwvYT4gPGEgaHJlZj0iaHR0cDovL3d3dy5pY2gtbWFjaC1kYXMuYXQiIHJlbD0iZXh0ZXJuYWwiPnd3dy5pY2gtbWFjaC1kYXMuYXQ8L2E+LiBBbGwgUmlnaHRzIEFyZSBSZXNlcnZlZC48L3A+DQo8cD5UaGlzIG1vZHVsZSBoYXMgYmVlbiByZWxlYXNlZCB1bmRlciB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIj5HTlUgUHVibGljIExpY2Vuc2U8L2E+LiBZb3UgbXVzdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UgYmVmb3JlIHVzaW5nIHRoZSBtb2R1bGUuPC9wPg0KCTxoMz5UaW08L2gzPg0KCTx1bD4NCgkJPGxpPkdvcmFuIElsaWMgKHVuaXF1MykgZy5pbGljQGktYXJ0cy5ldSA8YnIgLz53d3cuaWNoLW1hY2gtZGFzLmF0PC9saT4JDQoJCTxsaT5Sb2JlcnQgQ2FtcGJlbGwgKGNhbGd1eTEwMDApIGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcgIDxiciAvPnd3dy5jYWxndXkxMDAwLmNvbTwvbGk+CQkNCgkJPGxpPkpvbmF0aGFuIFNjaG1pZCAoRm9hbHkqKSBoaUBqb25hdGhhbnNjaG1pZC5kZSA8YnIgLz53d3cuam9uYXRoYW5zY2htaWQuZGU8L2xpPg0KCTwvdWw+DQonOwokbGFuZ1snY2hhbmdlbG9nJ10gPSAnPGgzPlZlcnNpb24gMC4xPC9oMz4NCjx1bD4NCgk8bGk+SXQmIzAzOTtzIGZyZXNoISBOb3RoaW5nIGNoYW5nZWQgeWV0ITwvbGk+DQoJPGxpPlVzaW5nIEFjZSBWZXJzaW9uIDAuMi4wPC9saT4NCjwvdWw+DQo8aDM+VmVyc2lvbiAwLjI8L2gzPg0KPHVsPg0KCTxsaT5BZGRlZCBDVFJMLVMgS2V5YmluZGluZzwvbGk+DQoJPGxpPkFkZGVkIEZ1bGxzY3JlZW5tb2RlPC9saT4NCgk8bGk+QWRkZWQgRnJvbnRlbmQgSGlnaGxpZ2h0aW5nPC9saT4NCgk8bGk+VXBkYXRlZCBBY2U8L2xpPg0KPC91bD4NCjxoMz5WZXJzaW9uIDAuMi4xPC9oMz4NCjx1bD4NCgk8bGk+QWRkZWQgSW50ZXJuZXQgRXhwbG9yZXIgcHJlZmVyZW5jZTwvbGk+DQoJPGxpPlVwZGF0ZWQgQUNFIHdpdGggdGhlbWVzPC9saT4NCjwvdWw+DQo8aDM+Um9hZG1hcDwvaDM+DQo8dWw+DQoJPGxpPjxkZWw+QWRkIEZyb250ZW5kIFN5bnRheGhpZ2hsaWdodGluZzwvZGVsPjwvbGk+DQoJPGxpPjxkZWw+QWRkIEZ1bGxzY3JlZW5tb2RlPC9kZWw+PC9saT4NCgk8bGk+PGRlbD5BZGQgS2V5YmluZGluZyAoQ1RSTCtTKTwvZGVsPjwvbGk+DQoJPGxpPkFkZCBFZGl0b3IgYmVoYXZpb3IgKFZpbSwgRU1hY3MpPC9saT4NCgk8bGk+TWF5YmUgYWRkIFRvb2xiYXI8L2xpPg0KPC91bD4nOwokbGFuZ1sndXRtYSddID0gJzE1Njg2MTM1My4zNDc4OTQyMTAuMTMyNzMyMDAxMC4xMzI3MzIwMDEwLjEzMjczMjAwMTAuMSc7CiRsYW5nWyd1dG16J10gPSAnMTU2ODYxMzUzLjEzMjczMjAwMTAuMS4xLnV0bWNjbj0oZGlyZWN0KXx1dG1jc3I9KGRpcmVjdCl8dXRtY21kPShub25lKSc7CiRsYW5nWyd1dG1iJ10gPSAnMTU2ODYxMzUzJzsKJGxhbmdbJ3V0bWMnXSA9ICcxNTY4NjEzNTMnOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgoJLy8gQmFja2VuZCBlZGl0b3IgcHJlZnMKCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdtb2RlJywnaHRtbCcpOwoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ3RoZW1lJywndGV4dG1hdGUnKTsKCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdmb250c2l6ZScsJzEycHgnKTsKCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdmdWxsX2xpbmUnLDEpOwoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2VuYWJsZV9pZScsMCk7CQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ3Nob3dfaW52aXNpYmxlcycsMCk7CgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnc29mdF93cmFwJywnODAsODAnKTsKCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdoaWdobGlnaHRfYWN0aXZlJywxKTsKCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdwZXJzaXN0ZW50X2hzY3JvbGwnLDEpOwoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2tleV9iaW5kaW5nJywnYWNlJyk7CgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnc29mdF90YWInLDEpOwoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ3ByaW50X21hcmdpbicsMCk7CQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2hpZ2hsaWdodF9zZWxlY3RlZCcsMSk7CgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZW5hYmxlX2JlaGF2aW9ycycsMSk7CgoJLy8gRnJvbnRlbmQgc3ludGF4YXJlYSBwcmVmcwoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2Zyb250ZW5kX21vZGUnLCdodG1sJyk7CgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfc3ludGF4YXJlYV9tb2RlJywnaHRtbCcpOwoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2Zyb250ZW5kX3N5bnRheGFyZWFfdGhlbWUnLCd0ZXh0bWF0ZScpOwkJCgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfdGhlbWUnLCd0ZXh0bWF0ZScpOwoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2Zyb250ZW5kX2ZvbnRzaXplJywnMTJweCcpOwoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2Zyb250ZW5kX3dpZHRoJywnNTAwJyk7CgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZnJvbnRlbmRfaGVpZ2h0JywnNDAwJyk7CQoJCQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CiAgJHRoaXMgLT4gUmVtb3ZlUHJlZmVyZW5jZSgpOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZW5hYmxlX2llJywwKTsKPz4=]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/ace.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHRleHRhcmVhIGlkPSJ7JHRleHRhcmVhaWR9IiBuYW1lPSJ7JHRleHRhcmVhbmFtZX0iPnskc3ludGF4X2NvbnRlbnR9PC90ZXh0YXJlYT4KCTxzdHlsZT4KCSN7JGVkaXRvcmlkfSB7bGRlbGltfQoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCSAgICB3aWR0aDogeyR3aWR0aH1lbTsKCSAgICBoZWlnaHQ6IHskaGVpZ2h0fWVtOwoJICAgIGJvcmRlcjogNXB4IHNvbGlkICNkZGQ7CgkgICAgYmFja2dyb3VuZDogI2ZlZmVmZTsgCgl7cmRlbGltfQoJI3skZWRpdG9yaWR9LmZ1bGxzY3JlZW4ge2xkZWxpbX0KCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJei1pbmRleDogOTk5OTsKCQltYXJnaW46MDsKCQlsZWZ0OjA7CgkJdG9wOjA7CgkJe3JkZWxpbX0KCTwvc3R5bGU+CQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpe2xkZWxpbX0KCWlmICghd2luZG93LmFjZSlyZXR1cm47CglpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvKGlQb2R8aVBob25lfGlQYWQpLykpIHJldHVybjsKCXtpZiAkZW5hYmxlX2llID09ICdmYWxzZSd9CglpZiAoJC5icm93c2VyLm1zaWUpIHJldHVybjsJCgl7L2lmfQoJCQoJCSQoJyN7JHRleHRhcmVhaWR9JykuYmVmb3JlKCc8ZGl2IGlkPSJ7JGVkaXRvcmlkfSI+PC9kaXY+Jyk7CgkJLy8gaW5pdCBlZGl0b3IKCQl2YXIgZWRpdG9yID0gYWNlLmVkaXQoInskZWRpdG9yaWR9Iik7CgkJdmFyIHRleHRhcmVhID0gJCgnI3skdGV4dGFyZWFpZH0nKS5oaWRlKCk7CgoJCS8vIHJlc2l6ZSBhY2Ugd2l0aCBqdWkKCQkkKCcjeyRlZGl0b3JpZH0nKS5yZXNpemFibGUoe2xkZWxpbX0KCQkJc3RvcDogZnVuY3Rpb24oZXZlbnQsIHVpKXtsZGVsaW19CgkJCQllZGl0b3IucmVuZGVyZXIub25SZXNpemUodHJ1ZSk7CgkJCQllZGl0b3IucmVuZGVyZXIudXBkYXRlRnVsbCgpOwoJCQkJZWRpdG9yLmZvY3VzKCk7CgkJCXtyZGVsaW19LAkJCQoJCQlnaG9zdDogdHJ1ZQoJCXtyZGVsaW19KTsKCgkJLy8gc2V0IHRoZW1lCgkJZWRpdG9yLnNldFRoZW1lKCJhY2UvdGhlbWUveyR0aGVtZX0iKTsKCQkvLyBzZXQgaGlnaGxpZ2h0ZXIgbW9kZQoJCXtpZiAkbW9kZSAhPSAncGxhaW4nfQoJCQoJCXZhciBzZXRNb2RlID0gcmVxdWlyZSgiYWNlL21vZGUveyRtb2RlfSIpLk1vZGU7CgkJZWRpdG9yLmdldFNlc3Npb24oKS5zZXRNb2RlKG5ldyBzZXRNb2RlKCkpOwoJCXsvaWZ9CgkJLy8gc2V0IGZvbnRzaXplCgkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3skZWRpdG9yaWR9Jykuc3R5bGUuZm9udFNpemU9J3skZm9udHNpemV9JzsKCQkvLyBmdWxsIGxpbmUgc2VsZWN0aW9uCgkJZWRpdG9yLnNldFNlbGVjdGlvblN0eWxlKCd7JGZ1bGxfbGluZX0nKTsKCQkvLyBoaWdobGlnaHQgYWN0aXZlIGxpbmUKCQllZGl0b3Iuc2V0SGlnaGxpZ2h0QWN0aXZlTGluZSh7JGhpZ2hsaWdodF9hY3RpdmV9KTsKCQkvLyBoaWdobGlnaHQgc2VsZWN0ZWQgd29yZAoJCWVkaXRvci5zZXRIaWdobGlnaHRTZWxlY3RlZFdvcmQoeyRoaWdobGlnaHRfc2VsZWN0ZWR9KTsKCQkvLyBzaG93IGludmlzaWJsZXMKCQllZGl0b3Iuc2V0U2hvd0ludmlzaWJsZXMoeyRzaG93X2ludmlzaWJsZXN9KTsKCQkvLyBwZXJzaXN0ZW50IGhzY3JvbGwKCQllZGl0b3IucmVuZGVyZXIuc2V0SFNjcm9sbEJhckFsd2F5c1Zpc2libGUoeyRwZXJzaXN0ZW50X2hzY3JvbGx9KTsKCQkvLyBzaG93IGd1dHRlcgoJCWVkaXRvci5yZW5kZXJlci5zZXRTaG93R3V0dGVyKHskc2hvd19ndXR0ZXJ9KTsKCQl7aWYgJHNvZnRfd3JhcCAhPSAnb2ZmJ30KCQkvLyAgc29mdCB3cmFwCgkJZWRpdG9yLmdldFNlc3Npb24oKS5zZXRVc2VXcmFwTW9kZSh0cnVlKTsKCQllZGl0b3IuZ2V0U2Vzc2lvbigpLnNldFdyYXBMaW1pdFJhbmdlKHskc29mdF93cmFwfSk7CgkJey9pZn0KCQkvLyBzZXQgc29mdCB0YWIKCQllZGl0b3IuZ2V0U2Vzc2lvbigpLnNldFVzZVNvZnRUYWJzKHskc29mdF90YWJ9KTsKCQkvLyBzZXQgcHJpbnQgbWFyZ2luCgkJZWRpdG9yLnNldFNob3dQcmludE1hcmdpbih7JHByaW50X21hcmdpbn0pOwoJCQoJICAgICAgICAvLyBiaW5kIGN0cmwrZW50ZXIgdG8gZnVsbCBzY3JlZW4gbW9kZS4KICAgICAgICAgICAgICAgIHtsaXRlcmFsfQoJCWVkaXRvci5jb21tYW5kcy5hZGRDb21tYW5kKHsKICAgICAgICAgICAgICAgICAgbmFtZTogJ2Z1bGxTY3JlZW5FZGl0aW5nJywKICAgICAgICAgICAgICAgICAgYmluZEtleTogewogICAgICAgICAgICAgICAgICAgIHdpbjogJ0N0cmwtUmV0dXJuJywKICAgICAgICAgICAgICAgICAgICBtYWM6ICdDb21tYW5kLVJldHVybicsCiAgICAgICAgICAgICAgICAgICAgc2VuZGVyOiAnZWRpdG9yJwogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICBleGVjOiBmdW5jdGlvbihlbnYsYXJncyxyZXF1ZXN0KSB7CgkgICAgICAgICAgICB2YXIgZWRpdG9yRGl2ID0gJCgnI3svbGl0ZXJhbH17JGVkaXRvcmlkfXtsaXRlcmFsfScpOwogICAgICAgICAgICAgICAgICAgIGlmKCBlZGl0b3JEaXYuaGFzQ2xhc3MoJ2Z1bGxzY3JlZW4nKSApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgIC8vIHNodXQgZG93biBmdWxsIHNjcmVlbgoJICAgICAgICAgICAgICAgZWRpdG9yRGl2LnJlbW92ZUNsYXNzKCdmdWxsc2NyZWVuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRtcCA9IGVkaXRvckRpdi5kYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yRGl2LndpZHRoKHRtcC5vcmlnV2lkdGgpOwoJCSAgICAgICBlZGl0b3JEaXYuaGVpZ2h0KHRtcC5vcmlnSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAvLyB0dXJuIG9uIGZ1bGwgc2NyZWVuCgkJICAgICAgIGVkaXRvckRpdi5hZGRDbGFzcygnZnVsbHNjcmVlbicpOwogICAgICAgICAgICAgICAgICAgICAgIGVkaXRvckRpdi5kYXRhKCdvcmlnV2lkdGgnLGVkaXRvckRpdi53aWR0aCgpKTsKICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3JEaXYuZGF0YSgnb3JpZ0hlaWdodCcsZWRpdG9yRGl2LmhlaWdodCgpKTsKCQkgICAgICAgCQkgICBlZGl0b3JEaXYud2lkdGgoJCh3aW5kb3cpLndpZHRoKCkqMC45OTUpOwogICAgICAgICAgICAgICAgICAgICAgIGVkaXRvckRpdi5oZWlnaHQoJCh3aW5kb3cpLmhlaWdodCgpKjAuOTgpOwogICAgICAgICAgICAgICAgICAgIH0KCQkgICAgZWRpdG9yLnJlbmRlcmVyLm9uUmVzaXplKHRydWUpOwoJICAgICAgICAgICAgZWRpdG9yLnJlbmRlcmVyLnVwZGF0ZUZ1bGwoKTsKCSAgICAgICAgICAgIGVkaXRvci5mb2N1cygpOwogICAgICAgICAgICAgICAgICAgIC8vZWRpdG9yLnJlZnJlc2goKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgkJZWRpdG9yLmNvbW1hbmRzLmFkZENvbW1hbmQoewogICAgICAgICAgICAgICAgICBuYW1lOiAnbXlzYXZlJywKICAgICAgICAgICAgICAgICAgYmluZEtleTogewogICAgICAgICAgICAgICAgICAgIHdpbjogJ0N0cmwtUycsCiAgICAgICAgICAgICAgICAgICAgbWFjOiAnQ29tbWFuZC1TJywKICAgICAgICAgICAgICAgICAgICBzZW5kZXI6ICdlZGl0b3InCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIGV4ZWM6IGZ1bmN0aW9uKGVudixhcmdzLHJlcXVlc3QpIHsKCQkgICAgLy8gdXBkYXRlIHRoZSB0ZXh0IGFyZWEgZmllbGQuCiAgICAgICAgIAkgICAgdmFyIHRleHQgPSBlZGl0b3IuZ2V0U2Vzc2lvbigpLmdldFZhbHVlKCk7CgkJICAgIHRleHRhcmVhLnZhbCh0ZXh0KTsKICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBwYXJlbnQgZm9ybS4gYW5kIGEgY2hpbGQgYnV0dG9uIG5hbWVkICdhcHBseScsIGFuZCBjbGljayBpdC4KICAgICAgICAgICAgICAgICAgICAkKCd7L2xpdGVyYWx9I3skZWRpdG9yaWR9e2xpdGVyYWx9JykuY2xvc2VzdCgnZm9ybScpLmZpbmQoJ1tuYW1lJD0iYXBwbHkiXScpLmZpcnN0KCkuY2xpY2soKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgey9saXRlcmFsfQoKCQkvLyBnZXQgdGhlIHZhbHVlIGZyb20gdGV4dGFyZWEKCQl2YXIgaW50aWFsRGF0YSA9ICQoJyN7JHRleHRhcmVhaWR9JykudmFsKCk7CgkJZWRpdG9yLmdldFNlc3Npb24oKS5zZXRWYWx1ZShpbnRpYWxEYXRhKTsKCQkvLyBVcGRhdGUgdGhlIHRleHRhcmVhIG9uIGNoYW5nZS4KCQllZGl0b3IuZ2V0U2Vzc2lvbigpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbigpe2xkZWxpbX0KCQkJLy8gR2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBlZGl0b3IgYW5kIHBsYWNlIGl0IGludG8gdGhlIHRleHRhcmVhLgoJCQl2YXIgdGV4dCA9IGVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0VmFsdWUoKTsKCQkJdGV4dGFyZWEudmFsKHRleHQpOwoJCQkvL2FsZXJ0KHRleHQpOwoJCXtyZGVsaW19KTsKCXtyZGVsaW19KTsKPC9zY3JpcHQ+Cg==]]></data>
	</file>
	<file>
	  <filename>/templates/frontendsettings.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e3N0cmlwfQp7JHN0YXJ0Zm9ybX0KPGZpZWxkc2V0PgoJPGxlZ2VuZD4KCQl7JHNldHRpbmdzdGV4dH0KCTwvbGVnZW5kPgoJPHA+eyRoZWFkX2Rlc2NyaXB0aW9ufTwvcD4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4KCQkJeyRmcm9udGVuZF9zeW50YXhfbW9kZX0KCQk8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+CgkJCXskZnJvbnRlbmRfc3ludGF4X21vZGVpbnB1dH0KCQk8L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4KCQkJeyR0aGVtZXRleHR9CgkJPC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPgoJCQl7JGZyb250ZW5kX3RoZW1laW5wdXR9CgkJPC9wPgoJPC9kaXY+CjwvZmllbGRzZXQ+CjxmaWVsZHNldD4JCgk8bGVnZW5kPgoJCXskc3ludGF4X3NldHRpbmdzdGV4dH0KCTwvbGVnZW5kPgoJPHA+eyRjb250ZW50X2Rlc2NyaXB0aW9ufTwvcD4JCQkKCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4KCQkJeyR3aWR0aF90aXRsZX0KCQk8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+CgkJCXskd2lkdGhfaW5wdXR9CgkJPC9wPgoJPC9kaXY+CQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPgoJCQl7JGhlaWdodF90aXRsZX0KCQk8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+CgkJCXskaGVpZ2h0X2lucHV0fQoJCTwvcD4KCTwvZGl2PgkKCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4KCQkJeyRmcm9udGVuZF9zeW50YXhfbW9kZX0KCQk8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+CgkJCXskZnJvbnRlbmRfc3ludGF4YXJlYV9tb2RlaW5wdXR9CgkJPC9wPgoJPC9kaXY+CQkKCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4KCQkJeyR0aGVtZXRleHR9CgkJPC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPgoJCQl7JHRoZW1laW5wdXR9CgkJPC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+CgkJCXskZm9udHNpemV0ZXh0fQoJCTwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij4KCQkJeyRmb250c2l6ZWlucHV0fQoJCTwvcD4KCTwvZGl2PgkJCQkJCQkKPC9maWVsZHNldD4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4KCQkJJm5ic3A7CgkJPC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPgoJCQl7JHN1Ym1pdH0KCQk8L3A+Cgk8L2Rpdj4KeyRlbmRmb3JtfQp7L3N0cmlwfQo=]]></data>
	</file>
	<file>
	  <filename>/templates/help.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e3N0cmlwfQo8ZGl2IHN0eWxlPSJmbG9hdDpyaWdodDsiPgoJPGZvcm0gYWN0aW9uPSJodHRwczovL3d3dy5wYXlwYWwuY29tL2NnaS1iaW4vd2Vic2NyIiBtZXRob2Q9InBvc3QiPgoJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNtZCIgdmFsdWU9Il9zLXhjbGljayIgLz4KCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJob3N0ZWRfYnV0dG9uX2lkIiB2YWx1ZT0iRkxIMkFOODlVUFBBRyIgLz4KCQk8aW5wdXQgdHlwZT0iaW1hZ2UiIHNyYz0iaHR0cHM6Ly93d3cucGF5cGFsb2JqZWN0cy5jb20vZW5fR0IvaS9idG4vYnRuX2RvbmF0ZV9MRy5naWYiIGJvcmRlcj0iMCIgbmFtZT0ic3VibWl0IiBhbHQ9IlBheVBhbCDigJQgVGhlIHNhZmVyLCBlYXNpZXIgd2F5IHRvIHBheSBvbmxpbmUuIiBzdHlsZT0iYmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lOyIgLz4KCQk8aW1nIGFsdD0iIiBib3JkZXI9IjAiIHNyYz0iaHR0cHM6Ly93d3cucGF5cGFsb2JqZWN0cy5jb20vZGVfREUvaS9zY3IvcGl4ZWwuZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPgoJPC9mb3JtPgo8L2Rpdj4KPGRpdiBpZD0icGFnZV90YWJzIj4KCTxkaXYgaWQ9ImdlbmVyYWwiPgoJCXskaGVscF9nZW5lcmFsX3RpdGxlfQoJPC9kaXY+Cgk8ZGl2IGlkPSJzaG9ydGN1dHMiPgoJCXskaGVscF9rZXlib2FyZHNob3J0Y3V0c190aXRsZX0KCTwvZGl2PgoJPGRpdiBpZD0iZnJvbnRlbmQiPgoJCXskaGVscF9mcm9udGVuZF90aXRsZX0KCTwvZGl2PgkKCTxkaXYgaWQ9ImFib3V0Ij4KCQl7JGhlbHBfYWJvdXRfdGl0bGV9Cgk8L2Rpdj4JCjwvZGl2Pgo8ZGl2IGNsYXNzPSJjbGVhcmIiPjwvZGl2Pgo8ZGl2IGlkPSJwYWdlX2NvbnRlbnQiPgoJPGRpdiBpZD0iZ2VuZXJhbF9jIj4KCQk8aW1nIHN0eWxlPSJmbG9hdDpyaWdodDttYXJnaW46MCAxMHB4IDEwcHggMTBweDsgYm9yZGVyOiA1cHggc29saWQgI2YwZjBmMDsiIHNyYz0ieyRtb2R1bGVfcGF0aH0vaW1hZ2VzL2VkaXRvci5qcGciIGFsdD0iRWRpdG9yIiB3aWR0aD0iMzE2IiBoZWlnaHQ9IjI1OSIgLz4KCQl7JGhlbHBfZ2VuZXJhbF90ZXh0fQoJCTxiciBzdHlsZSA9ImNsZWFyOmJvdGg7IiAvPgoJPC9kaXY+Cgk8ZGl2IGlkPSJzaG9ydGN1dHNfYyI+CgkJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQl7JGhlbHBfa2V5Ym9hcmRzaG9ydGN1dHNfY29udGVudH0KCQk8L2Rpdj4KCTwvZGl2PgoJPGRpdiBpZD0iZnJvbnRlbmRfYyI+CgkJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQl7JGhlbHBfZnJvbnRlbmRfY29udGVudH0KCQk8cHJlPnskaGVscF9mcm9udGVuZF9zYW1wbGV9PC9wcmU+CgkJPC9kaXY+Cgk8L2Rpdj4KCTxkaXYgaWQ9ImFib3V0X2MiPgoJCXskaGVscF9hYm91dF90ZXh0fQoJPC9kaXY+CQkKPC9kaXY+Cnsvc3RyaXB9Cg==]]></data>
	</file>
	<file>
	  <filename>/templates/orig_default.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgpqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7bGRlbGltfQoJdmFyIHR4dCA9ICQoJyN7JGRpdmlkfScpLnRleHQoKTsKICAJdmFyIGVkaXRvciA9IGFjZS5lZGl0KCd7JGRpdmlkfScpOwogIAkJZWRpdG9yLnNldFJlYWRPbmx5KHRydWUpOwogIAkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3skZGl2aWR9Jykuc3R5bGUuZm9udFNpemU9J3skZm9udHNpemV9JzsKe2lmIGlzc2V0KCR0aGVtZSl9CgkJZWRpdG9yLnNldFRoZW1lKCdhY2UvdGhlbWUveyR0aGVtZX0nKTsKey9pZn0Ke2lmIGlzc2V0KCRtb2RlKX0KCQl2YXIgdGhlTW9kZSA9IHJlcXVpcmUoJ2FjZS9tb2RlL3skbW9kZX0nKS5Nb2RlOwogIAkJZWRpdG9yLmdldFNlc3Npb24oKS5zZXRNb2RlKG5ldyB0aGVNb2RlKTsKey9pZn0KICAJCWVkaXRvci5yZW5kZXJlci5zZXRTaG93UHJpbnRNYXJnaW4oZmFsc2UpOwogIAkJZWRpdG9yLmdldFNlc3Npb24oKS5zZXRWYWx1ZSh0eHQpOwp7cmRlbGltfSk7Cjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJI3skZGl2aWR9IHtsZGVsaW19CgkJcG9zaXRpb246IHJlbGF0aXZlOwoJCWhlaWdodDogeyRoZWlnaHR9cHg7CgkJd2lkdGg6IHskd2lkdGh9cHg7CgkJYmFja2dyb3VuZDogI2ZmZjsKCQlkaXNwbGF5OiBibG9jazsKCXtyZGVsaW19Cjwvc3R5bGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/templates/orig_head.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9InskYWNlX3VybH0vYWNlL3NyYy9hY2UuanMiPjwvc2NyaXB0Pgp7Zm9yZWFjaCBmcm9tPSRtb2RlcyBpdGVtPSdtb2RlJ30KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9InskYWNlX3VybH0vYWNlL3NyYy9tb2RlLXskbW9kZX0uanMiPjwvc2NyaXB0Pgp7L2ZvcmVhY2h9CntpZiBpc3NldCgkdGhlbWVzKX0Ke2ZvcmVhY2ggZnJvbT0kdGhlbWVzIGl0ZW09J3RoZW1lJ30KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9InskYWNlX3VybH0vYWNlL3NyYy90aGVtZS17JHRoZW1lfS5qcyI+PC9zY3JpcHQ+CnsvZm9yZWFjaH0Key9pZn0K]]></data>
	</file>
	<file>
	  <filename>/templates/settings.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e3N0cmlwfQp7JHN0YXJ0Zm9ybX0KPGZpZWxkc2V0PgoJPGxlZ2VuZD4KCQl7JHNldHRpbmdzdGV4dH0KCTwvbGVnZW5kPgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPgoJCQl7JHdpZHRoX3RpdGxlfQoJCTwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij4KCQkJeyR3aWR0aF9pbnB1dH0KCQk8L3A+Cgk8L2Rpdj4JCgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+CgkJCXskaGVpZ2h0X3RpdGxlfQoJCTwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij4KCQkJeyRoZWlnaHRfaW5wdXR9CgkJPC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+CgkJCXskZW5hYmxlX2lldGV4dH0KCQk8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+CgkJCXskZW5hYmxlX2llaW5wdXR9IHskZW5hYmxlX2llZGVzY3J9CgkJPC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+CgkJCXskdXNlX3VuY29tcHJlc3NlZF90aXRsZX0KCQk8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+CgkJCXskdXNlX3VuY29tcHJlc3NlZF9pbnB1dH0geyR1c2VfdW5jb21wcmVzc2VkX3RleHR9CgkJPC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+CgkJCXskc3ludGF4X21vZGV9CgkJPC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPgoJCQl7JHN5bnRheF9tb2RlaW5wdXR9CgkJPC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+CgkJCXskdGhlbWV0ZXh0fQoJCTwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij4KCQkJeyR0aGVtZWlucHV0fQoJCTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPgoJCQl7JGZvbnRzaXpldGV4dH0KCQk8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+CgkJCXskZm9udHNpemVpbnB1dH0KCQk8L3A+Cgk8L2Rpdj4JCgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+CgkJCXskZnVsbF9saW5ldGV4dH0KCQk8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+CgkJCXskZnVsbF9saW5laW5wdXR9CgkJPC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+CgkJCXskaGlnaGxpZ2h0X2FjdGl2ZXRleHR9CgkJPC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPgoJCQl7JGhpZ2hsaWdodF9hY3RpdmVpbnB1dH0KCQk8L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4KCQkJeyRzaG93X2ludmlzaWJsZXN0ZXh0fQoJCTwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij4KCQkJeyRzaG93X2ludmlzaWJsZXNpbnB1dH0KCQk8L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4KCQkJeyRwZXJzaXN0ZW50X2hzY3JvbGx0ZXh0fQoJCTwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij4KCQkJeyRwZXJzaXN0ZW50X2hzY3JvbGxpbnB1dH0KCQk8L3A+Cgk8L2Rpdj4KCXsqCgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+CgkJCXska2V5X2JpbmRpbmd0ZXh0fQoJCTwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij4KCQkJeyRrZXlfYmluZGluZ2lucHV0fQoJCTwvcD4KCTwvZGl2PgoJKn0JCgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+CgkJCXskc29mdF93cmFwdGV4dH0KCQk8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+CgkJCXskc29mdF93cmFwaW5wdXR9CgkJPC9wPgoJPC9kaXY+CQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPgoJCQl7JHNob3dfZ3V0dGVydGV4dH0KCQk8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+CgkJCXskc2hvd19ndXR0ZXJpbnB1dH0KCQk8L3A+Cgk8L2Rpdj4JCgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+CgkJCXskcHJpbnRfbWFyZ2ludGV4dH0KCQk8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+CgkJCXskcHJpbnRfbWFyZ2luaW5wdXR9CgkJPC9wPgoJPC9kaXY+CQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPgoJCQl7JHNvZnRfdGFidGV4dH0KCQk8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+CgkJCXskc29mdF90YWJpbnB1dH0KCQk8L3A+Cgk8L2Rpdj4JCgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+CgkJCXskaGlnaGxpZ2h0X3NlbGVjdGVkdGV4dH0KCQk8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+CgkJCXskaGlnaGxpZ2h0X3NlbGVjdGVkaW5wdXR9CgkJPC9wPgoJPC9kaXY+CQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPgoJCQl7JGVuYWJsZV9iZWhhdmlvcnN0ZXh0fQoJCTwvcD4KCQl7KgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPgoJCQl7JGVuYWJsZV9iZWhhdmlvcnNpbnB1dH0KCQk8L3A+CgkJKn0KCTwvZGl2PgkJCQkJCQkKCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4KCQkJJm5ic3A7CgkJPC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPgoJCQl7JHN1Ym1pdH0KCQk8L3A+Cgk8L2Rpdj4KPC9maWVsZHNldD4KPGZpZWxkc2V0PgoJPGxlZ2VuZD57JHRlc3RhcmVhdGV4dH08L2xlZ2VuZD4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+CgkJCXskdGVzdGFyZWF9CgkJPC9wPgoJPC9kaXY+CQoJCjwvZmllbGRzZXQ+CnskZW5kZm9ybX0gCnsvc3RyaXB9Cg==]]></data>
	</file>
</module>
